summaryrefslogtreecommitdiff
path: root/drivers/mxc/vpu_windsor
diff options
context:
space:
mode:
authorming_qian <ming.qian@nxp.com>2019-03-21 09:54:56 +0800
committerming_qian <ming.qian@nxp.com>2019-03-21 10:05:44 +0800
commita8b51c015337f44522839f5cf46e87cc97930ffb (patch)
tree957954346238c68b573fcdcc88d72cc1dc47674f /drivers/mxc/vpu_windsor
parenta73fdd5e48fe0df47685cfc197fe66edc1e28405 (diff)
MLK-21195:VPU Encoder: skip firmware bss only when driver cleanup memory
set skip firmware bss flag when when driver clear firmware buffer. If driver didn't clear the buffer, and the flag is set. Something unexpected may happen. So clear firmware buffer before download firmware every times. Signed-off-by: ming_qian <ming.qian@nxp.com>
Diffstat (limited to 'drivers/mxc/vpu_windsor')
-rw-r--r--drivers/mxc/vpu_windsor/vpu_encoder_b0.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/drivers/mxc/vpu_windsor/vpu_encoder_b0.c b/drivers/mxc/vpu_windsor/vpu_encoder_b0.c
index 8a58ae741803..ff4a8a2b980a 100644
--- a/drivers/mxc/vpu_windsor/vpu_encoder_b0.c
+++ b/drivers/mxc/vpu_windsor/vpu_encoder_b0.c
@@ -3382,12 +3382,18 @@ static int set_vpu_fw_addr(struct vpu_dev *dev, struct core_device *core_dev)
return 0;
}
+static void cleanup_firmware_memory(struct core_device *core_dev)
+{
+ memset_io(core_dev->m0_p_fw_space_vir, 0, core_dev->fw_buf_size);
+}
+
static int vpu_firmware_download(struct vpu_dev *This, u_int32 core_id)
{
const struct firmware *m0_pfw = NULL;
const u8 *image;
unsigned int FW_Size = 0;
int ret = 0;
+ struct core_device *core_dev = &This->core_dev[core_id];
char *p = This->core_dev[core_id].m0_p_fw_space_vir;
vpu_log_func();
@@ -3406,7 +3412,8 @@ static int vpu_firmware_download(struct vpu_dev *This, u_int32 core_id)
FW_Size = min_t(u32, m0_pfw->size, This->core_dev[core_id].fw_buf_size);
This->core_dev[core_id].fw_actual_size = FW_Size;
- memcpy(This->core_dev[core_id].m0_p_fw_space_vir, image, FW_Size);
+ cleanup_firmware_memory(core_dev);
+ memcpy(core_dev->m0_p_fw_space_vir, image, FW_Size);
p[16] = This->plat_type;
p[17] = core_id + 1;
p[18] = 1;
@@ -5235,7 +5242,7 @@ static int init_vpu_core_dev(struct core_device *core_dev)
if (!core_dev->m0_p_fw_space_vir)
vpu_err("failed to remap space for M0 firmware\n");
- memset_io(core_dev->m0_p_fw_space_vir, 0, core_dev->fw_buf_size);
+ cleanup_firmware_memory(core_dev);
core_dev->m0_rpc_virt =
ioremap_wc(core_dev->m0_rpc_phy,