From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754100AbcAEC3b (ORCPT ); Mon, 4 Jan 2016 21:29:31 -0500 Received: from mail-by2on0090.outbound.protection.outlook.com ([207.46.100.90]:14418 "EHLO na01-by2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1754047AbcAEC3Q (ORCPT ); Mon, 4 Jan 2016 21:29:16 -0500 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: 0O0GK8L-08-CZZ-02 X-M-MSG: From: Wan Zongshun To: Joerg Roedel , CC: Suravee Suthikulpanit , Borislav Petkov , Ray Huang , , , Wan Zongshun Subject: [PATCH 5/6] iommu/amd: Add support for non-pci devices Date: Tue, 5 Jan 2016 05:07:23 -0500 Message-ID: <1451988444-4694-6-git-send-email-vincent.wan@amd.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1451988444-4694-1-git-send-email-vincent.wan@amd.com> References: <1451988444-4694-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;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(2980300002)(428002)(199003)(189002)(48376002)(106466001)(36756003)(50466002)(97736004)(1220700001)(92566002)(50986999)(86362001)(87936001)(2950100001)(50226001)(5008740100001)(5001770100001)(5890100001)(76176999)(4326007)(189998001)(77096005)(5003940100001)(229853001)(5003600100002)(47776003)(101416001)(1096002)(33646002)(53416004)(19580405001)(11100500001)(105586002)(586003)(19580395003);DIR:OUT;SFP:1101;SCL:1;SRVR:SN1PR12MB0861;H:atltwp02.amd.com;FPR:;SPF:None;PTR:InfoDomainNonexistent;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0861;2:FwW33rbgTYpXxyit4iPd1aSwmCLzxCswDv9VzqE9pFY4F2ri6E413S4xQv9FXveCXsYzvdSmt/G/c0bIYw86GGQbSWEAPDjTlkl2HP2UpfYOeppWFqJ0ajAslKFN5aKUDYd3xq1gYQfXGHjWA/dkoA==;3:c8k2iW87kl8DkdytYa0wZA0GfhPO3DtCG3940+BUHSi0uKDjkpwrQ9LlS/vdGuf2Xc7RH/xgaJeDDsKwCzDsRbddvZwijLDT9XStfIhKaZWK6nK9NS8Phd4+5zdCSCpeaqfwVzw1x6NivUCvzzKYL8aqPSo4PF5ybIp0KyInLZP6dd8BemyB4DFi3QD2qFuXxlHWkiJFIWbp19xWHGc3lTuSNFCJcp6DLHBx+zqTRVQ=;25:EEVGGebaprrvXKJIKYcHWPAfmJ8g2aynHNxiNFFNETTFkA8WHxWc6kNd2KR/yDGZ6vtWT/oZKOZnRo6c/miiSmtxkgeM99fBO1tlU0UPTOhO5BWEujsOdmRO1YYjyETxmBWDOuDZXubRI9lGhpbeyxVlIhou8C2849RlY9AE8u16G1960QDAa2gjw80X2NzzzYZr7MagdkxYOmP1Tn6UQ9IPJC370ihAbnhBuzDex+GRiUJB7O00kl5ONG23XN+x X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:SN1PR12MB0861; X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0861;20:jOZC8Z7wTGrkWi48HsZaI5afb4XFTZR78pIe0Nr+KRYV7yUJdqakO/UqFWp6uSuZeZrlfmTgL9tlZYUxfQEgvESRna89I6xHZMFigYVuxXrEAIK8bQZ90Uith8tsIsSYnItONYKg5DmK54O+Ubtc182Yjvg8RN4qpAbtg7gqPqUwtu3qf76++c76gi5S6JzsQQT+fIRFrWLKUSJWXclZ3lpSq96vuiggFk5VQozqK43ySPQVpikI0Z6beQ2x4J0LMkwjpmtx3S/WtqE7NZOaXsxBjEGK4/OcwBk44tVpQvZAnpK0azFjFvJBZWvODxDWZOiJFlSwrDnwalr8HD+3ZRwS0lG/BYSAan28fPnjc+Wp/0cTxWUvieum97mkdeYL6kZx6LJrL43n1gZlSpbFw8hJ6M6bnIP9RdfujdBzouigQjl225oXT6PPAtcYZUu5I7IZtzpVIoa8rUlG/+XEo/kBoNN6JFe95TvHJyoNOrB2nzQ9nt4HWreZsaba7rdC;4:1aK88wIKLFy/iFhFj6XKT4xrdQreYZUdL+y3Tjxa7Qw6bPlb8Ydo+4CCJHHxkgkKExxMcSVDC8drOq2e6N3qGG/mIyz5I8QGglqMBPNm6SUOkBs7lN/mhmkjKWN7wqA5BmnsswwWeAnGxVA0kO1qXT+7wp+kFMXn3Qo9/9bECMuMwLyEfx/+M2OWPkY2aP1QZ4l/WDJQE+pz80vSOe3e3wf76lhg4mgBtwU0wco0XqbEUAWf4uIsreN17lEfjCRINiuXleH3UMOTZpgAaOE0vn85CFbJ3DqKrCqt2MqmSv5zjgFrtdwZfIjhYIYmisGhdY70AWH6RNxczt9TYZosdEApHW4YJdp1fNwEeIHC46VLs50RQX9NZ6MxpRJpXUAUdb/2UO79FGUNSP03H99Uj70uvg+rQNrIFKhjnOVr5aM= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(767451399110); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(520078)(5005006)(8121501046)(10201501046)(3002001);SRVR:SN1PR12MB0861;BCL:0;PCL:0;RULEID:;SRVR:SN1PR12MB0861; X-Forefront-PRVS: 0812095267 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;SN1PR12MB0861;23:V3+3WoR14YYNhaJfimj0XI4oUl1WZFN4dctH8PW5b?= =?us-ascii?Q?9/SnCAPIXmHVkSRF3q4AN0bSmBPxwkUpKF8XgFFhlhV4X68lnoEv9+/SfOzX?= =?us-ascii?Q?AFyF2VrmtEp/gDHzYelwh8ZI0epeXSW83cnUZ0cK9USoVVmKXocoDlPHMHx8?= =?us-ascii?Q?9fuRDjAhbjFgyJgU6NhkNkus+hi0mYucdcEtK9GcANFVG4LE/2UA5Fz9mlLy?= =?us-ascii?Q?3ElMvWOIihPirhwmcKyi1pbuWOxiD5uWgc+apQID9XjJy2I9xjeCteHWdYkn?= =?us-ascii?Q?IZMsRNCzEAUHy5QIyjGRCTE2n6o5YpjlVfj9+y9LhSYV0pWatZJf42afx9z1?= =?us-ascii?Q?U9Ey389ns8YHaxcIh35N1zHJ8ouD+W9hyQFKzyw5sv3zsqVQzMMV7rkSl+Gm?= =?us-ascii?Q?OOuEEobglBBci3YmWuoECKRWUgZdiec5gj1hBsTBLluqQrykYOr5Mi6CWiB9?= =?us-ascii?Q?jCmJKfcOH1QPZ1++NOD+3L/WOXZOM/dPJq6pNambsnCRk8pok+nRsZe/GkNr?= =?us-ascii?Q?CywpEgWKoXx56XbSC9qtwTJz1fmb8y3y23J9YU8bGy/4jOrJ3HFAAGzJOdVr?= =?us-ascii?Q?HfLNyCB5KOMqGwroe1jUepCyynr0WU4LH/KooaoUeYPL4u7WX66HLtdWrFH4?= =?us-ascii?Q?8bkjOmLZ6vOEXu/rK4Lu30hwqCkGwfcm0MgHUzBlQ/UhH6JfP672m+XcFMBo?= =?us-ascii?Q?ezra/Qa4nEHKk+C97c5AQBv8CWZiGJcysvX+K3x2SlLm9uolDNW/dwy0oI5w?= =?us-ascii?Q?84hjbvsC62Q5m5sMRSZuXri7LAKlBRQK8ftD3SWLu//+g+4/gbLIR/27h5RI?= =?us-ascii?Q?DiluaGYHzbetjCwOH3FXz2xtXCOqqd3ktWVsRPIO8DBEzfRMoLB3HCZNaIDP?= =?us-ascii?Q?1eOpVyBuN2qOTUIowQ7BuTJ512kC1OLaS2L13EEaWH8Uk9xhrGVd9SMuYzOZ?= =?us-ascii?Q?lb76RtnmjsiiwQvUsxNhoG5nLA0YJMuMKtwmcauKng+Ilz0LuCxXdffpbGTk?= =?us-ascii?Q?27NeVgvlIctXMUGldDjfmQq?= X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0861;5:PaF7pE7HB5Ed37YaP7xnCu3sjbNNHXXJQHJ1vOA5e+5q2mr6V70OdGNmP/uzZliohRaPpKsRmEbpmvu67ouvX2ntoc/G1Mz3Q/VIxsfEYmT2LfKZcnDbPecTIg6wUiPll5qq7QfxdZp4UAl1wxX8rQ==;24:b9RTMwvtiF+s8xDti6twgXMKqlaXL0DjOw+N252iDTma5xuC5KmBB4lyovLacM9f/QjeGMlc6GzOIoRAE7Gm3QcB8XohLyctKJ0O2dBaUV8=;20:huJ7Z+/P3zQKgs9A+64LVNffGpoGgQRjz8JA46/ivKci6SxQKkaecrv/V/imEk7MO8eOgJSQcjtGovdAH3yzSKqApnjofLlrdQIgOqGyVbA1C6A23HwHq0f/Zez0fbn6bTd8EgbXhgcrmmRtOsDQkFMbPwP2tkFHfU7cuVMZFG5z0R2+tzNnaJB57Zk8+qMBMxpgirsjJHlXxvFN7uiVrrVIJNWSJtN2sUbElrbnwfHNTWq682/SGV0XnfHEBTvw SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 Jan 2016 02:29:13.4185 (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: SN1PR12MB0861 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 | 124 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 106 insertions(+), 18 deletions(-) diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c index 98acb89..1902d01 100644 --- a/drivers/iommu/amd_iommu.c +++ b/drivers/iommu/amd_iommu.c @@ -19,6 +19,7 @@ #include #include +#include #include #include #include @@ -176,13 +177,56 @@ 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 -ENODEV; +} + +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 u16 get_device_id(struct device *dev) +{ + if (dev_is_pci(dev)) + return get_pci_device_id(dev); + else + return get_acpihid_device_id(dev, NULL); +} + static struct iommu_dev_data *get_dev_data(struct device *dev) { return dev->archdata.iommu; @@ -262,7 +306,7 @@ static bool check_device(struct device *dev) return false; /* No PCI device */ - if (!dev_is_pci(dev)) + if (!dev_is_pci(dev) && (get_acpihid_device_id(dev, NULL) < 0)) return false; devid = get_device_id(dev); @@ -298,7 +342,7 @@ out: iommu_group_put(group); } -static int iommu_init_device(struct device *dev) +static int iommu_init_pci_device(struct device *dev) { struct pci_dev *pdev = to_pci_dev(dev); struct iommu_dev_data *dev_data; @@ -325,6 +369,32 @@ static int iommu_init_device(struct device *dev) return 0; } +static int iommu_init_acpihid_device(struct device *dev) +{ + struct iommu_dev_data *dev_data; + + if (dev->archdata.iommu) + return 0; + + dev_data = find_dev_data(get_device_id(dev)); + if (!dev_data) + return -ENOMEM; + + dev->archdata.iommu = dev_data; + + iommu_device_link(amd_iommu_rlookup_table[dev_data->devid]->iommu_dev, + dev); + + return 0; +} + +static int iommu_init_device(struct device *dev) +{ + if (dev_is_pci(dev)) + return iommu_init_pci_device(dev); + return iommu_init_acpihid_device(dev); +} + static void iommu_ignore_device(struct device *dev) { u16 devid, alias; @@ -2066,19 +2136,16 @@ static bool pci_pri_tlp_required(struct pci_dev *pdev) return (status & PCI_PRI_TLP_OFF) ? true : false; } -/* - * If a device is not yet associated with a domain, this function - * assigns it visible for the hardware - */ -static int attach_device(struct device *dev, - struct protection_domain *domain) +static int setup_ats_device(struct device *dev, + struct protection_domain *domain) { - struct pci_dev *pdev = to_pci_dev(dev); - struct iommu_dev_data *dev_data; - unsigned long flags; - int ret; + struct pci_dev *pdev; + struct iommu_dev_data *dev_data = get_dev_data(dev); - dev_data = get_dev_data(dev); + if (!dev_is_pci(dev)) + return 0; + + pdev = to_pci_dev(dev); if (domain->flags & PD_IOMMUV2_MASK) { if (!dev_data->passthrough) @@ -2098,6 +2165,25 @@ static int attach_device(struct device *dev, dev_data->ats.qdep = pci_ats_queue_depth(pdev); } + return 0; +} + +/* + * If a device is not yet associated with a domain, this function + * assigns it visible for the hardware + */ +static int attach_device(struct device *dev, + struct protection_domain *domain) +{ + struct iommu_dev_data *dev_data; + unsigned long flags; + int ret; + + dev_data = get_dev_data(dev); + ret = setup_ats_device(dev, domain); + if (ret) + return ret; + write_lock_irqsave(&amd_iommu_devtable_lock, flags); ret = __attach_device(dev_data, domain); write_unlock_irqrestore(&amd_iommu_devtable_lock, flags); @@ -2154,10 +2240,12 @@ static void detach_device(struct device *dev) __detach_device(dev_data); write_unlock_irqrestore(&amd_iommu_devtable_lock, flags); - if (domain->flags & PD_IOMMUV2_MASK && dev_data->iommu_v2) - pdev_iommuv2_disable(to_pci_dev(dev)); - else if (dev_data->ats.enabled) - pci_disable_ats(to_pci_dev(dev)); + if (dev_is_pci(dev)) { + if (domain->flags & PD_IOMMUV2_MASK && dev_data->iommu_v2) + pdev_iommuv2_disable(to_pci_dev(dev)); + else if (dev_data->ats.enabled) + pci_disable_ats(to_pci_dev(dev)); + } dev_data->ats.enabled = false; } -- 1.9.1 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Wan Zongshun Subject: [PATCH 5/6] iommu/amd: Add support for non-pci devices Date: Tue, 5 Jan 2016 05:07:23 -0500 Message-ID: <1451988444-4694-6-git-send-email-vincent.wan@amd.com> References: <1451988444-4694-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: <1451988444-4694-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 , ken.xue-5C7GfCeVMHo@public.gmane.org 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 | 124 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 106 insertions(+), 18 deletions(-) diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c index 98acb89..1902d01 100644 --- a/drivers/iommu/amd_iommu.c +++ b/drivers/iommu/amd_iommu.c @@ -19,6 +19,7 @@ #include #include +#include #include #include #include @@ -176,13 +177,56 @@ 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 -ENODEV; +} + +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 u16 get_device_id(struct device *dev) +{ + if (dev_is_pci(dev)) + return get_pci_device_id(dev); + else + return get_acpihid_device_id(dev, NULL); +} + static struct iommu_dev_data *get_dev_data(struct device *dev) { return dev->archdata.iommu; @@ -262,7 +306,7 @@ static bool check_device(struct device *dev) return false; /* No PCI device */ - if (!dev_is_pci(dev)) + if (!dev_is_pci(dev) && (get_acpihid_device_id(dev, NULL) < 0)) return false; devid = get_device_id(dev); @@ -298,7 +342,7 @@ out: iommu_group_put(group); } -static int iommu_init_device(struct device *dev) +static int iommu_init_pci_device(struct device *dev) { struct pci_dev *pdev = to_pci_dev(dev); struct iommu_dev_data *dev_data; @@ -325,6 +369,32 @@ static int iommu_init_device(struct device *dev) return 0; } +static int iommu_init_acpihid_device(struct device *dev) +{ + struct iommu_dev_data *dev_data; + + if (dev->archdata.iommu) + return 0; + + dev_data = find_dev_data(get_device_id(dev)); + if (!dev_data) + return -ENOMEM; + + dev->archdata.iommu = dev_data; + + iommu_device_link(amd_iommu_rlookup_table[dev_data->devid]->iommu_dev, + dev); + + return 0; +} + +static int iommu_init_device(struct device *dev) +{ + if (dev_is_pci(dev)) + return iommu_init_pci_device(dev); + return iommu_init_acpihid_device(dev); +} + static void iommu_ignore_device(struct device *dev) { u16 devid, alias; @@ -2066,19 +2136,16 @@ static bool pci_pri_tlp_required(struct pci_dev *pdev) return (status & PCI_PRI_TLP_OFF) ? true : false; } -/* - * If a device is not yet associated with a domain, this function - * assigns it visible for the hardware - */ -static int attach_device(struct device *dev, - struct protection_domain *domain) +static int setup_ats_device(struct device *dev, + struct protection_domain *domain) { - struct pci_dev *pdev = to_pci_dev(dev); - struct iommu_dev_data *dev_data; - unsigned long flags; - int ret; + struct pci_dev *pdev; + struct iommu_dev_data *dev_data = get_dev_data(dev); - dev_data = get_dev_data(dev); + if (!dev_is_pci(dev)) + return 0; + + pdev = to_pci_dev(dev); if (domain->flags & PD_IOMMUV2_MASK) { if (!dev_data->passthrough) @@ -2098,6 +2165,25 @@ static int attach_device(struct device *dev, dev_data->ats.qdep = pci_ats_queue_depth(pdev); } + return 0; +} + +/* + * If a device is not yet associated with a domain, this function + * assigns it visible for the hardware + */ +static int attach_device(struct device *dev, + struct protection_domain *domain) +{ + struct iommu_dev_data *dev_data; + unsigned long flags; + int ret; + + dev_data = get_dev_data(dev); + ret = setup_ats_device(dev, domain); + if (ret) + return ret; + write_lock_irqsave(&amd_iommu_devtable_lock, flags); ret = __attach_device(dev_data, domain); write_unlock_irqrestore(&amd_iommu_devtable_lock, flags); @@ -2154,10 +2240,12 @@ static void detach_device(struct device *dev) __detach_device(dev_data); write_unlock_irqrestore(&amd_iommu_devtable_lock, flags); - if (domain->flags & PD_IOMMUV2_MASK && dev_data->iommu_v2) - pdev_iommuv2_disable(to_pci_dev(dev)); - else if (dev_data->ats.enabled) - pci_disable_ats(to_pci_dev(dev)); + if (dev_is_pci(dev)) { + if (domain->flags & PD_IOMMUV2_MASK && dev_data->iommu_v2) + pdev_iommuv2_disable(to_pci_dev(dev)); + else if (dev_data->ats.enabled) + pci_disable_ats(to_pci_dev(dev)); + } dev_data->ats.enabled = false; } -- 1.9.1