|
[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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |