From: "Markus Schneider-Pargmann" <msp@baylibre.com>
To: "Marek Vasut" <marek.vasut+renesas@mailbox.org>, <u-boot@lists.denx.de>
Cc: "Markus Schneider-Pargmann (TI.com)" <msp@baylibre.com>,
"Andrew Goodbody" <andrew.goodbody@linaro.org>,
"Casey Connolly" <casey.connolly@linaro.org>,
"Mattijs Korpershoek" <mkorpershoek@kernel.org>,
"Michal Simek" <michal.simek@amd.com>,
"Simon Glass" <sjg@chromium.org>, "Tom Rini" <trini@konsulko.com>
Subject: Re: [PATCH] dm: Respect dma-ranges size
Date: Mon, 30 Mar 2026 15:34:33 +0200 [thread overview]
Message-ID: <DHG5MITAHNOS.3KKMVUI98SAZ0@baylibre.com> (raw)
In-Reply-To: <20260315235756.304972-1-marek.vasut+renesas@mailbox.org>
[-- Attachment #1: Type: text/plain, Size: 6726 bytes --]
Hi Marek,
On Mon Mar 16, 2026 at 12:57 AM CET, Marek Vasut wrote:
> Rework dev_phys_to_bus() and dev_bus_to_phys() to respect the size
> of the area specified in dma-ranges DT property. The area outside
> of ranges is remapped 1:1, while the area in the ranges is remapped
> according to the description in the dma-ranges property.
>
> Adjust the test to test the area within the remapped range, not area
> outside the remapped range, which was incorrect.
>
Should this have a Fixes tag?
> Signed-off-by: Marek Vasut <marek.vasut+renesas@mailbox.org>
Not a big expert, but this looks good to me:
Reviewed-by: Markus Schneider-Pargmann <msp@baylibre.com>
One detail inline:
> ---
> Cc: "Markus Schneider-Pargmann (TI.com)" <msp@baylibre.com>
> Cc: Andrew Goodbody <andrew.goodbody@linaro.org>
> Cc: Casey Connolly <casey.connolly@linaro.org>
> Cc: Mattijs Korpershoek <mkorpershoek@kernel.org>
> Cc: Michal Simek <michal.simek@amd.com>
> Cc: Simon Glass <sjg@chromium.org>
> Cc: Tom Rini <trini@konsulko.com>
> Cc: u-boot@lists.denx.de
> ---
> drivers/core/device.c | 6 +++++-
> include/dm/device.h | 17 ++++++-----------
> include/phys2bus.h | 12 +++++++++---
> test/dm/core.c | 6 +++---
> test/dm/phys2bus.c | 4 ++--
> 5 files changed, 25 insertions(+), 20 deletions(-)
>
> diff --git a/drivers/core/device.c b/drivers/core/device.c
> index 779f371b9d5..d365204ba11 100644
> --- a/drivers/core/device.c
> +++ b/drivers/core/device.c
> @@ -473,7 +473,11 @@ static int device_get_dma_constraints(struct udevice *dev)
> return ret;
> }
>
> - dev_set_dma_offset(dev, cpu - bus);
> +#if CONFIG_IS_ENABLED(DM_DMA)
> + dev->dma_cpu = cpu;
> + dev->dma_bus = bus;
> + dev->dma_size = size;
> +#endif
>
> return 0;
> }
> diff --git a/include/dm/device.h b/include/dm/device.h
> index 678cd83c271..7bcf6df2892 100644
> --- a/include/dm/device.h
> +++ b/include/dm/device.h
> @@ -166,8 +166,9 @@ enum {
> * When CONFIG_DEVRES is enabled, devm_kmalloc() and friends will
> * add to this list. Memory so-allocated will be freed
> * automatically when the device is removed / unbound
> - * @dma_offset: Offset between the physical address space (CPU's) and the
> - * device's bus address space
> + * @dma_cpu: DMA physical address space (CPU's)
> + * @dma_bus: DMA device's bus address space
> + * @dma_size: DMA window size
> * @iommu: IOMMU device associated with this device
> */
> struct udevice {
> @@ -196,7 +197,9 @@ struct udevice {
> struct list_head devres_head;
> #endif
> #if CONFIG_IS_ENABLED(DM_DMA)
> - ulong dma_offset;
> + phys_addr_t dma_cpu;
> + dma_addr_t dma_bus;
> + u64 dma_size;
> #endif
> #if CONFIG_IS_ENABLED(IOMMU)
> struct udevice *iommu;
> @@ -272,14 +275,6 @@ static inline __attribute_const__ ofnode dev_ofnode(const struct udevice *dev)
> /* Returns non-zero if the device is active (probed and not removed) */
> #define device_active(dev) (dev_get_flags(dev) & DM_FLAG_ACTIVATED)
>
> -#if CONFIG_IS_ENABLED(DM_DMA)
> -#define dev_set_dma_offset(_dev, _offset) _dev->dma_offset = _offset
> -#define dev_get_dma_offset(_dev) _dev->dma_offset
> -#else
> -#define dev_set_dma_offset(_dev, _offset)
> -#define dev_get_dma_offset(_dev) 0
> -#endif
> -
> static inline __attribute_const__ int dev_of_offset(const struct udevice *dev)
> {
> #if CONFIG_IS_ENABLED(OF_REAL)
> diff --git a/include/phys2bus.h b/include/phys2bus.h
> index 866b8b51a8c..80fa88adae1 100644
> --- a/include/phys2bus.h
> +++ b/include/phys2bus.h
> @@ -21,17 +21,23 @@ static inline unsigned long bus_to_phys(unsigned long bus)
> }
> #endif
>
> -#if CONFIG_IS_ENABLED(DM)
> +#if CONFIG_IS_ENABLED(DM_DMA)
This is not related to the code changes right?
Best
Markus
> #include <dm/device.h>
>
> static inline dma_addr_t dev_phys_to_bus(struct udevice *dev, phys_addr_t phys)
> {
> - return phys - dev_get_dma_offset(dev);
> + /* If the PA is in the remap range, apply remap. */
> + if (phys >= dev->dma_cpu && phys < dev->dma_cpu + dev->dma_size)
> + phys -= dev->dma_cpu - dev->dma_bus;
> + return phys;
> }
>
> static inline phys_addr_t dev_bus_to_phys(struct udevice *dev, dma_addr_t bus)
> {
> - return bus + dev_get_dma_offset(dev);
> + /* If the DA is in the remap range, apply remap. */
> + if (bus >= dev->dma_bus && bus < dev->dma_bus + dev->dma_size)
> + bus += dev->dma_cpu - dev->dma_bus;
> + return bus;
> }
> #else
> #define dev_phys_to_bus(_, _addr) _addr
> diff --git a/test/dm/core.c b/test/dm/core.c
> index 78ee14af228..bb9f526b064 100644
> --- a/test/dm/core.c
> +++ b/test/dm/core.c
> @@ -1248,13 +1248,13 @@ static int dm_test_dma_offset(struct unit_test_state *uts)
> node = ofnode_path("/mmio-bus@0");
> ut_assert(ofnode_valid(node));
> ut_assertok(uclass_get_device_by_ofnode(UCLASS_TEST_BUS, node, &dev));
> - ut_asserteq_64(0, dev->dma_offset);
> + ut_asserteq_64(0, dev->dma_cpu - dev->dma_bus);
>
> /* Device behind a bus with dma-ranges */
> node = ofnode_path("/mmio-bus@0/subnode@0");
> ut_assert(ofnode_valid(node));
> ut_assertok(uclass_get_device_by_ofnode(UCLASS_TEST_FDT, node, &dev));
> - ut_asserteq_64(-0x10000000ULL, dev->dma_offset);
> + ut_asserteq_64(-0x10000000ULL, dev->dma_cpu - dev->dma_bus);
>
> /* This one has no dma-ranges */
> node = ofnode_path("/mmio-bus@1");
> @@ -1263,7 +1263,7 @@ static int dm_test_dma_offset(struct unit_test_state *uts)
> node = ofnode_path("/mmio-bus@1/subnode@0");
> ut_assert(ofnode_valid(node));
> ut_assertok(uclass_get_device_by_ofnode(UCLASS_TEST_FDT, node, &dev));
> - ut_asserteq_64(0, dev->dma_offset);
> + ut_asserteq_64(0, dev->dma_cpu - dev->dma_bus);
>
> return 0;
> }
> diff --git a/test/dm/phys2bus.c b/test/dm/phys2bus.c
> index 0f30c7e37fd..67f33904943 100644
> --- a/test/dm/phys2bus.c
> +++ b/test/dm/phys2bus.c
> @@ -28,8 +28,8 @@ static int dm_test_phys_to_bus(struct unit_test_state *uts)
> node = ofnode_path("/mmio-bus@0/subnode@0");
> ut_assert(ofnode_valid(node));
> ut_assertok(uclass_get_device_by_ofnode(UCLASS_TEST_FDT, node, &dev));
> - ut_asserteq_addr((void*)0x100fffffULL, (void*)dev_phys_to_bus(dev, 0xfffff));
> - ut_asserteq_addr((void*)0xfffffULL, (void*)(ulong)dev_bus_to_phys(dev, 0x100fffff));
> + ut_asserteq_addr((void*)0x1003ffffULL, (void*)dev_phys_to_bus(dev, 0x3ffff));
> + ut_asserteq_addr((void*)0x3ffffULL, (void*)(ulong)dev_bus_to_phys(dev, 0x1003ffff));
>
> return 0;
> }
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 289 bytes --]
next prev parent reply other threads:[~2026-03-30 13:34 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-15 23:57 [PATCH] dm: Respect dma-ranges size Marek Vasut
2026-03-30 13:34 ` Markus Schneider-Pargmann [this message]
2026-03-30 17:24 ` Marek Vasut
2026-03-31 7:00 ` Markus Schneider-Pargmann
2026-04-08 14:51 ` Tom Rini
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=DHG5MITAHNOS.3KKMVUI98SAZ0@baylibre.com \
--to=msp@baylibre.com \
--cc=andrew.goodbody@linaro.org \
--cc=casey.connolly@linaro.org \
--cc=marek.vasut+renesas@mailbox.org \
--cc=michal.simek@amd.com \
--cc=mkorpershoek@kernel.org \
--cc=sjg@chromium.org \
--cc=trini@konsulko.com \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.