diff mbox series

[5/8] dm: Introduce DMA constraints into the core device model

Message ID 20201119174820.7820-6-nsaenzjulienne@suse.de
State Superseded
Delegated to: Matthias Brugger
Headers show
Series [1/8] rpi: Add identifier for the new RPi400 | expand

Commit Message

Nicolas Saenz Julienne Nov. 19, 2020, 5:48 p.m. UTC
Calculating the DMA offset between a bus address space and CPU's every
time we call phys_to_bus() and bus_to_phys() isn't ideal performance
wise. This information is static and available before initializing the
devices so parse it before the probe call an provide the DMA offset it
in 'struct udevice' for the DMA code to use it.

Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
---
 drivers/core/device.c | 24 ++++++++++++++++++++++++
 include/dm/device.h   |  1 +
 2 files changed, 25 insertions(+)
diff mbox series

Patch

diff --git a/drivers/core/device.c b/drivers/core/device.c
index 4b3dcb3b37..4255bea24d 100644
--- a/drivers/core/device.c
+++ b/drivers/core/device.c
@@ -421,6 +421,28 @@  fail:
 	return ret;
 }
 
+void device_get_dma_constraints(struct udevice *dev)
+{
+	phys_addr_t cpu;
+	dma_addr_t bus;
+	u64 size;
+	int ret;
+
+	if (!dev_of_valid(dev))
+		return;
+
+	ret = dev_get_dma_range(dev, &cpu, &bus, &size);
+	if (ret) {
+		/* Don't complain if no 'dma-ranges' were found */
+		if (ret != -ENODEV)
+			dm_warn("%s: failed to get DMA range, %d\n",
+				dev->name, ret);
+		return;
+	}
+
+	dev->dma_offset = cpu - bus;
+}
+
 int device_probe(struct udevice *dev)
 {
 	const struct driver *drv;
@@ -482,6 +504,8 @@  int device_probe(struct udevice *dev)
 			goto fail;
 	}
 
+	device_get_dma_constraints(dev);
+
 	ret = uclass_pre_probe_device(dev);
 	if (ret)
 		goto fail;
diff --git a/include/dm/device.h b/include/dm/device.h
index 5bef484247..59f711e3dd 100644
--- a/include/dm/device.h
+++ b/include/dm/device.h
@@ -161,6 +161,7 @@  struct udevice {
 #ifdef CONFIG_DEVRES
 	struct list_head devres_head;
 #endif
+	u64 dma_offset;
 };
 
 /* Maximum sequence number supported */