Re: [Qemu-devel] [RFC for-2.7 05/11] pseries: Build device tree only at reset time

2016-04-27 Thread David Gibson
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

2016-04-26 Thread Thomas Huth
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

2016-04-20 Thread Alexey Kardashevskiy

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 Gibson 



Reviewed-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

2016-04-19 Thread David Gibson
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)));
-}
-