qemu-ppc
[Top][All Lists]
Advanced

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

Re: [Qemu-ppc] [Qemu-devel] [PATCH 2/2] pseries: Switch VGA endian on H_


From: Michael Roth
Subject: Re: [Qemu-ppc] [Qemu-devel] [PATCH 2/2] pseries: Switch VGA endian on H_SET_MODE
Date: Tue, 17 Feb 2015 11:03:21 -0600
User-agent: alot/0.3.4

Quoting David Gibson (2015-02-09 22:36:16)
> When the guest switches the interrupt endian mode, which essentially
> means a global machine endian switch, we want to change the VGA
> framebuffer endian mode as well in order to be backward compatible
> with existing guests who don't know about the new endian control
> register.
> 
> Signed-off-by: Benjamin Herrenschmidt <address@hidden>
> Signed-off-by: David Gibson <address@hidden>

I think maybe Gerd's review applied to the whole series, but:

Reviewed-by: Michael Roth <address@hidden>

> ---
>  hw/ppc/spapr_hcall.c   |  2 ++
>  hw/ppc/spapr_pci.c     | 28 ++++++++++++++++++++++++++++
>  include/hw/ppc/spapr.h |  1 +
>  3 files changed, 31 insertions(+)
> 
> diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c
> index 8651447..4f76f1c 100644
> --- a/hw/ppc/spapr_hcall.c
> +++ b/hw/ppc/spapr_hcall.c
> @@ -731,12 +731,14 @@ static target_ulong h_set_mode_resource_le(PowerPCCPU 
> *cpu,
>          CPU_FOREACH(cs) {
>              set_spr(cs, SPR_LPCR, 0, LPCR_ILE);
>          }
> +        spapr_pci_switch_vga(true);
>          return H_SUCCESS;
> 
>      case H_SET_MODE_ENDIAN_LITTLE:
>          CPU_FOREACH(cs) {
>              set_spr(cs, SPR_LPCR, LPCR_ILE, LPCR_ILE);
>          }
> +        spapr_pci_switch_vga(false);
>          return H_SUCCESS;
>      }
> 
> diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c
> index 21b95b3..acf9e82 100644
> --- a/hw/ppc/spapr_pci.c
> +++ b/hw/ppc/spapr_pci.c
> @@ -966,3 +966,31 @@ static void spapr_pci_register_types(void)
>  }
> 
>  type_init(spapr_pci_register_types)
> +
> +static int spapr_switch_one_vga(DeviceState *dev, void *opaque)
> +{
> +    bool be = *(bool *)opaque;
> +
> +    if (object_dynamic_cast(OBJECT(dev), "VGA")
> +        || object_dynamic_cast(OBJECT(dev), "secondary-vga")) {
> +        object_property_set_bool(OBJECT(dev), be, "big-endian-framebuffer",
> +                                 &error_abort);
> +    }
> +    return 0;
> +}
> +
> +void spapr_pci_switch_vga(bool big_endian)
> +{
> +    sPAPRPHBState *sphb;
> +
> +    /*
> +     * For backward compatibility with existing guests, we switch
> +     * the endianness of the VGA controller when changing the guest
> +     * interrupt mode
> +     */
> +    QLIST_FOREACH(sphb, &spapr->phbs, list) {
> +        BusState *bus = &PCI_HOST_BRIDGE(sphb)->bus->qbus;
> +        qbus_walk_children(bus, spapr_switch_one_vga, NULL, NULL, NULL,
> +                           &big_endian);
> +    }
> +}
> diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
> index 716bff4..6aadc94 100644
> --- a/include/hw/ppc/spapr.h
> +++ b/include/hw/ppc/spapr.h
> @@ -480,5 +480,6 @@ int spapr_dma_dt(void *fdt, int node_off, const char 
> *propname,
>                   uint32_t liobn, uint64_t window, uint32_t size);
>  int spapr_tcet_dma_dt(void *fdt, int node_off, const char *propname,
>                        sPAPRTCETable *tcet);
> +void spapr_pci_switch_vga(bool big_endian);
> 
>  #endif /* !defined (__HW_SPAPR_H__) */
> -- 
> 2.1.0




reply via email to

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