Enumerating PCI bus according to the actual MCFG size and not maximum

This commit is contained in:
Adrien Bourmault 2020-02-17 19:17:52 +01:00
parent 34abff3543
commit 3c3e64e133
1 changed files with 4 additions and 1 deletions

View File

@ -27,6 +27,7 @@
#include <mm/paging.h> #include <mm/paging.h>
static void *pciConfigBaseAddress = NULL; static void *pciConfigBaseAddress = NULL;
static MCFG_t *MCFG_table = NULL;
// -------------------------------------------------------------------------- // // -------------------------------------------------------------------------- //
@ -114,6 +115,7 @@ void IoPciEnumerate()
for(uchar device = 0; device < 32; device++) { for(uchar device = 0; device < 32; device++) {
for(uchar function = 0; function < 8; function++) { for(uchar function = 0; function < 8; function++) {
ushort vendor = pciReadConfigWord((uchar)bus, device, function, PCI_REG_VENDOR); ushort vendor = pciReadConfigWord((uchar)bus, device, function, PCI_REG_VENDOR);
if(bus * device * function > MCFG_table->length) break;
if(vendor == 0xffff) continue; if(vendor == 0xffff) continue;
DebugLog("PCI device class: %x, subclass: %x, vendor: %x, device: %x\n", DebugLog("PCI device class: %x, subclass: %x, vendor: %x, device: %x\n",
pciReadConfigByte((uchar)bus, device, function, PCI_REG_CLASS), pciReadConfigByte((uchar)bus, device, function, PCI_REG_CLASS),
@ -138,6 +140,7 @@ PciDev_t *IoPciGetDevice(ushort vendorID, ushort deviceID)
for(uchar function = 0; function < 8; function++) { for(uchar function = 0; function < 8; function++) {
if(vendorID == pciReadConfigWord((uchar)bus, device, function, PCI_REG_VENDOR) if(vendorID == pciReadConfigWord((uchar)bus, device, function, PCI_REG_VENDOR)
&& deviceID == pciReadConfigWord((uchar)bus, device, function, PCI_REG_DEVICE)) { && deviceID == pciReadConfigWord((uchar)bus, device, function, PCI_REG_DEVICE)) {
if(bus * device * function > MCFG_table->length) break;
PciDev_t *pciDevicePtr = (PciDev_t *)malloc(sizeof(PciDev_t)); PciDev_t *pciDevicePtr = (PciDev_t *)malloc(sizeof(PciDev_t));
pciDevicePtr->vendorID = vendorID; pciDevicePtr->vendorID = vendorID;
pciDevicePtr->deviceID = deviceID; pciDevicePtr->deviceID = deviceID;
@ -180,7 +183,7 @@ PciDev_t *IoPciGetDeviceByClass(uchar classID, uchar subclassID)
void IoInitPCI() void IoInitPCI()
{ {
MCFG_t *MCFG_table = (MCFG_t*)IoGetAcpiTable(SDT_MCFG); MCFG_table = (MCFG_t*)IoGetAcpiTable(SDT_MCFG);
if(MCFG_table == NULL) { if(MCFG_table == NULL) {
KeStartPanic("Unable to access PCI configuration : MCFG table not reachable\n"); KeStartPanic("Unable to access PCI configuration : MCFG table not reachable\n");
} }