summaryrefslogtreecommitdiff
path: root/src/arch
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch')
-rw-r--r--src/arch/x86/acpi.c25
-rw-r--r--src/arch/x86/include/arch/acpi.h29
2 files changed, 54 insertions, 0 deletions
diff --git a/src/arch/x86/acpi.c b/src/arch/x86/acpi.c
index 53c41359d6..703bfa1e9b 100644
--- a/src/arch/x86/acpi.c
+++ b/src/arch/x86/acpi.c
@@ -589,6 +589,31 @@ void acpi_create_hpet(acpi_hpet_t *hpet)
header->checksum = acpi_checksum((void *)hpet, sizeof(acpi_hpet_t));
}
+void acpi_create_vfct(struct device *device,
+ struct acpi_vfct *vfct,
+ unsigned long (*acpi_fill_vfct)(struct device *device, struct acpi_vfct *vfct_struct, unsigned long current))
+{
+ acpi_header_t *header = &(vfct->header);
+ unsigned long current = (unsigned long)vfct + sizeof(struct acpi_vfct);
+
+ memset((void *)vfct, 0, sizeof(struct acpi_vfct));
+
+ /* Fill out header fields. */
+ memcpy(header->signature, "VFCT", 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(struct acpi_vfct);
+ header->revision = 1; /* ACPI 1.0: N/A, ACPI 2.0/3.0/4.0: 1 */
+
+ current = acpi_fill_vfct(device, vfct, current);
+
+ /* (Re)calculate length and checksum. */
+ header->length = current - (unsigned long)vfct;
+ header->checksum = acpi_checksum((void *)vfct, header->length);
+}
+
void acpi_create_ivrs(acpi_ivrs_t *ivrs,
unsigned long (*acpi_fill_ivrs)(acpi_ivrs_t* ivrs_struct, unsigned long current))
{
diff --git a/src/arch/x86/include/arch/acpi.h b/src/arch/x86/include/arch/acpi.h
index 6854573d8c..9dfbe2f6c0 100644
--- a/src/arch/x86/include/arch/acpi.h
+++ b/src/arch/x86/include/arch/acpi.h
@@ -220,6 +220,30 @@ typedef struct acpi_madt {
u32 flags; /* Multiple APIC flags */
} __attribute__ ((packed)) acpi_madt_t;
+/* VFCT image header */
+struct acpi_vfct_image_hdr {
+ u32 PCIBus;
+ u32 PCIDevice;
+ u32 PCIFunction;
+ u16 VendorID;
+ u16 DeviceID;
+ u16 SSVID;
+ u16 SSID;
+ u32 Revision;
+ u32 ImageLength;
+ u8 VbiosContent; // dummy - copy VBIOS here
+} __attribute__ ((packed));
+
+/* VFCT (VBIOS Fetch Table) */
+struct acpi_vfct {
+ struct acpi_table_header header;
+ u8 TableUUID[16];
+ u32 VBIOSImageOffset;
+ u32 Lib1ImageOffset;
+ u32 Reserved[4];
+ struct acpi_vfct_image_hdr image_hdr;
+} __attribute__ ((packed));
+
typedef struct acpi_ivrs_info {
} __attribute__ ((packed)) acpi_ivrs_info_t;
@@ -601,6 +625,11 @@ void acpi_create_srat(acpi_srat_t *srat,
void acpi_create_slit(acpi_slit_t *slit,
unsigned long (*acpi_fill_slit)(unsigned long current));
+void acpi_create_vfct(struct device *device,
+ struct acpi_vfct *vfct,
+ unsigned long (*acpi_fill_vfct)(struct device *device,
+ struct acpi_vfct *vfct_struct, unsigned long current));
+
void acpi_create_ivrs(acpi_ivrs_t *ivrs,
unsigned long (*acpi_fill_ivrs)(acpi_ivrs_t* ivrs_struct, unsigned long current));