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:
@@ -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
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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
|
||||||
;
|
;
|
||||||
|
|||||||
+5
-39
@@ -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,9 +50,6 @@
|
|||||||
// 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;
|
||||||
|
|
||||||
@@ -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");
|
||||||
+8
-67
@@ -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;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user