From: Sui Jingfeng <sui.jingfeng@linux.dev>
To: Bjorn Helgaas <bhelgaas@google.com>
Cc: Dave Airlie <airlied@redhat.com>, Daniel Vetter <daniel@ffwll.ch>,
linux-pci@vger.kernel.org, dri-devel@lists.freedesktop.org,
linux-kernel@vger.kernel.org,
Sui Jingfeng <suijingfeng@loongson.cn>,
Mario Limonciello <mario.limonciello@amd.com>
Subject: [PATCH v2 03/11] PCI/VGA: Deal with VGA class devices
Date: Wed, 9 Aug 2023 06:34:04 +0800 [thread overview]
Message-ID: <20230808223412.1743176-4-sui.jingfeng@linux.dev> (raw)
In-Reply-To: <20230808223412.1743176-1-sui.jingfeng@linux.dev>
From: Sui Jingfeng <suijingfeng@loongson.cn>
vgaarb only cares about PCI(e) VGA devices (pdev->class == 0x0300XX)
Currently, hence we only need to add VGA devices has its class code equals
to 0x0300 to the arbiter. To keep align with the previous behavior. we
ignore the programming interface byte (the least significant 8 bits)
intentionally.
After apply this patch, We will filter the unqualified devices out in the
vga_arb_device_init() function. While the current implementation is to
search all PCI devices in a system, this is not efficient. This also means
that deleting a PCI device no longer needs to walk the list.
Note that the major contribution of this patch is optimization.
Reviewed-by: Mario Limonciello <mario.limonciello@amd.com>
Signed-off-by: Sui Jingfeng <suijingfeng@loongson.cn>
---
drivers/pci/vgaarb.c | 68 ++++++++++++++++++++++++++++++++++++--------
1 file changed, 56 insertions(+), 12 deletions(-)
diff --git a/drivers/pci/vgaarb.c b/drivers/pci/vgaarb.c
index c1bc6c983932..8742a51d450f 100644
--- a/drivers/pci/vgaarb.c
+++ b/drivers/pci/vgaarb.c
@@ -754,10 +754,6 @@ static bool vga_arbiter_add_pci_device(struct pci_dev *pdev)
struct pci_dev *bridge;
u16 cmd;
- /* Only deal with VGA class devices */
- if ((pdev->class >> 8) != PCI_CLASS_DISPLAY_VGA)
- return false;
-
/* Allocate structure */
vgadev = kzalloc(sizeof(struct vga_device), GFP_KERNEL);
if (vgadev == NULL) {
@@ -1493,6 +1489,42 @@ static void vga_arbiter_notify_clients(void)
spin_unlock_irqrestore(&vga_lock, flags);
}
+/*
+ * The PCI Class Code spec implies that only VGA devices with programming
+ * interface 0x00 can depend on the legacy VGA address range. VGA devices
+ * with programming interface 0x01 are 8514-compatible controllers. Since
+ * VGA devices with programming interface 0x00 is VGA compatible, the 'vga'
+ * suffix here should refer to the VGA-compatible devices after a strict
+ * reading of that specification. But considering the fact that there
+ * probably don't has a 8514-compatible controller that could be used with
+ * upstream kernel anymore, we would like to just ignore the programming
+ * interface byte.
+ *
+ * Besides, there do exist non VGA-compatible display controllers in the
+ * world and hardware vendors may abandon the old VGA standard someday.
+ * The meaning of 'vga' suffix here may change to evolve with time.
+ *
+ * A strict understanding of 'vga' certainly should be VGA-compatible, While
+ * a relaxed understanding of 'vga' would be PCI devices that are able to
+ * display. Currently, we just keep aligned to the previous behavior.
+ * Deal with VGA class devices.
+ */
+static bool pci_dev_is_vga(struct pci_dev *pdev)
+{
+ if ((pdev->class >> 8) == PCI_CLASS_DISPLAY_VGA)
+ return true;
+
+ /*
+ * The PCI_CLASS_NOT_DEFINED_VGA is defined to provide backward
+ * compatibility for devices that were built before the class code
+ * field was defined.
+ */
+ if ((pdev->class >> 8) == PCI_CLASS_NOT_DEFINED_VGA)
+ return true;
+
+ return false;
+}
+
static int pci_notify(struct notifier_block *nb, unsigned long action,
void *data)
{
@@ -1502,6 +1534,9 @@ static int pci_notify(struct notifier_block *nb, unsigned long action,
vgaarb_dbg(dev, "%s\n", __func__);
+ if (!pci_dev_is_vga(pdev))
+ return 0;
+
/* For now we're only intereted in devices added and removed. I didn't
* test this thing here, so someone needs to double check for the
* cases of hotplugable vga cards. */
@@ -1534,8 +1569,8 @@ static struct miscdevice vga_arb_device = {
static int __init vga_arb_device_init(void)
{
+ struct pci_dev *pdev = NULL;
int rc;
- struct pci_dev *pdev;
rc = misc_register(&vga_arb_device);
if (rc < 0)
@@ -1543,13 +1578,22 @@ static int __init vga_arb_device_init(void)
bus_register_notifier(&pci_bus_type, &pci_notifier);
- /* We add all PCI devices satisfying VGA class in the arbiter by
- * default */
- pdev = NULL;
- while ((pdev =
- pci_get_subsys(PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
- PCI_ANY_ID, pdev)) != NULL)
- vga_arbiter_add_pci_device(pdev);
+ /*
+ * We add all PCI devices satisfying VGA class in the arbiter
+ * by default, but we ignore the programming interface byte
+ * intentionally.
+ */
+ do {
+ pdev = pci_get_class_masked(PCI_CLASS_DISPLAY_VGA << 8, 0xFFFF00, pdev);
+ if (pdev && pci_dev_is_vga(pdev))
+ vga_arbiter_add_pci_device(pdev);
+ } while (pdev);
+
+ do {
+ pdev = pci_get_class_masked(PCI_CLASS_NOT_DEFINED_VGA << 8, 0xFFFF00, pdev);
+ if (pdev && pci_dev_is_vga(pdev))
+ vga_arbiter_add_pci_device(pdev);
+ } while (pdev);
pr_info("loaded\n");
return rc;
--
2.34.1
next prev parent reply other threads:[~2023-08-08 22:34 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-08-08 22:34 [PATCH v2 00/11] Fix typos, comments and copyright Sui Jingfeng
2023-08-08 22:34 ` [PATCH v2 01/11] PCI/VGA: Use unsigned type for the io_state variable Sui Jingfeng
2023-08-09 13:57 ` Ilpo Järvinen
2023-08-08 22:34 ` [PATCH v2 02/11] PCI: Add the pci_get_class_masked() helper Sui Jingfeng
2023-08-09 14:01 ` Ilpo Järvinen
2023-08-10 13:05 ` suijingfeng
2023-08-11 6:31 ` Ilpo Järvinen
2023-08-08 22:34 ` Sui Jingfeng [this message]
2023-08-08 22:34 ` [PATCH v2 04/11] PCI/VGA: Drop the inline in the vga_update_device_decodes() function Sui Jingfeng
2023-08-09 14:10 ` Ilpo Järvinen
2023-08-08 22:34 ` [PATCH v2 05/11] PCI/VGA: Move the new_state assignment out of the loop Sui Jingfeng
2023-08-09 13:55 ` Ilpo Järvinen
2023-08-08 22:34 ` [PATCH v2 06/11] PCI/VGA: Fix two typos in the comments of pci_notify() Sui Jingfeng
2023-08-09 14:12 ` Ilpo Järvinen
2023-08-10 12:04 ` suijingfeng
2023-08-08 22:34 ` [PATCH v2 07/11] PCI/VGA: vga_client_register() return -ENODEV on failure, not -1 Sui Jingfeng
2023-08-09 13:52 ` Ilpo Järvinen
2023-08-10 11:56 ` suijingfeng
2023-08-10 12:13 ` Ilpo Järvinen
2023-08-10 12:18 ` Sui Jingfeng
2023-08-08 22:34 ` [PATCH v2 08/11] PCI/VGA: Fix a typo to the comment of vga_default Sui Jingfeng
2023-08-09 14:14 ` Ilpo Järvinen
2023-08-08 22:34 ` [PATCH v2 09/11] PCI/VGA: Fix a typo to the comments in vga_str_to_iostate() function Sui Jingfeng
2023-08-08 22:34 ` [PATCH v2 10/11] PCI/VGA: Tidy up the code and comment format Sui Jingfeng
2023-08-09 14:18 ` Ilpo Järvinen
2023-08-08 22:34 ` [PATCH v2 11/11] PCI/VGA: Replace full MIT license text with SPDX identifier Sui Jingfeng
2023-08-23 22:29 ` [PATCH v2 00/11] Fix typos, comments and copyright Bjorn Helgaas
2023-08-24 6:21 ` suijingfeng
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=20230808223412.1743176-4-sui.jingfeng@linux.dev \
--to=sui.jingfeng@linux.dev \
--cc=airlied@redhat.com \
--cc=bhelgaas@google.com \
--cc=daniel@ffwll.ch \
--cc=dri-devel@lists.freedesktop.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=mario.limonciello@amd.com \
--cc=suijingfeng@loongson.cn \
/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