summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Rosato <mjrosato@linux.ibm.com>2025-02-12 16:34:16 -0500
committerJoerg Roedel <jroedel@suse.de>2025-02-21 12:01:58 +0100
commitd236843a6964dc5a55dbafa5cfae63bc99cf10f8 (patch)
treebe286b34289dc2cc2b720b4fbff0b6654f087688
parent6d52cb738a98df6d5a91d96ce5bc557d24343964 (diff)
s390/pci: store DMA offset in bus_dma_region
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>
-rw-r--r--arch/s390/pci/pci_bus.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/arch/s390/pci/pci_bus.c b/arch/s390/pci/pci_bus.c
index 39a481ec4a40..0e725039861f 100644
--- a/arch/s390/pci/pci_bus.c
+++ b/arch/s390/pci/pci_bus.c
@@ -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.