2 * Copyright (C) 2012-2018, The AROS Development Team
4 * Author: Jason S. McMullan <jason.mcmullan@gmail.com>
6 * Licensed under the AROS PUBLIC LICENSE (APL) Version 1.1
9 #ifndef __ACPICA_NOLIBBASE__
10 #define __ACPICA_NOLIBBASE__
11 #endif /* !__ACPICA_NOLIBBASE__ */
13 #include <aros/debug.h>
15 #include "acpica_intern.h"
17 #include <hardware/efi/config.h>
19 #include <proto/exec.h>
20 #include <proto/timer.h>
21 #include <proto/efi.h>
22 #include <proto/kernel.h>
24 #include <proto/acpica.h>
27 #include <exec/resident.h>
28 #include <devices/timer.h>
30 #define _COMPONENT ACPI_OS_SERVICES
31 ACPI_MODULE_NAME ("osarosxf")
35 /* FIXME: __aros_getbase_ACPICABase() for internal use should be handled
38 #undef __aros_getbase_ACPICABase
39 struct Library
*__aros_getbase_ACPICABase(void);
41 ACPI_STATUS
AcpiOsInitialize (void)
43 struct ACPICABase
*ACPICABase
= (struct ACPICABase
*)__aros_getbase_ACPICABase();
45 D(bug("[ACPI] %s: ACPICABase=0x%p\n", __func__
, ACPICABase
));
47 if ((ACPICABase
->ab_TimeMsgPort
= CreateMsgPort())) {
48 D(bug("[ACPI] %s: MsgPort @ %p\n", __func__
, ACPICABase
->ab_TimeMsgPort
));
49 if ((ACPICABase
->ab_TimeRequest
= CreateIORequest(ACPICABase
->ab_TimeMsgPort
, sizeof(*ACPICABase
->ab_TimeRequest
)))) {
50 D(bug("[ACPI] %s: TimeRequest @ %p\n", __func__
, ACPICABase
->ab_TimeRequest
));
52 if (ACPICABase
->ab_Flags
& ACPICAF_TIMER
)
53 if (0 == OpenDevice(TIMERNAME
, UNIT_MICROHZ
, (struct IORequest
*)ACPICABase
->ab_TimeRequest
, 0))
55 ACPICABase
->ab_TimerBase
= (struct Library
*)ACPICABase
->ab_TimeRequest
->tr_node
.io_Device
;
60 DeleteMsgPort(ACPICABase
->ab_TimeMsgPort
);
63 D(bug("[ACPI] %s: Failed\n", __func__
));
68 ACPI_STATUS
AcpiOsTerminate (void)
70 struct ACPICABase
*ACPICABase
= (struct ACPICABase
*)__aros_getbase_ACPICABase();
72 D(bug("[ACPI] %s: ACPICABase=0x%p\n", __func__
, ACPICABase
));
74 if (ACPICABase
->ab_TimeRequest
->tr_node
.io_Device
)
76 ACPICABase
->ab_TimerBase
= NULL
;
77 CloseDevice((struct IORequest
*)ACPICABase
->ab_TimeRequest
);
80 DeleteIORequest(ACPICABase
->ab_TimeRequest
);
81 DeleteMsgPort(ACPICABase
->ab_TimeMsgPort
);
86 ACPI_PHYSICAL_ADDRESS
AcpiOsGetRootPointer(void)
88 struct ACPICABase
*ACPICABase
= (struct ACPICABase
*)__aros_getbase_ACPICABase();
90 D(bug("[ACPI] %s: ACPICABase=0x%p\n", __func__
, ACPICABase
));
92 if (ACPICABase
->ab_RootPointer
== 0) {
93 struct Library
*EFIBase
= OpenResource("efi.resource");
95 const uuid_t acpi_20_guid
= ACPI_20_TABLE_GUID
;
96 const uuid_t acpi_10_guid
= ACPI_TABLE_GUID
;
97 ACPICABase
->ab_RootPointer
= (ACPI_PHYSICAL_ADDRESS
)EFI_FindConfigTable(&acpi_20_guid
);
99 /* No ACPI 2.0 table? */
100 if (ACPICABase
->ab_RootPointer
== 0) {
101 ACPICABase
->ab_RootPointer
= (ACPI_PHYSICAL_ADDRESS
)EFI_FindConfigTable(&acpi_10_guid
);
106 /* Nope, no EFI available... Scan the ROM area
108 if (ACPICABase
->ab_RootPointer
== 0) {
109 AcpiFindRootPointer(&ACPICABase
->ab_RootPointer
);
112 return ACPICABase
->ab_RootPointer
;
115 ACPI_STATUS
AcpiOsPredefinedOverride(const ACPI_PREDEFINED_NAMES
*PredefinedObject
, ACPI_STRING
*NewValue
)
121 ACPI_STATUS
AcpiOsTableOverride(ACPI_TABLE_HEADER
*ExistingTable
, ACPI_TABLE_HEADER
**NewTable
)
127 ACPI_STATUS
AcpiOsPhysicalTableOverride(ACPI_TABLE_HEADER
*ExistingTable
, ACPI_PHYSICAL_ADDRESS
*NewAddress
, UINT32
*NewTableLength
)
134 void *AcpiOsMapMemory (ACPI_PHYSICAL_ADDRESS PhysicalAddress
, ACPI_SIZE Length
)
136 return (void *)PhysicalAddress
;
139 void AcpiOsUnmapMemory(void *LogicalAddress
, ACPI_SIZE Length
)
144 ACPI_STATUS
AcpiOsGetPhysicalAddress(void *LogicalAddress
, ACPI_PHYSICAL_ADDRESS
*PhysicalAddress
)
146 *PhysicalAddress
= (IPTR
)LogicalAddress
;
150 void *AcpiOsAllocate(ACPI_SIZE Size
)
152 D(bug("[ACPI] %s(%d)\n", __func__
, Size
));
153 return AllocVec(Size
, MEMF_PUBLIC
);
156 void *AcpiOsAllocateZeroed(ACPI_SIZE Size
)
158 D(bug("[ACPI] %s(%d)\n", __func__
, Size
));
159 return AllocVec(Size
, MEMF_PUBLIC
|MEMF_CLEAR
);
162 void AcpiOsFree(void *Memory
)
164 D(bug("[ACPI] %s(0x%p)\n", __func__
, Memory
));
168 BOOLEAN
AcpiOsReadable(void *Memory
, ACPI_SIZE Length
)
173 BOOLEAN
AcpiOsWritable(void *Memory
, ACPI_SIZE Length
)
175 /* First 4K page is not writable on any AROS architecture */
176 return ((IPTR
)Memory
< 4096) ? FALSE
: TRUE
;
179 ACPI_THREAD_ID
AcpiOsGetThreadId(void)
183 DLOCK(bug("[ACPI] %s()\n", __func__
));
185 tid
= (ACPI_THREAD_ID
)(ACPI_PHYSICAL_ADDRESS
)FindTask(NULL
);
187 /* If we are running during kernel bring-up, return
196 ACPI_STATUS
AcpiOsExecute(ACPI_EXECUTE_TYPE Type
, ACPI_OSD_EXEC_CALLBACK Function
, void *Context
)
198 /* TODO: Create a thread */
199 bug("[ACPI] %s: FIXME!\n", __func__
);
201 return AE_NOT_IMPLEMENTED
;
204 void AcpiOsSleep(UINT64 Milliseconds
)
206 struct ACPICABase
*ACPICABase
= (struct ACPICABase
*)__aros_getbase_ACPICABase();
208 D(bug("[ACPI] %s: ACPICABase=0x%p\n", __func__
, ACPICABase
));
210 ACPICABase
->ab_TimeRequest
->tr_node
.io_Command
= TR_ADDREQUEST
;
211 ACPICABase
->ab_TimeRequest
->tr_time
.tv_secs
= Milliseconds
/ 1000;
212 ACPICABase
->ab_TimeRequest
->tr_time
.tv_micro
= (Milliseconds
% 1000) * 1000;
213 DoIO((struct IORequest
*)ACPICABase
->ab_TimeRequest
);
216 void AcpiOsStall(UINT32 Microseconds
)
218 struct ACPICABase
*ACPICABase
= (struct ACPICABase
*)__aros_getbase_ACPICABase();
220 D(bug("[ACPI] %s: ACPICABase=0x%p\n", __func__
, ACPICABase
));
222 ACPICABase
->ab_TimeRequest
->tr_node
.io_Command
= TR_ADDREQUEST
;
223 ACPICABase
->ab_TimeRequest
->tr_time
.tv_secs
= Microseconds
/ 1000000;
224 ACPICABase
->ab_TimeRequest
->tr_time
.tv_micro
= (Microseconds
% 1000000);
225 DoIO((struct IORequest
*)ACPICABase
->ab_TimeRequest
);
228 void AcpiOsWaitEventsComplete(void)
230 bug("[ACPI] %s: FIXME!\n", __func__
);
233 ACPI_STATUS
AcpiOsCreateSemaphore(UINT32 MaxUnits
, UINT32 InitialUnits
, ACPI_SEMAPHORE
*OutHandle
)
235 struct SignalSemaphore
*Handle
;
237 DLOCK(bug("[ACPI] %s()\n", __func__
);)
239 Handle
= ACPI_ALLOCATE(sizeof(*Handle
));
241 InitSemaphore(Handle
);
248 ACPI_STATUS
AcpiOsDeleteSemaphore(ACPI_SEMAPHORE Handle
)
250 DLOCK(bug("[ACPI] %s()\n", __func__
);)
256 ACPI_STATUS
AcpiOsWaitSemaphore(ACPI_SEMAPHORE Handle
, UINT32 Units
, UINT16 Timeout
)
258 DLOCK(bug("[ACPI] %s()\n", __func__
);)
260 if (Timeout
== ACPI_DO_NOT_WAIT
) {
261 if (!AttemptSemaphore(Handle
))
267 ObtainSemaphore(Handle
);
273 ACPI_STATUS
AcpiOsSignalSemaphore(ACPI_SEMAPHORE Handle
, UINT32 Units
)
275 DLOCK(bug("[ACPI] %s()\n", __func__
);)
277 ReleaseSemaphore(Handle
);
281 /* FIXME: Use SpinLock primitives once they exist in kernel.resource! */
284 volatile ULONG sl_Lock
;
287 static inline struct SpinLock
*CreateSpin(VOID
)
289 DLOCK(bug("[ACPI] %s()\n", __func__
));
291 return AllocVec(sizeof(struct SpinLock
), MEMF_ANY
| MEMF_CLEAR
);
294 static inline void DeleteSpin(struct SpinLock
*sl
)
296 DLOCK(bug("[ACPI] %s()\n", __func__
);)
299 while (sl
->sl_Lock
> 0) {
308 static inline VOID
LockSpin(struct SpinLock
*sl
)
311 struct Task
*task
= FindTask(NULL
);
313 DLOCK(bug("[ACPI] %s()\n", __func__
);)
315 pri
= task
->tc_Node
.ln_Pri
;
320 if (sl
->sl_Lock
== 0) {
322 if (pri_lower
!= pri
)
323 SetTaskPri(task
, pri
);
327 if (pri_lower
> MIN_PRI
)
329 SetTaskPri(task
, pri_lower
);
333 static inline void UnlockSpin(struct SpinLock
*sl
)
335 DLOCK(bug("[ACPI] %s()\n", __func__
));
341 ACPI_STATUS
AcpiOsCreateLock(ACPI_SPINLOCK
*OutHandle
)
343 DLOCK(bug("[ACPI] %s()\n", __func__
));
345 *OutHandle
= CreateSpin();
347 return (*OutHandle
== NULL
) ? AE_NO_MEMORY
: AE_OK
;
350 void AcpiOsDeleteLock(ACPI_SPINLOCK Handle
)
355 ACPI_CPU_FLAGS
AcpiOsAcquireLock(ACPI_SPINLOCK Handle
)
357 DLOCK(bug("[ACPI] %s()\n", __func__
));
363 void AcpiOsReleaseLock(ACPI_SPINLOCK Handle
, ACPI_CPU_FLAGS Flags
)
365 DLOCK(bug("[ACPI] %s()\n", __func__
));
372 struct Interrupt ai_Interrupt
;
373 ACPI_OSD_HANDLER ai_Handler
;
377 static AROS_INTH1(AcpiOsIntServer
, struct AcpiOsInt
*, ai
)
383 D(bug("[ACPI] %s()\n", __func__
));
385 ret
= ai
->ai_Handler(ai
->ai_Context
);
387 return (ret
== ACPI_INTERRUPT_HANDLED
) ? TRUE
: FALSE
;
392 ACPI_STATUS
AcpiOsInstallInterruptHandler(UINT32 InterruptLevel
, ACPI_OSD_HANDLER Handler
, void *Context
)
394 struct AcpiOsInt
*ai
;
396 D(bug("[ACPI] %s()\n", __func__
));
398 if ((ai
= ACPI_ALLOCATE(sizeof(*ai
)))) {
399 ai
->ai_Interrupt
.is_Node
.ln_Name
= "ACPI";
400 ai
->ai_Interrupt
.is_Code
= (APTR
)AcpiOsIntServer
;
401 ai
->ai_Interrupt
.is_Data
= (APTR
)ai
;
402 ai
->ai_Handler
= Handler
;
403 ai
->ai_Context
= Context
;
404 AddIntServer(INTB_KERNEL
+ InterruptLevel
, &ai
->ai_Interrupt
);
411 ACPI_STATUS
AcpiOsRemoveInterruptHandler(UINT32 InterruptNumber
, ACPI_OSD_HANDLER Handler
)
413 bug("[ACPI] %s: FIXME! (InterruptLevel=%d)\n", __func__
, InterruptNumber
);
415 return AE_NOT_IMPLEMENTED
;
418 ACPI_STATUS
AcpiOsReadMemory(ACPI_PHYSICAL_ADDRESS Address
, UINT64
*Value
, UINT32 Width
)
421 case 8: *Value
= *(UINT8
*)Address
; break;
422 case 16: *Value
= *(UINT16
*)Address
; break;
423 case 32: *Value
= *(UINT32
*)Address
; break;
424 case 64: *Value
= *(UINT64
*)Address
; break;
425 default: *Value
= ~0; break;
431 ACPI_STATUS
AcpiOsWriteMemory(ACPI_PHYSICAL_ADDRESS Address
, UINT64 Value
, UINT32 Width
)
434 case 8: *(UINT8
*)Address
= (UINT8
)Value
; break;
435 case 16: *(UINT16
*)Address
= (UINT16
)Value
; break;
436 case 32: *(UINT32
*)Address
= (UINT32
)Value
; break;
437 case 64: *(UINT64
*)Address
= (UINT64
)Value
; break;
444 ACPI_STATUS
AcpiOsReadPort(ACPI_IO_ADDRESS Address
, UINT32
*Value
, UINT32 Width
)
447 case 8: *Value
= inb(Address
); break;
448 case 16: *Value
= inw(Address
); break;
449 case 32: *Value
= inl(Address
); break;
450 default: *Value
= ~0; break;
455 ACPI_STATUS
AcpiOsWritePort(ACPI_IO_ADDRESS Address
, UINT32 Value
, UINT32 Width
)
458 case 8: outb(Value
,Address
); break;
459 case 16: outw(Value
,Address
); break;
460 case 32: outl(Value
,Address
); break;
466 static UINT8
*find_pci(struct ACPICABase
*ACPICABase
, ACPI_PCI_ID
*PciId
)
470 D(bug("[ACPI] %s()\n", __func__
));
472 for (i
= 0; i
< ACPICABase
->ab_PCIs
; i
++) {
473 ACPI_MCFG_ALLOCATION
*ma
= &ACPICABase
->ab_PCI
[i
];
474 if (PciId
->Segment
!= ma
->PciSegment
)
476 if (PciId
->Bus
< ma
->StartBusNumber
||
477 PciId
->Bus
> ma
->EndBusNumber
)
480 return (UINT8
*)(ACPI_PHYSICAL_ADDRESS
)ma
->Address
;
486 ACPI_STATUS
AcpiOsReadPciConfiguration(ACPI_PCI_ID
*PciId
, UINT32 Register
, UINT64
*Value
, UINT32 Width
)
488 struct ACPICABase
*ACPICABase
= (struct ACPICABase
*)__aros_getbase_ACPICABase();
491 D(bug("[ACPI] %s: ACPICABase=0x%p\n", __func__
, ACPICABase
));
493 if ((ecam
= find_pci(ACPICABase
, PciId
))) {
494 UINT32 offset
= (PciId
->Bus
<< 20) | (PciId
->Device
<< 15) | (PciId
->Function
<< 12) | Register
;
496 case 8: *Value
= *(volatile UINT8
*)(ecam
+ offset
); break;
497 case 16: *Value
= *(volatile UINT16
*)(ecam
+ offset
); break;
498 case 32: *Value
= *(volatile UINT32
*)(ecam
+ offset
); break;
499 case 64: *Value
= *(volatile UINT64
*)(ecam
+ offset
); break;
500 default: *Value
= 0; break;
509 ACPI_STATUS
AcpiOsWritePciConfiguration(ACPI_PCI_ID
*PciId
, UINT32 Register
, UINT64 Value
, UINT32 Width
)
511 struct ACPICABase
*ACPICABase
= (struct ACPICABase
*)__aros_getbase_ACPICABase();
514 D(bug("[ACPI] %s: ACPICABase=0x%p\n", __func__
, ACPICABase
));
516 if ((ecam
= find_pci(ACPICABase
, PciId
))) {
517 UINT32 offset
= (PciId
->Bus
<< 20) | (PciId
->Device
<< 15) | (PciId
->Function
<< 12) | Register
;
519 case 8: *(volatile UINT8
*)(ecam
+ offset
) = Value
& 0xff; break;
520 case 16: *(volatile UINT16
*)(ecam
+ offset
) = Value
& 0xffff; break;
521 case 32: *(volatile UINT32
*)(ecam
+ offset
) = Value
& 0xffffffff; break;
522 case 64: *(volatile UINT64
*)(ecam
+ offset
) = Value
; break;
532 void AcpiOsPrintf(const char *Fmt
, ...)
536 va_start (Args
, Fmt
);
537 AcpiOsVprintf (Fmt
, Args
);
541 void AcpiOsVprintf(const char *Format
, va_list Args
)
543 vkprintf(Format
, Args
);
546 /* Return current time in 100ns units
548 UINT64
AcpiOsGetTimer(void)
550 struct ACPICABase
*ACPICABase
= (struct ACPICABase
*)__aros_getbase_ACPICABase();
551 struct Library
*TimerBase
;
555 D(bug("[ACPI] %s: ACPICABase=0x%p\n", __func__
, ACPICABase
));
557 if ((TimerBase
= ACPICABase
->ab_TimerBase
))
559 D(bug("[ACPI] %s: TimerBase=0x%p\n", __func__
, TimerBase
));
563 D(bug("[ACPI] %s: GetSysTime returned\n", __func__
));
564 retVal
= (tv
.tv_secs
*1000000ULL + tv
.tv_micro
)*10;
569 ACPI_STATUS
AcpiOsSignal(UINT32 Function
, void *Info
)
571 bug("FIXME: %s\n", __func__
);
572 return AE_NOT_IMPLEMENTED
;
575 ACPI_STATUS
AcpiOsGetLine(char *Buffer
, UINT32 BufferLength
, UINT32
*BytesRead
)
577 bug("[ACPI] %s: FIXME!\n", __func__
);
579 return AE_NOT_IMPLEMENTED
;
588 D(bug("[ACPI] %s()\n", __func__
));
596 UINT8
AcpiGetInfoFlags(ACPI_DEVICE_INFO
*DevInfo
)
598 return DevInfo
->Flags
;
601 UINT8
*AcpiGetInfoLowDstates(ACPI_DEVICE_INFO
*DevInfo
)
603 if (DevInfo
->Valid
& ACPI_VALID_SXWS
)
604 return DevInfo
->LowestDstates
;
608 UINT8
*AcpiGetInfoHighDstates(ACPI_DEVICE_INFO
*DevInfo
)
610 if (DevInfo
->Valid
& ACPI_VALID_SXDS
)
611 return DevInfo
->HighestDstates
;
615 UINT64
AcpiGetInfoAddress(ACPI_DEVICE_INFO
*DevInfo
)
617 if (DevInfo
->Valid
& ACPI_VALID_ADR
)
618 return DevInfo
->Address
;
622 ACPI_PNP_DEVICE_ID
*AcpiGetInfoHardwareId(ACPI_DEVICE_INFO
*DevInfo
)
624 if (DevInfo
->Valid
& ACPI_VALID_HID
)
625 return &DevInfo
->HardwareId
;
629 ACPI_PNP_DEVICE_ID
*AcpiGetInfoUniqueId(ACPI_DEVICE_INFO
*DevInfo
)
631 if (DevInfo
->Valid
& ACPI_VALID_UID
)
632 return &DevInfo
->UniqueId
;
636 ACPI_PNP_DEVICE_ID
*AcpiGetInfoClassCode(ACPI_DEVICE_INFO
*DevInfo
)
638 ACPI_PNP_DEVICE_ID
*classCode
= NULL
;
639 #if defined(ACPI_VALID_CLS)
640 if (DevInfo
->Valid
& ACPI_VALID_CLS
)
641 classCode
= &DevInfo
->ClassCode
;
646 ACPI_PNP_DEVICE_ID_LIST
*AcpiGetInfoCompatIdList(ACPI_DEVICE_INFO
*DevInfo
)
648 if (DevInfo
->Valid
& ACPI_VALID_CID
)
649 return &DevInfo
->CompatibleIdList
;
653 LONG
AcpiScanTables(const char *Signature
, const struct Hook
*Hook
, APTR UserData
)
658 D(bug("[ACPI] %s()\n", __func__
));
660 for (count
= 0, i
= 1; ; i
++) {
662 ACPI_TABLE_HEADER
*hdr
;
665 err
= AcpiGetTable((ACPI_STRING
)Signature
, i
, &hdr
);
670 ok
= CALLHOOKPKT((struct Hook
*)Hook
, hdr
, UserData
);
681 #define ACPI_MAX_INIT_TABLES 64
683 static int ACPICA_InitTask(struct ACPICABase
*ACPICABase
)
686 const UINT8 initlevel
= ACPI_FULL_INITIALIZATION
;
688 D(bug("[ACPI] %s: Starting Full initialization...\n", __func__
));
690 err
= AcpiInitializeSubsystem();
691 if (ACPI_FAILURE(err
)) {
692 D(bug("[ACPI] %s: AcpiInitializeSubsystem returned error %d\n", __func__
, err
));
696 D(bug("[ACPI] %s: Subsystem Initialized\n", __func__
));
698 err
= AcpiLoadTables();
699 if (ACPI_FAILURE(err
)) {
700 D(bug("[ACPI] %s: AcpiLoadTables returned error %d\n", __func__
, err
));
704 D(bug("[ACPI] %s: Tables Initialized\n", __func__
));
706 err
= AcpiEnableSubsystem(initlevel
);
707 if (ACPI_FAILURE(err
)) {
708 D(bug("[ACPI] %s: AcpiEnableSubsystem(0x%02x) returned error %d\n", __func__
, initlevel
, err
));
712 D(bug("[ACPI] %s: Subsystem Enabled\n", __func__
));
714 err
= AcpiInitializeObjects(initlevel
);
715 if (ACPI_FAILURE(err
)) {
716 D(bug("[ACPI] %s: AcpiInitializeObjects(0x%02x) returned error %d\n", __func__
, initlevel
, err
));
720 D(bug("[ACPI] %s: Full initialization complete\n", __func__
));
725 int ACPICA_init(struct ACPICABase
*ACPICABase
)
727 ACPI_TABLE_MCFG
*mcfg
;
729 struct Library
*KernelBase
;
731 D(bug("[ACPI] %s: ACPICABase=0x%p\n", __func__
, ACPICABase
));
733 if ((KernelBase
= OpenResource("kernel.resource"))) {
734 struct TagItem
*cmdline
= LibFindTagItem(KRN_CmdLine
, KrnGetBootInfo());
736 if (cmdline
&& strcasestr((char *)cmdline
->ti_Data
, "noacpi")) {
737 D(bug("[ACPI] %s: Disabled from command line\n", __func__
));
741 ACPICABase
->ab_Flags
|= ACPICAF_ENABLED
;
745 ACPICABase
->ab_RootPointer
= 0;
747 err
= AcpiInitializeTables(NULL
, ACPI_MAX_INIT_TABLES
, TRUE
);
748 if (ACPI_FAILURE(err
)) {
749 D(bug("[ACPI] %s: AcpiInitializeTables returned error %d\n", __func__
, err
));
753 if (AcpiGetTable("MCFG", 1, (ACPI_TABLE_HEADER
**)&mcfg
) == AE_OK
) {
754 ACPICABase
->ab_PCIs
= (mcfg
->Header
.Length
- sizeof(*mcfg
)) / sizeof(ACPI_MCFG_ALLOCATION
);
755 ACPICABase
->ab_PCI
= (ACPI_MCFG_ALLOCATION
*)&mcfg
[1];
757 ACPICABase
->ab_PCIs
= 0;
762 ADD2INITLIB(ACPICA_init
,0)
764 int ACPICA_expunge(struct ACPICABase
*ACPICABase
)
766 D(bug("[ACPI] %s()\n", __func__
));
768 if ((ACPICABase
->ab_Flags
& ACPICAF_ENABLED
) != 0)
773 ADD2EXPUNGELIB(ACPICA_expunge
, 0)
775 /******************* ACPICA Post Exec/Kernel Setup ******************/
777 extern void acpicapost_end(void);
779 static AROS_UFP3 (APTR
, ACPICAPost
,
780 AROS_UFPA(struct Library
*, lh
, D0
),
781 AROS_UFPA(BPTR
, segList
, A0
),
782 AROS_UFPA(struct ExecBase
*, sysBase
, A6
));
784 static const TEXT acpicapost_namestring
[] = "acpica.post";
785 static const TEXT acpicapost_versionstring
[] = "acpica.post 1.0\n";
787 const struct Resident acpicapost_romtag
=
790 (struct Resident
*)&acpicapost_romtag
,
791 (APTR
)&acpicapost_end
,
796 (STRPTR
)acpicapost_namestring
,
797 (STRPTR
)acpicapost_versionstring
,
801 extern struct syscallx86_Handler x86_SCRebootHandler
;
802 extern struct syscallx86_Handler x86_SCChangePMStateHandler
;
804 static AROS_UFH3 (APTR
, ACPICAPost
,
805 AROS_UFHA(struct Library
*, lh
, D0
),
806 AROS_UFHA(BPTR
, segList
, A0
),
807 AROS_UFHA(struct ExecBase
*, SysBase
, A6
)
812 struct ACPICABase
*ACPICABase
;
814 D(bug("[ACPI] %s()\n", __func__
));
816 /* If ACPICA isn't available, don't run */
817 ACPICABase
= (struct ACPICABase
*)OpenLibrary("acpica.library", 0);
819 D(bug("[ACPI] %s(): Can't open acpica.library. Quitting\n", __func__
));
823 /* Start up the late initialization thread at the highest priority */
824 if (NewCreateTask(TASKTAG_PC
, ACPICA_InitTask
, TASKTAG_NAME
, "ACPICA_InitTask",
825 TASKTAG_PRI
, 127, TASKTAG_ARG1
, ACPICABase
, TAG_DONE
) == NULL
) {
826 bug("[ACPI] %s: Failed to start ACPI init task\n", __func__
);
829 D(bug("[ACPI] %s: Finished\n", __func__
));
836 void acpicapost_end(void) { };
838 /******************* Timer Setup - Runs after timer.device is initialised ******************/
840 extern void acpicatimer_end(void);
842 static AROS_UFP3 (APTR
, ACPICATimerSetup
,
843 AROS_UFPA(struct Library
*, lh
, D0
),
844 AROS_UFPA(BPTR
, segList
, A0
),
845 AROS_UFPA(struct ExecBase
*, sysBase
, A6
));
847 static const TEXT acpicatimer_namestring
[] = "acpica.timer";
848 static const TEXT acpicatimer_versionstring
[] = "acpica.timer 1.0\n";
850 const struct Resident acpicatimer_romtag
=
853 (struct Resident
*)&acpicatimer_romtag
,
854 (APTR
)&acpicatimer_end
,
859 (STRPTR
)acpicatimer_namestring
,
860 (STRPTR
)acpicatimer_versionstring
,
861 (APTR
)ACPICATimerSetup
864 extern struct syscallx86_Handler x86_SCRebootHandler
;
865 extern struct syscallx86_Handler x86_SCChangePMStateHandler
;
867 static AROS_UFH3 (APTR
, ACPICATimerSetup
,
868 AROS_UFHA(struct Library
*, lh
, D0
),
869 AROS_UFHA(BPTR
, segList
, A0
),
870 AROS_UFHA(struct ExecBase
*, SysBase
, A6
)
875 struct ACPICABase
*ACPICABase
;
877 D(bug("[ACPI] %s()\n", __func__
));
879 /* If ACPICA isn't available, don't run */
880 ACPICABase
= (struct ACPICABase
*)OpenLibrary("acpica.library", 0);
882 D(bug("[ACPI] %s(): Can't open acpica.library. Quitting\n", __func__
));
886 if (0 == OpenDevice(TIMERNAME
, UNIT_MICROHZ
, (struct IORequest
*)ACPICABase
->ab_TimeRequest
, 0))
888 ACPICABase
->ab_Flags
|= ACPICAF_TIMER
;
889 ACPICABase
->ab_TimerBase
= (struct Library
*)ACPICABase
->ab_TimeRequest
->tr_node
.io_Device
;
891 D(bug("[ACPI] %s: Finished\n", __func__
));
898 void acpicatimer_end(void) { };