Re: [Qemu-devel] [RFC for-2.7 05/11] pseries: Build device tree only at reset time
On Tue, Apr 26, 2016 at 08:13:21PM +0200, Thomas Huth wrote: > On 20.04.2016 04:33, David Gibson wrote: > > Currently the pseries code builds a "skeleton" device tree at machine init > > time, then adds a bunch of stuff to it at reset. Over time, more and more > > logic has had to be moved from init to reset time, and there's really no > > advantage to doing any of it at init time. > > > > This patch removes the init time spapr_create_fdt_skel() and moves its > > logic into the reset time spapr_build_fdt(). There's still a fairly > > pointless divide between the "skeleton" logic (using libfdt serial-write > > functions) and the "tweak" logic (using libfdt random access functions) > > but at least it all happens at the same time, making further consolidation > > easier. > > > > Signed-off-by: David Gibson> > --- > > hw/ppc/spapr.c | 398 > > - > > include/hw/ppc/spapr.h | 1 - > > 2 files changed, 192 insertions(+), 207 deletions(-) > > > > diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c > > index da10136..6e1192f 100644 > > --- a/hw/ppc/spapr.c > > +++ b/hw/ppc/spapr.c > ... > > @@ -901,7 +702,7 @@ static void *spapr_build_fdt(sPAPRMachineState *spapr, > > hwaddr rtas_addr, > > hwaddr rtas_size) > > { > > -MachineState *machine = MACHINE(qdev_get_machine()); > > +MachineState *machine = MACHINE(spapr); > > sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(machine); > > const char *boot_device = machine->boot_order; > > int ret, i; > > @@ -909,11 +710,200 @@ static void *spapr_build_fdt(sPAPRMachineState > > *spapr, > > char *bootlist; > > void *fdt; > > sPAPRPHBState *phb; > > +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)}; > > +uint32_t interrupt_server_ranges_prop[] = {0, cpu_to_be32(max_cpus)}; > > +unsigned char vec5[] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x80}; > > +char *buf; > > + > > +add_str(hypertas, "hcall-pft"); > > +add_str(hypertas, "hcall-term"); > > +add_str(hypertas, "hcall-dabr"); > > +add_str(hypertas, "hcall-interrupt"); > > +add_str(hypertas, "hcall-tce"); > > +add_str(hypertas, "hcall-vio"); > > +add_str(hypertas, "hcall-splpar"); > > +add_str(hypertas, "hcall-bulk"); > > +add_str(hypertas, "hcall-set-mode"); > > +add_str(qemu_hypertas, "hcall-memop1"); > > + > > +fdt = g_malloc0(FDT_MAX_SIZE); > > +_FDT((fdt_create(fdt, FDT_MAX_SIZE))); > > + > > +if (spapr->kernel_size) { > > +_FDT((fdt_add_reservemap_entry(fdt, KERNEL_LOAD_ADDR, > > + spapr->kernel_size))); > > +} > > +if (spapr->initrd_size) { > > +_FDT((fdt_add_reservemap_entry(fdt, spapr->initrd_base, > > + spapr->initrd_size))); > > +} > > +_FDT((fdt_finish_reservemap(fdt))); > > + > > +/* Root node */ > > +_FDT((fdt_begin_node(fdt, ""))); > > +_FDT((fdt_property_string(fdt, "device_type", "chrp"))); > > +_FDT((fdt_property_string(fdt, "model", "IBM pSeries (emulated by > > qemu)"))); > > +_FDT((fdt_property_string(fdt, "compatible", "qemu,pseries"))); > > + > > +/* > > + * Add info to guest to indentify which host is it being run on > > + * and what is the uuid of the guest > > + */ > > +if (kvmppc_get_host_model()) { > > +_FDT((fdt_property_string(fdt, "host-model", buf))); > > +g_free(buf); > > +} > > +if (kvmppc_get_host_serial()) { > > +_FDT((fdt_property_string(fdt, "host-serial", buf))); > > +g_free(buf); > > +} > > > > -fdt = g_malloc(FDT_MAX_SIZE); > > +buf = g_strdup_printf(UUID_FMT, qemu_uuid[0], qemu_uuid[1], > > + qemu_uuid[2], qemu_uuid[3], qemu_uuid[4], > > + qemu_uuid[5], qemu_uuid[6], qemu_uuid[7], > > + qemu_uuid[8], qemu_uuid[9], qemu_uuid[10], > > + qemu_uuid[11], qemu_uuid[12], qemu_uuid[13], > > + qemu_uuid[14], qemu_uuid[15]); > > + > > +_FDT((fdt_property_string(fdt, "vm,uuid", buf))); > > +if (qemu_uuid_set) { > > +_FDT((fdt_property_string(fdt, "system-id", buf))); > > +} > > +g_free(buf); > > + > > +if (qemu_get_vm_name()) { > > +_FDT((fdt_property_string(fdt, "ibm,partition-name", > > + qemu_get_vm_name(; > > +} > > + > > +_FDT((fdt_property_cell(fdt, "#address-cells", 0x2))); > > +_FDT((fdt_property_cell(fdt, "#size-cells", 0x2))); > > + > > +/* /chosen */ > > +
Re: [Qemu-devel] [RFC for-2.7 05/11] pseries: Build device tree only at reset time
On 20.04.2016 04:33, David Gibson wrote: > Currently the pseries code builds a "skeleton" device tree at machine init > time, then adds a bunch of stuff to it at reset. Over time, more and more > logic has had to be moved from init to reset time, and there's really no > advantage to doing any of it at init time. > > This patch removes the init time spapr_create_fdt_skel() and moves its > logic into the reset time spapr_build_fdt(). There's still a fairly > pointless divide between the "skeleton" logic (using libfdt serial-write > functions) and the "tweak" logic (using libfdt random access functions) > but at least it all happens at the same time, making further consolidation > easier. > > Signed-off-by: David Gibson> --- > hw/ppc/spapr.c | 398 > - > include/hw/ppc/spapr.h | 1 - > 2 files changed, 192 insertions(+), 207 deletions(-) > > diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c > index da10136..6e1192f 100644 > --- a/hw/ppc/spapr.c > +++ b/hw/ppc/spapr.c ... > @@ -901,7 +702,7 @@ static void *spapr_build_fdt(sPAPRMachineState *spapr, > hwaddr rtas_addr, > hwaddr rtas_size) > { > -MachineState *machine = MACHINE(qdev_get_machine()); > +MachineState *machine = MACHINE(spapr); > sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(machine); > const char *boot_device = machine->boot_order; > int ret, i; > @@ -909,11 +710,200 @@ static void *spapr_build_fdt(sPAPRMachineState *spapr, > char *bootlist; > void *fdt; > sPAPRPHBState *phb; > +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)}; > +uint32_t interrupt_server_ranges_prop[] = {0, cpu_to_be32(max_cpus)}; > +unsigned char vec5[] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x80}; > +char *buf; > + > +add_str(hypertas, "hcall-pft"); > +add_str(hypertas, "hcall-term"); > +add_str(hypertas, "hcall-dabr"); > +add_str(hypertas, "hcall-interrupt"); > +add_str(hypertas, "hcall-tce"); > +add_str(hypertas, "hcall-vio"); > +add_str(hypertas, "hcall-splpar"); > +add_str(hypertas, "hcall-bulk"); > +add_str(hypertas, "hcall-set-mode"); > +add_str(qemu_hypertas, "hcall-memop1"); > + > +fdt = g_malloc0(FDT_MAX_SIZE); > +_FDT((fdt_create(fdt, FDT_MAX_SIZE))); > + > +if (spapr->kernel_size) { > +_FDT((fdt_add_reservemap_entry(fdt, KERNEL_LOAD_ADDR, > + spapr->kernel_size))); > +} > +if (spapr->initrd_size) { > +_FDT((fdt_add_reservemap_entry(fdt, spapr->initrd_base, > + spapr->initrd_size))); > +} > +_FDT((fdt_finish_reservemap(fdt))); > + > +/* Root node */ > +_FDT((fdt_begin_node(fdt, ""))); > +_FDT((fdt_property_string(fdt, "device_type", "chrp"))); > +_FDT((fdt_property_string(fdt, "model", "IBM pSeries (emulated by > qemu)"))); > +_FDT((fdt_property_string(fdt, "compatible", "qemu,pseries"))); > + > +/* > + * Add info to guest to indentify which host is it being run on > + * and what is the uuid of the guest > + */ > +if (kvmppc_get_host_model()) { > +_FDT((fdt_property_string(fdt, "host-model", buf))); > +g_free(buf); > +} > +if (kvmppc_get_host_serial()) { > +_FDT((fdt_property_string(fdt, "host-serial", buf))); > +g_free(buf); > +} > > -fdt = g_malloc(FDT_MAX_SIZE); > +buf = g_strdup_printf(UUID_FMT, qemu_uuid[0], qemu_uuid[1], > + qemu_uuid[2], qemu_uuid[3], qemu_uuid[4], > + qemu_uuid[5], qemu_uuid[6], qemu_uuid[7], > + qemu_uuid[8], qemu_uuid[9], qemu_uuid[10], > + qemu_uuid[11], qemu_uuid[12], qemu_uuid[13], > + qemu_uuid[14], qemu_uuid[15]); > + > +_FDT((fdt_property_string(fdt, "vm,uuid", buf))); > +if (qemu_uuid_set) { > +_FDT((fdt_property_string(fdt, "system-id", buf))); > +} > +g_free(buf); > + > +if (qemu_get_vm_name()) { > +_FDT((fdt_property_string(fdt, "ibm,partition-name", > + qemu_get_vm_name(; > +} > + > +_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", > +
Re: [Qemu-devel] [RFC for-2.7 05/11] pseries: Build device tree only at reset time
On 04/20/2016 12:33 PM, David Gibson wrote: Currently the pseries code builds a "skeleton" device tree at machine init time, then adds a bunch of stuff to it at reset. Over time, more and more logic has had to be moved from init to reset time, and there's really no advantage to doing any of it at init time. This patch removes the init time spapr_create_fdt_skel() and moves its logic into the reset time spapr_build_fdt(). There's still a fairly pointless divide between the "skeleton" logic (using libfdt serial-write functions) and the "tweak" logic (using libfdt random access functions) but at least it all happens at the same time, making further consolidation easier. Signed-off-by: David GibsonReviewed-by: Alexey Kardashevskiy --- hw/ppc/spapr.c | 398 - include/hw/ppc/spapr.h | 1 - 2 files changed, 192 insertions(+), 207 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index da10136..6e1192f 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -312,205 +312,6 @@ static void add_str(GString *s, const gchar *s1) g_string_append_len(s, s1, strlen(s1) + 1); } -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)}; -uint32_t interrupt_server_ranges_prop[] = {0, cpu_to_be32(max_cpus)}; -unsigned char vec5[] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x80}; -char *buf; - -add_str(hypertas, "hcall-pft"); -add_str(hypertas, "hcall-term"); -add_str(hypertas, "hcall-dabr"); -add_str(hypertas, "hcall-interrupt"); -add_str(hypertas, "hcall-tce"); -add_str(hypertas, "hcall-vio"); -add_str(hypertas, "hcall-splpar"); -add_str(hypertas, "hcall-bulk"); -add_str(hypertas, "hcall-set-mode"); -add_str(qemu_hypertas, "hcall-memop1"); - -fdt = g_malloc0(FDT_MAX_SIZE); -_FDT((fdt_create(fdt, FDT_MAX_SIZE))); - -if (spapr->kernel_size) { -_FDT((fdt_add_reservemap_entry(fdt, KERNEL_LOAD_ADDR, - spapr->kernel_size))); -} -if (spapr->initrd_size) { -_FDT((fdt_add_reservemap_entry(fdt, spapr->initrd_base, - spapr->initrd_size))); -} -_FDT((fdt_finish_reservemap(fdt))); - -/* Root node */ -_FDT((fdt_begin_node(fdt, ""))); -_FDT((fdt_property_string(fdt, "device_type", "chrp"))); -_FDT((fdt_property_string(fdt, "model", "IBM pSeries (emulated by qemu)"))); -_FDT((fdt_property_string(fdt, "compatible", "qemu,pseries"))); - -/* - * Add info to guest to indentify which host is it being run on - * and what is the uuid of the guest - */ -if (kvmppc_get_host_model()) { -_FDT((fdt_property_string(fdt, "host-model", buf))); -g_free(buf); -} -if (kvmppc_get_host_serial()) { -_FDT((fdt_property_string(fdt, "host-serial", buf))); -g_free(buf); -} - -buf = g_strdup_printf(UUID_FMT, qemu_uuid[0], qemu_uuid[1], - qemu_uuid[2], qemu_uuid[3], qemu_uuid[4], - qemu_uuid[5], qemu_uuid[6], qemu_uuid[7], - qemu_uuid[8], qemu_uuid[9], qemu_uuid[10], - qemu_uuid[11], qemu_uuid[12], qemu_uuid[13], - qemu_uuid[14], qemu_uuid[15]); - -_FDT((fdt_property_string(fdt, "vm,uuid", buf))); -if (qemu_uuid_set) { -_FDT((fdt_property_string(fdt, "system-id", buf))); -} -g_free(buf); - -if (qemu_get_vm_name()) { -_FDT((fdt_property_string(fdt, "ibm,partition-name", - qemu_get_vm_name(; -} - -_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", - _prop, sizeof(start_prop; -_FDT((fdt_property(fdt, "linux,initrd-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", , sizeof(kprop; -if (spapr->kernel_le) { -_FDT((fdt_property(fdt, "qemu,boot-kernel-le", NULL, 0))); -} -} -if
[Qemu-devel] [RFC for-2.7 05/11] pseries: Build device tree only at reset time
Currently the pseries code builds a "skeleton" device tree at machine init time, then adds a bunch of stuff to it at reset. Over time, more and more logic has had to be moved from init to reset time, and there's really no advantage to doing any of it at init time. This patch removes the init time spapr_create_fdt_skel() and moves its logic into the reset time spapr_build_fdt(). There's still a fairly pointless divide between the "skeleton" logic (using libfdt serial-write functions) and the "tweak" logic (using libfdt random access functions) but at least it all happens at the same time, making further consolidation easier. Signed-off-by: David Gibson--- hw/ppc/spapr.c | 398 - include/hw/ppc/spapr.h | 1 - 2 files changed, 192 insertions(+), 207 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index da10136..6e1192f 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -312,205 +312,6 @@ static void add_str(GString *s, const gchar *s1) g_string_append_len(s, s1, strlen(s1) + 1); } -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)}; -uint32_t interrupt_server_ranges_prop[] = {0, cpu_to_be32(max_cpus)}; -unsigned char vec5[] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x80}; -char *buf; - -add_str(hypertas, "hcall-pft"); -add_str(hypertas, "hcall-term"); -add_str(hypertas, "hcall-dabr"); -add_str(hypertas, "hcall-interrupt"); -add_str(hypertas, "hcall-tce"); -add_str(hypertas, "hcall-vio"); -add_str(hypertas, "hcall-splpar"); -add_str(hypertas, "hcall-bulk"); -add_str(hypertas, "hcall-set-mode"); -add_str(qemu_hypertas, "hcall-memop1"); - -fdt = g_malloc0(FDT_MAX_SIZE); -_FDT((fdt_create(fdt, FDT_MAX_SIZE))); - -if (spapr->kernel_size) { -_FDT((fdt_add_reservemap_entry(fdt, KERNEL_LOAD_ADDR, - spapr->kernel_size))); -} -if (spapr->initrd_size) { -_FDT((fdt_add_reservemap_entry(fdt, spapr->initrd_base, - spapr->initrd_size))); -} -_FDT((fdt_finish_reservemap(fdt))); - -/* Root node */ -_FDT((fdt_begin_node(fdt, ""))); -_FDT((fdt_property_string(fdt, "device_type", "chrp"))); -_FDT((fdt_property_string(fdt, "model", "IBM pSeries (emulated by qemu)"))); -_FDT((fdt_property_string(fdt, "compatible", "qemu,pseries"))); - -/* - * Add info to guest to indentify which host is it being run on - * and what is the uuid of the guest - */ -if (kvmppc_get_host_model()) { -_FDT((fdt_property_string(fdt, "host-model", buf))); -g_free(buf); -} -if (kvmppc_get_host_serial()) { -_FDT((fdt_property_string(fdt, "host-serial", buf))); -g_free(buf); -} - -buf = g_strdup_printf(UUID_FMT, qemu_uuid[0], qemu_uuid[1], - qemu_uuid[2], qemu_uuid[3], qemu_uuid[4], - qemu_uuid[5], qemu_uuid[6], qemu_uuid[7], - qemu_uuid[8], qemu_uuid[9], qemu_uuid[10], - qemu_uuid[11], qemu_uuid[12], qemu_uuid[13], - qemu_uuid[14], qemu_uuid[15]); - -_FDT((fdt_property_string(fdt, "vm,uuid", buf))); -if (qemu_uuid_set) { -_FDT((fdt_property_string(fdt, "system-id", buf))); -} -g_free(buf); - -if (qemu_get_vm_name()) { -_FDT((fdt_property_string(fdt, "ibm,partition-name", - qemu_get_vm_name(; -} - -_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", - _prop, sizeof(start_prop; -_FDT((fdt_property(fdt, "linux,initrd-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", , 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))); -} -