Merge "msm: ipa: fix a static analysis issue at IPA unit-tests"

This commit is contained in:
Linux Build Service Account 2016-08-26 14:48:27 -07:00 committed by Gerrit - the friendly Code Review server
commit ab9b466bb3
9 changed files with 3468 additions and 62 deletions

View file

@ -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");

View file

@ -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);

View file

@ -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));

View file

@ -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

File diff suppressed because it is too large Load diff

View file

@ -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;

View file

@ -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)
/**

View file

@ -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 \

View file

@ -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;