- Convert a lot of homebrew debugging output to use the ACPI CA debugging
infrastructure. It's not perfect, but it's a lot better than what we've been using so far. The following rules apply to this: o BSD component names should be capitalised o Layer names should be taken from the non-CA set for now. We may elect to add some new BSD-specific layers later. - Make it possible to turn off selective debugging flags or layers by listing them in debug.acpi.layer or debug.acpi.level prefixed with !. - Fully implement support for avoiding nodes in the ACPI namespace. Nodes may be listed in the debug.acpi.avoid environment variable; these nodes and all their children will be ignored (although still scanned over) by ACPI functions which scan the namespace. Multiple nodes can be specified, separated by whitespace. - Implement support for selectively disabling ACPI subsystem components via the debug.acpi.disable environment variable. The following components can be disabled: o bus creation/scanning of the ACPI 'bus' o children attachment of children to the ACPI 'bus' o button the acpi_button control-method button driver o ec the acpi_ec embedded-controller driver o isa acpi replacement of PnP BIOS for ISA device discovery o lid the control-method lid switch driver o pci pci root-bus discovery o processor CPU power/speed management o thermal system temperature detection and control o timer ACPI timecounter Multiple components may be disabled by specifying their name(s) separated by whitespace. - Add support for ioctl registration. ACPI subsystem components may register ioctl handlers with the /dev/acpi generic ioctl handler, allowing us to avoid the need for a multitude of /dev/acpi* control devices, etc.
This commit is contained in:
parent
601ec8e185
commit
3d96e58d42
@ -51,6 +51,12 @@
|
||||
|
||||
MALLOC_DEFINE(M_ACPIDEV, "acpidev", "ACPI devices");
|
||||
|
||||
/*
|
||||
* Hooks for the ACPI CA debugging infrastructure
|
||||
*/
|
||||
#define _COMPONENT BUS_MANAGER
|
||||
MODULE_NAME("ACPI")
|
||||
|
||||
/*
|
||||
* Character device
|
||||
*/
|
||||
@ -159,6 +165,8 @@ acpi_identify(driver_t *driver, device_t parent)
|
||||
char *debugpoint = getenv("debug.acpi.debugger");
|
||||
#endif
|
||||
|
||||
FUNCTION_TRACE(__FUNCTION__);
|
||||
|
||||
if(!cold){
|
||||
printf("Don't load this driver from userland!!\n");
|
||||
return ;
|
||||
@ -168,7 +176,7 @@ acpi_identify(driver_t *driver, device_t parent)
|
||||
* Make sure we're not being doubly invoked.
|
||||
*/
|
||||
if (device_find_child(parent, "acpi", 0) != NULL)
|
||||
return;
|
||||
return_VOID;
|
||||
|
||||
#ifdef ACPI_DEBUG
|
||||
acpi_set_debugging();
|
||||
@ -183,7 +191,7 @@ acpi_identify(driver_t *driver, device_t parent)
|
||||
#endif
|
||||
if ((error = AcpiInitializeSubsystem()) != AE_OK) {
|
||||
printf("ACPI: initialisation failed: %s\n", acpi_strerror(error));
|
||||
return;
|
||||
return_VOID;
|
||||
}
|
||||
#ifdef ENABLE_DEBUGGER
|
||||
if (debugpoint && !strcmp(debugpoint, "tables"))
|
||||
@ -192,7 +200,7 @@ acpi_identify(driver_t *driver, device_t parent)
|
||||
if (((error = AcpiFindRootPointer(&rsdp)) != AE_OK) ||
|
||||
((error = AcpiLoadTables(rsdp)) != AE_OK)) {
|
||||
printf("ACPI: table load failed: %s\n", acpi_strerror(error));
|
||||
return;
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -200,7 +208,7 @@ acpi_identify(driver_t *driver, device_t parent)
|
||||
*/
|
||||
if ((child = BUS_ADD_CHILD(parent, 0, "acpi", 0)) == NULL) {
|
||||
device_printf(parent, "ACPI: could not attach\n");
|
||||
return;
|
||||
return_VOID;
|
||||
}
|
||||
}
|
||||
|
||||
@ -214,14 +222,16 @@ acpi_probe(device_t dev)
|
||||
char buf[20];
|
||||
int error;
|
||||
|
||||
FUNCTION_TRACE(__FUNCTION__);
|
||||
|
||||
if ((error = AcpiGetTableHeader(ACPI_TABLE_XSDT, 1, &th)) != AE_OK) {
|
||||
device_printf(dev, "couldn't get XSDT header: %s\n", acpi_strerror(error));
|
||||
return(ENXIO);
|
||||
return_VALUE(ENXIO);
|
||||
}
|
||||
sprintf(buf, "%.6s %.8s", th.OemId, th.OemTableId);
|
||||
device_set_desc_copy(dev, buf);
|
||||
|
||||
return(0);
|
||||
return_VALUE(0);
|
||||
}
|
||||
|
||||
static int
|
||||
@ -233,6 +243,7 @@ acpi_attach(device_t dev)
|
||||
char *debugpoint = getenv("debug.acpi.debugger");
|
||||
#endif
|
||||
|
||||
FUNCTION_TRACE(__FUNCTION__);
|
||||
|
||||
sc = device_get_softc(dev);
|
||||
bzero(sc, sizeof(*sc));
|
||||
@ -251,21 +262,21 @@ acpi_attach(device_t dev)
|
||||
ACPI_DEFAULT_HANDLER,
|
||||
NULL, NULL)) != AE_OK) {
|
||||
device_printf(dev, "could not initialise SystemMemory handler: %s\n", acpi_strerror(error));
|
||||
return(ENXIO);
|
||||
return_VALUE(ENXIO);
|
||||
}
|
||||
if ((error = AcpiInstallAddressSpaceHandler(ACPI_ROOT_OBJECT,
|
||||
ADDRESS_SPACE_SYSTEM_IO,
|
||||
ACPI_DEFAULT_HANDLER,
|
||||
NULL, NULL)) != AE_OK) {
|
||||
device_printf(dev, "could not initialise SystemIO handler: %s\n", acpi_strerror(error));
|
||||
return(ENXIO);
|
||||
return_VALUE(ENXIO);
|
||||
}
|
||||
if ((error = AcpiInstallAddressSpaceHandler(ACPI_ROOT_OBJECT,
|
||||
ADDRESS_SPACE_PCI_CONFIG,
|
||||
ACPI_DEFAULT_HANDLER,
|
||||
NULL, NULL)) != AE_OK) {
|
||||
device_printf(dev, "could not initialise PciConfig handler: %s\n", acpi_strerror(error));
|
||||
return(ENXIO);
|
||||
return_VALUE(ENXIO);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -283,7 +294,7 @@ acpi_attach(device_t dev)
|
||||
#endif
|
||||
if ((error = AcpiEnableSubsystem(ACPI_NO_DEVICE_INIT | ACPI_NO_OBJECT_INIT)) != AE_OK) {
|
||||
device_printf(dev, "could not enable ACPI: %s\n", acpi_strerror(error));
|
||||
return(ENXIO);
|
||||
return_VALUE(ENXIO);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -315,6 +326,7 @@ acpi_attach(device_t dev)
|
||||
if (debugpoint && !strcmp(debugpoint, "probe"))
|
||||
acpi_EnterDebugger();
|
||||
#endif
|
||||
if (!acpi_disabled("bus"))
|
||||
acpi_probe_children(dev);
|
||||
|
||||
/*
|
||||
@ -346,7 +358,7 @@ acpi_attach(device_t dev)
|
||||
if (debugpoint && !strcmp(debugpoint, "running"))
|
||||
acpi_EnterDebugger();
|
||||
#endif
|
||||
return(0);
|
||||
return_VALUE(0);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -547,9 +559,12 @@ acpi_probe_children(device_t bus)
|
||||
static char *scopes[] = {"\\_TZ_", "\\_SI", "\\_SB_", NULL};
|
||||
int i;
|
||||
|
||||
FUNCTION_TRACE(__FUNCTION__);
|
||||
|
||||
/*
|
||||
* Create any static children by calling device identify methods.
|
||||
*/
|
||||
DEBUG_PRINT(TRACE_OBJECTS, ("device identify routines\n"));
|
||||
bus_generic_probe(bus);
|
||||
|
||||
/*
|
||||
@ -561,6 +576,7 @@ acpi_probe_children(device_t bus)
|
||||
* present. (This assumes that we don't want to create/remove devices as they
|
||||
* appear, which might be smarter.)
|
||||
*/
|
||||
DEBUG_PRINT(TRACE_OBJECTS, ("namespace scan\n"));
|
||||
for (i = 0; scopes[i] != NULL; i++)
|
||||
if ((AcpiGetHandle(ACPI_ROOT_OBJECT, scopes[i], &parent)) == AE_OK)
|
||||
AcpiWalkNamespace(ACPI_TYPE_ANY, parent, 100, acpi_probe_child, bus, NULL);
|
||||
@ -568,13 +584,17 @@ acpi_probe_children(device_t bus)
|
||||
/*
|
||||
* Scan all of the child devices we have created and let them probe/attach.
|
||||
*/
|
||||
DEBUG_PRINT(TRACE_OBJECTS, ("first bus_generic_attach\n"));
|
||||
bus_generic_attach(bus);
|
||||
|
||||
/*
|
||||
* Some of these children may have attached others as part of their attach
|
||||
* process (eg. the root PCI bus driver), so rescan.
|
||||
*/
|
||||
DEBUG_PRINT(TRACE_OBJECTS, ("second bus_generic_attach\n"));
|
||||
bus_generic_attach(bus);
|
||||
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -587,28 +607,41 @@ acpi_probe_child(ACPI_HANDLE handle, UINT32 level, void *context, void **status)
|
||||
ACPI_OBJECT_TYPE type;
|
||||
device_t child, bus = (device_t)context;
|
||||
|
||||
FUNCTION_TRACE(__FUNCTION__);
|
||||
|
||||
/*
|
||||
* Skip this device if we think we'll have trouble with it.
|
||||
*/
|
||||
if (acpi_avoid(handle))
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
|
||||
if (AcpiGetType(handle, &type) == AE_OK) {
|
||||
switch(type) {
|
||||
case ACPI_TYPE_DEVICE:
|
||||
case ACPI_TYPE_PROCESSOR:
|
||||
case ACPI_TYPE_THERMAL:
|
||||
case ACPI_TYPE_POWER:
|
||||
if (acpi_disabled("children"))
|
||||
break;
|
||||
/*
|
||||
* Create a placeholder device for this node. Sort the placeholder
|
||||
* so that the probe/attach passes will run breadth-first.
|
||||
*/
|
||||
DEBUG_PRINT(TRACE_OBJECTS, ("scanning '%s'\n", acpi_name(handle)))
|
||||
child = BUS_ADD_CHILD(bus, level * 10, NULL, -1);
|
||||
acpi_set_handle(child, handle);
|
||||
DEBUG_EXEC(device_probe_and_attach(child));
|
||||
break;
|
||||
}
|
||||
}
|
||||
return(AE_OK);
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
static void
|
||||
acpi_shutdown_pre_sync(void *arg, int howto)
|
||||
{
|
||||
/*
|
||||
* disable all of ACPI events before soft off, otherwise the system
|
||||
* Disable all ACPI events before soft off, otherwise the system
|
||||
* will be turned on again on some laptops.
|
||||
*
|
||||
* XXX this should probably be restricted to masking some events just
|
||||
@ -699,6 +732,8 @@ acpi_SetSleepState(struct acpi_softc *sc, int state)
|
||||
{
|
||||
ACPI_STATUS status = AE_OK;
|
||||
|
||||
FUNCTION_TRACE_U32(__FUNCTION__, state);
|
||||
|
||||
switch (state) {
|
||||
case ACPI_STATE_S0: /* XXX only for testing */
|
||||
status = AcpiSetSystemSleepState((UINT8)state);
|
||||
@ -720,7 +755,7 @@ acpi_SetSleepState(struct acpi_softc *sc, int state)
|
||||
* current bus interface does not provide for this.
|
||||
*/
|
||||
DEVICE_RESUME(root_bus);
|
||||
return(AE_ERROR);
|
||||
return_ACPI_STATUS(AE_ERROR);
|
||||
}
|
||||
sc->acpi_sstate = state;
|
||||
status = AcpiSetSystemSleepState((UINT8)state);
|
||||
@ -743,7 +778,7 @@ acpi_SetSleepState(struct acpi_softc *sc, int state)
|
||||
status = AE_BAD_PARAMETER;
|
||||
break;
|
||||
}
|
||||
return(status);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -755,6 +790,8 @@ acpi_Enable(struct acpi_softc *sc)
|
||||
ACPI_STATUS status;
|
||||
u_int32_t flags;
|
||||
|
||||
FUNCTION_TRACE(__FUNCTION__);
|
||||
|
||||
flags = ACPI_NO_ADDRESS_SPACE_INIT | ACPI_NO_HARDWARE_INIT |
|
||||
ACPI_NO_DEVICE_INIT | ACPI_NO_OBJECT_INIT;
|
||||
if (!sc->acpi_enabled) {
|
||||
@ -764,7 +801,7 @@ acpi_Enable(struct acpi_softc *sc)
|
||||
}
|
||||
if (status == AE_OK)
|
||||
sc->acpi_enabled = 1;
|
||||
return(status);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
ACPI_STATUS
|
||||
@ -772,6 +809,8 @@ acpi_Disable(struct acpi_softc *sc)
|
||||
{
|
||||
ACPI_STATUS status;
|
||||
|
||||
FUNCTION_TRACE(__FUNCTION__);
|
||||
|
||||
if (sc->acpi_enabled) {
|
||||
status = AcpiDisable();
|
||||
} else {
|
||||
@ -779,7 +818,7 @@ acpi_Disable(struct acpi_softc *sc)
|
||||
}
|
||||
if (status == AE_OK)
|
||||
sc->acpi_enabled = 0;
|
||||
return(status);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -836,18 +875,21 @@ acpi_EvaluateNumber(ACPI_HANDLE handle, char *path, int *number)
|
||||
static void
|
||||
acpi_system_eventhandler_sleep(void *arg, int state)
|
||||
{
|
||||
if (state < ACPI_STATE_S0 || state > ACPI_STATE_S5) {
|
||||
return;
|
||||
}
|
||||
FUNCTION_TRACE_U32(__FUNCTION__, state);
|
||||
|
||||
if (state >= ACPI_STATE_S0 && state <= ACPI_STATE_S5)
|
||||
acpi_SetSleepState((struct acpi_softc *)arg, state);
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
acpi_system_eventhandler_wakeup(void *arg, int state)
|
||||
{
|
||||
FUNCTION_TRACE_U32(__FUNCTION__, state);
|
||||
|
||||
/* Well, what to do? :-) */
|
||||
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -858,8 +900,11 @@ acpi_eventhandler_power_button_for_sleep(void *context)
|
||||
{
|
||||
struct acpi_softc *sc = (struct acpi_softc *)context;
|
||||
|
||||
FUNCTION_TRACE(__FUNCTION__);
|
||||
|
||||
EVENTHANDLER_INVOKE(acpi_sleep_event, sc->acpi_power_button_sx);
|
||||
return(INTERRUPT_HANDLED);
|
||||
|
||||
return_VALUE(INTERRUPT_HANDLED);
|
||||
}
|
||||
|
||||
UINT32
|
||||
@ -867,8 +912,11 @@ acpi_eventhandler_power_button_for_wakeup(void *context)
|
||||
{
|
||||
struct acpi_softc *sc = (struct acpi_softc *)context;
|
||||
|
||||
FUNCTION_TRACE(__FUNCTION__);
|
||||
|
||||
EVENTHANDLER_INVOKE(acpi_wakeup_event, sc->acpi_power_button_sx);
|
||||
return(INTERRUPT_HANDLED);
|
||||
|
||||
return_VALUE(INTERRUPT_HANDLED);
|
||||
}
|
||||
|
||||
UINT32
|
||||
@ -876,8 +924,11 @@ acpi_eventhandler_sleep_button_for_sleep(void *context)
|
||||
{
|
||||
struct acpi_softc *sc = (struct acpi_softc *)context;
|
||||
|
||||
FUNCTION_TRACE(__FUNCTION__);
|
||||
|
||||
EVENTHANDLER_INVOKE(acpi_sleep_event, sc->acpi_sleep_button_sx);
|
||||
return(INTERRUPT_HANDLED);
|
||||
|
||||
return_VALUE(INTERRUPT_HANDLED);
|
||||
}
|
||||
|
||||
UINT32
|
||||
@ -885,8 +936,11 @@ acpi_eventhandler_sleep_button_for_wakeup(void *context)
|
||||
{
|
||||
struct acpi_softc *sc = (struct acpi_softc *)context;
|
||||
|
||||
FUNCTION_TRACE(__FUNCTION__);
|
||||
|
||||
EVENTHANDLER_INVOKE(acpi_wakeup_event, sc->acpi_sleep_button_sx);
|
||||
return(INTERRUPT_HANDLED);
|
||||
|
||||
return_VALUE(INTERRUPT_HANDLED);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -949,7 +1003,39 @@ acpi_avoid(ACPI_HANDLE handle)
|
||||
while ((cp[len] != 0) && !isspace(cp[len]))
|
||||
len++;
|
||||
if (!strncmp(cp, np, len)) {
|
||||
printf("avoiding '%s'\n", np);
|
||||
DEBUG_PRINT(TRACE_OBJECTS, ("avoiding '%s'\n", np));
|
||||
return(1);
|
||||
}
|
||||
cp += len;
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Debugging/bug-avoidance. Disable ACPI subsystem components.
|
||||
*/
|
||||
int
|
||||
acpi_disabled(char *subsys)
|
||||
{
|
||||
char *cp;
|
||||
int len;
|
||||
|
||||
if ((cp = getenv("debug.acpi.disable")) == NULL)
|
||||
return(0);
|
||||
if (!strcmp(cp, "all"))
|
||||
return(1);
|
||||
|
||||
/* scan the disable list checking for a match */
|
||||
for (;;) {
|
||||
while ((*cp != 0) && isspace(*cp))
|
||||
cp++;
|
||||
if (*cp == 0)
|
||||
break;
|
||||
len = 0;
|
||||
while ((cp[len] != 0) && !isspace(cp[len]))
|
||||
len++;
|
||||
if (!strncmp(cp, subsys, len)) {
|
||||
DEBUG_PRINT(TRACE_OBJECTS, ("disabled '%s'\n", subsys));
|
||||
return(1);
|
||||
}
|
||||
cp += len;
|
||||
@ -960,42 +1046,107 @@ acpi_avoid(ACPI_HANDLE handle)
|
||||
/*
|
||||
* Control interface.
|
||||
*
|
||||
* XXX this is provided as a temporary measure for
|
||||
* backwards compatibility for now. A better
|
||||
* interface will probably use sysctl or similar.
|
||||
* We multiplex ioctls for all participating ACPI devices here. Individual
|
||||
* drivers wanting to be accessible via /dev/acpi should use the register/deregister
|
||||
* interface to make their handlers visible.
|
||||
*/
|
||||
struct acpi_ioctl_hook
|
||||
{
|
||||
TAILQ_ENTRY(acpi_ioctl_hook) link;
|
||||
u_long cmd;
|
||||
int (* fn)(u_long cmd, caddr_t addr, void *arg);
|
||||
void *arg;
|
||||
};
|
||||
|
||||
static TAILQ_HEAD(,acpi_ioctl_hook) acpi_ioctl_hooks;
|
||||
static int acpi_ioctl_hooks_initted;
|
||||
|
||||
/*
|
||||
* Register an ioctl handler.
|
||||
*/
|
||||
int
|
||||
acpi_register_ioctl(u_long cmd, int (* fn)(u_long cmd, caddr_t addr, void *arg), void *arg)
|
||||
{
|
||||
struct acpi_ioctl_hook *hp;
|
||||
|
||||
if ((hp = malloc(sizeof(*hp), M_ACPIDEV, M_NOWAIT)) == NULL)
|
||||
return(ENOMEM);
|
||||
hp->cmd = cmd;
|
||||
hp->fn = fn;
|
||||
hp->arg = arg;
|
||||
if (acpi_ioctl_hooks_initted == 0) {
|
||||
TAILQ_INIT(&acpi_ioctl_hooks);
|
||||
acpi_ioctl_hooks_initted = 1;
|
||||
}
|
||||
TAILQ_INSERT_TAIL(&acpi_ioctl_hooks, hp, link);
|
||||
return(0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Deregister an ioctl handler.
|
||||
*/
|
||||
void
|
||||
acpi_deregister_ioctl(u_long cmd, int (* fn)(u_long cmd, caddr_t addr, void *arg))
|
||||
{
|
||||
struct acpi_ioctl_hook *hp;
|
||||
|
||||
TAILQ_FOREACH(hp, &acpi_ioctl_hooks, link)
|
||||
if ((hp->cmd == cmd) && (hp->fn == fn))
|
||||
break;
|
||||
|
||||
if (hp != NULL) {
|
||||
TAILQ_REMOVE(&acpi_ioctl_hooks, hp, link);
|
||||
free(hp, M_ACPIDEV);
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
acpiopen(dev_t dev, int flag, int fmt, struct proc * p)
|
||||
acpiopen(dev_t dev, int flag, int fmt, struct proc *p)
|
||||
{
|
||||
return(0);
|
||||
}
|
||||
|
||||
static int
|
||||
acpiclose(dev_t dev, int flag, int fmt, struct proc * p)
|
||||
acpiclose(dev_t dev, int flag, int fmt, struct proc *p)
|
||||
{
|
||||
return(0);
|
||||
}
|
||||
|
||||
static int
|
||||
acpiioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct proc * p)
|
||||
acpiioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct proc *p)
|
||||
{
|
||||
int error, state;
|
||||
struct acpi_softc *sc;
|
||||
struct acpi_ioctl_hook *hp;
|
||||
int error, xerror, state;
|
||||
|
||||
error = state = 0;
|
||||
sc = dev->si_drv1;
|
||||
|
||||
/*
|
||||
* Scan the list of registered ioctls, looking for handlers.
|
||||
*/
|
||||
if (acpi_ioctl_hooks_initted) {
|
||||
TAILQ_FOREACH(hp, &acpi_ioctl_hooks, link) {
|
||||
if (hp->cmd == cmd) {
|
||||
xerror = hp->fn(cmd, addr, hp->arg);
|
||||
if (xerror != 0)
|
||||
error = xerror;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Core system ioctls.
|
||||
*/
|
||||
switch (cmd) {
|
||||
case ACPIIO_ENABLE:
|
||||
if (ACPI_FAILURE(acpi_Enable(sc))) {
|
||||
if (ACPI_FAILURE(acpi_Enable(sc)))
|
||||
error = ENXIO;
|
||||
}
|
||||
break;
|
||||
|
||||
case ACPIIO_DISABLE:
|
||||
if (ACPI_FAILURE(acpi_Disable(sc))) {
|
||||
if (ACPI_FAILURE(acpi_Disable(sc)))
|
||||
error = ENXIO;
|
||||
}
|
||||
break;
|
||||
|
||||
case ACPIIO_SETSLPSTATE:
|
||||
@ -1009,18 +1160,25 @@ acpiioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct proc * p)
|
||||
} else {
|
||||
error = EINVAL;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
if (error == 0)
|
||||
error = EINVAL;
|
||||
break;
|
||||
}
|
||||
|
||||
return(error);
|
||||
}
|
||||
|
||||
#ifdef ACPI_DEBUG
|
||||
/*
|
||||
* Support for parsing debug options from the kernel environment.
|
||||
*
|
||||
* Bits may be set in the AcpiDbgLayer and AcpiDbgLevel debug registers
|
||||
* by specifying the names of the bits in the debug.acpi.layer and
|
||||
* debug.acpi.level environment variables. Bits may be unset by
|
||||
* prefixing the bit name with !.
|
||||
*/
|
||||
struct debugtag
|
||||
{
|
||||
char *name;
|
||||
@ -1093,6 +1251,7 @@ acpi_parse_debug(char *cp, struct debugtag *tag, UINT32 *flag)
|
||||
{
|
||||
char *ep;
|
||||
int i, l;
|
||||
int set;
|
||||
|
||||
while (*cp) {
|
||||
if (isspace(*cp)) {
|
||||
@ -1102,10 +1261,22 @@ acpi_parse_debug(char *cp, struct debugtag *tag, UINT32 *flag)
|
||||
ep = cp;
|
||||
while (*ep && !isspace(*ep))
|
||||
ep++;
|
||||
if (*cp == '!') {
|
||||
set = 0;
|
||||
cp++;
|
||||
if (cp == ep)
|
||||
continue;
|
||||
} else {
|
||||
set = 1;
|
||||
}
|
||||
l = ep - cp;
|
||||
for (i = 0; tag[i].name != NULL; i++) {
|
||||
if (!strncmp(cp, tag[i].name, l)) {
|
||||
if (set) {
|
||||
*flag |= tag[i].value;
|
||||
} else {
|
||||
*flag &= ~tag[i].value;
|
||||
}
|
||||
printf("ACPI_DEBUG: set '%s'\n", tag[i].name);
|
||||
}
|
||||
}
|
||||
@ -1118,9 +1289,13 @@ acpi_set_debugging(void)
|
||||
{
|
||||
char *cp;
|
||||
|
||||
AcpiDbgLayer = 0;
|
||||
AcpiDbgLevel = 0;
|
||||
if ((cp = getenv("debug.acpi.layer")) != NULL)
|
||||
acpi_parse_debug(cp, &dbg_layer[0], &AcpiDbgLayer);
|
||||
if ((cp = getenv("debug.acpi.level")) != NULL)
|
||||
acpi_parse_debug(cp, &dbg_level[0], &AcpiDbgLevel);
|
||||
|
||||
printf("ACPI debug layer 0x%x debug level 0x%x\n", AcpiDbgLayer, AcpiDbgLevel);
|
||||
}
|
||||
#endif
|
||||
|
@ -37,6 +37,12 @@
|
||||
|
||||
#include <dev/acpica/acpivar.h>
|
||||
|
||||
/*
|
||||
* Hooks for the ACPI CA debugging infrastructure
|
||||
*/
|
||||
#define _COMPONENT SYSTEM_CONTROL
|
||||
MODULE_NAME("BUTTON")
|
||||
|
||||
struct acpi_button_softc {
|
||||
device_t button_dev;
|
||||
ACPI_HANDLE button_handle;
|
||||
@ -75,6 +81,7 @@ acpi_button_probe(device_t dev)
|
||||
|
||||
sc = device_get_softc(dev);
|
||||
if (acpi_get_type(dev) == ACPI_TYPE_DEVICE) {
|
||||
if (!acpi_disabled("button")) {
|
||||
if (acpi_MatchHid(dev, "PNP0C0C")) {
|
||||
device_set_desc(dev, "Control Method Power Button Device");
|
||||
sc->button_type = ACPI_POWER_BUTTON;
|
||||
@ -85,7 +92,7 @@ acpi_button_probe(device_t dev)
|
||||
sc->button_type = ACPI_SLEEP_BUTTON;
|
||||
return(0);
|
||||
}
|
||||
return(ENXIO);
|
||||
}
|
||||
}
|
||||
return(ENXIO);
|
||||
}
|
||||
@ -96,6 +103,8 @@ acpi_button_attach(device_t dev)
|
||||
struct acpi_button_softc *sc;
|
||||
ACPI_STATUS status;
|
||||
|
||||
FUNCTION_TRACE(__FUNCTION__);
|
||||
|
||||
sc = device_get_softc(dev);
|
||||
sc->button_dev = dev;
|
||||
sc->button_handle = acpi_get_handle(dev);
|
||||
@ -103,9 +112,9 @@ acpi_button_attach(device_t dev)
|
||||
if ((status = AcpiInstallNotifyHandler(sc->button_handle, ACPI_DEVICE_NOTIFY,
|
||||
acpi_button_notify_handler, sc)) != AE_OK) {
|
||||
device_printf(sc->button_dev, "couldn't install Notify handler - %s\n", acpi_strerror(status));
|
||||
return(ENXIO);
|
||||
return_VALUE(ENXIO);
|
||||
}
|
||||
return(0);
|
||||
return_VALUE(0);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -114,10 +123,12 @@ acpi_button_notify_pressed_for_sleep(void *arg)
|
||||
struct acpi_button_softc *sc;
|
||||
struct acpi_softc *acpi_sc;
|
||||
|
||||
FUNCTION_TRACE(__FUNCTION__);
|
||||
|
||||
sc = (struct acpi_button_softc *)arg;
|
||||
acpi_sc = acpi_device_get_parent_softc(sc->button_dev);
|
||||
if (acpi_sc == NULL) {
|
||||
return;
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
switch (sc->button_type) {
|
||||
@ -128,8 +139,9 @@ acpi_button_notify_pressed_for_sleep(void *arg)
|
||||
acpi_eventhandler_sleep_button_for_sleep((void *)acpi_sc);
|
||||
break;
|
||||
default:
|
||||
return; /* unknown button type */
|
||||
break; /* unknown button type */
|
||||
}
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -138,10 +150,12 @@ acpi_button_notify_pressed_for_wakeup(void *arg)
|
||||
struct acpi_button_softc *sc;
|
||||
struct acpi_softc *acpi_sc;
|
||||
|
||||
FUNCTION_TRACE(__FUNCTION__);
|
||||
|
||||
sc = (struct acpi_button_softc *)arg;
|
||||
acpi_sc = acpi_device_get_parent_softc(sc->button_dev);
|
||||
if (acpi_sc == NULL) {
|
||||
return;
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
switch (sc->button_type) {
|
||||
@ -152,8 +166,9 @@ acpi_button_notify_pressed_for_wakeup(void *arg)
|
||||
acpi_eventhandler_sleep_button_for_wakeup((void *)acpi_sc);
|
||||
break;
|
||||
default:
|
||||
return; /* unknown button type */
|
||||
break; /* unknown button type */
|
||||
}
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
/* XXX maybe not here */
|
||||
@ -165,6 +180,8 @@ acpi_button_notify_handler(ACPI_HANDLE h, UINT32 notify, void *context)
|
||||
{
|
||||
struct acpi_button_softc *sc = (struct acpi_button_softc *)context;
|
||||
|
||||
FUNCTION_TRACE_U32(__FUNCTION__, notify);
|
||||
|
||||
switch (notify) {
|
||||
case ACPI_NOTIFY_BUTTON_PRESSED_FOR_SLEEP:
|
||||
AcpiOsQueueForExecution(OSD_PRIORITY_LO, acpi_button_notify_pressed_for_sleep, sc);
|
||||
@ -175,8 +192,9 @@ acpi_button_notify_handler(ACPI_HANDLE h, UINT32 notify, void *context)
|
||||
device_printf(sc->button_dev, "pressed for wakeup, button type: %d\n", sc->button_type);
|
||||
break;
|
||||
default:
|
||||
return; /* unknown notification value */
|
||||
break; /* unknown notification value */
|
||||
}
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
|
||||
|
@ -149,6 +149,12 @@
|
||||
#include <dev/acpica/acpivar.h>
|
||||
#include <dev/acpica/acpi_ecreg.h>
|
||||
|
||||
/*
|
||||
* Hooks for the ACPI CA debugging infrastructure
|
||||
*/
|
||||
#define _COMPONENT EMBEDDED_CONTROLLER
|
||||
MODULE_NAME("EC")
|
||||
|
||||
struct acpi_ec_softc {
|
||||
device_t ec_dev;
|
||||
ACPI_HANDLE ec_handle;
|
||||
@ -246,9 +252,11 @@ DRIVER_MODULE(acpi_ec, acpi, acpi_ec_driver, acpi_ec_devclass, 0, 0);
|
||||
static void
|
||||
acpi_ec_identify(driver_t driver, device_t bus)
|
||||
{
|
||||
ACPI_STATUS Status;
|
||||
FUNCTION_TRACE(__FUNCTION__);
|
||||
|
||||
/* XXX implement - need an ACPI 2.0 system to test this */
|
||||
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -258,7 +266,9 @@ acpi_ec_identify(driver_t driver, device_t bus)
|
||||
static int
|
||||
acpi_ec_probe(device_t dev)
|
||||
{
|
||||
|
||||
if ((acpi_get_type(dev) == ACPI_TYPE_DEVICE) &&
|
||||
!acpi_disabled("ec") &&
|
||||
acpi_MatchHid(dev, "PNP0C09")) {
|
||||
|
||||
/*
|
||||
@ -280,6 +290,8 @@ acpi_ec_attach(device_t dev)
|
||||
ACPI_STATUS Status;
|
||||
struct acpi_object_list *args;
|
||||
|
||||
FUNCTION_TRACE(__FUNCTION__);
|
||||
|
||||
/*
|
||||
* Fetch/initialise softc
|
||||
*/
|
||||
@ -299,7 +311,7 @@ acpi_ec_attach(device_t dev)
|
||||
if ((sc->ec_data_res = bus_alloc_resource(sc->ec_dev, SYS_RES_IOPORT, &sc->ec_data_rid,
|
||||
0, ~0, 1, RF_ACTIVE)) == NULL) {
|
||||
device_printf(dev, "can't allocate data port\n");
|
||||
return(ENXIO);
|
||||
return_VALUE(ENXIO);
|
||||
}
|
||||
sc->ec_data_tag = rman_get_bustag(sc->ec_data_res);
|
||||
sc->ec_data_handle = rman_get_bushandle(sc->ec_data_res);
|
||||
@ -308,7 +320,7 @@ acpi_ec_attach(device_t dev)
|
||||
if ((sc->ec_csr_res = bus_alloc_resource(sc->ec_dev, SYS_RES_IOPORT, &sc->ec_csr_rid,
|
||||
0, ~0, 1, RF_ACTIVE)) == NULL) {
|
||||
device_printf(dev, "can't allocate command/status port\n");
|
||||
return(ENXIO);
|
||||
return_VALUE(ENXIO);
|
||||
}
|
||||
sc->ec_csr_tag = rman_get_bustag(sc->ec_csr_res);
|
||||
sc->ec_csr_handle = rman_get_bushandle(sc->ec_csr_res);
|
||||
@ -318,7 +330,7 @@ acpi_ec_attach(device_t dev)
|
||||
*/
|
||||
if ((Status = AcpiOsCreateSemaphore(1, 1, &sc->ec_semaphore)) != AE_OK) {
|
||||
device_printf(dev, "can't create semaphore - %s\n", acpi_strerror(Status));
|
||||
return(ENXIO);
|
||||
return_VALUE(ENXIO);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -328,15 +340,15 @@ acpi_ec_attach(device_t dev)
|
||||
* status (SCI).
|
||||
*/
|
||||
if ((bufp = acpi_AllocBuffer(16)) == NULL)
|
||||
return(ENOMEM);
|
||||
return_VALUE(ENOMEM);
|
||||
if ((Status = AcpiEvaluateObject(sc->ec_handle, "_GPE", NULL, bufp)) != AE_OK) {
|
||||
device_printf(dev, "can't evaluate _GPE method - %s\n", acpi_strerror(Status));
|
||||
return(ENXIO);
|
||||
return_VALUE(ENXIO);
|
||||
}
|
||||
param = (UINT32 *)bufp->Pointer;
|
||||
if (param[0] != ACPI_TYPE_NUMBER) {
|
||||
device_printf(dev, "_GPE method returned bad result\n");
|
||||
return(ENXIO);
|
||||
return_VALUE(ENXIO);
|
||||
}
|
||||
sc->ec_gpebit = param[1];
|
||||
AcpiOsFree(bufp);
|
||||
@ -352,7 +364,7 @@ acpi_ec_attach(device_t dev)
|
||||
if ((Status = AcpiInstallGpeHandler(sc->ec_gpebit, ACPI_EVENT_LEVEL_TRIGGERED | ACPI_EVENT_EDGE_TRIGGERED,
|
||||
EcGpeHandler, sc)) != AE_OK) {
|
||||
device_printf(dev, "can't install GPE handler - %s\n", acpi_strerror(Status));
|
||||
return(ENXIO);
|
||||
return_VALUE(ENXIO);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -361,14 +373,14 @@ acpi_ec_attach(device_t dev)
|
||||
if ((Status = AcpiInstallAddressSpaceHandler(sc->ec_handle, ADDRESS_SPACE_EC,
|
||||
&EcSpaceHandler, &EcSpaceSetup, sc)) != AE_OK) {
|
||||
device_printf(dev, "can't install address space handler - %s\n", acpi_strerror(Status));
|
||||
return(ENXIO);
|
||||
return_VALUE(ENXIO);
|
||||
}
|
||||
|
||||
/*
|
||||
* Evaluate _REG to indicate that the region is now available.
|
||||
*/
|
||||
if ((args = acpi_AllocObjectList(2)) == NULL)
|
||||
return(ENOMEM);
|
||||
return_VALUE(ENOMEM);
|
||||
args->object[0].Type = ACPI_TYPE_NUMBER;
|
||||
args->object[0].Number.Value = ADDRESS_SPACE_EC;
|
||||
args->object[1].Type = ACPI_TYPE_NUMBER;
|
||||
@ -381,10 +393,10 @@ acpi_ec_attach(device_t dev)
|
||||
*/
|
||||
if ((Status != AE_OK) && (Status != AE_NOT_FOUND)) {
|
||||
device_printf(dev, "can't evaluate _REG method - %s\n", acpi_strerror(Status));
|
||||
return(ENXIO);
|
||||
return_VALUE(ENXIO);
|
||||
}
|
||||
|
||||
return(0);
|
||||
return_VALUE(0);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -395,6 +407,8 @@ EcGpeHandler(void *Context)
|
||||
ACPI_STATUS Status;
|
||||
char qxx[5];
|
||||
|
||||
FUNCTION_TRACE(__FUNCTION__);
|
||||
|
||||
for (;;) {
|
||||
|
||||
/*
|
||||
@ -434,6 +448,7 @@ EcGpeHandler(void *Context)
|
||||
qxx, acpi_strerror(Status));
|
||||
}
|
||||
}
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
static ACPI_STATUS
|
||||
@ -455,8 +470,10 @@ EcSpaceHandler(UINT32 Function, ACPI_PHYSICAL_ADDRESS Address, UINT32 width, UIN
|
||||
ACPI_STATUS Status = AE_OK;
|
||||
EC_REQUEST EcRequest;
|
||||
|
||||
FUNCTION_TRACE_U32(__FUNCTION__, Address);
|
||||
|
||||
if ((Address > 0xFF) || (width != 8) || (Value == NULL) || (Context == NULL))
|
||||
return(AE_BAD_PARAMETER);
|
||||
return_ACPI_STATUS(AE_BAD_PARAMETER);
|
||||
|
||||
switch (Function) {
|
||||
case ADDRESS_SPACE_READ:
|
||||
@ -473,7 +490,7 @@ EcSpaceHandler(UINT32 Function, ACPI_PHYSICAL_ADDRESS Address, UINT32 width, UIN
|
||||
|
||||
default:
|
||||
device_printf(sc->ec_dev, "invalid Address Space function %d\n", Function);
|
||||
return(AE_BAD_PARAMETER);
|
||||
return_ACPI_STATUS(AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -482,7 +499,7 @@ EcSpaceHandler(UINT32 Function, ACPI_PHYSICAL_ADDRESS Address, UINT32 width, UIN
|
||||
if ((Status = EcTransaction(sc, &EcRequest)) == AE_OK)
|
||||
(*Value) = (UINT32)EcRequest.Data;
|
||||
|
||||
return(Status);
|
||||
return_ACPI_STATUS(Status);
|
||||
}
|
||||
|
||||
static ACPI_STATUS
|
||||
|
@ -43,6 +43,12 @@
|
||||
|
||||
#include <dev/acpica/acpivar.h>
|
||||
|
||||
/*
|
||||
* Hooks for the ACPI CA debugging infrastructure
|
||||
*/
|
||||
#define _COMPONENT BUS_MANAGER
|
||||
MODULE_NAME("ISA")
|
||||
|
||||
#define PNP_HEXTONUM(c) ((c) >= 'a' \
|
||||
? (c) - 'a' + 10 \
|
||||
: ((c) >= 'A' \
|
||||
@ -136,10 +142,18 @@ acpi_isa_identify(driver_t *driver, device_t bus)
|
||||
ACPI_HANDLE parent;
|
||||
ACPI_STATUS status;
|
||||
|
||||
/*If this driver is loaded from userland ,just ignore*/
|
||||
if(!cold){
|
||||
return;
|
||||
}
|
||||
FUNCTION_TRACE(__FUNCTION__);
|
||||
|
||||
if (acpi_disabled("isa"))
|
||||
return_VOID;
|
||||
|
||||
/*
|
||||
* If this driver is loaded from userland, we can assume that
|
||||
* the ISA bus has already been detected, and we should not
|
||||
* interfere.
|
||||
*/
|
||||
if (!cold)
|
||||
return_VOID;
|
||||
|
||||
/*
|
||||
* Look for the _SB_ scope, which will contain all the devices
|
||||
@ -147,13 +161,13 @@ acpi_isa_identify(driver_t *driver, device_t bus)
|
||||
*/
|
||||
if ((status = AcpiGetHandle(ACPI_ROOT_OBJECT, "\\_SB_", &parent)) != AE_OK) {
|
||||
device_printf(bus, "no ACPI _SB_ scope - %s\n", acpi_strerror(status));
|
||||
return;
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
if ((status = AcpiWalkNamespace(ACPI_TYPE_DEVICE, parent, 100, acpi_isa_identify_child, bus, NULL)) != AE_OK) {
|
||||
if ((status = AcpiWalkNamespace(ACPI_TYPE_DEVICE, parent, 100, acpi_isa_identify_child, bus, NULL)) != AE_OK)
|
||||
device_printf(bus, "AcpiWalkNamespace on _SB_ failed - %s\n", acpi_strerror(status));
|
||||
return;
|
||||
}
|
||||
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -174,17 +188,25 @@ acpi_isa_identify_child(ACPI_HANDLE handle, UINT32 level, void *context, void **
|
||||
device_t child, bus = (device_t)context;
|
||||
u_int32_t devid;
|
||||
|
||||
FUNCTION_TRACE(__FUNCTION__);
|
||||
|
||||
/*
|
||||
* Try to get information about the device
|
||||
* Skip this node if it's on the 'avoid' list.
|
||||
*/
|
||||
if (acpi_avoid(handle))
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
|
||||
/*
|
||||
* Try to get information about the device.
|
||||
*/
|
||||
if (AcpiGetObjectInfo(handle, &devinfo) != AE_OK)
|
||||
return(AE_OK);
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
|
||||
/*
|
||||
* Reformat the _HID value into 32 bits.
|
||||
*/
|
||||
if (!(devinfo.Valid & ACPI_VALID_HID))
|
||||
return(AE_OK);
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
|
||||
/*
|
||||
* XXX Try to avoid passing stuff to ISA that it just isn't interested
|
||||
@ -195,7 +217,7 @@ acpi_isa_identify_child(ACPI_HANDLE handle, UINT32 level, void *context, void **
|
||||
* this is very difficult. Maybe we need a device_configure method?
|
||||
*/
|
||||
if (!(strncmp(devinfo.HardwareId, "PNP0C", 5)))
|
||||
return(AE_OK);
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
|
||||
devid = PNP_EISAID(devinfo.HardwareId);
|
||||
|
||||
@ -210,7 +232,7 @@ acpi_isa_identify_child(ACPI_HANDLE handle, UINT32 level, void *context, void **
|
||||
* point as well.
|
||||
*/
|
||||
if (acpi_GetIntoBuffer(handle, AcpiGetCurrentResources, &buf) != AE_OK)
|
||||
return(AE_OK);
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
|
||||
/*
|
||||
* Add the device and parse our resources
|
||||
@ -225,10 +247,12 @@ acpi_isa_identify_child(ACPI_HANDLE handle, UINT32 level, void *context, void **
|
||||
if (!device_get_desc(child))
|
||||
device_set_desc_copy(child, devinfo.HardwareId);
|
||||
|
||||
DEBUG_PRINT(TRACE_OBJECTS, ("added ISA PnP info for %s\n", acpi_name(handle)));
|
||||
|
||||
/*
|
||||
* XXX Parse configuration data and _CID list to find compatible IDs
|
||||
*/
|
||||
return(AE_OK);
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -236,10 +260,14 @@ acpi_isa_set_init(device_t dev, void **context)
|
||||
{
|
||||
struct acpi_isa_context *cp;
|
||||
|
||||
FUNCTION_TRACE(__FUNCTION__);
|
||||
|
||||
cp = malloc(sizeof(*cp), M_DEVBUF, M_NOWAIT);
|
||||
bzero(cp, sizeof(*cp));
|
||||
cp->ai_nconfigs = 1;
|
||||
*context = cp;
|
||||
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -250,8 +278,10 @@ acpi_isa_set_done(device_t dev, void *context)
|
||||
device_t parent;
|
||||
int i, j;
|
||||
|
||||
FUNCTION_TRACE(__FUNCTION__);
|
||||
|
||||
if (cp == NULL)
|
||||
return;
|
||||
return_VOID;
|
||||
parent = device_get_parent(dev);
|
||||
|
||||
/* simple config without dependants */
|
||||
@ -268,7 +298,7 @@ acpi_isa_set_done(device_t dev, void *context)
|
||||
if (config->ic_nmem == ISA_NMEM) {
|
||||
device_printf(parent, "too many memory ranges\n");
|
||||
free(configs, M_DEVBUF);
|
||||
return;
|
||||
return_VOID;
|
||||
}
|
||||
config->ic_mem[config->ic_nmem] = configs[0].ic_mem[j];
|
||||
config->ic_nmem++;
|
||||
@ -277,7 +307,7 @@ acpi_isa_set_done(device_t dev, void *context)
|
||||
if (config->ic_nport == ISA_NPORT) {
|
||||
device_printf(parent, "too many port ranges\n");
|
||||
free(configs, M_DEVBUF);
|
||||
return;
|
||||
return_VOID;
|
||||
}
|
||||
config->ic_port[config->ic_nport] = configs[0].ic_port[j];
|
||||
config->ic_nport++;
|
||||
@ -286,7 +316,7 @@ acpi_isa_set_done(device_t dev, void *context)
|
||||
if (config->ic_nirq == ISA_NIRQ) {
|
||||
device_printf(parent, "too many irq ranges\n");
|
||||
free(configs, M_DEVBUF);
|
||||
return;
|
||||
return_VOID;
|
||||
}
|
||||
config->ic_irqmask[config->ic_nirq] = configs[0].ic_irqmask[j];
|
||||
config->ic_nirq++;
|
||||
@ -295,7 +325,7 @@ acpi_isa_set_done(device_t dev, void *context)
|
||||
if (config->ic_ndrq == ISA_NDRQ) {
|
||||
device_printf(parent, "too many drq ranges\n");
|
||||
free(configs, M_DEVBUF);
|
||||
return;
|
||||
return_VOID;
|
||||
}
|
||||
config->ic_drqmask[config->ic_ndrq] = configs[0].ic_drqmask[j];
|
||||
config->ic_ndrq++;
|
||||
@ -305,6 +335,8 @@ acpi_isa_set_done(device_t dev, void *context)
|
||||
|
||||
done:
|
||||
free(cp, M_DEVBUF);
|
||||
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -38,6 +38,12 @@
|
||||
|
||||
#include <dev/acpica/acpivar.h>
|
||||
|
||||
/*
|
||||
* Hooks for the ACPI CA debugging infrastructure
|
||||
*/
|
||||
#define _COMPONENT SYSTEM_CONTROL
|
||||
MODULE_NAME("LID")
|
||||
|
||||
struct acpi_lid_softc {
|
||||
device_t lid_dev;
|
||||
ACPI_HANDLE lid_handle;
|
||||
@ -70,6 +76,7 @@ static int
|
||||
acpi_lid_probe(device_t dev)
|
||||
{
|
||||
if ((acpi_get_type(dev) == ACPI_TYPE_DEVICE) &&
|
||||
!acpi_disabled("lid") &&
|
||||
acpi_MatchHid(dev, "PNP0C0D")) {
|
||||
device_set_desc(dev, "Control Method Lid Switch");
|
||||
return(0);
|
||||
@ -82,6 +89,8 @@ acpi_lid_attach(device_t dev)
|
||||
{
|
||||
struct acpi_lid_softc *sc;
|
||||
|
||||
FUNCTION_TRACE(__FUNCTION__);
|
||||
|
||||
sc = device_get_softc(dev);
|
||||
sc->lid_dev = dev;
|
||||
sc->lid_handle = acpi_get_handle(dev);
|
||||
@ -90,7 +99,7 @@ acpi_lid_attach(device_t dev)
|
||||
* Install notification handler
|
||||
*/
|
||||
AcpiInstallNotifyHandler(sc->lid_handle, ACPI_DEVICE_NOTIFY, acpi_lid_notify_handler, sc);
|
||||
return(0);
|
||||
return_VALUE(0);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -101,6 +110,8 @@ acpi_lid_notify_status_changed(void *arg)
|
||||
ACPI_BUFFER Buffer;
|
||||
ACPI_OBJECT Object;
|
||||
|
||||
FUNCTION_TRACE(__FUNCTION__);
|
||||
|
||||
sc = (struct acpi_lid_softc *)arg;
|
||||
|
||||
/*
|
||||
@ -111,9 +122,9 @@ acpi_lid_notify_status_changed(void *arg)
|
||||
Buffer.Length = sizeof(Object);
|
||||
Buffer.Pointer = &Object;
|
||||
if (AcpiEvaluateObject(sc->lid_handle, "_LID", NULL, &Buffer) != AE_OK)
|
||||
return;
|
||||
return_VOID;
|
||||
if (Object.Type != ACPI_TYPE_NUMBER)
|
||||
return;
|
||||
return_VOID;
|
||||
|
||||
/*
|
||||
* Update lid status
|
||||
@ -123,7 +134,7 @@ acpi_lid_notify_status_changed(void *arg)
|
||||
|
||||
acpi_sc = acpi_device_get_parent_softc(sc->lid_dev);
|
||||
if (acpi_sc == NULL) {
|
||||
return;
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
if (sc->lid_status == 0) {
|
||||
@ -131,6 +142,8 @@ acpi_lid_notify_status_changed(void *arg)
|
||||
} else {
|
||||
EVENTHANDLER_INVOKE(acpi_wakeup_event, acpi_sc->acpi_lid_switch_sx);
|
||||
}
|
||||
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
/* XXX maybe not here */
|
||||
@ -141,12 +154,15 @@ acpi_lid_notify_handler(ACPI_HANDLE h, UINT32 notify, void *context)
|
||||
{
|
||||
struct acpi_lid_softc *sc = (struct acpi_lid_softc *)context;
|
||||
|
||||
FUNCTION_TRACE_U32(__FUNCTION__, notify);
|
||||
|
||||
switch (notify) {
|
||||
case ACPI_NOTIFY_STATUS_CHANGED:
|
||||
AcpiOsQueueForExecution(OSD_PRIORITY_LO, acpi_lid_notify_status_changed, sc);
|
||||
break;
|
||||
default:
|
||||
return; /* unknown notification value */
|
||||
break; /* unknown notification value */
|
||||
}
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
|
@ -39,6 +39,12 @@
|
||||
#include <pci/pcivar.h>
|
||||
#include "pcib_if.h"
|
||||
|
||||
/*
|
||||
* Hooks for the ACPI CA debugging infrastructure
|
||||
*/
|
||||
#define _COMPONENT BUS_MANAGER
|
||||
MODULE_NAME("PCIB")
|
||||
|
||||
struct acpi_pcib_softc {
|
||||
device_t ap_dev;
|
||||
ACPI_HANDLE ap_handle;
|
||||
@ -99,6 +105,7 @@ acpi_pcib_probe(device_t dev)
|
||||
{
|
||||
|
||||
if ((acpi_get_type(dev) == ACPI_TYPE_DEVICE) &&
|
||||
!acpi_disabled("pci") &&
|
||||
acpi_MatchHid(dev, "PNP0A03")) {
|
||||
|
||||
/*
|
||||
@ -116,6 +123,9 @@ acpi_pcib_attach(device_t dev)
|
||||
struct acpi_pcib_softc *sc;
|
||||
device_t child;
|
||||
ACPI_STATUS status;
|
||||
int result;
|
||||
|
||||
FUNCTION_TRACE(__FUNCTION__);
|
||||
|
||||
sc = device_get_softc(dev);
|
||||
sc->ap_dev = dev;
|
||||
@ -128,7 +138,7 @@ acpi_pcib_attach(device_t dev)
|
||||
* on a hot-plug docking station, etc.
|
||||
*/
|
||||
if (!acpi_DeviceIsPresent(dev))
|
||||
return(ENXIO);
|
||||
return_VALUE(ENXIO);
|
||||
|
||||
/*
|
||||
* Get our segment number by evaluating _SEG
|
||||
@ -137,7 +147,7 @@ acpi_pcib_attach(device_t dev)
|
||||
if ((status = acpi_EvaluateNumber(sc->ap_handle, "_SEG", &sc->ap_segment)) != AE_OK) {
|
||||
if (status != AE_NOT_FOUND) {
|
||||
device_printf(dev, "could not evaluate _SEG - %s\n", acpi_strerror(status));
|
||||
return(ENXIO);
|
||||
return_VALUE(ENXIO);
|
||||
}
|
||||
/* if it's not found, assume 0 */
|
||||
sc->ap_segment = 0;
|
||||
@ -159,7 +169,7 @@ acpi_pcib_attach(device_t dev)
|
||||
if ((status = acpi_EvaluateNumber(sc->ap_handle, "_BBN", &sc->ap_bus)) != AE_OK) {
|
||||
if (status != AE_NOT_FOUND) {
|
||||
device_printf(dev, "could not evaluate _BBN - %s\n", acpi_strerror(status));
|
||||
return(ENXIO);
|
||||
return_VALUE(ENXIO);
|
||||
}
|
||||
/* if it's not found, assume 0 */
|
||||
sc->ap_bus = 0;
|
||||
@ -170,14 +180,14 @@ acpi_pcib_attach(device_t dev)
|
||||
* (should we complain here?).
|
||||
*/
|
||||
if (devclass_get_device(devclass_find("pci"), sc->ap_bus) != NULL)
|
||||
return(0);
|
||||
return_VALUE(0);
|
||||
|
||||
/*
|
||||
* Attach the PCI bus proper.
|
||||
*/
|
||||
if ((child = device_add_child(dev, "pci", sc->ap_bus)) == NULL) {
|
||||
device_printf(device_get_parent(dev), "couldn't attach pci bus");
|
||||
return(ENXIO);
|
||||
return_VALUE(ENXIO);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -186,7 +196,8 @@ acpi_pcib_attach(device_t dev)
|
||||
* XXX It would be nice to defer this and count on the nexus getting it
|
||||
* after the first pass, but this does not seem to be reliable.
|
||||
*/
|
||||
return(bus_generic_attach(dev));
|
||||
result = bus_generic_attach(dev);
|
||||
return_VALUE(result);
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -39,6 +39,12 @@
|
||||
#include <pci/pcivar.h>
|
||||
#include "pcib_if.h"
|
||||
|
||||
/*
|
||||
* Hooks for the ACPI CA debugging infrastructure
|
||||
*/
|
||||
#define _COMPONENT BUS_MANAGER
|
||||
MODULE_NAME("PCIB")
|
||||
|
||||
struct acpi_pcib_softc {
|
||||
device_t ap_dev;
|
||||
ACPI_HANDLE ap_handle;
|
||||
@ -99,6 +105,7 @@ acpi_pcib_probe(device_t dev)
|
||||
{
|
||||
|
||||
if ((acpi_get_type(dev) == ACPI_TYPE_DEVICE) &&
|
||||
!acpi_disabled("pci") &&
|
||||
acpi_MatchHid(dev, "PNP0A03")) {
|
||||
|
||||
/*
|
||||
@ -116,6 +123,9 @@ acpi_pcib_attach(device_t dev)
|
||||
struct acpi_pcib_softc *sc;
|
||||
device_t child;
|
||||
ACPI_STATUS status;
|
||||
int result;
|
||||
|
||||
FUNCTION_TRACE(__FUNCTION__);
|
||||
|
||||
sc = device_get_softc(dev);
|
||||
sc->ap_dev = dev;
|
||||
@ -128,7 +138,7 @@ acpi_pcib_attach(device_t dev)
|
||||
* on a hot-plug docking station, etc.
|
||||
*/
|
||||
if (!acpi_DeviceIsPresent(dev))
|
||||
return(ENXIO);
|
||||
return_VALUE(ENXIO);
|
||||
|
||||
/*
|
||||
* Get our segment number by evaluating _SEG
|
||||
@ -137,7 +147,7 @@ acpi_pcib_attach(device_t dev)
|
||||
if ((status = acpi_EvaluateNumber(sc->ap_handle, "_SEG", &sc->ap_segment)) != AE_OK) {
|
||||
if (status != AE_NOT_FOUND) {
|
||||
device_printf(dev, "could not evaluate _SEG - %s\n", acpi_strerror(status));
|
||||
return(ENXIO);
|
||||
return_VALUE(ENXIO);
|
||||
}
|
||||
/* if it's not found, assume 0 */
|
||||
sc->ap_segment = 0;
|
||||
@ -159,7 +169,7 @@ acpi_pcib_attach(device_t dev)
|
||||
if ((status = acpi_EvaluateNumber(sc->ap_handle, "_BBN", &sc->ap_bus)) != AE_OK) {
|
||||
if (status != AE_NOT_FOUND) {
|
||||
device_printf(dev, "could not evaluate _BBN - %s\n", acpi_strerror(status));
|
||||
return(ENXIO);
|
||||
return_VALUE(ENXIO);
|
||||
}
|
||||
/* if it's not found, assume 0 */
|
||||
sc->ap_bus = 0;
|
||||
@ -170,14 +180,14 @@ acpi_pcib_attach(device_t dev)
|
||||
* (should we complain here?).
|
||||
*/
|
||||
if (devclass_get_device(devclass_find("pci"), sc->ap_bus) != NULL)
|
||||
return(0);
|
||||
return_VALUE(0);
|
||||
|
||||
/*
|
||||
* Attach the PCI bus proper.
|
||||
*/
|
||||
if ((child = device_add_child(dev, "pci", sc->ap_bus)) == NULL) {
|
||||
device_printf(device_get_parent(dev), "couldn't attach pci bus");
|
||||
return(ENXIO);
|
||||
return_VALUE(ENXIO);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -186,7 +196,8 @@ acpi_pcib_attach(device_t dev)
|
||||
* XXX It would be nice to defer this and count on the nexus getting it
|
||||
* after the first pass, but this does not seem to be reliable.
|
||||
*/
|
||||
return(bus_generic_attach(dev));
|
||||
result = bus_generic_attach(dev);
|
||||
return_VALUE(result);
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -154,6 +154,12 @@
|
||||
|
||||
#include <dev/acpica/acpivar.h>
|
||||
|
||||
/*
|
||||
* Hooks for the ACPI CA debugging infrastructure
|
||||
*/
|
||||
#define _COMPONENT PROCESSOR_CONTROL
|
||||
MODULE_NAME("PROCESSOR")
|
||||
|
||||
#define PR_MAX_POWER_STATES 4
|
||||
#define PR_MAX_PERFORMANCE_STATES 8
|
||||
#define PR_MAX_THROTTLING_STATES 8
|
||||
@ -297,8 +303,13 @@ acpi_pr_identify(driver_t *driver, device_t bus)
|
||||
{
|
||||
ACPI_HANDLE handle;
|
||||
|
||||
if (AcpiGetHandle(ACPI_ROOT_OBJECT, "\\_PR_", &handle) == AE_OK)
|
||||
FUNCTION_TRACE(__FUNCTION__);
|
||||
|
||||
if (!acpi_disabled("processor") &&
|
||||
(AcpiGetHandle(ACPI_ROOT_OBJECT, "\\_PR_", &handle) == AE_OK))
|
||||
AcpiWalkNamespace(ACPI_TYPE_PROCESSOR, handle, 2, acpi_pr_identify_cpu, bus, NULL);
|
||||
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -311,20 +322,21 @@ acpi_pr_identify_cpu(ACPI_HANDLE handle, UINT32 level, void *context, void **sta
|
||||
device_t child;
|
||||
PROCESSOR_APIC lapic;
|
||||
|
||||
FUNCTION_TRACE(__FUNCTION__);
|
||||
|
||||
acpi_pr_FindLapic(bus, handle, &lapic);
|
||||
|
||||
if (lapic.ProcessorEnabled) {
|
||||
if ((child = BUS_ADD_CHILD(bus, 0, "acpi_pr", -1)) == NULL) {
|
||||
device_printf(bus, "could not create CPU device\n");
|
||||
return(AE_OK);
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
acpi_set_handle(child, handle);
|
||||
acpi_set_magic(child, PR_MAGIC);
|
||||
device_set_desc(child, "processor device");
|
||||
}
|
||||
|
||||
return(AE_OK);
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
static int
|
||||
@ -340,6 +352,8 @@ acpi_pr_attach(device_t dev)
|
||||
{
|
||||
struct acpi_pr_softc *sc;
|
||||
|
||||
FUNCTION_TRACE(__FUNCTION__);
|
||||
|
||||
sc = device_get_softc(dev);
|
||||
sc->pr_dev = dev;
|
||||
sc->pr_handle = acpi_get_handle(dev);
|
||||
@ -362,7 +376,7 @@ acpi_pr_attach(device_t dev)
|
||||
|
||||
/* XXX call MD cpu-identification here? */
|
||||
|
||||
return(0);
|
||||
return_VALUE(0);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -447,6 +461,8 @@ acpi_pr_CalculatePowerStates(struct acpi_pr_softc *sc)
|
||||
u_int32_t StateCount = 0;
|
||||
u_int32_t i = 0;
|
||||
|
||||
FUNCTION_TRACE(__FUNCTION__);
|
||||
|
||||
/*
|
||||
* Set Latency Defaults:
|
||||
* ---------------------
|
||||
@ -467,7 +483,7 @@ acpi_pr_CalculatePowerStates(struct acpi_pr_softc *sc)
|
||||
Status = acpi_GetIntoBuffer(sc->pr_handle, AcpiGetProcessorCxInfo, &Buffer);
|
||||
if (Status != AE_OK) {
|
||||
device_printf(sc->pr_dev, "could not fetch ProcessorCxInfo - %s\n", acpi_strerror(Status));
|
||||
return(Status);
|
||||
return_ACPI_STATUS(Status);
|
||||
}
|
||||
|
||||
State = (ACPI_CX_STATE*)(Buffer.Pointer);
|
||||
@ -487,7 +503,7 @@ acpi_pr_CalculatePowerStates(struct acpi_pr_softc *sc)
|
||||
sc->pr_PowerStates.ActiveState = PR_POWER_STATE_C1;
|
||||
|
||||
AcpiOsFree(Buffer.Pointer);
|
||||
return(Status);
|
||||
return_ACPI_STATUS(Status);
|
||||
}
|
||||
|
||||
static ACPI_STATUS
|
||||
@ -495,9 +511,11 @@ acpi_pr_CalculatePerformanceStates(struct acpi_pr_softc *sc)
|
||||
{
|
||||
ACPI_STATUS Status = AE_OK;
|
||||
|
||||
FUNCTION_TRACE(__FUNCTION__);
|
||||
|
||||
/* TODO... */
|
||||
|
||||
return(Status);
|
||||
return_ACPI_STATUS(Status);
|
||||
}
|
||||
|
||||
static ACPI_STATUS
|
||||
@ -509,6 +527,8 @@ acpi_pr_CalculateThrottlingStates(struct acpi_pr_softc *sc)
|
||||
u_int32_t StateCount = 0;
|
||||
u_int32_t i = 0;
|
||||
|
||||
FUNCTION_TRACE(__FUNCTION__);
|
||||
|
||||
/*
|
||||
* Get Throttling States:
|
||||
* ----------------------
|
||||
@ -516,7 +536,7 @@ acpi_pr_CalculateThrottlingStates(struct acpi_pr_softc *sc)
|
||||
Status = acpi_GetIntoBuffer(sc->pr_handle, AcpiGetProcessorThrottlingInfo, &Buffer);
|
||||
if (Status != AE_OK) {
|
||||
device_printf(sc->pr_dev, "could not fetch ThrottlingInfo - %s\n", acpi_strerror(Status));
|
||||
return(Status);
|
||||
return_ACPI_STATUS(Status);
|
||||
}
|
||||
|
||||
State = (ACPI_CPU_THROTTLING_STATE*)(Buffer.Pointer);
|
||||
@ -535,22 +555,24 @@ acpi_pr_CalculateThrottlingStates(struct acpi_pr_softc *sc)
|
||||
}
|
||||
|
||||
AcpiOsFree(Buffer.Pointer);
|
||||
return(Status);
|
||||
return_ACPI_STATUS(Status);
|
||||
}
|
||||
|
||||
static ACPI_STATUS
|
||||
acpi_pr_PolicyInitialize(struct acpi_pr_softc *sc)
|
||||
{
|
||||
ACPI_STATUS status;
|
||||
ACPI_STATUS Status;
|
||||
|
||||
if ((status = AcpiSetProcessorSleepState(sc->pr_handle, sc->pr_PowerStates.ActiveState)) != AE_OK) {
|
||||
device_printf(sc->pr_dev, "could not set Active sleep state - %s\n", acpi_strerror(status));
|
||||
return(status);
|
||||
FUNCTION_TRACE(__FUNCTION__);
|
||||
|
||||
if ((Status = AcpiSetProcessorSleepState(sc->pr_handle, sc->pr_PowerStates.ActiveState)) != AE_OK) {
|
||||
device_printf(sc->pr_dev, "could not set Active sleep state - %s\n", acpi_strerror(Status));
|
||||
return_ACPI_STATUS(Status);
|
||||
}
|
||||
|
||||
/* XXX need to hook ourselves to be called when things go idle */
|
||||
/* sc->pr_idleevent = EVENTHANDLER_FAST_REGISTER(idle_event, acpi_pr_IdleHandler, sc, IDLE_PRI_FIRST); */
|
||||
return(AE_OK);
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -38,6 +38,12 @@
|
||||
|
||||
#include <dev/acpica/acpivar.h>
|
||||
|
||||
/*
|
||||
* Hooks for the ACPI CA debugging infrastructure
|
||||
*/
|
||||
#define _COMPONENT BUS_MANAGER
|
||||
MODULE_NAME("RESOURCE")
|
||||
|
||||
/*
|
||||
* Fetch a device's resources and associate them with the device.
|
||||
*
|
||||
@ -54,18 +60,17 @@ acpi_parse_resources(device_t dev, ACPI_HANDLE handle, struct acpi_parse_resourc
|
||||
int i;
|
||||
void *context;
|
||||
|
||||
FUNCTION_TRACE(__FUNCTION__);
|
||||
|
||||
/*
|
||||
* Fetch the device resources
|
||||
*/
|
||||
if (((status = acpi_GetIntoBuffer(handle, AcpiGetPossibleResources, &buf)) != AE_OK) &&
|
||||
((status = acpi_GetIntoBuffer(handle, AcpiGetCurrentResources, &buf)) != AE_OK)) {
|
||||
device_printf(dev, "can't fetch ACPI resources - %s\n", acpi_strerror(status));
|
||||
return(status);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
#ifdef ACPI_RES_DEBUG
|
||||
device_printf(dev, "got %d bytes of resources\n", buf.Length);
|
||||
#endif
|
||||
DEBUG_PRINT(TRACE_RESOURCES, ("got %d bytes of resources\n", buf.Length));
|
||||
set->set_init(dev, &context);
|
||||
|
||||
/*
|
||||
@ -82,56 +87,42 @@ acpi_parse_resources(device_t dev, ACPI_HANDLE handle, struct acpi_parse_resourc
|
||||
*/
|
||||
switch(res->Id) {
|
||||
case EndTag:
|
||||
#ifdef ACPI_RES_DEBUG
|
||||
device_printf(dev, "EndTag\n");
|
||||
#endif
|
||||
DEBUG_PRINT(TRACE_RESOURCES, ("EndTag\n"));
|
||||
curr = last;
|
||||
break;
|
||||
|
||||
case FixedIo:
|
||||
#ifdef ACPI_RES_DEBUG
|
||||
device_printf(dev, "FixedIo 0x%x/%d\n", res->Data.FixedIo.BaseAddress, res->Data.FixedIo.RangeLength);
|
||||
#endif
|
||||
DEBUG_PRINT(TRACE_RESOURCES, ("FixedIo 0x%x/%d\n", res->Data.FixedIo.BaseAddress, res->Data.FixedIo.RangeLength));
|
||||
set->set_ioport(dev, context, res->Data.FixedIo.BaseAddress, res->Data.FixedIo.RangeLength);
|
||||
break;
|
||||
|
||||
case Io:
|
||||
if (res->Data.Io.MinBaseAddress == res->Data.Io.MaxBaseAddress) {
|
||||
#ifdef ACPI_RES_DEBUG
|
||||
device_printf(dev, "Io 0x%x/%d\n", res->Data.Io.MinBaseAddress, res->Data.Io.RangeLength);
|
||||
#endif
|
||||
DEBUG_PRINT(TRACE_RESOURCES, ("Io 0x%x/%d\n", res->Data.Io.MinBaseAddress, res->Data.Io.RangeLength));
|
||||
set->set_ioport(dev, context, res->Data.Io.MinBaseAddress, res->Data.Io.RangeLength);
|
||||
} else {
|
||||
#ifdef ACPI_RES_DEBUG
|
||||
device_printf(dev, "Io 0x%x-0x%x/%d\n", res->Data.Io.MinBaseAddress, res->Data.Io.MaxBaseAddress,
|
||||
res->Data.Io.RangeLength);
|
||||
#endif
|
||||
DEBUG_PRINT(TRACE_RESOURCES, ("Io 0x%x-0x%x/%d\n", res->Data.Io.MinBaseAddress, res->Data.Io.MaxBaseAddress,
|
||||
res->Data.Io.RangeLength));
|
||||
set->set_iorange(dev, context, res->Data.Io.MinBaseAddress, res->Data.Io.MaxBaseAddress,
|
||||
res->Data.Io.RangeLength, res->Data.Io.Alignment);
|
||||
}
|
||||
break;
|
||||
|
||||
case FixedMemory32:
|
||||
#ifdef ACPI_RES_DEBUG
|
||||
device_printf(dev, "FixedMemory32 0x%x/%d\n", res->Data.FixedMemory32.RangeBaseAddress,
|
||||
res->Data.FixedMemory32.RangeLength);
|
||||
#endif
|
||||
DEBUG_PRINT(TRACE_RESOURCES, ("FixedMemory32 0x%x/%d\n", res->Data.FixedMemory32.RangeBaseAddress,
|
||||
res->Data.FixedMemory32.RangeLength));
|
||||
set->set_memory(dev, context, res->Data.FixedMemory32.RangeBaseAddress,
|
||||
res->Data.FixedMemory32.RangeLength);
|
||||
break;
|
||||
|
||||
case Memory32:
|
||||
if (res->Data.Memory32.MinBaseAddress == res->Data.Memory32.MaxBaseAddress) {
|
||||
#ifdef ACPI_RES_DEBUG
|
||||
device_printf(dev, "Memory32 0x%x/%d\n", res->Data.Memory32.MinBaseAddress,
|
||||
res->Data.Memory32.RangeLength);
|
||||
#endif
|
||||
DEBUG_PRINT(TRACE_RESOURCES, ("Memory32 0x%x/%d\n", res->Data.Memory32.MinBaseAddress,
|
||||
res->Data.Memory32.RangeLength));
|
||||
set->set_memory(dev, context, res->Data.Memory32.MinBaseAddress, res->Data.Memory32.RangeLength);
|
||||
} else {
|
||||
#ifdef ACPI_RES_DEBUG
|
||||
device_printf(dev, "Memory32 0x%x-0x%x/%d\n", res->Data.Memory32.MinBaseAddress,
|
||||
res->Data.Memory32.MaxBaseAddress, res->Data.Memory32.RangeLength);
|
||||
#endif
|
||||
DEBUG_PRINT(TRACE_RESOURCES, ("Memory32 0x%x-0x%x/%d\n", res->Data.Memory32.MinBaseAddress,
|
||||
res->Data.Memory32.MaxBaseAddress, res->Data.Memory32.RangeLength));
|
||||
set->set_memoryrange(dev, context, res->Data.Memory32.MinBaseAddress, res->Data.Memory32.MaxBaseAddress,
|
||||
res->Data.Memory32.RangeLength, res->Data.Memory32.Alignment);
|
||||
}
|
||||
@ -139,16 +130,12 @@ acpi_parse_resources(device_t dev, ACPI_HANDLE handle, struct acpi_parse_resourc
|
||||
|
||||
case Memory24:
|
||||
if (res->Data.Memory24.MinBaseAddress == res->Data.Memory24.MaxBaseAddress) {
|
||||
#ifdef ACPI_RES_DEBUG
|
||||
device_printf(dev, "Memory24 0x%x/%d\n", res->Data.Memory24.MinBaseAddress,
|
||||
res->Data.Memory24.RangeLength);
|
||||
#endif
|
||||
DEBUG_PRINT(TRACE_RESOURCES, ("Memory24 0x%x/%d\n", res->Data.Memory24.MinBaseAddress,
|
||||
res->Data.Memory24.RangeLength));
|
||||
set->set_memory(dev, context, res->Data.Memory24.MinBaseAddress, res->Data.Memory24.RangeLength);
|
||||
} else {
|
||||
#ifdef ACPI_RES_DEBUG
|
||||
device_printf(dev, "Memory24 0x%x-0x%x/%d\n", res->Data.Memory24.MinBaseAddress,
|
||||
res->Data.Memory24.MaxBaseAddress, res->Data.Memory24.RangeLength);
|
||||
#endif
|
||||
DEBUG_PRINT(TRACE_RESOURCES, ("Memory24 0x%x-0x%x/%d\n", res->Data.Memory24.MinBaseAddress,
|
||||
res->Data.Memory24.MaxBaseAddress, res->Data.Memory24.RangeLength));
|
||||
set->set_memoryrange(dev, context, res->Data.Memory24.MinBaseAddress, res->Data.Memory24.MaxBaseAddress,
|
||||
res->Data.Memory24.RangeLength, res->Data.Memory24.Alignment);
|
||||
}
|
||||
@ -156,50 +143,42 @@ acpi_parse_resources(device_t dev, ACPI_HANDLE handle, struct acpi_parse_resourc
|
||||
|
||||
case Irq:
|
||||
for (i = 0; i < res->Data.Irq.NumberOfInterrupts; i++) {
|
||||
#ifdef ACPI_RES_DEBUG
|
||||
device_printf(dev, "Irq %d\n", res->Data.Irq.Interrupts[i]);
|
||||
#endif
|
||||
DEBUG_PRINT(TRACE_RESOURCES, ("Irq %d\n", res->Data.Irq.Interrupts[i]));
|
||||
set->set_irq(dev, context, res->Data.Irq.Interrupts[i]);
|
||||
}
|
||||
break;
|
||||
|
||||
case Dma:
|
||||
for (i = 0; i < res->Data.Dma.NumberOfChannels; i++) {
|
||||
#ifdef ACPI_RES_DEBUG
|
||||
device_printf(dev, "Drq %d\n", res->Data.Dma.Channels[i]);
|
||||
#endif
|
||||
DEBUG_PRINT(TRACE_RESOURCES, ("Drq %d\n", res->Data.Dma.Channels[i]));
|
||||
set->set_drq(dev, context, res->Data.Dma.Channels[i]);
|
||||
}
|
||||
break;
|
||||
|
||||
case StartDependentFunctions:
|
||||
#ifdef ACPI_RES_DEBUG
|
||||
device_printf(dev, "start dependant functions");
|
||||
#endif
|
||||
DEBUG_PRINT(TRACE_RESOURCES, ("start dependant functions"));
|
||||
set->set_start_dependant(dev, context, res->Data.StartDependentFunctions.CompatibilityPriority);
|
||||
break;
|
||||
|
||||
case EndDependentFunctions:
|
||||
#ifdef ACPI_RES_DEBUG
|
||||
device_printf(dev, "end dependant functions");
|
||||
#endif
|
||||
DEBUG_PRINT(TRACE_RESOURCES, ("end dependant functions"));
|
||||
set->set_end_dependant(dev, context);
|
||||
break;
|
||||
|
||||
case Address32:
|
||||
device_printf(dev, "unimplemented Address32 resource\n");
|
||||
DEBUG_PRINT(TRACE_RESOURCES, ("unimplemented Address32 resource\n"));
|
||||
break;
|
||||
|
||||
case Address16:
|
||||
device_printf(dev, "unimplemented Address16 resource\n");
|
||||
DEBUG_PRINT(TRACE_RESOURCES, ("unimplemented Address16 resource\n"));
|
||||
break;
|
||||
|
||||
case ExtendedIrq:
|
||||
device_printf(dev, "unimplemented ExtendedIrq resource\n");
|
||||
DEBUG_PRINT(TRACE_RESOURCES, ("unimplemented ExtendedIrq resource\n"));
|
||||
break;
|
||||
|
||||
case VendorSpecific:
|
||||
device_printf(dev, "unimplemented VendorSpecific resource\n");
|
||||
DEBUG_PRINT(TRACE_RESOURCES, ("unimplemented VendorSpecific resource\n"));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@ -207,7 +186,7 @@ acpi_parse_resources(device_t dev, ACPI_HANDLE handle, struct acpi_parse_resourc
|
||||
}
|
||||
AcpiOsFree(buf.Pointer);
|
||||
set->set_done(dev, context);
|
||||
return(AE_OK);
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
static void acpi_res_set_init(device_t dev, void **context);
|
||||
|
@ -36,6 +36,12 @@
|
||||
|
||||
#include <dev/acpica/acpivar.h>
|
||||
|
||||
/*
|
||||
* Hooks for the ACPI CA debugging infrastructure
|
||||
*/
|
||||
#define _COMPONENT THERMAL_CONTROL
|
||||
MODULE_NAME("THERMAL")
|
||||
|
||||
#define TZ_KELVTOC(x) (((x) - 2732) / 10), (((x) - 2732) % 10)
|
||||
|
||||
struct acpi_tz_softc {
|
||||
@ -66,11 +72,15 @@ DRIVER_MODULE(acpi_tz, acpi, acpi_tz_driver, acpi_tz_devclass, 0, 0);
|
||||
static int
|
||||
acpi_tz_probe(device_t dev)
|
||||
{
|
||||
if (acpi_get_type(dev) == ACPI_TYPE_THERMAL) {
|
||||
|
||||
FUNCTION_TRACE(__FUNCTION__);
|
||||
|
||||
if ((acpi_get_type(dev) == ACPI_TYPE_THERMAL) &&
|
||||
!acpi_disabled("thermal")) {
|
||||
device_set_desc(dev, "thermal zone");
|
||||
return(0);
|
||||
return_VALUE(0);
|
||||
}
|
||||
return(ENXIO);
|
||||
return_VALUE(ENXIO);
|
||||
}
|
||||
|
||||
static int
|
||||
@ -81,6 +91,8 @@ acpi_tz_attach(device_t dev)
|
||||
ACPI_BUFFER buf;
|
||||
ACPI_STATUS status;
|
||||
|
||||
FUNCTION_TRACE(__FUNCTION__);
|
||||
|
||||
sc = device_get_softc(dev);
|
||||
sc->tz_dev = dev;
|
||||
sc->tz_handle = acpi_get_handle(dev);
|
||||
@ -89,14 +101,14 @@ acpi_tz_attach(device_t dev)
|
||||
buf.Length = sizeof(param);
|
||||
if ((status = AcpiEvaluateObject(sc->tz_handle, "_TMP", NULL, &buf)) != AE_OK) {
|
||||
device_printf(sc->tz_dev, "can't fetch temperature - %s\n", acpi_strerror(status));
|
||||
return(ENXIO);
|
||||
return_VALUE(ENXIO);
|
||||
}
|
||||
if (param[0] != ACPI_TYPE_NUMBER) {
|
||||
device_printf(sc->tz_dev, "%s._TMP does not evaluate to ACPI_TYPE_NUMBER\n",
|
||||
acpi_name(sc->tz_handle));
|
||||
return(ENXIO);
|
||||
return_VALUE(ENXIO);
|
||||
}
|
||||
device_printf(sc->tz_dev, "current temperature %d.%dC\n", TZ_KELVTOC(param[1]));
|
||||
|
||||
return(0);
|
||||
return_VALUE(0);
|
||||
}
|
||||
|
@ -36,6 +36,12 @@
|
||||
|
||||
#include <dev/acpica/acpivar.h>
|
||||
|
||||
/*
|
||||
* Hooks for the ACPI CA debugging infrastructure
|
||||
*/
|
||||
#define _COMPONENT SYSTEM_CONTROL
|
||||
MODULE_NAME("TIMER")
|
||||
|
||||
#define ACPITIMER_MAGIC 0x524d4954 /* "TIMR" */
|
||||
|
||||
struct acpi_timer_softc {
|
||||
@ -73,28 +79,35 @@ acpi_timer_identify(driver_t *driver, device_t parent)
|
||||
device_t dev;
|
||||
char desc[40];
|
||||
|
||||
FUNCTION_TRACE(__FUNCTION__);
|
||||
|
||||
if (acpi_disabled("timer"))
|
||||
return_VOID;
|
||||
|
||||
buf.Pointer = &fadt;
|
||||
buf.Length = sizeof(fadt);
|
||||
if ((status = AcpiGetTable(ACPI_TABLE_FADT, 1, &buf)) != AE_OK) {
|
||||
device_printf(parent, "can't locate FADT - %s\n", acpi_strerror(status));
|
||||
return;
|
||||
return_VOID;
|
||||
}
|
||||
if (buf.Length != sizeof(fadt)) {
|
||||
device_printf(parent, "invalid FADT\n");
|
||||
return;
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
if ((dev = BUS_ADD_CHILD(parent, 0, "acpi_timer", 0)) == NULL) {
|
||||
device_printf(parent, "could not add acpi_timer0\n");
|
||||
return;
|
||||
return_VOID;
|
||||
}
|
||||
if (acpi_set_magic(dev, ACPITIMER_MAGIC)) {
|
||||
device_printf(dev, "could not set magic\n");
|
||||
return;
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
sprintf(desc, "%d-bit timer at 3.579545MHz", fadt.TmrValExt ? 32 : 24);
|
||||
device_set_desc_copy(dev, desc);
|
||||
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
static int
|
||||
@ -110,8 +123,10 @@ acpi_timer_attach(device_t dev)
|
||||
{
|
||||
struct acpi_timer_softc *sc;
|
||||
|
||||
FUNCTION_TRACE(__FUNCTION__);
|
||||
|
||||
sc = device_get_softc(dev);
|
||||
sc->tm_dev = dev;
|
||||
|
||||
return(0);
|
||||
return_VALUE(0);
|
||||
}
|
||||
|
@ -27,7 +27,14 @@
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
/*
|
||||
* Core ACPI subsystem ioctls
|
||||
*/
|
||||
#define ACPIIO_ENABLE _IO('P', 1)
|
||||
#define ACPIIO_DISABLE _IO('P', 2)
|
||||
#define ACPIIO_SETSLPSTATE _IOW('P', 3, int)
|
||||
|
||||
#ifdef _KERNEL
|
||||
extern int acpi_register_ioctl(u_long cmd, int (* fn)(u_long cmd, caddr_t addr, void *arg), void *arg);
|
||||
extern void acpi_deregister_ioctl(u_long cmd, int (* fn)(u_long cmd, caddr_t addr, void *arg));
|
||||
#endif
|
||||
|
@ -218,4 +218,5 @@ acpi_device_get_parent_softc(device_t child)
|
||||
|
||||
extern char *acpi_name(ACPI_HANDLE handle);
|
||||
extern int acpi_avoid(ACPI_HANDLE handle);
|
||||
extern int acpi_disabled(char *subsys);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user