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); }
static int shell_pci_wX( unsigned long pciid, int offset, uint32_t data, int size) { uint8_t data8; uint16_t data16; int result; switch(size) { case 1: if (data > 0xff) return PCISTS_EINVAL; data8 = data & 0xff; result = pci_cfg_w8(pciid, offset, data8); if (result == PCISTS_OK) printf(" w08[0x%02x]: 0x%02x DEC=%d\n", offset, data8, data8); break; case 2: if (data > 0xffff) return PCISTS_EINVAL; data16 = data & 0xffff; result = pci_cfg_w16(pciid, offset, data16); if (result == PCISTS_OK) printf(" w16[0x%02x]: 0x%04x DEC=%d\n", offset, data16, data16); break; case 4: result = pci_cfg_w32(pciid, offset, data); if (result == PCISTS_OK) printf(" w32[0x%02x]: 0x%08lx DEC=%lu\n", offset, data, data); break; default: return PCISTS_EINVAL; } return result; }