diff --git a/Kernel/core/driver/api.cpp b/Kernel/core/driver/api.cpp index 401d9140..0b0f67ef 100644 --- a/Kernel/core/driver/api.cpp +++ b/Kernel/core/driver/api.cpp @@ -621,131 +621,7 @@ namespace v0 void InitializePCI(dev_t DriverID, void *_Header) { dbg_api("%d, %#lx", DriverID, _Header); - - PCI::PCIDevice *__device = (PCI::PCIDevice *)_Header; - PCI::PCIDeviceHeader *Header = (PCI::PCIDeviceHeader *)__device->Header; - - debug("Header Type: %d", Header->HeaderType); - switch (Header->HeaderType) - { - case 128: - warn("Unknown header type %d! Guessing PCI Header 0", - Header->HeaderType); - [[fallthrough]]; - case 0: /* PCI Header 0 */ - { - PCI::PCIHeader0 *hdr0 = (PCI::PCIHeader0 *)Header; - - uint32_t BAR[6]; - size_t BARsSize[6]; - - BAR[0] = hdr0->BAR0; - BAR[1] = hdr0->BAR1; - BAR[2] = hdr0->BAR2; - BAR[3] = hdr0->BAR3; - BAR[4] = hdr0->BAR4; - BAR[5] = hdr0->BAR5; - - debug("Type: %d; IOBase: %#lx; MemoryBase: %#lx", - BAR[0] & 1, BAR[1] & (~3), BAR[0] & (~15)); - - /* BARs Size */ - for (short i = 0; i < 6; i++) - { - if (BAR[i] == 0) - continue; - - size_t size; - if ((BAR[i] & 1) == 0) /* Memory Base */ - { - hdr0->BAR0 = 0xFFFFFFFF; - size = hdr0->BAR0; - hdr0->BAR0 = BAR[i]; - BARsSize[i] = size & (~15); - BARsSize[i] = ~BARsSize[i] + 1; - BARsSize[i] = BARsSize[i] & 0xFFFFFFFF; - debug("BAR%d %#lx size: %d", - i, BAR[i], BARsSize[i]); - } - else if ((BAR[i] & 1) == 1) /* I/O Base */ - { - hdr0->BAR1 = 0xFFFFFFFF; - size = hdr0->BAR1; - hdr0->BAR1 = BAR[i]; - BARsSize[i] = size & (~3); - BARsSize[i] = ~BARsSize[i] + 1; - BARsSize[i] = BARsSize[i] & 0xFFFF; - debug("BAR%d %#lx size: %d", - i, BAR[i], BARsSize[i]); - } - } - - Memory::Virtual vmm(KernelPageTable); - - /* Mapping the BARs */ - for (short i = 0; i < 6; i++) - { - if (BAR[i] == 0) - continue; - - if ((BAR[i] & 1) == 0) /* Memory Base */ - { - uintptr_t BARBase = BAR[i] & (~15); - size_t BARSize = BARsSize[i]; - - debug("Mapping BAR%d %#lx-%#lx", - i, BARBase, BARBase + BARSize); - - if (BARSize == 0) - { - warn("BAR%d size is zero!", i); - BARSize++; - } - - vmm.Map((void *)BARBase, (void *)BARBase, - BARSize, Memory::RW | Memory::PWT | Memory::PCD); - } - else if ((BAR[i] & 1) == 1) /* I/O Base */ - { - uintptr_t BARBase = BAR[i] & (~3); - size_t BARSize = BARsSize[i]; - - debug("Mapping BAR%d %#x-%#x", - i, BARBase, BARBase + BARSize); - - if (BARSize == 0) - { - warn("BAR%d size is zero!", i); - BARSize++; - } - - vmm.Map((void *)BARBase, (void *)BARBase, - BARSize, Memory::RW | Memory::PWT | Memory::PCD); - } - } - break; - } - case 1: /* PCI Header 1 (PCI-to-PCI Bridge) */ - { - fixme("PCI Header 1 (PCI-to-PCI Bridge) not implemented yet"); - break; - } - case 2: /* PCI Header 2 (PCI-to-CardBus Bridge) */ - { - fixme("PCI Header 2 (PCI-to-CardBus Bridge) not implemented yet"); - break; - } - default: - { - error("Unknown header type %d", Header->HeaderType); - break; - } - } - - Header->Command |= PCI_COMMAND_MASTER | - PCI_COMMAND_IO | - PCI_COMMAND_MEMORY; - Header->Command &= ~PCI_COMMAND_INTX_DISABLE; + PCIManager->InitializeDevice(*(PCI::PCIDevice *)_Header, KernelPageTable); } uint32_t GetBAR(dev_t DriverID, uint8_t i, void *_Header)