From 8ba39bd5f5498c53affe2e199290ecc4990cba19 Mon Sep 17 00:00:00 2001 From: Xingang Wang Date: Thu, 7 Nov 2024 13:29:15 +0530 Subject: [PATCH] iommu/of: Fix pci_request_acs() before enumerating PCI devices When booting with devicetree, the pci_request_acs() is called after the enumeration and initialization of PCI devices, thus the ACS is not enabled. And ACS should be enabled when IOMMU is detected for the PCI host bridge, so add check for IOMMU before probe of PCI host and call pci_request_acs() to make sure ACS will be enabled when enumerating PCI devices. Change-Id: I4b9742de67850d51cdefd5217be0a82fb386a530 Fixes: 6bf6c24720d33 ("iommu/of: Request ACS from the PCI core when configuring IOMMU linkage") Signed-off-by: Xingang Wang Signed-off-by: Pavankumar Kondeti Reviewed-on: https://git-master.nvidia.com/r/c/3rdparty/canonical/linux-noble/+/3388469 GVS: buildbot_gerritrpt Tested-by: Jordan Niethe Reviewed-by: Pritesh Raithatha --- drivers/iommu/of_iommu.c | 1 - drivers/pci/of.c | 8 +++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/drivers/iommu/of_iommu.c b/drivers/iommu/of_iommu.c index e038acab13aa..66fbfea5671d 100644 --- a/drivers/iommu/of_iommu.c +++ b/drivers/iommu/of_iommu.c @@ -152,7 +152,6 @@ int of_iommu_configure(struct device *dev, struct device_node *master_np, .np = master_np, }; - pci_request_acs(); err = pci_for_each_dma_alias(to_pci_dev(dev), of_pci_iommu_init, &info); of_pci_check_device_ats(dev, master_np); diff --git a/drivers/pci/of.c b/drivers/pci/of.c index efb9952274fc..31a631832347 100644 --- a/drivers/pci/of.c +++ b/drivers/pci/of.c @@ -639,9 +639,15 @@ static int pci_parse_request_of_pci_ranges(struct device *dev, int devm_of_pci_bridge_init(struct device *dev, struct pci_host_bridge *bridge) { - if (!dev->of_node) + struct device_node *node = dev->of_node; + + if (!node) return 0; + /* Detect IOMMU and make sure ACS will be enabled */ + if (of_property_read_bool(node, "iommu-map")) + pci_request_acs(); + bridge->swizzle_irq = pci_common_swizzle; bridge->map_irq = of_irq_parse_and_map_pci;