Better PCI support

This commit is contained in:
Baptiste Wicht 2016-07-23 17:48:02 +02:00
parent bba38e340a
commit fd03371249
2 changed files with 34 additions and 1 deletions

View File

@ -51,7 +51,12 @@ void detect_devices();
size_t number_of_devices(); size_t number_of_devices();
device_descriptor& device(size_t index); device_descriptor& device(size_t index);
uint8_t read_config_byte(uint8_t bus, uint8_t device, uint8_t function, uint8_t offset);
uint16_t read_config_word(uint8_t bus, uint8_t device, uint8_t function, uint8_t offset);
uint32_t read_config_dword(uint8_t bus, uint8_t device, uint8_t function, uint8_t offset); uint32_t read_config_dword(uint8_t bus, uint8_t device, uint8_t function, uint8_t offset);
void write_config_byte(uint8_t bus, uint8_t device, uint8_t function, uint8_t offset, uint8_t value);
void write_config_word(uint8_t bus, uint8_t device, uint8_t function, uint8_t offset, uint16_t value);
void write_config_dword(uint8_t bus, uint8_t device, uint8_t function, uint8_t offset, uint32_t value); void write_config_dword(uint8_t bus, uint8_t device, uint8_t function, uint8_t offset, uint32_t value);
} //end of namespace pci } //end of namespace pci

View File

@ -127,7 +127,17 @@ pci::device_descriptor& pci::device(size_t index){
return devices[index]; return devices[index];
} }
uint32_t pci::read_config_dword (uint8_t bus, uint8_t device, uint8_t function, uint8_t offset){ uint8_t pci::read_config_byte(uint8_t bus, uint8_t device, uint8_t function, uint8_t offset){
auto value = read_config_dword(bus, device, function, offset);
return (value >> ((offset & 3) * 8)) & 0xff;
}
uint16_t pci::read_config_word(uint8_t bus, uint8_t device, uint8_t function, uint8_t offset){
auto value = read_config_dword(bus, device, function, offset);
return (value >> ((offset & 3) * 8)) & 0xffff;
}
uint32_t pci::read_config_dword(uint8_t bus, uint8_t device, uint8_t function, uint8_t offset){
uint32_t address = uint32_t address =
static_cast<uint32_t>(1 << 31) //enabled static_cast<uint32_t>(1 << 31) //enabled
| (uint32_t(bus) << 16) //bus number | (uint32_t(bus) << 16) //bus number
@ -140,6 +150,24 @@ uint32_t pci::read_config_dword (uint8_t bus, uint8_t device, uint8_t function,
return in_dword(PCI_CONFIG_DATA); return in_dword(PCI_CONFIG_DATA);
} }
void pci::write_config_byte(uint8_t bus, uint8_t device, uint8_t function, uint8_t offset, uint8_t value){
auto tmp = read_config_dword(bus, device, function, offset);
tmp &= ~(0xff << ((offset & 3) * 8));
tmp |= (value << ((offset & 3) * 8));
write_config_dword(bus, device, function, offset, tmp);
}
void pci::write_config_word(uint8_t bus, uint8_t device, uint8_t function, uint8_t offset, uint16_t value){
auto tmp = read_config_dword(bus, device, function, offset);
tmp &= ~(0xffff << ((offset & 3) * 8));
tmp |= (value << ((offset & 3) * 8));
write_config_dword(bus, device, function, offset, tmp);
}
void pci::write_config_dword (uint8_t bus, uint8_t device, uint8_t function, uint8_t offset, uint32_t value){ void pci::write_config_dword (uint8_t bus, uint8_t device, uint8_t function, uint8_t offset, uint32_t value){
uint32_t address = uint32_t address =
static_cast<uint32_t>(1 << 31) //enabled static_cast<uint32_t>(1 << 31) //enabled