From: Joerg Roedel Date: Thu, 31 Jul 2014 18:29:02 +0000 (+0200) Subject: Merge branches 'x86/vt-d', 'x86/amd', 'arm/omap', 'ppc/pamu', 'arm/smmu', 'arm/exynos... X-Git-Url: http://drtracing.org/?a=commitdiff_plain;h=4c5e9d9f0ddf5d4ba9c51eee2ef1a4d6e93ccf56;p=deliverable%2Flinux.git Merge branches 'x86/vt-d', 'x86/amd', 'arm/omap', 'ppc/pamu', 'arm/smmu', 'arm/exynos' and 'core' into next --- 4c5e9d9f0ddf5d4ba9c51eee2ef1a4d6e93ccf56 diff --cc drivers/iommu/fsl_pamu_domain.c index fd5e9146aee6,93072ba44b1d,93072ba44b1d,8f42e8ec4d76,93072ba44b1d,af47648301a9,fd5e9146aee6..61d1dafa242d --- a/drivers/iommu/fsl_pamu_domain.c +++ b/drivers/iommu/fsl_pamu_domain.c @@@@@@@@ -952,8 -956,68 -956,68 -956,68 -956,68 -951,68 -952,8 +947,8 @@@@@@@@ static struct iommu_group *get_pci_devi pci_endpt_partioning = check_pci_ctl_endpt_part(pci_ctl); /* We can partition PCIe devices so assign device group to the device */ if (pci_endpt_partioning) { ----- bridge = pci_find_upstream_pcie_bridge(pdev); ----- if (bridge) { ----- if (pci_is_pcie(bridge)) ----- dma_pdev = pci_get_domain_bus_and_slot( ----- pci_domain_nr(pdev->bus), ----- bridge->subordinate->number, 0); ----- if (!dma_pdev) ----- dma_pdev = pci_dev_get(bridge); ----- } else ----- dma_pdev = pci_dev_get(pdev); ----- ----- /* Account for quirked devices */ ----- swap_pci_ref(&dma_pdev, pci_get_dma_source(dma_pdev)); ----- ----- /* ----- * If it's a multifunction device that does not support our ----- * required ACS flags, add to the same group as lowest numbered ----- * function that also does not suport the required ACS flags. ----- */ ----- if (dma_pdev->multifunction && ----- !pci_acs_enabled(dma_pdev, REQ_ACS_FLAGS)) { ----- u8 i, slot = PCI_SLOT(dma_pdev->devfn); ----- ----- for (i = 0; i < 8; i++) { ----- struct pci_dev *tmp; ----- ----- tmp = pci_get_slot(dma_pdev->bus, PCI_DEVFN(slot, i)); ----- if (!tmp) ----- continue; ----- ----- if (!pci_acs_enabled(tmp, REQ_ACS_FLAGS)) { ----- swap_pci_ref(&dma_pdev, tmp); ----- break; ----- } ----- pci_dev_put(tmp); - } - } - - /* - * Devices on the root bus go through the iommu. If that's not us, - * find the next upstream device and test ACS up to the root bus. - * Finding the next device may require skipping virtual buses. - */ - while (!pci_is_root_bus(dma_pdev->bus)) { - struct pci_bus *bus = dma_pdev->bus; - - while (!bus->self) { - if (!pci_is_root_bus(bus)) - bus = bus->parent; - else - goto root_bus; ----- } - - if (pci_acs_path_enabled(bus->self, NULL, REQ_ACS_FLAGS)) - break; - - swap_pci_ref(&dma_pdev, pci_dev_get(bus->self)); ----- } +++++ group = iommu_group_get_for_dev(&pdev->dev); ---- /* ---- * Devices on the root bus go through the iommu. If that's not us, ---- * find the next upstream device and test ACS up to the root bus. ---- * Finding the next device may require skipping virtual buses. ---- */ ---- while (!pci_is_root_bus(dma_pdev->bus)) { ---- struct pci_bus *bus = dma_pdev->bus; ---- ---- while (!bus->self) { ---- if (!pci_is_root_bus(bus)) ---- bus = bus->parent; ---- else ---- goto root_bus; ---- } ---- ---- if (pci_acs_path_enabled(bus->self, NULL, REQ_ACS_FLAGS)) ---- break; ---- ---- swap_pci_ref(&dma_pdev, pci_dev_get(bus->self)); ---- } ---- ----- root_bus: ----- group = get_device_iommu_group(&dma_pdev->dev); ----- pci_dev_put(dma_pdev); /* * PCIe controller is not a paritionable entity * free the controller device iommu_group.