qcacld-3.0: Create BMI info structures for BMI Phase

BMI info is needed during BMI Phase. The structure holds
the physical address and virtual address of Command and response
of BMI buffer.

Change-Id: I97e8dad2ccba1352677cdf37e2f62204128d4b06
CRs-Fixed: 967765
This commit is contained in:
Komal Seelam 2016-02-24 18:14:55 +05:30 committed by Prakash Dhavali
parent 42c16a1606
commit 9ef9458c04
5 changed files with 56 additions and 30 deletions

View File

@ -58,7 +58,7 @@ bmi_command_test(uint32_t command, uint32_t address, uint8_t *data,
CDF_STATUS bmi_init(struct ol_context *ol_ctx)
{
struct bmi_info *info;
struct bmi_info *info = GET_BMI_CONTEXT(ol_ctx);
struct ol_softc *scn = ol_ctx->scn;
cdf_device_t cdf_dev = ol_ctx->cdf_dev;
@ -73,7 +73,6 @@ CDF_STATUS bmi_init(struct ol_context *ol_ctx)
return CDF_STATUS_NOT_INITIALIZED;
}
info = hif_get_bmi_ctx(scn);
info->bmi_done = false;
if (!info->bmi_cmd_buff) {
@ -105,8 +104,7 @@ end:
void bmi_cleanup(struct ol_context *ol_ctx)
{
struct ol_softc *scn = ol_ctx->scn;
struct bmi_info *info = hif_get_bmi_ctx(scn);
struct bmi_info *info = GET_BMI_CONTEXT(ol_ctx);
cdf_device_t cdf_dev = ol_ctx->cdf_dev;
if (!cdf_dev->dev) {
@ -151,7 +149,7 @@ bmi_get_target_info(struct bmi_target_info *targ_info,
{
int status = 0;
struct ol_softc *scn = ol_ctx->scn;
struct bmi_info *info = hif_get_bmi_ctx(scn);
struct bmi_info *info = GET_BMI_CONTEXT(ol_ctx);
uint8_t *bmi_cmd_buff = info->bmi_cmd_buff;
uint8_t *bmi_rsp_buff = info->bmi_rsp_buff;
uint32_t cid, length;
@ -238,7 +236,7 @@ CDF_STATUS bmi_read_soc_register(uint32_t address, uint32_t *param,
uint32_t cid;
int status;
uint32_t offset, param_len;
struct bmi_info *info = hif_get_bmi_ctx(scn);
struct bmi_info *info = GET_BMI_CONTEXT(ol_ctx);
uint8_t *bmi_cmd_buff = info->bmi_cmd_buff;
uint8_t *bmi_rsp_buff = info->bmi_rsp_buff;
cdf_dma_addr_t cmd = info->bmi_cmd_da;
@ -283,7 +281,7 @@ CDF_STATUS bmi_write_soc_register(uint32_t address, uint32_t param,
uint32_t cid;
int status;
uint32_t offset;
struct bmi_info *info = hif_get_bmi_ctx(scn);
struct bmi_info *info = GET_BMI_CONTEXT(ol_ctx);
uint8_t *bmi_cmd_buff = info->bmi_cmd_buff;
uint32_t size = sizeof(cid) + sizeof(address) + sizeof(param);
cdf_dma_addr_t cmd = info->bmi_cmd_da;
@ -329,7 +327,7 @@ bmilz_data(uint8_t *buffer, uint32_t length, struct ol_context *ol_ctx)
uint32_t remaining, txlen;
const uint32_t header = sizeof(cid) + sizeof(length);
struct ol_softc *scn = ol_ctx->scn;
struct bmi_info *info = hif_get_bmi_ctx(scn);
struct bmi_info *info = GET_BMI_CONTEXT(ol_ctx);
uint8_t *bmi_cmd_buff = info->bmi_cmd_buff;
cdf_dma_addr_t cmd = info->bmi_cmd_da;
cdf_dma_addr_t rsp = info->bmi_rsp_da;
@ -375,9 +373,8 @@ bmilz_data(uint8_t *buffer, uint32_t length, struct ol_context *ol_ctx)
return CDF_STATUS_SUCCESS;
}
CDF_STATUS
bmi_sign_stream_start(uint32_t address,
uint8_t *buffer, uint32_t length, struct ol_softc *scn)
CDF_STATUS bmi_sign_stream_start(uint32_t address, uint8_t *buffer,
uint32_t length, struct ol_bmi_context *ol_ctx)
{
uint32_t cid;
int status;
@ -385,7 +382,8 @@ bmi_sign_stream_start(uint32_t address,
const uint32_t header = sizeof(cid) + sizeof(address) + sizeof(length);
uint8_t aligned_buf[BMI_DATASZ_MAX + 4];
uint8_t *src;
struct bmi_info *info = hif_get_bmi_ctx(scn);
struct ol_softc *scn = ol_ctx->scn;
struct bmi_info *info = GET_BMI_CONTEXT(ol_ctx);
uint8_t *bmi_cmd_buff = info->bmi_cmd_buff;
uint32_t remaining, txlen;
cdf_dma_addr_t cmd = info->bmi_cmd_da;
@ -449,7 +447,7 @@ bmilz_stream_start(uint32_t address, struct ol_context *ol_ctx)
int status;
uint32_t offset;
struct ol_softc *scn = ol_ctx->scn;
struct bmi_info *info = hif_get_bmi_ctx(scn);
struct bmi_info *info = GET_BMI_CONTEXT(ol_ctx);
uint8_t *bmi_cmd_buff = info->bmi_cmd_buff;
cdf_dma_addr_t cmd = info->bmi_cmd_da;
cdf_dma_addr_t rsp = info->bmi_rsp_da;

View File

@ -39,7 +39,7 @@ bmi_read_memory(uint32_t address,
int status;
uint32_t offset;
uint32_t remaining, rxlen;
struct bmi_info *info = hif_get_bmi_ctx(scn);
struct bmi_info *info = GET_BMI_CONTEXT(ol_ctx);
uint8_t *bmi_cmd_buff = info->bmi_cmd_buff;
uint8_t *bmi_rsp_buff = info->bmi_rsp_buff;
uint32_t align;
@ -117,7 +117,7 @@ CDF_STATUS bmi_write_memory(uint32_t address, uint8_t *buffer, uint32_t length,
const uint32_t header = sizeof(cid) + sizeof(address) + sizeof(length);
uint8_t aligned_buffer[BMI_DATASZ_MAX];
uint8_t *src;
struct bmi_info *info = hif_get_bmi_ctx(scn);
struct bmi_info *info = GET_BMI_CONTEXT(ol_ctx);
uint8_t *bmi_cmd_buff = info->bmi_cmd_buff;
cdf_dma_addr_t cmd = info->bmi_cmd_da;
cdf_dma_addr_t rsp = info->bmi_rsp_da;
@ -189,7 +189,7 @@ bmi_execute(uint32_t address, A_UINT32 *param, struct ol_context *ol_ctx)
int status;
uint32_t offset;
uint32_t param_len;
struct bmi_info *info = hif_get_bmi_ctx(scn);
struct bmi_info *info = GET_BMI_CONTEXT(ol_ctx);
uint8_t *bmi_cmd_buff = info->bmi_cmd_buff;
uint8_t *bmi_rsp_buff = info->bmi_rsp_buff;
uint32_t size = sizeof(cid) + sizeof(address) + sizeof(param);
@ -303,7 +303,7 @@ CDF_STATUS bmi_done_local(struct ol_context *ol_ctx)
return CDF_STATUS_NOT_INITIALIZED;
}
info = hif_get_bmi_ctx(scn);
info = GET_BMI_CONTEXT(ol_ctx);
if (info->bmi_done) {
BMI_DBG("bmi_done_local skipped");
return CDF_STATUS_E_PERM;

View File

@ -41,7 +41,7 @@ bmi_no_command(struct ol_context *ol_ctx)
int status;
uint32_t length;
uint8_t ret = 0;
struct bmi_info *info = hif_get_bmi_ctx(scn);
struct bmi_info *info = GET_BMI_CONTEXT(ol_ctx);
uint8_t *bmi_cmd_buff = info->bmi_cmd_buff;
uint8_t *bmi_rsp_buff = info->bmi_rsp_buff;
cdf_dma_addr_t cmd = info->bmi_cmd_da;
@ -85,7 +85,7 @@ bmi_done_local(struct ol_context *ol_ctx)
int status;
uint32_t length;
uint8_t ret = 0;
struct bmi_info *info = hif_get_bmi_ctx(scn);
struct bmi_info *info = GET_BMI_CONTEXT(ol_ctx);
uint8_t *bmi_cmd_buff = info->bmi_cmd_buff;
uint8_t *bmi_rsp_buff = info->bmi_rsp_buff;
cdf_device_t cdf_dev = ol_ctx->cdf_dev;
@ -159,7 +159,7 @@ bmi_write_memory(uint32_t address,
uint8_t aligned_buffer[BMI_DATASZ_MAX];
uint8_t *src;
struct ol_softc *scn = ol_ctx->scn;
struct bmi_info *info = hif_get_bmi_ctx(scn);
struct bmi_info *info = GET_BMI_CONTEXT(ol_ctx);
uint8_t *bmi_cmd_buff = info->bmi_cmd_buff;
uint8_t *bmi_rsp_buff = info->bmi_rsp_buff;
cdf_dma_addr_t cmd = info->bmi_cmd_da;
@ -233,7 +233,7 @@ bmi_read_memory(uint32_t address, uint8_t *buffer,
uint8_t ret = 0;
uint32_t offset;
uint32_t remaining, rxlen, rsp_len, total_len;
struct bmi_info *info = hif_get_bmi_ctx(scn);
struct bmi_info *info = GET_BMI_CONTEXT(ol_ctx);
uint8_t *bmi_cmd_buff = info->bmi_cmd_buff;
/* note we reuse the same buffer to receive on */
uint8_t *bmi_rsp_buff = info->bmi_rsp_buff;
@ -307,7 +307,7 @@ bmi_execute(uint32_t address, uint32_t *param, struct ol_context *ol_ctx)
int status;
uint32_t length;
uint8_t ret = 0;
struct bmi_info *info = hif_get_bmi_ctx(scn);
struct bmi_info *info = GET_BMI_CONTEXT(ol_ctx);
uint8_t *bmi_cmd_buff = info->bmi_cmd_buff;
uint8_t *bmi_rsp_buff = info->bmi_rsp_buff;
cdf_dma_addr_t cmd = info->bmi_cmd_da;
@ -355,7 +355,7 @@ bmi_load_image(dma_addr_t address,
uint32_t length;
uint8_t ret = 0;
struct ol_softc *scn = ol_ctx->scn;
struct bmi_info *info = hif_get_bmi_ctx(scn);
struct bmi_info *info = GET_BMI_CONTEXT(ol_ctx);
uint8_t *bmi_cmd_buff = info->bmi_cmd_buff;
uint8_t *bmi_rsp_buff = info->bmi_rsp_buff;
cdf_dma_addr_t cmd = info->bmi_cmd_da;
@ -417,7 +417,7 @@ static CDF_STATUS bmi_enable(struct ol_context *ol_ctx)
struct image_desc_info image_desc_info;
CDF_STATUS status;
struct hif_target_info *tgt_info;
struct bmi_info *info = hif_get_bmi_ctx(scn);
struct bmi_info *info = GET_BMI_CONTEXT(ol_ctx);
if (!scn) {
BMI_ERR("Invalid scn context");

View File

@ -121,15 +121,41 @@ typedef enum _ATH_BIN_FILE {
#define NO_BMI 0
#endif
/**
* struct bmi_info - Structure to hold BMI Specific information
* @bmi_cmd_buff - BMI Command Buffer
* @bmi_rsp_buff - BMI Response Buffer
* @bmi_cmd_da - BMI Command Physical address
* @bmi_rsp_da - BMI Response Physical address
* @bmi_done - Flag to check if BMI Phase is complete
* @fw_files - FW files
*
*/
struct bmi_info {
uint8_t *bmi_cmd_buff;
uint8_t *bmi_rsp_buff;
dma_addr_t bmi_cmd_da;
dma_addr_t bmi_rsp_da;
bool bmi_done;
#ifdef CONFIG_CNSS
struct cnss_fw_files fw_files;
#endif
};
/**
* struct ol_context - Structure to hold OL context
* @bmi: BMI info
* @cal_in_flash: For Firmware Flash Download
* @cdf_dev: CDF Device
* @scn: HIF Context
* @ramdump_work: WorkQueue for Ramdump collection
* @tgt_def: Target Defnition pointer
*
* Structure to hold all ol BMI/Ramdump info
*/
struct ol_context {
struct bmi_info bmi;
uint8_t *cal_in_flash;
cdf_device_t cdf_dev;
struct ol_softc *scn;
cdf_work_t ramdump_work;
@ -138,6 +164,8 @@ struct ol_context {
} tgt_def;
};
#define GET_BMI_CONTEXT(ol_ctx) ((struct bmi_info *)ol_ctx)
CDF_STATUS bmi_execute(uint32_t address, uint32_t *param,
struct ol_context *ol_ctx);
CDF_STATUS bmi_init(struct ol_context *ol_ctx);

View File

@ -150,8 +150,8 @@ __ol_transfer_bin_file(struct ol_context *ol_ctx, ATH_BIN_FILE file,
#endif
struct hif_target_info *tgt_info = hif_get_target_info_handle(scn);
uint32_t target_type = tgt_info->target_type;
struct bmi_info *bmi_ctx = hif_get_bmi_ctx(scn);
cdf_device_t cdf_dev = cds_get_context(CDF_MODULE_ID_CDF_DEVICE);
struct bmi_info *bmi_ctx = GET_BMI_CONTEXT(ol_ctx);
cdf_device_t cdf_dev = ol_ctx->cdf_dev;
switch (file) {
default:
@ -376,7 +376,7 @@ __ol_transfer_bin_file(struct ol_context *ol_ctx, ATH_BIN_FILE file,
status = bmi_sign_stream_start(address,
(uint8_t *)fw_entry->data,
sizeof(SIGN_HEADER_T), scn);
sizeof(SIGN_HEADER_T), ol_ctx);
if (status != EOK) {
BMI_ERR("unable to start sign stream");
status = CDF_STATUS_E_FAILURE;
@ -419,7 +419,7 @@ __ol_transfer_bin_file(struct ol_context *ol_ctx, ATH_BIN_FILE file,
if (bin_len > 0) {
status = bmi_sign_stream_start(0,
(uint8_t *)fw_entry->data +
bin_off, bin_len, scn);
bin_off, bin_len, ol_ctx);
if (status != EOK)
BMI_ERR("sign stream error");
}
@ -1212,7 +1212,7 @@ CDF_STATUS ol_download_firmware(struct ol_context *ol_ctx)
struct hif_config_info *ini_cfg = hif_get_ini_handle(scn);
uint32_t target_type = tgt_info->target_type;
uint32_t target_version = tgt_info->target_version;
struct bmi_info *bmi_ctx = hif_get_bmi_ctx(scn);
struct bmi_info *bmi_ctx = GET_BMI_CONTEXT(ol_ctx);
#ifdef CONFIG_CNSS
if (0 != cnss_get_fw_files_for_target(&bmi_ctx->fw_files,
@ -1241,7 +1241,7 @@ CDF_STATUS ol_download_firmware(struct ol_context *ol_ctx)
return ret;
}
if (bmi_ctx->cal_in_flash) {
if (ol_ctx->cal_in_flash) {
/* Write EEPROM or Flash data to Target RAM */
status = ol_transfer_bin_file(ol_ctx, ATH_FLASH_FILE,
address, false);