[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-ppc] [PULL 39/49] pseries: Consolidate construction of /chosen dev
From: |
David Gibson |
Subject: |
[Qemu-ppc] [PULL 39/49] pseries: Consolidate construction of /chosen device tree node |
Date: |
Wed, 26 Oct 2016 22:42:43 +1100 |
For historical reasons, building the /chosen node in the guest device tree
is split across several places and includes both parts which write the DT
sequentially and others which use random access functions.
This patch consolidates construction of the node into one place, using
random access functions throughout.
Signed-off-by: David Gibson <address@hidden>
Reviewed-by: Thomas Huth <address@hidden>
Reviewed-by: Michael Roth <address@hidden>
---
hw/ppc/spapr.c | 131 ++++++++++++++++++++++-----------------------
hw/ppc/spapr_vio.c | 17 ++----
include/hw/ppc/spapr_vio.h | 2 +-
3 files changed, 70 insertions(+), 80 deletions(-)
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 102f008..1d8dd7f 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -273,14 +273,10 @@ static void add_str(GString *s, const gchar *s1)
static void *spapr_create_fdt_skel(sPAPRMachineState *spapr)
{
- MachineState *machine = MACHINE(spapr);
void *fdt;
- uint32_t start_prop = cpu_to_be32(spapr->initrd_base);
- uint32_t end_prop = cpu_to_be32(spapr->initrd_base + spapr->initrd_size);
GString *hypertas = g_string_sized_new(256);
GString *qemu_hypertas = g_string_sized_new(256);
uint32_t refpoints[] = {cpu_to_be32(0x4), cpu_to_be32(0x4)};
- unsigned char vec5[] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x80};
char *buf;
add_str(hypertas, "hcall-pft");
@@ -337,35 +333,6 @@ static void *spapr_create_fdt_skel(sPAPRMachineState
*spapr)
_FDT((fdt_property_cell(fdt, "#address-cells", 0x2)));
_FDT((fdt_property_cell(fdt, "#size-cells", 0x2)));
- /* /chosen */
- _FDT((fdt_begin_node(fdt, "chosen")));
-
- /* Set Form1_affinity */
- _FDT((fdt_property(fdt, "ibm,architecture-vec-5", vec5, sizeof(vec5))));
-
- _FDT((fdt_property_string(fdt, "bootargs", machine->kernel_cmdline)));
- _FDT((fdt_property(fdt, "linux,initrd-start",
- &start_prop, sizeof(start_prop))));
- _FDT((fdt_property(fdt, "linux,initrd-end",
- &end_prop, sizeof(end_prop))));
- if (spapr->kernel_size) {
- uint64_t kprop[2] = { cpu_to_be64(KERNEL_LOAD_ADDR),
- cpu_to_be64(spapr->kernel_size) };
-
- _FDT((fdt_property(fdt, "qemu,boot-kernel", &kprop, sizeof(kprop))));
- if (spapr->kernel_le) {
- _FDT((fdt_property(fdt, "qemu,boot-kernel-le", NULL, 0)));
- }
- }
- if (boot_menu) {
- _FDT((fdt_property_cell(fdt, "qemu,boot-menu", boot_menu)));
- }
- _FDT((fdt_property_cell(fdt, "qemu,graphic-width", graphic_width)));
- _FDT((fdt_property_cell(fdt, "qemu,graphic-height", graphic_height)));
- _FDT((fdt_property_cell(fdt, "qemu,graphic-depth", graphic_depth)));
-
- _FDT((fdt_end_node(fdt)));
-
/* RTAS */
_FDT((fdt_begin_node(fdt, "rtas")));
@@ -873,6 +840,68 @@ int spapr_h_cas_compose_response(sPAPRMachineState *spapr,
return 0;
}
+static void spapr_dt_chosen(sPAPRMachineState *spapr, void *fdt)
+{
+ MachineState *machine = MACHINE(spapr);
+ int chosen;
+ const char *boot_device = machine->boot_order;
+ char *stdout_path = spapr_vio_stdout_path(spapr->vio_bus);
+ size_t cb = 0;
+ char *bootlist = get_boot_devices_list(&cb, true);
+ unsigned char vec5[] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x80};
+
+ _FDT(chosen = fdt_add_subnode(fdt, 0, "chosen"));
+
+ /* Set Form1_affinity */
+ _FDT(fdt_setprop(fdt, chosen, "ibm,architecture-vec-5",
+ vec5, sizeof(vec5)));
+
+ _FDT(fdt_setprop_string(fdt, chosen, "bootargs", machine->kernel_cmdline));
+ _FDT(fdt_setprop_cell(fdt, chosen, "linux,initrd-start",
+ spapr->initrd_base));
+ _FDT(fdt_setprop_cell(fdt, chosen, "linux,initrd-end",
+ spapr->initrd_base + spapr->initrd_size));
+
+ if (spapr->kernel_size) {
+ uint64_t kprop[2] = { cpu_to_be64(KERNEL_LOAD_ADDR),
+ cpu_to_be64(spapr->kernel_size) };
+
+ _FDT(fdt_setprop(fdt, chosen, "qemu,boot-kernel",
+ &kprop, sizeof(kprop)));
+ if (spapr->kernel_le) {
+ _FDT(fdt_setprop(fdt, chosen, "qemu,boot-kernel-le", NULL, 0));
+ }
+ }
+ if (boot_menu) {
+ _FDT((fdt_setprop_cell(fdt, chosen, "qemu,boot-menu", boot_menu)));
+ }
+ _FDT(fdt_setprop_cell(fdt, chosen, "qemu,graphic-width", graphic_width));
+ _FDT(fdt_setprop_cell(fdt, chosen, "qemu,graphic-height", graphic_height));
+ _FDT(fdt_setprop_cell(fdt, chosen, "qemu,graphic-depth", graphic_depth));
+
+ if (cb && bootlist) {
+ int i;
+
+ for (i = 0; i < cb; i++) {
+ if (bootlist[i] == '\n') {
+ bootlist[i] = ' ';
+ }
+ }
+ _FDT(fdt_setprop_string(fdt, chosen, "qemu,boot-list", bootlist));
+ }
+
+ if (boot_device && strlen(boot_device)) {
+ _FDT(fdt_setprop_string(fdt, chosen, "qemu,boot-device", boot_device));
+ }
+
+ if (!spapr->has_graphics && stdout_path) {
+ _FDT(fdt_setprop_string(fdt, chosen, "linux,stdout-path",
stdout_path));
+ }
+
+ g_free(stdout_path);
+ g_free(bootlist);
+}
+
static void *spapr_build_fdt(sPAPRMachineState *spapr,
hwaddr rtas_addr,
hwaddr rtas_size)
@@ -880,10 +909,7 @@ static void *spapr_build_fdt(sPAPRMachineState *spapr,
MachineState *machine = MACHINE(qdev_get_machine());
MachineClass *mc = MACHINE_GET_CLASS(machine);
sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(machine);
- const char *boot_device = machine->boot_order;
- int ret, i;
- size_t cb = 0;
- char *bootlist;
+ int ret;
void *fdt;
sPAPRPHBState *phb;
@@ -932,34 +958,6 @@ static void *spapr_build_fdt(sPAPRMachineState *spapr,
/* cpus */
spapr_populate_cpus_dt_node(fdt, spapr);
- bootlist = get_boot_devices_list(&cb, true);
- if (cb && bootlist) {
- int offset = fdt_path_offset(fdt, "/chosen");
- if (offset < 0) {
- exit(1);
- }
- for (i = 0; i < cb; i++) {
- if (bootlist[i] == '\n') {
- bootlist[i] = ' ';
- }
-
- }
- ret = fdt_setprop_string(fdt, offset, "qemu,boot-list", bootlist);
- }
-
- if (boot_device && strlen(boot_device)) {
- int offset = fdt_path_offset(fdt, "/chosen");
-
- if (offset < 0) {
- exit(1);
- }
- fdt_setprop_string(fdt, offset, "qemu,boot-device", boot_device);
- }
-
- if (!spapr->has_graphics) {
- spapr_populate_chosen_stdout(fdt, spapr->vio_bus);
- }
-
if (smc->dr_lmb_enabled) {
_FDT(spapr_drc_populate_dt(fdt, 0, NULL, SPAPR_DR_CONNECTOR_TYPE_LMB));
}
@@ -974,7 +972,8 @@ static void *spapr_build_fdt(sPAPRMachineState *spapr,
}
}
- g_free(bootlist);
+ /* /chosen */
+ spapr_dt_chosen(spapr, fdt);
/* Build memory reserve map */
if (spapr->kernel_size) {
diff --git a/hw/ppc/spapr_vio.c b/hw/ppc/spapr_vio.c
index 3648aa5..2b67df0 100644
--- a/hw/ppc/spapr_vio.c
+++ b/hw/ppc/spapr_vio.c
@@ -665,28 +665,19 @@ out:
return ret;
}
-int spapr_populate_chosen_stdout(void *fdt, VIOsPAPRBus *bus)
+gchar *spapr_vio_stdout_path(VIOsPAPRBus *bus)
{
VIOsPAPRDevice *dev;
char *name, *path;
- int ret, offset;
dev = spapr_vty_get_default(bus);
- if (!dev)
- return 0;
-
- offset = fdt_path_offset(fdt, "/chosen");
- if (offset < 0) {
- return offset;
+ if (!dev) {
+ return NULL;
}
name = spapr_vio_get_dev_name(DEVICE(dev));
path = g_strdup_printf("/vdevice/%s", name);
- ret = fdt_setprop_string(fdt, offset, "linux,stdout-path", path);
-
g_free(name);
- g_free(path);
-
- return ret;
+ return path;
}
diff --git a/include/hw/ppc/spapr_vio.h b/include/hw/ppc/spapr_vio.h
index 0b025fd..a0e7542 100644
--- a/include/hw/ppc/spapr_vio.h
+++ b/include/hw/ppc/spapr_vio.h
@@ -81,7 +81,7 @@ struct VIOsPAPRBus {
extern VIOsPAPRBus *spapr_vio_bus_init(void);
extern VIOsPAPRDevice *spapr_vio_find_by_reg(VIOsPAPRBus *bus, uint32_t reg);
extern int spapr_populate_vdevice(VIOsPAPRBus *bus, void *fdt);
-extern int spapr_populate_chosen_stdout(void *fdt, VIOsPAPRBus *bus);
+extern gchar *spapr_vio_stdout_path(VIOsPAPRBus *bus);
static inline qemu_irq spapr_vio_qirq(VIOsPAPRDevice *dev)
{
--
2.7.4
- [Qemu-ppc] [PULL 31/49] ppc/pnv: add a ISA bus, (continued)
- [Qemu-ppc] [PULL 31/49] ppc/pnv: add a ISA bus, David Gibson, 2016/10/26
- [Qemu-ppc] [PULL 37/49] pseries: Consolidate RTAS loading, David Gibson, 2016/10/26
- [Qemu-ppc] [PULL 16/49] ppc/xics: add a xics_set_nr_servers common routine, David Gibson, 2016/10/26
- [Qemu-ppc] [PULL 13/49] nvram: Rename openbios_firmware_abi.h into sun_nvram.h, David Gibson, 2016/10/26
- [Qemu-ppc] [PULL 17/49] ppc/xics: add a XICSState backlink in ICPState, David Gibson, 2016/10/26
- [Qemu-ppc] [PULL 15/49] target-ppc: implement xxbr[qdwh] instruction, David Gibson, 2016/10/26
- [Qemu-ppc] [PULL 29/49] ppc/pnv: add XSCOM handlers to PnvCore, David Gibson, 2016/10/26
- [Qemu-ppc] [PULL 34/49] pseries: Remove rtas_addr and fdt_addr fields from machinestate, David Gibson, 2016/10/26
- [Qemu-ppc] [PULL 32/49] target-ppc: add vmul10[u, eu, cu, ecu]q instructions, David Gibson, 2016/10/26
- [Qemu-ppc] [PULL 42/49] pseries: Move /hypervisor node construction to fdt_build_fdt(), David Gibson, 2016/10/26
- [Qemu-ppc] [PULL 39/49] pseries: Consolidate construction of /chosen device tree node,
David Gibson <=
- [Qemu-ppc] [PULL 27/49] ppc/pnv: add a PnvCore object, David Gibson, 2016/10/26
- [Qemu-ppc] [PULL 36/49] pseries: Move adding of fdt reserve map entries, David Gibson, 2016/10/26
- [Qemu-ppc] [PULL 38/49] pseries: Move construction of /interrupt-controller fdt node, David Gibson, 2016/10/26
- [Qemu-ppc] [PULL 26/49] ppc/pnv: add a PIR handler to PnvChip, David Gibson, 2016/10/26
- [Qemu-ppc] [PULL 40/49] pseries: Consolidate construction of /rtas device tree node, David Gibson, 2016/10/26
- [Qemu-ppc] [PULL 43/49] pseries: Consolidate construction of /vdevice device tree node, David Gibson, 2016/10/26
- [Qemu-ppc] [PULL 25/49] ppc/pnv: add a core mask to PnvChip, David Gibson, 2016/10/26
- [Qemu-ppc] [PULL 44/49] pseries: Remove spapr_create_fdt_skel(), David Gibson, 2016/10/26
- [Qemu-ppc] [PULL 47/49] spapr: add option vector handling in CAS-generated resets, David Gibson, 2016/10/26
- [Qemu-ppc] [PULL 28/49] ppc/pnv: add XSCOM infrastructure, David Gibson, 2016/10/26