Skip to content

Commit 0055104

Browse files
Merge pull request #31 from luigix25/dtc_rebase
Device Tree Support
2 parents 34d3684 + 083c741 commit 0055104

13 files changed

Lines changed: 339 additions & 4 deletions

File tree

backends/igvm.c

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@
2626
#include <igvm/igvm.h>
2727
#include <igvm/igvm_defs.h>
2828

29+
#ifdef CONFIG_FDT
30+
#include <libfdt.h>
31+
#endif
2932

3033
/*
3134
* Some directives are specific to particular confidential computing platforms.
@@ -100,6 +103,10 @@ static int qigvm_directive_snp_id_block(QIgvm *ctx, const uint8_t *header_data,
100103
static int qigvm_initialization_guest_policy(QIgvm *ctx,
101104
const uint8_t *header_data,
102105
Error **errp);
106+
#ifdef CONFIG_FDT
107+
static int qigvm_directive_device_tree(QIgvm *ctx, const uint8_t *header_data,
108+
Error **errp);
109+
#endif
103110

104111
struct QIGVMHandler {
105112
uint32_t type;
@@ -130,6 +137,10 @@ static struct QIGVMHandler handlers[] = {
130137
qigvm_initialization_guest_policy },
131138
{ IGVM_VHT_MADT, IGVM_HEADER_SECTION_DIRECTIVE,
132139
qigvm_directive_madt },
140+
#ifdef CONFIG_FDT
141+
{ IGVM_VHT_DEVICE_TREE, IGVM_HEADER_SECTION_DIRECTIVE,
142+
qigvm_directive_device_tree },
143+
#endif
133144
};
134145

135146
static int qigvm_handler(QIgvm *ctx, uint32_t type, Error **errp)
@@ -790,6 +801,49 @@ static int qigvm_directive_snp_id_block(QIgvm *ctx, const uint8_t *header_data,
790801
return 0;
791802
}
792803

804+
#ifdef CONFIG_FDT
805+
static int qigvm_directive_device_tree(QIgvm *ctx, const uint8_t *header_data,
806+
Error **errp)
807+
{
808+
const IGVM_VHS_PARAMETER *param = (const IGVM_VHS_PARAMETER *)header_data;
809+
g_autofree void *fdt_packed = NULL;
810+
QIgvmParameterData *param_entry;
811+
uint32_t fdt_size;
812+
813+
param_entry = qigvm_find_param_entry(ctx, param->parameter_area_index);
814+
if (param_entry == NULL) {
815+
error_setg(errp, "IGVM: parameter area index %u not found",
816+
param->parameter_area_index);
817+
return -1;
818+
}
819+
820+
if (ctx->machine_state->fdt == NULL) {
821+
error_setg(errp, "IGVM: device tree not available");
822+
return -1;
823+
}
824+
825+
fdt_size = fdt_totalsize(ctx->machine_state->fdt);
826+
fdt_packed = g_memdup2(ctx->machine_state->fdt, fdt_size);
827+
828+
if (fdt_pack(fdt_packed)) {
829+
error_setg(errp, "IGVM: failed to pack device tree");
830+
return -1;
831+
}
832+
833+
fdt_size = fdt_totalsize(fdt_packed);
834+
if (fdt_size > param_entry->size) {
835+
error_setg(errp,
836+
"IGVM: device tree size exceeds parameter area"
837+
" defined in IGVM file");
838+
return -1;
839+
}
840+
841+
memcpy(param_entry->data, fdt_packed, fdt_size);
842+
843+
return 0;
844+
}
845+
#endif
846+
793847
static int qigvm_initialization_guest_policy(QIgvm *ctx,
794848
const uint8_t *header_data, Error **errp)
795849
{

hw/core/machine.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1218,6 +1218,7 @@ static void machine_initfn(Object *obj)
12181218
ms->kernel_cmdline = g_strdup("");
12191219
ms->ram_size = mc->default_ram_size;
12201220
ms->maxram_size = mc->default_ram_size;
1221+
ms->device_plane = 0;
12211222

12221223
if (mc->nvdimm_supported) {
12231224
ms->nvdimms_state = g_new0(NVDIMMState, 1);
@@ -1253,6 +1254,12 @@ static void machine_initfn(Object *obj)
12531254
"ACPI Serial Port Console Redirection "
12541255
"Table (spcr)");
12551256

1257+
/* Default Device Plane */
1258+
object_property_add_uint8_ptr(obj, "device-plane", &ms->device_plane,
1259+
OBJ_PROP_FLAG_READWRITE);
1260+
object_property_set_description(obj, "device-plane",
1261+
"Default plane to receive device IRQs");
1262+
12561263
/* default to mc->default_cpus */
12571264
ms->smp.cpus = mc->default_cpus;
12581265
ms->smp.max_cpus = mc->default_cpus;
@@ -1761,6 +1768,15 @@ void qdev_machine_creation_done(void)
17611768
register_global_state();
17621769
}
17631770

1771+
uint8_t qdev_default_plane(void)
1772+
{
1773+
if (current_machine != NULL) {
1774+
return current_machine->device_plane;
1775+
} else {
1776+
return 0;
1777+
}
1778+
}
1779+
17641780
static const TypeInfo machine_info = {
17651781
.name = TYPE_MACHINE,
17661782
.parent = TYPE_OBJECT,

hw/core/qdev.c

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -662,6 +662,28 @@ static bool device_get_hotplugged(Object *obj, Error **errp)
662662
return dev->hotplugged;
663663
}
664664

665+
static void device_get_plane(Object *obj, Visitor *v, const char *name,
666+
void *opaque, Error **errp)
667+
{
668+
DeviceState *dev = DEVICE(obj);
669+
uint8_t value = dev->plane;
670+
671+
visit_type_uint8(v, name, &value, errp);
672+
}
673+
674+
static void device_set_plane(Object *obj, Visitor *v, const char *name,
675+
void *opaque, Error **errp)
676+
{
677+
DeviceState *dev = DEVICE(obj);
678+
uint8_t value;
679+
680+
if (!visit_type_uint8(v, name, &value, errp)) {
681+
return;
682+
}
683+
684+
dev->plane = value;
685+
}
686+
665687
static void device_initfn(Object *obj)
666688
{
667689
DeviceState *dev = DEVICE(obj);
@@ -674,6 +696,7 @@ static void device_initfn(Object *obj)
674696
dev->instance_id_alias = -1;
675697
dev->realized = false;
676698
dev->allow_unplug_during_migration = false;
699+
dev->plane = qdev_default_plane();
677700

678701
QLIST_INIT(&dev->gpios);
679702
QLIST_INIT(&dev->clocks);
@@ -796,6 +819,9 @@ static void device_class_init(ObjectClass *class, const void *data)
796819
device_get_hotplugged, NULL);
797820
object_class_property_add_link(class, "parent_bus", TYPE_BUS,
798821
offsetof(DeviceState, parent_bus), NULL, 0);
822+
object_class_property_add(class, "plane", "uint8",
823+
device_get_plane, device_set_plane,
824+
NULL, NULL);
799825
}
800826

801827
static void do_legacy_reset(Object *obj, ResetType type)

hw/i386/Kconfig

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ config TDX
1717

1818
config PC
1919
bool
20+
select DEVICE_TREE
21+
depends on FDT
2022
imply APPLESMC
2123
imply HYPERV
2224
imply ISA_IPMI_KCS

hw/i386/meson.build

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ i386_ss.add(when: 'CONFIG_SGX', if_true: files('sgx-epc.c','sgx.c'),
2828
i386_ss.add(when: 'CONFIG_ACPI', if_true: files('acpi-common.c'))
2929
i386_ss.add(when: 'CONFIG_PC', if_true: files(
3030
'x86-common.c',
31+
'x86_dt_common.c',
3132
'pc.c',
3233
'pc_sysfw.c',
3334
'acpi-build.c',

hw/i386/microvm-dt.c

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ static void dt_add_virtio(MicrovmMachineState *mms, VirtIOMMIOProxy *mmio)
7373
return;
7474
}
7575

76+
VirtIODevice *vdev = virtio_bus_get_device(mmio_virtio_bus);
77+
uint8_t plane = object_property_get_int(OBJECT(vdev), "plane", &error_fatal);
7678
hwaddr base = dev->mmio[0].addr;
7779
hwaddr size = 512;
7880
unsigned index = (base - VIRTIO_MMIO_BASE) / size;
@@ -83,13 +85,15 @@ static void dt_add_virtio(MicrovmMachineState *mms, VirtIOMMIOProxy *mmio)
8385
qemu_fdt_setprop_string(ms->fdt, nodename, "compatible", "virtio,mmio");
8486
qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg", 2, base, 2, size);
8587
qemu_fdt_setprop(ms->fdt, nodename, "dma-coherent", NULL, 0);
88+
qemu_fdt_setprop_cell(ms->fdt, nodename, "plane", plane);
8689
dt_add_microvm_irq(mms, nodename, irq);
8790
g_free(nodename);
8891
}
8992

90-
static void dt_add_xhci(MicrovmMachineState *mms)
93+
static void dt_add_xhci(MicrovmMachineState *mms, DeviceState *dev)
9194
{
9295
const char compat[] = "generic-xhci";
96+
uint8_t plane = object_property_get_int(OBJECT(dev), "plane", &error_fatal);
9397
MachineState *ms = MACHINE(mms);
9498
uint32_t irq = MICROVM_XHCI_IRQ;
9599
hwaddr base = MICROVM_XHCI_BASE;
@@ -101,12 +105,14 @@ static void dt_add_xhci(MicrovmMachineState *mms)
101105
qemu_fdt_setprop(ms->fdt, nodename, "compatible", compat, sizeof(compat));
102106
qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg", 2, base, 2, size);
103107
qemu_fdt_setprop(ms->fdt, nodename, "dma-coherent", NULL, 0);
108+
qemu_fdt_setprop_cell(ms->fdt, nodename, "plane", plane);
104109
dt_add_microvm_irq(mms, nodename, irq);
105110
g_free(nodename);
106111
}
107112

108-
static void dt_add_pcie(MicrovmMachineState *mms)
113+
static void dt_add_pcie(MicrovmMachineState *mms, DeviceState *dev)
109114
{
115+
uint8_t plane = object_property_get_int(OBJECT(dev), "plane", &error_fatal);
110116
MachineState *ms = MACHINE(mms);
111117
hwaddr base = PCIE_MMIO_BASE;
112118
int nr_pcie_buses;
@@ -121,6 +127,7 @@ static void dt_add_pcie(MicrovmMachineState *mms)
121127
qemu_fdt_setprop_cell(ms->fdt, nodename, "#size-cells", 2);
122128
qemu_fdt_setprop_cell(ms->fdt, nodename, "linux,pci-domain", 0);
123129
qemu_fdt_setprop(ms->fdt, nodename, "dma-coherent", NULL, 0);
130+
qemu_fdt_setprop_cell(ms->fdt, nodename, "plane", plane);
124131

125132
qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg",
126133
2, PCIE_ECAM_BASE, 2, PCIE_ECAM_SIZE);
@@ -154,6 +161,7 @@ static void dt_add_pcie(MicrovmMachineState *mms)
154161

155162
static void dt_add_ioapic(MicrovmMachineState *mms, SysBusDevice *dev)
156163
{
164+
uint8_t plane = object_property_get_int(OBJECT(dev), "plane", &error_fatal);
157165
MachineState *ms = MACHINE(mms);
158166
hwaddr base = dev->mmio[0].addr;
159167
char *nodename;
@@ -181,6 +189,7 @@ static void dt_add_ioapic(MicrovmMachineState *mms, SysBusDevice *dev)
181189
qemu_fdt_setprop_cell(ms->fdt, nodename, "#address-cells", 0x2);
182190
qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg",
183191
2, base, 2, 0x1000);
192+
qemu_fdt_setprop_cell(ms->fdt, nodename, "plane", plane);
184193

185194
ph = qemu_fdt_alloc_phandle(ms->fdt);
186195
qemu_fdt_setprop_cell(ms->fdt, nodename, "phandle", ph);
@@ -195,6 +204,7 @@ static void dt_add_isa_serial(MicrovmMachineState *mms, ISADevice *dev)
195204
const char compat[] = "ns16550";
196205
uint32_t irq = object_property_get_int(OBJECT(dev), "irq", &error_fatal);
197206
hwaddr base = object_property_get_int(OBJECT(dev), "iobase", &error_fatal);
207+
uint8_t plane = object_property_get_int(OBJECT(dev), "plane", &error_fatal);
198208
MachineState *ms = MACHINE(mms);
199209
hwaddr size = 8;
200210
char *nodename;
@@ -203,6 +213,7 @@ static void dt_add_isa_serial(MicrovmMachineState *mms, ISADevice *dev)
203213
qemu_fdt_add_subnode(ms->fdt, nodename);
204214
qemu_fdt_setprop(ms->fdt, nodename, "compatible", compat, sizeof(compat));
205215
qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg", 2, base, 2, size);
216+
qemu_fdt_setprop_cell(ms->fdt, nodename, "plane", plane);
206217
dt_add_microvm_irq(mms, nodename, irq);
207218

208219
if (base == 0x3f8 /* com1 */) {
@@ -217,6 +228,7 @@ static void dt_add_isa_rtc(MicrovmMachineState *mms, ISADevice *dev)
217228
const char compat[] = "motorola,mc146818";
218229
uint32_t irq = object_property_get_uint(OBJECT(dev), "irq", &error_fatal);
219230
hwaddr base = object_property_get_uint(OBJECT(dev), "iobase", &error_fatal);
231+
uint8_t plane = object_property_get_int(OBJECT(dev), "plane", &error_fatal);
220232
MachineState *ms = MACHINE(mms);
221233
hwaddr size = 8;
222234
char *nodename;
@@ -225,6 +237,7 @@ static void dt_add_isa_rtc(MicrovmMachineState *mms, ISADevice *dev)
225237
qemu_fdt_add_subnode(ms->fdt, nodename);
226238
qemu_fdt_setprop(ms->fdt, nodename, "compatible", compat, sizeof(compat));
227239
qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg", 2, base, 2, size);
240+
qemu_fdt_setprop_cell(ms->fdt, nodename, "plane", plane);
228241
dt_add_microvm_irq(mms, nodename, irq);
229242
g_free(nodename);
230243
}
@@ -291,14 +304,14 @@ static void dt_setup_sys_bus(MicrovmMachineState *mms)
291304
/* xhci */
292305
obj = object_dynamic_cast(OBJECT(dev), TYPE_XHCI_SYSBUS);
293306
if (obj) {
294-
dt_add_xhci(mms);
307+
dt_add_xhci(mms, DEVICE(obj));
295308
continue;
296309
}
297310

298311
/* pcie */
299312
obj = object_dynamic_cast(OBJECT(dev), TYPE_GPEX_HOST);
300313
if (obj) {
301-
dt_add_pcie(mms);
314+
dt_add_pcie(mms, DEVICE(obj));
302315
continue;
303316
}
304317

hw/i386/pc.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
#include "trace.h"
6868
#include "sev.h"
6969
#include CONFIG_DEVICES
70+
#include "x86_dt_common.h"
7071

7172
#ifdef CONFIG_XEN_EMU
7273
#include "hw/xen/xen-legacy-backend.h"
@@ -522,6 +523,7 @@ void pc_machine_done(Notifier *notifier, void *data)
522523
PCMachineState *pcms = container_of(notifier,
523524
PCMachineState, machine_done);
524525
X86MachineState *x86ms = X86_MACHINE(pcms);
526+
MachineState *machine = MACHINE(pcms);
525527

526528
cxl_hook_up_pxb_registers(pcms->pcibus, &pcms->cxl_devices_state,
527529
&error_fatal);
@@ -546,6 +548,9 @@ void pc_machine_done(Notifier *notifier, void *data)
546548
}
547549

548550
pc_cmos_init_late(pcms);
551+
if (x86ms->igvm) {
552+
dt_setup_x86(machine);
553+
}
549554
}
550555

551556
/* setup pci memory address space mapping into system address space */

0 commit comments

Comments
 (0)