acpi: support specified oem table id for build_header

Let build_header() support specified OEM table id so that we can build
multiple SSDT later

If the oem table id is not specified (aka, NULL), we use the default id
instead as the previous behavior

Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Xiao Guangrong <guangrong.xiao@linux.intel.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
Xiao Guangrong 2015-12-02 15:20:57 +08:00 committed by Michael S. Tsirkin
parent 5c42eef243
commit 8870ca0e94
4 changed files with 30 additions and 21 deletions

View File

@ -1242,14 +1242,21 @@ Aml *aml_unicode(const char *str)
void void
build_header(GArray *linker, GArray *table_data, build_header(GArray *linker, GArray *table_data,
AcpiTableHeader *h, const char *sig, int len, uint8_t rev) AcpiTableHeader *h, const char *sig, int len, uint8_t rev,
const char *oem_table_id)
{ {
memcpy(&h->signature, sig, 4); memcpy(&h->signature, sig, 4);
h->length = cpu_to_le32(len); h->length = cpu_to_le32(len);
h->revision = rev; h->revision = rev;
memcpy(h->oem_id, ACPI_BUILD_APPNAME6, 6); memcpy(h->oem_id, ACPI_BUILD_APPNAME6, 6);
memcpy(h->oem_table_id, ACPI_BUILD_APPNAME4, 4);
memcpy(h->oem_table_id + 4, sig, 4); if (oem_table_id) {
strncpy((char *)h->oem_table_id, oem_table_id, sizeof(h->oem_table_id));
} else {
memcpy(h->oem_table_id, ACPI_BUILD_APPNAME4, 4);
memcpy(h->oem_table_id + 4, sig, 4);
}
h->oem_revision = cpu_to_le32(1); h->oem_revision = cpu_to_le32(1);
memcpy(h->asl_compiler_id, ACPI_BUILD_APPNAME4, 4); memcpy(h->asl_compiler_id, ACPI_BUILD_APPNAME4, 4);
h->asl_compiler_revision = cpu_to_le32(1); h->asl_compiler_revision = cpu_to_le32(1);
@ -1316,5 +1323,5 @@ build_rsdt(GArray *table_data, GArray *linker, GArray *table_offsets)
sizeof(uint32_t)); sizeof(uint32_t));
} }
build_header(linker, table_data, build_header(linker, table_data,
(void *)rsdt, "RSDT", rsdt_len, 1); (void *)rsdt, "RSDT", rsdt_len, 1, NULL);
} }

View File

@ -423,7 +423,8 @@ build_spcr(GArray *table_data, GArray *linker, VirtGuestInfo *guest_info)
spcr->pci_device_id = 0xffff; /* PCI Device ID: not a PCI device */ spcr->pci_device_id = 0xffff; /* PCI Device ID: not a PCI device */
spcr->pci_vendor_id = 0xffff; /* PCI Vendor ID: not a PCI device */ spcr->pci_vendor_id = 0xffff; /* PCI Vendor ID: not a PCI device */
build_header(linker, table_data, (void *)spcr, "SPCR", sizeof(*spcr), 2); build_header(linker, table_data, (void *)spcr, "SPCR", sizeof(*spcr), 2,
NULL);
} }
static void static void
@ -442,7 +443,7 @@ build_mcfg(GArray *table_data, GArray *linker, VirtGuestInfo *guest_info)
mcfg->allocation[0].end_bus_number = (memmap[VIRT_PCIE_ECAM].size mcfg->allocation[0].end_bus_number = (memmap[VIRT_PCIE_ECAM].size
/ PCIE_MMCFG_SIZE_MIN) - 1; / PCIE_MMCFG_SIZE_MIN) - 1;
build_header(linker, table_data, (void *)mcfg, "MCFG", len, 1); build_header(linker, table_data, (void *)mcfg, "MCFG", len, 1, NULL);
} }
/* GTDT */ /* GTDT */
@ -468,7 +469,7 @@ build_gtdt(GArray *table_data, GArray *linker)
build_header(linker, table_data, build_header(linker, table_data,
(void *)(table_data->data + gtdt_start), "GTDT", (void *)(table_data->data + gtdt_start), "GTDT",
table_data->len - gtdt_start, 2); table_data->len - gtdt_start, 2, NULL);
} }
/* MADT */ /* MADT */
@ -530,7 +531,7 @@ build_madt(GArray *table_data, GArray *linker, VirtGuestInfo *guest_info,
build_header(linker, table_data, build_header(linker, table_data,
(void *)(table_data->data + madt_start), "APIC", (void *)(table_data->data + madt_start), "APIC",
table_data->len - madt_start, 3); table_data->len - madt_start, 3, NULL);
} }
/* FADT */ /* FADT */
@ -555,7 +556,7 @@ build_fadt(GArray *table_data, GArray *linker, unsigned dsdt)
sizeof fadt->dsdt); sizeof fadt->dsdt);
build_header(linker, table_data, build_header(linker, table_data,
(void *)fadt, "FACP", sizeof(*fadt), 5); (void *)fadt, "FACP", sizeof(*fadt), 5, NULL);
} }
/* DSDT */ /* DSDT */
@ -591,7 +592,7 @@ build_dsdt(GArray *table_data, GArray *linker, VirtGuestInfo *guest_info)
g_array_append_vals(table_data, dsdt->buf->data, dsdt->buf->len); g_array_append_vals(table_data, dsdt->buf->data, dsdt->buf->len);
build_header(linker, table_data, build_header(linker, table_data,
(void *)(table_data->data + table_data->len - dsdt->buf->len), (void *)(table_data->data + table_data->len - dsdt->buf->len),
"DSDT", dsdt->buf->len, 2); "DSDT", dsdt->buf->len, 2, NULL);
free_aml_allocator(); free_aml_allocator();
} }

View File

@ -361,7 +361,7 @@ build_fadt(GArray *table_data, GArray *linker, AcpiPmInfo *pm,
fadt_setup(fadt, pm); fadt_setup(fadt, pm);
build_header(linker, table_data, build_header(linker, table_data,
(void *)fadt, "FACP", sizeof(*fadt), 1); (void *)fadt, "FACP", sizeof(*fadt), 1, NULL);
} }
static void static void
@ -431,7 +431,7 @@ build_madt(GArray *table_data, GArray *linker, AcpiCpuInfo *cpu,
build_header(linker, table_data, build_header(linker, table_data,
(void *)(table_data->data + madt_start), "APIC", (void *)(table_data->data + madt_start), "APIC",
table_data->len - madt_start, 1); table_data->len - madt_start, 1, NULL);
} }
/* Assign BSEL property to all buses. In the future, this can be changed /* Assign BSEL property to all buses. In the future, this can be changed
@ -1374,7 +1374,7 @@ build_ssdt(GArray *table_data, GArray *linker,
g_array_append_vals(table_data, ssdt->buf->data, ssdt->buf->len); g_array_append_vals(table_data, ssdt->buf->data, ssdt->buf->len);
build_header(linker, table_data, build_header(linker, table_data,
(void *)(table_data->data + table_data->len - ssdt->buf->len), (void *)(table_data->data + table_data->len - ssdt->buf->len),
"SSDT", ssdt->buf->len, 1); "SSDT", ssdt->buf->len, 1, NULL);
free_aml_allocator(); free_aml_allocator();
} }
@ -1390,7 +1390,7 @@ build_hpet(GArray *table_data, GArray *linker)
hpet->timer_block_id = cpu_to_le32(0x8086a201); hpet->timer_block_id = cpu_to_le32(0x8086a201);
hpet->addr.address = cpu_to_le64(HPET_BASE); hpet->addr.address = cpu_to_le64(HPET_BASE);
build_header(linker, table_data, build_header(linker, table_data,
(void *)hpet, "HPET", sizeof(*hpet), 1); (void *)hpet, "HPET", sizeof(*hpet), 1, NULL);
} }
static void static void
@ -1413,7 +1413,7 @@ build_tpm_tcpa(GArray *table_data, GArray *linker, GArray *tcpalog)
sizeof(tcpa->log_area_start_address)); sizeof(tcpa->log_area_start_address));
build_header(linker, table_data, build_header(linker, table_data,
(void *)tcpa, "TCPA", sizeof(*tcpa), 2); (void *)tcpa, "TCPA", sizeof(*tcpa), 2, NULL);
acpi_data_push(tcpalog, TPM_LOG_AREA_MINIMUM_SIZE); acpi_data_push(tcpalog, TPM_LOG_AREA_MINIMUM_SIZE);
} }
@ -1430,7 +1430,7 @@ build_tpm2(GArray *table_data, GArray *linker)
tpm2_ptr->start_method = cpu_to_le32(TPM2_START_METHOD_MMIO); tpm2_ptr->start_method = cpu_to_le32(TPM2_START_METHOD_MMIO);
build_header(linker, table_data, build_header(linker, table_data,
(void *)tpm2_ptr, "TPM2", sizeof(*tpm2_ptr), 4); (void *)tpm2_ptr, "TPM2", sizeof(*tpm2_ptr), 4, NULL);
} }
typedef enum { typedef enum {
@ -1544,7 +1544,7 @@ build_srat(GArray *table_data, GArray *linker, PcGuestInfo *guest_info)
build_header(linker, table_data, build_header(linker, table_data,
(void *)(table_data->data + srat_start), (void *)(table_data->data + srat_start),
"SRAT", "SRAT",
table_data->len - srat_start, 1); table_data->len - srat_start, 1, NULL);
} }
static void static void
@ -1573,7 +1573,7 @@ build_mcfg_q35(GArray *table_data, GArray *linker, AcpiMcfgInfo *info)
} else { } else {
sig = "MCFG"; sig = "MCFG";
} }
build_header(linker, table_data, (void *)mcfg, sig, len, 1); build_header(linker, table_data, (void *)mcfg, sig, len, 1, NULL);
} }
static void static void
@ -1597,7 +1597,7 @@ build_dmar_q35(GArray *table_data, GArray *linker)
drhd->address = cpu_to_le64(Q35_HOST_BRIDGE_IOMMU_ADDR); drhd->address = cpu_to_le64(Q35_HOST_BRIDGE_IOMMU_ADDR);
build_header(linker, table_data, (void *)(table_data->data + dmar_start), build_header(linker, table_data, (void *)(table_data->data + dmar_start),
"DMAR", table_data->len - dmar_start, 1); "DMAR", table_data->len - dmar_start, 1, NULL);
} }
static void static void
@ -1612,7 +1612,7 @@ build_dsdt(GArray *table_data, GArray *linker, AcpiMiscInfo *misc)
memset(dsdt, 0, sizeof *dsdt); memset(dsdt, 0, sizeof *dsdt);
build_header(linker, table_data, dsdt, "DSDT", build_header(linker, table_data, dsdt, "DSDT",
misc->dsdt_size, 1); misc->dsdt_size, 1, NULL);
} }
static GArray * static GArray *

View File

@ -310,7 +310,8 @@ Aml *aml_unicode(const char *str);
void void
build_header(GArray *linker, GArray *table_data, build_header(GArray *linker, GArray *table_data,
AcpiTableHeader *h, const char *sig, int len, uint8_t rev); AcpiTableHeader *h, const char *sig, int len, uint8_t rev,
const char *oem_table_id);
void *acpi_data_push(GArray *table_data, unsigned size); void *acpi_data_push(GArray *table_data, unsigned size);
unsigned acpi_data_len(GArray *table); unsigned acpi_data_len(GArray *table);
void acpi_add_table(GArray *table_offsets, GArray *table_data); void acpi_add_table(GArray *table_offsets, GArray *table_data);