diff mbox series

iommu/dma: Add support for mapping memory as device memory

Message ID 1596527558-22566-1-git-send-email-amhetre@nvidia.com
State Deferred
Headers show
Series iommu/dma: Add support for mapping memory as device memory | expand

Commit Message

Ashish Mhetre Aug. 4, 2020, 7:52 a.m. UTC
Add DMA_ATTRS_DEVICE_MAP attribute to support mapping memory as device
memory.

Signed-off-by: Ashish Mhetre <amhetre@nvidia.com>
---
 drivers/iommu/dma-iommu.c   | 3 +++
 include/linux/dma-mapping.h | 6 ++++++
 2 files changed, 9 insertions(+)

Comments

Mikko Perttunen Aug. 4, 2020, 8:56 a.m. UTC | #1
From what I can tell, dma_map_resource already does this (see 
iommu_dma_map_resource). Can you use that?

(also, dropping internal MLs)

Mikko

On 8/4/20 10:52 AM, Ashish Mhetre wrote:
> Add DMA_ATTRS_DEVICE_MAP attribute to support mapping memory as device
> memory.
> 
> Signed-off-by: Ashish Mhetre <amhetre@nvidia.com>
> ---
>   drivers/iommu/dma-iommu.c   | 3 +++
>   include/linux/dma-mapping.h | 6 ++++++
>   2 files changed, 9 insertions(+)
> 
> diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c
> index 65ac889..0e411ef 100644
> --- a/drivers/iommu/dma-iommu.c
> +++ b/drivers/iommu/dma-iommu.c
> @@ -388,6 +388,9 @@ static int dma_info_to_prot(enum dma_data_direction dir, bool coherent,
>   	if (attrs & DMA_ATTR_PRIVILEGED)
>   		prot |= IOMMU_PRIV;
>   
> +	if (attrs & DMA_ATTR_DEVICE_MAP)
> +		prot |= IOMMU_MMIO;
> +
>   	switch (dir) {
>   	case DMA_BIDIRECTIONAL:
>   		return prot | IOMMU_READ | IOMMU_WRITE;
> diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h
> index 330ad58..b0cb1b3 100644
> --- a/include/linux/dma-mapping.h
> +++ b/include/linux/dma-mapping.h
> @@ -68,6 +68,12 @@
>   #define DMA_ATTR_PRIVILEGED		(1UL << 9)
>   
>   /*
> + * DMA_ATTR_DEVICE_MAP: This specifies DMA-mapping subsystem to map memory
> + * as device memory.
> + */
> +#define DMA_ATTR_DEVICE_MAP		(1UL << 10)
> +
> +/*
>    * A dma_addr_t can hold any valid DMA or bus address for the platform.
>    * It can be given to a device to use as a DMA source or target.  A CPU cannot
>    * reference a dma_addr_t directly because there may be translation between
>
Krishna Reddy Aug. 4, 2020, 4:47 p.m. UTC | #2
Can you explain why it is necessary? Can you also include a client driver patches that uses this new attribute? 
Including the patches that uses this attribute would make it easy to upstream.

-KR

-----Original Message-----
From: Ashish Mhetre <amhetre@nvidia.com> 
Sent: Tuesday, August 4, 2020 12:53 AM
To: Krishna Reddy <vdumpa@nvidia.com>; Thierry Reding <treding@nvidia.com>; Jonathan Hunter <jonathanh@nvidia.com>; Stephen Warren <swarren@nvidia.com>; Sachin Nikam <Snikam@nvidia.com>
Cc: SW-Mobile-Linux-Upstreaming <SW-Mobile-Linux-Upstreaming@exchange.nvidia.com>; SW-Mobile-Memory-Core <SW-Mobile-Memory-Core@exchange.nvidia.com>; linux-tegra@vger.kernel.org; Ashish Mhetre <amhetre@nvidia.com>
Subject: [PATCH] iommu/dma: Add support for mapping memory as device memory

Add DMA_ATTRS_DEVICE_MAP attribute to support mapping memory as device memory.

Signed-off-by: Ashish Mhetre <amhetre@nvidia.com>
---
 drivers/iommu/dma-iommu.c   | 3 +++
 include/linux/dma-mapping.h | 6 ++++++
 2 files changed, 9 insertions(+)

diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c index 65ac889..0e411ef 100644
--- a/drivers/iommu/dma-iommu.c
+++ b/drivers/iommu/dma-iommu.c
@@ -388,6 +388,9 @@ static int dma_info_to_prot(enum dma_data_direction dir, bool coherent,
 	if (attrs & DMA_ATTR_PRIVILEGED)
 		prot |= IOMMU_PRIV;
 
+	if (attrs & DMA_ATTR_DEVICE_MAP)
+		prot |= IOMMU_MMIO;
+
 	switch (dir) {
 	case DMA_BIDIRECTIONAL:
 		return prot | IOMMU_READ | IOMMU_WRITE; diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h index 330ad58..b0cb1b3 100644
--- a/include/linux/dma-mapping.h
+++ b/include/linux/dma-mapping.h
@@ -68,6 +68,12 @@
 #define DMA_ATTR_PRIVILEGED		(1UL << 9)
 
 /*
+ * DMA_ATTR_DEVICE_MAP: This specifies DMA-mapping subsystem to map 
+memory
+ * as device memory.
+ */
+#define DMA_ATTR_DEVICE_MAP		(1UL << 10)
+
+/*
  * A dma_addr_t can hold any valid DMA or bus address for the platform.
  * It can be given to a device to use as a DMA source or target.  A CPU cannot
  * reference a dma_addr_t directly because there may be translation between
--
2.7.4
diff mbox series

Patch

diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c
index 65ac889..0e411ef 100644
--- a/drivers/iommu/dma-iommu.c
+++ b/drivers/iommu/dma-iommu.c
@@ -388,6 +388,9 @@  static int dma_info_to_prot(enum dma_data_direction dir, bool coherent,
 	if (attrs & DMA_ATTR_PRIVILEGED)
 		prot |= IOMMU_PRIV;
 
+	if (attrs & DMA_ATTR_DEVICE_MAP)
+		prot |= IOMMU_MMIO;
+
 	switch (dir) {
 	case DMA_BIDIRECTIONAL:
 		return prot | IOMMU_READ | IOMMU_WRITE;
diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h
index 330ad58..b0cb1b3 100644
--- a/include/linux/dma-mapping.h
+++ b/include/linux/dma-mapping.h
@@ -68,6 +68,12 @@ 
 #define DMA_ATTR_PRIVILEGED		(1UL << 9)
 
 /*
+ * DMA_ATTR_DEVICE_MAP: This specifies DMA-mapping subsystem to map memory
+ * as device memory.
+ */
+#define DMA_ATTR_DEVICE_MAP		(1UL << 10)
+
+/*
  * A dma_addr_t can hold any valid DMA or bus address for the platform.
  * It can be given to a device to use as a DMA source or target.  A CPU cannot
  * reference a dma_addr_t directly because there may be translation between