static int shell_pci_rX( unsigned long pciid, int offset, int size) { uint8_t data8; uint16_t data16; uint32_t data32; int result; switch(size) { case 1: result = pci_cfg_r8(pciid, offset, &data8); if (result == PCISTS_OK) printf(" r08[0x%02x]: 0x%02x DEC=%d\n", offset, data8, data8); break; case 2: result = pci_cfg_r16(pciid, offset, &data16); if (result == PCISTS_OK) printf(" r16[0x%02x]: 0x%04x DEC=%d\n", offset, data16, data16); break; case 4: result = pci_cfg_r32(pciid, offset, &data32); if (result == PCISTS_OK) printf(" r32[0x%02x]: 0x%08lx DEC=%lu\n", offset, data32, data32); break; default: return PCISTS_EINVAL; } return result; }
void pci_modify_cmdsts(pci_dev_t dev, uint32_t mask, uint32_t val) { uint32_t data; pci_cfg_r32(dev, PCI_COMMAND, &data); data &= ~mask; data |= val; pci_cfg_w32(dev, PCI_COMMAND, data); }
int pci_for_each(int (*func)(pci_dev_t, void*), void *arg) { uint32_t id; uint8_t hd; int bus, dev, fun, result, fail; int maxbus = pci_bus_count(); pci_dev_t pcidev; for (bus = 0; bus < maxbus ; bus++) { for (dev = 0; dev < PCI_MAX_DEVICES; dev++) { pcidev = PCI_DEV(bus, dev, 0); for (fun = 0; fun < PCI_MAX_FUNCTIONS; fun++, pcidev++) { fail = pci_cfg_r32(pcidev, PCI_VENDOR_ID, &id); if (fail || (0xffffffff == id) || (0 == id)) { if (fun == 0) break; else continue; } DBG("pcibus_for_each: found 0x%08lx at" " %d/%d/%d\n", id, bus, dev, fun); result = func(pcidev, arg); if (result != 0) return result; /* Stopped */ /* Stop if not a multi-function device */ if (fun == 0) { pci_cfg_r8(pcidev, PCI_HEADER_TYPE, &hd); if ((hd & PCI_MULTI_FUNCTION) == 0) break; } } } } return 0; /* scanned all */ }