mhi: core: Add support to pre allocate image buffers

This allows controller to keep the memory allocated for bhi
vector table for rddm and fbc images. Memory remains allocated
after controller powers down. Add a controller flag to make the
decision for memory allocation.

Change-Id: Ic8aee54ae57f5f9351158b18cd96faf7eeb81429
Signed-off-by: Hemant Kumar <hemantk@codeaurora.org>
This commit is contained in:
Hemant Kumar 2020-06-05 17:55:43 -07:00
commit 407257c305
5 changed files with 26 additions and 26 deletions

View file

@ -464,20 +464,22 @@ invalid_pm_state:
}
void mhi_free_bhie_table(struct mhi_controller *mhi_cntrl,
struct image_info *image_info)
struct image_info **image_info)
{
int i;
struct mhi_buf *mhi_buf = image_info->mhi_buf;
struct mhi_buf *mhi_buf = (*image_info)->mhi_buf;
if (!image_info)
if (mhi_cntrl->img_pre_alloc)
return;
for (i = 0; i < image_info->entries; i++, mhi_buf++)
for (i = 0; i < (*image_info)->entries; i++, mhi_buf++)
mhi_free_contig_coherent(mhi_cntrl, mhi_buf->len, mhi_buf->buf,
mhi_buf->dma_addr);
kfree(image_info->mhi_buf);
kfree(image_info);
kfree((*image_info)->mhi_buf);
kfree(*image_info);
*image_info = NULL;
}
int mhi_alloc_bhie_table(struct mhi_controller *mhi_cntrl,
@ -491,6 +493,9 @@ int mhi_alloc_bhie_table(struct mhi_controller *mhi_cntrl,
struct image_info *img_info;
struct mhi_buf *mhi_buf;
if (mhi_cntrl->img_pre_alloc)
return 0;
MHI_CNTRL_LOG("Allocating bytes:%zu seg_size:%zu total_seg:%u\n",
alloc_size, seg_size, segments);
@ -662,7 +667,7 @@ void mhi_fw_load_handler(struct mhi_controller *mhi_cntrl)
firmware->size);
if (ret) {
MHI_CNTRL_ERR("Error alloc size:%zu\n", firmware->size);
goto fw_load_error_ready;
goto fw_load_error_release;
}
MHI_CNTRL_LOG("Copying firmware image into vector table\n");
@ -715,8 +720,7 @@ fw_load_ee_pthru:
return;
fw_load_error_ready:
mhi_free_bhie_table(mhi_cntrl, mhi_cntrl->fbc_image);
mhi_cntrl->fbc_image = NULL;
mhi_free_bhie_table(mhi_cntrl, &mhi_cntrl->fbc_image);
fw_load_error_release:
release_firmware(firmware);

View file

@ -1820,10 +1820,8 @@ int mhi_prepare_for_power_up(struct mhi_controller *mhi_cntrl)
return 0;
bhie_error:
if (mhi_cntrl->rddm_image) {
mhi_free_bhie_table(mhi_cntrl, mhi_cntrl->rddm_image);
mhi_cntrl->rddm_image = NULL;
}
if (mhi_cntrl->rddm_image)
mhi_free_bhie_table(mhi_cntrl, &mhi_cntrl->rddm_image);
error_dev_ctxt:
mutex_unlock(&mhi_cntrl->pm_mutex);
@ -1834,15 +1832,11 @@ EXPORT_SYMBOL(mhi_prepare_for_power_up);
void mhi_unprepare_after_power_down(struct mhi_controller *mhi_cntrl)
{
if (mhi_cntrl->fbc_image) {
mhi_free_bhie_table(mhi_cntrl, mhi_cntrl->fbc_image);
mhi_cntrl->fbc_image = NULL;
}
if (mhi_cntrl->fbc_image)
mhi_free_bhie_table(mhi_cntrl, &mhi_cntrl->fbc_image);
if (mhi_cntrl->rddm_image) {
mhi_free_bhie_table(mhi_cntrl, mhi_cntrl->rddm_image);
mhi_cntrl->rddm_image = NULL;
}
if (mhi_cntrl->rddm_image)
mhi_free_bhie_table(mhi_cntrl, &mhi_cntrl->rddm_image);
mhi_deinit_dev_ctxt(mhi_cntrl);
mhi_cntrl->pre_init = false;

View file

@ -941,7 +941,7 @@ void mhi_create_devices(struct mhi_controller *mhi_cntrl);
int mhi_alloc_bhie_table(struct mhi_controller *mhi_cntrl,
struct image_info **image_info, size_t alloc_size);
void mhi_free_bhie_table(struct mhi_controller *mhi_cntrl,
struct image_info *image_info);
struct image_info **image_info);
int mhi_map_single_no_bb(struct mhi_controller *mhi_cntrl,
struct mhi_buf_info *buf_info);

View file

@ -1125,10 +1125,9 @@ void mhi_power_down(struct mhi_controller *mhi_cntrl, bool graceful)
if (!mhi_cntrl->pre_init) {
/* free all allocated resources */
if (mhi_cntrl->fbc_image) {
mhi_free_bhie_table(mhi_cntrl, mhi_cntrl->fbc_image);
mhi_cntrl->fbc_image = NULL;
}
if (mhi_cntrl->fbc_image)
mhi_free_bhie_table(mhi_cntrl, &mhi_cntrl->fbc_image);
mhi_deinit_dev_ctxt(mhi_cntrl);
}

View file

@ -229,6 +229,7 @@ struct reg_write_info {
* @rddm_size: RAM dump size that host should allocate for debugging purpose
* @sbl_size: SBL image size
* @seg_len: BHIe vector size
* @img_pre_alloc: allocate rddm and fbc image buffers one time
* @fbc_image: Points to firmware image buffer
* @rddm_image: Points to RAM dump buffer
* @max_chan: Maximum number of channels controller support
@ -302,6 +303,8 @@ struct mhi_controller {
size_t seg_len;
u32 session_id;
u32 sequence_id;
bool img_pre_alloc;
struct image_info *fbc_image;
struct image_info *rddm_image;