On 25/09/2019 08:45, David Gibson wrote:
> SpaprIrq::ov5 stores the value for a particular byte in PAPR option vector
> 5 which indicates whether XICS, XIVE or both interrupt controllers are
> available.  As usual for PAPR, the encoding is kind of overly complicated
> and confusing (though to be fair there are some backwards compat things it
> has to handle).
> 
> But to make our internal code clearer, have SpaprIrq encode more directly
> which backends are available as two booleans, and derive the OV5 value from
> that at the point we need it.

OK. It looks nice.
 
> Signed-off-by: David Gibson <da...@gibson.dropbear.id.au>


Reviewed-by: Cédric Le Goater <c...@kaod.org>


> ---
>  hw/ppc/spapr.c             | 15 ++++++++++++---
>  hw/ppc/spapr_hcall.c       |  6 +++---
>  hw/ppc/spapr_irq.c         | 12 ++++++++----
>  include/hw/ppc/spapr_irq.h |  3 ++-
>  4 files changed, 25 insertions(+), 11 deletions(-)
> 
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index 3742a8cf06..795f6ab505 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -1136,19 +1136,28 @@ static void 
> spapr_dt_ov5_platform_support(SpaprMachineState *spapr, void *fdt,
>      PowerPCCPU *first_ppc_cpu = POWERPC_CPU(first_cpu);
>  
>      char val[2 * 4] = {
> -        23, spapr->irq->ov5, /* Xive mode. */
> +        23, 0x00, /* XICS / XIVE mode */
>          24, 0x00, /* Hash/Radix, filled in below. */
>          25, 0x00, /* Hash options: Segment Tables == no, GTSE == no. */
>          26, 0x40, /* Radix options: GTSE == yes. */
>      };
>  
> +    if (spapr->irq->xics && spapr->irq->xive) {
> +        val[1] = SPAPR_OV5_XIVE_BOTH;
> +    } else if (spapr->irq->xive) {
> +        val[1] = SPAPR_OV5_XIVE_EXPLOIT;
> +    } else {
> +        assert(spapr->irq->xics);
> +        val[1] = SPAPR_OV5_XIVE_LEGACY;
> +    }
> +
>      if (!ppc_check_compat(first_ppc_cpu, CPU_POWERPC_LOGICAL_3_00, 0,
>                            first_ppc_cpu->compat_pvr)) {
>          /*
>           * If we're in a pre POWER9 compat mode then the guest should
>           * do hash and use the legacy interrupt mode
>           */
> -        val[1] = 0x00; /* XICS */
> +        val[1] = SPAPR_OV5_XIVE_LEGACY; /* XICS */
>          val[3] = 0x00; /* Hash */
>      } else if (kvm_enabled()) {
>          if (kvmppc_has_cap_mmu_radix() && kvmppc_has_cap_mmu_hash_v3()) {
> @@ -2837,7 +2846,7 @@ static void spapr_machine_init(MachineState *machine)
>      spapr_ovec_set(spapr->ov5, OV5_DRMEM_V2);
>  
>      /* advertise XIVE on POWER9 machines */
> -    if (spapr->irq->ov5 & (SPAPR_OV5_XIVE_EXPLOIT | SPAPR_OV5_XIVE_BOTH)) {
> +    if (spapr->irq->xive) {
>          spapr_ovec_set(spapr->ov5, OV5_XIVE_EXPLOIT);
>      }
>  
> diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c
> index 3d3a67149a..140f05c1c6 100644
> --- a/hw/ppc/spapr_hcall.c
> +++ b/hw/ppc/spapr_hcall.c
> @@ -1784,13 +1784,13 @@ static target_ulong 
> h_client_architecture_support(PowerPCCPU *cpu,
>       * terminate the boot.
>       */
>      if (guest_xive) {
> -        if (spapr->irq->ov5 == SPAPR_OV5_XIVE_LEGACY) {
> +        if (!spapr->irq->xive) {
>              error_report(
>  "Guest requested unavailable interrupt mode (XIVE), try the ic-mode=xive or 
> ic-mode=dual machine property");
>              exit(EXIT_FAILURE);
>          }
>      } else {
> -        if (spapr->irq->ov5 == SPAPR_OV5_XIVE_EXPLOIT) {
> +        if (!spapr->irq->xics) {
>              error_report(
>  "Guest requested unavailable interrupt mode (XICS), either don't set the 
> ic-mode machine property or try ic-mode=xics or ic-mode=dual");
>              exit(EXIT_FAILURE);
> @@ -1804,7 +1804,7 @@ static target_ulong 
> h_client_architecture_support(PowerPCCPU *cpu,
>       */
>      if (!spapr->cas_reboot) {
>          spapr->cas_reboot = spapr_ovec_test(ov5_updates, OV5_XIVE_EXPLOIT)
> -            && spapr->irq->ov5 & SPAPR_OV5_XIVE_BOTH;
> +            && spapr->irq->xics && spapr->irq->xive;
>      }
>  
>      spapr_ovec_cleanup(ov5_updates);
> diff --git a/hw/ppc/spapr_irq.c b/hw/ppc/spapr_irq.c
> index f53544e45e..073f375ba2 100644
> --- a/hw/ppc/spapr_irq.c
> +++ b/hw/ppc/spapr_irq.c
> @@ -209,7 +209,8 @@ static void spapr_irq_init_kvm_xics(SpaprMachineState 
> *spapr, Error **errp)
>  SpaprIrq spapr_irq_xics = {
>      .nr_xirqs    = SPAPR_NR_XIRQS,
>      .nr_msis     = SPAPR_NR_MSIS,
> -    .ov5         = SPAPR_OV5_XIVE_LEGACY,
> +    .xics        = true,
> +    .xive        = false,
>  
>      .init        = spapr_irq_init_xics,
>      .claim       = spapr_irq_claim_xics,
> @@ -357,7 +358,8 @@ static void spapr_irq_init_kvm_xive(SpaprMachineState 
> *spapr, Error **errp)
>  SpaprIrq spapr_irq_xive = {
>      .nr_xirqs    = SPAPR_NR_XIRQS,
>      .nr_msis     = SPAPR_NR_MSIS,
> -    .ov5         = SPAPR_OV5_XIVE_EXPLOIT,
> +    .xics        = false,
> +    .xive        = true,
>  
>      .init        = spapr_irq_init_xive,
>      .claim       = spapr_irq_claim_xive,
> @@ -515,7 +517,8 @@ static void spapr_irq_set_irq_dual(void *opaque, int irq, 
> int val)
>  SpaprIrq spapr_irq_dual = {
>      .nr_xirqs    = SPAPR_NR_XIRQS,
>      .nr_msis     = SPAPR_NR_MSIS,
> -    .ov5         = SPAPR_OV5_XIVE_BOTH,
> +    .xics        = true,
> +    .xive        = true,
>  
>      .init        = spapr_irq_init_dual,
>      .claim       = spapr_irq_claim_dual,
> @@ -751,7 +754,8 @@ int spapr_irq_find(SpaprMachineState *spapr, int num, 
> bool align, Error **errp)
>  SpaprIrq spapr_irq_xics_legacy = {
>      .nr_xirqs    = SPAPR_IRQ_XICS_LEGACY_NR_XIRQS,
>      .nr_msis     = SPAPR_IRQ_XICS_LEGACY_NR_XIRQS,
> -    .ov5         = SPAPR_OV5_XIVE_LEGACY,
> +    .xics        = true,
> +    .xive        = false,
>  
>      .init        = spapr_irq_init_xics,
>      .claim       = spapr_irq_claim_xics,
> diff --git a/include/hw/ppc/spapr_irq.h b/include/hw/ppc/spapr_irq.h
> index 75279ca137..6816cb0500 100644
> --- a/include/hw/ppc/spapr_irq.h
> +++ b/include/hw/ppc/spapr_irq.h
> @@ -39,7 +39,8 @@ void spapr_irq_msi_free(SpaprMachineState *spapr, int irq, 
> uint32_t num);
>  typedef struct SpaprIrq {
>      uint32_t    nr_xirqs;
>      uint32_t    nr_msis;
> -    uint8_t     ov5;
> +    bool        xics;
> +    bool        xive;
>  
>      void (*init)(SpaprMachineState *spapr, Error **errp);
>      void (*claim)(SpaprMachineState *spapr, int irq, bool lsi, Error **errp);
> 


Reply via email to