diff options
| author | Daniel Axtens | 2015-04-10 05:15:47 +0200 | 
|---|---|---|
| committer | Michael Ellerman | 2015-04-11 12:49:17 +0200 | 
| commit | 97884e00e29ad6654b8b6939bb805b9d6303427c (patch) | |
| tree | c9c154d1927be0cc17353d51c2e7ba47c81b3375 /arch/powerpc | |
| parent | powerpc/maple: Move controller ops from ppc_md to controller_ops (diff) | |
| download | kernel-qcow2-linux-97884e00e29ad6654b8b6939bb805b9d6303427c.tar.gz kernel-qcow2-linux-97884e00e29ad6654b8b6939bb805b9d6303427c.tar.xz kernel-qcow2-linux-97884e00e29ad6654b8b6939bb805b9d6303427c.zip | |
powerpc: fsl_pci, swiotlb: Move controller ops from ppc_md to controller_ops
Move the installation of DMA operations out of swiotlb's subsys
initcall, and into the generic PCI controller operations struct.
These ops are installed conditionally, based on the ppc_swiotlb_enable
global. The global can be set in two places:
 - swiotlb_detect_4g, which is always called at the arch initcall level
 - setup_pci_atmu, which is called as part of the fsl_add_bridge and
fsl_pci_syscore_do_resume.
fsl_pci_syscore_do_resume is called late enough that any changes as a
result of that call will have no effect.
As such, if we test the global and set the operations as part of
fsl_add_bridge, after the call to setup_pci_atmu, we can be confident
that it will cover all the PCI implementations affected by the changes
to dma-swiotlb.c.
Signed-off-by: Daniel Axtens <dja@axtens.net>
Acked-by: Scott Wood <scottwood@freescale.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Diffstat (limited to 'arch/powerpc')
| -rw-r--r-- | arch/powerpc/kernel/dma-swiotlb.c | 11 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/fsl_pci.c | 15 | 
2 files changed, 19 insertions, 7 deletions
| diff --git a/arch/powerpc/kernel/dma-swiotlb.c b/arch/powerpc/kernel/dma-swiotlb.c index 735979764cd4..6e8d764ce47b 100644 --- a/arch/powerpc/kernel/dma-swiotlb.c +++ b/arch/powerpc/kernel/dma-swiotlb.c @@ -116,16 +116,13 @@ void __init swiotlb_detect_4g(void)  	}  } -static int __init swiotlb_late_init(void) +static int __init check_swiotlb_enabled(void)  { -	if (ppc_swiotlb_enable) { +	if (ppc_swiotlb_enable)  		swiotlb_print_info(); -		set_pci_dma_ops(&swiotlb_dma_ops); -		ppc_md.pci_dma_dev_setup = pci_dma_dev_setup_swiotlb; -	} else { +	else  		swiotlb_free(); -	}  	return 0;  } -subsys_initcall(swiotlb_late_init); +subsys_initcall(check_swiotlb_enabled); diff --git a/arch/powerpc/sysdev/fsl_pci.c b/arch/powerpc/sysdev/fsl_pci.c index 4b74c276e427..9a8fcf0d79d7 100644 --- a/arch/powerpc/sysdev/fsl_pci.c +++ b/arch/powerpc/sysdev/fsl_pci.c @@ -111,6 +111,18 @@ static struct pci_ops fsl_indirect_pcie_ops =  #define MAX_PHYS_ADDR_BITS	40  static u64 pci64_dma_offset = 1ull << MAX_PHYS_ADDR_BITS; +#ifdef CONFIG_SWIOTLB +static void setup_swiotlb_ops(struct pci_controller *hose) +{ +	if (ppc_swiotlb_enable) { +		hose->controller_ops.dma_dev_setup = pci_dma_dev_setup_swiotlb; +		set_pci_dma_ops(&swiotlb_dma_ops); +	} +} +#else +static inline void setup_swiotlb_ops(struct pci_controller *hose) {} +#endif +  static int fsl_pci_dma_set_mask(struct device *dev, u64 dma_mask)  {  	if (!dev->dma_mask || !dma_supported(dev, dma_mask)) @@ -548,6 +560,9 @@ int fsl_add_bridge(struct platform_device *pdev, int is_primary)  	/* Setup PEX window registers */  	setup_pci_atmu(hose); +	/* Set up controller operations */ +	setup_swiotlb_ops(hose); +  	return 0;  no_bridge: | 
