From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S966623AbcAZPh6 (ORCPT ); Tue, 26 Jan 2016 10:37:58 -0500 Received: from mail-bn1bon0089.outbound.protection.outlook.com ([157.56.111.89]:42330 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S966578AbcAZPhd (ORCPT ); Tue, 26 Jan 2016 10:37:33 -0500 Authentication-Results: spf=none (sender IP is 165.204.84.221) smtp.mailfrom=amd.com; 8bytes.org; dkim=none (message not signed) header.d=none;8bytes.org; dmarc=permerror action=none header.from=amd.com; X-WSS-ID: 0O1KGQF-07-8UE-02 X-M-MSG: From: Wan Zongshun To: Joerg Roedel , CC: Suravee Suthikulpanit , Borislav Petkov , Ray Huang , , , , , "Wan Zongshun" Subject: [PATCH V2 6/8] iommu/amd: Add iommu support for ACPI HID devices Date: Tue, 26 Jan 2016 18:14:35 -0500 Message-ID: <1453850077-2539-7-git-send-email-vincent.wan@amd.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1453850077-2539-1-git-send-email-vincent.wan@amd.com> References: <1453850077-2539-1-git-send-email-vincent.wan@amd.com> MIME-Version: 1.0 Content-Type: text/plain X-EOPAttributedMessage: 0 X-Forefront-Antispam-Report: CIP:165.204.84.221;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(2980300002)(428002)(189002)(199003)(4326007)(2906002)(53416004)(50466002)(87936001)(19580405001)(92566002)(33646002)(5890100001)(86362001)(36756003)(5003940100001)(50226001)(77096005)(1096002)(1220700001)(11100500001)(229853001)(48376002)(2950100001)(106466001)(97736004)(76176999)(5001770100001)(19580395003)(189998001)(5008740100001)(50986999)(105586002)(586003)(101416001)(5003600100002)(47776003)(217873001);DIR:OUT;SFP:1101;SCL:1;SRVR:CY1PR12MB0856;H:atltwp01.amd.com;FPR:;SPF:None;PTR:InfoDomainNonexistent;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;CY1PR12MB0856;2:aveCH00cVBZMMTiNAdn4D1dkueGhhsWw6u5iv+ZmlYm5oT49T1PQIMK+171BlXbm09oelDX7dJN+KsgsHFlQIJD1oeGG+18WxiL2nvs0A3QIGEgas+F5L4p5EgTn2zH8Z+RmWSFV4agK+wUk1uMLMw==;3:L9rrsScTILq2F8bin2Rk/17ceiUhJbvVarxmBYh+UH9NrreRoDeqPaYac6Bdz4VogaC1b50gYddl5ltpuSJUdeqzI9X7W7vD/tWg2SUGXZCYzOvpM0XmS8s6iLAyRVlNjXMsipwM413Bzkdzgr0WTLphs1ABw4fAsod1Yfajmy4hivGhnWv6ndHsMcsvDMHewIDfietHgD78O68EzXEbUQ6UafaXiSFsL6vKPWFgeXk=;25:DZWef2eY4AND6ZiPL5/DKEXRncJ810gkIW1jpzVNxmDfMPlCNp3rXk+thk6Yboo8rRqxLyYGdxL3z2YLPOIVdyYPqYfRXBwBh+4jNRHVwO1OUzDgEQSgNfakpRFY/3EjTQVB5cT4EIRNBE9ua9kwgi+zl4kMF3UcuexrL+DdXkXjOxXI3wB3VZm0Bj4jE7OjlZAc0uAn7bFMwwm8KyTKQaoVBl5jaXJKhBU1pZwWyxuEYX6aGZg4WTbvhw108adu X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY1PR12MB0856; X-MS-Office365-Filtering-Correlation-Id: fec6d935-7340-482f-8d29-08d326669a25 X-Microsoft-Exchange-Diagnostics: 1;CY1PR12MB0856;20:EcTj2kWs67ACCoh8oQPp69Ir6Zlh2BbypTEpkA+dKK49pIvaoGCVzm+dug4h69Kr3BRAOj4ttkoewDHiJ0+CM+EBvQuUsiKls/jvlzJp3BRMK7HPmZ7AUNFpUjzTlhJkmz86mlHCWNLqAVJXVlMwyBq/IRNwh99TOHMsW+ATgDHc63WZEaIL6axxbfHQH/OkIlKaVj5FtvnCEEEGt9UmwlEEKNwIq55hQJon3UQiQVSV3I8CIchMwtEPfP7Kv5kYeh4Idlc9VeBfua0Mrf1TGpR8jJ0cI6eu3ZtezgeiXG45jTpIhaPut0osn+QAQCFYT1u3ArJNhfHAqMaI/rn1GC1oy1J4U1GgaQoaNB0qgu6EjesEEhsSxtAREzTm9UX479iYxlL8KQJ+QspviLW/W6vUfA4Isu/eygofk2QBtrgGQkwH6ou1HGvfsuS+UCiQYgTYk4zr4VBV6ToL0gKPHHK9z3XZZP+4WftvTaxh3GTBE/W5UyXRwq9aGnG3r91Y X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(767451399110); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(123027)(601004)(2401047)(520078)(5005006)(13015025)(13024025)(13018025)(13017025)(8121501046)(13023025)(10201501046)(3002001);SRVR:CY1PR12MB0856;BCL:0;PCL:0;RULEID:;SRVR:CY1PR12MB0856; X-Microsoft-Exchange-Diagnostics: 1;CY1PR12MB0856;4:uoiwRmXse99MFOlCLVeWrefryYf4JbFChwFRyjP45J88rQVuy/P2Wgbqeh/OLpUq1v+1Bv2G9TFZI8x8EtGOYh2CHGPTpOAwnDEs5PZR0DF7ryarA9H2/8y/uKYoFu0uxw2FWZ4aSi08LPZtb6mc4TQFczZZ3fyhErH/+j+iZWGadyZ/1PD/6UCUQlAarkuE9GZiqqRG/YQ+Z+KzjQW3K/iRw3In0Y4pe7Ccjkuw1SGLCF5gVCS2+LDy7/f7PxGPNXwtedHHIKfL/yY5hs+Bb4QjnOvRvV1flssyeaD5COFSbVv122FPP1o3aJiQIjoSDcsRMcSakmpJ1BZZLSR8NHeCYENYWfRlhvQAgHL+AHkYRmjljyiheUpMdZ5BNQ0YL56GaypJ8vdcdOyVnmPBC9KAFmMV+kIv5lR+9qf9ibakMlw4NoX+0ASp4FKAvnJyFVZhoNAUoo6khp8v2qvk+VUCk/FTkSyzplF3IM2QAixvNHpZ3x+FBs/CynuLlgROrBB5rNxpzumaBAA/TxKrsw== X-Forefront-PRVS: 08331F819E X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;CY1PR12MB0856;23:0Xj0ypXx881OAjYUpnuAFtrf+HG2owPCd4a45xo7F?= =?us-ascii?Q?VjIOVIP+Elfsf6r+MctmKlnIYP0LHt2CRXuU3Nie0r0QiK4AdX0y86MgOcJx?= =?us-ascii?Q?2gt1gZVqNRMPjylZ9yEd6CycNgPAPd0XHzOiUFnEHE7t0WJ78d+YWUrEZfHS?= =?us-ascii?Q?UPtWLIvCq2QQ/hWvsK1H0KxS8UXo6Z7ijdmhPo9WIM6Mw3mSARAu1B3Fx66H?= =?us-ascii?Q?fVABfUrsfiQcNxzZ1vaXNx249oaRO1r7bdq/WffK8VKTUiCOqOODGB4rbejz?= =?us-ascii?Q?OYeZ5M7hMvEWLH0L7YLkeajOsXJAUk0HrVYpshS0TM+qstqDuCa9L4ZH5fLK?= =?us-ascii?Q?DMDm7njBgC561Dh5XYcTxwvozu4A4Lh3zcBwDmxFMzSKyk+Sl2VMqxhm5IvB?= =?us-ascii?Q?vDzwPX//OMgV2qyahibOd4sci9G8sAkFCg9HS0ivD618yQWBisHqCAmlgaya?= =?us-ascii?Q?NDTNtApMTxTxueV680GBX3eqEcZDE14tIjOk6gfV9OFiDduihcvOzIFF+5IU?= =?us-ascii?Q?b2zX+KEHLkdNuySpnzdi3mWTQXllQaeZTYz9Or95Z2Z//LRUMwb17hkt+RDh?= =?us-ascii?Q?boiKEXK/wn6PUP6wRaEArLCBhWX2lri1KjXt3ih+UvYMKaIyxiAHIfN5Ab2Y?= =?us-ascii?Q?TRHRxA1QgzH5SCMGZmYuzJTU8cRcy5V1RM3yIaGpCzuTmRKC2eJ59GhCh64D?= =?us-ascii?Q?ZWDQfgTrmXe7Czw5gfcPgxVRRD0KQB9p9BkB+/KcDwEvDhXf6tEYN7KTUCfP?= =?us-ascii?Q?HhydNNluydFvjJTtNGefj/xoDTt6/SWs7myumkYsYOxBvg9dN92jtaB+yRUJ?= =?us-ascii?Q?smv4jQA7z9PmQyY9DBFjt8hDZaXmYFEFg+vLnvsBwS2c6dYRJJid0Iu7dOPL?= =?us-ascii?Q?zKUozPnAtfEWkqpzebXFAZvHAvU/bHKOEWG0LogVVqiYjUWm2t1neP2P8Izw?= =?us-ascii?Q?kmtp5FA9+hBLkG6GPlJo28WWbDWWjPFBV3mfFMHau/brH8XZW2SpJDdDL2Qd?= =?us-ascii?Q?Bl9hbg1snBBczHfG37dCe1gM7GGoAggMcvOeXLYf+0IQ1wVh5Q8krnenPYo0?= =?us-ascii?Q?bTbLBw=3D?= X-Microsoft-Exchange-Diagnostics: 1;CY1PR12MB0856;5:8h7SSz5EQRs31y37HxVIPwcL2pfqsxsSpWzOeFnC4/tAMhNyaSYtdeoD7ZEDz3v2M9GBLevBoBxJ6WlviBh9sjOTvGHKKeime95S6mQXkQ4zBNBPHYdV1HzRnI/+Lds/KzhZ5Q5n+gbcD5WaNPc3Aw==;24:hl74KkI6NaUaRoefBWIsBDQt9dopIUaLLjeiKEjCw7UrD61RTumfIRTF5fDoa7gYfCunkUbHHsm1hMTd2s9MtNUana1PSkwnHEKcamjJTdk=;20:5P9GgnTz/86EPoNOZVp6lC8eaNzWy3CVjdNKM9WWRdhwLfbh351MkR7TsOkDxJ/e7Z1s3lY88W3SRa/+YOksTQliZgXTb8FOZLQs0uBUmEjtYtxFbgRnCbDOkPwAc98shmAGL2wKAFLB+3t6W6aweoZgfmKg6KLyp52rlmmO8szNupv2jyHsjdDrQng90uiSPua+6Wxgf58rnHSatClDCg92ytbq6yChIbMMVsKAwkq+80shDoulfKjV6bYOir+A SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Jan 2016 15:37:29.4512 (UTC) X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.221];Helo=[atltwp01.amd.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR12MB0856 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Wan Zongshun Current IOMMU driver make assumption that the downstream devices are PCI. With the newly added ACPI-HID IVHD device entry support, this is no longer true. This patch is to add dev type check and to distinguish the pci and acpihid device code path. Signed-off-by: Wan Zongshun Signed-off-by: Suravee Suthikulpanit --- drivers/iommu/amd_iommu.c | 69 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 60 insertions(+), 9 deletions(-) diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c index 10d6623..4857d66 100644 --- a/drivers/iommu/amd_iommu.c +++ b/drivers/iommu/amd_iommu.c @@ -19,6 +19,7 @@ #include #include +#include #include #include #include @@ -215,13 +216,60 @@ static struct iommu_dev_data *find_dev_data(u16 devid) return dev_data; } -static inline u16 get_device_id(struct device *dev) +static inline int match_hid_uid(struct device *dev, + struct acpihid_map_entry *entry) +{ + const char *hid, *uid; + + hid = acpi_device_hid(ACPI_COMPANION(dev)); + uid = acpi_device_uid(ACPI_COMPANION(dev)); + + if (!hid || !(*hid)) + return -ENODEV; + + if (!uid || !(*uid)) + return strcmp(hid, entry->hid); + + if (!(*entry->uid)) + return strcmp(hid, entry->hid); + + return (strcmp(hid, entry->hid) || strcmp(uid, entry->uid)); +} + +static inline u16 get_pci_device_id(struct device *dev) { struct pci_dev *pdev = to_pci_dev(dev); return PCI_DEVID(pdev->bus->number, pdev->devfn); } +static inline int get_acpihid_device_id(struct device *dev, + struct acpihid_map_entry **entry) +{ + struct acpihid_map_entry *p; + + list_for_each_entry(p, &acpihid_map, list) { + if (!match_hid_uid(dev, p)) { + if (entry) + *entry = p; + return p->devid; + } + } + return -EINVAL; +} + +static inline int get_device_id(struct device *dev) +{ + int devid; + + if (dev_is_pci(dev)) + devid = get_pci_device_id(dev); + else + devid = get_acpihid_device_id(dev, NULL); + + return devid; +} + static struct iommu_dev_data *get_dev_data(struct device *dev) { return dev->archdata.iommu; @@ -302,10 +350,6 @@ static bool check_device(struct device *dev) if (!dev || !dev->dma_mask) return false; - /* No PCI device */ - if (!dev_is_pci(dev)) - return false; - devid = get_device_id(dev); if (IS_ERR_VALUE(devid)) return false; @@ -343,7 +387,6 @@ out: static int iommu_init_device(struct device *dev) { - struct pci_dev *pdev = to_pci_dev(dev); struct iommu_dev_data *dev_data; int devid; @@ -358,10 +401,10 @@ static int iommu_init_device(struct device *dev) if (!dev_data) return -ENOMEM; - if (pci_iommuv2_capable(pdev)) { + if (dev_is_pci(dev) && pci_iommuv2_capable(to_pci_dev(dev))) { struct amd_iommu *iommu; - iommu = amd_iommu_rlookup_table[dev_data->devid]; + iommu = amd_iommu_rlookup_table[dev_data->devid]; dev_data->iommu_v2 = iommu->is_iommu_v2; } @@ -2235,13 +2278,17 @@ static bool pci_pri_tlp_required(struct pci_dev *pdev) static int attach_device(struct device *dev, struct protection_domain *domain) { - struct pci_dev *pdev = to_pci_dev(dev); + struct pci_dev *pdev; struct iommu_dev_data *dev_data; unsigned long flags; int ret; dev_data = get_dev_data(dev); + if (!dev_is_pci(dev)) + goto skip_ats_check; + + pdev = to_pci_dev(dev); if (domain->flags & PD_IOMMUV2_MASK) { if (!dev_data->passthrough) return -EINVAL; @@ -2260,6 +2307,7 @@ static int attach_device(struct device *dev, dev_data->ats.qdep = pci_ats_queue_depth(pdev); } +skip_ats_check: write_lock_irqsave(&amd_iommu_devtable_lock, flags); ret = __attach_device(dev_data, domain); write_unlock_irqrestore(&amd_iommu_devtable_lock, flags); @@ -2316,6 +2364,9 @@ static void detach_device(struct device *dev) __detach_device(dev_data); write_unlock_irqrestore(&amd_iommu_devtable_lock, flags); + if (!dev_is_pci(dev)) + return; + if (domain->flags & PD_IOMMUV2_MASK && dev_data->iommu_v2) pdev_iommuv2_disable(to_pci_dev(dev)); else if (dev_data->ats.enabled) -- 1.9.1