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:
		
				
					committed by
					
						 Michael S. Tsirkin
						Michael S. Tsirkin
					
				
			
			
				
	
			
			
			
						parent
						
							5c42eef243
						
					
				
				
					commit
					8870ca0e94
				
			| @@ -1242,14 +1242,21 @@ Aml *aml_unicode(const char *str) | ||||
|  | ||||
| void | ||||
| 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); | ||||
|     h->length = cpu_to_le32(len); | ||||
|     h->revision = rev; | ||||
|     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); | ||||
|     memcpy(h->asl_compiler_id, ACPI_BUILD_APPNAME4, 4); | ||||
|     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)); | ||||
|     } | ||||
|     build_header(linker, table_data, | ||||
|                  (void *)rsdt, "RSDT", rsdt_len, 1); | ||||
|                  (void *)rsdt, "RSDT", rsdt_len, 1, NULL); | ||||
| } | ||||
|   | ||||
| @@ -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_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 | ||||
| @@ -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 | ||||
|                                           / 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 */ | ||||
| @@ -468,7 +469,7 @@ build_gtdt(GArray *table_data, GArray *linker) | ||||
|  | ||||
|     build_header(linker, table_data, | ||||
|                  (void *)(table_data->data + gtdt_start), "GTDT", | ||||
|                  table_data->len - gtdt_start, 2); | ||||
|                  table_data->len - gtdt_start, 2, NULL); | ||||
| } | ||||
|  | ||||
| /* MADT */ | ||||
| @@ -530,7 +531,7 @@ build_madt(GArray *table_data, GArray *linker, VirtGuestInfo *guest_info, | ||||
|  | ||||
|     build_header(linker, table_data, | ||||
|                  (void *)(table_data->data + madt_start), "APIC", | ||||
|                  table_data->len - madt_start, 3); | ||||
|                  table_data->len - madt_start, 3, NULL); | ||||
| } | ||||
|  | ||||
| /* FADT */ | ||||
| @@ -555,7 +556,7 @@ build_fadt(GArray *table_data, GArray *linker, unsigned dsdt) | ||||
|                                    sizeof fadt->dsdt); | ||||
|  | ||||
|     build_header(linker, table_data, | ||||
|                  (void *)fadt, "FACP", sizeof(*fadt), 5); | ||||
|                  (void *)fadt, "FACP", sizeof(*fadt), 5, NULL); | ||||
| } | ||||
|  | ||||
| /* 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); | ||||
|     build_header(linker, table_data, | ||||
|         (void *)(table_data->data + table_data->len - dsdt->buf->len), | ||||
|         "DSDT", dsdt->buf->len, 2); | ||||
|         "DSDT", dsdt->buf->len, 2, NULL); | ||||
|     free_aml_allocator(); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -361,7 +361,7 @@ build_fadt(GArray *table_data, GArray *linker, AcpiPmInfo *pm, | ||||
|     fadt_setup(fadt, pm); | ||||
|  | ||||
|     build_header(linker, table_data, | ||||
|                  (void *)fadt, "FACP", sizeof(*fadt), 1); | ||||
|                  (void *)fadt, "FACP", sizeof(*fadt), 1, NULL); | ||||
| } | ||||
|  | ||||
| static void | ||||
| @@ -431,7 +431,7 @@ build_madt(GArray *table_data, GArray *linker, AcpiCpuInfo *cpu, | ||||
|  | ||||
|     build_header(linker, table_data, | ||||
|                  (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 | ||||
| @@ -1374,7 +1374,7 @@ build_ssdt(GArray *table_data, GArray *linker, | ||||
|     g_array_append_vals(table_data, ssdt->buf->data, ssdt->buf->len); | ||||
|     build_header(linker, table_data, | ||||
|         (void *)(table_data->data + table_data->len - ssdt->buf->len), | ||||
|         "SSDT", ssdt->buf->len, 1); | ||||
|         "SSDT", ssdt->buf->len, 1, NULL); | ||||
|     free_aml_allocator(); | ||||
| } | ||||
|  | ||||
| @@ -1390,7 +1390,7 @@ build_hpet(GArray *table_data, GArray *linker) | ||||
|     hpet->timer_block_id = cpu_to_le32(0x8086a201); | ||||
|     hpet->addr.address = cpu_to_le64(HPET_BASE); | ||||
|     build_header(linker, table_data, | ||||
|                  (void *)hpet, "HPET", sizeof(*hpet), 1); | ||||
|                  (void *)hpet, "HPET", sizeof(*hpet), 1, NULL); | ||||
| } | ||||
|  | ||||
| static void | ||||
| @@ -1413,7 +1413,7 @@ build_tpm_tcpa(GArray *table_data, GArray *linker, GArray *tcpalog) | ||||
|                                    sizeof(tcpa->log_area_start_address)); | ||||
|  | ||||
|     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); | ||||
| } | ||||
| @@ -1430,7 +1430,7 @@ build_tpm2(GArray *table_data, GArray *linker) | ||||
|     tpm2_ptr->start_method = cpu_to_le32(TPM2_START_METHOD_MMIO); | ||||
|  | ||||
|     build_header(linker, table_data, | ||||
|                  (void *)tpm2_ptr, "TPM2", sizeof(*tpm2_ptr), 4); | ||||
|                  (void *)tpm2_ptr, "TPM2", sizeof(*tpm2_ptr), 4, NULL); | ||||
| } | ||||
|  | ||||
| typedef enum { | ||||
| @@ -1544,7 +1544,7 @@ build_srat(GArray *table_data, GArray *linker, PcGuestInfo *guest_info) | ||||
|     build_header(linker, table_data, | ||||
|                  (void *)(table_data->data + srat_start), | ||||
|                  "SRAT", | ||||
|                  table_data->len - srat_start, 1); | ||||
|                  table_data->len - srat_start, 1, NULL); | ||||
| } | ||||
|  | ||||
| static void | ||||
| @@ -1573,7 +1573,7 @@ build_mcfg_q35(GArray *table_data, GArray *linker, AcpiMcfgInfo *info) | ||||
|     } else { | ||||
|         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 | ||||
| @@ -1597,7 +1597,7 @@ build_dmar_q35(GArray *table_data, GArray *linker) | ||||
|     drhd->address = cpu_to_le64(Q35_HOST_BRIDGE_IOMMU_ADDR); | ||||
|  | ||||
|     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 | ||||
| @@ -1612,7 +1612,7 @@ build_dsdt(GArray *table_data, GArray *linker, AcpiMiscInfo *misc) | ||||
|  | ||||
|     memset(dsdt, 0, sizeof *dsdt); | ||||
|     build_header(linker, table_data, dsdt, "DSDT", | ||||
|                  misc->dsdt_size, 1); | ||||
|                  misc->dsdt_size, 1, NULL); | ||||
| } | ||||
|  | ||||
| static GArray * | ||||
|   | ||||
| @@ -310,7 +310,8 @@ Aml *aml_unicode(const char *str); | ||||
|  | ||||
| void | ||||
| 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); | ||||
| unsigned acpi_data_len(GArray *table); | ||||
| void acpi_add_table(GArray *table_offsets, GArray *table_data); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user