[PATCH RFCv1 1/6] ARM: mvebu: prepare coherency code to support more SOCs
Jason Cooper
jason at lakedaemon.net
Fri Dec 27 12:57:03 EST 2013
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 <thomas.petazzoni at free-electrons.com>
> ---
> .../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 at 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
>
More information about the linux-arm-kernel
mailing list