176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* ----------------------------------------------------------------------- *
276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *   Copyright 2009-2011 Erwan Velu - All Rights Reserved
476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *   This program is free software; you can redistribute it and/or modify
676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *   it under the terms of the GNU General Public License as published by
776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *   the Free Software Foundation, Inc., 53 Temple Place Ste 330,
876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *   Boston MA 02111-1307, USA; either version 2 of the License, or
976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *   (at your option) any later version; incorporated herein by reference.
1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * ----------------------------------------------------------------------- */
1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifndef ACPI_H
1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define ACPI_H
1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define DEBUG_ACPI 0
1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid dbg_printf(const char *fmt, ...);
1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define DEBUG_PRINT(x) do { if (DEBUG_ACPI) dbg_printf x; } while (0)
2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <inttypes.h>
2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdbool.h>
2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <acpi/structs.h>
2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <acpi/rsdp.h>
2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <acpi/rsdt.h>
2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <acpi/xsdt.h>
2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <acpi/fadt.h>
2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <acpi/madt.h>
2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <acpi/dsdt.h>
3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <acpi/ssdt.h>
3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <acpi/sbst.h>
3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <acpi/ecdt.h>
3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <acpi/facs.h>
3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <acpi/hpet.h>
3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <acpi/tcpa.h>
3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <acpi/mcfg.h>
3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <acpi/slic.h>
3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <acpi/boot.h>
3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanenum { ACPI_FOUND = 1, ENO_ACPI = 2 , MADT_FOUND = 3 , ENO_MADT = 4 };
4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define MAX_SSDT 128
4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Some other description HEADERS : ACPI doc: 5.2.6*/
4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define OEMX "OEMx"
4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRAR "SRAT"
4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define BERT "BERT"
4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define BOOT "BOOT"
4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define CPEP "CPEP"
5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define DBGP "DGBP"
5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define DMAR "DMAR"
5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define ERST "ERST"
5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define ETDT "ETDT"
5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define HEST "HEST"
5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define HPET "HPET"
5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IBFT "IBFT"
5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define MCFG "MCFG"
5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SPCR "SPCR"
5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SPMI "SPMI"
6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define TCPA "TCPA"
6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define UEFI "UEFI"
6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define WAET "WAET"
6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define WDAT "WDAT"
6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define WDRT "WDRT"
6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define WSPT "WSPT"
6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SLIC "SLIC"
6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* This macro are used to extract ACPI structures
6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * please be careful about the q (interator) naming */
7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define cp_struct(dest) memcpy(dest,q,sizeof(*dest)); q+=sizeof(*dest)
7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define cp_str_struct(dest) memcpy(dest,q,sizeof(dest)-1); dest[sizeof(dest)-1]=0;q+=sizeof(dest)-1
7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct {
7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    s_rsdp rsdp;
7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    s_rsdt rsdt;
7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    s_xsdt xsdt;
7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    s_fadt fadt;
7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    s_madt madt;
7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    s_dsdt dsdt;
8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    s_ssdt *ssdt[MAX_SSDT];
8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint8_t ssdt_count;
8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    s_sbst sbst;
8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    s_ecdt ecdt;
8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    s_facs facs;
8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    s_hpet hpet;
8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    s_tcpa tcpa;
8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    s_mcfg mcfg;
8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    s_slic slic;
8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    s_boot boot;
9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} s_acpi;
9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint parse_acpi(s_acpi * acpi);
9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint parse_xsdt(s_acpi * acpi);
9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid parse_madt(s_acpi * acpi);
9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint search_rsdp(s_acpi *acpi);
9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid get_acpi_description_header(uint8_t *q, s_acpi_description_header * adh);
9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanbool parse_header(uint64_t *address, s_acpi *acpi);
9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanchar *flags_to_string(char *buffer, uint16_t flags);
9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
100