int pci_bus_write_config_dword (struct pci_bus *bus, unsigned int devfn, int where, u32 val); 访问配置空间的最好方式是通过pci_read_系列函数,例如: static unsigned charskel_get_revision(struct pci_dev *dev) { u8 revision; pci_read_config_byte(dev,PCI_REVISION_ID, &revision); return ...
pci_scan_device(struct pci_bus *bus, int devfn) { struct pci_dev *dev; u32 l; u8 hdr_type; int delay = 1; //--读PCI设备制造商的ID-- if (pci_bus_read_config_dword(bus, devfn, PCI_VENDOR_ID, &l)) return NULL; /* some broken boards return 0 or ~0 if a slot is empty...
看到bus_type 显然这是个设备总线驱动模型里的“总线”,与前边提到的 pci_bus ,完全是两码事,那么pci_driver 和 pci_dev 就是注册到 pci_bus_type 的驱动和设备。分析总线设备驱动模型的时候,总要分析一下它的 match 函数(匹配规则)。 staticint pci_bus_match(struct device *dev,struct device_driver *drv...
±> pci_bus_read_config_dword(bus, devfn, PCI_VENDOR_ID, l) 1. 2. 3. 4. 具体获取vendor id和device id的时候, 通过pci_bus_read_config_dword函数读取0x00地址,因为每次读一个DW(32bit)所以传入PCI_VENDOR_ID可以把vendor id和device id读出来 扫描完bus上pcie device信息之后通过pci_setup_device...
Memory Space:如果PCI设备实现了内存空间,该字段用来控制是否接收总线上对内存空间的访问。如果PCI设备没有内存空间,该字段不可写。 Bus Master:控制pci设备是否具有作为Master角色的权限。 status字段用来记录pci设备的状态信息,virtio-blk是(0x10 = 0x10000),status各字段含义如下图: ...
2 QEMU的实现 当虚机访问透传设备的config空间时,触发vm_exit,然后qemu会调用被访问设备的vfio_pci_read_config或vfio_pci_write_config操作。对于读操作,会查看当前读取的config空间是否被qemu模拟,如果模拟,则直接读取qemu中保存的config值,否则调用vfio提供的read接口进行读取。对于写操作,会直接调用vfio提供的write接...
13、l); int pci_read_config_dword(struct pci_dev *dev, int where, u32 *val);从由 dev 所标识出的设备的配置空间读 1 个 , 2 个或者 4 个字节 . where 参数是从配 置空间开始的字节偏移 . 从配置空间取得的值通过 val 指针返回 , 并且这个函数的返回值 是一个错误码 . word 和 dword 函数...
|- pci_find_bios() // #ifdef CONFIG_PCI_BIOS | |- check_pcibios() | | |- lcall &pci_indirect // 通过call指令,进入BIOS调用入口 | |- return &pci_bios_access | |- pci_bios_OP_config_SIZE() // OP: read/wr...
...val) int pci_write_config_dword(struct pci_dev *dev, int where, u32 val) PCI驱动的注册及匹配 BIOS在启动时,会为每个PCI...当linux系统启动时,会探测系统中的所有PCI设备,并为探测到的每个PCI设备做如下操作: 1.分配一个struct pci_dev结构体,用来表示相应的PCI设备 2.为这个结构体填充设备...
/* Read */ outpd(PCI_CONFIG_ADDRESS, dwAddr | i); dwData = inpd(PCI_CONFIG_DATA); /* Write */ fwrite(&dwData, sizeof(dwData), 1, hF); } fclose(hF); } } } } } return 0; } 对于我的电脑的枚举结果是: Bus# Device# Func# Vendor Device Class IRQ IntPin类代码的说明 0 0...