]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
s390/pci: store DMA offset in bus_dma_region
authorMatthew Rosato <mjrosato@linux.ibm.com>
Wed, 12 Feb 2025 21:34:16 +0000 (16:34 -0500)
committerJoerg Roedel <jroedel@suse.de>
Fri, 21 Feb 2025 11:01:58 +0000 (12:01 +0100)
PCI devices on s390 have a DMA offset that is reported via CLP.  In
preparation for allowing identity domains, setup the bus_dma_region
for all PCI devices using the reported CLP value.

Signed-off-by: Matthew Rosato <mjrosato@linux.ibm.com>
Reviewed-by: Niklas Schnelle <schnelle@linux.ibm.com>
Tested-by: Niklas Schnelle <schnelle@linux.ibm.com>
Link: https://lore.kernel.org/r/20250212213418.182902-3-mjrosato@linux.ibm.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
arch/s390/pci/pci_bus.c

index 39a481ec4a402dbcd7e4c757fe77115c0ed5e81c..0e725039861f92925a38f7ff7cb6de6b0d965ac3 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/jump_label.h>
 #include <linux/pci.h>
 #include <linux/printk.h>
+#include <linux/dma-direct.h>
 
 #include <asm/pci_clp.h>
 #include <asm/pci_dma.h>
@@ -283,10 +284,34 @@ static struct zpci_bus *zpci_bus_alloc(int topo, bool topo_is_tid)
        return zbus;
 }
 
+static void pci_dma_range_setup(struct pci_dev *pdev)
+{
+       struct zpci_dev *zdev = to_zpci(pdev);
+       struct bus_dma_region *map;
+       u64 aligned_end;
+
+       map = kzalloc(sizeof(*map), GFP_KERNEL);
+       if (!map)
+               return;
+
+       map->cpu_start = 0;
+       map->dma_start = PAGE_ALIGN(zdev->start_dma);
+       aligned_end = PAGE_ALIGN_DOWN(zdev->end_dma + 1);
+       if (aligned_end >= map->dma_start)
+               map->size = aligned_end - map->dma_start;
+       else
+               map->size = 0;
+       WARN_ON_ONCE(map->size == 0);
+
+       pdev->dev.dma_range_map = map;
+}
+
 void pcibios_bus_add_device(struct pci_dev *pdev)
 {
        struct zpci_dev *zdev = to_zpci(pdev);
 
+       pci_dma_range_setup(pdev);
+
        /*
         * With pdev->no_vf_scan the common PCI probing code does not
         * perform PF/VF linking.