//----------------------------------------------------------------------------//
// GNU GPL OS/K //
// //
// Desc: ACPI, Hardware detection related //
// //
// //
// Copyright © 2018-2020 The OS/K Team //
// //
// This file is part of OS/K. //
// //
// OS/K is free software: you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by //
// the Free Software Foundation, either version 3 of the License, or //
// any later version. //
// //
// OS/K is distributed in the hope that it will be useful, //
// but WITHOUT ANY WARRANTY//without even the implied warranty of //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
// GNU General Public License for more details. //
// //
// You should have received a copy of the GNU General Public License //
// along with OS/K. If not, see . //
//----------------------------------------------------------------------------//
#ifndef _KERNEL_H
#include
#endif
#ifndef _IO_ACPI_H
#define _IO_ACPI_H
//----------------------------------------------------------------------------//
//
// ACPI 1.0 descriptor
//
struct RSDPLegacy {
char signature[8];
uchar checksum;
char OEMID[6];
uchar revision;
uint rsdtAddress;
} __attribute__ ((packed));
//
// ACPI 2.0 descriptor
//
struct RSDPDescriptor_t {
// RSDT ACPI 1.0 and above
struct RSDPLegacy legacy;
// RSDT ACPI 2.0
uint length;
ulong xsdtAddress;
uchar extendedChecksum;
uchar reserved[3];
} __attribute__ ((packed));
//
// ACPI System Description Table
//
struct SDTHeader_t {
char signature[4];
uint length;
uchar revision;
uchar checksum;
char OEMID[6];
char OEMTableID[8];
uint OEMRevision;
uint creatorID;
uint creatorRevision;
uint sdtEntry;
};
//
// GAS type, used by ACPI tables to inform about registers
//
struct GenericAddressStructure
{
uchar addressSpace;
uchar width;
uchar offset;
uchar accessSize;
ulong address;
};
//
// ACPI table types id
//
enum {
SDT_MADT,
SDT_BERT,
SDT_CPEP,
SDT_DSDT,
SDT_ECDT,
SDT_EINJ,
SDT_ERST,
SDT_FADT,
SDT_FACS,
SDT_HEST,
SDT_MSCT,
SDT_MPST,
SDT_OEMx,
SDT_PMTT,
SDT_PSDT,
SDT_RASF,
SDT_RSDT,
SDT_SBST,
SDT_SLIT,
SDT_SRAT,
SDT_SSDT,
SDT_XSDT,
SDT_HEPT,
SDT_MCFG
};
#define N_SDT_TYPES 24
//----------------------------------------------------------------------------//
// FADT related
//
struct FADT_t
{
char signature[4];
uint length;
uchar revision;
uchar checksum;
char OEMID[6];
char OEMTableID[8];
uint OEMRevision;
uint creatorID;
uint creatorRevision;
uint firmwareCtrlAddress;
uint dsdtAddress;
uchar reserved; // legacy
uchar preferredPowerManagementProfile;
ushort SCIInterrupt;
uint SMICommandPort;
uchar acpiEnable;
uchar acpiDisable;
uchar S4BIOSREQ;
uchar PSTATEControl;
uint PM1aEventBlock;
uint PM1bEventBlock;
uint PM1aControlBlock;
uint PM1bControlBlock;
uint PM2ControlBlock;
uint PMTimerBlock;
uint GPE0Block;
uint GPE1Block;
uchar PM1EventLength;
uchar PM1ControlLength;
uchar PM2ControlLength;
uchar PMTimerLength;
uchar GPE0Length;
uchar GPE1Length;
uchar GPE1Base;
uchar CStateControl;
ushort worstC2Latency;
ushort worstC3Latency;
ushort flushSize;
ushort flushStride;
uchar dutyOffset;
uchar dutyWidth;
uchar dayAlarm;
uchar monthAlarm;
uchar century;
// reserved in ACPI1, available since ACPI2
ushort bootArchitectureFlags;
uchar reserved2; // legacy
uint flags;
struct GenericAddressStructure resetReg;
uchar resetValue;
uchar reserved3[3];
// 64bit pointers, available since ACPI2
ulong xFirmwareControlAddress;
ulong xDsdtAddress;
struct GenericAddressStructure xPM1aEventBlock;
struct GenericAddressStructure xPM1bEventBlock;
struct GenericAddressStructure xPM1aControlBlock;
struct GenericAddressStructure xPM1bControlBlock;
struct GenericAddressStructure xPM2ControlBlock;
struct GenericAddressStructure xPMTimerBlock;
struct GenericAddressStructure xGPE0Block;
struct GenericAddressStructure xGPE1Block;
};
//----------------------------------------------------------------------------//
struct MCFG_t {
char signature[4];
uint length;
uchar revision;
uchar checksum;
char OEMID[6];
char OEMTableID[8];
uint OEMRevision;
uint creatorID;
uint creatorRevision;
ulong reserved;
void* pciConfigBaseAddress;
} __attribute__ ((packed));
//----------------------------------------------------------------------------//
void IoInitAcpi(void);
SDTHeader_t *IoGetAcpiTable(ulong id);
//----------------------------------------------------------------------------//
#endif