[PATCH RFCv1 3/6] bus: mvebu: pass the coherency availability information at init time

Jason Cooper jason at lakedaemon.net
Fri Dec 27 12:58:31 EST 2013


All,

Including the MLs

On Thu, Dec 26, 2013 at 03:12:23PM +0100, Thomas Petazzoni wrote:
> Until now, the mvebu-mbus was guessing by itself whether hardware I/O
> coherency was available or not by poking into the Device Tree to see
> if the coherency fabric Device Tree node was present or not.
> 
> However, on some upcoming SoCs, the presence or absence of the
> coherency fabric DT node isn't sufficient: in CONFIG_SMP, the
> coherency can be enabled, but not in !CONFIG_SMP.
> 
> In order to clean this up, the mvebu_mbus_dt_init() function is
> extended to get a boolean argument telling whether coherency is
> enabled or not. Therefore, the logic to decide whether coherency is
> available or not now belongs to the core SoC code instead of the
> mvebu-mbus driver itself, which is much better.
> 
> Signed-off-by: Thomas Petazzoni <thomas.petazzoni at free-electrons.com>
> ---
>  arch/arm/mach-kirkwood/board-dt.c   |  2 +-
>  arch/arm/mach-mvebu/armada-370-xp.c |  2 +-
>  drivers/bus/mvebu-mbus.c            | 11 +++--------
>  include/linux/mbus.h                |  2 +-
>  4 files changed, 6 insertions(+), 11 deletions(-)
> 
> diff --git a/arch/arm/mach-kirkwood/board-dt.c b/arch/arm/mach-kirkwood/board-dt.c
> index 9caa4fe..ba0f1ca 100644
> --- a/arch/arm/mach-kirkwood/board-dt.c
> +++ b/arch/arm/mach-kirkwood/board-dt.c
> @@ -150,7 +150,7 @@ static void __init kirkwood_dt_init(void)
>  	 */
>  	writel(readl(CPU_CONFIG) & ~CPU_CONFIG_ERROR_PROP, CPU_CONFIG);
>  
> -	BUG_ON(mvebu_mbus_dt_init());
> +	BUG_ON(mvebu_mbus_dt_init(false));
>  
>  	kirkwood_l2_init();
>  
> diff --git a/arch/arm/mach-mvebu/armada-370-xp.c b/arch/arm/mach-mvebu/armada-370-xp.c
> index e2acff9..b407525 100644
> --- a/arch/arm/mach-mvebu/armada-370-xp.c
> +++ b/arch/arm/mach-mvebu/armada-370-xp.c
> @@ -39,7 +39,7 @@ static void __init armada_370_xp_timer_and_clk_init(void)
>  	of_clk_init(NULL);
>  	clocksource_of_init();
>  	coherency_init();
> -	BUG_ON(mvebu_mbus_dt_init());
> +	BUG_ON(mvebu_mbus_dt_init(coherency_available()));

coherency_available() is only available when support for armada 370/xp
is enabled.  Please update the Kconfig to restrict the conditions under
which this driver can be built.

thx,

Jason.

>  #ifdef CONFIG_CACHE_L2X0
>  	l2x0_of_init(0, ~0UL);
>  #endif
> diff --git a/drivers/bus/mvebu-mbus.c b/drivers/bus/mvebu-mbus.c
> index 2394e97..16d11cf 100644
> --- a/drivers/bus/mvebu-mbus.c
> +++ b/drivers/bus/mvebu-mbus.c
> @@ -700,7 +700,6 @@ static int __init mvebu_mbus_common_init(struct mvebu_mbus_state *mbus,
>  					 phys_addr_t sdramwins_phys_base,
>  					 size_t sdramwins_size)
>  {
> -	struct device_node *np;
>  	int win;
>  
>  	mbus->mbuswins_base = ioremap(mbuswins_phys_base, mbuswins_size);
> @@ -713,12 +712,6 @@ static int __init mvebu_mbus_common_init(struct mvebu_mbus_state *mbus,
>  		return -ENOMEM;
>  	}
>  
> -	np = of_find_compatible_node(NULL, NULL, "marvell,coherency-fabric");
> -	if (np) {
> -		mbus->hw_io_coherency = 1;
> -		of_node_put(np);
> -	}
> -
>  	for (win = 0; win < mbus->soc->num_wins; win++)
>  		mvebu_mbus_disable_window(mbus, win);
>  
> @@ -888,7 +881,7 @@ static void __init mvebu_mbus_get_pcie_resources(struct device_node *np,
>  	}
>  }
>  
> -int __init mvebu_mbus_dt_init(void)
> +int __init mvebu_mbus_dt_init(bool is_coherent)
>  {
>  	struct resource mbuswins_res, sdramwins_res;
>  	struct device_node *np, *controller;
> @@ -927,6 +920,8 @@ int __init mvebu_mbus_dt_init(void)
>  		return -EINVAL;
>  	}
>  
> +	mbus_state.hw_io_coherency = is_coherent;
> +
>  	/* Get optional pcie-{mem,io}-aperture properties */
>  	mvebu_mbus_get_pcie_resources(np, &mbus_state.pcie_mem_aperture,
>  					  &mbus_state.pcie_io_aperture);
> diff --git a/include/linux/mbus.h b/include/linux/mbus.h
> index 345b8c5..550c88f 100644
> --- a/include/linux/mbus.h
> +++ b/include/linux/mbus.h
> @@ -73,6 +73,6 @@ int mvebu_mbus_del_window(phys_addr_t base, size_t size);
>  int mvebu_mbus_init(const char *soc, phys_addr_t mbus_phys_base,
>  		    size_t mbus_size, phys_addr_t sdram_phys_base,
>  		    size_t sdram_size);
> -int mvebu_mbus_dt_init(void);
> +int mvebu_mbus_dt_init(bool is_coherent);
>  
>  #endif /* __LINUX_MBUS_H */
> -- 
> 1.8.3.2
> 



More information about the linux-arm-kernel mailing list