We define IO_APIC_ADDR in <arch/ioapic.h>, let's use it.
[coreboot.git] / src / arch / i386 / include / arch / acpi.h
index 1b3f8d208f28503fa07fc45fc339756af4de86c8..928bd74b651ae000f16af8d1e9816270c613acac 100644 (file)
@@ -1,51 +1,40 @@
 /*
- * coreboot ACPI Support - headers and defines.
- * 
- * written by Stefan Reinauer <stepan@coresystems.de>
+ * This file is part of the coreboot project.
+ *
  * Copyright (C) 2004 SUSE LINUX AG
+ * Copyright (C) 2004 Nick Barker
  * Copyright (C) 2008-2009 coresystems GmbH
+ * (Written by Stefan Reinauer <stepan@coresystems.de>)
+ *
+ * This program 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; version 2 of the License.
  *
- * The ACPI table structs are based on the Linux kernel sources.
- * ACPI FADT & FACS added by Nick Barker <nick.barker9@btinternet.com>
- * those parts (C) 2004 Nick Barker
+ * This program 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 this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+/*
+ * coreboot ACPI Support - headers and defines.
+ */
 
 #ifndef __ASM_ACPI_H
 #define __ASM_ACPI_H
 
-#if CONFIG_HAVE_ACPI_TABLES==1
+#if CONFIG_GENERATE_ACPI_TABLES==1
 
 #include <stdint.h>
-#define RSDP_SIG       "RSD PTR "  /* RSDT Pointer signature */
-#define RSDP_NAME      "RSDP"
-
-#define RSDT_NAME      "RSDT"
-#define HPET_NAME      "HPET"
-#define MADT_NAME      "APIC"
-#define MCFG_NAME      "MCFG"
-#define SRAT_NAME      "SRAT"
-#define SLIT_NAME      "SLIT"
-#define SSDT_NAME      "SSDT"
-#define FACS_NAME      "FACS"
-#define FADT_NAME      "FACP"
-#define XSDT_NAME      "XSDT"
-
-// Misnomer, the NAME above is the 4 byte signature, this (TABLE) is the
-// OEM_TABLE_ID.
-//
-#define ACPI_TABLE_CREATOR     "COREBOOT"
-#define RSDT_TABLE     ACPI_TABLE_CREATOR
-#define HPET_TABLE     ACPI_TABLE_CREATOR
-#define MCFG_TABLE     ACPI_TABLE_CREATOR
-#define MADT_TABLE     ACPI_TABLE_CREATOR
-#define SRAT_TABLE     ACPI_TABLE_CREATOR
-#define SLIT_TABLE     ACPI_TABLE_CREATOR
-#define XSDT_TABLE     ACPI_TABLE_CREATOR
 
-#define OEM_ID         "CORE  "
-#define ASLC           "CORE"
+#define RSDP_SIG               "RSD PTR "  /* RSDT Pointer signature */
+#define ACPI_TABLE_CREATOR     "COREBOOT"
+#define OEM_ID                 "CORE  "
+#define ASLC                   "CORE"
 
 /* ACPI 3.0 table RSDP */
 
@@ -53,7 +42,7 @@ typedef struct acpi_rsdp {
        char  signature[8];     /* RSDP signature "RSD PTR" */
        u8    checksum;         /* checksum of the first 20 bytes */
        char  oem_id[6];        /* OEM ID, "LXBIOS" */
-       u8    revision;         /* 0 for APCI 1.0, 2 for ACPI 2.0/3.0 */
+       u8    revision;         /* 0 for ACPI 1.0, 2 for ACPI 2.0/3.0 */
        u32   rsdt_address;     /* physical address of RSDT */
        u32   length;           /* total length of RSDP (including extended part) */
        u64   xsdt_address;     /* physical address of XSDT */
@@ -72,6 +61,12 @@ typedef struct acpi_gen_regaddr {
        u32 addrh;
 } __attribute__ ((packed)) acpi_addr_t;
 
+#define ACPI_ADDRESS_SPACE_MEMORY         0
+#define ACPI_ADDRESS_SPACE_IO             1
+#define ACPI_ADDRESS_SPACE_PCI            2
+#define ACPI_ADDRESS_SPACE_FIXED       0x7f
+
+
 /* Generic ACPI Header, provided by (almost) all tables */
 
 typedef struct acpi_table_header         /* ACPI common table header */
@@ -87,12 +82,8 @@ typedef struct acpi_table_header         /* ACPI common table header */
        u32  asl_compiler_revision;  /* ASL compiler revision number */
 } __attribute__ ((packed)) acpi_header_t;
 
-/* FIXME: This is very fragile:
- * MCONFIG, HPET, FADT, SRAT, SLIT, MADT(APIC), SSDT, SSDTX, and SSDT for CPU
- * pstate
- */
-
-#define MAX_ACPI_TABLES (7 + CONFIG_ACPI_SSDTX_NUM + CONFIG_MAX_CPUS)
+/* A maximum number of 32 ACPI tables ought to be enough for now */
+#define MAX_ACPI_TABLES 32
 
 /* RSDT */
 typedef struct acpi_rsdt {
@@ -184,7 +175,7 @@ enum acpi_apic_types {
        LocalApic               = 0,
        IOApic                  = 1,
        IRQSourceOverride       = 2,
-       NMI                     = 3,
+       NMIType                 = 3,
        LocalApicNMI            = 4,
        LApicAddressOverride    = 5,
        IOSApic                 = 6,
@@ -354,15 +345,28 @@ typedef struct acpi_facs {
 //
 #define ACPI_FACS_S4BIOS_F     (1 << 0)
 
-/* These are implemented by the target port */
+typedef struct acpi_ecdt {
+       struct acpi_table_header header;
+       struct acpi_gen_regaddr ec_control;
+       struct acpi_gen_regaddr ec_data;
+       u32 uid;
+       u8 gpe_bit;
+       u8 ec_id[];
+} __attribute__ ((packed)) acpi_ecdt_t;
+
+
+/* These are implemented by the target port or north/southbridge*/
 unsigned long write_acpi_tables(unsigned long addr);
 unsigned long acpi_fill_madt(unsigned long current);
 unsigned long acpi_fill_mcfg(unsigned long current);
 unsigned long acpi_fill_srat(unsigned long current);
 unsigned long acpi_fill_slit(unsigned long current);
-unsigned long acpi_fill_ssdt_generator(unsigned long current, char *oem_table_id);
-void acpi_create_ssdt_generator(acpi_header_t *ssdt, char *oem_table_id);
-void acpi_create_fadt(acpi_fadt_t *fadt,acpi_facs_t *facs,void *dsdt);
+unsigned long acpi_fill_ssdt_generator(unsigned long current, const char *oem_table_id);
+void acpi_create_ssdt_generator(acpi_header_t *ssdt, const char *oem_table_id);
+void acpi_create_fadt(acpi_fadt_t *fadt,acpi_facs_t *facs, void *dsdt);
+
+void update_ssdt(void* ssdt);
+void update_ssdtx(void* ssdtx, int i);
 
 /* These can be used by the target port */
 u8 acpi_checksum(u8 *table, u32 length);
@@ -395,6 +399,10 @@ void acpi_create_mcfg(acpi_mcfg_t *mcfg);
 
 void acpi_create_facs(acpi_facs_t *facs);
 
+#if CONFIG_HAVE_ACPI_SLIC
+unsigned long acpi_create_slic(unsigned long current);
+#endif
+
 void acpi_write_rsdt(acpi_rsdt_t *rsdt);
 void acpi_write_xsdt(acpi_xsdt_t *xsdt);
 void acpi_write_rsdp(acpi_rsdp_t *rsdp, acpi_rsdt_t *rsdt, acpi_xsdt_t *xsdt);
@@ -406,14 +414,16 @@ extern u8 acpi_slp_type;
 void suspend_resume(void);
 void *acpi_find_wakeup_vector(void);
 void *acpi_get_wakeup_rsdp(void);
-void acpi_jmp_to_realm_wakeup(u32 linear_addr);
 void acpi_jump_to_wakeup(void *wakeup_addr);
 
 int acpi_get_sleep_type(void);
 
 #endif
 
-unsigned long acpi_add_ssdt_pstates(acpi_rsdt_t *rsdt, unsigned long current);
+/* northbridge/amd/amdfam10/amdfam10_acpi.c */
+unsigned long acpi_add_ssdt_pstates(acpi_rsdp_t *rsdp, unsigned long current);
+/* cpu/intel/speedstep/acpi.c */
+void generate_cpu_entries(void);
 
 #define ACPI_WRITE_MADT_IOAPIC(dev,id)                 \
 do {                                                    \
@@ -426,9 +436,7 @@ do {                                                    \
        gsi_base+=4;                                    \
 } while(0);
 
-#define IO_APIC_ADDR   0xfec00000UL
-
-#else // CONFIG_HAVE_ACPI_TABLES
+#else // CONFIG_GENERATE_ACPI_TABLES
 
 #define write_acpi_tables(start) (start)