mirror of
https://github.com/EnderIce2/Fennix.git
synced 2025-05-30 08:17:58 +00:00
refactor(kernel/pci): simplify PCI device initialization by delegating to PCIManager
Signed-off-by: EnderIce2 <enderice2@protonmail.com>
This commit is contained in:
parent
aea8a7bb08
commit
232e06f8f3
@ -621,131 +621,7 @@ namespace v0
|
|||||||
void InitializePCI(dev_t DriverID, void *_Header)
|
void InitializePCI(dev_t DriverID, void *_Header)
|
||||||
{
|
{
|
||||||
dbg_api("%d, %#lx", DriverID, _Header);
|
dbg_api("%d, %#lx", DriverID, _Header);
|
||||||
|
PCIManager->InitializeDevice(*(PCI::PCIDevice *)_Header, KernelPageTable);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t GetBAR(dev_t DriverID, uint8_t i, void *_Header)
|
uint32_t GetBAR(dev_t DriverID, uint8_t i, void *_Header)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user