* move i386 / ACPI dependent code out of hardwaremain.c and into the i386
authorStefan Reinauer <stepan@coresystems.de>
Wed, 22 Apr 2009 08:17:38 +0000 (08:17 +0000)
committerStefan Reinauer <stepan@openbios.org>
Wed, 22 Apr 2009 08:17:38 +0000 (08:17 +0000)
  acpi code.
* add some defines for FADT flags

Signed-off-by: Stefan Reinauer <stepan@coresystems.de>
Acked-by: Patrick Georgi <patrick.georgi@coresystems.de>
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@4167 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1

src/arch/i386/boot/acpi.c
src/arch/i386/include/arch/acpi.h
src/boot/hardwaremain.c

index c7046e1b3197b9e7b1748ab517080fe6496eafc4..b6aa19ff1b482559763fde20ed58a6e643470814 100644 (file)
@@ -1,8 +1,8 @@
 /*
  * coreboot ACPI Table support
  * written by Stefan Reinauer <stepan@openbios.org>
- *  (C) 2004 SUSE LINUX AG
- *  (C) 2005 Stefan Reinauer
+ *  Copyright (C) 2004 SUSE LINUX AG
+ *  Copyright (C) 2005-2009 coresystems GmbH
  *
  * ACPI FADT, FACS, and DSDT table support added by 
  * Nick Barker <nick.barker9@btinternet.com>, and those portions
 #include <arch/acpigen.h>
 #include <device/pci.h>
 
-#if HAVE_ACPI_RESUME == 1
-/* this is to be filled by SB code - startup value what was found */
-u8 acpi_slp_type;
-#endif
-
 u8 acpi_checksum(u8 *table, u32 length)
 {
        u8 ret=0;
@@ -81,7 +76,6 @@ int acpi_create_mcfg_mmconfig(acpi_mcfg_mmconfig_t *mmconfig, u32 base, u16 seg_
        return (sizeof(acpi_mcfg_mmconfig_t));
 }
 
-
 int acpi_create_madt_lapic(acpi_madt_lapic_t *lapic, u8 cpu, u8 apic)
 {
        lapic->type=0;
@@ -378,6 +372,29 @@ void acpi_write_rsdp(acpi_rsdp_t *rsdp, acpi_rsdt_t *rsdt)
 }
 
 #if HAVE_ACPI_RESUME == 1
+void suspend_resume(void)
+{
+       void *wake_vec;
+
+#if 0
+#if MEM_TRAIN_SEQ != 0
+       #error "So far it works on AMD and MEM_TRAIN_SEQ == 0"
+#endif
+
+#if _RAMBASE < 0x1F00000
+       #error "For ACPI RESUME you need to have _RAMBASE at least 31MB"
+       #error "Chipset support (S3_NVRAM_EARLY and ACPI_IS_WAKEUP_EARLY functions and memory ctrl)"
+       #error "And coreboot memory reserved in mainboard.c"
+#endif
+#endif
+       /* if we happen to be resuming find wakeup vector and jump to OS */
+       wake_vec = acpi_find_wakeup_vector();
+       if (wake_vec)
+               acpi_jump_to_wakeup(wake_vec);
+}
+
+/* this is to be filled by SB code - startup value what was found */
+u8 acpi_slp_type = 0;
 
 int acpi_get_sleep_type(void)
 {
@@ -461,8 +478,10 @@ void *acpi_find_wakeup_vector(void)
        printk_debug("FADT found at %p\n", fadt);
        facs = fadt->firmware_ctrl;
 
-       if (facs == NULL)
+       if (facs == NULL) {
+               printk_debug("No FACS found, wake up from S3 not possible.\n");
                return NULL;
+       }
 
        printk_debug("FACS found at %p\n", facs);
        wake_vec = (void *) facs->firmware_waking_vector;
index 99bec4b30c411f1c4933ba6cfb9f55a62c5ec7e2..c2ed67971eaefb4fc027ea04ee15bee1553fd904 100644 (file)
 
 #include <stdint.h>
  
+#if HAVE_ACPI_RESUME
 /* 0 = S0, 1 = S1 ...*/
 extern u8 acpi_slp_type;
+#endif
 
 #define RSDP_SIG              "RSD PTR "  /* RSDT Pointer signature */
 #define RSDP_NAME             "RSDP"
@@ -277,6 +279,37 @@ typedef struct acpi_fadt {
        struct acpi_gen_regaddr x_gpe1_blk;
 } __attribute__ ((packed)) acpi_fadt_t;
 
+#define ACPI_FADT_WBINVD               (1 << 0)
+#define ACPI_FADT_WBINVD_FLUSH         (1 << 1)
+#define ACPI_FADT_C1_SUPPORTED         (1 << 2)
+#define ACPI_FADT_C2_MP_SUPPORTED      (1 << 3)
+#define ACPI_FADT_POWER_BUTTON         (1 << 4)
+#define ACPI_FADT_SLEEP_BUTTON         (1 << 5)
+#define ACPI_FADT_FIXED_RTC            (1 << 6)
+#define ACPI_FADT_S4_RTC_WAKE          (1 << 7)
+#define ACPI_FADT_32BIT_TIMER          (1 << 8)
+#define ACPI_FADT_DOCKING_SUPPORTED    (1 << 9)
+#define ACPI_FADT_RESET_REGISTER       (1 << 10)
+#define ACPI_FADT_SEALED_CASE          (1 << 11)
+#define ACPI_FADT_HEADLESS             (1 << 12)
+#define ACPI_FADT_SLEEP_TYPE           (1 << 13)
+#define ACPI_FADT_PCI_EXPRESS_WAKE     (1 << 14)
+#define ACPI_FADT_PLATFORM_CLOCK       (1 << 15)
+#define ACPI_FADT_S4_RTC_VALID         (1 << 16)
+#define ACPI_FADT_REMOTE_POWER_ON      (1 << 17)
+#define ACPI_FADT_APIC_CLUSTER         (1 << 18)
+#define ACPI_FADT_APIC_PHYSICAL                (1 << 19)
+
+enum acpi_preferred_pm_profiles {
+       PM_UNSPECIFIED  = 0,
+       PM_DESKTOP      = 1,
+       PM_MOBILE       = 2,
+       PM_WORKSTATION  = 3,
+       PM_ENTERPRISE   = 4,
+       PM_SOHO_SERVER  = 5,
+       PM_APPLIANCE_PC = 6
+};
+
 /* FACS */
 typedef struct acpi_facs {
        char signature[4];
@@ -333,10 +366,14 @@ void acpi_create_facs(acpi_facs_t *facs);
 
 void acpi_write_rsdt(acpi_rsdt_t *rsdt);
 void acpi_write_rsdp(acpi_rsdp_t *rsdp, acpi_rsdt_t *rsdt);
+
+#if HAVE_ACPI_RESUME
+void suspend_resume(void);
 void *acpi_find_wakeup_vector(void);
 void *acpi_get_wakeup_rsdp(void);
-extern void acpi_jmp_to_realm_wakeup(u32 linear_addr);
+void acpi_jmp_to_realm_wakeup(u32 linear_addr);
 void acpi_jump_to_wakeup(void *wakeup_addr);
+#endif
 
 unsigned long acpi_add_ssdt_pstates(acpi_rsdt_t *rsdt, unsigned long current);
 
index 99c4d3079c03f01969ae00f5c9fac328ad2bca18..c22754fe2812f44f208e178e7dcf8511ebb3dc46 100644 (file)
@@ -28,16 +28,16 @@ it with the version available from LANL.
 
 #include <console/console.h>
 #include <version.h>
-#include <boot/tables.h>
 #include <device/device.h>
 #include <device/pci.h>
 #include <delay.h>
 #include <stdlib.h>
 #include <part/hard_reset.h>
 #include <part/init_timer.h>
+#include <boot/tables.h>
 #include <boot/elf.h>
 #include <cbfs.h>
-#if HAVE_ACPI_RESUME == 1
+#if HAVE_ACPI_RESUME
 #include <arch/acpi.h>
 #endif
 
@@ -54,9 +54,6 @@ it with the version available from LANL.
 void hardwaremain(int boot_complete)
 {
        struct lb_memory *lb_mem;
-#if HAVE_ACPI_RESUME == 1
-       void *wake_vec;
-#endif
 
        post_code(0x80);
 
@@ -92,20 +89,8 @@ void hardwaremain(int boot_complete)
        post_code(0x89);
 
 #if HAVE_ACPI_RESUME == 1
-
-#if MEM_TRAIN_SEQ != 0
-       #error "So far it works on AMD and MEM_TRAIN_SEQ == 0"
-#endif
-
-#if _RAMBASE < 0x1F00000
-       #error "For ACPI RESUME you need to have _RAMBASE at least 31MB"
-       #error "Chipset support (S3_NVRAM_EARLY and ACPI_IS_WAKEUP_EARLY functions and memory ctrl)"
-       #error "And coreboot memory reserved in mainboard.c"
-#endif
-       /* if we happen to be resuming find wakeup vector and jump to OS */
-       wake_vec = acpi_find_wakeup_vector();
-       if (wake_vec)
-               acpi_jump_to_wakeup(wake_vec);
+       suspend_resume();
+       post_code(0x8a);
 #endif
 
        /* Now that we have collected all of our information