ACPI: slic support

Export SLIC table from file in CBFS.

Change-Id: Id0e7fe0a49b9cd50b5e43cd15030e1c2098728ec
Signed-off-by: Vladimir Serbinenko <phcoder@gmail.com>
Reviewed-on: http://review.coreboot.org/7202
Reviewed-by: Patrick Georgi <pgeorgi@google.com>
Tested-by: build bot (Jenkins)
This commit is contained in:
Vladimir Serbinenko 2014-10-26 20:42:08 +01:00
parent 61bb37e205
commit 351fefc452
7 changed files with 43 additions and 75 deletions

View File

@ -406,10 +406,6 @@ config HAVE_ACPI_RESUME
bool bool
default n default n
config HAVE_ACPI_SLIC
bool
default n
config HAVE_HARD_RESET config HAVE_HARD_RESET
bool bool
default n default n

View File

@ -33,6 +33,7 @@
#include <cbmem.h> #include <cbmem.h>
#include <cpu/x86/lapic_def.h> #include <cpu/x86/lapic_def.h>
#include <cpu/cpu.h> #include <cpu/cpu.h>
#include <cbfs.h>
#if CONFIG_COLLECT_TIMESTAMPS #if CONFIG_COLLECT_TIMESTAMPS
#include <timestamp.h> #include <timestamp.h>
#endif #endif
@ -485,14 +486,14 @@ void acpi_create_facs(acpi_facs_t *facs)
facs->version = 1; /* ACPI 1.0: 0, ACPI 2.0/3.0: 1, ACPI 4.0: 2 */ facs->version = 1; /* ACPI 1.0: 0, ACPI 2.0/3.0: 1, ACPI 4.0: 2 */
} }
void acpi_write_rsdt(acpi_rsdt_t *rsdt) static void acpi_write_rsdt(acpi_rsdt_t *rsdt, char *oem_id, char *oem_table_id)
{ {
acpi_header_t *header = &(rsdt->header); acpi_header_t *header = &(rsdt->header);
/* Fill out header fields. */ /* Fill out header fields. */
memcpy(header->signature, "RSDT", 4); memcpy(header->signature, "RSDT", 4);
memcpy(header->oem_id, OEM_ID, 6); memcpy(header->oem_id, oem_id, 6);
memcpy(header->oem_table_id, ACPI_TABLE_CREATOR, 8); memcpy(header->oem_table_id, oem_table_id, 8);
memcpy(header->asl_compiler_id, ASLC, 4); memcpy(header->asl_compiler_id, ASLC, 4);
header->length = sizeof(acpi_rsdt_t); header->length = sizeof(acpi_rsdt_t);
@ -504,14 +505,14 @@ void acpi_write_rsdt(acpi_rsdt_t *rsdt)
header->checksum = acpi_checksum((void *)rsdt, sizeof(acpi_rsdt_t)); header->checksum = acpi_checksum((void *)rsdt, sizeof(acpi_rsdt_t));
} }
void acpi_write_xsdt(acpi_xsdt_t *xsdt) static void acpi_write_xsdt(acpi_xsdt_t *xsdt, char *oem_id, char *oem_table_id)
{ {
acpi_header_t *header = &(xsdt->header); acpi_header_t *header = &(xsdt->header);
/* Fill out header fields. */ /* Fill out header fields. */
memcpy(header->signature, "XSDT", 4); memcpy(header->signature, "XSDT", 4);
memcpy(header->oem_id, OEM_ID, 6); memcpy(header->oem_id, oem_id, 6);
memcpy(header->oem_table_id, ACPI_TABLE_CREATOR, 8); memcpy(header->oem_table_id, oem_table_id, 8);
memcpy(header->asl_compiler_id, ASLC, 4); memcpy(header->asl_compiler_id, ASLC, 4);
header->length = sizeof(acpi_xsdt_t); header->length = sizeof(acpi_xsdt_t);
@ -523,12 +524,13 @@ void acpi_write_xsdt(acpi_xsdt_t *xsdt)
header->checksum = acpi_checksum((void *)xsdt, sizeof(acpi_xsdt_t)); header->checksum = acpi_checksum((void *)xsdt, sizeof(acpi_xsdt_t));
} }
void acpi_write_rsdp(acpi_rsdp_t *rsdp, acpi_rsdt_t *rsdt, acpi_xsdt_t *xsdt) static void acpi_write_rsdp(acpi_rsdp_t *rsdp, acpi_rsdt_t *rsdt,
acpi_xsdt_t *xsdt, char *oem_id)
{ {
memset(rsdp, 0, sizeof(acpi_rsdp_t)); memset(rsdp, 0, sizeof(acpi_rsdp_t));
memcpy(rsdp->signature, RSDP_SIG, 8); memcpy(rsdp->signature, RSDP_SIG, 8);
memcpy(rsdp->oem_id, OEM_ID, 6); memcpy(rsdp->oem_id, oem_id, 6);
rsdp->length = sizeof(acpi_rsdp_t); rsdp->length = sizeof(acpi_rsdp_t);
rsdp->rsdt_address = (u32)rsdt; rsdp->rsdt_address = (u32)rsdt;
@ -686,15 +688,15 @@ unsigned long write_acpi_tables(unsigned long start)
acpi_xsdt_t *xsdt; acpi_xsdt_t *xsdt;
acpi_fadt_t *fadt; acpi_fadt_t *fadt;
acpi_facs_t *facs; acpi_facs_t *facs;
#if CONFIG_HAVE_ACPI_SLIC acpi_header_t *slic_file, *slic;
acpi_header_t *slic;
#endif
acpi_header_t *ssdt; acpi_header_t *ssdt;
acpi_header_t *dsdt; acpi_header_t *dsdt;
acpi_mcfg_t *mcfg; acpi_mcfg_t *mcfg;
acpi_madt_t *madt; acpi_madt_t *madt;
struct device *dev; struct device *dev;
unsigned long fw; unsigned long fw;
size_t slic_size;
char oem_id[6], oem_table_id[8];
current = start; current = start;
@ -705,6 +707,22 @@ unsigned long write_acpi_tables(unsigned long start)
if (fw) if (fw)
return fw; return fw;
slic_file = cbfs_get_file_content(CBFS_DEFAULT_MEDIA,
CONFIG_CBFS_PREFIX "/slic",
CBFS_TYPE_RAW, &slic_size);
if (slic_file && (slic_file->length > slic_size
|| slic_file->length < sizeof (acpi_header_t))) {
slic_file = 0;
}
if (slic_file) {
memcpy(oem_id, slic_file->oem_id, 6);
memcpy(oem_table_id, slic_file->oem_table_id, 8);
} else {
memcpy(oem_id, OEM_ID, 6);
memcpy(oem_table_id, ACPI_TABLE_CREATOR, 8);
}
printk(BIOS_INFO, "ACPI: Writing ACPI tables at %lx.\n", start); printk(BIOS_INFO, "ACPI: Writing ACPI tables at %lx.\n", start);
/* We need at least an RSDP and an RSDT Table */ /* We need at least an RSDP and an RSDT Table */
@ -721,9 +739,9 @@ unsigned long write_acpi_tables(unsigned long start)
/* clear all table memory */ /* clear all table memory */
memset((void *) start, 0, current - start); memset((void *) start, 0, current - start);
acpi_write_rsdp(rsdp, rsdt, xsdt); acpi_write_rsdp(rsdp, rsdt, xsdt, oem_id);
acpi_write_rsdt(rsdt); acpi_write_rsdt(rsdt, oem_id, oem_table_id);
acpi_write_xsdt(xsdt); acpi_write_xsdt(xsdt, oem_id, oem_table_id);
printk(BIOS_DEBUG, "ACPI: * FACS\n"); printk(BIOS_DEBUG, "ACPI: * FACS\n");
facs = (acpi_facs_t *) current; facs = (acpi_facs_t *) current;
@ -764,13 +782,14 @@ unsigned long write_acpi_tables(unsigned long start)
acpi_create_fadt(fadt, facs, dsdt); acpi_create_fadt(fadt, facs, dsdt);
acpi_add_table(rsdp, fadt); acpi_add_table(rsdp, fadt);
#if CONFIG_HAVE_ACPI_SLIC if (slic_file) {
printk(BIOS_DEBUG, "ACPI: * SLIC\n"); printk(BIOS_DEBUG, "ACPI: * SLIC\n");
slic = (acpi_header_t *)current; slic = (acpi_header_t *)current;
current += acpi_create_slic(current); memcpy(slic, slic_file, slic_file->length);
ALIGN_CURRENT; current += slic_file->length;
acpi_add_table(rsdp, slic); ALIGN_CURRENT;
#endif acpi_add_table(rsdp, slic);
}
printk(BIOS_DEBUG, "ACPI: * SSDT\n"); printk(BIOS_DEBUG, "ACPI: * SSDT\n");
ssdt = (acpi_header_t *)current; ssdt = (acpi_header_t *)current;

View File

@ -147,9 +147,9 @@ void write_tables(void)
acpi_rsdp_t *low_rsdp = (acpi_rsdp_t *)rom_table_end, acpi_rsdp_t *low_rsdp = (acpi_rsdp_t *)rom_table_end,
*high_rsdp = (acpi_rsdp_t *)acpi_start; *high_rsdp = (acpi_rsdp_t *)acpi_start;
acpi_write_rsdp(low_rsdp, /* Technically rsdp length varies but coreboot always
(acpi_rsdt_t *)(high_rsdp->rsdt_address), writes longest size available. */
(acpi_xsdt_t *)((unsigned long)high_rsdp->xsdt_address)); memcpy(low_rsdp, high_rsdp, sizeof(acpi_rsdp_t));
} else { } else {
printk(BIOS_ERR, "ERROR: Didn't find RSDP in high table.\n"); printk(BIOS_ERR, "ERROR: Didn't find RSDP in high table.\n");
} }

View File

@ -547,14 +547,6 @@ void acpi_dmar_drhd_fixup(unsigned long base, unsigned long current);
unsigned long acpi_create_dmar_drhd_ds_pci(unsigned long current, u8 segment, unsigned long acpi_create_dmar_drhd_ds_pci(unsigned long current, u8 segment,
u8 dev, u8 fn); u8 dev, u8 fn);
#if CONFIG_HAVE_ACPI_SLIC
unsigned long acpi_create_slic(unsigned long current);
#endif
void acpi_write_rsdt(acpi_rsdt_t *rsdt);
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_hest(acpi_hest_t *hest); 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_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); unsigned long acpi_fill_hest(acpi_hest_t *hest);

View File

@ -35,7 +35,6 @@ config BOARD_SPECIFIC_OPTIONS # dummy
select HAVE_MP_TABLE select HAVE_MP_TABLE
select HAVE_OPTION_TABLE select HAVE_OPTION_TABLE
select HAVE_ACPI_RESUME select HAVE_ACPI_RESUME
select HAVE_ACPI_SLIC
select UDELAY_LAPIC select UDELAY_LAPIC
select BOARD_ROMSIZE_KB_1024 select BOARD_ROMSIZE_KB_1024
select CHANNEL_XOR_RANDOMIZATION select CHANNEL_XOR_RANDOMIZATION

View File

@ -17,4 +17,3 @@
## Foundation, Inc. ## Foundation, Inc.
## ##
ramstage-$(CONFIG_HAVE_ACPI_SLIC) += acpi_slic.c

View File

@ -1,37 +0,0 @@
/*
* This file is part of the coreboot project.
*
* Copyright (C) 2009 coresystems GmbH
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; version 2 of
* the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc.
*/
#include <string.h>
#include <device/pci.h>
#include <arch/acpi.h>
static const char slic[0x4] = {
0x53, 0x4c, 0x49, 0x43 /* incomplete. */
/* If you wish to compile coreboot images with a windows license key
* built in, you need to extract the ACPI SLIC from your machine and
* add it here.
*/
};
unsigned long acpi_create_slic(unsigned long current)
{
memcpy((void *) current, slic, sizeof(slic));
return sizeof(slic);
}