|
@@ -11,10 +11,12 @@
|
|
#include <cpu.h>
|
|
#include <cpu.h>
|
|
#include <dm.h>
|
|
#include <dm.h>
|
|
#include <dm/uclass-internal.h>
|
|
#include <dm/uclass-internal.h>
|
|
|
|
+#include <asm/acpi/global_nvs.h>
|
|
#include <asm/acpi_table.h>
|
|
#include <asm/acpi_table.h>
|
|
#include <asm/io.h>
|
|
#include <asm/io.h>
|
|
#include <asm/lapic.h>
|
|
#include <asm/lapic.h>
|
|
#include <asm/tables.h>
|
|
#include <asm/tables.h>
|
|
|
|
+#include <asm/arch/global_nvs.h>
|
|
|
|
|
|
/*
|
|
/*
|
|
* IASL compiles the dsdt entries and writes the hex values
|
|
* IASL compiles the dsdt entries and writes the hex values
|
|
@@ -336,6 +338,7 @@ u32 write_acpi_tables(u32 start)
|
|
struct acpi_fadt *fadt;
|
|
struct acpi_fadt *fadt;
|
|
struct acpi_mcfg *mcfg;
|
|
struct acpi_mcfg *mcfg;
|
|
struct acpi_madt *madt;
|
|
struct acpi_madt *madt;
|
|
|
|
+ int i;
|
|
|
|
|
|
current = start;
|
|
current = start;
|
|
|
|
|
|
@@ -383,6 +386,25 @@ u32 write_acpi_tables(u32 start)
|
|
current += dsdt->length - sizeof(struct acpi_table_header);
|
|
current += dsdt->length - sizeof(struct acpi_table_header);
|
|
current = ALIGN(current, 16);
|
|
current = ALIGN(current, 16);
|
|
|
|
|
|
|
|
+ /* Pack GNVS into the ACPI table area */
|
|
|
|
+ for (i = 0; i < dsdt->length; i++) {
|
|
|
|
+ u32 *gnvs = (u32 *)((u32)dsdt + i);
|
|
|
|
+ if (*gnvs == ACPI_GNVS_ADDR) {
|
|
|
|
+ debug("Fix up global NVS in DSDT to 0x%08x\n", current);
|
|
|
|
+ *gnvs = current;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* Update DSDT checksum since we patched the GNVS address */
|
|
|
|
+ dsdt->checksum = 0;
|
|
|
|
+ dsdt->checksum = table_compute_checksum((void *)dsdt, dsdt->length);
|
|
|
|
+
|
|
|
|
+ /* Fill in platform-specific global NVS variables */
|
|
|
|
+ acpi_create_gnvs((struct acpi_global_nvs *)current);
|
|
|
|
+ current += sizeof(struct acpi_global_nvs);
|
|
|
|
+ current = ALIGN(current, 16);
|
|
|
|
+
|
|
debug("ACPI: * FADT\n");
|
|
debug("ACPI: * FADT\n");
|
|
fadt = (struct acpi_fadt *)current;
|
|
fadt = (struct acpi_fadt *)current;
|
|
current += sizeof(struct acpi_fadt);
|
|
current += sizeof(struct acpi_fadt);
|