Browse Source

msm: camera: icp: Use paddr when loading FW elf segments

Use paddr when loading FW elf segments to support TCM.

CRs-Fixed: 2722486
Change-Id: I5ab9805d44ede38c8163df73f09eea49c44eab82
Signed-off-by: Karthik Anantha Ram <[email protected]>
Karthik Anantha Ram 4 years ago
parent
commit
3f2ab61c3b

+ 2 - 4
drivers/cam_icp/icp_hw/a5_hw/a5_core.c

@@ -57,7 +57,6 @@ static int32_t cam_a5_download_fw(void *device_priv)
 	int32_t rc = 0;
 	uint32_t fw_size;
 	const uint8_t *fw_start = NULL;
-	struct cam_icp_proc_params a5_params;
 	struct cam_hw_info *a5_dev = device_priv;
 	struct cam_hw_soc_info *soc_info = NULL;
 	struct cam_a5_device_core_info *core_info = NULL;
@@ -75,7 +74,6 @@ static int32_t cam_a5_download_fw(void *device_priv)
 	hw_info = core_info->a5_hw_info;
 	pdev = soc_info->pdev;
 	cam_a5_soc_info = soc_info->soc_private;
-	a5_params.skip_seg = false;
 
 	if (cam_a5_soc_info->fw_name) {
 		CAM_INFO(CAM_ICP, "Downloading firmware %s",
@@ -108,7 +106,7 @@ static int32_t cam_a5_download_fw(void *device_priv)
 		goto fw_download_failed;
 	}
 
-	rc = cam_icp_get_fw_size(fw_start, &fw_size, &a5_params);
+	rc = cam_icp_get_fw_size(fw_start, &fw_size);
 	if (rc) {
 		CAM_ERR(CAM_ICP, "unable to get fw size");
 		goto fw_download_failed;
@@ -121,7 +119,7 @@ static int32_t cam_a5_download_fw(void *device_priv)
 		goto fw_download_failed;
 	}
 
-	rc = cam_icp_program_fw(fw_start, core_info->fw_kva_addr, &a5_params);
+	rc = cam_icp_program_fw(fw_start, core_info->fw_kva_addr);
 	if (rc) {
 		CAM_ERR(CAM_ICP, "fw program is failed");
 		goto fw_download_failed;

+ 3 - 8
drivers/cam_icp/icp_hw/lx7_hw/lx7_core.c

@@ -390,7 +390,6 @@ static int32_t __cam_non_sec_load_fw(void *device_priv)
 {
 	int32_t rc = 0;
 	uint32_t fw_size;
-	struct cam_icp_proc_params lx7_params;
 	char firmware_name[ICP_FW_NAME_MAX_SIZE] = {0};
 	const char               *fw_name;
 	const uint8_t            *fw_start = NULL;
@@ -409,13 +408,10 @@ static int32_t __cam_non_sec_load_fw(void *device_priv)
 	pdev = soc_info->pdev;
 
 	/**
-	 * Do not attempt to map 0xE0400000 and 0xE0420000 as these
+	 * Use paddr to map 0xE0400000 and 0xE0420000 as these
 	 * addresses are routed internally by the core. These segments
 	 * are used by the firmware to make use of the rom packing feature.
 	 */
-	lx7_params.skip_seg = true;
-	lx7_params.vaddr[0] = 0xE0400000;
-	lx7_params.vaddr[1] = 0xE0420000;
 
 	rc = of_property_read_string(pdev->dev.of_node, "fw_name",
 		&fw_name);
@@ -455,7 +451,7 @@ static int32_t __cam_non_sec_load_fw(void *device_priv)
 		goto fw_download_failed;
 	}
 
-	rc = cam_icp_get_fw_size(fw_start, &fw_size, &lx7_params);
+	rc = cam_icp_get_fw_size(fw_start, &fw_size);
 	if (rc) {
 		CAM_ERR(CAM_ICP, "unable to get fw size");
 		goto fw_download_failed;
@@ -469,8 +465,7 @@ static int32_t __cam_non_sec_load_fw(void *device_priv)
 	}
 
 	rc = cam_icp_program_fw(fw_start,
-		core_info->fw_params.fw_kva_addr,
-		&lx7_params);
+		core_info->fw_params.fw_kva_addr);
 	if (rc) {
 		CAM_ERR(CAM_ICP, "fw program is failed");
 		goto fw_download_failed;

+ 8 - 20
drivers/cam_icp/utils/cam_icp_utils.c

@@ -38,8 +38,7 @@ int32_t cam_icp_validate_fw(const uint8_t *elf,
 }
 
 int32_t cam_icp_get_fw_size(
-	const uint8_t *elf, uint32_t *fw_size,
-	struct cam_icp_proc_params *params)
+	const uint8_t *elf, uint32_t *fw_size)
 {
 	int32_t rc = 0;
 	int32_t i = 0;
@@ -49,7 +48,7 @@ int32_t cam_icp_get_fw_size(
 	struct elf32_hdr *elf_hdr;
 	struct elf32_phdr *prg_hdr;
 
-	if (!elf || !fw_size || !params) {
+	if (!elf || !fw_size) {
 		CAM_ERR(CAM_ICP, "invalid args");
 		return -EINVAL;
 	}
@@ -71,17 +70,12 @@ int32_t cam_icp_get_fw_size(
 		if (prg_hdr->p_flags == 0)
 			continue;
 
-		if ((params->skip_seg) &&
-			((prg_hdr->p_vaddr == params->vaddr[0]) ||
-			(prg_hdr->p_vaddr ==  params->vaddr[1])))
-			continue;
-
 		seg_mem_size = (prg_hdr->p_memsz + prg_hdr->p_align - 1) &
 					~(prg_hdr->p_align - 1);
-		seg_mem_size += prg_hdr->p_vaddr;
+		seg_mem_size += prg_hdr->p_paddr;
 		CAM_DBG(CAM_ICP, "memsz:%x align:%x addr:%x seg_mem_size:%x",
 			(int)prg_hdr->p_memsz, (int)prg_hdr->p_align,
-			(int)prg_hdr->p_vaddr, (int)seg_mem_size);
+			(int)prg_hdr->p_paddr, (int)seg_mem_size);
 		if (*fw_size < seg_mem_size)
 			*fw_size = seg_mem_size;
 
@@ -96,8 +90,7 @@ int32_t cam_icp_get_fw_size(
 }
 
 int32_t cam_icp_program_fw(const uint8_t *elf,
-	uintptr_t fw_kva_addr,
-	struct cam_icp_proc_params *params)
+	uintptr_t fw_kva_addr)
 {
 	int32_t rc = 0;
 	uint32_t num_prg_hdrs;
@@ -122,17 +115,12 @@ int32_t cam_icp_program_fw(const uint8_t *elf,
 		if (prg_hdr->p_flags == 0)
 			continue;
 
-		if ((params->skip_seg) &&
-			((prg_hdr->p_vaddr == params->vaddr[0]) ||
-			(prg_hdr->p_vaddr ==  params->vaddr[1])))
-			continue;
-
-		CAM_DBG(CAM_ICP, "Loading FW header size: %u",
-			prg_hdr->p_filesz);
+		CAM_DBG(CAM_ICP, "Loading FW header size: %u paddr: %pK",
+			prg_hdr->p_filesz, prg_hdr->p_paddr);
 		if (prg_hdr->p_filesz != 0) {
 			src = (u8 *)((u8 *)elf + prg_hdr->p_offset);
 			dest = (u8 *)(((u8 *)fw_kva_addr) +
-				prg_hdr->p_vaddr);
+				prg_hdr->p_paddr);
 
 			memcpy_toio(dest, src, prg_hdr->p_filesz);
 		}

+ 2 - 13
drivers/cam_icp/utils/cam_icp_utils.h

@@ -12,16 +12,6 @@
 
 #include "cam_debug_util.h"
 
-/**
- * struct cam_icp_proc_params - ICP [a5/lx7] specific params
- * @skip_seg :  If set skip segments listed in vaddr field
- * @vaddr    :  vaddr of segments to be skipped
- */
-struct cam_icp_proc_params {
-	bool        skip_seg;
-	uint32_t    vaddr[2];
-};
-
 /**
  * @brief : Validate FW elf image
  */
@@ -30,13 +20,12 @@ int32_t cam_icp_validate_fw(const uint8_t *elf, uint32_t machine_id);
 /**
  * @brief : Get FW elf size
  */
-int32_t cam_icp_get_fw_size(const uint8_t *elf, uint32_t *fw_size,
-	struct cam_icp_proc_params *params);
+int32_t cam_icp_get_fw_size(const uint8_t *elf, uint32_t *fw_size);
 
 /**
  * @brief : Program FW memory
  */
 int32_t cam_icp_program_fw(const uint8_t *elf,
-	uintptr_t fw_kva_addr, struct cam_icp_proc_params *params);
+	uintptr_t fw_kva_addr);
 
 #endif /* _CAM_ICP_UTILS_H_ */