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