From: Chen Yu <yu.c.chen@intel.com>
To: linux-pci@vger.kernel.org
Cc: Jonathan Corbet <corbet@lwn.net>,
Bjorn Helgaas <bhelgaas@google.com>,
linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org,
Len Brown <lenb@kernel.org>,
"Rafael J. Wysocki" <rjw@rjwysocki.net>,
Chen Yu <yu.c.chen@intel.com>
Subject: [PATCH][RFC] PCI: Add "pci=blacklist_dev=" parameter to blacklist specific devices
Date: Fri, 24 Jan 2020 22:42:48 +0800 [thread overview]
Message-ID: <20200124144248.11719-1-yu.c.chen@intel.com> (raw)
It was found that on some platforms the bogus pci device might bring
troubles to the system. For example, on a MacBookPro the system could
not be power off or suspended due to internal pci resource confliction
between bogus pci device and [io 0x1804]. Another case is that, once
resumed from hibernation on a VM, the pci config space of a pci device
is corrupt.
To narrow down and benefit future debugging for such kind of issues,
introduce the command line blacklist_dev=<vendor:device_id>> to blacklist
such pci devices thus they will not be scanned thus not visible after
bootup. For example,
pci.blacklist_dev=8086:293e
forbid the audio device to be exposed to the OS.
Signed-off-by: Chen Yu <yu.c.chen@intel.com>
---
Documentation/admin-guide/kernel-parameters.txt | 6 ++++++
drivers/pci/pci.c | 17 +++++++++++++++++
drivers/pci/pci.h | 1 +
drivers/pci/probe.c | 3 +++
4 files changed, 27 insertions(+)
diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
index ade4e6ec23e0..cd4a47e236aa 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -3583,6 +3583,12 @@
may put more devices in an IOMMU group.
force_floating [S390] Force usage of floating interrupts.
nomio [S390] Do not use MIO instructions.
+ blacklist_dev=<vendor:device_id>[; ...]
+ Specify one or more PCI devices (in the format
+ specified above) separated by semicolons.
+ Each device specified will not be scanned thus
+ will be invisible after boot up. This can be
+ used for debugging purpose.
pcie_aspm= [PCIE] Forcibly enable or disable PCIe Active State Power
Management.
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index e87196cc1a7f..0e3626a401f4 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -6393,6 +6393,19 @@ void __weak pci_fixup_cardbus(struct pci_bus *bus)
}
EXPORT_SYMBOL(pci_fixup_cardbus);
+static const char *pci_blacklist_devs_param;
+
+bool pci_is_blacklist_dev(unsigned short vendor, unsigned short device)
+{
+ char search[10];
+
+ if (!pci_blacklist_devs_param)
+ return false;
+ sprintf(search, "%x:%x", vendor, device);
+
+ return strstr(pci_blacklist_devs_param, search) ? true : false;
+}
+
static int __init pci_setup(char *str)
{
while (str) {
@@ -6451,6 +6464,8 @@ static int __init pci_setup(char *str)
pci_add_flags(PCI_SCAN_ALL_PCIE_DEVS);
} else if (!strncmp(str, "disable_acs_redir=", 18)) {
disable_acs_redir_param = str + 18;
+ } else if (!strncmp(str, "blacklist_dev=", 14)) {
+ pci_blacklist_devs_param = str + 14;
} else {
pr_err("PCI: Unknown option `%s'\n", str);
}
@@ -6476,6 +6491,8 @@ static int __init pci_realloc_setup_params(void)
GFP_KERNEL);
disable_acs_redir_param = kstrdup(disable_acs_redir_param, GFP_KERNEL);
+ pci_blacklist_devs_param = kstrdup(pci_blacklist_devs_param, GFP_KERNEL);
+
return 0;
}
pure_initcall(pci_realloc_setup_params);
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
index a0a53bd05a0b..01b8ab2da065 100644
--- a/drivers/pci/pci.h
+++ b/drivers/pci/pci.h
@@ -669,4 +669,5 @@ static inline int pci_acpi_program_hp_params(struct pci_dev *dev)
extern const struct attribute_group aspm_ctrl_attr_group;
#endif
+bool pci_is_blacklist_dev(unsigned short vendor, unsigned short device);
#endif /* DRIVERS_PCI_H */
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 512cb4312ddd..812ef901ecea 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -2271,6 +2271,9 @@ static struct pci_dev *pci_scan_device(struct pci_bus *bus, int devfn)
if (!pci_bus_read_dev_vendor_id(bus, devfn, &l, 60*1000))
return NULL;
+ if (pci_is_blacklist_dev(l & 0xffff, (l >> 16) & 0xffff))
+ return NULL;
+
dev = pci_alloc_dev(bus);
if (!dev)
return NULL;
--
2.17.1
next reply other threads:[~2020-01-24 14:45 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-01-24 14:42 Chen Yu [this message]
2020-01-24 19:27 ` [PATCH][RFC] PCI: Add "pci=blacklist_dev=" parameter to blacklist specific devices Matthew Wilcox
2020-01-28 2:09 ` Chen Yu
2020-01-24 19:31 ` Bjorn Helgaas
2020-01-29 1:32 ` Dan Williams
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200124144248.11719-1-yu.c.chen@intel.com \
--to=yu.c.chen@intel.com \
--cc=bhelgaas@google.com \
--cc=corbet@lwn.net \
--cc=lenb@kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=rjw@rjwysocki.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).