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