All,

resending to include the MLs.

On Thu, Dec 26, 2013 at 03:12:21PM +0100, Thomas Petazzoni wrote:
> The code that handles the coherency fabric of Armada 370 and Armada XP
> in arch/arm/mach-mvebu/coherency.c made the assumption that there was
> only one type of coherency fabric. Unfortunately, it turns out that
> upcoming SoCs have a slightly different coherency unit.
> 
> In preparation to the introduction of the coherency support for more
> SoCs, this commit:
> 
>  * Adds a new "marvell,armada-370-coherency-fabric" compatible string,
>    to indicate the Armada 370/XP variant of the coherency fabric. The
>    existing compatible string "marvel,coherency-fabric" is preserved
>    for compatibility reasons, and has the same behavior as
>    the new "marvell,armada-370-coherency-fabric".
> 
>  * Introduces a data associated to the compatible string in the
>    compatible string match table, so that the code can differantiate
>    the variant of coherency unit being used.
> 
>  * Separates the coherency unit initialization code into its own
>    function.
> 
> Signed-off-by: Thomas Petazzoni <[email protected]>
> ---
>  .../devicetree/bindings/arm/coherency-fabric.txt   | 12 ++++-
>  arch/arm/mach-mvebu/coherency.c                    | 53 
> ++++++++++++++++------
>  2 files changed, 49 insertions(+), 16 deletions(-)
> 
> diff --git a/Documentation/devicetree/bindings/arm/coherency-fabric.txt 
> b/Documentation/devicetree/bindings/arm/coherency-fabric.txt
> index 17d8cd1..6bd8788 100644
> --- a/Documentation/devicetree/bindings/arm/coherency-fabric.txt
> +++ b/Documentation/devicetree/bindings/arm/coherency-fabric.txt
> @@ -4,7 +4,15 @@ Available on Marvell SOCs: Armada 370 and Armada XP
>  
>  Required properties:
>  
> -- compatible: "marvell,coherency-fabric"
> +- compatible: the possible values are:
> +
> + * "marvell,coherency-fabric", kept for backward compatibility reasons
> +   only. To be used for the coherency fabric of the Armada 370 and
> +   Armada XP. It is recommended to use
> +   "marvell,armada-370-coherency-fabric" instead.
> +
> + * "marvell,armada-370-coherency-fabric", for the Armada 370 and
> +   Armada XP coherency fabric.

This is completely unneeded.  Once the new SoC is announced, all you
should need is marvell,coherency-fabric (for 370/XP) and
marvell,whizbang-coherency-fabric for the new whizbang SoC.

thx,

Jason.

>  
>  - reg: Should contain coherency fabric registers location and
>    length. First pair for the coherency fabric registers, second pair
> @@ -13,7 +21,7 @@ Required properties:
>  Example:
>  
>  coherency-fabric@d0020200 {
> -     compatible = "marvell,coherency-fabric";
> +     compatible = "marvell,armada-370-coherency-fabric";
>       reg = <0xd0020200 0xb0>,
>               <0xd0021810 0x1c>;
>  
> diff --git a/arch/arm/mach-mvebu/coherency.c b/arch/arm/mach-mvebu/coherency.c
> index 58adf2f..a8209ae 100644
> --- a/arch/arm/mach-mvebu/coherency.c
> +++ b/arch/arm/mach-mvebu/coherency.c
> @@ -37,8 +37,20 @@ static void __iomem *coherency_cpu_base;
>  
>  #define IO_SYNC_BARRIER_CTL_OFFSET              0x0
>  
> +enum {
> +     COHERENCY_FABRIC_TYPE_ARMADA_370_XP,
> +};
> +
> +/*
> + * The "marvell,coherency-fabric" compatible string is kept for
> + * backward compatibility reasons, and is equivalent to
> + * "marvell,armada-370-coherency-fabric".
> + */
>  static struct of_device_id of_coherency_table[] = {
> -     {.compatible = "marvell,coherency-fabric"},
> +     {.compatible = "marvell,coherency-fabric",
> +      .data = (void *) COHERENCY_FABRIC_TYPE_ARMADA_370_XP },
> +     {.compatible = "marvell,armada-370-coherency-fabric",
> +      .data = (void *) COHERENCY_FABRIC_TYPE_ARMADA_370_XP },
>       { /* end of list */ },
>  };
>  
> @@ -120,26 +132,39 @@ static struct notifier_block mvebu_hwcc_platform_nb = {
>       .notifier_call = mvebu_hwcc_platform_notifier,
>  };
>  
> +static void __init armada_370_coherency_init(struct device_node *np)
> +{
> +     struct resource res;
> +     of_address_to_resource(np, 0, &res);
> +     coherency_phys_base = res.start;
> +     /*
> +      * Ensure secondary CPUs will see the updated value,
> +      * which they read before they join the coherency
> +      * fabric, and therefore before they are coherent with
> +      * the boot CPU cache.
> +      */
> +     sync_cache_w(&coherency_phys_base);
> +     coherency_base = of_iomap(np, 0);
> +     coherency_cpu_base = of_iomap(np, 1);
> +     set_cpu_coherent(cpu_logical_map(smp_processor_id()), 0);
> +}
> +
>  int __init coherency_init(void)
>  {
>       struct device_node *np;
>  
>       np = of_find_matching_node(NULL, of_coherency_table);
>       if (np) {
> -             struct resource res;
> +             const struct of_device_id *match =
> +                     of_match_node(of_coherency_table, np);
> +             int type;
> +
> +             type = (int) match->data;
>               pr_info("Initializing Coherency fabric\n");
> -             of_address_to_resource(np, 0, &res);
> -             coherency_phys_base = res.start;
> -             /*
> -              * Ensure secondary CPUs will see the updated value,
> -              * which they read before they join the coherency
> -              * fabric, and therefore before they are coherent with
> -              * the boot CPU cache.
> -              */
> -             sync_cache_w(&coherency_phys_base);
> -             coherency_base = of_iomap(np, 0);
> -             coherency_cpu_base = of_iomap(np, 1);
> -             set_cpu_coherent(cpu_logical_map(smp_processor_id()), 0);
> +
> +             if (type == COHERENCY_FABRIC_TYPE_ARMADA_370_XP)
> +                     armada_370_coherency_init(np);
> +
>               of_node_put(np);
>       }
>  
> -- 
> 1.8.3.2
> 
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to