diff options
-rw-r--r-- | src/arch/x86/boot/acpi.c | 4 | ||||
-rw-r--r-- | src/include/cbmem.h | 1 | ||||
-rw-r--r-- | src/lib/cbmem_info.c | 1 | ||||
-rw-r--r-- | src/mainboard/intel/baskingridge/acpi_tables.c | 20 | ||||
-rw-r--r-- | src/mainboard/intel/wtm1/acpi_tables.c | 20 | ||||
-rw-r--r-- | src/mainboard/intel/wtm2/acpi_tables.c | 20 | ||||
-rw-r--r-- | src/southbridge/intel/lynxpoint/lpc.c | 10 |
7 files changed, 53 insertions, 23 deletions
diff --git a/src/arch/x86/boot/acpi.c b/src/arch/x86/boot/acpi.c index 7b207b48bf..96ece06af9 100644 --- a/src/arch/x86/boot/acpi.c +++ b/src/arch/x86/boot/acpi.c @@ -630,7 +630,7 @@ void suspend_resume(void) wake_vec = acpi_find_wakeup_vector(); if (wake_vec) { #if CONFIG_HAVE_SMI_HANDLER - u32 *gnvs_address = cbmem_find(CBMEM_ID_ACPI_GNVS); + u32 *gnvs_address = cbmem_find(CBMEM_ID_ACPI_GNVS_PTR); /* Restore GNVS pointer in SMM if found */ if (gnvs_address && *gnvs_address) { @@ -798,7 +798,7 @@ void acpi_jump_to_wakeup(void *vector) void acpi_save_gnvs(u32 gnvs_address) { - u32 *gnvs = cbmem_add(CBMEM_ID_ACPI_GNVS, sizeof(*gnvs)); + u32 *gnvs = cbmem_add(CBMEM_ID_ACPI_GNVS_PTR, sizeof(*gnvs)); if (gnvs) *gnvs = gnvs_address; } diff --git a/src/include/cbmem.h b/src/include/cbmem.h index 5b19207d07..219dbfc53e 100644 --- a/src/include/cbmem.h +++ b/src/include/cbmem.h @@ -51,6 +51,7 @@ #define CBMEM_ID_GDT 0x4c474454 #define CBMEM_ID_ACPI 0x41435049 #define CBMEM_ID_ACPI_GNVS 0x474e5653 +#define CBMEM_ID_ACPI_GNVS_PTR 0x474e5650 #define CBMEM_ID_CBTABLE 0x43425442 #define CBMEM_ID_PIRQ 0x49525154 #define CBMEM_ID_MPTABLE 0x534d5054 diff --git a/src/lib/cbmem_info.c b/src/lib/cbmem_info.c index 5b02f2df75..ad8c890666 100644 --- a/src/lib/cbmem_info.c +++ b/src/lib/cbmem_info.c @@ -33,6 +33,7 @@ static struct cbmem_id_to_name { { CBMEM_ID_RESUME, "ACPI RESUME" }, { CBMEM_ID_RESUME_SCRATCH, "ACPISCRATCH" }, { CBMEM_ID_ACPI_GNVS, "ACPI GNVS " }, + { CBMEM_ID_ACPI_GNVS_PTR, "GNVS PTR " }, { CBMEM_ID_SMBIOS, "SMBIOS " }, { CBMEM_ID_TIMESTAMP, "TIME STAMP " }, { CBMEM_ID_MRCDATA, "MRC DATA " }, diff --git a/src/mainboard/intel/baskingridge/acpi_tables.c b/src/mainboard/intel/baskingridge/acpi_tables.c index d94251ebda..c4adcd71d9 100644 --- a/src/mainboard/intel/baskingridge/acpi_tables.c +++ b/src/mainboard/intel/baskingridge/acpi_tables.c @@ -70,7 +70,6 @@ static void acpi_update_thermal_table(global_nvs_t *gnvs) static void acpi_create_gnvs(global_nvs_t *gnvs) { - memset((void *)gnvs, 0, sizeof(*gnvs)); gnvs->apic = 1; gnvs->mpen = 1; /* Enable Multi Processing */ gnvs->pcnt = dev_count_cpu(); @@ -165,6 +164,7 @@ unsigned long write_acpi_tables(unsigned long start) #endif acpi_header_t *ssdt; acpi_header_t *dsdt; + global_nvs_t *gnvs; current = start; @@ -240,22 +240,28 @@ unsigned long write_acpi_tables(unsigned long start) ALIGN_CURRENT; acpi_add_table(rsdp, mcfg); - /* Pack GNVS into the ACPI table area */ + /* Update GNVS pointer into CBMEM */ + gnvs = cbmem_find(CBMEM_ID_ACPI_GNVS); + if (!gnvs) { + printk(BIOS_DEBUG, "ACPI: Could not find CBMEM GNVS\n"); + gnvs = (global_nvs_t *)current; + } + for (i=0; i < dsdt->length; i++) { if (*(u32*)(((u32)dsdt) + i) == 0xC0DEBABE) { printk(BIOS_DEBUG, "ACPI: Patching up global NVS in " - "DSDT at offset 0x%04x -> 0x%08lx\n", i, current); - *(u32*)(((u32)dsdt) + i) = current; // 0x92 bytes - acpi_save_gnvs(current); + "DSDT at offset 0x%04x -> %p\n", i, gnvs); + *(u32*)(((u32)dsdt) + i) = (unsigned long)gnvs; + acpi_save_gnvs((unsigned long)gnvs); break; } } /* And fill it */ - acpi_create_gnvs((global_nvs_t *)current); + acpi_create_gnvs(gnvs); /* And tell SMI about it */ - smm_setup_structures((void *)current, NULL, NULL); + smm_setup_structures(gnvs, NULL, NULL); current += sizeof(global_nvs_t); ALIGN_CURRENT; diff --git a/src/mainboard/intel/wtm1/acpi_tables.c b/src/mainboard/intel/wtm1/acpi_tables.c index 6f5a1ddb77..16a1c6a9ed 100644 --- a/src/mainboard/intel/wtm1/acpi_tables.c +++ b/src/mainboard/intel/wtm1/acpi_tables.c @@ -70,7 +70,6 @@ static void acpi_update_thermal_table(global_nvs_t *gnvs) static void acpi_create_gnvs(global_nvs_t *gnvs) { - memset((void *)gnvs, 0, sizeof(*gnvs)); gnvs->apic = 1; gnvs->mpen = 1; /* Enable Multi Processing */ gnvs->pcnt = dev_count_cpu(); @@ -162,6 +161,7 @@ unsigned long write_acpi_tables(unsigned long start) #endif acpi_header_t *ssdt; acpi_header_t *dsdt; + global_nvs_t *gnvs; current = start; @@ -237,22 +237,28 @@ unsigned long write_acpi_tables(unsigned long start) ALIGN_CURRENT; acpi_add_table(rsdp, mcfg); - /* Pack GNVS into the ACPI table area */ + /* Update GNVS pointer into CBMEM */ + gnvs = cbmem_find(CBMEM_ID_ACPI_GNVS); + if (!gnvs) { + printk(BIOS_DEBUG, "ACPI: Could not find CBMEM GNVS\n"); + gnvs = (global_nvs_t *)current; + } + for (i=0; i < dsdt->length; i++) { if (*(u32*)(((u32)dsdt) + i) == 0xC0DEBABE) { printk(BIOS_DEBUG, "ACPI: Patching up global NVS in " - "DSDT at offset 0x%04x -> 0x%08lx\n", i, current); - *(u32*)(((u32)dsdt) + i) = current; // 0x92 bytes - acpi_save_gnvs(current); + "DSDT at offset 0x%04x -> %p\n", i, gnvs); + *(u32*)(((u32)dsdt) + i) = (unsigned long)gnvs; + acpi_save_gnvs((unsigned long)gnvs); break; } } /* And fill it */ - acpi_create_gnvs((global_nvs_t *)current); + acpi_create_gnvs(gnvs); /* And tell SMI about it */ - smm_setup_structures((void *)current, NULL, NULL); + smm_setup_structures(gnvs, NULL, NULL); current += sizeof(global_nvs_t); ALIGN_CURRENT; diff --git a/src/mainboard/intel/wtm2/acpi_tables.c b/src/mainboard/intel/wtm2/acpi_tables.c index 6f5a1ddb77..16a1c6a9ed 100644 --- a/src/mainboard/intel/wtm2/acpi_tables.c +++ b/src/mainboard/intel/wtm2/acpi_tables.c @@ -70,7 +70,6 @@ static void acpi_update_thermal_table(global_nvs_t *gnvs) static void acpi_create_gnvs(global_nvs_t *gnvs) { - memset((void *)gnvs, 0, sizeof(*gnvs)); gnvs->apic = 1; gnvs->mpen = 1; /* Enable Multi Processing */ gnvs->pcnt = dev_count_cpu(); @@ -162,6 +161,7 @@ unsigned long write_acpi_tables(unsigned long start) #endif acpi_header_t *ssdt; acpi_header_t *dsdt; + global_nvs_t *gnvs; current = start; @@ -237,22 +237,28 @@ unsigned long write_acpi_tables(unsigned long start) ALIGN_CURRENT; acpi_add_table(rsdp, mcfg); - /* Pack GNVS into the ACPI table area */ + /* Update GNVS pointer into CBMEM */ + gnvs = cbmem_find(CBMEM_ID_ACPI_GNVS); + if (!gnvs) { + printk(BIOS_DEBUG, "ACPI: Could not find CBMEM GNVS\n"); + gnvs = (global_nvs_t *)current; + } + for (i=0; i < dsdt->length; i++) { if (*(u32*)(((u32)dsdt) + i) == 0xC0DEBABE) { printk(BIOS_DEBUG, "ACPI: Patching up global NVS in " - "DSDT at offset 0x%04x -> 0x%08lx\n", i, current); - *(u32*)(((u32)dsdt) + i) = current; // 0x92 bytes - acpi_save_gnvs(current); + "DSDT at offset 0x%04x -> %p\n", i, gnvs); + *(u32*)(((u32)dsdt) + i) = (unsigned long)gnvs; + acpi_save_gnvs((unsigned long)gnvs); break; } } /* And fill it */ - acpi_create_gnvs((global_nvs_t *)current); + acpi_create_gnvs(gnvs); /* And tell SMI about it */ - smm_setup_structures((void *)current, NULL, NULL); + smm_setup_structures(gnvs, NULL, NULL); current += sizeof(global_nvs_t); ALIGN_CURRENT; diff --git a/src/southbridge/intel/lynxpoint/lpc.c b/src/southbridge/intel/lynxpoint/lpc.c index 2864876a83..f6c64c56a0 100644 --- a/src/southbridge/intel/lynxpoint/lpc.c +++ b/src/southbridge/intel/lynxpoint/lpc.c @@ -32,6 +32,9 @@ #include <cpu/cpu.h> #include <cpu/x86/smm.h> #include <elog.h> +#include <cbmem.h> +#include <string.h> +#include "nvs.h" #include "pch.h" #define NMI_OFF 0 @@ -699,6 +702,8 @@ static void pch_lpc_add_io_resources(device_t dev) static void pch_lpc_read_resources(device_t dev) { + global_nvs_t *gnvs; + /* Get the normal PCI resources of this device. */ pci_dev_read_resources(dev); @@ -707,6 +712,11 @@ static void pch_lpc_read_resources(device_t dev) /* Add IO resources. */ pch_lpc_add_io_resources(dev); + + /* Allocate ACPI NVS in CBMEM */ + gnvs = cbmem_add(CBMEM_ID_ACPI_GNVS, sizeof(global_nvs_t)); + if (gnvs) + memset(gnvs, 0, sizeof(global_nvs_t)); } static void pch_lpc_enable_resources(device_t dev) |