From fd033712490e4b9f85c68ebd4d79b6a0da66a3fa Mon Sep 17 00:00:00 2001 From: Baptiste Wicht Date: Sat, 23 Jul 2016 17:48:02 +0200 Subject: [PATCH] Better PCI support --- kernel/include/pci.hpp | 5 +++++ kernel/src/pci.cpp | 30 +++++++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/kernel/include/pci.hpp b/kernel/include/pci.hpp index 767be526..bcf596bf 100644 --- a/kernel/include/pci.hpp +++ b/kernel/include/pci.hpp @@ -51,7 +51,12 @@ void detect_devices(); size_t number_of_devices(); 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); + +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); } //end of namespace pci diff --git a/kernel/src/pci.cpp b/kernel/src/pci.cpp index 4718052a..1299664a 100644 --- a/kernel/src/pci.cpp +++ b/kernel/src/pci.cpp @@ -127,7 +127,17 @@ pci::device_descriptor& pci::device(size_t 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 = static_cast(1 << 31) //enabled | (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); } +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){ uint32_t address = static_cast(1 << 31) //enabled