- Add acpi_disable_events() and set it with EVENTHANDLER_REGISTER in order to

avoid power on again problem after acpi_soft_off() calling.
 - Implement SleepOp/StallOp in AML interpreter.  Also provide ACPICA
   compatibility.
 - Minor changes on __inline function declaration in acpica_osd.h
   (obtained from NetBSD porting).
This commit is contained in:
Mitsuru IWASAKI 2000-09-30 22:37:24 +00:00
parent e434fd9b90
commit 3ea2027588
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=66491
9 changed files with 158 additions and 65 deletions

View File

@ -831,7 +831,10 @@ acpi_attach(device_t dev)
acpi_powerres_debug(sc);
}
EVENTHANDLER_REGISTER(shutdown_final, acpi_soft_off, sc, SHUTDOWN_PRI_LAST);
EVENTHANDLER_REGISTER(shutdown_pre_sync, acpi_disable_events,
sc, SHUTDOWN_PRI_LAST);
EVENTHANDLER_REGISTER(shutdown_final, acpi_soft_off,
sc, SHUTDOWN_PRI_LAST);
sc->dev_t = make_dev(&acpi_cdevsw, 0, 0, 5, 0660, "acpi");
sc->dev_t->si_drv1 = sc;
@ -962,3 +965,39 @@ acpi_attach_resource(acpi_softc_t *sc, int type, int *wantidx, u_long start, u_l
return(ENXIO);
}
}
/*
* System service interface
*/
#include <sys/proc.h>
int
acpi_sleep(u_int32_t micro)
{
static u_int8_t count = 0;
int x, error;
u_int32_t timo;
x = error = 0;
if (micro == 0) {
return (1);
}
if (curproc == NULL) {
return (2);
}
timo = ((hz * micro) / 1000000L) ? ((hz * micro) / 1000000L) : 1;
error = tsleep((caddr_t)acpi_sleep + count, PWAIT, "acpislp", timo);
if (error != 0 && error != EWOULDBLOCK) {
return (2);
}
x = splhigh();
count++;
splx(x);
return (0);
}

View File

@ -297,6 +297,19 @@ acpi_enable_events(acpi_softc_t *sc)
acpi_io_pm_timer(sc, ACPI_REGISTER_INPUT, &status);
}
void
acpi_disable_events(acpi_softc_t *sc)
{
u_int32_t zero;
if (sc->enabled) {
zero = 0;
acpi_io_pm1_enable(sc, ACPI_REGISTER_OUTPUT, &zero);
acpi_io_gpe0_enable(sc, ACPI_REGISTER_OUTPUT, &zero);
acpi_io_gpe1_enable(sc, ACPI_REGISTER_OUTPUT, &zero);
}
}
void
acpi_clear_ignore_events(void *arg)
{

View File

@ -328,6 +328,9 @@ ACPI_STATUS OsdReadPciCfgDword(UINT32, UINT32 , UINT32 , UINT32 *);
ACPI_STATUS OsdWritePciCfgByte(UINT32, UINT32 , UINT32 , UINT8);
ACPI_STATUS OsdWritePciCfgWord(UINT32, UINT32 , UINT32 , UINT16);
ACPI_STATUS OsdWritePciCfgDword(UINT32, UINT32 , UINT32 , UINT32);
ACPI_STATUS OsdSleep(UINT32, UINT32);
ACPI_STATUS OsdSleepUsec(UINT32);
#endif /* ACPI_NO_OSDFUNC_INLINE */
#else /* !_KERNEL */

View File

@ -202,6 +202,7 @@ extern void acpi_intr(void *data);
extern void acpi_queue_event(acpi_softc_t *sc, int type, int arg);
extern int acpi_send_pm_event(acpi_softc_t *sc, u_int8_t state);
extern void acpi_enable_events(acpi_softc_t *sc);
extern void acpi_disable_events(acpi_softc_t *sc);
extern void acpi_clear_ignore_events(void *arg);
extern void acpi_event_thread(void *arg);
@ -244,3 +245,9 @@ extern void acpi_mapmem(void);
extern int acpi_debug;
#define ACPI_DEVPRINTF(args...) printf("acpi0: " args)
#define ACPI_DEBUGPRINT(args...) do { if (acpi_debug) ACPI_DEVPRINTF(args);} while(0)
/*
* System service interface
*/
extern int acpi_sleep(u_int32_t micro);

View File

@ -47,11 +47,15 @@
printf(fmt, args); \
} while(0)
#define AML_DEBUGGER(x, y) /* no debugger in kernel */
#define AML_STALL(micro) DELAY(micro)
#define AML_SLEEP(sec, milli) OsdSleep(sec, milli)
#else /* !_KERNEL */
#define AML_SYSASSERT(x) assert(x)
#define AML_SYSABORT() abort()
#define AML_SYSERRX(eval, fmt, args...) errx(eval, fmt, args)
#define AML_DEBUGGER(x, y) aml_dbgr(x, y)
#define AML_STALL(micro) /* not required in userland */
#define AML_SLEEP(sec, milli) /* not required in userland */
#endif /* _KERNEL */
union aml_object;

View File

@ -55,6 +55,14 @@
#include "debug.h"
#else /* _KERNEL */
#include <sys/systm.h>
#include <sys/bus.h>
#include <machine/bus.h>
#include <machine/clock.h>
#include <dev/acpi/acpireg.h>
#include <dev/acpi/acpivar.h>
#ifndef ACPI_NO_OSDFUNC_INLINE
#include <machine/acpica_osd.h>
#endif
#endif /* !_KERNEL */
static int findsetleftbit(int num);
@ -1484,14 +1492,18 @@ aml_parse_termobj(struct aml_environ *env, int indent)
aml_parse_termobj(env, indent);
AML_DEBUGPRINT(")");
break;
case 0x21: /* StallOp *//* XXX Not yet */
case 0x21: /* StallOp */
AML_DEBUGPRINT("Stall(");
aml_parse_termobj(env, indent);
num1 = aml_objtonum(env, aml_eval_name(env,
aml_parse_termobj(env, indent)));
AML_DEBUGPRINT(")");
AML_STALL(num1);
break;
case 0x22: /* SleepOp *//* XXX Not yet */
case 0x22: /* SleepOp */
AML_DEBUGPRINT("Sleep(");
aml_parse_termobj(env, indent);
num1 = aml_objtonum(env, aml_eval_name(env,
aml_parse_termobj(env, indent)));
AML_SLEEP(0, num1);
AML_DEBUGPRINT(")");
break;
case 0x23: /* AcquireOp *//* XXX Not yet */

View File

@ -38,8 +38,16 @@
#include <vm/vm.h>
#include <vm/pmap.h>
#include <dev/acpi/acpi.h>
#include "pcib_if.h"
#ifdef ACPI_NO_OSDFUNC_INLINE
#define _ACPICA_INLINE_
#else
#define _ACPICA_INLINE_ static __inline
#endif
/*
* ACPICA compatibility
*/
@ -98,28 +106,19 @@ OsdInX(ACPI_IO_ADDRESS InPort, int bytes)
return (retval);
}
#ifndef ACPI_NO_OSDFUNC_INLINE
static __inline
#endif
UINT8
_ACPICA_INLINE_ UINT8
OsdIn8(ACPI_IO_ADDRESS InPort)
{
return (OsdInX(InPort, 1) & 0xff);
}
#ifndef ACPI_NO_OSDFUNC_INLINE
static __inline
#endif
UINT16
_ACPICA_INLINE_ UINT16
OsdIn16(ACPI_IO_ADDRESS InPort)
{
return (OsdInX(InPort, 2) & 0xffff);
}
#ifndef ACPI_NO_OSDFUNC_INLINE
static __inline
#endif
UINT32
_ACPICA_INLINE_ UINT32
OsdIn32(ACPI_IO_ADDRESS InPort)
{
return (OsdInX(InPort, 4));
@ -148,37 +147,25 @@ OsdOutX(ACPI_IO_ADDRESS OutPort, UINT32 Value, int bytes)
}
}
#ifndef ACPI_NO_OSDFUNC_INLINE
static __inline
#endif
void
_ACPICA_INLINE_ void
OsdOut8(ACPI_IO_ADDRESS OutPort, UINT8 Value)
{
OsdOutX(OutPort, Value, 1);
}
#ifndef ACPI_NO_OSDFUNC_INLINE
static __inline
#endif
void
_ACPICA_INLINE_ void
OsdOut16(ACPI_IO_ADDRESS OutPort, UINT16 Value)
{
OsdOutX(OutPort, Value, 2);
}
#ifndef ACPI_NO_OSDFUNC_INLINE
static __inline
#endif
void
_ACPICA_INLINE_ void
OsdOut32(ACPI_IO_ADDRESS OutPort, UINT32 Value)
{
OsdOutX(OutPort, Value, 4);
}
#ifndef ACPI_NO_OSDFUNC_INLINE
static __inline
#endif
ACPI_STATUS
_ACPICA_INLINE_ ACPI_STATUS
OsdMapMemory(void *PhysicalAddress, UINT32 Length, void **LogicalAddress)
{
vm_offset_t PhysicalEnd;
@ -203,10 +190,7 @@ OsdMapMemory(void *PhysicalAddress, UINT32 Length, void **LogicalAddress)
return (AE_OK);
}
#ifndef ACPI_NO_OSDFUNC_INLINE
static __inline
#endif
void
_ACPICA_INLINE_ void
OsdUnMapMemory(void *LogicalAddress, UINT32 Length)
{
@ -234,10 +218,7 @@ OsdReadPciCfg(UINT32 Bus, UINT32 DeviceFunction, UINT32 Register, UINT32 *Value,
return (AE_OK);
}
#ifndef ACPI_NO_OSDFUNC_INLINE
static __inline
#endif
ACPI_STATUS
_ACPICA_INLINE_ ACPI_STATUS
OsdReadPciCfgByte(UINT32 Bus, UINT32 DeviceFunction, UINT32 Register, UINT8 *Value)
{
ACPI_STATUS status;
@ -248,10 +229,7 @@ OsdReadPciCfgByte(UINT32 Bus, UINT32 DeviceFunction, UINT32 Register, UINT8 *Val
return (status);
}
#ifndef ACPI_NO_OSDFUNC_INLINE
static __inline
#endif
ACPI_STATUS
_ACPICA_INLINE_ ACPI_STATUS
OsdReadPciCfgWord(UINT32 Bus, UINT32 DeviceFunction, UINT32 Register, UINT16 *Value)
{
ACPI_STATUS status;
@ -262,10 +240,7 @@ OsdReadPciCfgWord(UINT32 Bus, UINT32 DeviceFunction, UINT32 Register, UINT16 *Va
return (status);
}
#ifndef ACPI_NO_OSDFUNC_INLINE
static __inline
#endif
ACPI_STATUS
_ACPICA_INLINE_ ACPI_STATUS
OsdReadPciCfgDword(UINT32 Bus, UINT32 DeviceFunction, UINT32 Register, UINT32 *Value)
{
ACPI_STATUS status;
@ -291,29 +266,53 @@ OsdWritePciCfg(UINT32 Bus, UINT32 DeviceFunction, UINT32 Register, UINT32 Value,
return (AE_OK);
}
#ifndef ACPI_NO_OSDFUNC_INLINE
static __inline
#endif
ACPI_STATUS
_ACPICA_INLINE_ ACPI_STATUS
OsdWritePciCfgByte(UINT32 Bus, UINT32 DeviceFunction, UINT32 Register, UINT8 Value)
{
return (OsdWritePciCfg(Bus, DeviceFunction, Register, (UINT32) Value, 1));
}
#ifndef ACPI_NO_OSDFUNC_INLINE
static __inline
#endif
ACPI_STATUS
_ACPICA_INLINE_ ACPI_STATUS
OsdWritePciCfgWord(UINT32 Bus, UINT32 DeviceFunction, UINT32 Register, UINT16 Value)
{
return (OsdWritePciCfg(Bus, DeviceFunction, Register, (UINT32) Value, 2));
}
#ifndef ACPI_NO_OSDFUNC_INLINE
static __inline
#endif
ACPI_STATUS
_ACPICA_INLINE_ ACPI_STATUS
OsdWritePciCfgDword(UINT32 Bus, UINT32 DeviceFunction, UINT32 Register, UINT32 Value)
{
return (OsdWritePciCfg(Bus, DeviceFunction, Register, Value, 4));
}
_ACPICA_INLINE_ ACPI_STATUS
OsdSleepUsec(UINT32 Microseconds)
{
int error;
ACPI_STATUS status;
error = acpi_sleep(Microseconds);
switch (error) {
case 0:
/* The running thread slept for the time specified */
status = AE_OK;
break;
case 1:
/* TBD!!!! */
status = AE_BAD_PARAMETER;
break;
case 2:
default:
/* The running thread did not slept because of a host OS error */
status = AE_ERROR;
break;
}
return (status);
}
_ACPICA_INLINE_ ACPI_STATUS
OsdSleep(UINT32 Seconds, UINT32 Milliseconds)
{
return OsdSleepUsec(Seconds * 1000000L + Milliseconds * 1000);
}

View File

@ -47,11 +47,15 @@
printf(fmt, args); \
} while(0)
#define AML_DEBUGGER(x, y) /* no debugger in kernel */
#define AML_STALL(micro) DELAY(micro)
#define AML_SLEEP(sec, milli) OsdSleep(sec, milli)
#else /* !_KERNEL */
#define AML_SYSASSERT(x) assert(x)
#define AML_SYSABORT() abort()
#define AML_SYSERRX(eval, fmt, args...) errx(eval, fmt, args)
#define AML_DEBUGGER(x, y) aml_dbgr(x, y)
#define AML_STALL(micro) /* not required in userland */
#define AML_SLEEP(sec, milli) /* not required in userland */
#endif /* _KERNEL */
union aml_object;

View File

@ -55,6 +55,14 @@
#include "debug.h"
#else /* _KERNEL */
#include <sys/systm.h>
#include <sys/bus.h>
#include <machine/bus.h>
#include <machine/clock.h>
#include <dev/acpi/acpireg.h>
#include <dev/acpi/acpivar.h>
#ifndef ACPI_NO_OSDFUNC_INLINE
#include <machine/acpica_osd.h>
#endif
#endif /* !_KERNEL */
static int findsetleftbit(int num);
@ -1484,14 +1492,18 @@ aml_parse_termobj(struct aml_environ *env, int indent)
aml_parse_termobj(env, indent);
AML_DEBUGPRINT(")");
break;
case 0x21: /* StallOp *//* XXX Not yet */
case 0x21: /* StallOp */
AML_DEBUGPRINT("Stall(");
aml_parse_termobj(env, indent);
num1 = aml_objtonum(env, aml_eval_name(env,
aml_parse_termobj(env, indent)));
AML_DEBUGPRINT(")");
AML_STALL(num1);
break;
case 0x22: /* SleepOp *//* XXX Not yet */
case 0x22: /* SleepOp */
AML_DEBUGPRINT("Sleep(");
aml_parse_termobj(env, indent);
num1 = aml_objtonum(env, aml_eval_name(env,
aml_parse_termobj(env, indent)));
AML_SLEEP(0, num1);
AML_DEBUGPRINT(")");
break;
case 0x23: /* AcquireOp *//* XXX Not yet */