diff --git a/core/bmi/src/bmi.c b/core/bmi/src/bmi.c index e1b01c4ecc90..11e380a5d6fb 100644 --- a/core/bmi/src/bmi.c +++ b/core/bmi/src/bmi.c @@ -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; diff --git a/core/bmi/src/bmi_1.c b/core/bmi/src/bmi_1.c index 111874999b1a..375e8f9faaa6 100644 --- a/core/bmi/src/bmi_1.c +++ b/core/bmi/src/bmi_1.c @@ -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; diff --git a/core/bmi/src/bmi_2.c b/core/bmi/src/bmi_2.c index 18ab4608b4ea..3782d5dca7d0 100644 --- a/core/bmi/src/bmi_2.c +++ b/core/bmi/src/bmi_2.c @@ -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"); diff --git a/core/bmi/src/i_bmi.h b/core/bmi/src/i_bmi.h index f9271a8d970d..3cc45ac7d586 100644 --- a/core/bmi/src/i_bmi.h +++ b/core/bmi/src/i_bmi.h @@ -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); diff --git a/core/bmi/src/ol_fw.c b/core/bmi/src/ol_fw.c index a18c055a4531..7e6a4d9b81a9 100644 --- a/core/bmi/src/ol_fw.c +++ b/core/bmi/src/ol_fw.c @@ -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);