瀏覽代碼

Merged TI feature rpmsg into ti-linux-4.19.y

TI-Feature: rpmsg
TI-Branch: rpmsg-ti-linux-4.19.y-intg

* 'rpmsg-ti-linux-4.19.y-intg' of git://git.ti.com/rpmsg/rpmsg:
  remoteproc/k3-r5: fix memzero issues on reserved SRAM regions
  remoteproc/k3-r5: fix loading into BTCM when using R5 local addresses
  remoteproc/k3-r5: fix unaligned data faults with TCMs during loading
  TEMP: arm64: dts: ti: k3-am654-base-board: Increase reserve memory for RTOS IPC

Signed-off-by: LCPD Auto Merger <lcpd_integration@list.ti.com>
LCPD Auto Merger 6 年之前
父節點
當前提交
b50955adb7
共有 2 個文件被更改,包括 33 次插入17 次删除
  1. 1 1
      arch/arm64/boot/dts/ti/k3-am654-base-board.dts
  2. 32 16
      drivers/remoteproc/ti_k3_r5_remoteproc.c

+ 1 - 1
arch/arm64/boot/dts/ti/k3-am654-base-board.dts

@@ -66,7 +66,7 @@
 		};
 
 		rtos_ipc_memory_region: ipc-memories@a2000000 {
-			reg = <0x00 0xa2000000 0x00 0x00100000>;
+			reg = <0x00 0xa2000000 0x00 0x00200000>;
 			alignment = <0x1000>;
 			no-map;
 		};

+ 32 - 16
drivers/remoteproc/ti_k3_r5_remoteproc.c

@@ -596,22 +596,21 @@ static void *k3_r5_rproc_da_to_va(struct rproc *rproc, u64 da, int len,
 	if (len <= 0)
 		return NULL;
 
-	/* handle R5-view of ATCM addresses first using address 0 */
-	size = core->mem[0].size;
-	if (da >= 0 && ((da + len) <= size)) {
-		offset = da;
-		va = core->mem[0].cpu_addr + offset;
-		return (__force void *)va;
-	}
-
-	/* handle SoC-view addresses for ATCM and BTCM */
+	/* handle both R5 and SoC views of ATCM and BTCM */
 	for (i = 0; i < core->num_mems; i++) {
 		bus_addr = core->mem[i].bus_addr;
 		dev_addr = core->mem[i].dev_addr;
 		size = core->mem[i].size;
 
-		if (da >= bus_addr &&
-		    ((da + len) <= (bus_addr + size))) {
+		/* handle R5-view addresses of TCMs */
+		if (da >= dev_addr && ((da + len) <= (dev_addr + size))) {
+			offset = da - dev_addr;
+			va = core->mem[i].cpu_addr + offset;
+			return (__force void *)va;
+		}
+
+		/* handle SoC-view addresses of TCMs */
+		if (da >= bus_addr && ((da + len) <= (bus_addr + size))) {
 			offset = da - bus_addr;
 			va = core->mem[i].cpu_addr + offset;
 			return (__force void *)va;
@@ -1090,11 +1089,28 @@ static int k3_r5_core_of_get_internal_memories(struct platform_device *pdev,
 	for (i = 0; i < num_mems; i++) {
 		res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
 						   mem_names[i]);
-		core->mem[i].cpu_addr = devm_ioremap_resource(dev, res);
-		if (IS_ERR(core->mem[i].cpu_addr)) {
-			dev_err(dev, "failed to parse and map %s memory\n",
+		if (!res) {
+			dev_err(dev, "found no memory resource for %s\n",
 				mem_names[i]);
+			ret = -EINVAL;
+			goto fail;
+		}
+		if (!devm_request_mem_region(dev, res->start,
+					     resource_size(res),
+					     dev_name(dev))) {
+			dev_err(dev, "could not request %s region for resource\n",
+				mem_names[i]);
+			ret = -EBUSY;
+			goto fail;
+		}
+
+		core->mem[i].cpu_addr = devm_ioremap_wc(dev, res->start,
+							resource_size(res));
+		if (IS_ERR(core->mem[i].cpu_addr)) {
+			dev_err(dev, "failed to map %s memory\n", mem_names[i]);
 			ret = PTR_ERR(core->mem[i].cpu_addr);
+			devm_release_mem_region(dev, res->start,
+						resource_size(res));
 			goto fail;
 		}
 		core->mem[i].bus_addr = res->start;
@@ -1179,8 +1195,8 @@ static int k3_r5_core_of_get_sram_memories(struct platform_device *pdev,
 		core->sram[i].bus_addr = res.start;
 		core->sram[i].dev_addr = res.start;
 		core->sram[i].size = resource_size(&res);
-		core->sram[i].cpu_addr = ioremap(res.start,
-						 resource_size(&res));
+		core->sram[i].cpu_addr = ioremap_wc(res.start,
+						    resource_size(&res));
 		if (!core->sram[i].cpu_addr) {
 			dev_err(dev, "failed to parse and map sram%d memory at %pad\n",
 				i, &res.start);