ACPI HEST table.
HEST feature starts from ACPI 4.0. HEST is one of four kinds of tables of ACPI Platform Error Interfaces (APEI). In Windows world, APEI is called Windows Hardware Error Architecture (WHEA). APEI consists of four separate tables: 1. Error Record Serialization Table (ERST) 2. BOOT Error Record Table (BERT) 3. Hardware Error Source Table (HEST) 4. Error Injection Table (EINJ) All these 4 tables have the same header as FADT, MADT, etc. They are pointed by RSDP. For the HEST, it contains the error source. The types of them are defined as type description 1. Machine Check Exception (MCE) 2. Corrected Machine Check (CMC) 3. NMI Error 6. PCI Express Root Port AER 7. PCI Express Device AER 8. PCI Express Bridge AER 9. Generic Hardware Error Source Error source types 3, 4, and 5 are reserved for legacy reasons and must not be used. Currently AMD board only provide part of "Machine Check Exception (MCE)" & Corrected Machine Check (CMC)". we need to provide the header of each error source. Other types of Error Sources is in TODO list. Only persimmon is tested. Linux can add HEST feature. The dmesg says, ACPI: HEST 0000000066fe5010 00198 (v03 CORE COREBOOT 00000000 CORE 00000000) ...... HEST: Table parsing has been initialized. No more message is got. Windows can boot with this patch. Havent found a way to test it. Change-Id: I447e7f57b8e8f0433a145a43d0710910afabf00f Signed-off-by: Zheng Bao <zheng.bao@amd.com> Signed-off-by: zbao <fishbaozi@gmail.com> Reviewed-on: http://review.coreboot.org/888 Reviewed-by: Peter Stuge <peter@stuge.se> Tested-by: build bot (Jenkins)
This commit is contained in:
parent
90655c83d0
commit
caf494c831
|
@ -467,6 +467,89 @@ void acpi_write_rsdp(acpi_rsdp_t *rsdp, acpi_rsdt_t *rsdt, acpi_xsdt_t *xsdt)
|
||||||
rsdp->ext_checksum = acpi_checksum((void *)rsdp, sizeof(acpi_rsdp_t));
|
rsdp->ext_checksum = acpi_checksum((void *)rsdp, sizeof(acpi_rsdp_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned long __attribute__((weak)) acpi_fill_hest(acpi_hest_t *hest)
|
||||||
|
{
|
||||||
|
return (unsigned long)hest;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long acpi_create_hest_error_source(acpi_hest_t *hest, acpi_hest_esd_t *esd, u16 type, void *data, u16 data_len)
|
||||||
|
{
|
||||||
|
acpi_header_t *header = &(hest->header);
|
||||||
|
acpi_hest_hen_t *hen;
|
||||||
|
void *pos;
|
||||||
|
u16 len;
|
||||||
|
|
||||||
|
pos = esd;
|
||||||
|
memset(pos, 0, sizeof(acpi_hest_esd_t));
|
||||||
|
len = 0;
|
||||||
|
esd->type = type; /* MCE */
|
||||||
|
esd->source_id = hest->error_source_count;
|
||||||
|
esd->flags = 0; /* FIRMWARE_FIRST */
|
||||||
|
esd->enabled = 1;
|
||||||
|
esd->prealloc_erecords = 1;
|
||||||
|
esd->max_section_per_record = 0x1;
|
||||||
|
|
||||||
|
len += sizeof(acpi_hest_esd_t);
|
||||||
|
pos = esd + 1;
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case 0: /* MCE */
|
||||||
|
break;
|
||||||
|
case 1: /* CMC */
|
||||||
|
hen = (acpi_hest_hen_t *) (pos);
|
||||||
|
memset(pos, 0, sizeof(acpi_hest_hen_t));
|
||||||
|
hen->type = 3; /* SCI? */
|
||||||
|
hen->length = sizeof(acpi_hest_hen_t);
|
||||||
|
hen->conf_we = 0; /* Configuration Write Enable. */
|
||||||
|
hen->poll_interval = 0;
|
||||||
|
hen->vector = 0;
|
||||||
|
hen->sw2poll_threshold_val = 0;
|
||||||
|
hen->sw2poll_threshold_win = 0;
|
||||||
|
hen->error_threshold_val = 0;
|
||||||
|
hen->error_threshold_win = 0;
|
||||||
|
len += sizeof(acpi_hest_hen_t);
|
||||||
|
pos = hen + 1;
|
||||||
|
break;
|
||||||
|
case 2: /* NMI */
|
||||||
|
case 6: /* AER Root Port */
|
||||||
|
case 7: /* AER Endpoint */
|
||||||
|
case 8: /* AER Bridge */
|
||||||
|
case 9: /* Generic Hardware Error Source. */
|
||||||
|
/* TODO: */
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
printk(BIOS_DEBUG, "Invalid type of Error Source.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
hest->error_source_count ++;
|
||||||
|
|
||||||
|
memcpy(pos, data, data_len);
|
||||||
|
len += data_len;
|
||||||
|
header->length += len;
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ACPI 4.0 */
|
||||||
|
void acpi_write_hest(acpi_hest_t *hest)
|
||||||
|
{
|
||||||
|
acpi_header_t *header = &(hest->header);
|
||||||
|
|
||||||
|
memset(hest, 0, sizeof(acpi_hest_t));
|
||||||
|
|
||||||
|
memcpy(header->signature, "HEST", 4);
|
||||||
|
memcpy(header->oem_id, OEM_ID, 6);
|
||||||
|
memcpy(header->oem_table_id, ACPI_TABLE_CREATOR, 8);
|
||||||
|
memcpy(header->asl_compiler_id, ASLC, 4);
|
||||||
|
header->length += sizeof(acpi_hest_t);
|
||||||
|
header->revision = 1;
|
||||||
|
|
||||||
|
acpi_fill_hest(hest);
|
||||||
|
|
||||||
|
/* Calculate checksums. */
|
||||||
|
header->checksum = acpi_checksum((void *)hest, header->length);
|
||||||
|
}
|
||||||
|
|
||||||
#if CONFIG_HAVE_ACPI_RESUME == 1
|
#if CONFIG_HAVE_ACPI_RESUME == 1
|
||||||
void suspend_resume(void)
|
void suspend_resume(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -357,6 +357,37 @@ typedef struct acpi_ecdt {
|
||||||
u8 ec_id[]; /* EC ID */
|
u8 ec_id[]; /* EC ID */
|
||||||
} __attribute__ ((packed)) acpi_ecdt_t;
|
} __attribute__ ((packed)) acpi_ecdt_t;
|
||||||
|
|
||||||
|
/* HEST (Hardware Error Source Table) */
|
||||||
|
typedef struct acpi_hest {
|
||||||
|
struct acpi_table_header header;
|
||||||
|
u32 error_source_count;
|
||||||
|
/* error_source_struct(s) */
|
||||||
|
} __attribute__ ((packed)) acpi_hest_t;
|
||||||
|
|
||||||
|
/* Error Source Descriptors */
|
||||||
|
typedef struct acpi_hest_esd {
|
||||||
|
u16 type;
|
||||||
|
u16 source_id;
|
||||||
|
u16 resv;
|
||||||
|
u8 flags;
|
||||||
|
u8 enabled;
|
||||||
|
u32 prealloc_erecords; /* The number of error records to pre-allocate for this error source. */
|
||||||
|
u32 max_section_per_record;
|
||||||
|
} __attribute__ ((packed)) acpi_hest_esd_t;
|
||||||
|
|
||||||
|
/* Hardware Error Notification */
|
||||||
|
typedef struct acpi_hest_hen {
|
||||||
|
u8 type;
|
||||||
|
u8 length;
|
||||||
|
u16 conf_we; /* Configuration Write Enable */
|
||||||
|
u32 poll_interval;
|
||||||
|
u32 vector;
|
||||||
|
u32 sw2poll_threshold_val;
|
||||||
|
u32 sw2poll_threshold_win;
|
||||||
|
u32 error_threshold_val;
|
||||||
|
u32 error_threshold_win;
|
||||||
|
} __attribute__ ((packed)) acpi_hest_hen_t;
|
||||||
|
|
||||||
/* These are implemented by the target port or north/southbridge. */
|
/* These are implemented by the target port or north/southbridge. */
|
||||||
unsigned long write_acpi_tables(unsigned long addr);
|
unsigned long write_acpi_tables(unsigned long addr);
|
||||||
unsigned long acpi_fill_madt(unsigned long current);
|
unsigned long acpi_fill_madt(unsigned long current);
|
||||||
|
@ -412,6 +443,10 @@ void acpi_write_rsdt(acpi_rsdt_t *rsdt);
|
||||||
void acpi_write_xsdt(acpi_xsdt_t *xsdt);
|
void acpi_write_xsdt(acpi_xsdt_t *xsdt);
|
||||||
void acpi_write_rsdp(acpi_rsdp_t *rsdp, acpi_rsdt_t *rsdt, acpi_xsdt_t *xsdt);
|
void acpi_write_rsdp(acpi_rsdp_t *rsdp, acpi_rsdt_t *rsdt, acpi_xsdt_t *xsdt);
|
||||||
|
|
||||||
|
void acpi_write_hest(acpi_hest_t *hest);
|
||||||
|
unsigned long acpi_create_hest_error_source(acpi_hest_t *hest, acpi_hest_esd_t *esd, u16 type, void *data, u16 len);
|
||||||
|
unsigned long acpi_fill_hest(acpi_hest_t *hest);
|
||||||
|
|
||||||
#if CONFIG_HAVE_ACPI_RESUME
|
#if CONFIG_HAVE_ACPI_RESUME
|
||||||
/* 0 = S0, 1 = S1 ...*/
|
/* 0 = S0, 1 = S1 ...*/
|
||||||
extern u8 acpi_slp_type;
|
extern u8 acpi_slp_type;
|
||||||
|
|
|
@ -122,6 +122,24 @@ unsigned long acpi_fill_madt(unsigned long current)
|
||||||
return current;
|
return current;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned long acpi_fill_hest(acpi_hest_t *hest)
|
||||||
|
{
|
||||||
|
void *addr, *current;
|
||||||
|
|
||||||
|
/* Skip the HEST header. */
|
||||||
|
current = (void *)(hest + 1);
|
||||||
|
|
||||||
|
addr = agesawrapper_getlateinitptr(PICK_WHEA_MCE);
|
||||||
|
if (addr != NULL)
|
||||||
|
current += acpi_create_hest_error_source(hest, current, 0, (void *)((u32)addr + 2), *(UINT16 *)addr - 2);
|
||||||
|
|
||||||
|
addr = agesawrapper_getlateinitptr(PICK_WHEA_CMC);
|
||||||
|
if (addr != NULL)
|
||||||
|
current += acpi_create_hest_error_source(hest, current, 1, (void *)((u32)addr + 2), *(UINT16 *)addr - 2);
|
||||||
|
|
||||||
|
return (unsigned long)current;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned long acpi_fill_slit(unsigned long current)
|
unsigned long acpi_fill_slit(unsigned long current)
|
||||||
{
|
{
|
||||||
// Not implemented
|
// Not implemented
|
||||||
|
@ -172,6 +190,7 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
acpi_header_t *ssdt;
|
acpi_header_t *ssdt;
|
||||||
acpi_header_t *ssdt2;
|
acpi_header_t *ssdt2;
|
||||||
acpi_header_t *alib;
|
acpi_header_t *alib;
|
||||||
|
acpi_hest_t *hest;
|
||||||
|
|
||||||
get_bus_conf(); /* it will get sblk, pci1234, hcdn, and sbdn */
|
get_bus_conf(); /* it will get sblk, pci1234, hcdn, and sbdn */
|
||||||
|
|
||||||
|
@ -234,6 +253,13 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
current += madt->header.length;
|
current += madt->header.length;
|
||||||
acpi_add_table(rsdp, madt);
|
acpi_add_table(rsdp, madt);
|
||||||
|
|
||||||
|
/* HEST */
|
||||||
|
current = (current + 0x07) & -0x08;
|
||||||
|
hest = (acpi_hest_t *)current;
|
||||||
|
acpi_write_hest((void *)current);
|
||||||
|
acpi_add_table(rsdp, (void *)current);
|
||||||
|
current += ((acpi_header_t *)current)->length;
|
||||||
|
|
||||||
/* SRAT */
|
/* SRAT */
|
||||||
current = ( current + 0x07) & -0x08;
|
current = ( current + 0x07) & -0x08;
|
||||||
printk(BIOS_DEBUG, "ACPI: * SRAT at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * SRAT at %lx\n", current);
|
||||||
|
@ -272,7 +298,7 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0 // The DSDT needs additional work for the AGESA SSDT Pstate table
|
#if 0 // The DSDT needs additional work for the AGESA SSDT Pstate table
|
||||||
current = ( current + 0x0f) & -0x10;
|
current = (current + 0x0f) & -0x10;
|
||||||
printk(BIOS_DEBUG, "ACPI: * AGESA SSDT Pstate at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * AGESA SSDT Pstate at %lx\n", current);
|
||||||
ssdt = (acpi_header_t *)agesawrapper_getlateinitptr (PICK_PSTATE);
|
ssdt = (acpi_header_t *)agesawrapper_getlateinitptr (PICK_PSTATE);
|
||||||
if (ssdt != NULL) {
|
if (ssdt != NULL) {
|
||||||
|
@ -285,7 +311,7 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
acpi_add_table(rsdp,ssdt);
|
acpi_add_table(rsdp,ssdt);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
current = ( current + 0x0f) & -0x10;
|
current = (current + 0x0f) & -0x10;
|
||||||
printk(BIOS_DEBUG, "ACPI: * coreboot TOM SSDT2 at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * coreboot TOM SSDT2 at %lx\n", current);
|
||||||
ssdt2 = (acpi_header_t *) current;
|
ssdt2 = (acpi_header_t *) current;
|
||||||
acpi_create_ssdt_generator(ssdt2, ACPI_TABLE_CREATOR);
|
acpi_create_ssdt_generator(ssdt2, ACPI_TABLE_CREATOR);
|
||||||
|
@ -313,6 +339,9 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
|
|
||||||
printk(BIOS_DEBUG, "fadt\n");
|
printk(BIOS_DEBUG, "fadt\n");
|
||||||
dump_mem(fadt, ((void *)fadt) + fadt->header.length);
|
dump_mem(fadt, ((void *)fadt) + fadt->header.length);
|
||||||
|
|
||||||
|
printk(BIOS_DEBUG, "hest\n");
|
||||||
|
dump_mem(hest, ((void *)hest) + hest->header.length);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
printk(BIOS_INFO, "ACPI: done.\n");
|
printk(BIOS_INFO, "ACPI: done.\n");
|
||||||
|
|
|
@ -105,6 +105,24 @@ unsigned long acpi_fill_madt(unsigned long current)
|
||||||
return current;
|
return current;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned long acpi_fill_hest(acpi_hest_t *hest)
|
||||||
|
{
|
||||||
|
void *addr, *current;
|
||||||
|
|
||||||
|
/* Skip the HEST header. */
|
||||||
|
current = (void *)(hest + 1);
|
||||||
|
|
||||||
|
addr = agesawrapper_getlateinitptr(PICK_WHEA_MCE);
|
||||||
|
if (addr != NULL)
|
||||||
|
current += acpi_create_hest_error_source(hest, current, 0, (void *)((u32)addr + 2), *(UINT16 *)addr - 2);
|
||||||
|
|
||||||
|
addr = agesawrapper_getlateinitptr(PICK_WHEA_CMC);
|
||||||
|
if (addr != NULL)
|
||||||
|
current += acpi_create_hest_error_source(hest, current, 1, (void *)((u32)addr + 2), *(UINT16 *)addr - 2);
|
||||||
|
|
||||||
|
return (unsigned long)current;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned long acpi_fill_slit(unsigned long current)
|
unsigned long acpi_fill_slit(unsigned long current)
|
||||||
{
|
{
|
||||||
// Not implemented
|
// Not implemented
|
||||||
|
@ -132,6 +150,7 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
acpi_header_t *ssdt;
|
acpi_header_t *ssdt;
|
||||||
acpi_header_t *ssdt2;
|
acpi_header_t *ssdt2;
|
||||||
acpi_header_t *alib;
|
acpi_header_t *alib;
|
||||||
|
acpi_hest_t *hest;
|
||||||
|
|
||||||
get_bus_conf(); /* it will get sblk, pci1234, hcdn, and sbdn */
|
get_bus_conf(); /* it will get sblk, pci1234, hcdn, and sbdn */
|
||||||
|
|
||||||
|
@ -154,7 +173,7 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
acpi_write_rsdt(rsdt);
|
acpi_write_rsdt(rsdt);
|
||||||
|
|
||||||
/* DSDT */
|
/* DSDT */
|
||||||
current = ( current + 0x07) & -0x08;
|
current = (current + 0x07) & -0x08;
|
||||||
printk(BIOS_DEBUG, "ACPI: * DSDT at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * DSDT at %lx\n", current);
|
||||||
dsdt = (acpi_header_t *)current;
|
dsdt = (acpi_header_t *)current;
|
||||||
memcpy(dsdt, &AmlCode, sizeof(acpi_header_t));
|
memcpy(dsdt, &AmlCode, sizeof(acpi_header_t));
|
||||||
|
@ -163,14 +182,14 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
printk(BIOS_DEBUG, "ACPI: * DSDT @ %p Length %x\n",dsdt,dsdt->length);
|
printk(BIOS_DEBUG, "ACPI: * DSDT @ %p Length %x\n",dsdt,dsdt->length);
|
||||||
|
|
||||||
/* FACS */ // it needs 64 bit alignment
|
/* FACS */ // it needs 64 bit alignment
|
||||||
current = ( current + 0x07) & -0x08;
|
current = (current + 0x07) & -0x08;
|
||||||
printk(BIOS_DEBUG, "ACPI: * FACS at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * FACS at %lx\n", current);
|
||||||
facs = (acpi_facs_t *) current;
|
facs = (acpi_facs_t *) current;
|
||||||
current += sizeof(acpi_facs_t);
|
current += sizeof(acpi_facs_t);
|
||||||
acpi_create_facs(facs);
|
acpi_create_facs(facs);
|
||||||
|
|
||||||
/* FADT */
|
/* FADT */
|
||||||
current = ( current + 0x07) & -0x08;
|
current = (current + 0x07) & -0x08;
|
||||||
printk(BIOS_DEBUG, "ACPI: * FADT at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * FADT at %lx\n", current);
|
||||||
fadt = (acpi_fadt_t *) current;
|
fadt = (acpi_fadt_t *) current;
|
||||||
current += sizeof(acpi_fadt_t);
|
current += sizeof(acpi_fadt_t);
|
||||||
|
@ -181,7 +200,7 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
/*
|
/*
|
||||||
* We explicitly add these tables later on:
|
* We explicitly add these tables later on:
|
||||||
*/
|
*/
|
||||||
current = ( current + 0x07) & -0x08;
|
current = (current + 0x07) & -0x08;
|
||||||
printk(BIOS_DEBUG, "ACPI: * HPET at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * HPET at %lx\n", current);
|
||||||
hpet = (acpi_hpet_t *) current;
|
hpet = (acpi_hpet_t *) current;
|
||||||
current += sizeof(acpi_hpet_t);
|
current += sizeof(acpi_hpet_t);
|
||||||
|
@ -189,15 +208,22 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
acpi_add_table(rsdp, hpet);
|
acpi_add_table(rsdp, hpet);
|
||||||
|
|
||||||
/* If we want to use HPET Timers Linux wants an MADT */
|
/* If we want to use HPET Timers Linux wants an MADT */
|
||||||
current = ( current + 0x07) & -0x08;
|
current = (current + 0x07) & -0x08;
|
||||||
printk(BIOS_DEBUG, "ACPI: * MADT at %lx\n",current);
|
printk(BIOS_DEBUG, "ACPI: * MADT at %lx\n",current);
|
||||||
madt = (acpi_madt_t *) current;
|
madt = (acpi_madt_t *) current;
|
||||||
acpi_create_madt(madt);
|
acpi_create_madt(madt);
|
||||||
current += madt->header.length;
|
current += madt->header.length;
|
||||||
acpi_add_table(rsdp, madt);
|
acpi_add_table(rsdp, madt);
|
||||||
|
|
||||||
|
/* HEST */
|
||||||
|
current = (current + 0x07) & -0x08;
|
||||||
|
hest = (acpi_hest_t *)current;
|
||||||
|
acpi_write_hest((void *)current);
|
||||||
|
acpi_add_table(rsdp, (void *)current);
|
||||||
|
current += ((acpi_header_t *)current)->length;
|
||||||
|
|
||||||
/* SRAT */
|
/* SRAT */
|
||||||
current = ( current + 0x07) & -0x08;
|
current = (current + 0x07) & -0x08;
|
||||||
printk(BIOS_DEBUG, "ACPI: * SRAT at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * SRAT at %lx\n", current);
|
||||||
srat = (acpi_srat_t *) agesawrapper_getlateinitptr (PICK_SRAT);
|
srat = (acpi_srat_t *) agesawrapper_getlateinitptr (PICK_SRAT);
|
||||||
if (srat != NULL) {
|
if (srat != NULL) {
|
||||||
|
@ -211,7 +237,7 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* SLIT */
|
/* SLIT */
|
||||||
current = ( current + 0x07) & -0x08;
|
current = (current + 0x07) & -0x08;
|
||||||
printk(BIOS_DEBUG, "ACPI: * SLIT at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * SLIT at %lx\n", current);
|
||||||
slit = (acpi_slit_t *) agesawrapper_getlateinitptr (PICK_SLIT);
|
slit = (acpi_slit_t *) agesawrapper_getlateinitptr (PICK_SLIT);
|
||||||
if (slit != NULL) {
|
if (slit != NULL) {
|
||||||
|
@ -225,7 +251,7 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* SSDT */
|
/* SSDT */
|
||||||
current = ( current + 0x0f) & -0x10;
|
current = (current + 0x0f) & -0x10;
|
||||||
printk(BIOS_DEBUG, "ACPI: * AGESA ALIB SSDT at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * AGESA ALIB SSDT at %lx\n", current);
|
||||||
alib = (acpi_header_t *)agesawrapper_getlateinitptr (PICK_ALIB);
|
alib = (acpi_header_t *)agesawrapper_getlateinitptr (PICK_ALIB);
|
||||||
if (alib != NULL) {
|
if (alib != NULL) {
|
||||||
|
@ -239,7 +265,7 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0 // The DSDT needs additional work for the AGESA SSDT Pstate table
|
#if 0 // The DSDT needs additional work for the AGESA SSDT Pstate table
|
||||||
current = ( current + 0x0f) & -0x10;
|
current = (current + 0x0f) & -0x10;
|
||||||
printk(BIOS_DEBUG, "ACPI: * AGESA SSDT Pstate at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * AGESA SSDT Pstate at %lx\n", current);
|
||||||
ssdt = (acpi_header_t *)agesawrapper_getlateinitptr (PICK_PSTATE);
|
ssdt = (acpi_header_t *)agesawrapper_getlateinitptr (PICK_PSTATE);
|
||||||
if (ssdt != NULL) {
|
if (ssdt != NULL) {
|
||||||
|
@ -254,7 +280,7 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
acpi_add_table(rsdp,ssdt);
|
acpi_add_table(rsdp,ssdt);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
current = ( current + 0x0f) & -0x10;
|
current = (current + 0x0f) & -0x10;
|
||||||
printk(BIOS_DEBUG, "ACPI: * coreboot TOM SSDT2 at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * coreboot TOM SSDT2 at %lx\n", current);
|
||||||
ssdt2 = (acpi_header_t *) current;
|
ssdt2 = (acpi_header_t *) current;
|
||||||
acpi_create_ssdt_generator(ssdt2, ACPI_TABLE_CREATOR);
|
acpi_create_ssdt_generator(ssdt2, ACPI_TABLE_CREATOR);
|
||||||
|
@ -288,6 +314,9 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
|
|
||||||
printk(BIOS_DEBUG, "fadt\n");
|
printk(BIOS_DEBUG, "fadt\n");
|
||||||
dump_mem(fadt, ((void *)fadt) + fadt->header.length);
|
dump_mem(fadt, ((void *)fadt) + fadt->header.length);
|
||||||
|
|
||||||
|
printk(BIOS_DEBUG, "hest\n");
|
||||||
|
dump_mem(hest, ((void *)hest) + hest->header.length);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
printk(BIOS_INFO, "ACPI: done.\n");
|
printk(BIOS_INFO, "ACPI: done.\n");
|
||||||
|
|
|
@ -105,6 +105,24 @@ unsigned long acpi_fill_madt(unsigned long current)
|
||||||
return current;
|
return current;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned long acpi_fill_hest(acpi_hest_t *hest)
|
||||||
|
{
|
||||||
|
void *addr, *current;
|
||||||
|
|
||||||
|
/* Skip the HEST header. */
|
||||||
|
current = (void *)(hest + 1);
|
||||||
|
|
||||||
|
addr = agesawrapper_getlateinitptr(PICK_WHEA_MCE);
|
||||||
|
if (addr != NULL)
|
||||||
|
current += acpi_create_hest_error_source(hest, current, 0, (void *)((u32)addr + 2), *(UINT16 *)addr - 2);
|
||||||
|
|
||||||
|
addr = agesawrapper_getlateinitptr(PICK_WHEA_CMC);
|
||||||
|
if (addr != NULL)
|
||||||
|
current += acpi_create_hest_error_source(hest, current, 1, (void *)((u32)addr + 2), *(UINT16 *)addr - 2);
|
||||||
|
|
||||||
|
return (unsigned long)current;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned long acpi_fill_slit(unsigned long current)
|
unsigned long acpi_fill_slit(unsigned long current)
|
||||||
{
|
{
|
||||||
// Not implemented
|
// Not implemented
|
||||||
|
@ -132,6 +150,7 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
acpi_header_t *ssdt;
|
acpi_header_t *ssdt;
|
||||||
acpi_header_t *ssdt2;
|
acpi_header_t *ssdt2;
|
||||||
acpi_header_t *alib;
|
acpi_header_t *alib;
|
||||||
|
acpi_hest_t *hest;
|
||||||
|
|
||||||
get_bus_conf(); /* it will get sblk, pci1234, hcdn, and sbdn */
|
get_bus_conf(); /* it will get sblk, pci1234, hcdn, and sbdn */
|
||||||
|
|
||||||
|
@ -154,7 +173,7 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
acpi_write_rsdt(rsdt);
|
acpi_write_rsdt(rsdt);
|
||||||
|
|
||||||
/* DSDT */
|
/* DSDT */
|
||||||
current = ( current + 0x07) & -0x08;
|
current = (current + 0x07) & -0x08;
|
||||||
printk(BIOS_DEBUG, "ACPI: * DSDT at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * DSDT at %lx\n", current);
|
||||||
dsdt = (acpi_header_t *)current;
|
dsdt = (acpi_header_t *)current;
|
||||||
memcpy(dsdt, &AmlCode, sizeof(acpi_header_t));
|
memcpy(dsdt, &AmlCode, sizeof(acpi_header_t));
|
||||||
|
@ -163,14 +182,14 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
printk(BIOS_DEBUG, "ACPI: * DSDT @ %p Length %x\n",dsdt,dsdt->length);
|
printk(BIOS_DEBUG, "ACPI: * DSDT @ %p Length %x\n",dsdt,dsdt->length);
|
||||||
|
|
||||||
/* FACS */ // it needs 64 bit alignment
|
/* FACS */ // it needs 64 bit alignment
|
||||||
current = ( current + 0x07) & -0x08;
|
current = (current + 0x07) & -0x08;
|
||||||
printk(BIOS_DEBUG, "ACPI: * FACS at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * FACS at %lx\n", current);
|
||||||
facs = (acpi_facs_t *) current;
|
facs = (acpi_facs_t *) current;
|
||||||
current += sizeof(acpi_facs_t);
|
current += sizeof(acpi_facs_t);
|
||||||
acpi_create_facs(facs);
|
acpi_create_facs(facs);
|
||||||
|
|
||||||
/* FADT */
|
/* FADT */
|
||||||
current = ( current + 0x07) & -0x08;
|
current = (current + 0x07) & -0x08;
|
||||||
printk(BIOS_DEBUG, "ACPI: * FADT at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * FADT at %lx\n", current);
|
||||||
fadt = (acpi_fadt_t *) current;
|
fadt = (acpi_fadt_t *) current;
|
||||||
current += sizeof(acpi_fadt_t);
|
current += sizeof(acpi_fadt_t);
|
||||||
|
@ -181,7 +200,7 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
/*
|
/*
|
||||||
* We explicitly add these tables later on:
|
* We explicitly add these tables later on:
|
||||||
*/
|
*/
|
||||||
current = ( current + 0x07) & -0x08;
|
current = (current + 0x07) & -0x08;
|
||||||
printk(BIOS_DEBUG, "ACPI: * HPET at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * HPET at %lx\n", current);
|
||||||
hpet = (acpi_hpet_t *) current;
|
hpet = (acpi_hpet_t *) current;
|
||||||
current += sizeof(acpi_hpet_t);
|
current += sizeof(acpi_hpet_t);
|
||||||
|
@ -189,15 +208,22 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
acpi_add_table(rsdp, hpet);
|
acpi_add_table(rsdp, hpet);
|
||||||
|
|
||||||
/* If we want to use HPET Timers Linux wants an MADT */
|
/* If we want to use HPET Timers Linux wants an MADT */
|
||||||
current = ( current + 0x07) & -0x08;
|
current = (current + 0x07) & -0x08;
|
||||||
printk(BIOS_DEBUG, "ACPI: * MADT at %lx\n",current);
|
printk(BIOS_DEBUG, "ACPI: * MADT at %lx\n",current);
|
||||||
madt = (acpi_madt_t *) current;
|
madt = (acpi_madt_t *) current;
|
||||||
acpi_create_madt(madt);
|
acpi_create_madt(madt);
|
||||||
current += madt->header.length;
|
current += madt->header.length;
|
||||||
acpi_add_table(rsdp, madt);
|
acpi_add_table(rsdp, madt);
|
||||||
|
|
||||||
|
/* HEST */
|
||||||
|
current = (current + 0x07) & -0x08;
|
||||||
|
hest = (acpi_hest_t *)current;
|
||||||
|
acpi_write_hest((void *)current);
|
||||||
|
acpi_add_table(rsdp, (void *)current);
|
||||||
|
current += ((acpi_header_t *)current)->length;
|
||||||
|
|
||||||
/* SRAT */
|
/* SRAT */
|
||||||
current = ( current + 0x07) & -0x08;
|
current = (current + 0x07) & -0x08;
|
||||||
printk(BIOS_DEBUG, "ACPI: * SRAT at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * SRAT at %lx\n", current);
|
||||||
srat = (acpi_srat_t *) agesawrapper_getlateinitptr (PICK_SRAT);
|
srat = (acpi_srat_t *) agesawrapper_getlateinitptr (PICK_SRAT);
|
||||||
if (srat != NULL) {
|
if (srat != NULL) {
|
||||||
|
@ -211,7 +237,7 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* SLIT */
|
/* SLIT */
|
||||||
current = ( current + 0x07) & -0x08;
|
current = (current + 0x07) & -0x08;
|
||||||
printk(BIOS_DEBUG, "ACPI: * SLIT at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * SLIT at %lx\n", current);
|
||||||
slit = (acpi_slit_t *) agesawrapper_getlateinitptr (PICK_SLIT);
|
slit = (acpi_slit_t *) agesawrapper_getlateinitptr (PICK_SLIT);
|
||||||
if (slit != NULL) {
|
if (slit != NULL) {
|
||||||
|
@ -225,7 +251,7 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* SSDT */
|
/* SSDT */
|
||||||
current = ( current + 0x0f) & -0x10;
|
current = (current + 0x0f) & -0x10;
|
||||||
printk(BIOS_DEBUG, "ACPI: * AGESA ALIB SSDT at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * AGESA ALIB SSDT at %lx\n", current);
|
||||||
alib = (acpi_header_t *)agesawrapper_getlateinitptr (PICK_ALIB);
|
alib = (acpi_header_t *)agesawrapper_getlateinitptr (PICK_ALIB);
|
||||||
if (alib != NULL) {
|
if (alib != NULL) {
|
||||||
|
@ -239,7 +265,7 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0 // The DSDT needs additional work for the AGESA SSDT Pstate table
|
#if 0 // The DSDT needs additional work for the AGESA SSDT Pstate table
|
||||||
current = ( current + 0x0f) & -0x10;
|
current = (current + 0x0f) & -0x10;
|
||||||
printk(BIOS_DEBUG, "ACPI: * AGESA SSDT Pstate at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * AGESA SSDT Pstate at %lx\n", current);
|
||||||
ssdt = (acpi_header_t *)agesawrapper_getlateinitptr (PICK_PSTATE);
|
ssdt = (acpi_header_t *)agesawrapper_getlateinitptr (PICK_PSTATE);
|
||||||
if (ssdt != NULL) {
|
if (ssdt != NULL) {
|
||||||
|
@ -254,7 +280,7 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
acpi_add_table(rsdp,ssdt);
|
acpi_add_table(rsdp,ssdt);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
current = ( current + 0x0f) & -0x10;
|
current = (current + 0x0f) & -0x10;
|
||||||
printk(BIOS_DEBUG, "ACPI: * coreboot TOM SSDT2 at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * coreboot TOM SSDT2 at %lx\n", current);
|
||||||
ssdt2 = (acpi_header_t *) current;
|
ssdt2 = (acpi_header_t *) current;
|
||||||
acpi_create_ssdt_generator(ssdt2, ACPI_TABLE_CREATOR);
|
acpi_create_ssdt_generator(ssdt2, ACPI_TABLE_CREATOR);
|
||||||
|
@ -288,6 +314,9 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
|
|
||||||
printk(BIOS_DEBUG, "fadt\n");
|
printk(BIOS_DEBUG, "fadt\n");
|
||||||
dump_mem(fadt, ((void *)fadt) + fadt->header.length);
|
dump_mem(fadt, ((void *)fadt) + fadt->header.length);
|
||||||
|
|
||||||
|
printk(BIOS_DEBUG, "hest\n");
|
||||||
|
dump_mem(hest, ((void *)hest) + hest->header.length);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
printk(BIOS_INFO, "ACPI: done.\n");
|
printk(BIOS_INFO, "ACPI: done.\n");
|
||||||
|
|
|
@ -104,6 +104,24 @@ unsigned long acpi_fill_madt(unsigned long current)
|
||||||
return current;
|
return current;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned long acpi_fill_hest(acpi_hest_t *hest)
|
||||||
|
{
|
||||||
|
void *addr, *current;
|
||||||
|
|
||||||
|
/* Skip the HEST header. */
|
||||||
|
current = (void *)(hest + 1);
|
||||||
|
|
||||||
|
addr = agesawrapper_getlateinitptr(PICK_WHEA_MCE);
|
||||||
|
if (addr != NULL)
|
||||||
|
current += acpi_create_hest_error_source(hest, current, 0, (void *)((u32)addr + 2), *(UINT16 *)addr - 2);
|
||||||
|
|
||||||
|
addr = agesawrapper_getlateinitptr(PICK_WHEA_CMC);
|
||||||
|
if (addr != NULL)
|
||||||
|
current += acpi_create_hest_error_source(hest, current, 1, (void *)((u32)addr + 2), *(UINT16 *)addr - 2);
|
||||||
|
|
||||||
|
return (unsigned long)current;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned long acpi_fill_slit(unsigned long current)
|
unsigned long acpi_fill_slit(unsigned long current)
|
||||||
{
|
{
|
||||||
// Not implemented
|
// Not implemented
|
||||||
|
@ -131,6 +149,7 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
acpi_header_t *ssdt;
|
acpi_header_t *ssdt;
|
||||||
acpi_header_t *ssdt2;
|
acpi_header_t *ssdt2;
|
||||||
acpi_header_t *alib;
|
acpi_header_t *alib;
|
||||||
|
acpi_hest_t *hest;
|
||||||
|
|
||||||
get_bus_conf(); /* it will get sblk, pci1234, hcdn, and sbdn */
|
get_bus_conf(); /* it will get sblk, pci1234, hcdn, and sbdn */
|
||||||
|
|
||||||
|
@ -153,7 +172,7 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
acpi_write_rsdt(rsdt);
|
acpi_write_rsdt(rsdt);
|
||||||
|
|
||||||
/* DSDT */
|
/* DSDT */
|
||||||
current = ( current + 0x07) & -0x08;
|
current = (current + 0x07) & -0x08;
|
||||||
printk(BIOS_DEBUG, "ACPI: * DSDT at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * DSDT at %lx\n", current);
|
||||||
dsdt = (acpi_header_t *)current;
|
dsdt = (acpi_header_t *)current;
|
||||||
memcpy(dsdt, &AmlCode, sizeof(acpi_header_t));
|
memcpy(dsdt, &AmlCode, sizeof(acpi_header_t));
|
||||||
|
@ -162,14 +181,14 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
printk(BIOS_DEBUG, "ACPI: * DSDT @ %p Length %x\n",dsdt,dsdt->length);
|
printk(BIOS_DEBUG, "ACPI: * DSDT @ %p Length %x\n",dsdt,dsdt->length);
|
||||||
|
|
||||||
/* FACS */ // it needs 64 bit alignment
|
/* FACS */ // it needs 64 bit alignment
|
||||||
current = ( current + 0x07) & -0x08;
|
current = (current + 0x07) & -0x08;
|
||||||
printk(BIOS_DEBUG, "ACPI: * FACS at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * FACS at %lx\n", current);
|
||||||
facs = (acpi_facs_t *) current;
|
facs = (acpi_facs_t *) current;
|
||||||
current += sizeof(acpi_facs_t);
|
current += sizeof(acpi_facs_t);
|
||||||
acpi_create_facs(facs);
|
acpi_create_facs(facs);
|
||||||
|
|
||||||
/* FADT */
|
/* FADT */
|
||||||
current = ( current + 0x07) & -0x08;
|
current = (current + 0x07) & -0x08;
|
||||||
printk(BIOS_DEBUG, "ACPI: * FADT at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * FADT at %lx\n", current);
|
||||||
fadt = (acpi_fadt_t *) current;
|
fadt = (acpi_fadt_t *) current;
|
||||||
current += sizeof(acpi_fadt_t);
|
current += sizeof(acpi_fadt_t);
|
||||||
|
@ -180,7 +199,7 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
/*
|
/*
|
||||||
* We explicitly add these tables later on:
|
* We explicitly add these tables later on:
|
||||||
*/
|
*/
|
||||||
current = ( current + 0x07) & -0x08;
|
current = (current + 0x07) & -0x08;
|
||||||
printk(BIOS_DEBUG, "ACPI: * HPET at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * HPET at %lx\n", current);
|
||||||
hpet = (acpi_hpet_t *) current;
|
hpet = (acpi_hpet_t *) current;
|
||||||
current += sizeof(acpi_hpet_t);
|
current += sizeof(acpi_hpet_t);
|
||||||
|
@ -188,15 +207,22 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
acpi_add_table(rsdp, hpet);
|
acpi_add_table(rsdp, hpet);
|
||||||
|
|
||||||
/* If we want to use HPET Timers Linux wants an MADT */
|
/* If we want to use HPET Timers Linux wants an MADT */
|
||||||
current = ( current + 0x07) & -0x08;
|
current = (current + 0x07) & -0x08;
|
||||||
printk(BIOS_DEBUG, "ACPI: * MADT at %lx\n",current);
|
printk(BIOS_DEBUG, "ACPI: * MADT at %lx\n",current);
|
||||||
madt = (acpi_madt_t *) current;
|
madt = (acpi_madt_t *) current;
|
||||||
acpi_create_madt(madt);
|
acpi_create_madt(madt);
|
||||||
current += madt->header.length;
|
current += madt->header.length;
|
||||||
acpi_add_table(rsdp, madt);
|
acpi_add_table(rsdp, madt);
|
||||||
|
|
||||||
|
/* HEST */
|
||||||
|
current = (current + 0x07) & -0x08;
|
||||||
|
hest = (acpi_hest_t *)current;
|
||||||
|
acpi_write_hest((void *)current);
|
||||||
|
acpi_add_table(rsdp, (void *)current);
|
||||||
|
current += ((acpi_header_t *)current)->length;
|
||||||
|
|
||||||
/* SRAT */
|
/* SRAT */
|
||||||
current = ( current + 0x07) & -0x08;
|
current = (current + 0x07) & -0x08;
|
||||||
printk(BIOS_DEBUG, "ACPI: * SRAT at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * SRAT at %lx\n", current);
|
||||||
srat = (acpi_srat_t *) agesawrapper_getlateinitptr (PICK_SRAT);
|
srat = (acpi_srat_t *) agesawrapper_getlateinitptr (PICK_SRAT);
|
||||||
if (srat != NULL) {
|
if (srat != NULL) {
|
||||||
|
@ -210,7 +236,7 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* SLIT */
|
/* SLIT */
|
||||||
current = ( current + 0x07) & -0x08;
|
current = (current + 0x07) & -0x08;
|
||||||
printk(BIOS_DEBUG, "ACPI: * SLIT at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * SLIT at %lx\n", current);
|
||||||
slit = (acpi_slit_t *) agesawrapper_getlateinitptr (PICK_SLIT);
|
slit = (acpi_slit_t *) agesawrapper_getlateinitptr (PICK_SLIT);
|
||||||
if (slit != NULL) {
|
if (slit != NULL) {
|
||||||
|
@ -224,7 +250,7 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* SSDT */
|
/* SSDT */
|
||||||
current = ( current + 0x0f) & -0x10;
|
current = (current + 0x0f) & -0x10;
|
||||||
printk(BIOS_DEBUG, "ACPI: * AGESA ALIB SSDT at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * AGESA ALIB SSDT at %lx\n", current);
|
||||||
alib = (acpi_header_t *)agesawrapper_getlateinitptr (PICK_ALIB);
|
alib = (acpi_header_t *)agesawrapper_getlateinitptr (PICK_ALIB);
|
||||||
if (alib != NULL) {
|
if (alib != NULL) {
|
||||||
|
@ -238,7 +264,7 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0 // The DSDT needs additional work for the AGESA SSDT Pstate table
|
#if 0 // The DSDT needs additional work for the AGESA SSDT Pstate table
|
||||||
current = ( current + 0x0f) & -0x10;
|
current = (current + 0x0f) & -0x10;
|
||||||
printk(BIOS_DEBUG, "ACPI: * AGESA SSDT Pstate at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * AGESA SSDT Pstate at %lx\n", current);
|
||||||
ssdt = (acpi_header_t *)agesawrapper_getlateinitptr (PICK_PSTATE);
|
ssdt = (acpi_header_t *)agesawrapper_getlateinitptr (PICK_PSTATE);
|
||||||
if (ssdt != NULL) {
|
if (ssdt != NULL) {
|
||||||
|
@ -252,7 +278,7 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
acpi_add_table(rsdp,ssdt);
|
acpi_add_table(rsdp,ssdt);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
current = ( current + 0x0f) & -0x10;
|
current = (current + 0x0f) & -0x10;
|
||||||
printk(BIOS_DEBUG, "ACPI: * coreboot TOM SSDT2 at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * coreboot TOM SSDT2 at %lx\n", current);
|
||||||
ssdt2 = (acpi_header_t *) current;
|
ssdt2 = (acpi_header_t *) current;
|
||||||
acpi_create_ssdt_generator(ssdt2, ACPI_TABLE_CREATOR);
|
acpi_create_ssdt_generator(ssdt2, ACPI_TABLE_CREATOR);
|
||||||
|
@ -283,6 +309,9 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
|
|
||||||
printk(BIOS_DEBUG, "fadt\n");
|
printk(BIOS_DEBUG, "fadt\n");
|
||||||
dump_mem(fadt, ((void *)fadt) + fadt->header.length);
|
dump_mem(fadt, ((void *)fadt) + fadt->header.length);
|
||||||
|
|
||||||
|
printk(BIOS_DEBUG, "hest\n");
|
||||||
|
dump_mem(hest, ((void *)hest) + hest->header.length);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
printk(BIOS_INFO, "ACPI: done.\n");
|
printk(BIOS_INFO, "ACPI: done.\n");
|
||||||
|
|
|
@ -93,6 +93,24 @@ unsigned long acpi_fill_madt(unsigned long current)
|
||||||
return current;
|
return current;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned long acpi_fill_hest(acpi_hest_t *hest)
|
||||||
|
{
|
||||||
|
void *addr, *current;
|
||||||
|
|
||||||
|
/* Skip the HEST header. */
|
||||||
|
current = (void *)(hest + 1);
|
||||||
|
|
||||||
|
addr = agesawrapper_getlateinitptr(PICK_WHEA_MCE);
|
||||||
|
if (addr != NULL)
|
||||||
|
current += acpi_create_hest_error_source(hest, current, 0, (void *)((u32)addr + 2), *(UINT16 *)addr - 2);
|
||||||
|
|
||||||
|
addr = agesawrapper_getlateinitptr(PICK_WHEA_CMC);
|
||||||
|
if (addr != NULL)
|
||||||
|
current += acpi_create_hest_error_source(hest, current, 1, (void *)((u32)addr + 2), *(UINT16 *)addr - 2);
|
||||||
|
|
||||||
|
return (unsigned long)current;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned long acpi_fill_slit(unsigned long current)
|
unsigned long acpi_fill_slit(unsigned long current)
|
||||||
{
|
{
|
||||||
// Not implemented
|
// Not implemented
|
||||||
|
@ -120,6 +138,7 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
acpi_facs_t *facs;
|
acpi_facs_t *facs;
|
||||||
acpi_header_t *dsdt;
|
acpi_header_t *dsdt;
|
||||||
acpi_header_t *ssdt;
|
acpi_header_t *ssdt;
|
||||||
|
acpi_hest_t *hest;
|
||||||
|
|
||||||
get_bus_conf(); /* it will get sblk, pci1234, hcdn, and sbdn */
|
get_bus_conf(); /* it will get sblk, pci1234, hcdn, and sbdn */
|
||||||
|
|
||||||
|
@ -161,6 +180,13 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
current += madt->header.length;
|
current += madt->header.length;
|
||||||
acpi_add_table(rsdp, madt);
|
acpi_add_table(rsdp, madt);
|
||||||
|
|
||||||
|
/* HEST */
|
||||||
|
current = (current + 0x07) & -0x08;
|
||||||
|
hest = (acpi_hest_t *)current;
|
||||||
|
acpi_write_hest((void *)current);
|
||||||
|
acpi_add_table(rsdp, (void *)current);
|
||||||
|
current += ((acpi_header_t *)current)->length;
|
||||||
|
|
||||||
/* SRAT */
|
/* SRAT */
|
||||||
current = ( current + 0x07) & -0x08;
|
current = ( current + 0x07) & -0x08;
|
||||||
printk(BIOS_DEBUG, "ACPI: * SRAT at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * SRAT at %lx\n", current);
|
||||||
|
|
|
@ -104,6 +104,24 @@ unsigned long acpi_fill_madt(unsigned long current)
|
||||||
return current;
|
return current;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned long acpi_fill_hest(acpi_hest_t *hest)
|
||||||
|
{
|
||||||
|
void *addr, *current;
|
||||||
|
|
||||||
|
/* Skip the HEST header. */
|
||||||
|
current = (void *)(hest + 1);
|
||||||
|
|
||||||
|
addr = agesawrapper_getlateinitptr(PICK_WHEA_MCE);
|
||||||
|
if (addr != NULL)
|
||||||
|
current += acpi_create_hest_error_source(hest, current, 0, (void *)((u32)addr + 2), *(UINT16 *)addr - 2);
|
||||||
|
|
||||||
|
addr = agesawrapper_getlateinitptr(PICK_WHEA_CMC);
|
||||||
|
if (addr != NULL)
|
||||||
|
current += acpi_create_hest_error_source(hest, current, 1, (void *)((u32)addr + 2), *(UINT16 *)addr - 2);
|
||||||
|
|
||||||
|
return (unsigned long)current;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned long acpi_fill_slit(unsigned long current)
|
unsigned long acpi_fill_slit(unsigned long current)
|
||||||
{
|
{
|
||||||
// Not implemented
|
// Not implemented
|
||||||
|
@ -131,6 +149,7 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
acpi_header_t *ssdt;
|
acpi_header_t *ssdt;
|
||||||
acpi_header_t *ssdt2;
|
acpi_header_t *ssdt2;
|
||||||
acpi_header_t *alib;
|
acpi_header_t *alib;
|
||||||
|
acpi_hest_t *hest;
|
||||||
|
|
||||||
get_bus_conf(); /* it will get sblk, pci1234, hcdn, and sbdn */
|
get_bus_conf(); /* it will get sblk, pci1234, hcdn, and sbdn */
|
||||||
|
|
||||||
|
@ -153,7 +172,7 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
acpi_write_rsdt(rsdt);
|
acpi_write_rsdt(rsdt);
|
||||||
|
|
||||||
/* DSDT */
|
/* DSDT */
|
||||||
current = ( current + 0x07) & -0x08;
|
current = (current + 0x07) & -0x08;
|
||||||
printk(BIOS_DEBUG, "ACPI: * DSDT at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * DSDT at %lx\n", current);
|
||||||
dsdt = (acpi_header_t *)current;
|
dsdt = (acpi_header_t *)current;
|
||||||
memcpy(dsdt, &AmlCode, sizeof(acpi_header_t));
|
memcpy(dsdt, &AmlCode, sizeof(acpi_header_t));
|
||||||
|
@ -162,14 +181,14 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
printk(BIOS_DEBUG, "ACPI: * DSDT @ %p Length %x\n",dsdt,dsdt->length);
|
printk(BIOS_DEBUG, "ACPI: * DSDT @ %p Length %x\n",dsdt,dsdt->length);
|
||||||
|
|
||||||
/* FACS */ // it needs 64 bit alignment
|
/* FACS */ // it needs 64 bit alignment
|
||||||
current = ( current + 0x07) & -0x08;
|
current = (current + 0x07) & -0x08;
|
||||||
printk(BIOS_DEBUG, "ACPI: * FACS at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * FACS at %lx\n", current);
|
||||||
facs = (acpi_facs_t *) current;
|
facs = (acpi_facs_t *) current;
|
||||||
current += sizeof(acpi_facs_t);
|
current += sizeof(acpi_facs_t);
|
||||||
acpi_create_facs(facs);
|
acpi_create_facs(facs);
|
||||||
|
|
||||||
/* FADT */
|
/* FADT */
|
||||||
current = ( current + 0x07) & -0x08;
|
current = (current + 0x07) & -0x08;
|
||||||
printk(BIOS_DEBUG, "ACPI: * FADT at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * FADT at %lx\n", current);
|
||||||
fadt = (acpi_fadt_t *) current;
|
fadt = (acpi_fadt_t *) current;
|
||||||
current += sizeof(acpi_fadt_t);
|
current += sizeof(acpi_fadt_t);
|
||||||
|
@ -180,7 +199,7 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
/*
|
/*
|
||||||
* We explicitly add these tables later on:
|
* We explicitly add these tables later on:
|
||||||
*/
|
*/
|
||||||
current = ( current + 0x07) & -0x08;
|
current = (current + 0x07) & -0x08;
|
||||||
printk(BIOS_DEBUG, "ACPI: * HPET at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * HPET at %lx\n", current);
|
||||||
hpet = (acpi_hpet_t *) current;
|
hpet = (acpi_hpet_t *) current;
|
||||||
current += sizeof(acpi_hpet_t);
|
current += sizeof(acpi_hpet_t);
|
||||||
|
@ -188,15 +207,22 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
acpi_add_table(rsdp, hpet);
|
acpi_add_table(rsdp, hpet);
|
||||||
|
|
||||||
/* If we want to use HPET Timers Linux wants an MADT */
|
/* If we want to use HPET Timers Linux wants an MADT */
|
||||||
current = ( current + 0x07) & -0x08;
|
current = (current + 0x07) & -0x08;
|
||||||
printk(BIOS_DEBUG, "ACPI: * MADT at %lx\n",current);
|
printk(BIOS_DEBUG, "ACPI: * MADT at %lx\n",current);
|
||||||
madt = (acpi_madt_t *) current;
|
madt = (acpi_madt_t *) current;
|
||||||
acpi_create_madt(madt);
|
acpi_create_madt(madt);
|
||||||
current += madt->header.length;
|
current += madt->header.length;
|
||||||
acpi_add_table(rsdp, madt);
|
acpi_add_table(rsdp, madt);
|
||||||
|
|
||||||
|
/* HEST */
|
||||||
|
current = (current + 0x07) & -0x08;
|
||||||
|
hest = (acpi_hest_t *)current;
|
||||||
|
acpi_write_hest((void *)current);
|
||||||
|
acpi_add_table(rsdp, (void *)current);
|
||||||
|
current += ((acpi_header_t *)current)->length;
|
||||||
|
|
||||||
/* SRAT */
|
/* SRAT */
|
||||||
current = ( current + 0x07) & -0x08;
|
current = (current + 0x07) & -0x08;
|
||||||
printk(BIOS_DEBUG, "ACPI: * SRAT at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * SRAT at %lx\n", current);
|
||||||
srat = (acpi_srat_t *) agesawrapper_getlateinitptr (PICK_SRAT);
|
srat = (acpi_srat_t *) agesawrapper_getlateinitptr (PICK_SRAT);
|
||||||
if (srat != NULL) {
|
if (srat != NULL) {
|
||||||
|
@ -210,7 +236,7 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* SLIT */
|
/* SLIT */
|
||||||
current = ( current + 0x07) & -0x08;
|
current = (current + 0x07) & -0x08;
|
||||||
printk(BIOS_DEBUG, "ACPI: * SLIT at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * SLIT at %lx\n", current);
|
||||||
slit = (acpi_slit_t *) agesawrapper_getlateinitptr (PICK_SLIT);
|
slit = (acpi_slit_t *) agesawrapper_getlateinitptr (PICK_SLIT);
|
||||||
if (slit != NULL) {
|
if (slit != NULL) {
|
||||||
|
@ -224,7 +250,7 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* SSDT */
|
/* SSDT */
|
||||||
current = ( current + 0x0f) & -0x10;
|
current = (current + 0x0f) & -0x10;
|
||||||
printk(BIOS_DEBUG, "ACPI: * AGESA ALIB SSDT at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * AGESA ALIB SSDT at %lx\n", current);
|
||||||
alib = (acpi_header_t *)agesawrapper_getlateinitptr (PICK_ALIB);
|
alib = (acpi_header_t *)agesawrapper_getlateinitptr (PICK_ALIB);
|
||||||
if (alib != NULL) {
|
if (alib != NULL) {
|
||||||
|
@ -238,7 +264,7 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0 // The DSDT needs additional work for the AGESA SSDT Pstate table
|
#if 0 // The DSDT needs additional work for the AGESA SSDT Pstate table
|
||||||
current = ( current + 0x0f) & -0x10;
|
current = (current + 0x0f) & -0x10;
|
||||||
printk(BIOS_DEBUG, "ACPI: * AGESA SSDT Pstate at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * AGESA SSDT Pstate at %lx\n", current);
|
||||||
ssdt = (acpi_header_t *)agesawrapper_getlateinitptr (PICK_PSTATE);
|
ssdt = (acpi_header_t *)agesawrapper_getlateinitptr (PICK_PSTATE);
|
||||||
if (ssdt != NULL) {
|
if (ssdt != NULL) {
|
||||||
|
@ -252,7 +278,7 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
acpi_add_table(rsdp,ssdt);
|
acpi_add_table(rsdp,ssdt);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
current = ( current + 0x0f) & -0x10;
|
current = (current + 0x0f) & -0x10;
|
||||||
printk(BIOS_DEBUG, "ACPI: * coreboot TOM SSDT2 at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * coreboot TOM SSDT2 at %lx\n", current);
|
||||||
ssdt2 = (acpi_header_t *) current;
|
ssdt2 = (acpi_header_t *) current;
|
||||||
acpi_create_ssdt_generator(ssdt2, ACPI_TABLE_CREATOR);
|
acpi_create_ssdt_generator(ssdt2, ACPI_TABLE_CREATOR);
|
||||||
|
@ -283,6 +309,9 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
|
|
||||||
printk(BIOS_DEBUG, "fadt\n");
|
printk(BIOS_DEBUG, "fadt\n");
|
||||||
dump_mem(fadt, ((void *)fadt) + fadt->header.length);
|
dump_mem(fadt, ((void *)fadt) + fadt->header.length);
|
||||||
|
|
||||||
|
printk(BIOS_DEBUG, "hest\n");
|
||||||
|
dump_mem(hest, ((void *)hest) + hest->header.length);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
printk(BIOS_INFO, "ACPI: done.\n");
|
printk(BIOS_INFO, "ACPI: done.\n");
|
||||||
|
|
|
@ -104,6 +104,24 @@ unsigned long acpi_fill_madt(unsigned long current)
|
||||||
return current;
|
return current;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned long acpi_fill_hest(acpi_hest_t *hest)
|
||||||
|
{
|
||||||
|
void *addr, *current;
|
||||||
|
|
||||||
|
/* Skip the HEST header. */
|
||||||
|
current = (void *)(hest + 1);
|
||||||
|
|
||||||
|
addr = agesawrapper_getlateinitptr(PICK_WHEA_MCE);
|
||||||
|
if (addr != NULL)
|
||||||
|
current += acpi_create_hest_error_source(hest, current, 0, (void *)((u32)addr + 2), *(UINT16 *)addr - 2);
|
||||||
|
|
||||||
|
addr = agesawrapper_getlateinitptr(PICK_WHEA_CMC);
|
||||||
|
if (addr != NULL)
|
||||||
|
current += acpi_create_hest_error_source(hest, current, 1, (void *)((u32)addr + 2), *(UINT16 *)addr - 2);
|
||||||
|
|
||||||
|
return (unsigned long)current;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned long acpi_fill_slit(unsigned long current)
|
unsigned long acpi_fill_slit(unsigned long current)
|
||||||
{
|
{
|
||||||
// Not implemented
|
// Not implemented
|
||||||
|
@ -131,6 +149,7 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
acpi_header_t *ssdt;
|
acpi_header_t *ssdt;
|
||||||
acpi_header_t *ssdt2;
|
acpi_header_t *ssdt2;
|
||||||
acpi_header_t *alib;
|
acpi_header_t *alib;
|
||||||
|
acpi_hest_t *hest;
|
||||||
|
|
||||||
get_bus_conf(); /* it will get sblk, pci1234, hcdn, and sbdn */
|
get_bus_conf(); /* it will get sblk, pci1234, hcdn, and sbdn */
|
||||||
|
|
||||||
|
@ -153,7 +172,7 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
acpi_write_rsdt(rsdt);
|
acpi_write_rsdt(rsdt);
|
||||||
|
|
||||||
/* DSDT */
|
/* DSDT */
|
||||||
current = ( current + 0x07) & -0x08;
|
current = (current + 0x07) & -0x08;
|
||||||
printk(BIOS_DEBUG, "ACPI: * DSDT at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * DSDT at %lx\n", current);
|
||||||
dsdt = (acpi_header_t *)current;
|
dsdt = (acpi_header_t *)current;
|
||||||
memcpy(dsdt, &AmlCode, sizeof(acpi_header_t));
|
memcpy(dsdt, &AmlCode, sizeof(acpi_header_t));
|
||||||
|
@ -162,14 +181,14 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
printk(BIOS_DEBUG, "ACPI: * DSDT @ %p Length %x\n",dsdt,dsdt->length);
|
printk(BIOS_DEBUG, "ACPI: * DSDT @ %p Length %x\n",dsdt,dsdt->length);
|
||||||
|
|
||||||
/* FACS */ // it needs 64 bit alignment
|
/* FACS */ // it needs 64 bit alignment
|
||||||
current = ( current + 0x07) & -0x08;
|
current = (current + 0x07) & -0x08;
|
||||||
printk(BIOS_DEBUG, "ACPI: * FACS at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * FACS at %lx\n", current);
|
||||||
facs = (acpi_facs_t *) current;
|
facs = (acpi_facs_t *) current;
|
||||||
current += sizeof(acpi_facs_t);
|
current += sizeof(acpi_facs_t);
|
||||||
acpi_create_facs(facs);
|
acpi_create_facs(facs);
|
||||||
|
|
||||||
/* FADT */
|
/* FADT */
|
||||||
current = ( current + 0x07) & -0x08;
|
current = (current + 0x07) & -0x08;
|
||||||
printk(BIOS_DEBUG, "ACPI: * FADT at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * FADT at %lx\n", current);
|
||||||
fadt = (acpi_fadt_t *) current;
|
fadt = (acpi_fadt_t *) current;
|
||||||
current += sizeof(acpi_fadt_t);
|
current += sizeof(acpi_fadt_t);
|
||||||
|
@ -180,7 +199,7 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
/*
|
/*
|
||||||
* We explicitly add these tables later on:
|
* We explicitly add these tables later on:
|
||||||
*/
|
*/
|
||||||
current = ( current + 0x07) & -0x08;
|
current = (current + 0x07) & -0x08;
|
||||||
printk(BIOS_DEBUG, "ACPI: * HPET at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * HPET at %lx\n", current);
|
||||||
hpet = (acpi_hpet_t *) current;
|
hpet = (acpi_hpet_t *) current;
|
||||||
current += sizeof(acpi_hpet_t);
|
current += sizeof(acpi_hpet_t);
|
||||||
|
@ -188,15 +207,22 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
acpi_add_table(rsdp, hpet);
|
acpi_add_table(rsdp, hpet);
|
||||||
|
|
||||||
/* If we want to use HPET Timers Linux wants an MADT */
|
/* If we want to use HPET Timers Linux wants an MADT */
|
||||||
current = ( current + 0x07) & -0x08;
|
current = (current + 0x07) & -0x08;
|
||||||
printk(BIOS_DEBUG, "ACPI: * MADT at %lx\n",current);
|
printk(BIOS_DEBUG, "ACPI: * MADT at %lx\n",current);
|
||||||
madt = (acpi_madt_t *) current;
|
madt = (acpi_madt_t *) current;
|
||||||
acpi_create_madt(madt);
|
acpi_create_madt(madt);
|
||||||
current += madt->header.length;
|
current += madt->header.length;
|
||||||
acpi_add_table(rsdp, madt);
|
acpi_add_table(rsdp, madt);
|
||||||
|
|
||||||
|
/* HEST */
|
||||||
|
current = (current + 0x07) & -0x08;
|
||||||
|
hest = (acpi_hest_t *)current;
|
||||||
|
acpi_write_hest((void *)current);
|
||||||
|
acpi_add_table(rsdp, (void *)current);
|
||||||
|
current += ((acpi_header_t *)current)->length;
|
||||||
|
|
||||||
/* SRAT */
|
/* SRAT */
|
||||||
current = ( current + 0x07) & -0x08;
|
current = (current + 0x07) & -0x08;
|
||||||
printk(BIOS_DEBUG, "ACPI: * SRAT at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * SRAT at %lx\n", current);
|
||||||
srat = (acpi_srat_t *) agesawrapper_getlateinitptr (PICK_SRAT);
|
srat = (acpi_srat_t *) agesawrapper_getlateinitptr (PICK_SRAT);
|
||||||
if (srat != NULL) {
|
if (srat != NULL) {
|
||||||
|
@ -210,7 +236,7 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* SLIT */
|
/* SLIT */
|
||||||
current = ( current + 0x07) & -0x08;
|
current = (current + 0x07) & -0x08;
|
||||||
printk(BIOS_DEBUG, "ACPI: * SLIT at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * SLIT at %lx\n", current);
|
||||||
slit = (acpi_slit_t *) agesawrapper_getlateinitptr (PICK_SLIT);
|
slit = (acpi_slit_t *) agesawrapper_getlateinitptr (PICK_SLIT);
|
||||||
if (slit != NULL) {
|
if (slit != NULL) {
|
||||||
|
@ -224,7 +250,7 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* SSDT */
|
/* SSDT */
|
||||||
current = ( current + 0x0f) & -0x10;
|
current = (current + 0x0f) & -0x10;
|
||||||
printk(BIOS_DEBUG, "ACPI: * AGESA ALIB SSDT at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * AGESA ALIB SSDT at %lx\n", current);
|
||||||
alib = (acpi_header_t *)agesawrapper_getlateinitptr (PICK_ALIB);
|
alib = (acpi_header_t *)agesawrapper_getlateinitptr (PICK_ALIB);
|
||||||
if (alib != NULL) {
|
if (alib != NULL) {
|
||||||
|
@ -238,7 +264,7 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0 // The DSDT needs additional work for the AGESA SSDT Pstate table
|
#if 0 // The DSDT needs additional work for the AGESA SSDT Pstate table
|
||||||
current = ( current + 0x0f) & -0x10;
|
current = (current + 0x0f) & -0x10;
|
||||||
printk(BIOS_DEBUG, "ACPI: * AGESA SSDT Pstate at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * AGESA SSDT Pstate at %lx\n", current);
|
||||||
ssdt = (acpi_header_t *)agesawrapper_getlateinitptr (PICK_PSTATE);
|
ssdt = (acpi_header_t *)agesawrapper_getlateinitptr (PICK_PSTATE);
|
||||||
if (ssdt != NULL) {
|
if (ssdt != NULL) {
|
||||||
|
@ -252,7 +278,7 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
acpi_add_table(rsdp,ssdt);
|
acpi_add_table(rsdp,ssdt);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
current = ( current + 0x0f) & -0x10;
|
current = (current + 0x0f) & -0x10;
|
||||||
printk(BIOS_DEBUG, "ACPI: * coreboot TOM SSDT2 at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * coreboot TOM SSDT2 at %lx\n", current);
|
||||||
ssdt2 = (acpi_header_t *) current;
|
ssdt2 = (acpi_header_t *) current;
|
||||||
acpi_create_ssdt_generator(ssdt2, ACPI_TABLE_CREATOR);
|
acpi_create_ssdt_generator(ssdt2, ACPI_TABLE_CREATOR);
|
||||||
|
@ -283,6 +309,9 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
|
|
||||||
printk(BIOS_DEBUG, "fadt\n");
|
printk(BIOS_DEBUG, "fadt\n");
|
||||||
dump_mem(fadt, ((void *)fadt) + fadt->header.length);
|
dump_mem(fadt, ((void *)fadt) + fadt->header.length);
|
||||||
|
|
||||||
|
printk(BIOS_DEBUG, "hest\n");
|
||||||
|
dump_mem(hest, ((void *)hest) + hest->header.length);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
printk(BIOS_INFO, "ACPI: done.\n");
|
printk(BIOS_INFO, "ACPI: done.\n");
|
||||||
|
|
|
@ -122,6 +122,24 @@ unsigned long acpi_fill_madt(unsigned long current)
|
||||||
return current;
|
return current;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned long acpi_fill_hest(acpi_hest_t *hest)
|
||||||
|
{
|
||||||
|
void *addr, *current;
|
||||||
|
|
||||||
|
/* Skip the HEST header. */
|
||||||
|
current = (void *)(hest + 1);
|
||||||
|
|
||||||
|
addr = agesawrapper_getlateinitptr(PICK_WHEA_MCE);
|
||||||
|
if (addr != NULL)
|
||||||
|
current += acpi_create_hest_error_source(hest, current, 0, (void *)((u32)addr + 2), *(UINT16 *)addr - 2);
|
||||||
|
|
||||||
|
addr = agesawrapper_getlateinitptr(PICK_WHEA_CMC);
|
||||||
|
if (addr != NULL)
|
||||||
|
current += acpi_create_hest_error_source(hest, current, 1, (void *)((u32)addr + 2), *(UINT16 *)addr - 2);
|
||||||
|
|
||||||
|
return (unsigned long)current;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned long acpi_fill_slit(unsigned long current)
|
unsigned long acpi_fill_slit(unsigned long current)
|
||||||
{
|
{
|
||||||
// Not implemented
|
// Not implemented
|
||||||
|
@ -172,6 +190,7 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
acpi_header_t *ssdt;
|
acpi_header_t *ssdt;
|
||||||
acpi_header_t *ssdt2;
|
acpi_header_t *ssdt2;
|
||||||
acpi_header_t *alib;
|
acpi_header_t *alib;
|
||||||
|
acpi_hest_t *hest;
|
||||||
|
|
||||||
get_bus_conf(); /* it will get sblk, pci1234, hcdn, and sbdn */
|
get_bus_conf(); /* it will get sblk, pci1234, hcdn, and sbdn */
|
||||||
|
|
||||||
|
@ -234,6 +253,13 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
current += madt->header.length;
|
current += madt->header.length;
|
||||||
acpi_add_table(rsdp, madt);
|
acpi_add_table(rsdp, madt);
|
||||||
|
|
||||||
|
/* HEST */
|
||||||
|
current = (current + 0x07) & -0x08;
|
||||||
|
hest = (acpi_hest_t *)current;
|
||||||
|
acpi_write_hest((void *)current);
|
||||||
|
acpi_add_table(rsdp, (void *)current);
|
||||||
|
current += ((acpi_header_t *)current)->length;
|
||||||
|
|
||||||
/* SRAT */
|
/* SRAT */
|
||||||
current = ( current + 0x07) & -0x08;
|
current = ( current + 0x07) & -0x08;
|
||||||
printk(BIOS_DEBUG, "ACPI: * SRAT at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * SRAT at %lx\n", current);
|
||||||
|
@ -272,7 +298,7 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0 // The DSDT needs additional work for the AGESA SSDT Pstate table
|
#if 0 // The DSDT needs additional work for the AGESA SSDT Pstate table
|
||||||
current = ( current + 0x0f) & -0x10;
|
current = (current + 0x0f) & -0x10;
|
||||||
printk(BIOS_DEBUG, "ACPI: * AGESA SSDT Pstate at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * AGESA SSDT Pstate at %lx\n", current);
|
||||||
ssdt = (acpi_header_t *)agesawrapper_getlateinitptr (PICK_PSTATE);
|
ssdt = (acpi_header_t *)agesawrapper_getlateinitptr (PICK_PSTATE);
|
||||||
if (ssdt != NULL) {
|
if (ssdt != NULL) {
|
||||||
|
@ -285,7 +311,7 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
acpi_add_table(rsdp,ssdt);
|
acpi_add_table(rsdp,ssdt);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
current = ( current + 0x0f) & -0x10;
|
current = (current + 0x0f) & -0x10;
|
||||||
printk(BIOS_DEBUG, "ACPI: * coreboot TOM SSDT2 at %lx\n", current);
|
printk(BIOS_DEBUG, "ACPI: * coreboot TOM SSDT2 at %lx\n", current);
|
||||||
ssdt2 = (acpi_header_t *) current;
|
ssdt2 = (acpi_header_t *) current;
|
||||||
acpi_create_ssdt_generator(ssdt2, ACPI_TABLE_CREATOR);
|
acpi_create_ssdt_generator(ssdt2, ACPI_TABLE_CREATOR);
|
||||||
|
@ -313,6 +339,9 @@ unsigned long write_acpi_tables(unsigned long start)
|
||||||
|
|
||||||
printk(BIOS_DEBUG, "fadt\n");
|
printk(BIOS_DEBUG, "fadt\n");
|
||||||
dump_mem(fadt, ((void *)fadt) + fadt->header.length);
|
dump_mem(fadt, ((void *)fadt) + fadt->header.length);
|
||||||
|
|
||||||
|
printk(BIOS_DEBUG, "hest\n");
|
||||||
|
dump_mem(hest, ((void *)hest) + hest->header.length);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
printk(BIOS_INFO, "ACPI: done.\n");
|
printk(BIOS_INFO, "ACPI: done.\n");
|
||||||
|
|
Loading…
Reference in New Issue