* move i386 / ACPI dependent code out of hardwaremain.c and into the i386

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
This commit is contained in:
Stefan Reinauer 2009-04-22 08:17:38 +00:00 committed by Stefan Reinauer
parent 18d7320d17
commit 7e9771cc1a
3 changed files with 70 additions and 29 deletions

View File

@ -1,8 +1,8 @@
/* /*
* coreboot ACPI Table support * coreboot ACPI Table support
* written by Stefan Reinauer <stepan@openbios.org> * written by Stefan Reinauer <stepan@openbios.org>
* (C) 2004 SUSE LINUX AG * Copyright (C) 2004 SUSE LINUX AG
* (C) 2005 Stefan Reinauer * Copyright (C) 2005-2009 coresystems GmbH
* *
* ACPI FADT, FACS, and DSDT table support added by * ACPI FADT, FACS, and DSDT table support added by
* Nick Barker <nick.barker9@btinternet.com>, and those portions * Nick Barker <nick.barker9@btinternet.com>, and those portions
@ -27,11 +27,6 @@
#include <arch/acpigen.h> #include <arch/acpigen.h>
#include <device/pci.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 acpi_checksum(u8 *table, u32 length)
{ {
u8 ret=0; 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)); return (sizeof(acpi_mcfg_mmconfig_t));
} }
int acpi_create_madt_lapic(acpi_madt_lapic_t *lapic, u8 cpu, u8 apic) int acpi_create_madt_lapic(acpi_madt_lapic_t *lapic, u8 cpu, u8 apic)
{ {
lapic->type=0; lapic->type=0;
@ -378,6 +372,29 @@ void acpi_write_rsdp(acpi_rsdp_t *rsdp, acpi_rsdt_t *rsdt)
} }
#if HAVE_ACPI_RESUME == 1 #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) int acpi_get_sleep_type(void)
{ {
@ -461,8 +478,10 @@ void *acpi_find_wakeup_vector(void)
printk_debug("FADT found at %p\n", fadt); printk_debug("FADT found at %p\n", fadt);
facs = fadt->firmware_ctrl; facs = fadt->firmware_ctrl;
if (facs == NULL) if (facs == NULL) {
printk_debug("No FACS found, wake up from S3 not possible.\n");
return NULL; return NULL;
}
printk_debug("FACS found at %p\n", facs); printk_debug("FACS found at %p\n", facs);
wake_vec = (void *) facs->firmware_waking_vector; wake_vec = (void *) facs->firmware_waking_vector;

View File

@ -17,8 +17,10 @@
#include <stdint.h> #include <stdint.h>
#if HAVE_ACPI_RESUME
/* 0 = S0, 1 = S1 ...*/ /* 0 = S0, 1 = S1 ...*/
extern u8 acpi_slp_type; extern u8 acpi_slp_type;
#endif
#define RSDP_SIG "RSD PTR " /* RSDT Pointer signature */ #define RSDP_SIG "RSD PTR " /* RSDT Pointer signature */
#define RSDP_NAME "RSDP" #define RSDP_NAME "RSDP"
@ -277,6 +279,37 @@ typedef struct acpi_fadt {
struct acpi_gen_regaddr x_gpe1_blk; struct acpi_gen_regaddr x_gpe1_blk;
} __attribute__ ((packed)) acpi_fadt_t; } __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 */ /* FACS */
typedef struct acpi_facs { typedef struct acpi_facs {
char signature[4]; 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_rsdt(acpi_rsdt_t *rsdt);
void acpi_write_rsdp(acpi_rsdp_t *rsdp, 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_find_wakeup_vector(void);
void *acpi_get_wakeup_rsdp(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); void acpi_jump_to_wakeup(void *wakeup_addr);
#endif
unsigned long acpi_add_ssdt_pstates(acpi_rsdt_t *rsdt, unsigned long current); unsigned long acpi_add_ssdt_pstates(acpi_rsdt_t *rsdt, unsigned long current);

View File

@ -28,16 +28,16 @@ it with the version available from LANL.
#include <console/console.h> #include <console/console.h>
#include <version.h> #include <version.h>
#include <boot/tables.h>
#include <device/device.h> #include <device/device.h>
#include <device/pci.h> #include <device/pci.h>
#include <delay.h> #include <delay.h>
#include <stdlib.h> #include <stdlib.h>
#include <part/hard_reset.h> #include <part/hard_reset.h>
#include <part/init_timer.h> #include <part/init_timer.h>
#include <boot/tables.h>
#include <boot/elf.h> #include <boot/elf.h>
#include <cbfs.h> #include <cbfs.h>
#if HAVE_ACPI_RESUME == 1 #if HAVE_ACPI_RESUME
#include <arch/acpi.h> #include <arch/acpi.h>
#endif #endif
@ -54,9 +54,6 @@ it with the version available from LANL.
void hardwaremain(int boot_complete) void hardwaremain(int boot_complete)
{ {
struct lb_memory *lb_mem; struct lb_memory *lb_mem;
#if HAVE_ACPI_RESUME == 1
void *wake_vec;
#endif
post_code(0x80); post_code(0x80);
@ -92,20 +89,8 @@ void hardwaremain(int boot_complete)
post_code(0x89); post_code(0x89);
#if HAVE_ACPI_RESUME == 1 #if HAVE_ACPI_RESUME == 1
suspend_resume();
#if MEM_TRAIN_SEQ != 0 post_code(0x8a);
#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);
#endif #endif
/* Now that we have collected all of our information /* Now that we have collected all of our information