arm64: Use ACPI for PCI interrupt routing.
Change-Id: I4bf578aacda1be44cf5b8f95681a57ab5eabda23 Reviewed-on: https://review.haiku-os.org/c/haiku/+/5278 Tested-by: Commit checker robot <no-reply+buildbot@haiku-os.org> Reviewed-by: David Karoly <karolyd577@gmail.com> Reviewed-by: Fredrik Holmqvist <fredrik.holmqvist@gmail.com>
This commit is contained in:
parent
6bef283b50
commit
22cfe80c83
@ -6,6 +6,8 @@ UsePrivateKernelHeaders ;
|
||||
UsePrivateHeaders kernel [ FDirName kernel arch $(TARGET_ARCH) ]
|
||||
[ FDirName kernel boot platform $(HAIKU_BOOT_PLATFORM) ] ;
|
||||
|
||||
SubDirHdrs $(HAIKU_TOP) src system kernel arch generic ;
|
||||
|
||||
SEARCH_SOURCE += [ FDirName $(SUBDIR) $(DOTDOT) generic ] ;
|
||||
|
||||
KernelStaticLibrary pci_arch_bus_manager :
|
||||
|
@ -7,6 +7,7 @@
|
||||
#include "pci_controller.h"
|
||||
|
||||
#include <kernel/debug.h>
|
||||
#include <kernel/int.h>
|
||||
#include <util/Vector.h>
|
||||
|
||||
#include <AutoDeleterDrivers.h>
|
||||
@ -16,6 +17,8 @@
|
||||
#include <ACPI.h> // module
|
||||
#include <acpi.h>
|
||||
|
||||
#include "acpi_irq_routing_table.h"
|
||||
|
||||
|
||||
addr_t gPCIeBase;
|
||||
uint8 gStartBusNumber;
|
||||
@ -92,6 +95,13 @@ AcpiCrsScanCallback(acpi_resource *res, void *context)
|
||||
}
|
||||
|
||||
|
||||
static bool
|
||||
is_interrupt_available(int32 gsi)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
status_t
|
||||
pci_controller_init(void)
|
||||
{
|
||||
@ -191,6 +201,38 @@ pci_controller_init(void)
|
||||
}
|
||||
|
||||
|
||||
status_t
|
||||
pci_controller_finalize(void)
|
||||
{
|
||||
status_t res;
|
||||
|
||||
acpi_module_info *acpiModule;
|
||||
res = get_module(B_ACPI_MODULE_NAME, (module_info**)&acpiModule);
|
||||
if (res != B_OK)
|
||||
return B_ERROR;
|
||||
|
||||
IRQRoutingTable table;
|
||||
res = prepare_irq_routing(acpiModule, table, &is_interrupt_available);
|
||||
if (res != B_OK) {
|
||||
dprintf("PCI: irq routing preparation failed\n");
|
||||
return B_ERROR;
|
||||
}
|
||||
|
||||
for (Vector<irq_routing_entry>::Iterator it = table.Begin(); it != table.End(); it++)
|
||||
reserve_io_interrupt_vectors(1, it->irq, INTERRUPT_TYPE_IRQ);
|
||||
|
||||
res = enable_irq_routing(acpiModule, table);
|
||||
if (res != B_OK) {
|
||||
dprintf("PCI: irq routing failed\n");
|
||||
return B_ERROR;
|
||||
}
|
||||
|
||||
print_irq_routing_table(table);
|
||||
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
|
||||
phys_addr_t
|
||||
pci_ram_address(phys_addr_t addr)
|
||||
{
|
||||
|
@ -476,6 +476,9 @@ pcirefresh(int argc, char **argv)
|
||||
static bool sInitDone;
|
||||
|
||||
|
||||
status_t __attribute__((weak)) pci_controller_finalize() { return B_OK; }
|
||||
|
||||
|
||||
status_t
|
||||
pci_init_deferred(void)
|
||||
{
|
||||
@ -516,6 +519,11 @@ pci_init_deferred(void)
|
||||
add_debugger_command("pcistatus", &pcistatus, "dump and clear pci device status registers");
|
||||
add_debugger_command("pcirefresh", &pcirefresh, "refresh and print all pci_info");
|
||||
|
||||
if (pci_controller_finalize() != B_OK) {
|
||||
TRACE(("PCI: pci_controller_finalize failed\n"));
|
||||
return B_ERROR;
|
||||
}
|
||||
|
||||
sInitDone = true;
|
||||
return B_OK;
|
||||
}
|
||||
|
@ -38,6 +38,7 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
status_t pci_controller_init(void);
|
||||
status_t pci_controller_finalize(void);
|
||||
status_t pci_controller_add(pci_controller *controller, void *cookie);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
@ -1,5 +1,6 @@
|
||||
SubDir HAIKU_TOP src system kernel arch arm64 ;
|
||||
|
||||
SubDirHdrs $(HAIKU_TOP) src add-ons kernel bus_managers acpi acpica include ;
|
||||
SubDirHdrs $(SUBDIR) $(DOTDOT) generic ;
|
||||
UsePrivateKernelHeaders ;
|
||||
|
||||
@ -25,6 +26,7 @@ KernelMergeObject kernel_arch_arm64.o :
|
||||
arch_asm.S
|
||||
arch_int_gicv2.cpp
|
||||
soc.cpp
|
||||
acpi_irq_routing_table.cpp
|
||||
|
||||
VMSAv8TranslationMap.cpp
|
||||
PMAPPhysicalPageMapper.cpp
|
||||
|
Loading…
x
Reference in New Issue
Block a user