qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [for-5.0 3/4] spapr: Fold h_cas_compose_response() into h_client_arc


From: David Gibson
Subject: Re: [for-5.0 3/4] spapr: Fold h_cas_compose_response() into h_client_architecture_support()
Date: Mon, 2 Dec 2019 19:40:13 +1100
User-agent: Mutt/1.12.1 (2019-06-15)

On Mon, Dec 02, 2019 at 09:23:35AM +0100, Greg Kurz wrote:
> On Fri, 29 Nov 2019 16:33:55 +1100
> David Gibson <address@hidden> wrote:
> 
> > spapr_h_cas_compose_response() handles the last piece of the PAPR feature
> > negotiation process invoked via the ibm,client-architecture-support OF
> > call.  Its only caller is h_client_architecture_support() which handles
> > most of the rest of that process.
> > 
> > I believe it was place in a separate file originally to handle some fiddly
> 
> it was placed

fixed, thanks.

> 
> > dependencies between functions, but mostly it's just confusing to have
> > the CAS process split into two pieces like this.  Now that compose response
> > is simplified (by just generating the whole device tree anew), it's cleaner
> > to just fold it into h_client_architecture_support().
> > 
> > Signed-off-by: David Gibson <address@hidden>
> > ---
> 
> Reviewed-by: Greg Kurz <address@hidden>
> 
> >  hw/ppc/spapr.c         | 61 +-----------------------------------------
> >  hw/ppc/spapr_hcall.c   | 55 ++++++++++++++++++++++++++++++++++---
> >  include/hw/ppc/spapr.h |  4 +--
> >  3 files changed, 54 insertions(+), 66 deletions(-)
> > 
> > diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> > index d34e317f48..5187f5b0a5 100644
> > --- a/hw/ppc/spapr.c
> > +++ b/hw/ppc/spapr.c
> > @@ -76,7 +76,6 @@
> >  #include "hw/nmi.h"
> >  #include "hw/intc/intc.h"
> >  
> > -#include "qemu/cutils.h"
> >  #include "hw/ppc/spapr_cpu_core.h"
> >  #include "hw/mem/memory-device.h"
> >  #include "hw/ppc/spapr_tpm_proxy.h"
> > @@ -897,63 +896,6 @@ out:
> >      return ret;
> >  }
> >  
> > -static bool spapr_hotplugged_dev_before_cas(void)
> > -{
> > -    Object *drc_container, *obj;
> > -    ObjectProperty *prop;
> > -    ObjectPropertyIterator iter;
> > -
> > -    drc_container = container_get(object_get_root(), "/dr-connector");
> > -    object_property_iter_init(&iter, drc_container);
> > -    while ((prop = object_property_iter_next(&iter))) {
> > -        if (!strstart(prop->type, "link<", NULL)) {
> > -            continue;
> > -        }
> > -        obj = object_property_get_link(drc_container, prop->name, NULL);
> > -        if (spapr_drc_needed(obj)) {
> > -            return true;
> > -        }
> > -    }
> > -    return false;
> > -}
> > -
> > -static void *spapr_build_fdt(SpaprMachineState *spapr, bool reset,
> > -                             size_t space);
> > -
> > -int spapr_h_cas_compose_response(SpaprMachineState *spapr,
> > -                                 target_ulong addr, target_ulong size,
> > -                                 SpaprOptionVector *ov5_updates)
> > -{
> > -    void *fdt;
> > -    SpaprDeviceTreeUpdateHeader hdr = { .version_id = 1 };
> > -
> > -    if (spapr_hotplugged_dev_before_cas()) {
> > -        return 1;
> > -    }
> > -
> > -    if (size < sizeof(hdr)) {
> > -        error_report("SLOF provided insufficient CAS buffer "
> > -                     TARGET_FMT_lu " (min: %zu)", size, sizeof(hdr));
> > -        exit(EXIT_FAILURE);
> > -    }
> > -
> > -    size -= sizeof(hdr);
> > -
> > -    fdt = spapr_build_fdt(spapr, false, size);
> > -    _FDT((fdt_pack(fdt)));
> > -
> > -    cpu_physical_memory_write(addr, &hdr, sizeof(hdr));
> > -    cpu_physical_memory_write(addr + sizeof(hdr), fdt, fdt_totalsize(fdt));
> > -    trace_spapr_cas_continue(fdt_totalsize(fdt) + sizeof(hdr));
> > -
> > -    g_free(spapr->fdt_blob);
> > -    spapr->fdt_size = fdt_totalsize(fdt);
> > -    spapr->fdt_initial_size = spapr->fdt_size;
> > -    spapr->fdt_blob = fdt;
> > -
> > -    return 0;
> > -}
> > -
> >  static void spapr_dt_rtas(SpaprMachineState *spapr, void *fdt)
> >  {
> >      MachineState *ms = MACHINE(spapr);
> > @@ -1191,8 +1133,7 @@ static void spapr_dt_hypervisor(SpaprMachineState 
> > *spapr, void *fdt)
> >      }
> >  }
> >  
> > -static void *spapr_build_fdt(SpaprMachineState *spapr, bool reset,
> > -                             size_t space)
> > +void *spapr_build_fdt(SpaprMachineState *spapr, bool reset, size_t space)
> >  {
> >      MachineState *machine = MACHINE(spapr);
> >      MachineClass *mc = MACHINE_GET_CLASS(machine);
> > diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c
> > index 05a7ca275b..0f19be794c 100644
> > --- a/hw/ppc/spapr_hcall.c
> > +++ b/hw/ppc/spapr_hcall.c
> > @@ -1,4 +1,5 @@
> >  #include "qemu/osdep.h"
> > +#include "qemu/cutils.h"
> >  #include "qapi/error.h"
> >  #include "sysemu/hw_accel.h"
> >  #include "sysemu/runstate.h"
> > @@ -15,6 +16,7 @@
> >  #include "cpu-models.h"
> >  #include "trace.h"
> >  #include "kvm_ppc.h"
> > +#include "hw/ppc/fdt.h"
> >  #include "hw/ppc/spapr_ovec.h"
> >  #include "mmu-book3s-v3.h"
> >  #include "hw/mem/memory-device.h"
> > @@ -1638,6 +1640,26 @@ static uint32_t cas_check_pvr(SpaprMachineState 
> > *spapr, PowerPCCPU *cpu,
> >      return best_compat;
> >  }
> >  
> > +static bool spapr_hotplugged_dev_before_cas(void)
> > +{
> > +    Object *drc_container, *obj;
> > +    ObjectProperty *prop;
> > +    ObjectPropertyIterator iter;
> > +
> > +    drc_container = container_get(object_get_root(), "/dr-connector");
> > +    object_property_iter_init(&iter, drc_container);
> > +    while ((prop = object_property_iter_next(&iter))) {
> > +        if (!strstart(prop->type, "link<", NULL)) {
> > +            continue;
> > +        }
> > +        obj = object_property_get_link(drc_container, prop->name, NULL);
> > +        if (spapr_drc_needed(obj)) {
> > +            return true;
> > +        }
> > +    }
> > +    return false;
> > +}
> > +
> >  static target_ulong h_client_architecture_support(PowerPCCPU *cpu,
> >                                                    SpaprMachineState *spapr,
> >                                                    target_ulong opcode,
> > @@ -1645,6 +1667,8 @@ static target_ulong 
> > h_client_architecture_support(PowerPCCPU *cpu,
> >  {
> >      /* Working address in data buffer */
> >      target_ulong addr = ppc64_phys_to_real(args[0]);
> > +    target_ulong fdt_buf = args[1];
> > +    target_ulong fdt_bufsize = args[2];
> >      target_ulong ov_table;
> >      uint32_t cas_pvr;
> >      SpaprOptionVector *ov1_guest, *ov5_guest, *ov5_cas_old, *ov5_updates;
> > @@ -1788,16 +1812,41 @@ static target_ulong 
> > h_client_architecture_support(PowerPCCPU *cpu,
> >  
> >      spapr_irq_update_active_intc(spapr);
> >  
> > +    if (spapr_hotplugged_dev_before_cas()) {
> > +        spapr->cas_reboot = true;
> > +    }
> > +
> >      if (!spapr->cas_reboot) {
> > +        void *fdt;
> > +        SpaprDeviceTreeUpdateHeader hdr = { .version_id = 1 };
> > +
> >          /* If spapr_machine_reset() did not set up a HPT but one is 
> > necessary
> >           * (because the guest isn't going to use radix) then set it up 
> > here. */
> >          if ((spapr->patb_entry & PATE1_GR) && !guest_radix) {
> >              /* legacy hash or new hash: */
> >              spapr_setup_hpt_and_vrma(spapr);
> >          }
> > -        spapr->cas_reboot =
> > -            (spapr_h_cas_compose_response(spapr, args[1], args[2],
> > -                                          ov5_updates) != 0);
> > +
> > +        if (fdt_bufsize < sizeof(hdr)) {
> > +            error_report("SLOF provided insufficient CAS buffer "
> > +                         TARGET_FMT_lu " (min: %zu)", fdt_bufsize, 
> > sizeof(hdr));
> > +            exit(EXIT_FAILURE);
> > +        }
> > +
> > +        fdt_bufsize -= sizeof(hdr);
> > +
> > +        fdt = spapr_build_fdt(spapr, false, fdt_bufsize);
> > +        _FDT((fdt_pack(fdt)));
> > +
> > +        cpu_physical_memory_write(fdt_buf, &hdr, sizeof(hdr));
> > +        cpu_physical_memory_write(fdt_buf + sizeof(hdr), fdt,
> > +                                  fdt_totalsize(fdt));
> > +        trace_spapr_cas_continue(fdt_totalsize(fdt) + sizeof(hdr));
> > +
> > +        g_free(spapr->fdt_blob);
> > +        spapr->fdt_size = fdt_totalsize(fdt);
> > +        spapr->fdt_initial_size = spapr->fdt_size;
> > +        spapr->fdt_blob = fdt;
> >      }
> >  
> >      spapr_ovec_cleanup(ov5_updates);
> > diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
> > index d5ab5ea7b2..61f005c6f6 100644
> > --- a/include/hw/ppc/spapr.h
> > +++ b/include/hw/ppc/spapr.h
> > @@ -766,11 +766,9 @@ struct SpaprEventLogEntry {
> >      QTAILQ_ENTRY(SpaprEventLogEntry) next;
> >  };
> >  
> > +void *spapr_build_fdt(SpaprMachineState *spapr, bool reset, size_t space);
> >  void spapr_events_init(SpaprMachineState *sm);
> >  void spapr_dt_events(SpaprMachineState *sm, void *fdt);
> > -int spapr_h_cas_compose_response(SpaprMachineState *sm,
> > -                                 target_ulong addr, target_ulong size,
> > -                                 SpaprOptionVector *ov5_updates);
> >  void close_htab_fd(SpaprMachineState *spapr);
> >  void spapr_setup_hpt_and_vrma(SpaprMachineState *spapr);
> >  void spapr_free_hpt(SpaprMachineState *spapr);
> 

-- 
David Gibson                    | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au  | minimalist, thank you.  NOT _the_ _other_
                                | _way_ _around_!
http://www.ozlabs.org/~dgibson

Attachment: signature.asc
Description: PGP signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]