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_UL_CHANNELS 1
#define IPA_MHI_MAX_DL_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) > \ #if (IPA_MHI_MAX_UL_CHANNELS + IPA_MHI_MAX_DL_CHANNELS) > \
(IPA_MHI_GSI_ER_END - IPA_MHI_GSI_ER_START) (IPA_MHI_GSI_ER_END - IPA_MHI_GSI_ER_START)
#error not enought event rings for MHI #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 */ /* 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); channel->client, channel->index, channel->id, channel->state);
IPA_MHI_DBG("channel_context_addr 0x%llx\n", IPA_MHI_DBG("channel_context_addr 0x%llx cached_gsi_evt_ring_hdl %lu\n",
channel->channel_context_addr); channel->channel_context_addr,
channel->cached_gsi_evt_ring_hdl);
IPA_ACTIVE_CLIENTS_INC_EP(in->sys.client); 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; 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_LICENSE("GPL v2");
MODULE_DESCRIPTION("IPA MHI client driver"); MODULE_DESCRIPTION("IPA MHI client driver");

View file

@ -141,6 +141,27 @@ struct ipa_mem_buffer {
u32 size; 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 * 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, int ipa_mhi_query_ch_info(enum ipa_client_type client,
struct gsi_chan_info *ch_info); struct gsi_chan_info *ch_info);
int ipa_mhi_destroy_channel(enum ipa_client_type client); 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 */ /* MHI uC */
int ipa_uc_mhi_send_dl_ul_sync_info(union IpaHwMhiDlUlSyncCmdData_t *cmd); 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) \ #define IPA_MHI_HOST_ADDR_COND(addr) \
((params->assert_bit40)?(IPA_MHI_HOST_ADDR(addr)):(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 { enum ipa3_mhi_polling_mode {
IPA_MHI_POLLING_MODE_DB_MODE, IPA_MHI_POLLING_MODE_DB_MODE,
IPA_MHI_POLLING_MODE_POLL_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 */ /* allocate event ring only for the first time pipe is connected */
if (params->state == IPA_HW_MHI_CHANNEL_STATE_INVALID) { if (params->state == IPA_HW_MHI_CHANNEL_STATE_INVALID) {
IPA_MHI_DBG("allocating event ring\n");
memset(&ev_props, 0, sizeof(ev_props)); memset(&ev_props, 0, sizeof(ev_props));
ev_props.intf = GSI_EVT_CHTYPE_MHI_EV; ev_props.intf = GSI_EVT_CHTYPE_MHI_EV;
ev_props.intr = GSI_INTR_MSI; 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.user_data = params->channel;
ev_props.evchid_valid = true; ev_props.evchid_valid = true;
ev_props.evchid = params->evchid; 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, res = gsi_alloc_evt_ring(&ev_props, ipa3_ctx->gsi_dev_hdl,
&ep->gsi_evt_ring_hdl); &ep->gsi_evt_ring_hdl);
if (res) { if (res) {
@ -260,6 +243,10 @@ static int ipa_mhi_start_gsi_channel(enum ipa_client_type client,
*params->cached_gsi_evt_ring_hdl = *params->cached_gsi_evt_ring_hdl =
ep->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)); memset(&ch_props, 0, sizeof(ch_props));

View file

@ -1,2 +1,2 @@
obj-$(CONFIG_IPA_UT) += ipa_ut_mod.o 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; static struct ipa_ut_context *ipa_ut_ctx;
char *_IPA_UT_TEST_LOG_BUF_NAME; 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 * 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_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", pr_info("*** Test '%s': Running... ***\n",
suite->tests[i].name); suite->tests[i].name);
rc = suite->tests[i].run(suite->meta_data->priv); rc = suite->tests[i].run(suite->meta_data->priv);
if (rc) { if (rc) {
tst_fail = true; tst_fail = true;
suite->tests[i].res = IPA_UT_TEST_RES_FAIL; 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 { } else {
suite->tests[i].res = IPA_UT_TEST_RES_SUCCESS; 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", pr_info(">>>>>>**** TEST '%s': %s ****<<<<<<\n",
suite->tests[i].name, tst_fail ? "FAIL" : "SUCCESS"); suite->tests[i].name, tst_fail ? "FAIL" : "SUCCESS");
if (tst_fail && _IPA_UT_TEST_FAIL_REPORT_DATA.valid) { if (tst_fail)
pr_info("*** FAIL INFO:\n"); ipa_ut_dump_fail_report_stack();
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);
}
pr_info("\n"); pr_info("\n");
} }
@ -279,6 +325,7 @@ release_clock:
IPA_ACTIVE_CLIENTS_DEC_SPECIAL("IPA_UT"); IPA_ACTIVE_CLIENTS_DEC_SPECIAL("IPA_UT");
free_mem: free_mem:
kfree(_IPA_UT_TEST_LOG_BUF_NAME); kfree(_IPA_UT_TEST_LOG_BUF_NAME);
_IPA_UT_TEST_LOG_BUF_NAME = NULL;
unlock_mutex: unlock_mutex:
mutex_unlock(&ipa_ut_ctx->lock); mutex_unlock(&ipa_ut_ctx->lock);
return ((!rc && !tst_fail) ? count : -EFAULT); return ((!rc && !tst_fail) ? count : -EFAULT);
@ -451,10 +498,16 @@ static ssize_t ipa_ut_dbgfs_test_write(struct file *file,
goto free_mem; 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"); IPA_ACTIVE_CLIENTS_INC_SPECIAL("IPA_UT");
suite = test->suite; if (suite->meta_data->setup) {
if (suite && suite->meta_data->setup) {
IPA_UT_DBG("*** Suite '%s': Run setup ***\n", IPA_UT_DBG("*** Suite '%s': Run setup ***\n",
suite->meta_data->name); suite->meta_data->name);
rc = suite->meta_data->setup(&suite->meta_data->priv); 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_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); rc = test->run(suite->meta_data->priv);
if (rc) if (rc)
tst_fail = true; tst_fail = true;
IPA_UT_DBG("*** Test %s - ***\n", tst_fail ? "FAIL" : "SUCCESS"); IPA_UT_DBG("*** Test %s - ***\n", tst_fail ? "FAIL" : "SUCCESS");
if (tst_fail) { if (tst_fail) {
pr_info("=================>>>>>>>>>>>\n"); 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); pr_info("**** TEST %s FAILED ****\n", test->name);
if (_IPA_UT_TEST_FAIL_REPORT_DATA.valid) { ipa_ut_dump_fail_report_stack();
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);
}
pr_info("<<<<<<<<<<<=================\n"); pr_info("<<<<<<<<<<<=================\n");
} }
if (suite && suite->meta_data->teardown) { if (suite->meta_data->teardown) {
IPA_UT_DBG("*** Suite '%s': Run Teardown ***\n", IPA_UT_DBG("*** Suite '%s': Run Teardown ***\n",
suite->meta_data->name); suite->meta_data->name);
rc = suite->meta_data->teardown(suite->meta_data->priv); rc = suite->meta_data->teardown(suite->meta_data->priv);
@ -509,6 +555,7 @@ release_clock:
IPA_ACTIVE_CLIENTS_DEC_SPECIAL("IPA_UT"); IPA_ACTIVE_CLIENTS_DEC_SPECIAL("IPA_UT");
free_mem: free_mem:
kfree(_IPA_UT_TEST_LOG_BUF_NAME); kfree(_IPA_UT_TEST_LOG_BUF_NAME);
_IPA_UT_TEST_LOG_BUF_NAME = NULL;
unlock_mutex: unlock_mutex:
mutex_unlock(&ipa_ut_ctx->lock); mutex_unlock(&ipa_ut_ctx->lock);
return ((!rc && !tst_fail) ? count : -EFAULT); return ((!rc && !tst_fail) ? count : -EFAULT);
@ -856,6 +903,7 @@ static int ipa_ut_framework_init(void)
goto fail_clean_dbgfs; goto fail_clean_dbgfs;
} }
_IPA_UT_TEST_FAIL_REPORT_IDX = 0;
ipa_ut_ctx->inited = true; ipa_ut_ctx->inited = true;
IPA_UT_DBG("Done\n"); IPA_UT_DBG("Done\n");
ret = 0; ret = 0;

View file

@ -75,20 +75,31 @@ struct ipa_ut_tst_fail_report {
/** /**
* Report on test failure * 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) \ #define IPA_UT_TEST_FAIL_REPORT(__info) \
do { \ do { \
extern struct ipa_ut_tst_fail_report \ extern struct ipa_ut_tst_fail_report \
_IPA_UT_TEST_FAIL_REPORT_DATA; \ _IPA_UT_TEST_FAIL_REPORT_DATA \
_IPA_UT_TEST_FAIL_REPORT_DATA.valid = true; \ [_IPA_UT_TEST_FAIL_REPORT_SIZE]; \
_IPA_UT_TEST_FAIL_REPORT_DATA.file = __FILENAME__; \ extern u32 _IPA_UT_TEST_FAIL_REPORT_IDX; \
_IPA_UT_TEST_FAIL_REPORT_DATA.line = __LINE__; \ struct ipa_ut_tst_fail_report *entry; \
_IPA_UT_TEST_FAIL_REPORT_DATA.func = __func__; \ 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) \ if (__info) \
_IPA_UT_TEST_FAIL_REPORT_DATA.info = __info; \ entry->info = __info; \
else \ else \
_IPA_UT_TEST_FAIL_REPORT_DATA.info = ""; \ entry->info = ""; \
_IPA_UT_TEST_FAIL_REPORT_IDX++; \
} while (0) } while (0)
/** /**
@ -100,10 +111,17 @@ struct ipa_ut_tst_fail_report {
do { \ do { \
extern char *_IPA_UT_TEST_LOG_BUF_NAME; \ extern char *_IPA_UT_TEST_LOG_BUF_NAME; \
char __buf[512]; \ 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), \ scnprintf(__buf, sizeof(__buf), \
fmt, args); \ " %s:%d " fmt, \
strlcat(_IPA_UT_TEST_LOG_BUF_NAME, __buf, sizeof(__buf)); \ __func__, __LINE__, ## args); \
strlcat(_IPA_UT_TEST_LOG_BUF_NAME, __buf, \
_IPA_UT_TEST_LOG_BUF_SIZE); \
} while (0) } while (0)
/** /**

View file

@ -37,10 +37,12 @@
/* Test Log buffer name and size */ /* Test Log buffer name and size */
#define _IPA_UT_TEST_LOG_BUF_NAME ipa_ut_tst_log_buf #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 */ /* 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_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 */ /* Start/End definitions of the array of suites */
#define IPA_UT_DEFINE_ALL_SUITES_START \ #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 * Declare every suite here so that it will be found later below
* No importance for order. * No importance for order.
*/ */
IPA_UT_DECLARE_SUITE(mhi);
IPA_UT_DECLARE_SUITE(example); IPA_UT_DECLARE_SUITE(example);
@ -29,6 +30,7 @@ IPA_UT_DECLARE_SUITE(example);
*/ */
IPA_UT_DEFINE_ALL_SUITES_START IPA_UT_DEFINE_ALL_SUITES_START
{ {
IPA_UT_REGISTER_SUITE(mhi),
IPA_UT_REGISTER_SUITE(example), IPA_UT_REGISTER_SUITE(example),
} IPA_UT_DEFINE_ALL_SUITES_END; } IPA_UT_DEFINE_ALL_SUITES_END;