[RFC PATCH] apple: dart: add logic to allocate dva addresses

Sughosh Ganu sughosh.ganu at linaro.org
Tue Oct 29 08:19:29 CET 2024


On Tue, 29 Oct 2024 at 09:09, Sughosh Ganu <sughosh.ganu at linaro.org> wrote:
>
> The Apple IOMMU driver uses LMB API's to allocate virtual addresses
> for IO devices. These virtual addresses fall in the first 4GB address
> range. Currently, the driver obtains these virtual addresses through
> the LMB API's. This no longer works with the global LMB map. Add a
> function apple_dart_dvaalloc() which mimics what was being done by the
> LMB allocation function.
>
> Signed-off-by: Sughosh Ganu <sughosh.ganu at linaro.org>
> ---
>
> Note: I have only build tested this on the m1 defconfig.

NAK. To be discarded.

>
>  drivers/iommu/apple_dart.c | 24 ++++++++++++++++++------
>  1 file changed, 18 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/iommu/apple_dart.c b/drivers/iommu/apple_dart.c
> index 611ac7cd6de..8e2acf50a06 100644
> --- a/drivers/iommu/apple_dart.c
> +++ b/drivers/iommu/apple_dart.c
> @@ -6,7 +6,6 @@
>  #include <cpu_func.h>
>  #include <dm.h>
>  #include <iommu.h>
> -#include <lmb.h>
>  #include <memalign.h>
>  #include <asm/io.h>
>
> @@ -75,6 +74,7 @@ struct apple_dart_priv {
>
>         dma_addr_t dvabase;
>         dma_addr_t dvaend;
> +       dma_addr_t dvaalloc;
>
>         int nsid;
>         int nttbr;
> @@ -109,6 +109,21 @@ static void apple_dart_t8110_flush_tlb(struct apple_dart_priv *priv)
>                 continue;
>  }
>
> +static dma_addr_t apple_dart_dvaalloc(struct udevice *dev, phys_size_t size)
> +{
> +       dma_addr_t dva;
> +       struct apple_dart_priv *priv = dev_get_priv(dev);
> +
> +       dva = priv->dvaalloc - size;
> +       dva &= ~(DART_PAGE_SIZE - 1);
> +
> +       assert(dva > priv->dvabase);
> +
> +       priv->dvaalloc = dva;
> +
> +       return priv->dvaalloc;
> +}
> +
>  static dma_addr_t apple_dart_map(struct udevice *dev, void *addr, size_t size)
>  {
>         struct apple_dart_priv *priv = dev_get_priv(dev);
> @@ -123,7 +138,7 @@ static dma_addr_t apple_dart_map(struct udevice *dev, void *addr, size_t size)
>         off = (phys_addr_t)addr - paddr;
>         psize = ALIGN(size + off, DART_PAGE_SIZE);
>
> -       dva = lmb_alloc(psize, DART_PAGE_SIZE);
> +       dva = apple_dart_dvaalloc(dev, psize);
>
>         idx = dva / DART_PAGE_SIZE;
>         for (i = 0; i < psize / DART_PAGE_SIZE; i++) {
> @@ -158,8 +173,6 @@ static void apple_dart_unmap(struct udevice *dev, dma_addr_t addr, size_t size)
>         flush_dcache_range((unsigned long)&priv->l2[idx],
>                            (unsigned long)&priv->l2[idx + i]);
>         priv->flush_tlb(priv);
> -
> -       lmb_free(dva, psize);
>  }
>
>  static struct iommu_ops apple_dart_ops = {
> @@ -211,8 +224,7 @@ static int apple_dart_probe(struct udevice *dev)
>
>         priv->dvabase = DART_PAGE_SIZE;
>         priv->dvaend = SZ_4G - DART_PAGE_SIZE;
> -
> -       lmb_add(priv->dvabase, priv->dvaend - priv->dvabase);
> +       priv->dvaalloc = priv->dvaend;
>
>         /* Disable translations. */
>         for (sid = 0; sid < priv->nsid; sid++)
> --
> 2.34.1
>


More information about the U-Boot mailing list