diff mbox

[v4,13/16] iommu/fsl: Use iommu_group_get_for_dev() for IOMMU groups

Message ID 20140522230845.2856.95844.stgit@bling.home (mailing list archive)
State New, archived
Delegated to: Bjorn Helgaas
Headers show

Commit Message

Alex Williamson May 22, 2014, 11:08 p.m. UTC
Drop custom code and use IOMMU provided grouping support for PCI.

Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
Cc: Varun Sethi <varun.sethi@freescale.com>
---
 drivers/iommu/fsl_pamu_domain.c |   66 +--------------------------------------
 1 file changed, 1 insertion(+), 65 deletions(-)


--
To unsubscribe from this list: send the line "unsubscribe linux-pci" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Comments

Varun Sethi May 30, 2014, 9:17 a.m. UTC | #1
DQoNCj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gRnJvbTogQWxleCBXaWxsaWFtc29u
IFttYWlsdG86YWxleC53aWxsaWFtc29uQHJlZGhhdC5jb21dDQo+IFNlbnQ6IEZyaWRheSwgTWF5
IDIzLCAyMDE0IDQ6MzkgQU0NCj4gVG86IGxpbnV4LXBjaUB2Z2VyLmtlcm5lbC5vcmc7IGlvbW11
QGxpc3RzLmxpbnV4LWZvdW5kYXRpb24ub3JnDQo+IENjOiBsaW51eC1rZXJuZWxAdmdlci5rZXJu
ZWwub3JnOyBhY29va3NAZ21haWwuY29tOyBsaW51eEBob3Jpem9uLmNvbTsNCj4gYmhlbGdhYXNA
Z29vZ2xlLmNvbTsgU2V0aGkgVmFydW4tQjE2Mzk1OyBlZGR5MDU5NkBnbWFpbC5jb20NCj4gU3Vi
amVjdDogW1BBVENIIHY0IDEzLzE2XSBpb21tdS9mc2w6IFVzZSBpb21tdV9ncm91cF9nZXRfZm9y
X2RldigpIGZvcg0KPiBJT01NVSBncm91cHMNCj4gDQo+IERyb3AgY3VzdG9tIGNvZGUgYW5kIHVz
ZSBJT01NVSBwcm92aWRlZCBncm91cGluZyBzdXBwb3J0IGZvciBQQ0kuDQo+IA0KPiBTaWduZWQt
b2ZmLWJ5OiBBbGV4IFdpbGxpYW1zb24gPGFsZXgud2lsbGlhbXNvbkByZWRoYXQuY29tPg0KPiBD
YzogVmFydW4gU2V0aGkgPHZhcnVuLnNldGhpQGZyZWVzY2FsZS5jb20+DQo+IC0tLQ0KPiAgZHJp
dmVycy9pb21tdS9mc2xfcGFtdV9kb21haW4uYyB8ICAgNjYgKy0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tDQo+IC0tLS0tLQ0KPiAgMSBmaWxlIGNoYW5nZWQsIDEgaW5zZXJ0aW9uKCsp
LCA2NSBkZWxldGlvbnMoLSkNCj4gDQo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2lvbW11L2ZzbF9w
YW11X2RvbWFpbi5jDQo+IGIvZHJpdmVycy9pb21tdS9mc2xfcGFtdV9kb21haW4uYyBpbmRleCA5
MzA3MmJhLi5kMDJkNjY4IDEwMDY0NA0KPiAtLS0gYS9kcml2ZXJzL2lvbW11L2ZzbF9wYW11X2Rv
bWFpbi5jDQo+ICsrKyBiL2RyaXZlcnMvaW9tbXUvZnNsX3BhbXVfZG9tYWluLmMNCj4gQEAgLTM4
LDcgKzM4LDYgQEANCj4gICNpbmNsdWRlIDxzeXNkZXYvZnNsX3BjaS5oPg0KPiANCj4gICNpbmNs
dWRlICJmc2xfcGFtdV9kb21haW4uaCINCj4gLSNpbmNsdWRlICJwY2kuaCINCj4gDQo+ICAvKg0K
PiAgICogR2xvYmFsIHNwaW5sb2NrIHRoYXQgbmVlZHMgdG8gYmUgaGVsZCB3aGlsZSBAQCAtODky
LDggKzg5MSw2IEBADQo+IHN0YXRpYyBpbnQgZnNsX3BhbXVfZ2V0X2RvbWFpbl9hdHRyKHN0cnVj
dCBpb21tdV9kb21haW4gKmRvbWFpbiwNCj4gIAlyZXR1cm4gcmV0Ow0KPiAgfQ0KPiANCj4gLSNk
ZWZpbmUgUkVRX0FDU19GTEFHUwkoUENJX0FDU19TViB8IFBDSV9BQ1NfUlIgfCBQQ0lfQUNTX0NS
IHwNCj4gUENJX0FDU19VRikNCj4gLQ0KPiAgc3RhdGljIHN0cnVjdCBpb21tdV9ncm91cCAqZ2V0
X2RldmljZV9pb21tdV9ncm91cChzdHJ1Y3QgZGV2aWNlICpkZXYpICB7DQo+ICAJc3RydWN0IGlv
bW11X2dyb3VwICpncm91cDsNCj4gQEAgLTk1MCw3NCArOTQ3LDEzIEBAIHN0YXRpYyBzdHJ1Y3Qg
aW9tbXVfZ3JvdXANCj4gKmdldF9wY2lfZGV2aWNlX2dyb3VwKHN0cnVjdCBwY2lfZGV2ICpwZGV2
KQ0KPiAgCXN0cnVjdCBwY2lfY29udHJvbGxlciAqcGNpX2N0bDsNCj4gIAlib29sIHBjaV9lbmRw
dF9wYXJ0aW9uaW5nOw0KPiAgCXN0cnVjdCBpb21tdV9ncm91cCAqZ3JvdXAgPSBOVUxMOw0KPiAt
CXN0cnVjdCBwY2lfZGV2ICpicmlkZ2UsICpkbWFfcGRldiA9IE5VTEw7DQo+IA0KPiAgCXBjaV9j
dGwgPSBwY2lfYnVzX3RvX2hvc3QocGRldi0+YnVzKTsNCj4gIAlwY2lfZW5kcHRfcGFydGlvbmlu
ZyA9IGNoZWNrX3BjaV9jdGxfZW5kcHRfcGFydChwY2lfY3RsKTsNCj4gIAkvKiBXZSBjYW4gcGFy
dGl0aW9uIFBDSWUgZGV2aWNlcyBzbyBhc3NpZ24gZGV2aWNlIGdyb3VwIHRvIHRoZQ0KPiBkZXZp
Y2UgKi8NCj4gIAlpZiAocGNpX2VuZHB0X3BhcnRpb25pbmcpIHsNCj4gLQkJYnJpZGdlID0gcGNp
X2ZpbmRfdXBzdHJlYW1fcGNpZV9icmlkZ2UocGRldik7DQo+IC0JCWlmIChicmlkZ2UpIHsNCj4g
LQkJCWlmIChwY2lfaXNfcGNpZShicmlkZ2UpKQ0KPiAtCQkJCWRtYV9wZGV2ID0gcGNpX2dldF9k
b21haW5fYnVzX2FuZF9zbG90KA0KPiAtCQkJCQkJcGNpX2RvbWFpbl9ucihwZGV2LT5idXMpLA0K
PiAtCQkJCQkJYnJpZGdlLT5zdWJvcmRpbmF0ZS0+bnVtYmVyLCAwKTsNCj4gLQkJCWlmICghZG1h
X3BkZXYpDQo+IC0JCQkJZG1hX3BkZXYgPSBwY2lfZGV2X2dldChicmlkZ2UpOw0KPiAtCQl9IGVs
c2UNCj4gLQkJCWRtYV9wZGV2ID0gcGNpX2Rldl9nZXQocGRldik7DQo+IC0NCj4gLQkJLyogQWNj
b3VudCBmb3IgcXVpcmtlZCBkZXZpY2VzICovDQo+IC0JCXN3YXBfcGNpX3JlZigmZG1hX3BkZXYs
IHBjaV9nZXRfZG1hX3NvdXJjZShkbWFfcGRldikpOw0KPiAtDQo+IC0JCS8qDQo+IC0JCSAqIElm
IGl0J3MgYSBtdWx0aWZ1bmN0aW9uIGRldmljZSB0aGF0IGRvZXMgbm90IHN1cHBvcnQgb3VyDQo+
IC0JCSAqIHJlcXVpcmVkIEFDUyBmbGFncywgYWRkIHRvIHRoZSBzYW1lIGdyb3VwIGFzIGxvd2Vz
dA0KPiBudW1iZXJlZA0KPiAtCQkgKiBmdW5jdGlvbiB0aGF0IGFsc28gZG9lcyBub3Qgc3Vwb3J0
IHRoZSByZXF1aXJlZCBBQ1MgZmxhZ3MuDQo+IC0JCSAqLw0KPiAtCQlpZiAoZG1hX3BkZXYtPm11
bHRpZnVuY3Rpb24gJiYNCj4gLQkJICAgICFwY2lfYWNzX2VuYWJsZWQoZG1hX3BkZXYsIFJFUV9B
Q1NfRkxBR1MpKSB7DQo+IC0JCQl1OCBpLCBzbG90ID0gUENJX1NMT1QoZG1hX3BkZXYtPmRldmZu
KTsNCj4gLQ0KPiAtCQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgew0KPiAtCQkJCXN0cnVjdCBw
Y2lfZGV2ICp0bXA7DQo+IC0NCj4gLQkJCQl0bXAgPSBwY2lfZ2V0X3Nsb3QoZG1hX3BkZXYtPmJ1
cywgUENJX0RFVkZOKHNsb3QsDQo+IGkpKTsNCj4gLQkJCQlpZiAoIXRtcCkNCj4gLQkJCQkJY29u
dGludWU7DQo+IC0NCj4gLQkJCQlpZiAoIXBjaV9hY3NfZW5hYmxlZCh0bXAsIFJFUV9BQ1NfRkxB
R1MpKSB7DQo+IC0JCQkJCXN3YXBfcGNpX3JlZigmZG1hX3BkZXYsIHRtcCk7DQo+IC0JCQkJCWJy
ZWFrOw0KPiAtCQkJCX0NCj4gLQkJCQlwY2lfZGV2X3B1dCh0bXApOw0KPiAtCQkJfQ0KPiAtCQl9
DQo+IC0NCj4gLQkJLyoNCj4gLQkJICogRGV2aWNlcyBvbiB0aGUgcm9vdCBidXMgZ28gdGhyb3Vn
aCB0aGUgaW9tbXUuICBJZiB0aGF0J3MNCj4gbm90IHVzLA0KPiAtCQkgKiBmaW5kIHRoZSBuZXh0
IHVwc3RyZWFtIGRldmljZSBhbmQgdGVzdCBBQ1MgdXAgdG8gdGhlIHJvb3QNCj4gYnVzLg0KPiAt
CQkgKiBGaW5kaW5nIHRoZSBuZXh0IGRldmljZSBtYXkgcmVxdWlyZSBza2lwcGluZyB2aXJ0dWFs
DQo+IGJ1c2VzLg0KPiAtCQkgKi8NCj4gLQkJd2hpbGUgKCFwY2lfaXNfcm9vdF9idXMoZG1hX3Bk
ZXYtPmJ1cykpIHsNCj4gLQkJCXN0cnVjdCBwY2lfYnVzICpidXMgPSBkbWFfcGRldi0+YnVzOw0K
PiAtDQo+IC0JCQl3aGlsZSAoIWJ1cy0+c2VsZikgew0KPiAtCQkJCWlmICghcGNpX2lzX3Jvb3Rf
YnVzKGJ1cykpDQo+IC0JCQkJCWJ1cyA9IGJ1cy0+cGFyZW50Ow0KPiAtCQkJCWVsc2UNCj4gLQkJ
CQkJZ290byByb290X2J1czsNCj4gLQkJCX0NCj4gLQ0KPiAtCQkJaWYgKHBjaV9hY3NfcGF0aF9l
bmFibGVkKGJ1cy0+c2VsZiwgTlVMTCwNCj4gUkVRX0FDU19GTEFHUykpDQo+IC0JCQkJYnJlYWs7
DQo+IC0NCj4gLQkJCXN3YXBfcGNpX3JlZigmZG1hX3BkZXYsIHBjaV9kZXZfZ2V0KGJ1cy0+c2Vs
ZikpOw0KPiAtCQl9DQo+ICsJCWdyb3VwID0gaW9tbXVfZ3JvdXBfZ2V0X2Zvcl9kZXYoJnBkZXYt
PmRldik7DQo+IA0KPiAtcm9vdF9idXM6DQo+IC0JCWdyb3VwID0gZ2V0X2RldmljZV9pb21tdV9n
cm91cCgmZG1hX3BkZXYtPmRldik7DQo+IC0JCXBjaV9kZXZfcHV0KGRtYV9wZGV2KTsNCj4gIAkJ
LyoNCj4gIAkJICogUENJZSBjb250cm9sbGVyIGlzIG5vdCBhIHBhcml0aW9uYWJsZSBlbnRpdHkN
Cj4gIAkJICogZnJlZSB0aGUgY29udHJvbGxlciBkZXZpY2UgaW9tbXVfZ3JvdXAuDQpBY2tub3ds
ZWRnZWQtYnk6IFZhcnVuIFNldGhpIDx2YXJ1bi5zZXRoaUBmcmVlc2NhbGUuY29tPg0K
--
To unsubscribe from this list: send the line "unsubscribe linux-pci" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/iommu/fsl_pamu_domain.c b/drivers/iommu/fsl_pamu_domain.c
index 93072ba..d02d668 100644
--- a/drivers/iommu/fsl_pamu_domain.c
+++ b/drivers/iommu/fsl_pamu_domain.c
@@ -38,7 +38,6 @@ 
 #include <sysdev/fsl_pci.h>
 
 #include "fsl_pamu_domain.h"
-#include "pci.h"
 
 /*
  * Global spinlock that needs to be held while
@@ -892,8 +891,6 @@  static int fsl_pamu_get_domain_attr(struct iommu_domain *domain,
 	return ret;
 }
 
-#define REQ_ACS_FLAGS	(PCI_ACS_SV | PCI_ACS_RR | PCI_ACS_CR | PCI_ACS_UF)
-
 static struct iommu_group *get_device_iommu_group(struct device *dev)
 {
 	struct iommu_group *group;
@@ -950,74 +947,13 @@  static struct iommu_group *get_pci_device_group(struct pci_dev *pdev)
 	struct pci_controller *pci_ctl;
 	bool pci_endpt_partioning;
 	struct iommu_group *group = NULL;
-	struct pci_dev *bridge, *dma_pdev = NULL;
 
 	pci_ctl = pci_bus_to_host(pdev->bus);
 	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);
 
-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.