remoteproc: ops: Add elf section size as input parameter to device_to_virt api
authorLokesh Vutla <lokeshvutla@ti.com>
Wed, 4 Sep 2019 10:31:27 +0000 (16:01 +0530)
committerTom Rini <trini@konsulko.com>
Fri, 11 Oct 2019 14:07:33 +0000 (10:07 -0400)
Introduce a new parameter "size" that accepts size of the region to
remoteproc ops callback device_to_virt(). This can enforce more checks
on the region that device_to_virt() is dealing with.

Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
Tested-by: Fabien Dessenne <fabien.dessenne@st.com>
Reviewed-by: Fabien Dessenne <fabien.dessenne@st.com>
drivers/remoteproc/rproc-elf-loader.c
drivers/remoteproc/sandbox_testproc.c
drivers/remoteproc/stm32_copro.c
include/remoteproc.h

index 67937a75957d4a95668cb3213247bedabcb3a207..7574ba3fb31daad7ec8f0796cb0320f81c30b797 100644 (file)
@@ -86,7 +86,8 @@ int rproc_elf32_load_image(struct udevice *dev, unsigned long addr)
                        continue;
 
                if (ops->device_to_virt)
-                       dst = ops->device_to_virt(dev, (ulong)dst);
+                       dst = ops->device_to_virt(dev, (ulong)dst,
+                                                 phdr->p_memsz);
 
                dev_dbg(dev, "Loading phdr %i to 0x%p (%i bytes)\n",
                        i, dst, phdr->p_filesz);
index 5f35119ab710435b36406ce83a2468fd553765fc..eeee49c4ddc9d9a5673eaa0870a0ae4d060d8f9d 100644 (file)
@@ -306,9 +306,11 @@ static int sandbox_testproc_ping(struct udevice *dev)
  * sandbox_testproc_device_to_virt() - Convert device address to virtual address
  * @dev:       device to operate upon
  * @da:                device address
+ * @size:      Size of the memory region @da is pointing to
  * @return converted virtual address
  */
-static void *sandbox_testproc_device_to_virt(struct udevice *dev, ulong da)
+static void *sandbox_testproc_device_to_virt(struct udevice *dev, ulong da,
+                                            ulong size)
 {
        u64 paddr;
 
index ad941f67e866dbb92cb8b9aed6224150a3bad64b..71895daf9c5ca55d7b4056e4aa3ed530d268ce89 100644 (file)
@@ -107,11 +107,13 @@ static int stm32_copro_set_hold_boot(struct udevice *dev, bool hold)
  * stm32_copro_device_to_virt() - Convert device address to virtual address
  * @dev:       corresponding STM32 remote processor device
  * @da:                device address
+ * @size:      Size of the memory region @da is pointing to
  * @return converted virtual address
  */
-static void *stm32_copro_device_to_virt(struct udevice *dev, ulong da)
+static void *stm32_copro_device_to_virt(struct udevice *dev, ulong da,
+                                       ulong size)
 {
-       fdt32_t in_addr = cpu_to_be32(da);
+       fdt32_t in_addr = cpu_to_be32(da), end_addr;
        u64 paddr;
 
        paddr = dev_translate_dma_address(dev, &in_addr);
@@ -120,6 +122,12 @@ static void *stm32_copro_device_to_virt(struct udevice *dev, ulong da)
                return NULL;
        }
 
+       end_addr = cpu_to_be32(da + size - 1);
+       if (dev_translate_dma_address(dev, &end_addr) == OF_BAD_ADDR) {
+               dev_err(dev, "Unable to convert address %ld\n", da + size - 1);
+               return NULL;
+       }
+
        return phys_to_virt(paddr);
 }
 
index 49871949055a220eb924f96df2593827e003d3f5..dbff1ce3cf436d7f59583a019b1766260339ed3d 100644 (file)
@@ -122,9 +122,10 @@ struct dm_rproc_ops {
         *
         * @dev:        Remote proc device
         * @da:         Device address
+        * @size:       Size of the memory region @da is pointing to
         * @return virtual address.
         */
-       void * (*device_to_virt)(struct udevice *dev, ulong da);
+       void * (*device_to_virt)(struct udevice *dev, ulong da, ulong size);
 };
 
 /* Accessor */