* 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:
parent
18d7320d17
commit
7e9771cc1a
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue