[PATCH v6 1/2] dma/contiguous: Add helper to test reserved memory type
Maxime Ripard
mripard at kernel.org
Thu Jul 10 07:36:03 UTC 2025
Hi Andrew,
On Wed, Jul 09, 2025 at 10:55:40AM -0500, Andrew Davis wrote:
> On 7/9/25 7:44 AM, Maxime Ripard wrote:
> > A given reserved-memory region can be of multiple types.
> >
> > We have currently four types defined in the tree: contiguous, backed by
> > CMA, coherent and swiotlb, backed by their respective allocators, and a
> > platform-specific one for tegra.
> >
> > However, some users, like dma-buf heaps, might be interested in the
> > exact type of a reserved memory region they are getting. It would thus
> > be useful to have helpers to test if a given region is of a given type.
> >
> > Since we only care about CMA for now though, let's create one for CMA
> > only.
> >
> > Signed-off-by: Maxime Ripard <mripard at kernel.org>
> > ---
> > include/linux/dma-map-ops.h | 13 +++++++++++++
> > kernel/dma/contiguous.c | 7 +++++++
> > 2 files changed, 20 insertions(+)
> >
> > diff --git a/include/linux/dma-map-ops.h b/include/linux/dma-map-ops.h
> > index f48e5fb88bd5dd346094bbf2ce1b79e5f5bfe1a6..ea646acb6367bd062619b337013db221749f85ab 100644
> > --- a/include/linux/dma-map-ops.h
> > +++ b/include/linux/dma-map-ops.h
> > @@ -153,10 +153,23 @@ static inline void dma_free_contiguous(struct device *dev, struct page *page,
> > {
> > __free_pages(page, get_order(size));
> > }
> > #endif /* CONFIG_DMA_CMA*/
> > +#if defined(CONFIG_DMA_CMA) && defined(CONFIG_OF_RESERVED_MEM)
> > +struct reserved_mem;
> > +
> > +bool of_reserved_mem_is_contiguous(const struct reserved_mem *rmem);
> > +#else
> > +struct reserved_mem;
> > +
> > +static inline bool of_reserved_mem_is_contiguous(const struct reserved_mem *rmem)
> > +{
> > + return false;
> > +}
> > +#endif
> > +
>
> Should this all go in linux/of_reserved_mem.h?
>
> > #ifdef CONFIG_DMA_DECLARE_COHERENT
> > int dma_declare_coherent_memory(struct device *dev, phys_addr_t phys_addr,
> > dma_addr_t device_addr, size_t size);
> > void dma_release_coherent_memory(struct device *dev);
> > int dma_alloc_from_dev_coherent(struct device *dev, ssize_t size,
> > diff --git a/kernel/dma/contiguous.c b/kernel/dma/contiguous.c
> > index 8df0dfaaca18eeb0a20145512ba64425d2e7601e..ace4982e928e404315cf38551e1596f7ed445156 100644
> > --- a/kernel/dma/contiguous.c
> > +++ b/kernel/dma/contiguous.c
> > @@ -493,6 +493,13 @@ static int __init rmem_cma_setup(struct reserved_mem *rmem)
> > &rmem->base, (unsigned long)rmem->size / SZ_1M);
> > return 0;
> > }
> > RESERVEDMEM_OF_DECLARE(cma, "shared-dma-pool", rmem_cma_setup);
> > +
> > +bool of_reserved_mem_is_contiguous(const struct reserved_mem *rmem)
>
> Needing to check where the reserved mem comes from seems wrong, it hints
> that the reserved mem region drivers, like this one, are not in full control
> of their regions. Instead of looping over all the regions in DT in the next
> patch and searching for the owner, how about the owner (this driver) call
> into __add_cma_heap() if it chooses to expose the region in that way.
>
> (I know RESERVEDMEM_OF_DECLARE callbacks are done very early and the CMA-Heap
> driver might not be able to deal with adding heaps at this point, so maybe
> keeping a table the heaps driver can later iterate over would also work).
It's something I considered but wasn't too sure about, so I went the
less intrusive way.
I'll work on that for the next version, thanks!
Maxime
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 273 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/dri-devel/attachments/20250710/98eb5425/attachment.sig>
More information about the dri-devel
mailing list