From a8b51c015337f44522839f5cf46e87cc97930ffb Mon Sep 17 00:00:00 2001
From: ming_qian <ming.qian@nxp.com>
Date: Thu, 21 Mar 2019 09:54:56 +0800
Subject: [PATCH] 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>
---
 drivers/mxc/vpu_windsor/vpu_encoder_b0.c | 11 +++++++++--
 1 file 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 8a58ae7418036a..ff4a8a2b980abe 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,
-- 
GitLab