return 0;
 }
 
+/**
+ * omap_rproc_da_to_va() - internal memory translation helper
+ * @rproc: remote processor to apply the address translation for
+ * @da: device address to translate
+ * @len: length of the memory buffer
+ *
+ * Custom function implementing the rproc .da_to_va ops to provide address
+ * translation (device address to kernel virtual address) for internal RAMs
+ * present in a DSP or IPU device). The translated addresses can be used
+ * either by the remoteproc core for loading, or by any rpmsg bus drivers.
+ *
+ * Return: translated virtual address in kernel memory space on success,
+ *         or NULL on failure.
+ */
+static void *omap_rproc_da_to_va(struct rproc *rproc, u64 da, size_t len)
+{
+       struct omap_rproc *oproc = rproc->priv;
+       int i;
+       u32 offset;
+
+       if (len <= 0)
+               return NULL;
+
+       if (!oproc->num_mems)
+               return NULL;
+
+       for (i = 0; i < oproc->num_mems; i++) {
+               if (da >= oproc->mem[i].dev_addr && da + len <=
+                   oproc->mem[i].dev_addr + oproc->mem[i].size) {
+                       offset = da - oproc->mem[i].dev_addr;
+                       /* __force to make sparse happy with type conversion */
+                       return (__force void *)(oproc->mem[i].cpu_addr +
+                                               offset);
+               }
+       }
+
+       return NULL;
+}
+
 static const struct rproc_ops omap_rproc_ops = {
        .start          = omap_rproc_start,
        .stop           = omap_rproc_stop,
        .kick           = omap_rproc_kick,
+       .da_to_va       = omap_rproc_da_to_va,
 };
 
 static const struct omap_rproc_mem_data ipu_mems[] = {