Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp7259245ybl; Mon, 23 Dec 2019 22:24:40 -0800 (PST) X-Google-Smtp-Source: APXvYqzq5uhTYn3LY3tj6QjIv6DGJ5Nuw+sW2/DzVOQGYBNCR010IImxrm6WvbqtEmTSBs5efhCf X-Received: by 2002:a9d:799a:: with SMTP id h26mr35248598otm.240.1577168680758; Mon, 23 Dec 2019 22:24:40 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1577168680; cv=none; d=google.com; s=arc-20160816; b=O6kSjXx4mjXbaTa8BDFpI/Ox9npNzKjYxbNH2Qqp9VqJsLUv3stz6CDD0ho9/GD92i Tp4zcx9rwjk0Se8eiDU6OmVFIMUXRKVDax61is+XEY2wvXMUgMUnJpOE/3Pwwv4eQFIb szr/bCKszegJ12fSKZ16PatAp4oGaI57JfDNLGSyt82ptbRCMGHsv+YpO1MiQDGY2LQN 4pyPKp/MWSjBeC9SXRJgjTX5W18V2YmPnoVQm0+jY16EcZMPM0aY9I41AYHKZLjlq4UG UakvCLoRB5PvHKfB3DJdLhWjmOrDLOAq/uq46gn+f6LdPX1RJPh7LuW00mx1BTELGcOK MWoA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from; bh=0UzsQsGYeSPGyBZJeApzmxzVyJ0uK8i/Fm9QxCYDMN4=; b=O494FGdLbsmSLq/fJ/KPJyUPDMMVFbOpNNZ0csEgacAvMvSxU6GgC5v+bXg/n12Ll9 pnAIDHvvmNvT4L4jGCIsBwY9eYzx83xsLQ6XdEMdKe4FRwKksawrnc1X124q4Cuzb9iq DseZXr+CM5fufrixnqmY9p59eMsRi5zZH+gEtpe/yk5qQccYz16eyTNA0rd7vpV6f1XO LA2Jjbvkrc0bjixScuzLfFA36YG5HuVji39IxIBHr2SQ542aK3WFC48Tc+T/S2zPKRTv 9MSIdS+NUeC8DfoDKK2QMk32FV5vJTBJ/plpdDBzYeXBX6+ataxA6urzXKvs+6DlHtyF 9FqA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id w68si10075362oia.223.2019.12.23.22.24.28; Mon, 23 Dec 2019 22:24:40 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726070AbfLXGXs (ORCPT + 99 others); Tue, 24 Dec 2019 01:23:48 -0500 Received: from mga05.intel.com ([192.55.52.43]:9869 "EHLO mga05.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726009AbfLXGXs (ORCPT ); Tue, 24 Dec 2019 01:23:48 -0500 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by fmsmga105.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 23 Dec 2019 22:23:48 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.69,350,1571727600"; d="scan'208";a="418904083" Received: from allen-box.sh.intel.com ([10.239.159.136]) by fmsmga006.fm.intel.com with ESMTP; 23 Dec 2019 22:23:46 -0800 From: Lu Baolu To: Joerg Roedel Cc: iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org, Lu Baolu , Roland Dreier , Jim Yan Subject: [PATCH 1/1] iommu/vt-d: Add a quirk flag for scope mismatched devices Date: Tue, 24 Dec 2019 14:22:40 +0800 Message-Id: <20191224062240.4796-1-baolu.lu@linux.intel.com> X-Mailer: git-send-email 2.17.1 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org We expect devices with endpoint scope to have normal PCI headers, and devices with bridge scope to have bridge PCI headers. However Some PCI devices may be listed in the DMAR table with bridge scope, even though they have a normal PCI header. Add a quirk flag for those special devices. Cc: Roland Dreier Cc: Jim Yan Signed-off-by: Lu Baolu --- drivers/iommu/dmar.c | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/drivers/iommu/dmar.c b/drivers/iommu/dmar.c index fb30d5053664..fc24abc70a05 100644 --- a/drivers/iommu/dmar.c +++ b/drivers/iommu/dmar.c @@ -65,6 +65,26 @@ static void free_iommu(struct intel_iommu *iommu); extern const struct iommu_ops intel_iommu_ops; +static int scope_mismatch_quirk; +static void quirk_dmar_scope_mismatch(struct pci_dev *dev) +{ + pci_info(dev, "scope mismatch ignored\n"); + scope_mismatch_quirk = 1; +} + +/* + * We expect devices with endpoint scope to have normal PCI + * headers, and devices with bridge scope to have bridge PCI + * headers. However some PCI devices may be listed in the + * DMAR table with bridge scope, even though they have a + * normal PCI header. We don't declare a socpe mismatch for + * below special cases. + */ +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2f0d, /* NTB devices */ + quirk_dmar_scope_mismatch); +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2020, /* NVME host */ + quirk_dmar_scope_mismatch); + static void dmar_register_drhd_unit(struct dmar_drhd_unit *drhd) { /* @@ -231,20 +251,9 @@ int dmar_insert_dev_scope(struct dmar_pci_notify_info *info, if (!dmar_match_pci_path(info, scope->bus, path, level)) continue; - /* - * We expect devices with endpoint scope to have normal PCI - * headers, and devices with bridge scope to have bridge PCI - * headers. However PCI NTB devices may be listed in the - * DMAR table with bridge scope, even though they have a - * normal PCI header. NTB devices are identified by class - * "BRIDGE_OTHER" (0680h) - we don't declare a socpe mismatch - * for this special case. - */ - if ((scope->entry_type == ACPI_DMAR_SCOPE_TYPE_ENDPOINT && - info->dev->hdr_type != PCI_HEADER_TYPE_NORMAL) || - (scope->entry_type == ACPI_DMAR_SCOPE_TYPE_BRIDGE && - (info->dev->hdr_type == PCI_HEADER_TYPE_NORMAL && - info->dev->class >> 8 != PCI_CLASS_BRIDGE_OTHER))) { + if (!scope_mismatch_quirk && + ((scope->entry_type == ACPI_DMAR_SCOPE_TYPE_ENDPOINT) ^ + (info->dev->hdr_type == PCI_HEADER_TYPE_NORMAL))) { pr_warn("Device scope type does not match for %s\n", pci_name(info->dev)); return -EINVAL; -- 2.17.1