From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932304AbcDAF3N (ORCPT ); Fri, 1 Apr 2016 01:29:13 -0400 Received: from mail-bn1on0066.outbound.protection.outlook.com ([157.56.110.66]:2593 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S932166AbcDAF3G (ORCPT ); Fri, 1 Apr 2016 01:29:06 -0400 Authentication-Results: spf=none (sender IP is 165.204.84.222) 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: 0O4XWK9-08-O48-02 X-M-MSG: From: Wan Zongshun To: Joerg Roedel , CC: Suravee Suthikulpanit , Borislav Petkov , Ray Huang , , , , Wan Zongshun Subject: [PATCH V3 7/9] iommu/amd: Add iommu support for ACPI HID devices Date: Fri, 1 Apr 2016 09:06:03 -0400 Message-ID: <1459515965-2865-8-git-send-email-vincent.wan@amd.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1459515965-2865-1-git-send-email-vincent.wan@amd.com> References: <1459515965-2865-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.222;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(2980300002)(428002)(199003)(189002)(50466002)(48376002)(87936001)(86362001)(36756003)(53416004)(33646002)(19580395003)(5008740100001)(101416001)(1096002)(19580405001)(92566002)(5003600100002)(586003)(76176999)(1220700001)(5003940100001)(2950100001)(50986999)(11100500001)(50226001)(77096005)(5001770100001)(106466001)(4326007)(229853001)(105586002)(5890100001)(2906002)(189998001)(81166005)(47776003)(217873001);DIR:OUT;SFP:1101;SCL:1;SRVR:BY2PR1201MB1080;H:atltwp02.amd.com;FPR:;SPF:None;MLV:sfv;A:1;MX:1;LANG:en; X-MS-Office365-Filtering-Correlation-Id: 20e8bacd-3eb3-4d99-3336-08d359ee8966 X-Microsoft-Exchange-Diagnostics: 1;BY2PR1201MB1080;2:E+oQFIjrY/fzZH0LweH0ODvGBvESxyA8V2MSsTzRr4DEBVRXaaEDF7aEiDja/VvA0OWjZVn460mV4rO8RnksbHlJ/a3ZN127EO7KOwrfs+xeujDcG8DV5xhu7Fo/bJe1EVgaMfG6vQHNxZvLuKOpzJJvDcmmbparyL68WxRRfCUoRd+5EPHIgtE8I8eieeHu;3:/mkLiroxWjKmY72R0ve4QyE0C+LgchuSocaFqBcbBKagyO+Jz8mdd82UhtMkGkXNjAa1bUq9cqozczzOLvePTeRJ234Q/TmDpuU+FL6Jm3A9K/1VF2/Gz50Y3vFKKQSNpXGnwh9IS/eEWI8xCcrcPUxmaj352qTCTVdLYh2838eirGOmWNv55vs3wuAGZtmnslzAxmeP7Z2kg2BtwmtA6M1dsj+Tjkud/of0bVelwKI= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BY2PR1201MB1080; X-Microsoft-Exchange-Diagnostics: 1;BY2PR1201MB1080;25:KzqUxUdgM5IhyvyTc/pox0K0MYA/O6SRzlamqZfJSENlqEUFZGVT3a6sH4VxE5dw4o3b+3QSl4UQnVvevKNKEqcAxJ2TSmobU/mLA0i8suq/R66myJU3ajp34UTCx9WHQkn+fEjY/1ntz/neAKifuyG86+4QBd4C2eiB2ph1SB/ppmK6Z9NpqXjExRt+jMGKqlgJHch4L6lFmMEqitATBf45L7WQ2Ci0eoeW35/9x1g9z4+S3Mlu2+/QwTYreGfvzAuOA7TeeFydrWHCFOylWy/r/cUXP+eEPcPpWCbluMVWoB6GQ0+OrILqJ131uymfY1kp445VqAqOMIOU2YI/fpuVxC/ZlMbJ5VAhjWMdRUdZOUXTi3iG9vsdB+DrX6cIZ59hVJ9AmjaIXUiztTEjLC0c/mkdNTNVNb+EZ8rmqHH1pRE0dIlc5TBCWbZP+IbIChfZDgLGsGnVUt96aP7TbB1u0pu/7pPH9fRDszbKVJJHNRdhZgmPR/IYw3qmhYKQU06nNwhrtBo0wl3NZ9SF8xeTSm2OLpugbXp3Xzw8pAYbDV7Nornby6a/u7yT/zLwfSbSQPdDKoviP5oJx0zqMtwGIV0OorapGNvir3mOUpp7r3mUS2Cti3d8PNUE2mfxr94nRijm1kqXCwtMTX45XA== X-Microsoft-Exchange-Diagnostics: 1;BY2PR1201MB1080;20:CpoujF72H5TxxlNVpbKn0RFtHsd3Hne0HmgbOI0M6WR6pCGhFajt2BCxStDDh1vSGQyVsz2JG/CDquK5eg0GvBf8auCEl2fUZTBmwsYiye7kJJIKgTqGVKvemjRCdefBhLTH/XcVvdOYjfgFsJPcDZMlUrVf87OqPDYWkGfqOmCZJtem+rrwLkz3lpIeTA27M4hKB6zchvCLMg+PRzsb2FM0esrUCtdMNMO8RQ41td+R+L1ojCU6EaOql/o4Da4R7CZoWFmDz7NKkG4v6/67Jk9QGgPpXRAGqbdR+gxO6QMK9PcZKFMQLv0cOsxuqwQei+YbBNPE+I/fjkNwW6NilecMNcDE+oHpwtwL8YSfqOsORhIPiujJ4XSdgWeYdbh0/UrC/0GnVn/U/eoq3XmE//GldDqysIu2fqbqu+Lnww4y7wV7wPEecF4y6imJekW+CPKH8x7LciKDVpzaJHCEo1AmdrnqenTJsZlxb8piURoy1EQBkiCpq8aaURoZnRhZ X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(5005006)(13018025)(13024025)(13015025)(8121501046)(13017025)(13023025)(10201501046)(3002001);SRVR:BY2PR1201MB1080;BCL:0;PCL:0;RULEID:;SRVR:BY2PR1201MB1080; X-Microsoft-Exchange-Diagnostics: 1;BY2PR1201MB1080;4:cZas2c7xTnZhPooAnPSG/n88mghffmTEBUlZTmt1GqULlogxRollxGQ2SgTZylrcn/JTFSO3kITP8/cuOA/Vp6aZLXRcjfSaiTbe1GpW+BhePt7gFh6C+IlY3JP9nprkwF9Kr0ybigKr72f20n/C//9amVAvcJPEQdm8yUYSRJN+7VHR6vGWy5dMzw/RMfSIQCH5T47CgbLshutoWrD79JApKJjfO82+735htU3bQ353iRr3WyefnCLIDmDfbOc4ncy45fdVpopGm8Iyx3WT4Zq281xAmZH4wBiUE/LMk94XJvyt8uZdtFfFbAMs0O0W2zUQ4i8gAOQU47JFkF8SJzlilccvU+Cw5maMGge14W8hZI+Ep6UJO5k8RO0u2kkuBe1oSdCgaPz929dF2Mnd/T9WAGs8pPWs1vFWbyfwQQpKxVsqdDCdjMrQsQJw1Yehy22s2yIHGB5h1zLlPaZ7YA== X-Forefront-PRVS: 0899B47777 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BY2PR1201MB1080;23:m69Q7t2Ilwugj+icjvvULn+oYgVJaHG+8sXxOvF?= =?us-ascii?Q?yko74ddj9u/73bE9GgcmZ+QX8N2rFwMf2vYB8pu/T9GFp5XrdA3Xi7mccKVQ?= =?us-ascii?Q?xxfX2Hun+SjjhPaPrkE62pnb5B+Klr5DbpV5wpTnO/OVpRbKExsLgeeJvQ+H?= =?us-ascii?Q?vXC7kpsZbj9r57ZN+zcQoPxer/oPq/X0dXqWCbO7p8HXL88awVxrvk/ExI4b?= =?us-ascii?Q?CU6CEzvgLhv5cqGGgn8Cre65riP2PsKMWu2FlGTJNRbZ6WmR/kgyeFULBNI3?= =?us-ascii?Q?mQaChv4WtgYIWv7FzOU3DFAwqWrjzhY8AgytvhisITSq51AuDNdOWrBPBwqv?= =?us-ascii?Q?NYdEiovWzjWUedTbvsoTrENi/vb9B72dR6ExevXju/iNRv6cL0vWpOMx+iGk?= =?us-ascii?Q?YJE7FwGn2PmenyS4CQodkQrgdq3eFxAtMWmkITGGIucOeeKb1JSsG/ANwiAZ?= =?us-ascii?Q?OIDVGV/lb4C8DbwnYcDG8vG76ZkhyMxJp47gHUJ8cCNcL0KO3N358yANA+iB?= =?us-ascii?Q?sTAJ4iw/sb4oPPPXrd4piDq+3kz0ESOfu7f6bbcd5HYVh4isT4lbIBRTHvRu?= =?us-ascii?Q?cInlEU6+yBA53Vx2+QMNFwCYu0+Tg6Raq4bw3RRRvXCp3xWodMVwj0Cac/ZV?= =?us-ascii?Q?rtpmso54NhzPjExaEARdToPvvt4/Ds5qKu2xSbr59DSuKkYI9ooiW6OD2/g+?= =?us-ascii?Q?GxxNzFQwP6Lr34qVQS62b7EkbweZetyBHFNHB0jZVriCKOEs6FpsoxDl2yeP?= =?us-ascii?Q?ZgU3zk8ovEpibbRUXGnNhuKVDVa0hwNkXA0UuTGl9N5wBnVeufneHIvF7xSZ?= =?us-ascii?Q?Sq6ifWtRL3uQwqslsEc+iC8talOYG7z2d70ft8cXj3j2xNlZY892dEutcUbv?= =?us-ascii?Q?g8a/u9uAOpCUXeeEEmHV5VUjxuLOJIBykHGumj5rkiNToJ37HQRbfIsCS5/S?= =?us-ascii?Q?HAW5y3vOpDujSzxQm0aUlnGs9VqRU0QC6jjjTgS/V1e008uNSQUHOf3nsIC1?= =?us-ascii?Q?gQywkJ+xpbvFQoQGXBOtjeVOLU7iYVOg20gHEEAf8A+rl4TmgEMIJ1GzCkcf?= =?us-ascii?Q?TXqfsCKo=3D?= X-Microsoft-Exchange-Diagnostics: 1;BY2PR1201MB1080;5:d1tsFJ86tayAq0Vqu6820XTHVLN90acDcbZIBECHmqEDsYKLMSWR02T3megJDZX7zg3pkNRy+drKafpdXHCxt5+f/0WgV5K6gKxoHfq/VOULRGw9H2sJulg/shVF8gjC/GrsP+jT2iUgsWu2j8Ez6A==;24:afuY953iYpqz+RX37qn2b414bB2Ab7xa1SR+ujCjfC/QA/tHUu1XY0l4Kc7mymseyERm6+gIIrvrhM4Bxd6erl7dbmRONi/kz1bt9Y6r5WY=;20:QHmKXovyPusKvTOlzmbECa4wfZmrUH708JQHZqnsQULRyEbKedihTqB97Xylfoeyu8KjMmND9JRhYATKAlykFLGrvj4YlP1UOWLBgBgvR00ZL4SUITnLQ347xp4ToPE9HSvYkLbj0H6jl7jJBqrmys9x5iJNb4PGXfUmr6Mg1SH6Hf++7+Ks3lbLwfUQdBahj6OkITL+EzDl5vuj/B3xYuIsdw1RNVYMOQRZcnImJNGqroYfGrizhsNTAU4x5nfH SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Apr 2016 05:29:02.3980 (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.222];Helo=[atltwp02.amd.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY2PR1201MB1080 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 400867f..0df651a3 100644 --- a/drivers/iommu/amd_iommu.c +++ b/drivers/iommu/amd_iommu.c @@ -19,6 +19,7 @@ #include #include +#include #include #include #include @@ -216,13 +217,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; @@ -303,10 +351,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; @@ -344,7 +388,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; @@ -359,10 +402,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; } @@ -2239,13 +2282,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; @@ -2264,6 +2311,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); @@ -2320,6 +2368,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 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Wan Zongshun Subject: [PATCH V3 7/9] iommu/amd: Add iommu support for ACPI HID devices Date: Fri, 1 Apr 2016 09:06:03 -0400 Message-ID: <1459515965-2865-8-git-send-email-vincent.wan@amd.com> References: <1459515965-2865-1-git-send-email-vincent.wan@amd.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1459515965-2865-1-git-send-email-vincent.wan-5C7GfCeVMHo@public.gmane.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: iommu-bounces-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org Errors-To: iommu-bounces-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org To: Joerg Roedel , iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org Cc: linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Wan Zongshun , Ray Huang , Borislav Petkov List-Id: iommu@lists.linux-foundation.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 400867f..0df651a3 100644 --- a/drivers/iommu/amd_iommu.c +++ b/drivers/iommu/amd_iommu.c @@ -19,6 +19,7 @@ #include #include +#include #include #include #include @@ -216,13 +217,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; @@ -303,10 +351,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; @@ -344,7 +388,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; @@ -359,10 +402,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; } @@ -2239,13 +2282,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; @@ -2264,6 +2311,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); @@ -2320,6 +2368,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