Initialize ACPI Timer

This commit is contained in:
Rafal Kupiec 2024-06-04 21:04:09 +02:00
parent 7704e5d399
commit 7b29897efb
Signed by: belliash
GPG Key ID: 4E829243E0CFE6B4
5 changed files with 69 additions and 1 deletions

View File

@ -59,6 +59,13 @@
#define ACPI_WSMT_SIGNATURE 0x544D5357 /* Windows SMM Security Mitigation Table */
#define ACPI_XSDT_SIGNATURE 0x54445358 /* eXtended System Descriptor Table */
/* ACPI FADT flags masks */
#define ACPI_FADT_32BIT_TIMER (1<<8)
/* ACPI Timer bit masks */
#define ACPI_FADT_TIMER_32BIT 0x80000000
#define ACPI_FADT_TIMER_24BIT 0x00800000
/* Default serial port settings */
#define COMPORT_CLOCK_RATE 0x1C200
#define COMPORT_WAIT_TIMEOUT 204800
@ -205,7 +212,7 @@ typedef struct _ACPI_DESCRIPTION_HEADER
ULONG CreatorRev;
} ACPI_DESCRIPTION_HEADER, *PACPI_DESCRIPTION_HEADER;
/* ACPI cache list */
/* ACPI cache list structure */
typedef struct _ACPI_CACHE_LIST
{
LIST_ENTRY ListEntry;
@ -300,6 +307,13 @@ typedef struct _ACPI_FADT
GENERIC_ADDRESS SleepStatusReg;
} ACPI_FADT, *PACPI_FADT;
/* ACPI Timer information structure */
typedef struct _ACPI_TIMER_INFO
{
ULONG TimerPort;
ULONG MsbMask;
} ACPI_TIMER_INFO, *PACPI_TIMER_INFO;
/* Serial (COM) port initial state */
typedef struct _CPPORT
{

View File

@ -121,6 +121,9 @@ HlpInitializeAcpi(VOID)
return STATUS_NOT_FOUND;
}
/* Initialize ACPI timer */
HlpInitializeAcpiTimer();
/* Return success */
return STATUS_SUCCESS;
}
@ -251,6 +254,47 @@ HlpInitializeAcpiSystemDescriptionTable(OUT PACPI_DESCRIPTION_HEADER *AcpiTable)
return STATUS_SUCCESS;
}
/**
* Initializes the ACPI Timer.
*
* @return This routine returns a status code.
*
* @since XT 1.0
*/
XTAPI
XTSTATUS
HlpInitializeAcpiTimer(VOID)
{
PACPI_FADT Fadt;
XTSTATUS Status;
/* Get Fixed ACPI Description Table (FADT) */
Status = HlGetAcpiTable(ACPI_FADT_SIGNATURE, (PACPI_DESCRIPTION_HEADER*)&Fadt);
if(Status != STATUS_SUCCESS || !Fadt)
{
/* Failed to get FADT, return error */
return STATUS_NOT_FOUND;
}
/* Set ACPI timer port address */
HlpAcpiTimerInfo.TimerPort = Fadt->PmTmrBlkIoPort;
/* Determine whether 32-bit or 24-bit timer is used */
if(Fadt->Flags & ACPI_FADT_32BIT_TIMER)
{
/* 32-bit timer */
HlpAcpiTimerInfo.MsbMask = ACPI_FADT_TIMER_32BIT;
}
else
{
/* 24-bit timer */
HlpAcpiTimerInfo.MsbMask = ACPI_FADT_TIMER_24BIT;
}
/* Return success */
return STATUS_SUCCESS;
}
/**
* Queries kernel local ACPI cache in attempt to find a requested ACPI table.
*

View File

@ -15,6 +15,9 @@ LIST_ENTRY HlpAcpiCacheList;
/* ACPI Root System Description Pointer (RSDP) */
PACPI_RSDP HlpAcpiRsdp;
/* ACPI timer information */
ACPI_TIMER_INFO HlpAcpiTimerInfo;
/* Active processors count */
KAFFINITY HlpActiveProcessors;

View File

@ -18,6 +18,9 @@ EXTERN LIST_ENTRY HlpAcpiCacheList;
/* ACPI Root System Description Pointer (RSDP) */
EXTERN PACPI_RSDP HlpAcpiRsdp;
/* ACPI timer information */
EXTERN ACPI_TIMER_INFO HlpAcpiTimerInfo;
/* Active processors count */
EXTERN KAFFINITY HlpActiveProcessors;

View File

@ -95,6 +95,10 @@ XTAPI
XTSTATUS
HlpInitializeAcpiSystemDescriptionTable(OUT PACPI_DESCRIPTION_HEADER *AcpiTable);
XTAPI
XTSTATUS
HlpInitializeAcpiTimer(VOID);
XTAPI
XTSTATUS
HlpQueryAcpiCache(IN ULONG Signature,