Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 97884e00 authored by Daniel Axtens's avatar Daniel Axtens Committed by Michael Ellerman
Browse files

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: default avatarDaniel Axtens <dja@axtens.net>
Acked-by: default avatarScott Wood <scottwood@freescale.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 19124d6d
Loading
Loading
Loading
Loading
+4 −7
Original line number Diff line number Diff line
@@ -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);
+15 −0
Original line number Diff line number Diff line
@@ -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: