]> www.infradead.org Git - users/hch/misc.git/commitdiff
dma-mapping: move the PCI P2PDMA mapping helpers to pci-p2pdma.h
authorChristoph Hellwig <hch@lst.de>
Mon, 5 May 2025 07:01:39 +0000 (10:01 +0300)
committerMarek Szyprowski <m.szyprowski@samsung.com>
Tue, 6 May 2025 06:36:53 +0000 (08:36 +0200)
To support the upcoming non-scatterlist mapping helpers, we need to go
back to have them called outside of the DMA API.  Thus move them out of
dma-map-ops.h, which is only for DMA API implementations to pci-p2pdma.h,
which is for driver use.

Note that the core helper is still not exported as the mapping is
expected to be done only by very highlevel subsystem code at least for
now.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Logan Gunthorpe <logang@deltatee.com>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Tested-by: Jens Axboe <axboe@kernel.dk>
Reviewed-by: Luis Chamberlain <mcgrof@kernel.org>
Reviewed-by: Lu Baolu <baolu.lu@linux.intel.com>
Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
drivers/iommu/dma-iommu.c
include/linux/dma-map-ops.h
include/linux/pci-p2pdma.h
kernel/dma/direct.c

index a8f9fd93e150152160beba3de50a59b1af11f833..145606498b4c8334a27bbfa799a8364f13cd062b 100644 (file)
@@ -27,6 +27,7 @@
 #include <linux/msi.h>
 #include <linux/of_iommu.h>
 #include <linux/pci.h>
+#include <linux/pci-p2pdma.h>
 #include <linux/scatterlist.h>
 #include <linux/spinlock.h>
 #include <linux/swiotlb.h>
index c3086edeccc698b9788fe1844d915491f0b25200..f48e5fb88bd5dd346094bbf2ce1b79e5f5bfe1a6 100644 (file)
@@ -434,89 +434,4 @@ static inline void debug_dma_dump_mappings(struct device *dev)
 #endif /* CONFIG_DMA_API_DEBUG */
 
 extern const struct dma_map_ops dma_dummy_ops;
-
-enum pci_p2pdma_map_type {
-       /*
-        * PCI_P2PDMA_MAP_UNKNOWN: Used internally for indicating the mapping
-        * type hasn't been calculated yet. Functions that return this enum
-        * never return this value.
-        */
-       PCI_P2PDMA_MAP_UNKNOWN = 0,
-
-       /*
-        * Not a PCI P2PDMA transfer.
-        */
-       PCI_P2PDMA_MAP_NONE,
-
-       /*
-        * PCI_P2PDMA_MAP_NOT_SUPPORTED: Indicates the transaction will
-        * traverse the host bridge and the host bridge is not in the
-        * allowlist. DMA Mapping routines should return an error when
-        * this is returned.
-        */
-       PCI_P2PDMA_MAP_NOT_SUPPORTED,
-
-       /*
-        * PCI_P2PDMA_BUS_ADDR: Indicates that two devices can talk to
-        * each other directly through a PCI switch and the transaction will
-        * not traverse the host bridge. Such a mapping should program
-        * the DMA engine with PCI bus addresses.
-        */
-       PCI_P2PDMA_MAP_BUS_ADDR,
-
-       /*
-        * PCI_P2PDMA_MAP_THRU_HOST_BRIDGE: Indicates two devices can talk
-        * to each other, but the transaction traverses a host bridge on the
-        * allowlist. In this case, a normal mapping either with CPU physical
-        * addresses (in the case of dma-direct) or IOVA addresses (in the
-        * case of IOMMUs) should be used to program the DMA engine.
-        */
-       PCI_P2PDMA_MAP_THRU_HOST_BRIDGE,
-};
-
-struct pci_p2pdma_map_state {
-       struct dev_pagemap *pgmap;
-       enum pci_p2pdma_map_type map;
-       u64 bus_off;
-};
-
-/* helper for pci_p2pdma_state(), do not use directly */
-void __pci_p2pdma_update_state(struct pci_p2pdma_map_state *state,
-               struct device *dev, struct page *page);
-
-/**
- * pci_p2pdma_state - check the P2P transfer state of a page
- * @state:     P2P state structure
- * @dev:       device to transfer to/from
- * @page:      page to map
- *
- * Check if @page is a PCI P2PDMA page, and if yes of what kind.  Returns the
- * map type, and updates @state with all information needed for a P2P transfer.
- */
-static inline enum pci_p2pdma_map_type
-pci_p2pdma_state(struct pci_p2pdma_map_state *state, struct device *dev,
-               struct page *page)
-{
-       if (IS_ENABLED(CONFIG_PCI_P2PDMA) && is_pci_p2pdma_page(page)) {
-               if (state->pgmap != page_pgmap(page))
-                       __pci_p2pdma_update_state(state, dev, page);
-               return state->map;
-       }
-       return PCI_P2PDMA_MAP_NONE;
-}
-
-/**
- * pci_p2pdma_bus_addr_map - map a PCI_P2PDMA_MAP_BUS_ADDR P2P transfer
- * @state:     P2P state structure
- * @paddr:     physical address to map
- *
- * Map a physically contiguous PCI_P2PDMA_MAP_BUS_ADDR transfer.
- */
-static inline dma_addr_t
-pci_p2pdma_bus_addr_map(struct pci_p2pdma_map_state *state, phys_addr_t paddr)
-{
-       WARN_ON_ONCE(state->map != PCI_P2PDMA_MAP_BUS_ADDR);
-       return paddr + state->bus_off;
-}
-
 #endif /* _LINUX_DMA_MAP_OPS_H */
index 2c07aa6b7665ca58752f96192a4e5551e8fd9949..075c20b161d9883384b13c4f14611e3aa1f443ea 100644 (file)
@@ -104,4 +104,89 @@ static inline struct pci_dev *pci_p2pmem_find(struct device *client)
        return pci_p2pmem_find_many(&client, 1);
 }
 
+enum pci_p2pdma_map_type {
+       /*
+        * PCI_P2PDMA_MAP_UNKNOWN: Used internally as an initial state before
+        * the mapping type has been calculated. Exported routines for the API
+        * will never return this value.
+        */
+       PCI_P2PDMA_MAP_UNKNOWN = 0,
+
+       /*
+        * Not a PCI P2PDMA transfer.
+        */
+       PCI_P2PDMA_MAP_NONE,
+
+       /*
+        * PCI_P2PDMA_MAP_NOT_SUPPORTED: Indicates the transaction will
+        * traverse the host bridge and the host bridge is not in the
+        * allowlist. DMA Mapping routines should return an error when
+        * this is returned.
+        */
+       PCI_P2PDMA_MAP_NOT_SUPPORTED,
+
+       /*
+        * PCI_P2PDMA_MAP_BUS_ADDR: Indicates that two devices can talk to
+        * each other directly through a PCI switch and the transaction will
+        * not traverse the host bridge. Such a mapping should program
+        * the DMA engine with PCI bus addresses.
+        */
+       PCI_P2PDMA_MAP_BUS_ADDR,
+
+       /*
+        * PCI_P2PDMA_MAP_THRU_HOST_BRIDGE: Indicates two devices can talk
+        * to each other, but the transaction traverses a host bridge on the
+        * allowlist. In this case, a normal mapping either with CPU physical
+        * addresses (in the case of dma-direct) or IOVA addresses (in the
+        * case of IOMMUs) should be used to program the DMA engine.
+        */
+       PCI_P2PDMA_MAP_THRU_HOST_BRIDGE,
+};
+
+struct pci_p2pdma_map_state {
+       struct dev_pagemap *pgmap;
+       enum pci_p2pdma_map_type map;
+       u64 bus_off;
+};
+
+/* helper for pci_p2pdma_state(), do not use directly */
+void __pci_p2pdma_update_state(struct pci_p2pdma_map_state *state,
+               struct device *dev, struct page *page);
+
+/**
+ * pci_p2pdma_state - check the P2P transfer state of a page
+ * @state:     P2P state structure
+ * @dev:       device to transfer to/from
+ * @page:      page to map
+ *
+ * Check if @page is a PCI P2PDMA page, and if yes of what kind.  Returns the
+ * map type, and updates @state with all information needed for a P2P transfer.
+ */
+static inline enum pci_p2pdma_map_type
+pci_p2pdma_state(struct pci_p2pdma_map_state *state, struct device *dev,
+               struct page *page)
+{
+       if (IS_ENABLED(CONFIG_PCI_P2PDMA) && is_pci_p2pdma_page(page)) {
+               if (state->pgmap != page_pgmap(page))
+                       __pci_p2pdma_update_state(state, dev, page);
+               return state->map;
+       }
+       return PCI_P2PDMA_MAP_NONE;
+}
+
+/**
+ * pci_p2pdma_bus_addr_map - Translate a physical address to a bus address
+ *                          for a PCI_P2PDMA_MAP_BUS_ADDR transfer.
+ * @state:     P2P state structure
+ * @paddr:     physical address to map
+ *
+ * Map a physically contiguous PCI_P2PDMA_MAP_BUS_ADDR transfer.
+ */
+static inline dma_addr_t
+pci_p2pdma_bus_addr_map(struct pci_p2pdma_map_state *state, phys_addr_t paddr)
+{
+       WARN_ON_ONCE(state->map != PCI_P2PDMA_MAP_BUS_ADDR);
+       return paddr + state->bus_off;
+}
+
 #endif /* _LINUX_PCI_P2P_H */
index cec43cd5ed62432c0db5d9b9c80c1f770a4a7604..24c359d9c8799fd7d71b34ad1e42ad3cf1f744c7 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/vmalloc.h>
 #include <linux/set_memory.h>
 #include <linux/slab.h>
+#include <linux/pci-p2pdma.h>
 #include "direct.h"
 
 /*