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

Re: [Xen-devel] [PATCH v2 for-4.5 5/5] xen: arm: Support the other 4 PCI buses on Xgene



Hi Ian,

On 11/19/2014 03:28 PM, Ian Campbell wrote:
> Currently we only establish specific mappings for pcie0, which is
> used on the Mustang platform. However at least McDivitt uses pcie3.
> So wire up all the others, based on whether the corresponding DT node
> is marked as available.
> 
> This results in no change for Mustang.
> 
> Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
> ---
> v2: - Didn't constify dt node pointer -- dt_find_compatible_node needs a
>       non-const

Oh right. A bit annoying, I will look at it to see if we can constify
the parameter in Xen 4.6.

Reviewed-by: Julien Grall <julien.grall@xxxxxxxxxx>

Regards,

>     - Print a message when ignoring an unknown bus
>     - Log with dt node full anme instead of CFG space address.
>     - Log at start of xgene_storm_pcie_specific_mapping instead of in the
>       caller after the fact.
> ---
>  xen/arch/arm/platforms/xgene-storm.c |   89 
> +++++++++++++++++++++++++++++-----
>  1 file changed, 76 insertions(+), 13 deletions(-)
> 
> diff --git a/xen/arch/arm/platforms/xgene-storm.c 
> b/xen/arch/arm/platforms/xgene-storm.c
> index 8c27f24..0b3492d 100644
> --- a/xen/arch/arm/platforms/xgene-storm.c
> +++ b/xen/arch/arm/platforms/xgene-storm.c
> @@ -78,35 +78,35 @@ static int map_one_spi(struct domain *d, const char *what,
>      return ret;
>  }
>  
> -/*
> - * Xen does not currently support mapping MMIO regions and interrupt
> - * for bus child devices (referenced via the "ranges" and
> - * "interrupt-map" properties to domain 0). Instead for now map the
> - * necessary resources manually.
> - */
> -static int xgene_storm_specific_mapping(struct domain *d)
> +/* Creates MMIO mappings base..end as well as 4 SPIs from the given base. */
> +static int xgene_storm_pcie_specific_mapping(struct domain *d,
> +                                             const struct dt_device_node 
> *node,
> +                                             paddr_t base, paddr_t end,
> +                                             int base_spi)
>  {
>      int ret;
>  
> +    printk("Mapping additional regions for PCIe device %s\n",
> +           dt_node_full_name(node));
> +
>      /* Map the PCIe bus resources */
> -    ret = map_one_mmio(d, "PCI MEMORY", paddr_to_pfn(0x0e000000000UL),
> -                                        paddr_to_pfn(0x01000000000UL));
> +    ret = map_one_mmio(d, "PCI MEMORY", paddr_to_pfn(base), 
> paddr_to_pfn(end));
>      if ( ret )
>          goto err;
>  
> -    ret = map_one_spi(d, "PCI#INTA", 0xc2, DT_IRQ_TYPE_LEVEL_HIGH);
> +    ret = map_one_spi(d, "PCI#INTA", base_spi+0, DT_IRQ_TYPE_LEVEL_HIGH);
>      if ( ret )
>          goto err;
>  
> -    ret = map_one_spi(d, "PCI#INTB", 0xc3, DT_IRQ_TYPE_LEVEL_HIGH);
> +    ret = map_one_spi(d, "PCI#INTB", base_spi+1, DT_IRQ_TYPE_LEVEL_HIGH);
>      if ( ret )
>          goto err;
>  
> -    ret = map_one_spi(d, "PCI#INTC", 0xc4, DT_IRQ_TYPE_LEVEL_HIGH);
> +    ret = map_one_spi(d, "PCI#INTC", base_spi+2, DT_IRQ_TYPE_LEVEL_HIGH);
>      if ( ret )
>          goto err;
>  
> -    ret = map_one_spi(d, "PCI#INTD", 0xc5, DT_IRQ_TYPE_LEVEL_HIGH);
> +    ret = map_one_spi(d, "PCI#INTD", base_spi+3, DT_IRQ_TYPE_LEVEL_HIGH);
>      if ( ret )
>          goto err;
>  
> @@ -115,6 +115,69 @@ err:
>      return ret;
>  }
>  
> +/*
> + * Xen does not currently support mapping MMIO regions and interrupt
> + * for bus child devices (referenced via the "ranges" and
> + * "interrupt-map" properties to domain 0). Instead for now map the
> + * necessary resources manually.
> + */
> +static int xgene_storm_specific_mapping(struct domain *d)
> +{
> +    struct dt_device_node *node = NULL;
> +    int ret;
> +
> +    while ( (node = dt_find_compatible_node(node, "pci", "apm,xgene-pcie")) )
> +    {
> +        u64 addr;
> +
> +        /* Identify the bus via it's control register address */
> +        ret = dt_device_get_address(node, 0, &addr, NULL);
> +        if ( ret < 0 )
> +            return ret;
> +
> +        if ( !dt_device_is_available(node) )
> +            continue;
> +
> +       switch ( addr )
> +        {
> +        case 0x1f2b0000: /* PCIe0 */
> +            ret = xgene_storm_pcie_specific_mapping(d,
> +                node,
> +                0x0e000000000UL, 0x10000000000UL, 0xc2);
> +            break;
> +        case 0x1f2c0000: /* PCIe1 */
> +            ret = xgene_storm_pcie_specific_mapping(d,
> +                node,
> +                0x0d000000000UL, 0x0e000000000UL, 0xc8);
> +            break;
> +        case 0x1f2d0000: /* PCIe2 */
> +            ret = xgene_storm_pcie_specific_mapping(d,
> +                node,
> +                0x09000000000UL, 0x0a000000000UL, 0xce);
> +            break;
> +        case 0x1f500000: /* PCIe3 */
> +            ret = xgene_storm_pcie_specific_mapping(d,
> +                node,
> +                0x0a000000000UL, 0x0c000000000UL, 0xd4);
> +            break;
> +        case 0x1f510000: /* PCIe4 */
> +            ret = xgene_storm_pcie_specific_mapping(d,
> +                node,
> +                0x0c000000000UL, 0x0d000000000UL, 0xda);
> +            break;
> +
> +        default:
> +            printk("Ignoring unknown PCI bus %s\n", dt_node_full_name(node));
> +            continue;
> +        }
> +
> +        if ( ret < 0 )
> +            return ret;
> +    }
> +
> +    return 0;
> +}
> +
>  static void xgene_storm_reset(void)
>  {
>      void __iomem *addr;
> 


-- 
Julien Grall

_______________________________________________
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®.