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

Re: [Xen-devel] [PATCH V3] xen: arm: X-Gene Storm check GIC DIST address for EOI quirk



On Wed, 29 Apr 2015, Pranavkumar Sawargaonkar wrote:
> In old X-Gene Storm firmware and DT, secure mode addresses have been
> mentioned in GICv2 node. In this case maintenance interrupt is used
> instead of EOI HW method.
> 
> This patch checks the GIC Distributor Base Address to enable EOI quirk
> for old firmware.
> 
> Ref:
> http://lists.xen.org/archives/html/xen-devel/2014-07/msg01263.html
> 
> Signed-off-by: Pranavkumar Sawargaonkar <pranavkumar@xxxxxxxxxx>
> Tested-by: Christoffer Dall <christoffer.dall@xxxxxxxxxx>

Acked-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>


> ChangeLog:
> 
> V3:
> - Indentation fixes and other misc comments on V2.
> V2:
> - Fine tune interrupt controller node search as per comments on V1 patch
> - Incorporating other misc comments on V1.
> V1:
> - Initial patch.
> ---
>  xen/arch/arm/platforms/xgene-storm.c |   40 
> +++++++++++++++++++++++++++++++++-
>  1 file changed, 39 insertions(+), 1 deletion(-)
> 
> diff --git a/xen/arch/arm/platforms/xgene-storm.c 
> b/xen/arch/arm/platforms/xgene-storm.c
> index 1812e5b..c717360 100644
> --- a/xen/arch/arm/platforms/xgene-storm.c
> +++ b/xen/arch/arm/platforms/xgene-storm.c
> @@ -22,6 +22,7 @@
>  #include <asm/platform.h>
>  #include <xen/stdbool.h>
>  #include <xen/vmap.h>
> +#include <xen/device_tree.h>
>  #include <asm/io.h>
>  #include <asm/gic.h>
>  
> @@ -35,9 +36,44 @@ static u64 reset_addr, reset_size;
>  static u32 reset_mask;
>  static bool reset_vals_valid = false;
>  
> +#define XGENE_SEC_GICV2_DIST_ADDR    0x78010000
> +static u32 __read_mostly xgene_quirks = PLATFORM_QUIRK_GIC_64K_STRIDE;
> +
> +static void __init xgene_check_pirq_eoi(void)
> +{
> +    const struct dt_device_node *node;
> +    int res;
> +    paddr_t dbase;
> +    const struct dt_device_match xgene_dt_int_ctrl_match[] =
> +    {
> +        DT_MATCH_COMPATIBLE("arm,cortex-a15-gic"),
> +        { /*sentinel*/ },
> +    };
> +
> +    node = dt_find_interrupt_controller(xgene_dt_int_ctrl_match);
> +    if ( !node )
> +        panic("%s: Can not find interrupt controller node", __func__);
> +
> +    res = dt_device_get_address(node, 0, &dbase, NULL);
> +    if ( !dbase )
> +        panic("%s: Cannot find a valid address for the distributor", 
> __func__);
> +
> +    /*
> +     * In old X-Gene Storm firmware and DT, secure mode addresses have
> +     * been mentioned in GICv2 node. We have to use maintenance interrupt
> +     * instead of EOI HW in this case. We check the GIC Distributor Base
> +     * Address to maintain compatibility with older firmware.
> +     */
> +    if ( dbase == XGENE_SEC_GICV2_DIST_ADDR )
> +    {
> +        xgene_quirks |= PLATFORM_QUIRK_GUEST_PIRQ_NEED_EOI;
> +        printk("Xen: WARNING: OLD X-Gene Firmware, disabling PIRQ EOI 
> mode\n");
> +    }
> +}
> +
>  static uint32_t xgene_storm_quirks(void)
>  {
> -    return PLATFORM_QUIRK_GIC_64K_STRIDE|PLATFORM_QUIRK_GUEST_PIRQ_NEED_EOI;
> +    return xgene_quirks;
>  }
>  
>  static int map_one_mmio(struct domain *d, const char *what,
> @@ -216,6 +252,8 @@ static int xgene_storm_init(void)
>      reset_mask = XGENE_RESET_MASK;
>  
>      reset_vals_valid = true;
> +    xgene_check_pirq_eoi();
> +
>      return 0;
>  }
>  
> -- 
> 1.7.9.5
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.