diff --git a/Kernel/Bus/PCI/Controller/VolumeManagementDevice.cpp b/Kernel/Bus/PCI/Controller/VolumeManagementDevice.cpp index 3ae63cf2dd..5abfc80a1a 100644 --- a/Kernel/Bus/PCI/Controller/VolumeManagementDevice.cpp +++ b/Kernel/Bus/PCI/Controller/VolumeManagementDevice.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include namespace Kernel::PCI { @@ -36,7 +37,7 @@ NonnullOwnPtr VolumeManagementDevice::must_create(PCI::D // resource size of BAR0. dbgln("VMD Host bridge @ {}: Start bus at {}, end bus {}", device_identifier.address(), start_bus, 0xff); PCI::Domain domain { s_vmd_pci_domain_number++, start_bus, 0xff }; - auto start_address = PhysicalAddress(PCI::get_BAR0(device_identifier)).page_base(); + auto start_address = PCI::get_bar_address(device_identifier, PCI::HeaderType0BaseRegister::BAR0).release_value_but_fixme_should_propagate_errors(); return adopt_own_if_nonnull(new (nothrow) VolumeManagementDevice(domain, start_address)).release_nonnull(); } diff --git a/Kernel/Bus/USB/EHCI/EHCIController.cpp b/Kernel/Bus/USB/EHCI/EHCIController.cpp index abc6934375..43b9c41445 100644 --- a/Kernel/Bus/USB/EHCI/EHCIController.cpp +++ b/Kernel/Bus/USB/EHCI/EHCIController.cpp @@ -5,6 +5,7 @@ */ #include +#include #include namespace Kernel::USB::EHCI { @@ -13,14 +14,9 @@ ErrorOr> EHCIController::try_to_initialize(con { // FIXME: This assumes the BIOS left us a physical region for the controller - u64 pci_bar_value = PCI::get_BAR(pci_device_identifier, SpaceBaseAddressRegister); - auto pci_bar_space_type = PCI::get_BAR_space_type(pci_bar_value); - if (pci_bar_space_type == PCI::BARSpaceType::Memory64BitSpace) { - u64 next_pci_bar_value = PCI::get_BAR(pci_device_identifier, static_cast(to_underlying(SpaceBaseAddressRegister) + 1)); - pci_bar_value |= next_pci_bar_value << 32; - } + auto pci_bar_address = TRY(PCI::get_bar_address(pci_device_identifier, SpaceBaseAddressRegister)); auto pci_bar_space_size = PCI::get_BAR_space_size(pci_device_identifier, SpaceBaseAddressRegister); - auto register_region = TRY(MM.allocate_kernel_region(PhysicalAddress { pci_bar_value }, pci_bar_space_size, {}, Memory::Region::Access::ReadWrite)); + auto register_region = TRY(MM.allocate_kernel_region(pci_bar_address, pci_bar_space_size, {}, Memory::Region::Access::ReadWrite)); PCI::enable_bus_mastering(pci_device_identifier); PCI::enable_memory_space(pci_device_identifier); diff --git a/Kernel/Devices/GPU/3dfx/GraphicsAdapter.cpp b/Kernel/Devices/GPU/3dfx/GraphicsAdapter.cpp index 74c2079239..4a5f665ac4 100644 --- a/Kernel/Devices/GPU/3dfx/GraphicsAdapter.cpp +++ b/Kernel/Devices/GPU/3dfx/GraphicsAdapter.cpp @@ -5,6 +5,7 @@ */ #include +#include #include #include #include @@ -50,12 +51,10 @@ UNMAP_AFTER_INIT ErrorOr VoodooGraphicsAdapter::initialize_adapter(PCI::De PCI::enable_io_space(device_identifier()); PCI::enable_memory_space(device_identifier()); - auto mmio_addr = PhysicalAddress(PCI::get_BAR0(pci_device_identifier) & PCI::bar_address_mask); - auto mmio_size = PCI::get_BAR_space_size(pci_device_identifier, PCI::HeaderType0BaseRegister::BAR0); - dbgln_if(TDFX_DEBUG, "3dfx mmio addr {} size {}", mmio_addr, mmio_size); - auto mmio_mapping = TRY(Memory::map_typed(mmio_addr, mmio_size, Memory::Region::Access::Read | Memory::Region::Access::Write)); + auto mmio_mapping = TRY(PCI::map_bar(pci_device_identifier, PCI::HeaderType0BaseRegister::BAR0)); + dbgln_if(TDFX_DEBUG, "3dfx mmio addr {} size {}", mmio_mapping.paddr, mmio_mapping.length); - auto vmem_addr = PhysicalAddress(PCI::get_BAR1(pci_device_identifier) & PCI::bar_address_mask); + auto vmem_addr = TRY(PCI::get_bar_address(pci_device_identifier, PCI::HeaderType0BaseRegister::BAR1)); auto vmem_size = PCI::get_BAR_space_size(pci_device_identifier, PCI::HeaderType0BaseRegister::BAR1); dbgln_if(TDFX_DEBUG, "3dfx vmem addr {} size {}", vmem_addr, vmem_size); diff --git a/Kernel/Devices/GPU/Bochs/GraphicsAdapter.cpp b/Kernel/Devices/GPU/Bochs/GraphicsAdapter.cpp index 3255719e46..addde186c3 100644 --- a/Kernel/Devices/GPU/Bochs/GraphicsAdapter.cpp +++ b/Kernel/Devices/GPU/Bochs/GraphicsAdapter.cpp @@ -11,6 +11,7 @@ # include #endif #include +#include #include #include #include @@ -56,16 +57,16 @@ UNMAP_AFTER_INIT ErrorOr BochsGraphicsAdapter::initialize_adapter(PCI::Dev #if ARCH(X86_64) bool virtual_box_hardware = (pci_device_identifier.hardware_id().vendor_id == 0x80ee && pci_device_identifier.hardware_id().device_id == 0xbeef); if (pci_device_identifier.revision_id().value() == 0x0 || virtual_box_hardware) { - m_display_connector = BochsDisplayConnector::must_create(PhysicalAddress(PCI::get_BAR0(pci_device_identifier) & PCI::bar_address_mask), bar0_space_size, virtual_box_hardware); + m_display_connector = BochsDisplayConnector::must_create(PhysicalAddress(TRY(PCI::get_bar_address(pci_device_identifier, PCI::HeaderType0BaseRegister::BAR0))), bar0_space_size, virtual_box_hardware); } else { - auto registers_mapping = TRY(Memory::map_typed_writable(PhysicalAddress(PCI::get_BAR2(pci_device_identifier) & PCI::bar_address_mask))); + auto registers_mapping = TRY(PCI::map_bar(pci_device_identifier, PCI::HeaderType0BaseRegister::BAR2)); VERIFY(registers_mapping.region); - m_display_connector = QEMUDisplayConnector::must_create(PhysicalAddress(PCI::get_BAR0(pci_device_identifier) & PCI::bar_address_mask), bar0_space_size, move(registers_mapping)); + m_display_connector = QEMUDisplayConnector::must_create(PhysicalAddress(TRY(PCI::get_bar_address(pci_device_identifier, PCI::HeaderType0BaseRegister::BAR0))), bar0_space_size, move(registers_mapping)); } #else - auto registers_mapping = TRY(Memory::map_typed_writable(PhysicalAddress(PCI::get_BAR2(pci_device_identifier) & PCI::bar_address_mask))); + auto registers_mapping = TRY(PCI::map_bar(pci_device_identifier, PCI::HeaderType0BaseRegister::BAR2)); VERIFY(registers_mapping.region); - m_display_connector = QEMUDisplayConnector::must_create(PhysicalAddress(PCI::get_BAR0(pci_device_identifier) & PCI::bar_address_mask), bar0_space_size, move(registers_mapping)); + m_display_connector = QEMUDisplayConnector::must_create(PhysicalAddress(TRY(PCI::get_bar_address(pci_device_identifier, PCI::HeaderType0BaseRegister::BAR0))), bar0_space_size, move(registers_mapping)); #endif // Note: According to Gerd Hoffmann - "The linux driver simply does diff --git a/Kernel/Devices/GPU/Intel/NativeGraphicsAdapter.cpp b/Kernel/Devices/GPU/Intel/NativeGraphicsAdapter.cpp index 326c9049a9..cc61f2294a 100644 --- a/Kernel/Devices/GPU/Intel/NativeGraphicsAdapter.cpp +++ b/Kernel/Devices/GPU/Intel/NativeGraphicsAdapter.cpp @@ -5,6 +5,7 @@ */ #include +#include #include #include #include @@ -42,13 +43,15 @@ ErrorOr IntelNativeGraphicsAdapter::initialize_adapter() { dbgln_if(INTEL_GRAPHICS_DEBUG, "Intel Native Graphics Adapter @ {}", device_identifier().address()); auto bar0_space_size = PCI::get_BAR_space_size(device_identifier(), PCI::HeaderType0BaseRegister::BAR0); + auto bar0_space_address = TRY(PCI::get_bar_address(device_identifier(), PCI::HeaderType0BaseRegister::BAR0)); auto bar2_space_size = PCI::get_BAR_space_size(device_identifier(), PCI::HeaderType0BaseRegister::BAR2); - dmesgln_pci(*this, "MMIO @ {}, space size is {:x} bytes", PhysicalAddress(PCI::get_BAR0(device_identifier())), bar0_space_size); - dmesgln_pci(*this, "framebuffer @ {}", PhysicalAddress(PCI::get_BAR2(device_identifier()))); + auto bar2_space_address = TRY(PCI::get_bar_address(device_identifier(), PCI::HeaderType0BaseRegister::BAR2)); + dmesgln_pci(*this, "MMIO @ {}, space size is {:x} bytes", bar0_space_address, bar0_space_size); + dmesgln_pci(*this, "framebuffer @ {}", bar2_space_address); using MMIORegion = IntelDisplayConnectorGroup::MMIORegion; - MMIORegion first_region { MMIORegion::BARAssigned::BAR0, PhysicalAddress(PCI::get_BAR0(device_identifier()) & PCI::bar_address_mask), bar0_space_size }; - MMIORegion second_region { MMIORegion::BARAssigned::BAR2, PhysicalAddress(PCI::get_BAR2(device_identifier()) & PCI::bar_address_mask), bar2_space_size }; + MMIORegion first_region { MMIORegion::BARAssigned::BAR0, bar0_space_address, bar0_space_size }; + MMIORegion second_region { MMIORegion::BARAssigned::BAR2, bar2_space_address, bar2_space_size }; PCI::enable_bus_mastering(device_identifier()); PCI::enable_io_space(device_identifier()); diff --git a/Kernel/Devices/GPU/VMWare/GraphicsAdapter.cpp b/Kernel/Devices/GPU/VMWare/GraphicsAdapter.cpp index c0a5921586..57b2c72b29 100644 --- a/Kernel/Devices/GPU/VMWare/GraphicsAdapter.cpp +++ b/Kernel/Devices/GPU/VMWare/GraphicsAdapter.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -69,7 +70,7 @@ UNMAP_AFTER_INIT ErrorOr VMWareGraphicsAdapter::initialize_fifo_registers( { auto framebuffer_size = read_io_register(VMWareDisplayRegistersOffset::FB_SIZE); auto fifo_size = read_io_register(VMWareDisplayRegistersOffset::MEM_SIZE); - auto fifo_physical_address = PhysicalAddress(PCI::get_BAR2(device_identifier()) & PCI::bar_address_mask); + auto fifo_physical_address = TRY(PCI::get_bar_address(device_identifier(), PCI::HeaderType0BaseRegister::BAR2)); dbgln("VMWare SVGA @ {}: framebuffer size {} bytes, FIFO size {} bytes @ {}", device_identifier().address(), framebuffer_size, fifo_size, fifo_physical_address); if (framebuffer_size < 0x100000 || fifo_size < 0x10000) { @@ -77,7 +78,7 @@ UNMAP_AFTER_INIT ErrorOr VMWareGraphicsAdapter::initialize_fifo_registers( return Error::from_errno(ENOTSUP); } - m_fifo_registers = TRY(Memory::map_typed(fifo_physical_address, fifo_size, Memory::Region::Access::ReadWrite)); + m_fifo_registers = TRY(PCI::map_bar(device_identifier(), PCI::HeaderType0BaseRegister::BAR2, fifo_size)); m_fifo_registers->start = 16; m_fifo_registers->size = 16 + (10 * 1024); m_fifo_registers->next_command = 16; @@ -185,7 +186,7 @@ UNMAP_AFTER_INIT ErrorOr VMWareGraphicsAdapter::initialize_adapter() auto bar1_space_size = PCI::get_BAR_space_size(device_identifier(), PCI::HeaderType0BaseRegister::BAR1); - m_display_connector = VMWareDisplayConnector::must_create(*this, PhysicalAddress(PCI::get_BAR1(device_identifier()) & PCI::bar_address_mask), bar1_space_size); + m_display_connector = VMWareDisplayConnector::must_create(*this, TRY(PCI::get_bar_address(device_identifier(), PCI::HeaderType0BaseRegister::BAR1)), bar1_space_size); TRY(m_display_connector->set_safe_mode_setting()); return {}; } diff --git a/Kernel/Devices/Storage/ATA/AHCI/Controller.cpp b/Kernel/Devices/Storage/ATA/AHCI/Controller.cpp index 54709aea19..4345eb65b2 100644 --- a/Kernel/Devices/Storage/ATA/AHCI/Controller.cpp +++ b/Kernel/Devices/Storage/ATA/AHCI/Controller.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -154,7 +155,7 @@ UNMAP_AFTER_INIT AHCI::HBADefinedCapabilities AHCIController::capabilities() con UNMAP_AFTER_INIT ErrorOr> AHCIController::map_default_hba_region(PCI::DeviceIdentifier const& pci_device_identifier) { - return Memory::map_typed_writable(PhysicalAddress(PCI::get_BAR5(pci_device_identifier))); + return PCI::map_bar(pci_device_identifier, PCI::HeaderType0BaseRegister::BAR5); } AHCIController::~AHCIController() = default;