From 3c5d625221bf2739ebe9f7404082e8eace4e5521 Mon Sep 17 00:00:00 2001 From: wawa Date: Wed, 19 Sep 2018 22:29:13 +0000 Subject: [PATCH] forwarding an update to acpica in preparation of using newer code. It also fixes undefined behaviour using an incorrectly set TimerBase (though it is not fully fixed yet). courtesy of NicJA. git-svn-id: https://svn.aros.org/svn/aros/trunk/AROS@55449 fb15a70f-31f2-0310-bbcc-cdcc74a49acc --- arch/all-pc/acpica/ACPIInfo.c | 164 +++++++++++++--------- arch/all-pc/acpica/acpica-unix-20131115-aros.diff | 33 ++++- arch/all-pc/acpica/acpica.conf | 16 ++- arch/all-pc/acpica/acpios_aros.c | 116 ++++++++++++--- arch/all-pc/acpica/include/acpica.h | 15 +- arch/all-pc/acpica/mmakefile.src | 37 +++-- rom/hidds/acpi/button/acpibutton_init.c | 87 ++++++------ 7 files changed, 325 insertions(+), 143 deletions(-) diff --git a/arch/all-pc/acpica/ACPIInfo.c b/arch/all-pc/acpica/ACPIInfo.c index aebf4cb091..97cd936c2f 100644 --- a/arch/all-pc/acpica/ACPIInfo.c +++ b/arch/all-pc/acpica/ACPIInfo.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013, The AROS Development Team + * Copyright (C) 2013-2018, The AROS Development Team * All right reserved. * Author: Jason S. McMullan * @@ -16,6 +16,7 @@ #define SH_GLOBAL_DOSBASE 1 #include +#include const char * const TypeMap[ACPI_TYPE_EXTERNAL_MAX+1] = { "Any", @@ -43,9 +44,15 @@ ACPI_STATUS OnDescend ( void *Context, void **ReturnValue) { - int i; - ACPI_STATUS err; - ACPI_DEVICE_INFO *info; + ACPI_BUFFER buffer = { ACPI_ALLOCATE_BUFFER, NULL }; + ACPI_PNP_DEVICE_ID_LIST *cIdList; + ACPI_DEVICE_INFO *info; + ACPI_OBJECT *obj; + ACPI_PNP_DEVICE_ID *pnpid; + ACPI_STATUS err; + UINT64 addr; + char *dstates; + int i; for (i = 0; i < NestingLevel; i++) Printf(" "); @@ -66,72 +73,103 @@ ACPI_STATUS OnDescend ( if (info->Type == ACPI_TYPE_METHOD) { Printf("(%ld)", info->ParamCount); } - if (info->Flags & ACPI_PCI_ROOT_BRIDGE) { + if (AcpiGetInfoFlags(info) & ACPI_PCI_ROOT_BRIDGE) { Printf(" [PCI Root Bridge]"); } Printf("\n"); - for (i = 0; i < 8; i++) { - int j; - if ((info->Valid & (1 << i)) == 0) - continue; - for (j = 0; j < NestingLevel; j++) + addr = AcpiGetInfoAddress(info); + if (addr) { + for (i = 0; i < NestingLevel; i++) Printf(" "); - Printf(" "); - - switch (info->Valid & (1 << i)) { - case ACPI_VALID_STA: - Printf("_STA: ["); - if (info->CurrentStatus & ACPI_STA_DEVICE_PRESENT) - Printf(" Present"); - if (info->CurrentStatus & ACPI_STA_DEVICE_ENABLED) - Printf(" Enabled"); - if (info->CurrentStatus & ACPI_STA_DEVICE_UI) - Printf(" UI"); - if (info->CurrentStatus & ACPI_STA_DEVICE_OK) - Printf(" Ok"); - if (info->CurrentStatus & ACPI_STA_BATTERY_PRESENT) - Printf(" Battery"); - Printf(" ]\n"); - break; - case ACPI_VALID_ADR: - Printf("_ADR: 0x%llx\n", info->Address); - break; - case ACPI_VALID_HID: - Printf("_HID: %s\n",info->HardwareId.String); - break; - case ACPI_VALID_UID: - Printf("_UID: %s\n",info->UniqueId.String); - break; - case ACPI_VALID_SUB: - Printf("_SUB: %s\n",info->SubsystemId.String); - break; - case ACPI_VALID_CID: - Printf("_CID: ["); - for (j = 0; j < info->CompatibleIdList.Count; j++) { - Printf(" %s", info->CompatibleIdList.Ids[j].String); - } - Printf(" ]\n"); - break; - case ACPI_VALID_SXDS: - Printf("_SxD:"); - for (j = 0; j < 4; j++) { - if (info->HighestDstates[j] != 0xff) - Printf(" %d", info->HighestDstates[j]); - } - Printf("\n"); - break; - case ACPI_VALID_SXWS: - Printf("_SxW:"); - for (j = 0; j < 5; j++) { - if (info->LowestDstates[j] != 0xff) - Printf(" %d", info->LowestDstates[j]); - } - Printf("\n"); - break; - default: break; + Printf(" %s: 0x%llx\n", METHOD_NAME__ADR, addr); + } + + pnpid = AcpiGetInfoHardwareId(info); + if (pnpid) { + for (i = 0; i < NestingLevel; i++) + Printf(" "); + Printf(" %s: %s\n", METHOD_NAME__HID, pnpid->String); + } + + pnpid = AcpiGetInfoUniqueId(info); + if (pnpid) { + for (i = 0; i < NestingLevel; i++) + Printf(" "); + Printf(" %s: %s\n", METHOD_NAME__UID, pnpid->String); + } + + cIdList = AcpiGetInfoCompatIdList(info); + if (cIdList) { + for (i = 0; i < NestingLevel; i++) + Printf(" "); + Printf(" %s: [", METHOD_NAME__CID); + for (i = 0; i < cIdList->Count; i++) { + Printf(" %s", cIdList->Ids[i].String); + } + Printf(" ]\n"); + } + + dstates = AcpiGetInfoHighDstates(info); + if (dstates) { + for (i = 0; i < NestingLevel; i++) + Printf(" "); + Printf(" _SxD:"); + for (i = 0; i < 4; i++) { + if (dstates[i] != 0xff) + Printf(" %d", dstates[i]); + } + Printf("\n"); + } + dstates = AcpiGetInfoLowDstates(info); + if (dstates) { + for (i = 0; i < NestingLevel; i++) + Printf(" "); + Printf(" _SxW:"); + for (i = 0; i < 5; i++) { + if (dstates[i] != 0xff) + Printf(" %d", dstates[i]); } + Printf("\n"); + } + + err = AcpiEvaluateObject (Object, METHOD_NAME__SUB, + NULL, &buffer); + if (ACPI_SUCCESS(err)) { + obj = buffer.Pointer; + + if (obj->Type == ACPI_TYPE_STRING) + { + Printf("%s: %s\n", METHOD_NAME__SUB, obj->String.Pointer); + } + FreeVec(buffer.Pointer); + } + + #if (0) + buffer.Pointer = NULL; + err = AcpiEvaluateObject (Object, METHOD_NAME__STA, + NULL, &buffer); + if (ACPI_SUCCESS(err)) { + obj = buffer.Pointer; + + for (i = 0; i < NestingLevel; i++) + Printf(" "); + Printf(" %s: [", METHOD_NAME__STA); + if (obj->Integer.Value & ACPI_STA_DEVICE_PRESENT) + Printf(" Present"); + if (obj->Integer.Value & ACPI_STA_DEVICE_ENABLED) + Printf(" Enabled"); + if (obj->Integer.Value & ACPI_STA_DEVICE_UI) + Printf(" UI"); + if (obj->Integer.Value & ACPI_STA_DEVICE_OK) + Printf(" Ok"); + if (obj->Integer.Value & ACPI_STA_BATTERY_PRESENT) + Printf(" Battery"); + Printf(" ]\n"); + FreeVec(buffer.Pointer); } +#endif + FreeVec(info); } return err; diff --git a/arch/all-pc/acpica/acpica-unix-20131115-aros.diff b/arch/all-pc/acpica/acpica-unix-20131115-aros.diff index 5dbdd77ef9..5c24754f53 100644 --- a/arch/all-pc/acpica/acpica-unix-20131115-aros.diff +++ b/arch/all-pc/acpica/acpica-unix-20131115-aros.diff @@ -1,7 +1,31 @@ +diff -ruN acpica-unix-20131115/source/components/parser/psxface.c acpica-unix-20131115.aros/source/components/parser/psxface.c +--- acpica-unix-20131115/source/components/parser/psxface.c 2013-11-15 18:19:09.000000000 +0000 ++++ acpica-unix-20131115.aros/source/components/parser/psxface.c 2018-09-19 05:40:08.043930665 +0100 +@@ -160,7 +160,7 @@ + + ACPI_STATUS + AcpiDebugTrace ( +- char *Name, ++ const char *Name, + UINT32 DebugLevel, + UINT32 DebugLayer, + UINT32 Flags) +diff -ruN acpica-unix-20131115/source/include/acpixf.h acpica-unix-20131115.aros/source/include/acpixf.h +--- acpica-unix-20131115/source/include/acpixf.h 2013-11-15 18:19:11.000000000 +0000 ++++ acpica-unix-20131115.aros/source/include/acpixf.h 2018-09-19 05:31:19.185957614 +0100 +@@ -373,7 +373,7 @@ + + ACPI_STATUS + AcpiDebugTrace ( +- char *Name, ++ const char *Name, + UINT32 DebugLevel, + UINT32 DebugLayer, + UINT32 Flags); diff -ruN acpica-unix-20131115/source/include/platform/acaros.h acpica-unix-20131115.aros/source/include/platform/acaros.h --- acpica-unix-20131115/source/include/platform/acaros.h 1970-01-01 01:00:00.000000000 +0100 -+++ acpica-unix-20131115.aros/source/include/platform/acaros.h 2018-09-17 22:30:46.815054812 +0100 -@@ -0,0 +1,86 @@ ++++ acpica-unix-20131115.aros/source/include/platform/acaros.h 2018-09-19 05:47:22.089908547 +0100 +@@ -0,0 +1,89 @@ +/****************************************************************************** + * + * Name: acaros.h - OS specific defines, etc. for AROS @@ -39,6 +63,9 @@ diff -ruN acpica-unix-20131115/source/include/platform/acaros.h acpica-unix-2013 +#define ACPI_MUTEX_TYPE ACPI_BINARY_SEMAPHORE +#define ACPI_USE_LOCAL_CACHE + ++/* Use native AROS version of AcpiOsAllocateZeroed */ ++#define USE_NATIVE_ALLOCATE_ZEROED ++ +/* + * Calling conventions: + * @@ -90,7 +117,7 @@ diff -ruN acpica-unix-20131115/source/include/platform/acaros.h acpica-unix-2013 +#endif /* __ACAROS_H__ */ diff -ruN acpica-unix-20131115/source/include/platform/acenv.h acpica-unix-20131115.aros/source/include/platform/acenv.h --- acpica-unix-20131115/source/include/platform/acenv.h 2013-11-15 18:19:11.000000000 +0000 -+++ acpica-unix-20131115.aros/source/include/platform/acenv.h 2018-09-17 22:30:32.347895235 +0100 ++++ acpica-unix-20131115.aros/source/include/platform/acenv.h 2018-09-19 05:20:50.236989664 +0100 @@ -259,6 +259,9 @@ #elif defined(__HAIKU__) #include "achaiku.h" diff --git a/arch/all-pc/acpica/acpica.conf b/arch/all-pc/acpica/acpica.conf index a1822af24e..ff20438077 100644 --- a/arch/all-pc/acpica/acpica.conf +++ b/arch/all-pc/acpica/acpica.conf @@ -1,11 +1,14 @@ ##begin config -version 1.1 +version 1.2 residentpri 125 basename ACPICA libbasetype struct ACPICABase ##end config ##begin cdef +#ifndef ACPI_USE_SYSTEM_CLIBRARY +# define ACPI_USE_SYSTEM_CLIBRARY +#endif #include #include ##end cdef @@ -99,7 +102,7 @@ ACPI_STATUS AcpiBufferToResource(UINT8 *AmlBuffer, UINT16 AmlBufferLength, ACPI_ ACPI_STATUS AcpiResourceToAddress64(ACPI_RESOURCE *Resource, ACPI_RESOURCE_ADDRESS64 *OutResource) ACPI_STATUS AcpiWalkResources(ACPI_HANDLE Device, char *Name, ACPI_WALK_RESOURCE_CALLBACK UserFunction, void *UserContext) UINT32 AcpiCheckAddressRange(ACPI_ADR_SPACE_TYPE SpaceId, ACPI_PHYSICAL_ADDRESS Address, ACPI_SIZE Length, BOOLEAN EmitWarning) -ACPI_STATUS AcpiDebugTrace(char *Name, UINT32 DebugLevel, UINT32 DebugLayer, UINT32 Flags) +ACPI_STATUS AcpiDebugTrace(const char *Name, UINT32 DebugLevel, UINT32 DebugLayer, UINT32 Flags) ACPI_STATUS AcpiDecodePldBuffer(UINT8 *Buffer, ACPI_SIZE Length, ACPI_PLD_INFO **ReturnBuffer) const char *AcpiFormatException(ACPI_STATUS Status) ACPI_STATUS AcpiGetStatistics(ACPI_STATISTICS *OutStats) @@ -109,4 +112,13 @@ LONG AcpiScanTables(const char *Signature, const struct Hook *Hook, APTR UserDat .skip 1 ACPI_STATUS AcpiGetSleepTypeData (UINT8 SleepState, UINT8 *SleepTypeA, UINT8 *SleepTypeB) ACPI_BIT_REGISTER_INFO *AcpiHwGetBitRegisterInfo (UINT32 RegisterId) +.skip 2 +UINT8 AcpiGetInfoFlags(ACPI_DEVICE_INFO *DevInfo) +UINT8 *AcpiGetInfoLowDstates(ACPI_DEVICE_INFO *DevInfo) +UINT8 *AcpiGetInfoHighDstates(ACPI_DEVICE_INFO *DevInfo) +UINT64 AcpiGetInfoAddress(ACPI_DEVICE_INFO *DevInfo) +ACPI_PNP_DEVICE_ID *AcpiGetInfoHardwareId(ACPI_DEVICE_INFO *DevInfo) +ACPI_PNP_DEVICE_ID *AcpiGetInfoUniqueId(ACPI_DEVICE_INFO *DevInfo) +ACPI_PNP_DEVICE_ID *AcpiGetInfoClassCode(ACPI_DEVICE_INFO *DevInfo) +ACPI_PNP_DEVICE_ID_LIST *AcpiGetInfoCompatIdList(ACPI_DEVICE_INFO *DevInfo) ##end functionlist diff --git a/arch/all-pc/acpica/acpios_aros.c b/arch/all-pc/acpica/acpios_aros.c index 5b80538907..894b585fc3 100644 --- a/arch/all-pc/acpica/acpios_aros.c +++ b/arch/all-pc/acpica/acpios_aros.c @@ -10,7 +10,6 @@ #define __ACPICA_NOLIBBASE__ #endif /* !__ACPICA_NOLIBBASE__ */ -#define DEBUG 0 #include #include "acpica_intern.h" @@ -31,6 +30,8 @@ #define _COMPONENT ACPI_OS_SERVICES ACPI_MODULE_NAME ("osarosxf") +#define DLOCK(a) + /* FIXME: __aros_getbase_ACPICABase() for internal use should be handled properly by genmodule */ @@ -44,9 +45,11 @@ ACPI_STATUS AcpiOsInitialize (void) D(bug("[ACPI] %s: ACPICABase=0x%p\n", __func__, ACPICABase)); if ((ACPICABase->ab_TimeMsgPort = CreateMsgPort())) { + D(bug("[ACPI] %s: MsgPort @ %p\n", __func__, ACPICABase->ab_TimeMsgPort)); if ((ACPICABase->ab_TimeRequest = CreateIORequest(ACPICABase->ab_TimeMsgPort, sizeof(*ACPICABase->ab_TimeRequest)))) { D(bug("[ACPI] %s: Ready\n", __func__)); ACPICABase->ab_TimerBase = (struct Library *)ACPICABase->ab_TimeRequest->tr_node.io_Device; + D(bug("[ACPI] %s: TimerBase = %p\n", __func__, ACPICABase->ab_TimerBase)); return AE_OK; } DeleteMsgPort(ACPICABase->ab_TimeMsgPort); @@ -116,6 +119,7 @@ ACPI_STATUS AcpiOsPhysicalTableOverride(ACPI_TABLE_HEADER *ExistingTable, ACPI_P return AE_OK; } + void *AcpiOsMapMemory (ACPI_PHYSICAL_ADDRESS PhysicalAddress, ACPI_SIZE Length) { return (void *)PhysicalAddress; @@ -138,6 +142,12 @@ void *AcpiOsAllocate(ACPI_SIZE Size) return AllocVec(Size, MEMF_PUBLIC); } +void *AcpiOsAllocateZeroed(ACPI_SIZE Size) +{ + D(bug("[ACPI] %s(%d)\n", __func__, Size)); + return AllocVec(Size, MEMF_PUBLIC|MEMF_CLEAR); +} + void AcpiOsFree(void *Memory) { D(bug("[ACPI] %s(0x%p)\n", __func__, Memory)); @@ -159,7 +169,7 @@ ACPI_THREAD_ID AcpiOsGetThreadId(void) { ACPI_THREAD_ID tid; - D(bug("[ACPI] %s()\n", __func__)); + DLOCK(bug("[ACPI] %s()\n", __func__)); tid = (ACPI_THREAD_ID)(ACPI_PHYSICAL_ADDRESS)FindTask(NULL); @@ -213,7 +223,7 @@ ACPI_STATUS AcpiOsCreateSemaphore(UINT32 MaxUnits, UINT32 InitialUnits, ACPI_SEM { struct SignalSemaphore *Handle; - D(bug("[ACPI] %s()\n", __func__)); + DLOCK(bug("[ACPI] %s()\n", __func__);) Handle = ACPI_ALLOCATE(sizeof(*Handle)); if (Handle) { @@ -226,7 +236,7 @@ ACPI_STATUS AcpiOsCreateSemaphore(UINT32 MaxUnits, UINT32 InitialUnits, ACPI_SEM ACPI_STATUS AcpiOsDeleteSemaphore(ACPI_SEMAPHORE Handle) { - D(bug("[ACPI] %s()\n", __func__)); + DLOCK(bug("[ACPI] %s()\n", __func__);) ACPI_FREE(Handle); return AE_OK; @@ -234,7 +244,7 @@ ACPI_STATUS AcpiOsDeleteSemaphore(ACPI_SEMAPHORE Handle) ACPI_STATUS AcpiOsWaitSemaphore(ACPI_SEMAPHORE Handle, UINT32 Units, UINT16 Timeout) { - D(bug("[ACPI] %s()\n", __func__)); + DLOCK(bug("[ACPI] %s()\n", __func__);) if (Timeout == ACPI_DO_NOT_WAIT) { if (!AttemptSemaphore(Handle)) @@ -251,7 +261,7 @@ ACPI_STATUS AcpiOsWaitSemaphore(ACPI_SEMAPHORE Handle, UINT32 Units, UINT16 Time ACPI_STATUS AcpiOsSignalSemaphore(ACPI_SEMAPHORE Handle, UINT32 Units) { - D(bug("[ACPI] %s()\n", __func__)); + DLOCK(bug("[ACPI] %s()\n", __func__);) ReleaseSemaphore(Handle); return AE_OK; @@ -265,14 +275,14 @@ struct SpinLock { static inline struct SpinLock *CreateSpin(VOID) { - D(bug("[ACPI] %s()\n", __func__)); + DLOCK(bug("[ACPI] %s()\n", __func__)); return AllocVec(sizeof(struct SpinLock), MEMF_ANY | MEMF_CLEAR); } static inline void DeleteSpin(struct SpinLock *sl) { - D(bug("[ACPI] %s()\n", __func__)); + DLOCK(bug("[ACPI] %s()\n", __func__);) Disable(); while (sl->sl_Lock > 0) { @@ -289,7 +299,7 @@ static inline VOID LockSpin(struct SpinLock *sl) BYTE pri, pri_lower; struct Task *task = FindTask(NULL); - D(bug("[ACPI] %s()\n", __func__)); + DLOCK(bug("[ACPI] %s()\n", __func__);) pri = task->tc_Node.ln_Pri; pri_lower = pri; @@ -311,7 +321,7 @@ static inline VOID LockSpin(struct SpinLock *sl) static inline void UnlockSpin(struct SpinLock *sl) { - D(bug("[ACPI] %s()\n", __func__)); + DLOCK(bug("[ACPI] %s()\n", __func__)); sl->sl_Lock--; Enable(); @@ -319,7 +329,7 @@ static inline void UnlockSpin(struct SpinLock *sl) ACPI_STATUS AcpiOsCreateLock(ACPI_SPINLOCK *OutHandle) { - D(bug("[ACPI] %s()\n", __func__)); + DLOCK(bug("[ACPI] %s()\n", __func__)); *OutHandle = CreateSpin(); @@ -333,7 +343,7 @@ void AcpiOsDeleteLock(ACPI_SPINLOCK Handle) ACPI_CPU_FLAGS AcpiOsAcquireLock(ACPI_SPINLOCK Handle) { - D(bug("[ACPI] %s()\n", __func__)); + DLOCK(bug("[ACPI] %s()\n", __func__)); LockSpin(Handle); return 1; @@ -341,7 +351,7 @@ ACPI_CPU_FLAGS AcpiOsAcquireLock(ACPI_SPINLOCK Handle) void AcpiOsReleaseLock(ACPI_SPINLOCK Handle, ACPI_CPU_FLAGS Flags) { - D(bug("[ACPI] %s()\n", __func__)); + DLOCK(bug("[ACPI] %s()\n", __func__)); if (Flags == 1) UnlockSpin(Handle); @@ -529,14 +539,20 @@ UINT64 AcpiOsGetTimer(void) struct ACPICABase *ACPICABase = (struct ACPICABase *)__aros_getbase_ACPICABase(); struct Library *TimerBase; struct timeval tv; + UINT64 retVal = 0; D(bug("[ACPI] %s: ACPICABase=0x%p\n", __func__, ACPICABase)); - TimerBase = ACPICABase->ab_TimerBase; + if ((TimerBase = ACPICABase->ab_TimerBase)) + { + D(bug("[ACPI] %s: TimerBase=0x%p\n", __func__, TimerBase)); - GetSysTime(&tv); + GetSysTime(&tv); - return (tv.tv_secs*1000000ULL + tv.tv_micro)*10; + D(bug("[ACPI] %s: GetSysTime returned\n", __func__)); + retVal = (tv.tv_secs*1000000ULL + tv.tv_micro)*10; + } + return retVal; } ACPI_STATUS AcpiOsSignal(UINT32 Function, void *Info) @@ -552,9 +568,77 @@ ACPI_STATUS AcpiOsGetLine(char *Buffer, UINT32 BufferLength, UINT32 *BytesRead) return AE_NOT_IMPLEMENTED; } +ACPI_STATUS +AcpiOsEnterSleep ( + UINT8 SleepState, + UINT32 RegaValue, + UINT32 RegbValue) +{ + D(bug("[ACPI] %s()\n", __func__)); + + return (AE_OK); +} + /* * AROS Custom Code */ +UINT8 AcpiGetInfoFlags(ACPI_DEVICE_INFO *DevInfo) +{ + return DevInfo->Flags; +} + +UINT8 *AcpiGetInfoLowDstates(ACPI_DEVICE_INFO *DevInfo) +{ + if (DevInfo->Valid & ACPI_VALID_SXWS) + return DevInfo->LowestDstates; + return NULL; +} + +UINT8 *AcpiGetInfoHighDstates(ACPI_DEVICE_INFO *DevInfo) +{ + if (DevInfo->Valid & ACPI_VALID_SXDS) + return DevInfo->HighestDstates; + return NULL; +} + +UINT64 AcpiGetInfoAddress(ACPI_DEVICE_INFO *DevInfo) +{ + if (DevInfo->Valid & ACPI_VALID_ADR) + return DevInfo->Address; + return 0; +} + +ACPI_PNP_DEVICE_ID *AcpiGetInfoHardwareId(ACPI_DEVICE_INFO *DevInfo) +{ + if (DevInfo->Valid & ACPI_VALID_HID) + return &DevInfo->HardwareId; + return NULL; +} + +ACPI_PNP_DEVICE_ID *AcpiGetInfoUniqueId(ACPI_DEVICE_INFO *DevInfo) +{ + if (DevInfo->Valid & ACPI_VALID_UID) + return &DevInfo->UniqueId; + return NULL; +} + +ACPI_PNP_DEVICE_ID *AcpiGetInfoClassCode(ACPI_DEVICE_INFO *DevInfo) +{ + ACPI_PNP_DEVICE_ID *classCode = NULL; +#if defined(ACPI_VALID_CLS) + if (DevInfo->Valid & ACPI_VALID_CLS) + classCode = &DevInfo->ClassCode; +#endif + return classCode; +} + +ACPI_PNP_DEVICE_ID_LIST *AcpiGetInfoCompatIdList(ACPI_DEVICE_INFO *DevInfo) +{ + if (DevInfo->Valid & ACPI_VALID_CID) + return &DevInfo->CompatibleIdList; + return NULL; +} + LONG AcpiScanTables(const char *Signature, const struct Hook *Hook, APTR UserData) { int i; diff --git a/arch/all-pc/acpica/include/acpica.h b/arch/all-pc/acpica/include/acpica.h index 4129341f5b..373b907f1c 100644 --- a/arch/all-pc/acpica/include/acpica.h +++ b/arch/all-pc/acpica/include/acpica.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012-2017, The AROS Development Team + * Copyright (C) 2012-2018, The AROS Development Team * All right reserved. * Author: Jason S. McMullan * @@ -33,9 +33,15 @@ #define ACPI_INTERNAL_XFACE #define ACPI_INTERNAL_VAR_XFACE -#define ACPI_ALLOCATE(size) AllocVec(size, MEMF_PUBLIC) -#define ACPI_ALLOCATE_ZEROED(size) AllocVec(size, MEMF_PUBLIC | MEMF_CLEAR) -#define ACPI_FREE(ptr) FreeVec(ptr) +#ifndef __ACAROS_H__ +#define ACPI_EXTERNAL_RETURN_STATUS(Prototype) +#define ACPI_EXTERNAL_RETURN_OK(Prototype) +#define ACPI_EXTERNAL_RETURN_VOID(Prototype) +#define ACPI_EXTERNAL_RETURN_UINT32(Prototype) +#define ACPI_EXTERNAL_RETURN_PTR(Prototype) + +#define ACPI_INLINE __inline__ +#define ACPI_PRINTF_LIKE(c) __attribute__ ((__format__ (__printf__, c, c+1))) #include #include @@ -44,5 +50,6 @@ #include #include #include +#endif #endif /* LIBRARIES_ACPICA_H */ diff --git a/arch/all-pc/acpica/mmakefile.src b/arch/all-pc/acpica/mmakefile.src index b40f3bac5a..e7b0d4dfbc 100644 --- a/arch/all-pc/acpica/mmakefile.src +++ b/arch/all-pc/acpica/mmakefile.src @@ -2,6 +2,8 @@ include $(SRCDIR)/config/aros.cfg +DEBUG_ACPI=no + ACPICAREPOSITORIES := https://acpica.org/sites/acpica/files ACPICAPACKAGE := acpica ACPICAVERSION := 20131115 @@ -10,7 +12,7 @@ ACPICASRCDIR := $(PORTSDIR)/acpica/$(ACPICAARCHBASE) ACPICAPSPECS := $(ACPICAARCHBASE)-aros.diff:$(ACPICAARCHBASE):-f,-p1 -ACPICA_INCLUDE := $(ACPICASRCDIR)/source/include +ACPICA_INCLUDES := $(ACPICASRCDIR)/source/include %fetch mmake=acpica-fetch archive=$(ACPICAARCHBASE) \ destination=$(PORTSDIR)/acpica \ @@ -27,7 +29,7 @@ ACPICA_INCLUDE := $(ACPICASRCDIR)/source/include #MM kernel-pc-acpica : acpica-fetch #MM includes-copy : acpica-fetch -ACPICA_SOURCES = \ +ACPICA_BASESOURCES = \ $(call WILDCARD, $(ACPICASRCDIR)/source/components/executer/*.c) \ $(call WILDCARD, $(ACPICASRCDIR)/source/components/hardware/*.c) \ $(call WILDCARD, $(ACPICASRCDIR)/source/components/dispatcher/*.c) \ @@ -43,17 +45,28 @@ USER_CFLAGS := $(NOWARN_FLAGS) USER_LDFLAGS := -static # ACPICA debugging options -#ACPICA_SOURCES += \ -# $(call WILDCARD, $(ACPICASRCDIR)/source/components/disassembler/*.c) -#USER_CFLAGS += -DACPI_DEBUG_OUTPUT=1 -DACPI_DISASSEMBLER=1 - +ifeq ($(DEBUG_ACPI),yes) +ACPICA_BASESOURCES += \ + $(call WILDCARD, $(ACPICASRCDIR)/source/components/disassembler/*.c) +USER_CPPFLAGS += -DACPI_DEBUG_OUTPUT=1 -DACPI_DISASSEMBLER=1 # AROS Glue code debugging options -#USER_CFLAGS += -DDEBUG=1 +USER_CPPFLAGS += -DDEBUG=1 +ACPICA_SOURCES = \ + $(ACPICA_BASESOURCES:%.c=%) +else +ACPICA_SKIPFILES := \ + $(ACPICASRCDIR)/source/components/resources/rsdump +ACPICA_SOURCES = \ + $(filter-out $(ACPICA_SKIPFILES), $(ACPICA_BASESOURCES:%.c=%)) +endif FILES := acpios_aros \ - $(ACPICA_SOURCES:%.c=%) + $(ACPICA_SOURCES) -USER_INCLUDES += -I$(ACPICA_INCLUDE) +USER_INCLUDES += \ + -I$(AROS_INCLUDES)/acpica \ + -iquote $(ACPICA_INCLUDES) \ + -iquote $(ACPICA_INCLUDES)/platform %build_module mmake=kernel-pc-acpica \ modname=acpica modtype=library \ @@ -65,13 +78,13 @@ INCLUDE_FILES := $(call WILDCARD, include/*.h) %copy_includes path=libraries dir=include -INCLUDE_FILES = $(call WILDCARD, $(ACPICA_INCLUDE)/*.h) +INCLUDE_FILES = $(call WILDCARD, $(ACPICA_INCLUDES)/*.h) -%copy_includes path=acpica dir=$(ACPICA_INCLUDE) +%copy_includes path=acpica dir=$(ACPICA_INCLUDES) # Programs -USER_CFLAGS := -DADATE="\"$(shell date "+%d.%m.%Y")\"" +USER_CPPFLAGS := -DADATE="\"$(shell date "+%d.%m.%Y")\"" FILES := ACPIInfo diff --git a/rom/hidds/acpi/button/acpibutton_init.c b/rom/hidds/acpi/button/acpibutton_init.c index a2d85b1679..b7abe00f56 100644 --- a/rom/hidds/acpi/button/acpibutton_init.c +++ b/rom/hidds/acpi/button/acpibutton_init.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2017, The AROS Development Team. All rights reserved. + Copyright (C) 2017-2018, The AROS Development Team. All rights reserved. $Id$ */ @@ -95,13 +95,19 @@ AROS_UFH3(IPTR, ACPIButton_LidEventHandle, BOOL ACPIButton_MatchDeviceID(ACPI_DEVICE_INFO *acpiDevInfo, char *deviceID) { + ACPI_PNP_DEVICE_ID_LIST *cIdList; + ACPI_PNP_DEVICE_ID *hwId; int cmptid; - if (!(strcmp(acpiDevInfo->HardwareId.String, deviceID))) + hwId = AcpiGetInfoHardwareId(acpiDevInfo); + if (hwId && !(strcmp(hwId->String, deviceID))) return TRUE; - for (cmptid = 0; cmptid < acpiDevInfo->CompatibleIdList.Count; cmptid++) { - if (!(strcmp(acpiDevInfo->CompatibleIdList.Ids[cmptid].String, deviceID))) - return TRUE; + cIdList = AcpiGetInfoCompatIdList(acpiDevInfo); + if (cIdList) { + for (cmptid = 0; cmptid < cIdList->Count; cmptid++) { + if (!(strcmp(cIdList->Ids[cmptid].String, deviceID))) + return TRUE; + } } return FALSE; } @@ -120,60 +126,55 @@ static ACPI_STATUS ACPIButton_DeviceQuery(ACPI_HANDLE handle, D(bug("[HWACPIButton] %s(0x%p)\n", __func__, handle)); acpiStatus = AcpiGetObjectInfo(handle, &acpiDevInfo); - if (acpiStatus != AE_OK) { + if (ACPI_FAILURE(acpiStatus)) { if (acpiDevInfo) { FreeVec(acpiDevInfo); } return acpiStatus; } - if (acpiDevInfo->Valid & ACPI_VALID_HID) + if (ACPIButton_MatchDeviceID(acpiDevInfo, "PNP0C0C")) { - D(bug("[HWACPIButton] %s: HardwareID = '%s'\n", __func__, acpiDevInfo->HardwareId.String)); - - if (ACPIButton_MatchDeviceID(acpiDevInfo, "PNP0C0C")) + D(bug("[HWACPIButton] %s: Power Button Device Found\n", __func__)); + if ((!_csd->powerButtonObj) && (!_csd->acpiPowerBHandle)) { - D(bug("[HWACPIButton] %s: Power Button Device Found\n", __func__)); - if ((!_csd->powerButtonObj) && (!_csd->acpiPowerBHandle)) - { - _csd->acpiPowerBHandle = handle; - _csd->acpiPowerBType = vHW_ACPIButton_Power; - } + _csd->acpiPowerBHandle = handle; + _csd->acpiPowerBType = vHW_ACPIButton_Power; } - else if (ACPIButton_MatchDeviceID(acpiDevInfo, "ACPI_FPB")) + } + else if (ACPIButton_MatchDeviceID(acpiDevInfo, "ACPI_FPB")) + { + D(bug("[HWACPIButton] %s: Fixed Power Button Device Found\n", __func__)); + if ((!_csd->powerButtonObj) && (!_csd->acpiPowerBHandle)) { - D(bug("[HWACPIButton] %s: Fixed Power Button Device Found\n", __func__)); - if ((!_csd->powerButtonObj) && (!_csd->acpiPowerBHandle)) - { - _csd->acpiPowerBHandle = handle; - _csd->acpiPowerBType = vHW_ACPIButton_PowerF; - } + _csd->acpiPowerBHandle = handle; + _csd->acpiPowerBType = vHW_ACPIButton_PowerF; } - else if (ACPIButton_MatchDeviceID(acpiDevInfo, "PNP0C0E")) + } + else if (ACPIButton_MatchDeviceID(acpiDevInfo, "PNP0C0E")) + { + D(bug("[HWACPIButton] %s: Sleep Button Device Found\n", __func__)); + if ((!_csd->sleepButtonObj) && (!_csd->acpiSleepBHandle)) { - D(bug("[HWACPIButton] %s: Sleep Button Device Found\n", __func__)); - if ((!_csd->sleepButtonObj) && (!_csd->acpiSleepBHandle)) - { - _csd->acpiSleepBHandle = handle; - _csd->acpiSleepBType = vHW_ACPIButton_Sleep; - } + _csd->acpiSleepBHandle = handle; + _csd->acpiSleepBType = vHW_ACPIButton_Sleep; } - else if (ACPIButton_MatchDeviceID(acpiDevInfo, "ACPI_FSB")) + } + else if (ACPIButton_MatchDeviceID(acpiDevInfo, "ACPI_FSB")) + { + D(bug("[HWACPIButton] %s: Fixed Sleep Button Device Found\n", __func__)); + if ((!_csd->sleepButtonObj) && (!_csd->acpiSleepBHandle)) { - D(bug("[HWACPIButton] %s: Fixed Sleep Button Device Found\n", __func__)); - if ((!_csd->sleepButtonObj) && (!_csd->acpiSleepBHandle)) - { - _csd->acpiSleepBHandle = handle; - _csd->acpiSleepBType = vHW_ACPIButton_SleepF; - } + _csd->acpiSleepBHandle = handle; + _csd->acpiSleepBType = vHW_ACPIButton_SleepF; } - else if (ACPIButton_MatchDeviceID(acpiDevInfo, "PNP0C0D")) + } + else if (ACPIButton_MatchDeviceID(acpiDevInfo, "PNP0C0D")) + { + D(bug("[HWACPIButton] %s: Lid Button Device Found\n", __func__)); + if ((!_csd->lidButtonObj) && (!_csd->acpibLidBHandle)) { - D(bug("[HWACPIButton] %s: Lid Button Device Found\n", __func__)); - if ((!_csd->lidButtonObj) && (!_csd->acpibLidBHandle)) - { - _csd->acpibLidBHandle = handle; - } + _csd->acpibLidBHandle = handle; } } -- 2.11.4.GIT