diff options
author | Sui Jingfeng <suijingfeng@loongson.cn> | 2023-08-30 19:15:28 +0800 |
---|---|---|
committer | Bjorn Helgaas <bhelgaas@google.com> | 2023-10-06 17:13:11 -0500 |
commit | 7e845ecb2fbfa1bf800e703df29ee2e06592c2a0 (patch) | |
tree | 0b8c6ecfa795e92469f1d744554ee57f20aeb1b8 | |
parent | 0bb80ecc33a8fb5a682236443c1e740d5c917d1d (diff) |
PCI: Add pci_is_vga() helper
The PCI Code and ID Assignment spec, r1.15, secs 1.4 and 1.1, define
VGA Base Class and Sub-Classes:
03 00 PCI_CLASS_DISPLAY_VGA VGA-compatible or 8514-compatible
00 01 PCI_CLASS_NOT_DEFINED_VGA VGA-compatible (before Class Code)
Add a pci_is_vga() helper to return true if a device is in either category.
These VGA devices use the hardwired legacy VGA resources
([mem 0xa0000-0xbffff], [io 0x3b0-0x3bb], [io 0x3c0-0x3df] and aliases), so
they require special handling if more than one is present in the system.
Link: https://lore.kernel.org/r/20230830111532.444535-2-sui.jingfeng@linux.dev
Signed-off-by: Sui Jingfeng <suijingfeng@loongson.cn>
[bhelgaas: commit log, drop !pdev test]
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Cc: "Maciej W. Rozycki" <macro@orcam.me.uk>
-rw-r--r-- | include/linux/pci.h | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/include/linux/pci.h b/include/linux/pci.h index 8c7c2c3c6c65..7bab234391cb 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -713,6 +713,30 @@ static inline bool pci_is_bridge(struct pci_dev *dev) dev->hdr_type == PCI_HEADER_TYPE_CARDBUS; } +/** + * pci_is_vga - check if the PCI device is a VGA device + * + * The PCI Code and ID Assignment spec, r1.15, secs 1.4 and 1.1, define + * VGA Base Class and Sub-Classes: + * + * 03 00 PCI_CLASS_DISPLAY_VGA VGA-compatible or 8514-compatible + * 00 01 PCI_CLASS_NOT_DEFINED_VGA VGA-compatible (before Class Code) + * + * Return true if the PCI device is a VGA device and uses the legacy VGA + * resources ([mem 0xa0000-0xbffff], [io 0x3b0-0x3bb], [io 0x3c0-0x3df] and + * aliases). + */ +static inline bool pci_is_vga(struct pci_dev *pdev) +{ + if ((pdev->class >> 8) == PCI_CLASS_DISPLAY_VGA) + return true; + + if ((pdev->class >> 8) == PCI_CLASS_NOT_DEFINED_VGA) + return true; + + return false; +} + #define for_each_pci_bridge(dev, bus) \ list_for_each_entry(dev, &bus->devices, bus_list) \ if (!pci_is_bridge(dev)) {} else |