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>
This commit is contained in:
parent
19124d6dee
commit
97884e00e2
|
@ -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);
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue