Files
MontaukOS/kernel/src/ACPI/AcpiDevices.hpp
T

132 lines
5.2 KiB
C++

/*
* AcpiDevices.hpp
* ACPI device enumeration — walks namespace to discover and query devices
* Copyright (c) 2026 Daniel Hammer
*/
#pragma once
#include <cstdint>
#include <ACPI/AML/AmlResource.hpp>
namespace Hal {
namespace AcpiDevices {
// ============================================================================
// Device Status Flags (_STA)
// ============================================================================
static constexpr uint32_t STA_PRESENT = (1 << 0);
static constexpr uint32_t STA_ENABLED = (1 << 1);
static constexpr uint32_t STA_VISIBLE = (1 << 2);
static constexpr uint32_t STA_FUNCTIONAL = (1 << 3);
static constexpr uint32_t STA_BATTERY = (1 << 4); // battery present (for batteries)
// Default _STA when no _STA method exists: present + enabled + visible + functional
static constexpr uint32_t STA_DEFAULT = 0x0F;
// ============================================================================
// Device Info
// ============================================================================
struct DeviceInfo {
char Path[128]; // full namespace path
char HardwareId[16]; // _HID value (e.g. "PNP0A03", "ACPI0001")
char UniqueId[16]; // _UID value
uint64_t Address; // _ADR value (for PCI: (device << 16) | function)
uint32_t Status; // _STA flags
int32_t NodeIndex; // namespace node index
bool IsPresent; // STA_PRESENT && STA_FUNCTIONAL
};
static constexpr int MaxDevices = 64;
struct DeviceList {
DeviceInfo Devices[MaxDevices];
int Count;
DeviceList() : Count(0) {}
// Find a device by HID. Returns nullptr if not found.
const DeviceInfo* FindByHid(const char* hid) const;
// Find a device by path. Returns nullptr if not found.
const DeviceInfo* FindByPath(const char* path) const;
};
// ============================================================================
// Enumeration API
// ============================================================================
// Enumerate all ACPI devices in the namespace.
// The interpreter must be initialized first (LoadTable called).
void EnumerateAll(DeviceList& result);
// Evaluate _STA for a device node. Returns STA_DEFAULT if no _STA exists.
uint32_t EvaluateSta(int32_t deviceNodeIndex);
// Evaluate _ADR for a device node. Returns 0 if no _ADR exists.
uint64_t EvaluateAdr(int32_t deviceNodeIndex);
// Evaluate _HID for a device node. Returns false if no _HID exists.
// Writes the HID string (or EISAID) into outHid.
bool EvaluateHid(int32_t deviceNodeIndex, char* outHid, int maxLen);
// Evaluate _UID for a device node.
bool EvaluateUid(int32_t deviceNodeIndex, char* outUid, int maxLen);
// Evaluate _CRS (Current Resource Settings) for a device node.
bool EvaluateCrs(int32_t deviceNodeIndex, AML::ResourceList& result);
// ============================================================================
// Well-known HIDs
// ============================================================================
// PCI Host Bridge
static constexpr const char* HID_PCI_HOST = "PNP0A03";
static constexpr const char* HID_PCIE_HOST = "PNP0A08";
// System Timer (PIT)
static constexpr const char* HID_PIT = "PNP0100";
// RTC / CMOS
static constexpr const char* HID_RTC = "PNP0B00";
// Keyboard controller (i8042)
static constexpr const char* HID_KBD = "PNP0303";
// PS/2 Mouse
static constexpr const char* HID_MOUSE = "PNP0F13";
// Serial port (UART)
static constexpr const char* HID_SERIAL = "PNP0501";
// ACPI Embedded Controller
static constexpr const char* HID_EC = "PNP0C09";
// ACPI Power Button
static constexpr const char* HID_PWRBTN = "PNP0C0C";
// ACPI Sleep Button
static constexpr const char* HID_SLPBTN = "PNP0C0E";
// ACPI Lid device
static constexpr const char* HID_LID = "PNP0C0D";
// ACPI Thermal Zone
static constexpr const char* HID_THERMAL = "PNP0C0B";
// ACPI Battery
static constexpr const char* HID_BATTERY = "PNP0C0A";
// ACPI AC Adapter
static constexpr const char* HID_AC_ADAPTER = "ACPI0003";
// ============================================================================
// Sleep State Support
// ============================================================================
// Extract sleep state values from namespace objects (\_S0_ through \_S5_).
struct SleepState {
uint16_t SLP_TYPa;
uint16_t SLP_TYPb;
bool Valid;
};
// Get the sleep type values for a given sleep state (0-5).
SleepState GetSleepState(int state);
};
};