How could I detect bar5 address from PCI Scan?
Posted: Tue May 06, 2025 11:25 am
I want to get bar5 address for pci devices like AHCI Disk Drive by following
where
Is this correct to detect bar5 Address ?
Because port->cmd & HBA_PxCMD_CR is giving 0
Code: Select all
// read the BAR0 to BAR5 (Base Address Register 0 to 5)
uint32_t bar0 = pci_read(bus, device, function, 0x10); // Read BAR0 (Base Address Register 0)
uint32_t bar1 = pci_read(bus, device, function, 0x14); // Read BAR1 (Base Address Register 1)
uint32_t bar2 = pci_read(bus, device, function, 0x18); // Read BAR2 (Base Address Register 2)
uint32_t bar3 = pci_read(bus, device, function, 0x1C); // Read BAR3 (Base Address Register 3)
uint32_t bar4 = pci_read(bus, device, function, 0x20); // Read BAR4 (Base Address Register 4)
uint32_t bar5 = pci_read(bus, device, function, 0x24); // Read BAR5 (Base Address Register 5)
// uint32_t bar6 = pci_read(bus, device, function, 0x28); // Read BAR6 (Base Address Register 6) // not present in all devices
pci_device.base_address_registers[0] = bar0;
pci_device.base_address_registers[1] = bar1;
pci_device.base_address_registers[2] = bar2;
pci_device.base_address_registers[3] = bar3;
pci_device.base_address_registers[4] = bar4;
pci_device.base_address_registers[5] = bar5 & 0xFFFFFFF0; // This is a pointer to the AHCI controller's memory address
// pci_device.base_address_registers[6] = bar6; // Not used in this example
Code: Select all
uint32_t pci_read(uint8_t bus, uint8_t device, uint8_t function, uint8_t offset) {
uint32_t address = (1 << 31) | (bus << 16) | (device << 11) | (function << 8) | (offset & 0xFC);
outl(CONFIG_ADDRESS, address); // Write CONFIG_ADDRESS
return inl(CONFIG_DATA); // Read CONFIG_DATA
}
Code: Select all
HBA_PORT_T* port = &abar->ports[0];