Re: [PATCH V5 8/9] PCI: OF: Move of_pci_dma_configure() to pci_dma_configure()

From: Robin Murphy
Date: Wed Nov 18 2015 - 07:00:42 EST


+Arnd

On 17/11/15 15:00, Robin Murphy wrote:
Hi Suravee,

On 28/10/15 22:50, Suravee Suthikulpanit wrote:
This patch move of_pci_dma_configure() to a more generic
pci_dma_configure(), which can be extended by non-OF code (e.g. ACPI).

This has no functional change.

Unfortunately, it appears that it does...

Signed-off-by: Suravee Suthikulpanit <Suravee.Suthikulpanit@xxxxxxx>
Acked-by: Rob Herring <robh+dt@xxxxxxxxxx>
Acked-by: Bjorn Helgaas <bhelgaas@xxxxxxxxxx>
Reviewed-by: Hanjun Guo <hanjun.guo@xxxxxxxxxx>
CC: Rafael J. Wysocki <rjw@xxxxxxxxxxxxx>
[...]
+/**
+ * pci_dma_configure - Setup DMA configuration
+ * @dev: ptr to pci_dev struct of the PCI device
+ *
+ * Function to update PCI devices's DMA configuration using the same
+ * info from the OF node of host bridge's parent (if any).
+ */
+static void pci_dma_configure(struct pci_dev *dev)
+{
+ struct device *bridge = pci_get_host_bridge_device(dev);
+
+ if (IS_ENABLED(CONFIG_OF) && dev->dev.of_node) {

Previously I was seeing of_dma_configure, and thus of_iommu_configure,
called for every PCI device on Juno. The check above now prevents this
happening, since the PCI devices are probed directly from the bus and
don't have OF nodes of their own. They now get left in some
half-configured state where arch_setup_dma_ops isn't called either.

Just to follow up on that, Arnd's patch to tidy up dma_get_ops (now queued[1]) makes this even worse, since preventing arch_setup_dma_ops being called means the PCI devices now get the dummy DMA ops which leave the drivers failing to probe at all, IOMMU hacks or not :(

Robin.

[1]:https://git.kernel.org/cgit/linux/kernel/git/arm64/linux.git/commit/?h=fixes/core&id=1dccb598df549d892b6450c261da54cdd7af44b4

Should this be checking bridge->parent->of_node rather than
dev->dev.of_node (which seems to work), or am I missing something?

Sorry I don't really have the bandwidth to look into this in detail
myself, right now I'm just trying to get my magic hacks rebased ;)

Robin.

+ if (bridge->parent)
+ of_dma_configure(&dev->dev, bridge->parent->of_node);
+ }
+
+ pci_put_host_bridge_device(bridge);
+}

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/