驅動程式 - Linux Device Driver (LDD) - 使用範例 - C/C++ (Debian) - Dump PCI Config



main.c

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/pci.h>
 
int ldd_init(void)
{
    int i = 0;
    int j = 0;
    int p = 0;
    u32 val[8] = { 0 };
    struct pci_dev *pdev = NULL;

    for_each_pci_dev(pdev) {
        printk("\nPCI Device: %04x:%02x:%02x.%d "
                "Vendor=%04x Device=%04x "
                "Class=%06x\n",
                pci_domain_nr(pdev->bus),
                pdev->bus->number,
                PCI_SLOT(pdev->devfn),
                PCI_FUNC(pdev->devfn),
                pdev->vendor,
                pdev->device,
                pdev->class >> 8
        );

        for (i = 0; i < 8; ++i) {
            for (j = 0; j < 8; ++j) {
                pci_read_config_dword(pdev, p, &val[j]);
                p += 4;
            }
            printk("%02x: 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n",
                i * 32,
                val[0],
                val[1],
                val[2],
                val[3],
                val[4],
                val[5],
                val[6],
                val[7]
            );
        }
    }

    return 0;
}
  
void ldd_exit(void)
{
}
  
module_init(ldd_init);
module_exit(ldd_exit);
  
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Steward Fu");
MODULE_DESCRIPTION("Linux Driver");

$ sudo dmesg
                   PCI Device: 0000:00:00.0 Vendor=8086 Device=0150 Class=000600
    [36818.854080] 00: 0x01508086 0x30900006 0x06000009 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000
    [36818.854084] 20: 0x00000000 0x00000000 0x00000000 0x05771028 0x00000000 0x000000e0 0x00000000 0x00000000
    [36818.854088] 40: 0xfed19001 0x00000000 0xfed10001 0x00000000 0x00000211 0x00000011 0xdf900007 0xdb000001
    [36818.854092] 60: 0xf8000005 0x00000000 0xfed18001 0x00000000 0xfe000000 0x00000002 0xfe000c00 0x0000007f
    [36818.854096] 80: 0x01111110 0x00110000 0x0000001a 0x00000000 0xfe000001 0x00000002 0x1e500001 0x00000003
    [36818.854100] a0: 0x00000001 0x00000003 0x1e600001 0x00000003 0xdba00001 0xdb800001 0xdb000001 0xdfa00001
    [36818.854104] c0: 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000
    [36818.854108] e0: 0x010c0009 0xe200a092 0x044000d0 0x00000000 0x00000000 0x00000000 0x00090fc8 0x00000000

$ lspci -s 00:00.0 -xxx
    00:00.0 Host bridge: Intel Corporation Xeon E3-1200 v2/3rd Gen Core processor DRAM Controller (rev 09)
    00: 86 80 50 01 06 00 90 30 09 00 00 06 00 00 00 00
    10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    20: 00 00 00 00 00 00 00 00 00 00 00 00 28 10 77 05
    30: 00 00 00 00 e0 00 00 00 00 00 00 00 00 00 00 00