#include #include #include "acpi.h" #define ACPI_NS_ROOT_PATH "\\" #define ACPI_NS_SYSTEM_BUS "_SB_" enum acpi_irq_model_id { ACPI_IRQ_MODEL_PIC = 0, ACPI_IRQ_MODEL_IOAPIC, ACPI_IRQ_MODEL_IOSAPIC, ACPI_IRQ_MODEL_PLATFORM, ACPI_IRQ_MODEL_COUNT }; #define addr_offset(addr, off) \ (addr_t)((addr_t)(addr) + (addr_t)(off)) //#define acpi_remap( addr ) \ // (addr_t)((addr_t)(addr) + OS_BASE) #define acpi_remap( addr ) MapIoMem((void*)(addr),4096, 0x01) ACPI_STATUS get_device_by_hid_callback(ACPI_HANDLE obj, u32_t depth, void* context, void** retval) { static u32_t counter = 0; static char buff[256]; ACPI_STATUS status; ACPI_BUFFER buffer; ACPI_DEVICE_INFO *info; // *retval = NULL; buffer.Length = 255; buffer.Pointer = buff; status = AcpiGetName(obj, ACPI_FULL_PATHNAME, &buffer); if (status != AE_OK) { return AE_CTRL_TERMINATE; } buff[buffer.Length] = '\0'; dbgprintf("device %d %s ", counter, buff); status = AcpiGetObjectInfo(obj, &info); if (ACPI_SUCCESS (status)) { if (info->Valid & ACPI_VALID_HID) dbgprintf (" HID: %s", info->HardwareId.String); }; dbgprintf("\n"); counter++; return AE_OK; } prt_walk_table(ACPI_BUFFER *prt) { ACPI_PCI_ROUTING_TABLE *entry; char *prtptr; /* First check to see if there is a table to walk. */ if (prt == NULL || prt->Pointer == NULL) return; /* Walk the table executing the handler function for each entry. */ prtptr = prt->Pointer; entry = (ACPI_PCI_ROUTING_TABLE *)prtptr; while (entry->Length != 0) { dbgprintf("adress: %x %x ", (u32_t)(entry->Address>>32), (u32_t)entry->Address); dbgprintf("pin: %d index: %d source: %s\n", entry->Pin, entry->SourceIndex, entry->Source); // handler(entry, arg); prtptr += entry->Length; entry = (ACPI_PCI_ROUTING_TABLE *)prtptr; } } u32_t drvEntry(int action, char *cmdline) { u32_t retval; ACPI_STATUS status; int i; if(action != 1) return 0; status = AcpiReallocateRootTable(); if (ACPI_FAILURE(status)) { dbgprintf("Unable to reallocate ACPI tables\n"); goto err; } status = AcpiInitializeSubsystem(); if (status != AE_OK) { dbgprintf("AcpiInitializeSubsystem failed (%s)\n", AcpiFormatException(status)); goto err; } status = AcpiInitializeTables(NULL, 0, TRUE); if (status != AE_OK) { dbgprintf("AcpiInitializeTables failed (%s)\n", AcpiFormatException(status)); goto err; } status = AcpiLoadTables(); if (status != AE_OK) { dbgprintf("AcpiLoadTables failed (%s)\n", AcpiFormatException(status)); goto err; } u32_t mode = ACPI_NO_HARDWARE_INIT | ACPI_NO_ACPI_ENABLE; status = AcpiEnableSubsystem(mode); if (status != AE_OK) { dbgprintf("AcpiEnableSubsystem failed (%s)\n", AcpiFormatException(status)); goto err; } status = AcpiInitializeObjects (ACPI_FULL_INITIALIZATION); if (ACPI_FAILURE (status)) { dbgprintf("AcpiInitializeObjects failed (%s)\n", AcpiFormatException(status)); goto err; } AcpiWalkNamespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, 4, get_device_by_hid_callback, NULL, NULL, NULL); #if 0 ACPI_OBJECT obj; ACPI_HANDLE bus_handle; ACPI_HANDLE pci_root; status = AcpiGetHandle(0, "\\_SB_", &bus_handle); dbgprintf("system bus handle %x\n", bus_handle); status = AcpiGetHandle(bus_handle, "PCI0", &pci_root); if (status != AE_OK) { dbgprintf("AcpiGetHandle failed (%s)\n", AcpiFormatException(status)); goto err; } dbgprintf("pci root handle %x\n\n", pci_root); ACPI_BUFFER prt_buffer; prt_buffer.Length = ACPI_ALLOCATE_BUFFER; prt_buffer.Pointer = NULL; status = AcpiGetIrqRoutingTable(pci_root, &prt_buffer); if (status != AE_OK) { dbgprintf("AcpiGetIrqRoutingTable failed (%s)\n", AcpiFormatException(status)); goto err; } prt_walk_table(&prt_buffer); ACPI_OBJECT arg = { ACPI_TYPE_INTEGER }; ACPI_OBJECT_LIST arg_list = { 1, &arg }; arg.Integer.Value = ACPI_IRQ_MODEL_IOAPIC; dbgprintf("\nset ioapic mode\n\n"); status = AcpiEvaluateObject(NULL, "\\_PIC", &arg_list, NULL); if (ACPI_FAILURE(status)) { dbgprintf("AcpiEvaluateObject failed (%s)\n", AcpiFormatException(status)); // goto err; } status = AcpiGetIrqRoutingTable(pci_root, &prt_buffer); if (status != AE_OK) { dbgprintf("AcpiGetIrqRoutingTable failed (%s)\n", AcpiFormatException(status)); goto err; } prt_walk_table(&prt_buffer); u8_t pin = PciRead8 (0, (31<<3) | 1, 0x3D); dbgprintf("bus 0 device 31 function 1 pin %d\n", pin-1); pin = PciRead8 (0, (31<<3) | 2, 0x3D); dbgprintf("bus 0 device 31 function 2 pin %d\n", pin-1); pin = PciRead8 (0, (31<<3) | 3, 0x3D); dbgprintf("bus 0 device 31 function 3 pin %d\n", pin-1); pin = PciRead8 (0, (31<<3) | 4, 0x3D); dbgprintf("bus 0 device 31 function 4 pin %d\n", pin-1); pin = PciRead8 (0, (31<<3) | 5, 0x3D); dbgprintf("bus 0 device 31 function 5 pin %d\n", pin-1); pin = PciRead8 (0, (31<<3) | 6, 0x3D); dbgprintf("bus 0 device 31 function 6 pin %d\n", pin-1); pin = PciRead8 (0, (31<<3) | 7, 0x3D); dbgprintf("bus 0 device 31 function 7 pin %d\n", pin-1); #endif err: return 0; };