mirror of
https://github.com/taigrr/gopher-os
synced 2025-01-18 04:43:13 -08:00
acpi: define structs for standard header and various ACPI tables
This commit is contained in:
parent
7bcaf0ee8d
commit
49dfc5c9de
264
src/gopheros/device/acpi/table/tables.go
Normal file
264
src/gopheros/device/acpi/table/tables.go
Normal file
@ -0,0 +1,264 @@
|
||||
package table
|
||||
|
||||
// Resolver is an interface implemented by objects that can lookup an ACPI table
|
||||
// by its name.
|
||||
//
|
||||
// LookupTable attempts to locate a table by name returning back a pointer to
|
||||
// its standard header or nil if the table could not be found. The resolver
|
||||
// must make sure that the entire table contents are mapped so they can be
|
||||
// accessed by the caller.
|
||||
type Resolver interface {
|
||||
LookupTable(string) *SDTHeader
|
||||
}
|
||||
|
||||
// RSDPDescriptor defines the root system descriptor pointer for ACPI 1.0. This
|
||||
// is used as the entry-point for parsing ACPI data.
|
||||
type RSDPDescriptor struct {
|
||||
// The signature must contain "RSD PTR " (last byte is a space).
|
||||
Signature [8]byte
|
||||
|
||||
// A value that when added to the sum of all other bytes contained in
|
||||
// this descriptor should result in the value 0.
|
||||
Checksum uint8
|
||||
|
||||
OEMID [6]byte
|
||||
|
||||
// ACPI revision number. It is 0 for ACPI1.0 and 2 for versions 2.0 to 6.2.
|
||||
Revision uint8
|
||||
|
||||
// Physical address of 32-bit root system descriptor table.
|
||||
RSDTAddr uint32
|
||||
}
|
||||
|
||||
// ExtRSDPDescriptor extends RSDPDescriptor with additional fields. It is used
|
||||
// when RSDPDescriptor.revision > 1.
|
||||
type ExtRSDPDescriptor struct {
|
||||
RSDPDescriptor
|
||||
|
||||
// The size of the 64-bit root system descriptor table.
|
||||
Length uint32
|
||||
|
||||
// Physical address of 64-bit root system descriptor table.
|
||||
XSDTAddr uint64
|
||||
|
||||
// A value that when added to the sum of all other bytes contained in
|
||||
// this descriptor should result in the value 0.
|
||||
ExtendedChecksum uint8
|
||||
|
||||
reserved [3]byte
|
||||
}
|
||||
|
||||
// SDTHeader defines the common header for all ACPI-related tables.
|
||||
type SDTHeader struct {
|
||||
// The signature defines the table type.
|
||||
Signature [4]byte
|
||||
|
||||
// The length of the table
|
||||
Length uint32
|
||||
|
||||
// If this header belongs to a DSDT/SSDT table, the revision is also
|
||||
// used to indicate whether the AML VM should treat integers as 32-bits
|
||||
// (revision < 2) or 64-bits (revision >= 2).
|
||||
Revision uint8
|
||||
|
||||
// A value that when added to the sum of all other bytes in the table
|
||||
// should result in the value 0.
|
||||
Checksum uint8
|
||||
|
||||
// OEM specific information
|
||||
OEMID [6]byte
|
||||
OEMTableID [8]byte
|
||||
OEMRevision uint32
|
||||
|
||||
// Information about the ASL compiler that generated this table
|
||||
CreatorID uint32
|
||||
CreatorRevision uint32
|
||||
}
|
||||
|
||||
// AddressSpace defines the location where a set of registers resides.
|
||||
type AddressSpace uint8
|
||||
|
||||
// The list of supported address space types.
|
||||
const (
|
||||
AddressSpaceSysMemory AddressSpace = iota
|
||||
AddressSpaceSysIO
|
||||
AddressSpacePCI
|
||||
AddressSpaceEmbController
|
||||
AddressSpaceSMBus
|
||||
AddressSpaceFuncFixedHW = 0x7f
|
||||
)
|
||||
|
||||
// GenericAddress specifies a register range located in a particular address
|
||||
// space.
|
||||
type GenericAddress struct {
|
||||
Space AddressSpace
|
||||
BitWidth uint8
|
||||
BitOffset uint8
|
||||
AccessSize uint8
|
||||
Address uint64
|
||||
}
|
||||
|
||||
// PowerProfileType describes a power profile referenced by the FADT table.
|
||||
type PowerProfileType uint8
|
||||
|
||||
// The list of supported power profile types
|
||||
const (
|
||||
PowerProfileUnspecified PowerProfileType = iota
|
||||
PowerProfileDesktop
|
||||
PowerProfileMobile
|
||||
PowerProfileWorkstation
|
||||
PowerProfileEnterpriseServer
|
||||
PowerProfileSOHOServer
|
||||
PowerProfileAppliancePC
|
||||
PowerProfilePerformanceServer
|
||||
)
|
||||
|
||||
// FADT64 contains the 64-bit FADT extensions which are used by ACPI2+
|
||||
type FADT64 struct {
|
||||
FirmwareControl uint64
|
||||
|
||||
Dsdt uint64
|
||||
|
||||
PM1aEventBlock GenericAddress
|
||||
PM1bEventBlock GenericAddress
|
||||
PM1aControlBlock GenericAddress
|
||||
PM1bControlBlock GenericAddress
|
||||
PM2ControlBlock GenericAddress
|
||||
PMTimerBlock GenericAddress
|
||||
GPE0Block GenericAddress
|
||||
GPE1Block GenericAddress
|
||||
}
|
||||
|
||||
// FADT (Fixed ACPI Description Table) is an ACPI table containing information
|
||||
// about fixed register blocks used for power management.
|
||||
type FADT struct {
|
||||
SDTHeader
|
||||
|
||||
FirmwareCtrl uint32
|
||||
Dsdt uint32
|
||||
|
||||
reserved uint8
|
||||
|
||||
PreferredPowerManagementProfile PowerProfileType
|
||||
SCIInterrupt uint16
|
||||
SMICommandPort uint32
|
||||
AcpiEnable uint8
|
||||
AcpiDisable uint8
|
||||
S4BIOSReq uint8
|
||||
PSTATEControl uint8
|
||||
PM1aEventBlock uint32
|
||||
PM1bEventBlock uint32
|
||||
PM1aControlBlock uint32
|
||||
PM1bControlBlock uint32
|
||||
PM2ControlBlock uint32
|
||||
PMTimerBlock uint32
|
||||
GPE0Block uint32
|
||||
GPE1Block uint32
|
||||
PM1EventLength uint8
|
||||
PM1ControlLength uint8
|
||||
PM2ControlLength uint8
|
||||
PMTimerLength uint8
|
||||
GPE0Length uint8
|
||||
GPE1Length uint8
|
||||
GPE1Base uint8
|
||||
CStateControl uint8
|
||||
WorstC2Latency uint16
|
||||
WorstC3Latency uint16
|
||||
FlushSize uint16
|
||||
FlushStride uint16
|
||||
DutyOffset uint8
|
||||
DutyWidth uint8
|
||||
DayAlarm uint8
|
||||
MonthAlarm uint8
|
||||
Century uint8
|
||||
|
||||
// Reserved in ACPI 1.0; used since ACPI 2.0+
|
||||
BootArchitectureFlags uint16
|
||||
|
||||
reserved2 uint8
|
||||
Flags uint32
|
||||
|
||||
ResetReg GenericAddress
|
||||
|
||||
ResetValue uint8
|
||||
reserved3 [3]uint8
|
||||
|
||||
// 64-bit pointers to the above structures used by ACPI 2.0+
|
||||
Ext FADT64
|
||||
}
|
||||
|
||||
// MADT (Multiple APIC Description Table) is an ACPI table containing
|
||||
// information about the interrupt controllers and the number of installed
|
||||
// CPUs. Following the table header are a series of variable sized records
|
||||
// (MADTEntry) which contain additional information.
|
||||
type MADT struct {
|
||||
SDTHeader
|
||||
|
||||
LocalControllerAddress uint32
|
||||
Flags uint32
|
||||
}
|
||||
|
||||
// MADTEntryLocalAPIC describes a single physical processor and its local
|
||||
// interrupt controller.
|
||||
type MADTEntryLocalAPIC struct {
|
||||
ProcessorID uint8
|
||||
APICID uint8
|
||||
Flags uint32
|
||||
}
|
||||
|
||||
// MADTEntryIOAPIC describes an I/O Advanced Programmable Interrupt Controller.
|
||||
type MADTEntryIOAPIC struct {
|
||||
APICID uint8
|
||||
reserved uint8
|
||||
|
||||
// Address contains the address of the controller.
|
||||
Address uint32
|
||||
|
||||
// SysInterruptBase defines the first interrupt number that this
|
||||
// controller handles.
|
||||
SysInterruptBase uint32
|
||||
}
|
||||
|
||||
// MADTEntryInterruptSrcOverride contains the data for an Interrupt Source
|
||||
// Override. This mechanism is used to map IRQ sources to global system
|
||||
// interrupts.
|
||||
type MADTEntryInterruptSrcOverride struct {
|
||||
BusSrc uint8
|
||||
IRQSrc uint8
|
||||
GlobalInterrupt uint32
|
||||
Flags uint16
|
||||
}
|
||||
|
||||
// MADTEntryNMI describes a non-maskable interrupt that we need to set up for
|
||||
// a single processor or all processors.
|
||||
type MADTEntryNMI struct {
|
||||
// Processor specifies the local APIC that we need to configure for
|
||||
// this NMI. If set to 0xff we need to configure all processor APICs.
|
||||
Processor uint8
|
||||
|
||||
Flags uint16
|
||||
|
||||
// This value will be either 0 or 1 and specifies which entry in the
|
||||
// local vector table of the processor's local APIC we need to setup.
|
||||
LINT uint8
|
||||
}
|
||||
|
||||
// MADTEntryType describes the type of a MADT record.
|
||||
type MADTEntryType uint8
|
||||
|
||||
// The list of supported MADT entry types.
|
||||
const (
|
||||
MADTEntryTypeLocalAPIC MADTEntryType = iota
|
||||
MADTEntryTypeIOAPIC
|
||||
MADTEntryTypeIntSrcOverride
|
||||
MADTEntryTypeNMI
|
||||
)
|
||||
|
||||
// MADTEntry describes a MADT table entry that follows the MADT definition. As
|
||||
// MADT entries are variable sized records, this struct works as a union. The
|
||||
// consumer of this struct must check the type value before accessing the union
|
||||
// values.
|
||||
type MADTEntry struct {
|
||||
Type MADTEntryType
|
||||
Length uint8
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user