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