/*
 *  GRUB  --  GRand Unified Bootloader
 *  Copyright (C) 2009  Free Software Foundation, Inc.
 *
 *  GRUB is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  GRUB is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef GRUB_ACPI_HEADER
#define GRUB_ACPI_HEADER	1

#ifndef GRUB_DSDT_TEST
#include <grub/types.h>
#include <grub/err.h>
#else
#define GRUB_PACKED __attribute__ ((packed))
#endif

#define GRUB_RSDP_SIGNATURE "RSD PTR "
#define GRUB_RSDP_SIGNATURE_SIZE 8

struct grub_acpi_rsdp_v10
{
  grub_uint8_t signature[GRUB_RSDP_SIGNATURE_SIZE];
  grub_uint8_t checksum;
  grub_uint8_t oemid[6];
  grub_uint8_t revision;
  grub_uint32_t rsdt_addr;
} GRUB_PACKED;

struct grub_acpi_rsdp_v20
{
  struct grub_acpi_rsdp_v10 rsdpv1;
  grub_uint32_t length;
  grub_uint64_t xsdt_addr;
  grub_uint8_t checksum;
  grub_uint8_t reserved[3];
} GRUB_PACKED;

struct grub_acpi_table_header
{
  grub_uint8_t signature[4];
  grub_uint32_t length;
  grub_uint8_t revision;
  grub_uint8_t checksum;
  grub_uint8_t oemid[6];
  grub_uint8_t oemtable[8];
  grub_uint32_t oemrev;
  grub_uint8_t creator_id[4];
  grub_uint32_t creator_rev;
} GRUB_PACKED;

#define GRUB_ACPI_FADT_SIGNATURE "FACP"

struct grub_acpi_fadt
{
  struct grub_acpi_table_header hdr;
  grub_uint32_t facs_addr;
  grub_uint32_t dsdt_addr;
  grub_uint8_t somefields1[20];
  grub_uint32_t pm1a;
  grub_uint8_t somefields2[8];
  grub_uint32_t pmtimer;
  grub_uint8_t somefields3[32];
  grub_uint32_t flags;
  grub_uint8_t somefields4[16];
  grub_uint64_t facs_xaddr;
  grub_uint64_t dsdt_xaddr;
  grub_uint8_t somefields5[96];
} GRUB_PACKED;

#define GRUB_ACPI_MADT_SIGNATURE "APIC"

struct grub_acpi_madt_entry_header
{
  grub_uint8_t type;
  grub_uint8_t len;
};

struct grub_acpi_madt
{
  struct grub_acpi_table_header hdr;
  grub_uint32_t lapic_addr;
  grub_uint32_t flags;
  struct grub_acpi_madt_entry_header entries[0];
};

enum
  {
    GRUB_ACPI_MADT_ENTRY_TYPE_LAPIC = 0,
    GRUB_ACPI_MADT_ENTRY_TYPE_IOAPIC = 1,
    GRUB_ACPI_MADT_ENTRY_TYPE_INTERRUPT_OVERRIDE = 2,
    GRUB_ACPI_MADT_ENTRY_TYPE_LAPIC_NMI = 4,
    GRUB_ACPI_MADT_ENTRY_TYPE_SAPIC = 6,
    GRUB_ACPI_MADT_ENTRY_TYPE_LSAPIC = 7,
    GRUB_ACPI_MADT_ENTRY_TYPE_PLATFORM_INT_SOURCE = 8
  };

struct grub_acpi_madt_entry_lapic
{
  struct grub_acpi_madt_entry_header hdr;
  grub_uint8_t acpiid;
  grub_uint8_t apicid;
  grub_uint32_t flags;
};

struct grub_acpi_madt_entry_ioapic
{
  struct grub_acpi_madt_entry_header hdr;
  grub_uint8_t id;
  grub_uint8_t pad;
  grub_uint32_t address;
  grub_uint32_t global_sys_interrupt;
};

struct grub_acpi_madt_entry_interrupt_override
{
  struct grub_acpi_madt_entry_header hdr;
  grub_uint8_t bus;
  grub_uint8_t source;
  grub_uint32_t global_sys_interrupt;
  grub_uint16_t flags;
} GRUB_PACKED;


struct grub_acpi_madt_entry_lapic_nmi
{
  struct grub_acpi_madt_entry_header hdr;
  grub_uint8_t acpiid;
  grub_uint16_t flags;
  grub_uint8_t lint;
} GRUB_PACKED;

struct grub_acpi_madt_entry_sapic
{
  struct grub_acpi_madt_entry_header hdr;
  grub_uint8_t id;
  grub_uint8_t pad;
  grub_uint32_t global_sys_interrupt_base;
  grub_uint64_t addr;
};

struct grub_acpi_madt_entry_lsapic
{
  struct grub_acpi_madt_entry_header hdr;
  grub_uint8_t cpu_id;
  grub_uint8_t id;
  grub_uint8_t eid;
  grub_uint8_t pad[3];
  grub_uint32_t flags;
  grub_uint32_t cpu_uid;
  grub_uint8_t cpu_uid_str[0];
};

struct grub_acpi_madt_entry_platform_int_source
{
  struct grub_acpi_madt_entry_header hdr;
  grub_uint16_t flags;
  grub_uint8_t inttype;
  grub_uint8_t cpu_id;
  grub_uint8_t cpu_eid;
  grub_uint8_t sapic_vector;
  grub_uint32_t global_sys_int;
  grub_uint32_t src_flags;
};

enum
  {
    GRUB_ACPI_MADT_ENTRY_SAPIC_FLAGS_ENABLED = 1
  };

#ifndef GRUB_DSDT_TEST
struct grub_acpi_rsdp_v10 *grub_acpi_get_rsdpv1 (void);
struct grub_acpi_rsdp_v20 *grub_acpi_get_rsdpv2 (void);
struct grub_acpi_rsdp_v10 *EXPORT_FUNC(grub_machine_acpi_get_rsdpv1) (void);
struct grub_acpi_rsdp_v20 *EXPORT_FUNC(grub_machine_acpi_get_rsdpv2) (void);
grub_uint8_t EXPORT_FUNC(grub_byte_checksum) (void *base, grub_size_t size);

grub_err_t grub_acpi_create_ebda (void);

void grub_acpi_halt (void);
#endif

#define GRUB_ACPI_SLP_EN (1 << 13)
#define GRUB_ACPI_SLP_TYP_OFFSET 10

enum
  {
    GRUB_ACPI_OPCODE_ZERO = 0, GRUB_ACPI_OPCODE_ONE = 1,
    GRUB_ACPI_OPCODE_NAME = 8, GRUB_ACPI_OPCODE_ALIAS = 0x06,
    GRUB_ACPI_OPCODE_BYTE_CONST = 0x0a,
    GRUB_ACPI_OPCODE_WORD_CONST = 0x0b,
    GRUB_ACPI_OPCODE_DWORD_CONST = 0x0c,
    GRUB_ACPI_OPCODE_STRING_CONST = 0x0d,
    GRUB_ACPI_OPCODE_SCOPE = 0x10,
    GRUB_ACPI_OPCODE_BUFFER = 0x11,
    GRUB_ACPI_OPCODE_PACKAGE = 0x12,
    GRUB_ACPI_OPCODE_METHOD = 0x14, GRUB_ACPI_OPCODE_EXTOP = 0x5b,
    GRUB_ACPI_OPCODE_ADD = 0x72,
    GRUB_ACPI_OPCODE_CONCAT = 0x73,
    GRUB_ACPI_OPCODE_SUBTRACT = 0x74,
    GRUB_ACPI_OPCODE_MULTIPLY = 0x77,
    GRUB_ACPI_OPCODE_DIVIDE = 0x78,
    GRUB_ACPI_OPCODE_LSHIFT = 0x79,
    GRUB_ACPI_OPCODE_RSHIFT = 0x7a,
    GRUB_ACPI_OPCODE_AND = 0x7b,
    GRUB_ACPI_OPCODE_NAND = 0x7c,
    GRUB_ACPI_OPCODE_OR = 0x7d,
    GRUB_ACPI_OPCODE_NOR = 0x7e,
    GRUB_ACPI_OPCODE_XOR = 0x7f,
    GRUB_ACPI_OPCODE_CONCATRES = 0x84,
    GRUB_ACPI_OPCODE_MOD = 0x85,
    GRUB_ACPI_OPCODE_INDEX = 0x88,
    GRUB_ACPI_OPCODE_CREATE_DWORD_FIELD = 0x8a,
    GRUB_ACPI_OPCODE_CREATE_WORD_FIELD = 0x8b,
    GRUB_ACPI_OPCODE_CREATE_BYTE_FIELD = 0x8c,
    GRUB_ACPI_OPCODE_TOSTRING = 0x9c,
    GRUB_ACPI_OPCODE_IF = 0xa0, GRUB_ACPI_OPCODE_ONES = 0xff
  };
enum
  {
    GRUB_ACPI_EXTOPCODE_MUTEX = 0x01,
    GRUB_ACPI_EXTOPCODE_EVENT_OP = 0x02,
    GRUB_ACPI_EXTOPCODE_OPERATION_REGION = 0x80,
    GRUB_ACPI_EXTOPCODE_FIELD_OP = 0x81,
    GRUB_ACPI_EXTOPCODE_DEVICE_OP = 0x82,
    GRUB_ACPI_EXTOPCODE_PROCESSOR_OP = 0x83,
    GRUB_ACPI_EXTOPCODE_POWER_RES_OP = 0x84,
    GRUB_ACPI_EXTOPCODE_THERMAL_ZONE_OP = 0x85,
    GRUB_ACPI_EXTOPCODE_INDEX_FIELD_OP = 0x86,
    GRUB_ACPI_EXTOPCODE_BANK_FIELD_OP = 0x87,
  };

struct grub_acpi_fadt *
EXPORT_FUNC(grub_acpi_find_fadt) (void);

#endif /* ! GRUB_ACPI_HEADER */
