[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[RFC PATCH 06/12] hw/arm/virt-acpi-build: distinguish possible and prese
From: |
Ying Fang |
Subject: |
[RFC PATCH 06/12] hw/arm/virt-acpi-build: distinguish possible and present cpus |
Date: |
Thu, 17 Sep 2020 11:20:27 +0800 |
When building ACPI tables regarding CPUs we should always build
them for the number of possible CPUs, not the number of present
CPUs. We then ensure only the present CPUs are enabled.
Signed-off-by: Andrew Jones <drjones@redhat.com>
Signed-off-by: Ying Fang <fangying1@huawei.com>
---
hw/arm/virt-acpi-build.c | 17 ++++++++++++-----
1 file changed, 12 insertions(+), 5 deletions(-)
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
index 9efd7a3881..f1d574b5d3 100644
--- a/hw/arm/virt-acpi-build.c
+++ b/hw/arm/virt-acpi-build.c
@@ -56,14 +56,18 @@
#define ARM_SPI_BASE 32
-static void acpi_dsdt_add_cpus(Aml *scope, int smp_cpus)
+static void acpi_dsdt_add_cpus(Aml *scope, VirtMachineState *vms)
{
uint16_t i;
+ CPUArchIdList *possible_cpus = MACHINE(vms)->possible_cpus;
- for (i = 0; i < smp_cpus; i++) {
+ for (i = 0; i < possible_cpus->len; i++) {
Aml *dev = aml_device("C%.03X", i);
aml_append(dev, aml_name_decl("_HID", aml_string("ACPI0007")));
aml_append(dev, aml_name_decl("_UID", aml_int(i)));
+ if (possible_cpus->cpus[i].cpu == NULL) {
+ aml_append(dev, aml_name_decl("_STA", aml_int(0)));
+ }
aml_append(scope, dev);
}
}
@@ -635,6 +639,7 @@ build_madt(GArray *table_data, BIOSLinker *linker,
VirtMachineState *vms)
const int *irqmap = vms->irqmap;
AcpiMadtGenericDistributor *gicd;
AcpiMadtGenericMsiFrame *gic_msi;
+ int possible_cpus = MACHINE(vms)->possible_cpus->len;
int i;
acpi_data_push(table_data, sizeof(AcpiMultipleApicTable));
@@ -645,7 +650,7 @@ build_madt(GArray *table_data, BIOSLinker *linker,
VirtMachineState *vms)
gicd->base_address = cpu_to_le64(memmap[VIRT_GIC_DIST].base);
gicd->version = vms->gic_version;
- for (i = 0; i < vms->smp_cpus; i++) {
+ for (i = 0; i < possible_cpus; i++) {
AcpiMadtGenericCpuInterface *gicc = acpi_data_push(table_data,
sizeof(*gicc));
ARMCPU *armcpu = ARM_CPU(qemu_get_cpu(i));
@@ -660,7 +665,9 @@ build_madt(GArray *table_data, BIOSLinker *linker,
VirtMachineState *vms)
gicc->cpu_interface_number = cpu_to_le32(i);
gicc->arm_mpidr = cpu_to_le64(armcpu->mp_affinity);
gicc->uid = cpu_to_le32(i);
- gicc->flags = cpu_to_le32(ACPI_MADT_GICC_ENABLED);
+ if (i < vms->smp_cpus) {
+ gicc->flags = cpu_to_le32(ACPI_MADT_GICC_ENABLED);
+ }
if (arm_feature(&armcpu->env, ARM_FEATURE_PMU)) {
gicc->performance_interrupt = cpu_to_le32(PPI(VIRTUAL_PMU_IRQ));
@@ -764,7 +771,7 @@ build_dsdt(GArray *table_data, BIOSLinker *linker,
VirtMachineState *vms)
* the RTC ACPI device at all when using UEFI.
*/
scope = aml_scope("\\_SB");
- acpi_dsdt_add_cpus(scope, vms->smp_cpus);
+ acpi_dsdt_add_cpus(scope, vms);
acpi_dsdt_add_uart(scope, &memmap[VIRT_UART],
(irqmap[VIRT_UART] + ARM_SPI_BASE));
if (vmc->acpi_expose_flash) {
--
2.23.0
- [RFC PATCH 04/12] device_tree: add qemu_fdt_add_path, (continued)
- [RFC PATCH 04/12] device_tree: add qemu_fdt_add_path, Ying Fang, 2020/09/16
- [RFC PATCH 01/12] linux headers: Update linux header with KVM_ARM_SET_MP_AFFINITY, Ying Fang, 2020/09/16
- [RFC PATCH 03/12] target/arm/kvm32: make MPIDR consistent with CPU Topology, Ying Fang, 2020/09/16
- [RFC PATCH 07/12] hw/acpi/aml-build: add processor hierarchy node structure, Ying Fang, 2020/09/16
- [RFC PATCH 06/12] hw/arm/virt-acpi-build: distinguish possible and present cpus,
Ying Fang <=
- [RFC PATCH 08/12] hw/arm/virt-acpi-build: add PPTT table, Ying Fang, 2020/09/16
- [RFC PATCH 12/12] hw/arm/virt-acpi-build: Enable CPU cache topology, Ying Fang, 2020/09/16
- [RFC PATCH 10/12] hw/arm/virt: add fdt cache information, Ying Fang, 2020/09/16
- [RFC PATCH 11/12] hw/acpi/aml-build: build ACPI CPU cache topology information, Ying Fang, 2020/09/16