ia64: use generic swiotlb_ops

These are identical to the ia64 ops, and would also support CMA
if enabled on ia64.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Acked-by: Christian König <christian.koenig@amd.com>
This commit is contained in:
Christoph Hellwig 2017-12-24 15:10:07 +01:00
parent d5c23ebf1b
commit 543cea9acc
4 changed files with 13 additions and 40 deletions

View File

@ -146,6 +146,7 @@ config IA64_GENERIC
bool "generic" bool "generic"
select NUMA select NUMA
select ACPI_NUMA select ACPI_NUMA
select DMA_DIRECT_OPS
select SWIOTLB select SWIOTLB
select PCI_MSI select PCI_MSI
help help
@ -166,6 +167,7 @@ config IA64_GENERIC
config IA64_DIG config IA64_DIG
bool "DIG-compliant" bool "DIG-compliant"
select DMA_DIRECT_OPS
select SWIOTLB select SWIOTLB
config IA64_DIG_VTD config IA64_DIG_VTD
@ -181,6 +183,7 @@ config IA64_HP_ZX1
config IA64_HP_ZX1_SWIOTLB config IA64_HP_ZX1_SWIOTLB
bool "HP-zx1/sx1000 with software I/O TLB" bool "HP-zx1/sx1000 with software I/O TLB"
select DMA_DIRECT_OPS
select SWIOTLB select SWIOTLB
help help
Build a kernel that runs on HP zx1 and sx1000 systems even when they Build a kernel that runs on HP zx1 and sx1000 systems even when they
@ -204,6 +207,7 @@ config IA64_SGI_UV
bool "SGI-UV" bool "SGI-UV"
select NUMA select NUMA
select ACPI_NUMA select ACPI_NUMA
select DMA_DIRECT_OPS
select SWIOTLB select SWIOTLB
help help
Selecting this option will optimize the kernel for use on UV based Selecting this option will optimize the kernel for use on UV based
@ -214,6 +218,7 @@ config IA64_SGI_UV
config IA64_HP_SIM config IA64_HP_SIM
bool "Ski-simulator" bool "Ski-simulator"
select DMA_DIRECT_OPS
select SWIOTLB select SWIOTLB
depends on !PM depends on !PM

View File

@ -19,7 +19,7 @@
#include <linux/export.h> #include <linux/export.h>
#include <asm/machvec.h> #include <asm/machvec.h>
extern const struct dma_map_ops sba_dma_ops, ia64_swiotlb_dma_ops; extern const struct dma_map_ops sba_dma_ops;
/* swiotlb declarations & definitions: */ /* swiotlb declarations & definitions: */
extern int swiotlb_late_init_with_default_size (size_t size); extern int swiotlb_late_init_with_default_size (size_t size);
@ -38,7 +38,7 @@ static inline int use_swiotlb(struct device *dev)
const struct dma_map_ops *hwsw_dma_get_ops(struct device *dev) const struct dma_map_ops *hwsw_dma_get_ops(struct device *dev)
{ {
if (use_swiotlb(dev)) if (use_swiotlb(dev))
return &ia64_swiotlb_dma_ops; return &swiotlb_dma_ops;
return &sba_dma_ops; return &sba_dma_ops;
} }
EXPORT_SYMBOL(hwsw_dma_get_ops); EXPORT_SYMBOL(hwsw_dma_get_ops);

View File

@ -2096,7 +2096,7 @@ static int __init acpi_sba_ioc_init_acpi(void)
/* This has to run before acpi_scan_init(). */ /* This has to run before acpi_scan_init(). */
arch_initcall(acpi_sba_ioc_init_acpi); arch_initcall(acpi_sba_ioc_init_acpi);
extern const struct dma_map_ops ia64_swiotlb_dma_ops; extern const struct dma_map_ops swiotlb_dma_ops;
static int __init static int __init
sba_init(void) sba_init(void)
@ -2111,7 +2111,7 @@ sba_init(void)
* a successful kdump kernel boot is to use the swiotlb. * a successful kdump kernel boot is to use the swiotlb.
*/ */
if (is_kdump_kernel()) { if (is_kdump_kernel()) {
dma_ops = &ia64_swiotlb_dma_ops; dma_ops = &swiotlb_dma_ops;
if (swiotlb_late_init_with_default_size(64 * (1<<20)) != 0) if (swiotlb_late_init_with_default_size(64 * (1<<20)) != 0)
panic("Unable to initialize software I/O TLB:" panic("Unable to initialize software I/O TLB:"
" Try machvec=dig boot option"); " Try machvec=dig boot option");
@ -2133,7 +2133,7 @@ sba_init(void)
* If we didn't find something sba_iommu can claim, we * If we didn't find something sba_iommu can claim, we
* need to setup the swiotlb and switch to the dig machvec. * need to setup the swiotlb and switch to the dig machvec.
*/ */
dma_ops = &ia64_swiotlb_dma_ops; dma_ops = &swiotlb_dma_ops;
if (swiotlb_late_init_with_default_size(64 * (1<<20)) != 0) if (swiotlb_late_init_with_default_size(64 * (1<<20)) != 0)
panic("Unable to find SBA IOMMU or initialize " panic("Unable to find SBA IOMMU or initialize "
"software I/O TLB: Try machvec=dig boot option"); "software I/O TLB: Try machvec=dig boot option");

View File

@ -6,8 +6,7 @@
#include <linux/cache.h> #include <linux/cache.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <linux/swiotlb.h>
#include <asm/swiotlb.h>
#include <asm/dma.h> #include <asm/dma.h>
#include <asm/iommu.h> #include <asm/iommu.h>
#include <asm/machvec.h> #include <asm/machvec.h>
@ -15,40 +14,9 @@
int swiotlb __read_mostly; int swiotlb __read_mostly;
EXPORT_SYMBOL(swiotlb); EXPORT_SYMBOL(swiotlb);
static void *ia64_swiotlb_alloc_coherent(struct device *dev, size_t size,
dma_addr_t *dma_handle, gfp_t gfp,
unsigned long attrs)
{
if (dev->coherent_dma_mask != DMA_BIT_MASK(64))
gfp |= GFP_DMA32;
return swiotlb_alloc_coherent(dev, size, dma_handle, gfp);
}
static void ia64_swiotlb_free_coherent(struct device *dev, size_t size,
void *vaddr, dma_addr_t dma_addr,
unsigned long attrs)
{
swiotlb_free_coherent(dev, size, vaddr, dma_addr);
}
const struct dma_map_ops ia64_swiotlb_dma_ops = {
.alloc = ia64_swiotlb_alloc_coherent,
.free = ia64_swiotlb_free_coherent,
.map_page = swiotlb_map_page,
.unmap_page = swiotlb_unmap_page,
.map_sg = swiotlb_map_sg_attrs,
.unmap_sg = swiotlb_unmap_sg_attrs,
.sync_single_for_cpu = swiotlb_sync_single_for_cpu,
.sync_single_for_device = swiotlb_sync_single_for_device,
.sync_sg_for_cpu = swiotlb_sync_sg_for_cpu,
.sync_sg_for_device = swiotlb_sync_sg_for_device,
.dma_supported = swiotlb_dma_supported,
.mapping_error = swiotlb_dma_mapping_error,
};
void __init swiotlb_dma_init(void) void __init swiotlb_dma_init(void)
{ {
dma_ops = &ia64_swiotlb_dma_ops; dma_ops = &swiotlb_dma_ops;
swiotlb_init(1); swiotlb_init(1);
} }
@ -60,7 +28,7 @@ void __init pci_swiotlb_init(void)
printk(KERN_INFO "PCI-DMA: Re-initialize machine vector.\n"); printk(KERN_INFO "PCI-DMA: Re-initialize machine vector.\n");
machvec_init("dig"); machvec_init("dig");
swiotlb_init(1); swiotlb_init(1);
dma_ops = &ia64_swiotlb_dma_ops; dma_ops = &swiotlb_dma_ops;
#else #else
panic("Unable to find Intel IOMMU"); panic("Unable to find Intel IOMMU");
#endif #endif