aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390
diff options
context:
space:
mode:
authorChristian Borntraeger <borntraeger@de.ibm.com>2016-02-03 00:46:34 -0500
committerMichael S. Tsirkin <mst@redhat.com>2016-03-02 10:01:56 -0500
commite82becfc1879a43aa29492ae90ea6eb6c68b60fc (patch)
tree58a5bb902a9ee27cf0a4242ba3fcdf86fa60a315 /arch/s390
parent6aca0503847f6329460b15b3ab2b0e30bb752793 (diff)
s390/dma: Allow per device dma ops
As virtio-ccw will have dma ops, we can no longer default to the zPCI ones. Make use of dev_archdata to keep the dma_ops per device. The pci devices now use that to override the default, and the default is changed to use the noop ops for everything that does not specify a device specific one. To compile without PCI support we will enable HAS_DMA all the time, via the default config in lib/Kconfig. Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> Reviewed-by: Joerg Roedel <jroedel@suse.de> Acked-by: Cornelia Huck <cornelia.huck@de.ibm.com> Acked-by: Sebastian Ott <sebott@linux.vnet.ibm.com> Signed-off-by: Andy Lutomirski <luto@kernel.org> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Diffstat (limited to 'arch/s390')
-rw-r--r--arch/s390/Kconfig5
-rw-r--r--arch/s390/include/asm/device.h6
-rw-r--r--arch/s390/include/asm/dma-mapping.h6
-rw-r--r--arch/s390/pci/pci.c1
-rw-r--r--arch/s390/pci/pci_dma.c4
5 files changed, 13 insertions, 9 deletions
diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig
index 3be9c832dec1..b29c66e77e32 100644
--- a/arch/s390/Kconfig
+++ b/arch/s390/Kconfig
@@ -124,6 +124,7 @@ config S390
124 select HAVE_CMPXCHG_DOUBLE 124 select HAVE_CMPXCHG_DOUBLE
125 select HAVE_CMPXCHG_LOCAL 125 select HAVE_CMPXCHG_LOCAL
126 select HAVE_DEBUG_KMEMLEAK 126 select HAVE_DEBUG_KMEMLEAK
127 select HAVE_DMA_API_DEBUG
127 select HAVE_DYNAMIC_FTRACE 128 select HAVE_DYNAMIC_FTRACE
128 select HAVE_DYNAMIC_FTRACE_WITH_REGS 129 select HAVE_DYNAMIC_FTRACE_WITH_REGS
129 select HAVE_FTRACE_MCOUNT_RECORD 130 select HAVE_FTRACE_MCOUNT_RECORD
@@ -619,10 +620,6 @@ config HAS_IOMEM
619config IOMMU_HELPER 620config IOMMU_HELPER
620 def_bool PCI 621 def_bool PCI
621 622
622config HAS_DMA
623 def_bool PCI
624 select HAVE_DMA_API_DEBUG
625
626config NEED_SG_DMA_LENGTH 623config NEED_SG_DMA_LENGTH
627 def_bool PCI 624 def_bool PCI
628 625
diff --git a/arch/s390/include/asm/device.h b/arch/s390/include/asm/device.h
index d8f9872b0e2d..4a9f35e0973f 100644
--- a/arch/s390/include/asm/device.h
+++ b/arch/s390/include/asm/device.h
@@ -3,5 +3,9 @@
3 * 3 *
4 * This file is released under the GPLv2 4 * This file is released under the GPLv2
5 */ 5 */
6#include <asm-generic/device.h> 6struct dev_archdata {
7 struct dma_map_ops *dma_ops;
8};
7 9
10struct pdev_archdata {
11};
diff --git a/arch/s390/include/asm/dma-mapping.h b/arch/s390/include/asm/dma-mapping.h
index e64bfcb9702f..3249b7464889 100644
--- a/arch/s390/include/asm/dma-mapping.h
+++ b/arch/s390/include/asm/dma-mapping.h
@@ -11,11 +11,13 @@
11 11
12#define DMA_ERROR_CODE (~(dma_addr_t) 0x0) 12#define DMA_ERROR_CODE (~(dma_addr_t) 0x0)
13 13
14extern struct dma_map_ops s390_dma_ops; 14extern struct dma_map_ops s390_pci_dma_ops;
15 15
16static inline struct dma_map_ops *get_dma_ops(struct device *dev) 16static inline struct dma_map_ops *get_dma_ops(struct device *dev)
17{ 17{
18 return &s390_dma_ops; 18 if (dev && dev->archdata.dma_ops)
19 return dev->archdata.dma_ops;
20 return &dma_noop_ops;
19} 21}
20 22
21static inline void dma_cache_sync(struct device *dev, void *vaddr, size_t size, 23static inline void dma_cache_sync(struct device *dev, void *vaddr, size_t size,
diff --git a/arch/s390/pci/pci.c b/arch/s390/pci/pci.c
index 8f19c8f9d660..b63265a7f178 100644
--- a/arch/s390/pci/pci.c
+++ b/arch/s390/pci/pci.c
@@ -643,6 +643,7 @@ int pcibios_add_device(struct pci_dev *pdev)
643 643
644 zdev->pdev = pdev; 644 zdev->pdev = pdev;
645 pdev->dev.groups = zpci_attr_groups; 645 pdev->dev.groups = zpci_attr_groups;
646 pdev->dev.archdata.dma_ops = &s390_pci_dma_ops;
646 zpci_map_resources(pdev); 647 zpci_map_resources(pdev);
647 648
648 for (i = 0; i < PCI_BAR_COUNT; i++) { 649 for (i = 0; i < PCI_BAR_COUNT; i++) {
diff --git a/arch/s390/pci/pci_dma.c b/arch/s390/pci/pci_dma.c
index 4638b93c7632..a79173ec54b9 100644
--- a/arch/s390/pci/pci_dma.c
+++ b/arch/s390/pci/pci_dma.c
@@ -544,7 +544,7 @@ static int __init dma_debug_do_init(void)
544} 544}
545fs_initcall(dma_debug_do_init); 545fs_initcall(dma_debug_do_init);
546 546
547struct dma_map_ops s390_dma_ops = { 547struct dma_map_ops s390_pci_dma_ops = {
548 .alloc = s390_dma_alloc, 548 .alloc = s390_dma_alloc,
549 .free = s390_dma_free, 549 .free = s390_dma_free,
550 .map_sg = s390_dma_map_sg, 550 .map_sg = s390_dma_map_sg,
@@ -555,7 +555,7 @@ struct dma_map_ops s390_dma_ops = {
555 .is_phys = 0, 555 .is_phys = 0,
556 /* dma_supported is unconditionally true without a callback */ 556 /* dma_supported is unconditionally true without a callback */
557}; 557};
558EXPORT_SYMBOL_GPL(s390_dma_ops); 558EXPORT_SYMBOL_GPL(s390_pci_dma_ops);
559 559
560static int __init s390_iommu_setup(char *str) 560static int __init s390_iommu_setup(char *str)
561{ 561{