Catalin Marinas <[email protected]> writes:

> On Mon, Sep 21, 2026 at 08:18:40PM +0530, Aneesh Kumar K.V (Arm) wrote:
>> @@ -125,7 +126,8 @@ static inline int 
>> dma_contiguous_reserve_area(phys_addr_t size,
>>      return -ENOSYS;
>>  }
>>  static inline struct page *dma_alloc_from_contiguous(struct device *dev,
>> -            size_t count, unsigned int order, bool no_warn)
>> +            size_t count, unsigned int order, unsigned int required_order,
>> +            bool no_warn)
>>  {
>>      return NULL;
>>  }
>> @@ -136,7 +138,7 @@ static inline bool dma_release_from_contiguous(struct 
>> device *dev,
>>  }
>>  /* Use fallback alloc() and free() when CONFIG_DMA_CMA=n */
>>  static inline struct page *dma_alloc_contiguous(struct device *dev, size_t 
>> size,
>> -            gfp_t gfp)
>> +            gfp_t gfp, unsigned int align_order)
>
> Can we not just bake the alignment further down in these functions
> rather than getting the callers to pass the {required,align}_order?
>

But, we need this to be conditional on CoCo shared allocations. We could
derive that from attrs and pass attrs instead of align_order, i.e.
something like:


 struct page *dma_alloc_from_contiguous(struct device *dev, size_t count,
-               unsigned int align, unsigned int required_align, bool no_warn)
+               unsigned int align, unsigned long attrs, bool no_warn)
 {
-       if (required_align > CONFIG_CMA_ALIGNMENT)
+       if (!dma_contiguous_resolve_alignment(attrs, &align))
                return NULL;
-       align = min(max(align, required_align), CONFIG_CMA_ALIGNMENT);
 
        return cma_alloc(dev_get_cma_area(dev), count, align, no_warn);
 }


with

+static bool dma_contiguous_resolve_alignment(unsigned long attrs,
+                                            unsigned int *align)
+{
+       unsigned int required_align = 0;
+
+       if (attrs & __DMA_ATTR_ALLOC_CC_SHARED)
+               required_align = get_order(cc_shared_granule_size());
+       if (required_align > CONFIG_CMA_ALIGNMENT)
+               return false;
+
+       *align = min(max(*align, required_align), CONFIG_CMA_ALIGNMENT);
+       return true;
+}
+

-aneesh

Reply via email to