"Das U-Boot" Source Tree

remoteproc: Extend device_to_virt with a is_iomem parameter

Some areas needs to be initialized by using memcpy_toio and memset_io.
Following Linux Kernel commit: 40df0a91b2a5 ("remoteproc: add is_iomem to
da_to_va"), add this to U-Boot.

Reviewed-by: Ye Li <ye.li@nxp.com>
Signed-off-by: Peng Fan <peng.fan@nxp.com>

authored by

Peng Fan and committed by
Fabio Estevam
e76f9a7c 69ba0062

+75 -38
+2 -1
drivers/remoteproc/renesas_apmu.c
··· 170 170 * @dev: corresponding remote processor device 171 171 * @da: device address 172 172 * @size: Size of the memory region @da is pointing to 173 + * @is_iomem: optional pointer filled in to indicate if @da is iomapped memory 173 174 * 174 175 * Return: converted virtual address 175 176 */ 176 177 static void *renesas_apmu_rproc_device_to_virt(struct udevice *dev, ulong da, 177 - ulong size) 178 + ulong size, bool *is_iomem) 178 179 { 179 180 /* 180 181 * The Cortex R52 and A76 share the same address space,
+64 -31
drivers/remoteproc/rproc-elf-loader.c
··· 1 1 // SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause 2 2 /* 3 3 * Copyright (C) 2019, STMicroelectronics - All Rights Reserved 4 + * Copyright 2025 NXP 4 5 */ 5 6 #include <cpu_func.h> 6 7 #include <dm.h> ··· 9 10 #include <mapmem.h> 10 11 #include <remoteproc.h> 11 12 #include <asm/cache.h> 13 + #include <asm/io.h> 12 14 #include <dm/device_compat.h> 13 15 #include <linux/compat.h> 14 16 #include <linux/printk.h> ··· 181 183 for (i = 0; i < ehdr->e_phnum; i++, phdr++) { 182 184 void *dst = (void *)(uintptr_t)phdr->p_paddr; 183 185 void *src = (void *)addr + phdr->p_offset; 186 + bool is_iomem = false; 184 187 ulong dst_addr; 185 188 186 - if (phdr->p_type != PT_LOAD) 189 + if (phdr->p_type != PT_LOAD || !phdr->p_memsz) 187 190 continue; 188 191 189 192 if (ops->device_to_virt) 190 193 dst = ops->device_to_virt(dev, (ulong)dst, 191 - phdr->p_memsz); 194 + phdr->p_memsz, &is_iomem); 192 195 193 196 dev_dbg(dev, "Loading phdr %i to 0x%p (%i bytes)\n", 194 197 i, dst, phdr->p_filesz); 195 - if (phdr->p_filesz) 196 - memcpy(dst, src, phdr->p_filesz); 197 - if (phdr->p_filesz != phdr->p_memsz) 198 - memset(dst + phdr->p_filesz, 0x00, 199 - phdr->p_memsz - phdr->p_filesz); 198 + if (phdr->p_filesz) { 199 + if (is_iomem) 200 + memcpy_toio(dst, src, phdr->p_filesz); 201 + else 202 + memcpy(dst, src, phdr->p_filesz); 203 + } 204 + if (phdr->p_filesz != phdr->p_memsz) { 205 + if (is_iomem) 206 + memset_io(dst + phdr->p_filesz, 0x00, 207 + phdr->p_memsz - phdr->p_filesz); 208 + else 209 + memset(dst + phdr->p_filesz, 0x00, 210 + phdr->p_memsz - phdr->p_filesz); 211 + } 200 212 dst_addr = map_to_sysmem(dst); 201 - flush_cache(rounddown(dst_addr, ARCH_DMA_MINALIGN), 202 - roundup(dst_addr + phdr->p_filesz, 203 - ARCH_DMA_MINALIGN) - 204 - rounddown(dst_addr, ARCH_DMA_MINALIGN)); 213 + if (!is_iomem) { 214 + flush_cache(rounddown(dst_addr, ARCH_DMA_MINALIGN), 215 + roundup(dst_addr + phdr->p_filesz, ARCH_DMA_MINALIGN) - 216 + rounddown(dst_addr, ARCH_DMA_MINALIGN)); 217 + } 205 218 } 206 219 207 220 return 0; ··· 230 243 memsz = phdr->p_memsz; 231 244 filesz = phdr->p_filesz; 232 245 offset = phdr->p_offset; 246 + bool is_iomem = false; 233 247 234 248 if (phdr->p_type != PT_LOAD) 235 249 continue; ··· 239 253 240 254 ptr = (void *)(uintptr_t)da; 241 255 if (ops->device_to_virt) { 242 - ptr = ops->device_to_virt(dev, da, phdr->p_memsz); 256 + ptr = ops->device_to_virt(dev, da, phdr->p_memsz, &is_iomem); 243 257 if (!ptr) { 244 258 dev_err(dev, "bad da 0x%llx mem 0x%llx\n", da, 245 259 memsz); ··· 248 262 } 249 263 } 250 264 251 - if (filesz) 252 - memcpy(ptr, (void *)addr + offset, filesz); 253 - if (filesz != memsz) 254 - memset(ptr + filesz, 0x00, memsz - filesz); 265 + if (filesz) { 266 + if (is_iomem) 267 + memcpy_toio(ptr, (void *)addr + offset, filesz); 268 + else 269 + memcpy(ptr, (void *)addr + offset, filesz); 270 + } 271 + if (filesz != memsz) { 272 + if (is_iomem) 273 + memset_io(ptr + filesz, 0x00, memsz - filesz); 274 + else 275 + memset(ptr + filesz, 0x00, memsz - filesz); 276 + } 255 277 256 - flush_cache(rounddown((ulong)ptr, ARCH_DMA_MINALIGN), 257 - roundup((ulong)ptr + filesz, ARCH_DMA_MINALIGN) - 258 - rounddown((ulong)ptr, ARCH_DMA_MINALIGN)); 278 + if (!is_iomem) { 279 + flush_cache(rounddown((ulong)ptr, ARCH_DMA_MINALIGN), 280 + roundup((ulong)ptr + filesz, ARCH_DMA_MINALIGN) - 281 + rounddown((ulong)ptr, ARCH_DMA_MINALIGN)); 282 + } 259 283 } 260 284 261 285 return ret; ··· 381 405 Elf32_Shdr *shdr; 382 406 void *src, *dst; 383 407 ulong dst_addr; 408 + bool is_iomem = false; 384 409 385 410 shdr = rproc_elf32_find_rsc_table(dev, fw_addr, fw_size); 386 411 if (!shdr) ··· 394 419 395 420 src = (void *)fw_addr + shdr->sh_offset; 396 421 if (ops->device_to_virt) 397 - dst = (void *)ops->device_to_virt(dev, *rsc_addr, *rsc_size); 422 + dst = (void *)ops->device_to_virt(dev, *rsc_addr, *rsc_size, &is_iomem); 398 423 else 399 424 dst = (void *)rsc_addr; 400 425 401 426 dev_dbg(dev, "Loading resource table to 0x%8lx (%ld bytes)\n", 402 427 (ulong)dst, *rsc_size); 403 428 404 - memcpy(dst, src, *rsc_size); 405 - dst_addr = map_to_sysmem(dst); 406 - flush_cache(rounddown(dst_addr, ARCH_DMA_MINALIGN), 407 - roundup(dst_addr + *rsc_size, ARCH_DMA_MINALIGN) - 408 - rounddown(dst_addr, ARCH_DMA_MINALIGN)); 429 + if (is_iomem) { 430 + memcpy_toio(dst, src, *rsc_size); 431 + } else { 432 + memcpy(dst, src, *rsc_size); 433 + dst_addr = map_to_sysmem(dst); 434 + flush_cache(rounddown(dst_addr, ARCH_DMA_MINALIGN), 435 + roundup(dst_addr + *rsc_size, ARCH_DMA_MINALIGN) - 436 + rounddown(dst_addr, ARCH_DMA_MINALIGN)); 437 + } 409 438 410 439 return 0; 411 440 } ··· 490 519 const struct dm_rproc_ops *ops; 491 520 Elf64_Shdr *shdr; 492 521 void *src, *dst; 522 + bool is_iomem = false; 493 523 494 524 shdr = rproc_elf64_find_rsc_table(dev, fw_addr, fw_size); 495 525 if (!shdr) ··· 503 533 504 534 src = (void *)fw_addr + shdr->sh_offset; 505 535 if (ops->device_to_virt) 506 - dst = (void *)ops->device_to_virt(dev, *rsc_addr, *rsc_size); 536 + dst = (void *)ops->device_to_virt(dev, *rsc_addr, *rsc_size, &is_iomem); 507 537 else 508 538 dst = (void *)rsc_addr; 509 539 510 540 dev_dbg(dev, "Loading resource table to 0x%8lx (%ld bytes)\n", 511 541 (ulong)dst, *rsc_size); 512 542 513 - memcpy(dst, src, *rsc_size); 514 - flush_cache(rounddown((unsigned long)dst, ARCH_DMA_MINALIGN), 515 - roundup((unsigned long)dst + *rsc_size, 516 - ARCH_DMA_MINALIGN) - 517 - rounddown((unsigned long)dst, ARCH_DMA_MINALIGN)); 543 + if (is_iomem) { 544 + memcpy_toio(dst, src, *rsc_size); 545 + } else { 546 + memcpy(dst, src, *rsc_size); 547 + flush_cache(rounddown((unsigned long)dst, ARCH_DMA_MINALIGN), 548 + roundup((unsigned long)dst + *rsc_size, ARCH_DMA_MINALIGN) - 549 + rounddown((unsigned long)dst, ARCH_DMA_MINALIGN)); 550 + } 518 551 519 552 return 0; 520 553 }
+2 -1
drivers/remoteproc/sandbox_testproc.c
··· 308 308 * @dev: device to operate upon 309 309 * @da: device address 310 310 * @size: Size of the memory region @da is pointing to 311 + * @is_iomem: optional pointer filled in to indicate if @da is iomapped memory 311 312 * Return: converted virtual address 312 313 */ 313 314 static void *sandbox_testproc_device_to_virt(struct udevice *dev, ulong da, 314 - ulong size) 315 + ulong size, bool *is_iomem) 315 316 { 316 317 u64 paddr; 317 318
+2 -1
drivers/remoteproc/stm32_copro.c
··· 61 61 * @dev: corresponding STM32 remote processor device 62 62 * @da: device address 63 63 * @size: Size of the memory region @da is pointing to 64 + * @is_iomem: optional pointer filled in to indicate if @da is iomapped memory 64 65 * Return: converted virtual address 65 66 */ 66 67 static void *stm32_copro_device_to_virt(struct udevice *dev, ulong da, 67 - ulong size) 68 + ulong size, bool *is_iomem) 68 69 { 69 70 fdt32_t in_addr = cpu_to_be32(da), end_addr; 70 71 u64 paddr;
+1 -1
drivers/remoteproc/ti_k3_dsp_rproc.c
··· 261 261 return 0; 262 262 } 263 263 264 - static void *k3_dsp_da_to_va(struct udevice *dev, ulong da, ulong len) 264 + static void *k3_dsp_da_to_va(struct udevice *dev, ulong da, ulong len, bool *is_iomem) 265 265 { 266 266 struct k3_dsp_privdata *dsp = dev_get_priv(dev); 267 267 phys_addr_t bus_addr, dev_addr;
+1 -1
drivers/remoteproc/ti_k3_m4_rproc.c
··· 181 181 return 0; 182 182 } 183 183 184 - static void *k3_m4_da_to_va(struct udevice *dev, ulong da, ulong len) 184 + static void *k3_m4_da_to_va(struct udevice *dev, ulong da, ulong len, bool *is_iomem) 185 185 { 186 186 struct k3_m4_privdata *m4 = dev_get_priv(dev); 187 187 phys_addr_t bus_addr, dev_addr;
+1 -1
drivers/remoteproc/ti_k3_r5f_rproc.c
··· 534 534 return ret; 535 535 } 536 536 537 - static void *k3_r5f_da_to_va(struct udevice *dev, ulong da, ulong size) 537 + static void *k3_r5f_da_to_va(struct udevice *dev, ulong da, ulong size, bool *is_iomem) 538 538 { 539 539 struct k3_r5f_core *core = dev_get_priv(dev); 540 540 void __iomem *va = NULL;
+2 -1
include/remoteproc.h
··· 495 495 * @dev: Remote proc device 496 496 * @da: Device address 497 497 * @size: Size of the memory region @da is pointing to 498 + * @is_iomem: optional pointer filled in to indicate if @da is iomapped memory 498 499 * @return virtual address. 499 500 */ 500 - void * (*device_to_virt)(struct udevice *dev, ulong da, ulong size); 501 + void * (*device_to_virt)(struct udevice *dev, ulong da, ulong size, bool *is_iomem); 501 502 int (*add_res)(struct udevice *dev, 502 503 struct rproc_mem_entry *mapping); 503 504 void * (*alloc_mem)(struct udevice *dev, unsigned long len,