static void pci_read_bar(uint32_t id, uint32_t index, uint32_t *address, uint32_t *mask) { uint32_t reg = PCI_CONFIG_BAR0 + index * sizeof(uint32_t); // Get address *address = pci_read32(id, reg); // Find size of the bar pci_write32(id, reg, 0xffffffff); *mask = pci_read32(id, reg); // Restore adddress pci_write32(id, reg, *address); }
static ssize_t device_read(struct file *filp, char __user * buff, size_t len, loff_t * off) { int i; printk("=== %s:%d\n", __func__, __LINE__); copy_from_user(&g_pci_test , buff, len); // read cfg /*uint16_t ret = pci_read16(g_pci_test.pci_dev, g_pci_test.reg);*/ g_pci_block_dev.pci_dev = g_pci_test.pci_dev.u16; pci_cfg_bars_decode(&g_pci_block_dev); printk("### g_pci_block_dev.pci_dev=%x\n", g_pci_block_dev.pci_dev); for (i=0; i < PCI_DEVICE_BAR_NUM; i++) { printk("### bars[%d]=%llx\n", i, g_pci_block_dev.bars[i].addr); } if ((g_pci_block_dev.bars[0].addr & (0xffffffffULL<<32)) == (0xffffffffULL<<32)) { printk("### offset-240%x\n", *(uint32_t *)(g_pci_block_dev.bars[0].addr+0x240)); printk("### offset-248 %x\n", *(uint32_t *)(g_pci_block_dev.bars[0].addr+0x248)); } // read reg g_pci_test.read_val = pci_read32(g_pci_test.pci_dev.u16, g_pci_test.reg); printk("### pci_dev: %x, reg: %x, read_val: %x\n", g_pci_test.pci_dev.u16, g_pci_test.reg, g_pci_test.read_val); copy_to_user(buff, &g_pci_test, sizeof(g_pci_test)); return 0; }
static void pci_check(uint32_t bus, uint32_t dev, uint32_t func) { uint32_t id = PCI_MAKE_ID(bus, dev, func); pci_device_info_t info; info.vendorId = pci_read16(id, PCI_CONFIG_VENDOR_ID); if (info.vendorId == 0xFFFF) { return; } info.deviceId = pci_read16(id, PCI_CONFIG_DEVICE_ID); info.progIntf = pci_read8(id, PCI_CONFIG_PROG_INTF); info.subclass = pci_read8(id, PCI_CONFIG_SUBCLASS); info.classCode = pci_read8(id, PCI_CONFIG_CLASS_CODE); uint32_t result = pci_read32(id, PCI_CONFIG_VENDOR_ID); uint16_t dev_id = result >> 0x10; uint16_t ven_id = result & 0xFFFF; printf("%02x:%02x.%d %04x:%04x %s\n", bus, dev, func, info.vendorId, info.deviceId, pci_class_name(info.classCode, info.subclass, info.progIntf)); }