mirror of
https://github.com/aljazceru/kata-containers.git
synced 2025-12-18 14:54:19 +01:00
Initially enable vcpu hotplug in qemu for arm base on Salli's work[1]. Fixes:#3280 Signed-off-by: Huang Shijie <shijie8@gmail.com> [1] https://github.com/salil-mehta/qemu/tree/virt-cpuhp-armv8/rfc-v1
116 lines
4.2 KiB
Diff
116 lines
4.2 KiB
Diff
From 8cdfd18d515aa5be1c54061e42f1c8a69997667b Mon Sep 17 00:00:00 2001
|
|
From: Salil Mehta <salil.mehta@huawei.com>
|
|
Date: Thu, 25 Nov 2021 13:58:25 +0800
|
|
Subject: [PATCH 08/28] arm/cpuhp: Enable ACPI support for vcpu hotplug
|
|
|
|
ACPI is required to interface QEMU with the guest. Roughly falls into below
|
|
cases,
|
|
|
|
1. Convey the possible vcpus config at the machine init time to the guest
|
|
using various DSDT tables like MADT etc.
|
|
2. Convey vcpu hotplug events to guest(using GED)
|
|
3. Assist in evaluation of various ACPI methods(like _EVT, _STA, _OST, _EJ0,
|
|
_MAT etc.)
|
|
4. Provides ACPI cpu hotplug state and 12 Byte memory mapped cpu hotplug
|
|
control register interface to the OSPM/guest corresponding to each possible
|
|
vcpu. The register interface consists of various R/W fields and their
|
|
handling operations. These are called when ever register fields or memory
|
|
regions are accessed(i.e. read or written) by OSPM when ever it evaluates
|
|
various ACPI methods.
|
|
|
|
Note: lot of this framework code is inherited from the changes already done for
|
|
x86 but still some minor changes are required to make it compatible with
|
|
ARM64.)
|
|
|
|
This patch enables the ACPI support for virtual cpu hotplug in kconfig and
|
|
during initialization.
|
|
|
|
Co-developed-by: Keqian Zhu <zhukeqian1@huawei.com>
|
|
Signed-off-by: Salil Mehta <salil.mehta@huawei.com>
|
|
Signed-off-by: Huang Shijie <shijie8@gmail.com>
|
|
---
|
|
hw/acpi/cpu.c | 6 +++++-
|
|
hw/arm/Kconfig | 1 +
|
|
hw/arm/virt.c | 2 ++
|
|
include/hw/acpi/cpu_hotplug.h | 2 ++
|
|
include/hw/arm/virt.h | 1 +
|
|
5 files changed, 11 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/hw/acpi/cpu.c b/hw/acpi/cpu.c
|
|
index f82e9512fd..cf07a6c30c 100644
|
|
--- a/hw/acpi/cpu.c
|
|
+++ b/hw/acpi/cpu.c
|
|
@@ -226,7 +226,11 @@ void cpu_hotplug_hw_init(MemoryRegion *as, Object *owner,
|
|
state->dev_count = id_list->len;
|
|
state->devs = g_new0(typeof(*state->devs), state->dev_count);
|
|
for (i = 0; i < id_list->len; i++) {
|
|
- state->devs[i].cpu = CPU(id_list->cpus[i].cpu);
|
|
+ struct CPUState *cpu = CPU(id_list->cpus[i].cpu);
|
|
+ if (qemu_present_cpu(cpu))
|
|
+ state->devs[i].cpu = cpu;
|
|
+ else
|
|
+ state->devs[i].cpu = NULL;
|
|
state->devs[i].arch_id = id_list->cpus[i].arch_id;
|
|
}
|
|
memory_region_init_io(&state->ctrl_reg, owner, &cpu_hotplug_ops, state,
|
|
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
|
|
index 4ba0aca067..32b150676a 100644
|
|
--- a/hw/arm/Kconfig
|
|
+++ b/hw/arm/Kconfig
|
|
@@ -29,6 +29,7 @@ config ARM_VIRT
|
|
select ACPI_HW_REDUCED
|
|
select ACPI_NVDIMM
|
|
select ACPI_APEI
|
|
+ select ACPI_CPU_HOTPLUG
|
|
|
|
config CHEETAH
|
|
bool
|
|
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
|
index 61fc431d20..4265c0e2e8 100644
|
|
--- a/hw/arm/virt.c
|
|
+++ b/hw/arm/virt.c
|
|
@@ -77,6 +77,7 @@
|
|
#include "hw/virtio/virtio-iommu.h"
|
|
#include "hw/char/pl011.h"
|
|
#include "qemu/guest-random.h"
|
|
+#include "hw/acpi/cpu_hotplug.h"
|
|
|
|
#define DEFINE_VIRT_MACHINE_LATEST(major, minor, latest) \
|
|
static void virt_##major##_##minor##_class_init(ObjectClass *oc, \
|
|
@@ -152,6 +153,7 @@ static const MemMapEntry base_memmap[] = {
|
|
[VIRT_NVDIMM_ACPI] = { 0x09090000, NVDIMM_ACPI_IO_LEN},
|
|
[VIRT_PVTIME] = { 0x090a0000, 0x00010000 },
|
|
[VIRT_SECURE_GPIO] = { 0x090b0000, 0x00001000 },
|
|
+ [VIRT_CPUHP_ACPI] = { 0x090c0000, ACPI_CPU_HOTPLUG_REG_LEN},
|
|
[VIRT_MMIO] = { 0x0a000000, 0x00000200 },
|
|
/* ...repeating for a total of NUM_VIRTIO_TRANSPORTS, each of that size */
|
|
[VIRT_PLATFORM_BUS] = { 0x0c000000, 0x02000000 },
|
|
diff --git a/include/hw/acpi/cpu_hotplug.h b/include/hw/acpi/cpu_hotplug.h
|
|
index 3b932abbbb..48b291e45e 100644
|
|
--- a/include/hw/acpi/cpu_hotplug.h
|
|
+++ b/include/hw/acpi/cpu_hotplug.h
|
|
@@ -19,6 +19,8 @@
|
|
#include "hw/hotplug.h"
|
|
#include "hw/acpi/cpu.h"
|
|
|
|
+#define ACPI_CPU_HOTPLUG_REG_LEN 12
|
|
+
|
|
typedef struct AcpiCpuHotplug {
|
|
Object *device;
|
|
MemoryRegion io;
|
|
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
|
|
index a568420303..8954b78c27 100644
|
|
--- a/include/hw/arm/virt.h
|
|
+++ b/include/hw/arm/virt.h
|
|
@@ -85,6 +85,7 @@ enum {
|
|
VIRT_PCDIMM_ACPI,
|
|
VIRT_ACPI_GED,
|
|
VIRT_NVDIMM_ACPI,
|
|
+ VIRT_CPUHP_ACPI,
|
|
VIRT_PVTIME,
|
|
VIRT_LOWMEMMAP_LAST,
|
|
};
|
|
--
|
|
2.30.2
|
|
|