"Aneesh Kumar K.V (Arm)" <[email protected]> writes:

> diff --git a/kernel/dma/direct.h b/kernel/dma/direct.h
> index e05dc7649366..4e35264ab6f8 100644
> --- a/kernel/dma/direct.h
> +++ b/kernel/dma/direct.h
> @@ -89,36 +89,32 @@ static inline dma_addr_t dma_direct_map_phys(struct 
> device *dev,
>       dma_addr_t dma_addr;
>  
>       if (is_swiotlb_force_bounce(dev)) {
> -             if (!(attrs & DMA_ATTR_CC_SHARED)) {
> -                     if (attrs & (DMA_ATTR_MMIO | DMA_ATTR_REQUIRE_COHERENT))
> -                             return DMA_MAPPING_ERROR;
> +             if (attrs & (DMA_ATTR_MMIO | DMA_ATTR_REQUIRE_COHERENT))
> +                     return DMA_MAPPING_ERROR;
>  
> -                     return swiotlb_map(dev, phys, size, dir, attrs);
> -             }
> -     } else if (attrs & DMA_ATTR_CC_SHARED) {
> -             return DMA_MAPPING_ERROR;
> +             return swiotlb_map(dev, phys, size, dir, attrs);
>       }
>  
> -     if (attrs & DMA_ATTR_MMIO) {
> -             dma_addr = phys;
> -             if (unlikely(!dma_capable(dev, dma_addr, size, false, attrs)))
> -                     goto err_overflow;
> -     } else if (attrs & DMA_ATTR_CC_SHARED) {
> +     if (attrs & DMA_ATTR_CC_SHARED)
>               dma_addr = phys_to_dma_unencrypted(dev, phys);
> +     else
> +             dma_addr = phys_to_dma_encrypted(dev, phys);
> +
> +     if (attrs & DMA_ATTR_MMIO) {
>               if (unlikely(!dma_capable(dev, dma_addr, size, false, attrs)))
>                       goto err_overflow;
> -     } else {
> -             dma_addr = phys_to_dma(dev, phys);
> -             if (unlikely(!dma_capable(dev, dma_addr, size, true, attrs)) ||
> -                 dma_kmalloc_needs_bounce(dev, size, dir)) {
> -                     if (is_swiotlb_active(dev) &&
> -                         !(attrs & DMA_ATTR_REQUIRE_COHERENT))
> -                             return swiotlb_map(dev, phys, size, dir, attrs);
> +             goto dma_mapped;
> +     }
>  
> -                     goto err_overflow;
> -             }
> +     if (unlikely(!dma_capable(dev, dma_addr, size, true, attrs)) ||
> +         dma_kmalloc_needs_bounce(dev, size, dir)) {
> +             if (is_swiotlb_active(dev) &&
> +                 !(attrs & DMA_ATTR_REQUIRE_COHERENT))
> +                     return swiotlb_map(dev, phys, size, dir, attrs);
> +             goto err_overflow;
>       }
>  
> +dma_mapped:
>       if (!dev_is_dma_coherent(dev) &&
>           !(attrs & (DMA_ATTR_SKIP_CPU_SYNC | DMA_ATTR_MMIO))) {
>               arch_sync_dma_for_device(phys, size, dir);
> -- 
> 2.43.0

I guess we need this change on top of the above

modified   kernel/dma/direct.h
@@ -88,6 +88,13 @@ static inline dma_addr_t dma_direct_map_phys(struct device 
*dev,
 {
        dma_addr_t dma_addr;
 
+       /*
+        * For a device requiring unencrypted DMA, MMIO memory is treated
+        * as shared by default.
+        */
+       if (force_dma_unencrypted(dev) && (attrs & DMA_ATTR_MMIO))
+               attrs |= DMA_ATTR_CC_SHARED;
+
        if (is_swiotlb_force_bounce(dev)) {
                if (attrs & (DMA_ATTR_MMIO | DMA_ATTR_REQUIRE_COHERENT))
                        return DMA_MAPPING_ERROR;

Reply via email to