From 5d9cc10f80057d28c9dd0131e85f2b6ef5687fe3 Mon Sep 17 00:00:00 2001 From: Fredrik Holmqvist Date: Thu, 22 Apr 2010 16:19:41 +0000 Subject: [PATCH] Moving ACPI Embedded Controller to ACPI bus manager. * Removed irq_routing struct from ACPI.h to where it is used. Might be able to use acrestype.h instead of duplication. * Disable old embedded controller and remove it from image. * Move embedded controller code to busmanager module. * Remove (some) code duplication Should work as before, but is now initialized right after the bus manager. Can probably remove further code duplication. I hope I've done it correctly, feedback is most welcome. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36420 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- build/jam/HaikuImage | 3 +- headers/os/drivers/ACPI.h | 30 -------- src/add-ons/kernel/bus_managers/acpi/Jamfile | 14 +--- .../acpi}/SmallResourceData.cpp | 0 .../acpi}/SmallResourceData.h | 0 .../acpi}/acpi_embedded_controller.cpp | 62 ++++----------- .../acpi}/acpi_embedded_controller.h | 75 ++----------------- .../kernel/bus_managers/acpi/acpi_module.c | 2 + .../kernel/bus_managers/acpi/acpi_priv.h | 5 ++ src/add-ons/kernel/drivers/power/Jamfile | 1 - .../kernel/arch/x86/irq_routing_table.h | 12 +++ 11 files changed, 46 insertions(+), 158 deletions(-) rename src/add-ons/kernel/{drivers/power/acpi_embedded_controller => bus_managers/acpi}/SmallResourceData.cpp (100%) rename src/add-ons/kernel/{drivers/power/acpi_embedded_controller => bus_managers/acpi}/SmallResourceData.h (100%) rename src/add-ons/kernel/{drivers/power/acpi_embedded_controller => bus_managers/acpi}/acpi_embedded_controller.cpp (95%) rename src/add-ons/kernel/{drivers/power/acpi_embedded_controller => bus_managers/acpi}/acpi_embedded_controller.h (85%) diff --git a/build/jam/HaikuImage b/build/jam/HaikuImage index fb41548301..9a845dfc3e 100644 --- a/build/jam/HaikuImage +++ b/build/jam/HaikuImage @@ -119,6 +119,8 @@ SYSTEM_ADD_ONS_ACCELERANTS = $(X86_ONLY)radeon.accelerant $(X86_ONLY)ati.accelerant #$(X86_ONLY)via.accelerant #$(X86_ONLY)vmware.accelerant + #$(X86_ONLY)radeonhd.accelerant + ; SYSTEM_ADD_ONS_TRANSLATORS = BMPTranslator EXRTranslator GIFTranslator HVIFTranslator ICOTranslator JPEGTranslator JPEG2000Translator @@ -241,7 +243,6 @@ if $(TARGET_ARCH) = x86 { AddNewDriversToHaikuImage disk scsi : scsi_cd scsi_disk ; AddNewDriversToHaikuImage power : $(X86_ONLY)enhanced_speedstep ; AddNewDriversToHaikuImage power : $(X86_ONLY)acpi_battery ; -AddNewDriversToHaikuImage power : $(X86_ONLY)acpi_embedded_controller ; # legacy drivers AddDriversToHaikuImage : console dprintf null diff --git a/headers/os/drivers/ACPI.h b/headers/os/drivers/ACPI.h index 8f0d77aeeb..524fb189fd 100644 --- a/headers/os/drivers/ACPI.h +++ b/headers/os/drivers/ACPI.h @@ -131,39 +131,9 @@ enum { */ typedef uint32 acpi_status; -#define AE_CODE_PROGRAMMER 0x1000 - -#define AE_OK 0x0000 -#define AE_ERROR 0x0001 -#define AE_NOT_ACQUIRED 0x0014 -#define AE_NO_HARDWARE_RESPONSE 0x0016 -#define AE_BAD_PARAMETER (0x0001 | AE_CODE_PROGRAMMER) -#define AE_BAD_ADDRESS (0x0009 | AE_CODE_PROGRAMMER) - -#else -#error "Our ACPI.h uses different naming than actypes.h.\n" \\ - "If you need actypes.h this probably needs updating." - #endif // __ACTYPES_H__ -#ifndef __ACRESTYP_H__ - - -typedef struct acpi_prt -{ - uint32 length; - uint32 pin; - int address; /* here for 64-bit alignment */ - uint32 sourceIndex; - char source[4]; /* pad to 64 bits so sizeof() works in - all cases */ -} acpi_pci_routing_table; - - -#endif // __ACRESTYP_H__ - - typedef uint32 (*acpi_event_handler)(void *Context); typedef acpi_status (*acpi_adr_space_handler)(uint32 function, diff --git a/src/add-ons/kernel/bus_managers/acpi/Jamfile b/src/add-ons/kernel/bus_managers/acpi/Jamfile index b48e9b2155..35723a1701 100644 --- a/src/add-ons/kernel/bus_managers/acpi/Jamfile +++ b/src/add-ons/kernel/bus_managers/acpi/Jamfile @@ -131,7 +131,7 @@ local tables_src = tbfadt.c tbfind.c tbinstal.c - #tbutils.c + tbutils.c tbxface.c tbxfroot.c ; @@ -170,16 +170,6 @@ StaticLibrary libacpi_ca.a : $(utilities_src) ; - -# this is a workaround for an optimization bug in our GCC4 with -O1 and -O2, this should be dropped when we upgrade -#oldOPTIM = $(OPTIM) ; -#OPTIM = -O3 ; -StaticLibrary libacpi_ca.a : - tbutils.c -; - -#OPTIM = $(oldOPTIM) ; - SEARCH on [ FGristFiles $(events_src) ] = [ FDirName $(HAIKU_TOP) src add-ons kernel bus_managers acpi events ] ; SEARCH on [ FGristFiles $(hardware_src) ] = [ FDirName $(HAIKU_TOP) src add-ons kernel bus_managers acpi hardware ] ; SEARCH on [ FGristFiles $(namespace_src) ] = [ FDirName $(HAIKU_TOP) src add-ons kernel bus_managers acpi namespace ] ; @@ -196,6 +186,8 @@ KernelAddon acpi : acpi_module.c acpi_device.c acpi_ns_dump.cpp + acpi_embedded_controller.cpp + SmallResourceData.cpp : libacpi_ca.a ; diff --git a/src/add-ons/kernel/drivers/power/acpi_embedded_controller/SmallResourceData.cpp b/src/add-ons/kernel/bus_managers/acpi/SmallResourceData.cpp similarity index 100% rename from src/add-ons/kernel/drivers/power/acpi_embedded_controller/SmallResourceData.cpp rename to src/add-ons/kernel/bus_managers/acpi/SmallResourceData.cpp diff --git a/src/add-ons/kernel/drivers/power/acpi_embedded_controller/SmallResourceData.h b/src/add-ons/kernel/bus_managers/acpi/SmallResourceData.h similarity index 100% rename from src/add-ons/kernel/drivers/power/acpi_embedded_controller/SmallResourceData.h rename to src/add-ons/kernel/bus_managers/acpi/SmallResourceData.h diff --git a/src/add-ons/kernel/drivers/power/acpi_embedded_controller/acpi_embedded_controller.cpp b/src/add-ons/kernel/bus_managers/acpi/acpi_embedded_controller.cpp similarity index 95% rename from src/add-ons/kernel/drivers/power/acpi_embedded_controller/acpi_embedded_controller.cpp rename to src/add-ons/kernel/bus_managers/acpi/acpi_embedded_controller.cpp index 1bf926a91e..39c5446a29 100644 --- a/src/add-ons/kernel/drivers/power/acpi_embedded_controller/acpi_embedded_controller.cpp +++ b/src/add-ons/kernel/bus_managers/acpi/acpi_embedded_controller.cpp @@ -33,7 +33,6 @@ #include #include -#include #include #include #include @@ -51,13 +50,10 @@ // name of pnp generator of path ids #define ACPI_EC_PATHID_GENERATOR "embedded_controller/path_id" -device_manager_info *gDeviceManager = NULL; -pci_module_info *gPCIManager = NULL; - // cpu frequency in Hz int64 gHz; - - + + uint8 bus_space_read_1(int address) { @@ -80,7 +76,7 @@ acpi_GetInteger(acpi_device_module_info* acpi, acpi_device& acpiCookie, acpi_object_type object; buf.pointer = &object; buf.length = sizeof(acpi_object_type); - + /* * Assume that what we've been pointed at is an Integer object, or * a method that will return an Integer. @@ -211,7 +207,7 @@ acpi_get_type(device_node* dev) const char *bus; if (gDeviceManager->get_attr_string(dev, B_DEVICE_BUS, &bus, false)) return -1; - + if (strcmp(bus, "acpi")) return -1; @@ -230,14 +226,16 @@ embedded_controller_support(device_node* dev) static const char* ec_ids[] = { "PNP0C09", NULL }; /* Check that this is a device. */ + TRACE("before acpi_get_type..."); if (acpi_get_type(dev) != ACPI_TYPE_DEVICE) return 0.0; - + const char* name; + if (gDeviceManager->get_attr_string(dev, ACPI_DEVICE_HID_ITEM, &name, false) != B_OK || strcmp(name, ec_ids[0])) return 0.0; - + TRACE("after\n"); TRACE("supported device found %s\n", name); return 0.6; } @@ -293,21 +291,6 @@ embedded_controller_init_driver(device_node* dev, void** _driverCookie) != B_OK) return B_ERROR; - // DPC module - if (gDPC == NULL && get_module(B_DPC_MODULE_NAME, (module_info**) &gDPC) - != B_OK) { - dprintf("failed to get dpc module for os execution\n"); - return B_ERROR; - } - - if (gDPCHandle == NULL) { - if (gDPC->new_dpc_queue(&gDPCHandle, "acpi_task", B_NORMAL_PRIORITY) - != B_OK) { - dprintf("failed to create os execution queue\n"); - return B_ERROR; - } - } - acpi_data buf; buf.pointer = NULL; buf.length = ACPI_ALLOCATE_BUFFER; @@ -431,9 +414,6 @@ embedded_controller_uninit_driver(void* driverCookie) mutex_destroy(&sc->ec_lock); free(sc); put_module(B_ACPI_MODULE_NAME); - put_module(B_DPC_MODULE_NAME); - gDPC = NULL; - gDPCHandle = NULL; } @@ -470,13 +450,6 @@ embedded_controller_uninit_device(void* _cookie) } -module_dependency module_dependencies[] = { - { B_DEVICE_MANAGER_MODULE_NAME, (module_info **) &gDeviceManager }, - { B_PCI_MODULE_NAME, (module_info **) &gPCIManager}, - {} -}; - - driver_module_info embedded_controller_driver_module = { { ACPI_EC_DRIVER_NAME, @@ -518,13 +491,6 @@ struct device_module_info embedded_controller_device_module = { }; -module_info* modules[] = { - (module_info*) &embedded_controller_driver_module, - (module_info*) &embedded_controller_device_module, - NULL -}; - - static void EcGpeQueryHandler(void* context) { @@ -606,9 +572,9 @@ EcGpeHandler(void* context) EC_STATUS EcStatus = EC_GET_CSR(sc); if ((EcStatus & EC_EVENT_SCI) && !sc->ec_sci_pending) { TRACE("gpe queueing query handler\n"); - status_t status = AcpiOsExecute(OSL_GPE_HANDLER, EcGpeQueryHandler, + ACPI_STATUS s = AcpiOsExecute(OSL_GPE_HANDLER, EcGpeQueryHandler, context); - if (status == B_OK) + if (s == AE_OK) sc->ec_sci_pending = TRUE; else dprintf("EcGpeHandler: queuing GPE query handler failed\n"); @@ -720,7 +686,7 @@ EcWaitEvent(struct acpi_ec_cookie* sc, EC_EVENT event, int32 gen_count) { acpi_status status = AE_NO_HARDWARE_RESPONSE; int32 count, i; - + // int need_poll = cold || rebooting || ec_polled_mode || sc->ec_suspending; int need_poll = ec_polled_mode || sc->ec_suspending; @@ -770,7 +736,7 @@ EcWaitEvent(struct acpi_ec_cookie* sc, EC_EVENT event, int32 gen_count) } count = ec_timeout; - + /* * Wait for the GPE to signal the status changed, checking the * status register each time we get one. It's possible to get a @@ -876,7 +842,7 @@ EcRead(struct acpi_ec_cookie* sc, uint8 address, uint8* readData) return status; u_int gen_count = sc->ec_gencount; - + EC_SET_DATA(sc, address); status = EcWaitEvent(sc, EC_EVENT_OUTPUT_BUFFER_FULL, gen_count); if (status != AE_OK) { @@ -884,7 +850,7 @@ EcRead(struct acpi_ec_cookie* sc, uint8 address, uint8* readData) return status; } *readData = EC_GET_DATA(sc); - + if (sc->ec_burstactive) { sc->ec_burstactive = FALSE; status = EcCommand(sc, EC_COMMAND_BURST_DISABLE); diff --git a/src/add-ons/kernel/drivers/power/acpi_embedded_controller/acpi_embedded_controller.h b/src/add-ons/kernel/bus_managers/acpi/acpi_embedded_controller.h similarity index 85% rename from src/add-ons/kernel/drivers/power/acpi_embedded_controller/acpi_embedded_controller.h rename to src/add-ons/kernel/bus_managers/acpi/acpi_embedded_controller.h index b5e68beba9..5b85481b29 100644 --- a/src/add-ons/kernel/drivers/power/acpi_embedded_controller/acpi_embedded_controller.h +++ b/src/add-ons/kernel/bus_managers/acpi/acpi_embedded_controller.h @@ -33,11 +33,18 @@ #include #include -#include + #include #include #include +extern "C" { +#include "acpi.h" +#include "accommon.h" +#include "acnamesp.h" +#include "acpi_priv.h" +} + // #define TRACE_EMBEDDED_CONTROLLER #ifdef TRACE_EMBEDDED_CONTROLLER # define TRACE(x...) dprintf("EC: " x) @@ -46,72 +53,6 @@ #endif -dpc_module_info *gDPC = NULL; -void *gDPCHandle = NULL; - - -#define ACPI_GPE_EDGE_TRIGGERED (uint8) 0x00 -#define ACPI_GPE_TYPE_RUNTIME (uint8) 0x04 /* Default */ - -#define ACPI_NOT_ISR 0x1 -#define ACPI_ISR 0x0 - -enum { - OSL_GLOBAL_LOCK_HANDLER, - OSL_NOTIFY_HANDLER, - OSL_GPE_HANDLER, - OSL_DEBUGGER_THREAD, - OSL_EC_POLL_HANDLER, - OSL_EC_BURST_HANDLER -}; - -typedef void (*ACPI_OSD_EXEC_CALLBACK)(void* Context); - - -// ToDo: Maybe also put this acpi function into the acpi module? -status_t -AcpiOsExecute(uint32 Type, ACPI_OSD_EXEC_CALLBACK Function, - void *Context) -{ - switch (Type) { - case OSL_GLOBAL_LOCK_HANDLER: - case OSL_NOTIFY_HANDLER: - case OSL_GPE_HANDLER: - case OSL_DEBUGGER_THREAD: - case OSL_EC_POLL_HANDLER: - case OSL_EC_BURST_HANDLER: - break; - } - - if (gDPC->queue_dpc(gDPCHandle, Function, Context) != B_OK) - return B_ERROR; - - return B_OK; -} - -/* copied from utmisc.c don't want to put this simple function into the acpi -module */ -void -AcpiUtStrupr(char *SrcString) -{ - char *String; - - if (!SrcString) - { - return; - } - - /* Walk entire string, uppercasing the letters */ - - for (String = SrcString; *String; String++) - { - *String = (char) toupper(*String); - } - - return; -} - - #define ACPI_REGION_DEACTIVATE 1 #define ACPI_READ 0 diff --git a/src/add-ons/kernel/bus_managers/acpi/acpi_module.c b/src/add-ons/kernel/bus_managers/acpi/acpi_module.c index 77586bba2b..4a143ff66a 100644 --- a/src/add-ons/kernel/bus_managers/acpi/acpi_module.c +++ b/src/add-ons/kernel/bus_managers/acpi/acpi_module.c @@ -226,5 +226,7 @@ _EXPORT module_info *modules[] = { (module_info *)&sACPIRootModule, (module_info *)&acpi_ns_dump_module, (module_info *)&gACPIDeviceModule, + (module_info*) &embedded_controller_driver_module, + (module_info*) &embedded_controller_device_module, NULL }; diff --git a/src/add-ons/kernel/bus_managers/acpi/acpi_priv.h b/src/add-ons/kernel/bus_managers/acpi/acpi_priv.h index 94e15260da..d76d152891 100644 --- a/src/add-ons/kernel/bus_managers/acpi/acpi_priv.h +++ b/src/add-ons/kernel/bus_managers/acpi/acpi_priv.h @@ -12,6 +12,7 @@ __BEGIN_DECLS #include #include #include +#include // name of ACPI root module #define ACPI_ROOT_MODULE_NAME "bus_managers/acpi/root/driver_v1" @@ -24,6 +25,7 @@ __BEGIN_DECLS extern device_manager_info *gDeviceManager; +extern pci_module_info *gPCIManager; // information about one ACPI device typedef struct acpi_device_cookie { @@ -124,6 +126,9 @@ extern struct acpi_module_info gACPIModule; extern struct device_module_info acpi_ns_dump_module; +extern struct driver_module_info embedded_controller_driver_module; +extern struct device_module_info embedded_controller_device_module; + extern acpi_device_module_info gACPIDeviceModule; diff --git a/src/add-ons/kernel/drivers/power/Jamfile b/src/add-ons/kernel/drivers/power/Jamfile index bcf7ee7414..56d91431ba 100644 --- a/src/add-ons/kernel/drivers/power/Jamfile +++ b/src/add-ons/kernel/drivers/power/Jamfile @@ -2,7 +2,6 @@ SubDir HAIKU_TOP src add-ons kernel drivers power ; SubInclude HAIKU_TOP src add-ons kernel drivers power acpi_battery ; SubInclude HAIKU_TOP src add-ons kernel drivers power acpi_button ; -SubInclude HAIKU_TOP src add-ons kernel drivers power acpi_embedded_controller ; SubInclude HAIKU_TOP src add-ons kernel drivers power acpi_lid ; SubInclude HAIKU_TOP src add-ons kernel drivers power acpi_thermal ; SubInclude HAIKU_TOP src add-ons kernel drivers power enhanced_speedstep ; diff --git a/src/system/kernel/arch/x86/irq_routing_table.h b/src/system/kernel/arch/x86/irq_routing_table.h index cb752e5ce6..811bfd3f87 100644 --- a/src/system/kernel/arch/x86/irq_routing_table.h +++ b/src/system/kernel/arch/x86/irq_routing_table.h @@ -39,6 +39,18 @@ struct irq_descriptor }; +/* Similar to bus_managers/acpi/include/acrestyp.h definition */ +typedef struct acpi_prt +{ + uint32 length; + uint32 pin; + int address; /* here for 64-bit alignment */ + uint32 sourceIndex; + char source[4]; /* pad to 64 bits so sizeof() works in + all cases */ +} acpi_pci_routing_table; + + void print_irq_descriptor(irq_descriptor* descriptor); void print_irq_routing_table(IRQRoutingTable* table);