Merge "msm: ipa: fix a static analysis issue at IPA unit-tests"
This commit is contained in:
commit
ab9b466bb3
9 changed files with 3468 additions and 62 deletions
|
@ -40,9 +40,6 @@
|
|||
#define IPA_MHI_MAX_UL_CHANNELS 1
|
||||
#define IPA_MHI_MAX_DL_CHANNELS 1
|
||||
|
||||
#define IPA_MHI_GSI_ER_START 10
|
||||
#define IPA_MHI_GSI_ER_END 16
|
||||
|
||||
#if (IPA_MHI_MAX_UL_CHANNELS + IPA_MHI_MAX_DL_CHANNELS) > \
|
||||
(IPA_MHI_GSI_ER_END - IPA_MHI_GSI_ER_START)
|
||||
#error not enought event rings for MHI
|
||||
|
@ -1504,10 +1501,11 @@ int ipa_mhi_connect_pipe(struct ipa_mhi_connect_params *in, u32 *clnt_hdl)
|
|||
|
||||
/* for event context address index needs to read from host */
|
||||
|
||||
IPA_MHI_DBG("client %d channelHandle %d channelIndex %d, state %d\n",
|
||||
IPA_MHI_DBG("client %d channelIndex %d channelID %d, state %d\n",
|
||||
channel->client, channel->index, channel->id, channel->state);
|
||||
IPA_MHI_DBG("channel_context_addr 0x%llx\n",
|
||||
channel->channel_context_addr);
|
||||
IPA_MHI_DBG("channel_context_addr 0x%llx cached_gsi_evt_ring_hdl %lu\n",
|
||||
channel->channel_context_addr,
|
||||
channel->cached_gsi_evt_ring_hdl);
|
||||
|
||||
IPA_ACTIVE_CLIENTS_INC_EP(in->sys.client);
|
||||
|
||||
|
@ -2585,5 +2583,27 @@ int ipa_mhi_handle_ipa_config_req(struct ipa_config_req_msg_v01 *config_req)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int ipa_mhi_is_using_dma(bool *flag)
|
||||
{
|
||||
IPA_MHI_FUNC_ENTRY();
|
||||
|
||||
if (!ipa_mhi_client_ctx) {
|
||||
IPA_MHI_ERR("not initialized\n");
|
||||
return -EPERM;
|
||||
}
|
||||
|
||||
*flag = ipa_mhi_client_ctx->use_ipadma ? true : false;
|
||||
|
||||
IPA_MHI_FUNC_EXIT();
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(ipa_mhi_is_using_dma);
|
||||
|
||||
const char *ipa_mhi_get_state_str(int state)
|
||||
{
|
||||
return MHI_STATE_STR(state);
|
||||
}
|
||||
EXPORT_SYMBOL(ipa_mhi_get_state_str);
|
||||
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_DESCRIPTION("IPA MHI client driver");
|
||||
|
|
|
@ -141,6 +141,27 @@ struct ipa_mem_buffer {
|
|||
u32 size;
|
||||
};
|
||||
|
||||
#define IPA_MHI_GSI_ER_START 10
|
||||
#define IPA_MHI_GSI_ER_END 16
|
||||
|
||||
/**
|
||||
* enum ipa3_mhi_burst_mode - MHI channel burst mode state
|
||||
*
|
||||
* Values are according to MHI specification
|
||||
* @IPA_MHI_BURST_MODE_DEFAULT: burst mode enabled for HW channels,
|
||||
* disabled for SW channels
|
||||
* @IPA_MHI_BURST_MODE_RESERVED:
|
||||
* @IPA_MHI_BURST_MODE_DISABLE: Burst mode is disabled for this channel
|
||||
* @IPA_MHI_BURST_MODE_ENABLE: Burst mode is enabled for this channel
|
||||
*
|
||||
*/
|
||||
enum ipa3_mhi_burst_mode {
|
||||
IPA_MHI_BURST_MODE_DEFAULT,
|
||||
IPA_MHI_BURST_MODE_RESERVED,
|
||||
IPA_MHI_BURST_MODE_DISABLE,
|
||||
IPA_MHI_BURST_MODE_ENABLE,
|
||||
};
|
||||
|
||||
/**
|
||||
* enum ipa_hw_mhi_channel_states - MHI channel state machine
|
||||
*
|
||||
|
@ -325,6 +346,8 @@ int ipa_mhi_handle_ipa_config_req(struct ipa_config_req_msg_v01 *config_req);
|
|||
int ipa_mhi_query_ch_info(enum ipa_client_type client,
|
||||
struct gsi_chan_info *ch_info);
|
||||
int ipa_mhi_destroy_channel(enum ipa_client_type client);
|
||||
int ipa_mhi_is_using_dma(bool *flag);
|
||||
const char *ipa_mhi_get_state_str(int state);
|
||||
|
||||
/* MHI uC */
|
||||
int ipa_uc_mhi_send_dl_ul_sync_info(union IpaHwMhiDlUlSyncCmdData_t *cmd);
|
||||
|
|
|
@ -67,24 +67,6 @@
|
|||
#define IPA_MHI_HOST_ADDR_COND(addr) \
|
||||
((params->assert_bit40)?(IPA_MHI_HOST_ADDR(addr)):(addr))
|
||||
|
||||
/**
|
||||
* enum ipa3_mhi_burst_mode - MHI channel burst mode state
|
||||
*
|
||||
* Values are according to MHI specification
|
||||
* @IPA_MHI_BURST_MODE_DEFAULT: burst mode enabled for HW channels,
|
||||
* disabled for SW channels
|
||||
* @IPA_MHI_BURST_MODE_RESERVED:
|
||||
* @IPA_MHI_BURST_MODE_DISABLE: Burst mode is disabled for this channel
|
||||
* @IPA_MHI_BURST_MODE_ENABLE: Burst mode is enabled for this channel
|
||||
*
|
||||
*/
|
||||
enum ipa3_mhi_burst_mode {
|
||||
IPA_MHI_BURST_MODE_DEFAULT,
|
||||
IPA_MHI_BURST_MODE_RESERVED,
|
||||
IPA_MHI_BURST_MODE_DISABLE,
|
||||
IPA_MHI_BURST_MODE_ENABLE,
|
||||
};
|
||||
|
||||
enum ipa3_mhi_polling_mode {
|
||||
IPA_MHI_POLLING_MODE_DB_MODE,
|
||||
IPA_MHI_POLLING_MODE_POLL_MODE,
|
||||
|
@ -224,7 +206,6 @@ static int ipa_mhi_start_gsi_channel(enum ipa_client_type client,
|
|||
|
||||
/* allocate event ring only for the first time pipe is connected */
|
||||
if (params->state == IPA_HW_MHI_CHANNEL_STATE_INVALID) {
|
||||
IPA_MHI_DBG("allocating event ring\n");
|
||||
memset(&ev_props, 0, sizeof(ev_props));
|
||||
ev_props.intf = GSI_EVT_CHTYPE_MHI_EV;
|
||||
ev_props.intr = GSI_INTR_MSI;
|
||||
|
@ -247,6 +228,8 @@ static int ipa_mhi_start_gsi_channel(enum ipa_client_type client,
|
|||
ev_props.user_data = params->channel;
|
||||
ev_props.evchid_valid = true;
|
||||
ev_props.evchid = params->evchid;
|
||||
IPA_MHI_DBG("allocating event ring ep:%u evchid:%u\n",
|
||||
ipa_ep_idx, ev_props.evchid);
|
||||
res = gsi_alloc_evt_ring(&ev_props, ipa3_ctx->gsi_dev_hdl,
|
||||
&ep->gsi_evt_ring_hdl);
|
||||
if (res) {
|
||||
|
@ -260,6 +243,10 @@ static int ipa_mhi_start_gsi_channel(enum ipa_client_type client,
|
|||
*params->cached_gsi_evt_ring_hdl =
|
||||
ep->gsi_evt_ring_hdl;
|
||||
|
||||
} else {
|
||||
IPA_MHI_DBG("event ring already exists: evt_ring_hdl=%lu\n",
|
||||
*params->cached_gsi_evt_ring_hdl);
|
||||
ep->gsi_evt_ring_hdl = *params->cached_gsi_evt_ring_hdl;
|
||||
}
|
||||
|
||||
memset(&ch_props, 0, sizeof(ch_props));
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
obj-$(CONFIG_IPA_UT) += ipa_ut_mod.o
|
||||
ipa_ut_mod-y := ipa_ut_framework.o ipa_test_example.o
|
||||
ipa_ut_mod-y := ipa_ut_framework.o ipa_test_example.o ipa_test_mhi.o
|
||||
|
|
3306
drivers/platform/msm/ipa/test/ipa_test_mhi.c
Normal file
3306
drivers/platform/msm/ipa/test/ipa_test_mhi.c
Normal file
File diff suppressed because it is too large
Load diff
|
@ -84,8 +84,60 @@ static const struct file_operations ipa_ut_dbgfs_regression_test_fops = {
|
|||
|
||||
static struct ipa_ut_context *ipa_ut_ctx;
|
||||
char *_IPA_UT_TEST_LOG_BUF_NAME;
|
||||
struct ipa_ut_tst_fail_report _IPA_UT_TEST_FAIL_REPORT_DATA;
|
||||
struct ipa_ut_tst_fail_report
|
||||
_IPA_UT_TEST_FAIL_REPORT_DATA[_IPA_UT_TEST_FAIL_REPORT_SIZE];
|
||||
u32 _IPA_UT_TEST_FAIL_REPORT_IDX;
|
||||
|
||||
/**
|
||||
* ipa_ut_print_log_buf() - Dump given buffer via kernel error mechanism
|
||||
* @buf: Buffer to print
|
||||
*
|
||||
* Tokenize the string according to new-line and then print
|
||||
*
|
||||
* Note: Assumes lock acquired
|
||||
*/
|
||||
static void ipa_ut_print_log_buf(char *buf)
|
||||
{
|
||||
char *token;
|
||||
|
||||
if (!buf) {
|
||||
IPA_UT_ERR("Input error - no buf\n");
|
||||
return;
|
||||
}
|
||||
|
||||
for (token = strsep(&buf, "\n"); token; token = strsep(&buf, "\n"))
|
||||
pr_err("%s\n", token);
|
||||
}
|
||||
|
||||
/**
|
||||
* ipa_ut_dump_fail_report_stack() - dump the report info stack via kernel err
|
||||
*
|
||||
* Note: Assumes lock acquired
|
||||
*/
|
||||
static void ipa_ut_dump_fail_report_stack(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
IPA_UT_DBG("Entry\n");
|
||||
|
||||
if (_IPA_UT_TEST_FAIL_REPORT_IDX == 0) {
|
||||
IPA_UT_DBG("no report info\n");
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0 ; i < _IPA_UT_TEST_FAIL_REPORT_IDX; i++) {
|
||||
if (i == 0)
|
||||
pr_err("***** FAIL INFO STACK *****:\n");
|
||||
else
|
||||
pr_err("Called From:\n");
|
||||
|
||||
pr_err("\tFILE = %s\n\tFUNC = %s()\n\tLINE = %d\n",
|
||||
_IPA_UT_TEST_FAIL_REPORT_DATA[i].file,
|
||||
_IPA_UT_TEST_FAIL_REPORT_DATA[i].func,
|
||||
_IPA_UT_TEST_FAIL_REPORT_DATA[i].line);
|
||||
pr_err("\t%s\n", _IPA_UT_TEST_FAIL_REPORT_DATA[i].info);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* ipa_ut_show_suite_exec_summary() - Show tests run summary
|
||||
|
@ -231,14 +283,14 @@ static ssize_t ipa_ut_dbgfs_meta_test_write(struct file *file,
|
|||
}
|
||||
|
||||
_IPA_UT_TEST_LOG_BUF_NAME[0] = '\0';
|
||||
_IPA_UT_TEST_FAIL_REPORT_DATA.valid = false;
|
||||
_IPA_UT_TEST_FAIL_REPORT_IDX = 0;
|
||||
pr_info("*** Test '%s': Running... ***\n",
|
||||
suite->tests[i].name);
|
||||
rc = suite->tests[i].run(suite->meta_data->priv);
|
||||
if (rc) {
|
||||
tst_fail = true;
|
||||
suite->tests[i].res = IPA_UT_TEST_RES_FAIL;
|
||||
pr_info("%s", _IPA_UT_TEST_LOG_BUF_NAME);
|
||||
ipa_ut_print_log_buf(_IPA_UT_TEST_LOG_BUF_NAME);
|
||||
} else {
|
||||
suite->tests[i].res = IPA_UT_TEST_RES_SUCCESS;
|
||||
}
|
||||
|
@ -246,14 +298,8 @@ static ssize_t ipa_ut_dbgfs_meta_test_write(struct file *file,
|
|||
pr_info(">>>>>>**** TEST '%s': %s ****<<<<<<\n",
|
||||
suite->tests[i].name, tst_fail ? "FAIL" : "SUCCESS");
|
||||
|
||||
if (tst_fail && _IPA_UT_TEST_FAIL_REPORT_DATA.valid) {
|
||||
pr_info("*** FAIL INFO:\n");
|
||||
pr_info("\tFILE = %s\n\tFUNC = %s()\n\tLINE = %d\n",
|
||||
_IPA_UT_TEST_FAIL_REPORT_DATA.file,
|
||||
_IPA_UT_TEST_FAIL_REPORT_DATA.func,
|
||||
_IPA_UT_TEST_FAIL_REPORT_DATA.line);
|
||||
pr_info("\t%s\n", _IPA_UT_TEST_FAIL_REPORT_DATA.info);
|
||||
}
|
||||
if (tst_fail)
|
||||
ipa_ut_dump_fail_report_stack();
|
||||
|
||||
pr_info("\n");
|
||||
}
|
||||
|
@ -279,6 +325,7 @@ release_clock:
|
|||
IPA_ACTIVE_CLIENTS_DEC_SPECIAL("IPA_UT");
|
||||
free_mem:
|
||||
kfree(_IPA_UT_TEST_LOG_BUF_NAME);
|
||||
_IPA_UT_TEST_LOG_BUF_NAME = NULL;
|
||||
unlock_mutex:
|
||||
mutex_unlock(&ipa_ut_ctx->lock);
|
||||
return ((!rc && !tst_fail) ? count : -EFAULT);
|
||||
|
@ -451,10 +498,16 @@ static ssize_t ipa_ut_dbgfs_test_write(struct file *file,
|
|||
goto free_mem;
|
||||
}
|
||||
|
||||
suite = test->suite;
|
||||
if (!suite || !suite->meta_data) {
|
||||
IPA_UT_ERR("test %s with invalid suite\n", test->name);
|
||||
rc = -EINVAL;
|
||||
goto free_mem;
|
||||
}
|
||||
|
||||
IPA_ACTIVE_CLIENTS_INC_SPECIAL("IPA_UT");
|
||||
|
||||
suite = test->suite;
|
||||
if (suite && suite->meta_data->setup) {
|
||||
if (suite->meta_data->setup) {
|
||||
IPA_UT_DBG("*** Suite '%s': Run setup ***\n",
|
||||
suite->meta_data->name);
|
||||
rc = suite->meta_data->setup(&suite->meta_data->priv);
|
||||
|
@ -470,27 +523,20 @@ static ssize_t ipa_ut_dbgfs_test_write(struct file *file,
|
|||
}
|
||||
|
||||
IPA_UT_DBG("*** Test '%s': Running... ***\n", test->name);
|
||||
_IPA_UT_TEST_FAIL_REPORT_DATA.valid = false;
|
||||
_IPA_UT_TEST_FAIL_REPORT_IDX = 0;
|
||||
rc = test->run(suite->meta_data->priv);
|
||||
if (rc)
|
||||
tst_fail = true;
|
||||
IPA_UT_DBG("*** Test %s - ***\n", tst_fail ? "FAIL" : "SUCCESS");
|
||||
if (tst_fail) {
|
||||
pr_info("=================>>>>>>>>>>>\n");
|
||||
pr_info("%s\n", _IPA_UT_TEST_LOG_BUF_NAME);
|
||||
ipa_ut_print_log_buf(_IPA_UT_TEST_LOG_BUF_NAME);
|
||||
pr_info("**** TEST %s FAILED ****\n", test->name);
|
||||
if (_IPA_UT_TEST_FAIL_REPORT_DATA.valid) {
|
||||
pr_info("*** FAIL INFO:\n");
|
||||
pr_info("\tFILE = %s\n\tFUNC = %s()\n\tLINE = %d\n",
|
||||
_IPA_UT_TEST_FAIL_REPORT_DATA.file,
|
||||
_IPA_UT_TEST_FAIL_REPORT_DATA.func,
|
||||
_IPA_UT_TEST_FAIL_REPORT_DATA.line);
|
||||
pr_info("\t%s\n", _IPA_UT_TEST_FAIL_REPORT_DATA.info);
|
||||
}
|
||||
ipa_ut_dump_fail_report_stack();
|
||||
pr_info("<<<<<<<<<<<=================\n");
|
||||
}
|
||||
|
||||
if (suite && suite->meta_data->teardown) {
|
||||
if (suite->meta_data->teardown) {
|
||||
IPA_UT_DBG("*** Suite '%s': Run Teardown ***\n",
|
||||
suite->meta_data->name);
|
||||
rc = suite->meta_data->teardown(suite->meta_data->priv);
|
||||
|
@ -509,6 +555,7 @@ release_clock:
|
|||
IPA_ACTIVE_CLIENTS_DEC_SPECIAL("IPA_UT");
|
||||
free_mem:
|
||||
kfree(_IPA_UT_TEST_LOG_BUF_NAME);
|
||||
_IPA_UT_TEST_LOG_BUF_NAME = NULL;
|
||||
unlock_mutex:
|
||||
mutex_unlock(&ipa_ut_ctx->lock);
|
||||
return ((!rc && !tst_fail) ? count : -EFAULT);
|
||||
|
@ -856,6 +903,7 @@ static int ipa_ut_framework_init(void)
|
|||
goto fail_clean_dbgfs;
|
||||
}
|
||||
|
||||
_IPA_UT_TEST_FAIL_REPORT_IDX = 0;
|
||||
ipa_ut_ctx->inited = true;
|
||||
IPA_UT_DBG("Done\n");
|
||||
ret = 0;
|
||||
|
|
|
@ -75,20 +75,31 @@ struct ipa_ut_tst_fail_report {
|
|||
|
||||
/**
|
||||
* Report on test failure
|
||||
* To be used by tests.
|
||||
* To be used by tests to report a point were a test fail.
|
||||
* Failures are saved in a stack manner.
|
||||
* Dumping the failure info will dump the fail reports
|
||||
* from all the function in the calling stack
|
||||
*/
|
||||
#define IPA_UT_TEST_FAIL_REPORT(__info) \
|
||||
do { \
|
||||
extern struct ipa_ut_tst_fail_report \
|
||||
_IPA_UT_TEST_FAIL_REPORT_DATA; \
|
||||
_IPA_UT_TEST_FAIL_REPORT_DATA.valid = true; \
|
||||
_IPA_UT_TEST_FAIL_REPORT_DATA.file = __FILENAME__; \
|
||||
_IPA_UT_TEST_FAIL_REPORT_DATA.line = __LINE__; \
|
||||
_IPA_UT_TEST_FAIL_REPORT_DATA.func = __func__; \
|
||||
_IPA_UT_TEST_FAIL_REPORT_DATA \
|
||||
[_IPA_UT_TEST_FAIL_REPORT_SIZE]; \
|
||||
extern u32 _IPA_UT_TEST_FAIL_REPORT_IDX; \
|
||||
struct ipa_ut_tst_fail_report *entry; \
|
||||
if (_IPA_UT_TEST_FAIL_REPORT_IDX >= \
|
||||
_IPA_UT_TEST_FAIL_REPORT_SIZE) \
|
||||
break; \
|
||||
entry = &(_IPA_UT_TEST_FAIL_REPORT_DATA \
|
||||
[_IPA_UT_TEST_FAIL_REPORT_IDX]); \
|
||||
entry->file = __FILENAME__; \
|
||||
entry->line = __LINE__; \
|
||||
entry->func = __func__; \
|
||||
if (__info) \
|
||||
_IPA_UT_TEST_FAIL_REPORT_DATA.info = __info; \
|
||||
entry->info = __info; \
|
||||
else \
|
||||
_IPA_UT_TEST_FAIL_REPORT_DATA.info = ""; \
|
||||
entry->info = ""; \
|
||||
_IPA_UT_TEST_FAIL_REPORT_IDX++; \
|
||||
} while (0)
|
||||
|
||||
/**
|
||||
|
@ -100,10 +111,17 @@ struct ipa_ut_tst_fail_report {
|
|||
do { \
|
||||
extern char *_IPA_UT_TEST_LOG_BUF_NAME; \
|
||||
char __buf[512]; \
|
||||
IPA_UT_DBG(fmt, args); \
|
||||
IPA_UT_DBG(fmt, ## args); \
|
||||
if (!_IPA_UT_TEST_LOG_BUF_NAME) {\
|
||||
pr_err(IPA_UT_DRV_NAME " %s:%d " fmt, \
|
||||
__func__, __LINE__, ## args); \
|
||||
break; \
|
||||
} \
|
||||
scnprintf(__buf, sizeof(__buf), \
|
||||
fmt, args); \
|
||||
strlcat(_IPA_UT_TEST_LOG_BUF_NAME, __buf, sizeof(__buf)); \
|
||||
" %s:%d " fmt, \
|
||||
__func__, __LINE__, ## args); \
|
||||
strlcat(_IPA_UT_TEST_LOG_BUF_NAME, __buf, \
|
||||
_IPA_UT_TEST_LOG_BUF_SIZE); \
|
||||
} while (0)
|
||||
|
||||
/**
|
||||
|
|
|
@ -37,10 +37,12 @@
|
|||
|
||||
/* Test Log buffer name and size */
|
||||
#define _IPA_UT_TEST_LOG_BUF_NAME ipa_ut_tst_log_buf
|
||||
#define _IPA_UT_TEST_LOG_BUF_SIZE 2048
|
||||
#define _IPA_UT_TEST_LOG_BUF_SIZE 8192
|
||||
|
||||
/* Global structure for test fail execution result information */
|
||||
#define _IPA_UT_TEST_FAIL_REPORT_DATA ipa_ut_tst_fail_report_data
|
||||
#define _IPA_UT_TEST_FAIL_REPORT_SIZE 5
|
||||
#define _IPA_UT_TEST_FAIL_REPORT_IDX ipa_ut_tst_fail_report_data_index
|
||||
|
||||
/* Start/End definitions of the array of suites */
|
||||
#define IPA_UT_DEFINE_ALL_SUITES_START \
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
* Declare every suite here so that it will be found later below
|
||||
* No importance for order.
|
||||
*/
|
||||
IPA_UT_DECLARE_SUITE(mhi);
|
||||
IPA_UT_DECLARE_SUITE(example);
|
||||
|
||||
|
||||
|
@ -29,6 +30,7 @@ IPA_UT_DECLARE_SUITE(example);
|
|||
*/
|
||||
IPA_UT_DEFINE_ALL_SUITES_START
|
||||
{
|
||||
IPA_UT_REGISTER_SUITE(mhi),
|
||||
IPA_UT_REGISTER_SUITE(example),
|
||||
} IPA_UT_DEFINE_ALL_SUITES_END;
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue