1/*
2 * Copyright 2014, General Dynamics C4 Systems
3 *
4 * SPDX-License-Identifier: GPL-2.0-only
5 */
6
7#pragma once
8
9#include <assert.h>
10#include <config.h>
11#include <types.h>
12
13enum acpi_size {
14    ACPI_V1_SIZE = 20,
15    ACPI_V2_SIZE = 36
16};
17
18/* Generic System Descriptor Table Header */
19typedef struct acpi_header {
20    char         signature[4];
21    uint32_t     length;
22    uint8_t      revision;
23    uint8_t      checksum;
24    char         oem_id[6];
25    char         oem_table_id[8];
26    uint32_t     oem_revision;
27    char         creater_id[4];
28    uint32_t     creater_revision;
29} PACKED acpi_header_t;
30
31/* Root System Descriptor Pointer */
32typedef struct acpi_rsdp {
33    char         signature[8];
34    uint8_t      checksum;
35    char         oem_id[6];
36    uint8_t      revision;
37    uint32_t     rsdt_address;
38    uint32_t     length;
39    uint64_t     xsdt_address;
40    uint8_t      extended_checksum;
41    char         reserved[3];
42} PACKED acpi_rsdp_t;
43compile_assert(acpi_rsdp_packed, sizeof(acpi_rsdp_t) == ACPI_V2_SIZE)
44
45/* Root System Descriptor Table */
46typedef struct acpi_rsdt {
47    acpi_header_t  header;
48    uint32_t entry[1];
49} PACKED acpi_rsdt_t;
50
51/* Attemps to initialize acpi by searching for a valid RSDP block. If found a copy is placed in rsdp_data
52 * and true is returned, otherwise the contents of rsdp_data are undefined and false is returned. */
53bool_t acpi_init(acpi_rsdp_t *rsdp_data);
54
55/* Validates that a given rsdp block is in fact valid */
56BOOT_CODE bool_t acpi_validate_rsdp(acpi_rsdp_t *acpi_rsdp);
57
58uint32_t acpi_madt_scan(
59    acpi_rsdp_t *acpi_rsdp,
60    cpu_id_t    *cpu_list,
61    uint32_t    *num_ioapic,
62    paddr_t     *ioapic_addrs
63);
64
65typedef struct acpi_rmrr_entry {
66    dev_id_t device;
67    uint32_t base;
68    uint32_t limit;
69} acpi_rmrr_entry_t;
70
71typedef struct acpi_rmrr_list {
72    acpi_rmrr_entry_t entries[CONFIG_MAX_RMRR_ENTRIES];
73    int num;
74} acpi_rmrr_list_t;
75
76void acpi_dmar_scan(
77    acpi_rsdp_t *acpi_rsdp,
78    paddr_t     *drhu_list,
79    uint32_t    *num_drhu,
80    uint32_t     max_dhru_list_len,
81    acpi_rmrr_list_t *rmrr_list
82);
83
84bool_t acpi_fadt_scan(
85    acpi_rsdp_t *acpi_rsdp
86);
87