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
This commit is contained in:
Fredrik Holmqvist
2010-04-22 16:19:41 +00:00
parent c966de0646
commit 5d9cc10f80
11 changed files with 46 additions and 158 deletions
+2 -1
View File
@@ -119,6 +119,8 @@ SYSTEM_ADD_ONS_ACCELERANTS = $(X86_ONLY)radeon.accelerant
$(X86_ONLY)ati.accelerant $(X86_ONLY)ati.accelerant
#$(X86_ONLY)via.accelerant #$(X86_ONLY)via.accelerant
#$(X86_ONLY)vmware.accelerant #$(X86_ONLY)vmware.accelerant
#$(X86_ONLY)radeonhd.accelerant
; ;
SYSTEM_ADD_ONS_TRANSLATORS = BMPTranslator EXRTranslator GIFTranslator SYSTEM_ADD_ONS_TRANSLATORS = BMPTranslator EXRTranslator GIFTranslator
HVIFTranslator ICOTranslator JPEGTranslator JPEG2000Translator HVIFTranslator ICOTranslator JPEGTranslator JPEG2000Translator
@@ -241,7 +243,6 @@ if $(TARGET_ARCH) = x86 {
AddNewDriversToHaikuImage disk scsi : scsi_cd scsi_disk ; AddNewDriversToHaikuImage disk scsi : scsi_cd scsi_disk ;
AddNewDriversToHaikuImage power : $(X86_ONLY)enhanced_speedstep ; AddNewDriversToHaikuImage power : $(X86_ONLY)enhanced_speedstep ;
AddNewDriversToHaikuImage power : $(X86_ONLY)acpi_battery ; AddNewDriversToHaikuImage power : $(X86_ONLY)acpi_battery ;
AddNewDriversToHaikuImage power : $(X86_ONLY)acpi_embedded_controller ;
# legacy drivers # legacy drivers
AddDriversToHaikuImage : console dprintf null AddDriversToHaikuImage : console dprintf null
-30
View File
@@ -131,39 +131,9 @@ enum {
*/ */
typedef uint32 acpi_status; 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__ #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 uint32 (*acpi_event_handler)(void *Context);
typedef acpi_status (*acpi_adr_space_handler)(uint32 function, typedef acpi_status (*acpi_adr_space_handler)(uint32 function,
+3 -11
View File
@@ -131,7 +131,7 @@ local tables_src =
tbfadt.c tbfadt.c
tbfind.c tbfind.c
tbinstal.c tbinstal.c
#tbutils.c tbutils.c
tbxface.c tbxface.c
tbxfroot.c tbxfroot.c
; ;
@@ -170,16 +170,6 @@ StaticLibrary libacpi_ca.a :
$(utilities_src) $(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 $(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 $(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 ] ; 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_module.c
acpi_device.c acpi_device.c
acpi_ns_dump.cpp acpi_ns_dump.cpp
acpi_embedded_controller.cpp
SmallResourceData.cpp
: :
libacpi_ca.a libacpi_ca.a
; ;
@@ -33,7 +33,6 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <ACPI.h>
#include <condition_variable.h> #include <condition_variable.h>
#include <Errors.h> #include <Errors.h>
#include <KernelExport.h> #include <KernelExport.h>
@@ -51,13 +50,10 @@
// name of pnp generator of path ids // name of pnp generator of path ids
#define ACPI_EC_PATHID_GENERATOR "embedded_controller/path_id" #define ACPI_EC_PATHID_GENERATOR "embedded_controller/path_id"
device_manager_info *gDeviceManager = NULL;
pci_module_info *gPCIManager = NULL;
// cpu frequency in Hz // cpu frequency in Hz
int64 gHz; int64 gHz;
uint8 uint8
bus_space_read_1(int address) bus_space_read_1(int address)
{ {
@@ -80,7 +76,7 @@ acpi_GetInteger(acpi_device_module_info* acpi, acpi_device& acpiCookie,
acpi_object_type object; acpi_object_type object;
buf.pointer = &object; buf.pointer = &object;
buf.length = sizeof(acpi_object_type); buf.length = sizeof(acpi_object_type);
/* /*
* Assume that what we've been pointed at is an Integer object, or * Assume that what we've been pointed at is an Integer object, or
* a method that will return an Integer. * a method that will return an Integer.
@@ -211,7 +207,7 @@ acpi_get_type(device_node* dev)
const char *bus; const char *bus;
if (gDeviceManager->get_attr_string(dev, B_DEVICE_BUS, &bus, false)) if (gDeviceManager->get_attr_string(dev, B_DEVICE_BUS, &bus, false))
return -1; return -1;
if (strcmp(bus, "acpi")) if (strcmp(bus, "acpi"))
return -1; return -1;
@@ -230,14 +226,16 @@ embedded_controller_support(device_node* dev)
static const char* ec_ids[] = { "PNP0C09", NULL }; static const char* ec_ids[] = { "PNP0C09", NULL };
/* Check that this is a device. */ /* Check that this is a device. */
TRACE("before acpi_get_type...");
if (acpi_get_type(dev) != ACPI_TYPE_DEVICE) if (acpi_get_type(dev) != ACPI_TYPE_DEVICE)
return 0.0; return 0.0;
const char* name; const char* name;
if (gDeviceManager->get_attr_string(dev, ACPI_DEVICE_HID_ITEM, &name, false) if (gDeviceManager->get_attr_string(dev, ACPI_DEVICE_HID_ITEM, &name, false)
!= B_OK || strcmp(name, ec_ids[0])) != B_OK || strcmp(name, ec_ids[0]))
return 0.0; return 0.0;
TRACE("after\n");
TRACE("supported device found %s\n", name); TRACE("supported device found %s\n", name);
return 0.6; return 0.6;
} }
@@ -293,21 +291,6 @@ embedded_controller_init_driver(device_node* dev, void** _driverCookie)
!= B_OK) != B_OK)
return B_ERROR; 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; acpi_data buf;
buf.pointer = NULL; buf.pointer = NULL;
buf.length = ACPI_ALLOCATE_BUFFER; buf.length = ACPI_ALLOCATE_BUFFER;
@@ -431,9 +414,6 @@ embedded_controller_uninit_driver(void* driverCookie)
mutex_destroy(&sc->ec_lock); mutex_destroy(&sc->ec_lock);
free(sc); free(sc);
put_module(B_ACPI_MODULE_NAME); 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 = { driver_module_info embedded_controller_driver_module = {
{ {
ACPI_EC_DRIVER_NAME, 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 static void
EcGpeQueryHandler(void* context) EcGpeQueryHandler(void* context)
{ {
@@ -606,9 +572,9 @@ EcGpeHandler(void* context)
EC_STATUS EcStatus = EC_GET_CSR(sc); EC_STATUS EcStatus = EC_GET_CSR(sc);
if ((EcStatus & EC_EVENT_SCI) && !sc->ec_sci_pending) { if ((EcStatus & EC_EVENT_SCI) && !sc->ec_sci_pending) {
TRACE("gpe queueing query handler\n"); TRACE("gpe queueing query handler\n");
status_t status = AcpiOsExecute(OSL_GPE_HANDLER, EcGpeQueryHandler, ACPI_STATUS s = AcpiOsExecute(OSL_GPE_HANDLER, EcGpeQueryHandler,
context); context);
if (status == B_OK) if (s == AE_OK)
sc->ec_sci_pending = TRUE; sc->ec_sci_pending = TRUE;
else else
dprintf("EcGpeHandler: queuing GPE query handler failed\n"); 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; acpi_status status = AE_NO_HARDWARE_RESPONSE;
int32 count, i; int32 count, i;
// int need_poll = cold || rebooting || ec_polled_mode || sc->ec_suspending; // int need_poll = cold || rebooting || ec_polled_mode || sc->ec_suspending;
int need_poll = 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; count = ec_timeout;
/* /*
* Wait for the GPE to signal the status changed, checking the * Wait for the GPE to signal the status changed, checking the
* status register each time we get one. It's possible to get a * 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; return status;
u_int gen_count = sc->ec_gencount; u_int gen_count = sc->ec_gencount;
EC_SET_DATA(sc, address); EC_SET_DATA(sc, address);
status = EcWaitEvent(sc, EC_EVENT_OUTPUT_BUFFER_FULL, gen_count); status = EcWaitEvent(sc, EC_EVENT_OUTPUT_BUFFER_FULL, gen_count);
if (status != AE_OK) { if (status != AE_OK) {
@@ -884,7 +850,7 @@ EcRead(struct acpi_ec_cookie* sc, uint8 address, uint8* readData)
return status; return status;
} }
*readData = EC_GET_DATA(sc); *readData = EC_GET_DATA(sc);
if (sc->ec_burstactive) { if (sc->ec_burstactive) {
sc->ec_burstactive = FALSE; sc->ec_burstactive = FALSE;
status = EcCommand(sc, EC_COMMAND_BURST_DISABLE); status = EcCommand(sc, EC_COMMAND_BURST_DISABLE);
@@ -33,11 +33,18 @@
#include <ACPI.h> #include <ACPI.h>
#include <condition_variable.h> #include <condition_variable.h>
#include <dpc.h>
#include <Drivers.h> #include <Drivers.h>
#include <KernelExport.h> #include <KernelExport.h>
#include <lock.h> #include <lock.h>
extern "C" {
#include "acpi.h"
#include "accommon.h"
#include "acnamesp.h"
#include "acpi_priv.h"
}
// #define TRACE_EMBEDDED_CONTROLLER // #define TRACE_EMBEDDED_CONTROLLER
#ifdef TRACE_EMBEDDED_CONTROLLER #ifdef TRACE_EMBEDDED_CONTROLLER
# define TRACE(x...) dprintf("EC: " x) # define TRACE(x...) dprintf("EC: " x)
@@ -46,72 +53,6 @@
#endif #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_REGION_DEACTIVATE 1
#define ACPI_READ 0 #define ACPI_READ 0
@@ -226,5 +226,7 @@ _EXPORT module_info *modules[] = {
(module_info *)&sACPIRootModule, (module_info *)&sACPIRootModule,
(module_info *)&acpi_ns_dump_module, (module_info *)&acpi_ns_dump_module,
(module_info *)&gACPIDeviceModule, (module_info *)&gACPIDeviceModule,
(module_info*) &embedded_controller_driver_module,
(module_info*) &embedded_controller_device_module,
NULL NULL
}; };
@@ -12,6 +12,7 @@ __BEGIN_DECLS
#include <device_manager.h> #include <device_manager.h>
#include <KernelExport.h> #include <KernelExport.h>
#include <ACPI.h> #include <ACPI.h>
#include <PCI.h>
// name of ACPI root module // name of ACPI root module
#define ACPI_ROOT_MODULE_NAME "bus_managers/acpi/root/driver_v1" #define ACPI_ROOT_MODULE_NAME "bus_managers/acpi/root/driver_v1"
@@ -24,6 +25,7 @@ __BEGIN_DECLS
extern device_manager_info *gDeviceManager; extern device_manager_info *gDeviceManager;
extern pci_module_info *gPCIManager;
// information about one ACPI device // information about one ACPI device
typedef struct acpi_device_cookie { 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 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; extern acpi_device_module_info gACPIDeviceModule;
-1
View File
@@ -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_battery ;
SubInclude HAIKU_TOP src add-ons kernel drivers power acpi_button ; 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_lid ;
SubInclude HAIKU_TOP src add-ons kernel drivers power acpi_thermal ; SubInclude HAIKU_TOP src add-ons kernel drivers power acpi_thermal ;
SubInclude HAIKU_TOP src add-ons kernel drivers power enhanced_speedstep ; SubInclude HAIKU_TOP src add-ons kernel drivers power enhanced_speedstep ;
@@ -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_descriptor(irq_descriptor* descriptor);
void print_irq_routing_table(IRQRoutingTable* table); void print_irq_routing_table(IRQRoutingTable* table);