[PATCH] arm: mvebu: mbus: Fix mbus driver to work also after U-Boot relocation

Chris Packham Chris.Packham at alliedtelesis.co.nz
Thu Aug 25 04:40:13 CEST 2022


Hi Pali,

On 23/08/22 11:00, Pali Rohár wrote:
> On Wednesday 17 August 2022 08:17:36 Stefan Roese wrote:
>> On 10.08.22 14:46, Pali Rohár wrote:
>>> mbus driver is initialized from arch_cpu_init() callback which is called
>>> before relocation. This driver stores lot of functions and structure
>>> pointers into global variables, so it is data position dependent.
>>>
>>> Therefore after relocations all pointers are invalid and driver does not
>>> work anymore as all pointers referes to the old memory, which overlaps with
>>> CONFIG_SYS_LOAD_ADDR and ${loadaddr}.
>>>
>>> For example U-Boot fuse command crashes if loadaddr memory is cleared or
>>> rewritten by some image loaded by U-Boot load command.
>>>
>>>     mw.w ${loadaddr} 0x0 10000
>>>     fuse read 0 1 2
>>>
>>> Fix this issue by removing of all mbus global variables in which are stored
>>> pointers to structures or functions which changes during relocation. And
>>> replace it by direct function calls (not via pointers). With this change
>>> fuse command finally works.
>>>
>>> Signed-off-by: Pali Rohár <pali at kernel.org>
>> Reviewed-by: Stefan Roese <sr at denx.de>
>>
>> Thanks,
>> Stefan
> Stefan, this is something which is needed to have fixed. Could you test
> this change on your boards and prepare for merging to master branch?
>
> Chris, could you also test this change for possible regressions?
>
> I have tested it on A385 Turris Omnia.

I see I'm a little late to the testing party but I've just checked what 
was merged on an x530 and it's all good there.

>>> ---
>>>    arch/arm/mach-kirkwood/include/mach/cpu.h |   3 -
>>>    arch/arm/mach-mvebu/include/mach/cpu.h    |   3 -
>>>    arch/arm/mach-mvebu/mbus.c                | 167 +++++++++-------------
>>>    board/alliedtelesis/x530/x530.c           |   2 +-
>>>    board/maxbcm/maxbcm.c                     |   8 +-
>>>    board/theadorable/theadorable.c           |   4 +-
>>>    include/linux/mbus.h                      |  13 +-
>>>    7 files changed, 75 insertions(+), 125 deletions(-)
>>>
>>> diff --git a/arch/arm/mach-kirkwood/include/mach/cpu.h b/arch/arm/mach-kirkwood/include/mach/cpu.h
>>> index 71c546f9acf6..d8639c60352b 100644
>>> --- a/arch/arm/mach-kirkwood/include/mach/cpu.h
>>> +++ b/arch/arm/mach-kirkwood/include/mach/cpu.h
>>> @@ -144,9 +144,6 @@ struct kwgpio_registers {
>>>    	u32 irq_level;
>>>    };
>>> -/* Needed for dynamic (board-specific) mbus configuration */
>>> -extern struct mvebu_mbus_state mbus_state;
>>> -
>>>    /*
>>>     * functions
>>>     */
>>> diff --git a/arch/arm/mach-mvebu/include/mach/cpu.h b/arch/arm/mach-mvebu/include/mach/cpu.h
>>> index 689c96bd4eac..d9fa1f32aa52 100644
>>> --- a/arch/arm/mach-mvebu/include/mach/cpu.h
>>> +++ b/arch/arm/mach-mvebu/include/mach/cpu.h
>>> @@ -122,9 +122,6 @@ struct sar_freq_modes {
>>>    	u32 d_clk;
>>>    };
>>> -/* Needed for dynamic (board-specific) mbus configuration */
>>> -extern struct mvebu_mbus_state mbus_state;
>>> -
>>>    /*
>>>     * functions
>>>     */
>>> diff --git a/arch/arm/mach-mvebu/mbus.c b/arch/arm/mach-mvebu/mbus.c
>>> index 3b1b9f73ebf6..7092f6cc10c2 100644
>>> --- a/arch/arm/mach-mvebu/mbus.c
>>> +++ b/arch/arm/mach-mvebu/mbus.c
>>> @@ -88,31 +88,34 @@
>>>    #define DOVE_DDR_BASE_CS_OFF(n) ((n) << 4)
>>> -struct mvebu_mbus_state;
>>> -
>>> -struct mvebu_mbus_soc_data {
>>> -	unsigned int num_wins;
>>> -	unsigned int num_remappable_wins;
>>> -	unsigned int (*win_cfg_offset)(const int win);
>>> -	void (*setup_cpu_target)(struct mvebu_mbus_state *s);
>>> -};
>>> -
>>> -struct mvebu_mbus_state mbus_state
>>> -	__section(".data");
>>>    static struct mbus_dram_target_info mbus_dram_info
>>>    	__section(".data");
>>> +#if defined(CONFIG_ARCH_MVEBU)
>>> +	#define MVEBU_MBUS_NUM_WINS 20
>>> +	#define MVEBU_MBUS_NUM_REMAPPABLE_WINS 8
>>> +	#define MVEBU_MBUS_WIN_CFG_OFFSET(win) armada_370_xp_mbus_win_offset(win)
>>> +#elif defined(CONFIG_ARCH_KIRKWOOD)
>>> +	#define MVEBU_MBUS_NUM_WINS 8
>>> +	#define MVEBU_MBUS_NUM_REMAPPABLE_WINS 4
>>> +	#define MVEBU_MBUS_WIN_CFG_OFFSET(win) orion5x_mbus_win_offset(win)
>>> +#else
>>> +	#error "No supported architecture"
>>> +#endif
>>> +
>>> +static unsigned int armada_370_xp_mbus_win_offset(int win);
>>> +static unsigned int orion5x_mbus_win_offset(int win);
>>> +
>>>    /*
>>>     * Functions to manipulate the address decoding windows
>>>     */
>>> -static void mvebu_mbus_read_window(struct mvebu_mbus_state *mbus,
>>> -				   int win, int *enabled, u64 *base,
>>> +static void mvebu_mbus_read_window(int win, int *enabled, u64 *base,
>>>    				   u32 *size, u8 *target, u8 *attr,
>>>    				   u64 *remap)
>>>    {
>>> -	void __iomem *addr = mbus->mbuswins_base +
>>> -		mbus->soc->win_cfg_offset(win);
>>> +	void __iomem *addr = (void __iomem *)MVEBU_CPU_WIN_BASE +
>>> +		MVEBU_MBUS_WIN_CFG_OFFSET(win);
>>>    	u32 basereg = readl(addr + WIN_BASE_OFF);
>>>    	u32 ctrlreg = readl(addr + WIN_CTRL_OFF);
>>> @@ -133,7 +136,7 @@ static void mvebu_mbus_read_window(struct mvebu_mbus_state *mbus,
>>>    		*attr = (ctrlreg & WIN_CTRL_ATTR_MASK) >> WIN_CTRL_ATTR_SHIFT;
>>>    	if (remap) {
>>> -		if (win < mbus->soc->num_remappable_wins) {
>>> +		if (win < MVEBU_MBUS_NUM_REMAPPABLE_WINS) {
>>>    			u32 remap_low = readl(addr + WIN_REMAP_LO_OFF);
>>>    			u32 remap_hi  = readl(addr + WIN_REMAP_HI_OFF);
>>>    			*remap = ((u64)remap_hi << 32) | remap_low;
>>> @@ -143,27 +146,25 @@ static void mvebu_mbus_read_window(struct mvebu_mbus_state *mbus,
>>>    	}
>>>    }
>>> -static void mvebu_mbus_disable_window(struct mvebu_mbus_state *mbus,
>>> -				      int win)
>>> +static void mvebu_mbus_disable_window(int win)
>>>    {
>>>    	void __iomem *addr;
>>> -	addr = mbus->mbuswins_base + mbus->soc->win_cfg_offset(win);
>>> +	addr = (void __iomem *)MVEBU_CPU_WIN_BASE + MVEBU_MBUS_WIN_CFG_OFFSET(win);
>>>    	writel(0, addr + WIN_BASE_OFF);
>>>    	writel(0, addr + WIN_CTRL_OFF);
>>> -	if (win < mbus->soc->num_remappable_wins) {
>>> +	if (win < MVEBU_MBUS_NUM_REMAPPABLE_WINS) {
>>>    		writel(0, addr + WIN_REMAP_LO_OFF);
>>>    		writel(0, addr + WIN_REMAP_HI_OFF);
>>>    	}
>>>    }
>>>    /* Checks whether the given window number is available */
>>> -static int mvebu_mbus_window_is_free(struct mvebu_mbus_state *mbus,
>>> -				     const int win)
>>> +static int mvebu_mbus_window_is_free(const int win)
>>>    {
>>> -	void __iomem *addr = mbus->mbuswins_base +
>>> -		mbus->soc->win_cfg_offset(win);
>>> +	void __iomem *addr = (void __iomem *)MVEBU_CPU_WIN_BASE +
>>> +		MVEBU_MBUS_WIN_CFG_OFFSET(win);
>>>    	u32 ctrl = readl(addr + WIN_CTRL_OFF);
>>>    	return !(ctrl & WIN_CTRL_ENABLE);
>>>    }
>>> @@ -172,20 +173,19 @@ static int mvebu_mbus_window_is_free(struct mvebu_mbus_state *mbus,
>>>     * Checks whether the given (base, base+size) area doesn't overlap an
>>>     * existing region
>>>     */
>>> -static int mvebu_mbus_window_conflicts(struct mvebu_mbus_state *mbus,
>>> -				       phys_addr_t base, size_t size,
>>> +static int mvebu_mbus_window_conflicts(phys_addr_t base, size_t size,
>>>    				       u8 target, u8 attr)
>>>    {
>>>    	u64 end = (u64)base + size;
>>>    	int win;
>>> -	for (win = 0; win < mbus->soc->num_wins; win++) {
>>> +	for (win = 0; win < MVEBU_MBUS_NUM_WINS; win++) {
>>>    		u64 wbase, wend;
>>>    		u32 wsize;
>>>    		u8 wtarget, wattr;
>>>    		int enabled;
>>> -		mvebu_mbus_read_window(mbus, win,
>>> +		mvebu_mbus_read_window(win,
>>>    				       &enabled, &wbase, &wsize,
>>>    				       &wtarget, &wattr, NULL);
>>> @@ -211,17 +211,16 @@ static int mvebu_mbus_window_conflicts(struct mvebu_mbus_state *mbus,
>>>    	return 1;
>>>    }
>>> -static int mvebu_mbus_find_window(struct mvebu_mbus_state *mbus,
>>> -				  phys_addr_t base, size_t size)
>>> +static int mvebu_mbus_find_window(phys_addr_t base, size_t size)
>>>    {
>>>    	int win;
>>> -	for (win = 0; win < mbus->soc->num_wins; win++) {
>>> +	for (win = 0; win < MVEBU_MBUS_NUM_WINS; win++) {
>>>    		u64 wbase;
>>>    		u32 wsize;
>>>    		int enabled;
>>> -		mvebu_mbus_read_window(mbus, win,
>>> +		mvebu_mbus_read_window(win,
>>>    				       &enabled, &wbase, &wsize,
>>>    				       NULL, NULL, NULL);
>>> @@ -235,13 +234,12 @@ static int mvebu_mbus_find_window(struct mvebu_mbus_state *mbus,
>>>    	return -ENODEV;
>>>    }
>>> -static int mvebu_mbus_setup_window(struct mvebu_mbus_state *mbus,
>>> -				   int win, phys_addr_t base, size_t size,
>>> +static int mvebu_mbus_setup_window(int win, phys_addr_t base, size_t size,
>>>    				   phys_addr_t remap, u8 target,
>>>    				   u8 attr)
>>>    {
>>> -	void __iomem *addr = mbus->mbuswins_base +
>>> -		mbus->soc->win_cfg_offset(win);
>>> +	void __iomem *addr = (void __iomem *)MVEBU_CPU_WIN_BASE +
>>> +		MVEBU_MBUS_WIN_CFG_OFFSET(win);
>>>    	u32 ctrl, remap_addr;
>>>    	ctrl = ((size - 1) & WIN_CTRL_SIZE_MASK) |
>>> @@ -251,7 +249,7 @@ static int mvebu_mbus_setup_window(struct mvebu_mbus_state *mbus,
>>>    	writel(base & WIN_BASE_LOW, addr + WIN_BASE_OFF);
>>>    	writel(ctrl, addr + WIN_CTRL_OFF);
>>> -	if (win < mbus->soc->num_remappable_wins) {
>>> +	if (win < MVEBU_MBUS_NUM_REMAPPABLE_WINS) {
>>>    		if (remap == MVEBU_MBUS_NO_REMAP)
>>>    			remap_addr = base;
>>>    		else
>>> @@ -263,26 +261,25 @@ static int mvebu_mbus_setup_window(struct mvebu_mbus_state *mbus,
>>>    	return 0;
>>>    }
>>> -static int mvebu_mbus_alloc_window(struct mvebu_mbus_state *mbus,
>>> -				   phys_addr_t base, size_t size,
>>> +static int mvebu_mbus_alloc_window(phys_addr_t base, size_t size,
>>>    				   phys_addr_t remap, u8 target,
>>>    				   u8 attr)
>>>    {
>>>    	int win;
>>>    	if (remap == MVEBU_MBUS_NO_REMAP) {
>>> -		for (win = mbus->soc->num_remappable_wins;
>>> -		     win < mbus->soc->num_wins; win++)
>>> -			if (mvebu_mbus_window_is_free(mbus, win))
>>> -				return mvebu_mbus_setup_window(mbus, win, base,
>>> +		for (win = MVEBU_MBUS_NUM_REMAPPABLE_WINS;
>>> +		     win < MVEBU_MBUS_NUM_WINS; win++)
>>> +			if (mvebu_mbus_window_is_free(win))
>>> +				return mvebu_mbus_setup_window(win, base,
>>>    							       size, remap,
>>>    							       target, attr);
>>>    	}
>>> -	for (win = 0; win < mbus->soc->num_wins; win++)
>>> -		if (mvebu_mbus_window_is_free(mbus, win))
>>> -			return mvebu_mbus_setup_window(mbus, win, base, size,
>>> +	for (win = 0; win < MVEBU_MBUS_NUM_WINS; win++)
>>> +		if (mvebu_mbus_window_is_free(win))
>>> +			return mvebu_mbus_setup_window(win, base, size,
>>>    						       remap, target, attr);
>>>    	return -ENOMEM;
>>> @@ -292,7 +289,7 @@ static int mvebu_mbus_alloc_window(struct mvebu_mbus_state *mbus,
>>>     * SoC-specific functions and definitions
>>>     */
>>> -static unsigned int armada_370_xp_mbus_win_offset(int win)
>>> +static unsigned int __maybe_unused armada_370_xp_mbus_win_offset(int win)
>>>    {
>>>    	/* The register layout is a bit annoying and the below code
>>>    	 * tries to cope with it.
>>> @@ -312,12 +309,12 @@ static unsigned int armada_370_xp_mbus_win_offset(int win)
>>>    		return 0x90 + ((win - 8) << 3);
>>>    }
>>> -static unsigned int orion5x_mbus_win_offset(int win)
>>> +static unsigned int __maybe_unused orion5x_mbus_win_offset(int win)
>>>    {
>>>    	return win << 4;
>>>    }
>>> -static void mvebu_mbus_default_setup_cpu_target(struct mvebu_mbus_state *mbus)
>>> +static void mvebu_mbus_default_setup_cpu_target(void)
>>>    {
>>>    	int i;
>>>    	int cs;
>>> @@ -325,8 +322,8 @@ static void mvebu_mbus_default_setup_cpu_target(struct mvebu_mbus_state *mbus)
>>>    	mbus_dram_info.mbus_dram_target_id = TARGET_DDR;
>>>    	for (i = 0, cs = 0; i < 4; i++) {
>>> -		u32 base = readl(mbus->sdramwins_base + DDR_BASE_CS_OFF(i));
>>> -		u32 size = readl(mbus->sdramwins_base + DDR_SIZE_CS_OFF(i));
>>> +		u32 base = readl((void __iomem *)MVEBU_SDRAM_BASE + DDR_BASE_CS_OFF(i));
>>> +		u32 size = readl((void __iomem *)MVEBU_SDRAM_BASE + DDR_SIZE_CS_OFF(i));
>>>    		/*
>>>    		 * We only take care of entries for which the chip
>>> @@ -349,26 +346,10 @@ static void mvebu_mbus_default_setup_cpu_target(struct mvebu_mbus_state *mbus)
>>>    #if defined(CONFIG_ARMADA_MSYS)
>>>    	/* Disable MBUS Err Prop - in order to avoid data aborts */
>>> -	clrbits_le32(mbus->mbuswins_base + 0x200, BIT(8));
>>> +	clrbits_le32((void __iomem *)MVEBU_CPU_WIN_BASE + 0x200, BIT(8));
>>>    #endif
>>>    }
>>> -static const struct mvebu_mbus_soc_data
>>> -armada_370_xp_mbus_data __maybe_unused = {
>>> -	.num_wins            = 20,
>>> -	.num_remappable_wins = 8,
>>> -	.win_cfg_offset      = armada_370_xp_mbus_win_offset,
>>> -	.setup_cpu_target    = mvebu_mbus_default_setup_cpu_target,
>>> -};
>>> -
>>> -static const struct mvebu_mbus_soc_data
>>> -kirkwood_mbus_data __maybe_unused = {
>>> -	.num_wins            = 8,
>>> -	.num_remappable_wins = 4,
>>> -	.win_cfg_offset      = orion5x_mbus_win_offset,
>>> -	.setup_cpu_target    = mvebu_mbus_default_setup_cpu_target,
>>> -};
>>> -
>>>    /*
>>>     * Public API of the driver
>>>     */
>>> @@ -382,15 +363,13 @@ int mvebu_mbus_add_window_remap_by_id(unsigned int target,
>>>    				      phys_addr_t base, size_t size,
>>>    				      phys_addr_t remap)
>>>    {
>>> -	struct mvebu_mbus_state *s = &mbus_state;
>>> -
>>> -	if (!mvebu_mbus_window_conflicts(s, base, size, target, attribute)) {
>>> +	if (!mvebu_mbus_window_conflicts(base, size, target, attribute)) {
>>>    		printf("Cannot add window '%x:%x', conflicts with another window\n",
>>>    		       target, attribute);
>>>    		return -EINVAL;
>>>    	}
>>> -	return mvebu_mbus_alloc_window(s, base, size, remap, target, attribute);
>>> +	return mvebu_mbus_alloc_window(base, size, remap, target, attribute);
>>>    }
>>>    int mvebu_mbus_add_window_by_id(unsigned int target, unsigned int attribute,
>>> @@ -404,28 +383,27 @@ int mvebu_mbus_del_window(phys_addr_t base, size_t size)
>>>    {
>>>    	int win;
>>> -	win = mvebu_mbus_find_window(&mbus_state, base, size);
>>> +	win = mvebu_mbus_find_window(base, size);
>>>    	if (win < 0)
>>>    		return win;
>>> -	mvebu_mbus_disable_window(&mbus_state, win);
>>> +	mvebu_mbus_disable_window(win);
>>>    	return 0;
>>>    }
>>>    #ifndef CONFIG_ARCH_KIRKWOOD
>>> -static void mvebu_mbus_get_lowest_base(struct mvebu_mbus_state *mbus,
>>> -				       phys_addr_t *base)
>>> +static void mvebu_mbus_get_lowest_base(phys_addr_t *base)
>>>    {
>>>    	int win;
>>>    	*base = 0xffffffff;
>>> -	for (win = 0; win < mbus->soc->num_wins; win++) {
>>> +	for (win = 0; win < MVEBU_MBUS_NUM_WINS; win++) {
>>>    		u64 wbase;
>>>    		u32 wsize;
>>>    		u8 wtarget, wattr;
>>>    		int enabled;
>>> -		mvebu_mbus_read_window(mbus, win,
>>> +		mvebu_mbus_read_window(win,
>>>    				       &enabled, &wbase, &wsize,
>>>    				       &wtarget, &wattr, NULL);
>>> @@ -437,14 +415,14 @@ static void mvebu_mbus_get_lowest_base(struct mvebu_mbus_state *mbus,
>>>    	}
>>>    }
>>> -static void mvebu_config_mbus_bridge(struct mvebu_mbus_state *mbus)
>>> +static void mvebu_config_mbus_bridge(void)
>>>    {
>>>    	phys_addr_t base;
>>>    	u32 val;
>>>    	u32 size;
>>>    	/* Set MBUS bridge base/ctrl */
>>> -	mvebu_mbus_get_lowest_base(&mbus_state, &base);
>>> +	mvebu_mbus_get_lowest_base(&base);
>>>    	size = 0xffffffff - base + 1;
>>>    	if (!is_power_of_2(size)) {
>>> @@ -461,10 +439,9 @@ static void mvebu_config_mbus_bridge(struct mvebu_mbus_state *mbus)
>>>    }
>>>    #endif
>>> -int mbus_dt_setup_win(struct mvebu_mbus_state *mbus,
>>> -		      u32 base, u32 size, u8 target, u8 attr)
>>> +int mbus_dt_setup_win(u32 base, u32 size, u8 target, u8 attr)
>>>    {
>>> -	if (!mvebu_mbus_window_conflicts(mbus, base, size, target, attr)) {
>>> +	if (!mvebu_mbus_window_conflicts(base, size, target, attr)) {
>>>    		printf("Cannot add window '%04x:%04x', conflicts with another window\n",
>>>    		       target, attr);
>>>    		return -EBUSY;
>>> @@ -474,8 +451,8 @@ int mbus_dt_setup_win(struct mvebu_mbus_state *mbus,
>>>    	 * In U-Boot we first try to add the mbus window to the remap windows.
>>>    	 * If this fails, lets try to add the windows to the non-remap windows.
>>>    	 */
>>> -	if (mvebu_mbus_alloc_window(mbus, base, size, base, target, attr)) {
>>> -		if (mvebu_mbus_alloc_window(mbus, base, size,
>>> +	if (mvebu_mbus_alloc_window(base, size, base, target, attr)) {
>>> +		if (mvebu_mbus_alloc_window(base, size,
>>>    					    MVEBU_MBUS_NO_REMAP, target, attr))
>>>    			return -ENOMEM;
>>>    	}
>>> @@ -486,7 +463,7 @@ int mbus_dt_setup_win(struct mvebu_mbus_state *mbus,
>>>    	 * is called. Since it may get called from the board code in
>>>    	 * later boot stages as well.
>>>    	 */
>>> -	mvebu_config_mbus_bridge(mbus);
>>> +	mvebu_config_mbus_bridge();
>>>    #endif
>>>    	return 0;
>>> @@ -498,20 +475,10 @@ int mvebu_mbus_probe(struct mbus_win windows[], int count)
>>>    	int ret;
>>>    	int i;
>>> -#if defined(CONFIG_ARCH_KIRKWOOD)
>>> -	mbus_state.soc = &kirkwood_mbus_data;
>>> -#endif
>>> -#if defined(CONFIG_ARCH_MVEBU)
>>> -	mbus_state.soc = &armada_370_xp_mbus_data;
>>> -#endif
>>> -
>>> -	mbus_state.mbuswins_base = (void __iomem *)MVEBU_CPU_WIN_BASE;
>>> -	mbus_state.sdramwins_base = (void __iomem *)MVEBU_SDRAM_BASE;
>>> -
>>> -	for (win = 0; win < mbus_state.soc->num_wins; win++)
>>> -		mvebu_mbus_disable_window(&mbus_state, win);
>>> +	for (win = 0; win < MVEBU_MBUS_NUM_WINS; win++)
>>> +		mvebu_mbus_disable_window(win);
>>> -	mbus_state.soc->setup_cpu_target(&mbus_state);
>>> +	mvebu_mbus_default_setup_cpu_target();
>>>    	/* Setup statically declared windows in the DT */
>>>    	for (i = 0; i < count; i++) {
>>> @@ -522,7 +489,7 @@ int mvebu_mbus_probe(struct mbus_win windows[], int count)
>>>    		attr = windows[i].attr;
>>>    		base = windows[i].base;
>>>    		size = windows[i].size;
>>> -		ret = mbus_dt_setup_win(&mbus_state, base, size, target, attr);
>>> +		ret = mbus_dt_setup_win(base, size, target, attr);
>>>    		if (ret < 0)
>>>    			return ret;
>>>    	}
>>> diff --git a/board/alliedtelesis/x530/x530.c b/board/alliedtelesis/x530/x530.c
>>> index cbf4533e78de..0cfb7c522f67 100644
>>> --- a/board/alliedtelesis/x530/x530.c
>>> +++ b/board/alliedtelesis/x530/x530.c
>>> @@ -109,7 +109,7 @@ int board_init(void)
>>>    	gd->bd->bi_boot_params = mvebu_sdram_bar(0) + 0x100;
>>>    	/* window for NVS */
>>> -	mbus_dt_setup_win(&mbus_state, CONFIG_NVS_LOCATION, CONFIG_NVS_SIZE,
>>> +	mbus_dt_setup_win(CONFIG_NVS_LOCATION, CONFIG_NVS_SIZE,
>>>    			  CPU_TARGET_DEVICEBUS_BOOTROM_SPI, CPU_ATTR_DEV_CS1);
>>>    	/* DEV_READYn is not needed for NVS, ignore it when accessing CS1 */
>>> diff --git a/board/maxbcm/maxbcm.c b/board/maxbcm/maxbcm.c
>>> index e92132ad19a1..aad3dc864295 100644
>>> --- a/board/maxbcm/maxbcm.c
>>> +++ b/board/maxbcm/maxbcm.c
>>> @@ -112,13 +112,13 @@ int board_early_init_f(void)
>>>    	/*
>>>    	 * Setup some board specific mbus address windows
>>>    	 */
>>> -	mbus_dt_setup_win(&mbus_state, DEV_CS0_BASE, 16 << 20,
>>> +	mbus_dt_setup_win(DEV_CS0_BASE, 16 << 20,
>>>    			  CPU_TARGET_DEVICEBUS_BOOTROM_SPI, CPU_ATTR_DEV_CS0);
>>> -	mbus_dt_setup_win(&mbus_state, DEV_CS1_BASE, 16 << 20,
>>> +	mbus_dt_setup_win(DEV_CS1_BASE, 16 << 20,
>>>    			  CPU_TARGET_DEVICEBUS_BOOTROM_SPI, CPU_ATTR_DEV_CS1);
>>> -	mbus_dt_setup_win(&mbus_state, DEV_CS2_BASE, 16 << 20,
>>> +	mbus_dt_setup_win(DEV_CS2_BASE, 16 << 20,
>>>    			  CPU_TARGET_DEVICEBUS_BOOTROM_SPI, CPU_ATTR_DEV_CS2);
>>> -	mbus_dt_setup_win(&mbus_state, DEV_CS3_BASE, 16 << 20,
>>> +	mbus_dt_setup_win(DEV_CS3_BASE, 16 << 20,
>>>    			  CPU_TARGET_DEVICEBUS_BOOTROM_SPI, CPU_ATTR_DEV_CS3);
>>>    	return 0;
>>> diff --git a/board/theadorable/theadorable.c b/board/theadorable/theadorable.c
>>> index 6e41ca239919..144f122bb206 100644
>>> --- a/board/theadorable/theadorable.c
>>> +++ b/board/theadorable/theadorable.c
>>> @@ -208,9 +208,9 @@ int board_init(void)
>>>    	 * Map SPI devices via MBUS so that they can be accessed via
>>>    	 * the SPI direct access mode
>>>    	 */
>>> -	mbus_dt_setup_win(&mbus_state, SPI_BUS0_DEV1_BASE, SPI_BUS0_DEV1_SIZE,
>>> +	mbus_dt_setup_win(SPI_BUS0_DEV1_BASE, SPI_BUS0_DEV1_SIZE,
>>>    			  CPU_TARGET_DEVICEBUS_BOOTROM_SPI, CPU_ATTR_SPI0_CS1);
>>> -	mbus_dt_setup_win(&mbus_state, SPI_BUS1_DEV2_BASE, SPI_BUS0_DEV1_SIZE,
>>> +	mbus_dt_setup_win(SPI_BUS1_DEV2_BASE, SPI_BUS0_DEV1_SIZE,
>>>    			  CPU_TARGET_DEVICEBUS_BOOTROM_SPI, CPU_ATTR_SPI1_CS2);
>>>    	/*
>>> diff --git a/include/linux/mbus.h b/include/linux/mbus.h
>>> index 717cbeab37f5..04112eabe1c2 100644
>>> --- a/include/linux/mbus.h
>>> +++ b/include/linux/mbus.h
>>> @@ -33,16 +33,6 @@ struct mbus_dram_target_info {
>>>    	} cs[4];
>>>    };
>>> -struct mvebu_mbus_state {
>>> -	void __iomem *mbuswins_base;
>>> -	void __iomem *sdramwins_base;
>>> -	struct dentry *debugfs_root;
>>> -	struct dentry *debugfs_sdram;
>>> -	struct dentry *debugfs_devs;
>>> -	const struct mvebu_mbus_soc_data *soc;
>>> -	int hw_io_coherency;
>>> -};
>>> -
>>>    /* Flags for PCI/PCIe address decoding regions */
>>>    #define MVEBU_MBUS_PCI_IO  0x1
>>>    #define MVEBU_MBUS_PCI_MEM 0x2
>>> @@ -67,7 +57,6 @@ int mvebu_mbus_add_window_remap_by_id(unsigned int target,
>>>    int mvebu_mbus_add_window_by_id(unsigned int target, unsigned int attribute,
>>>    				phys_addr_t base, size_t size);
>>>    int mvebu_mbus_del_window(phys_addr_t base, size_t size);
>>> -int mbus_dt_setup_win(struct mvebu_mbus_state *mbus,
>>> -		      u32 base, u32 size, u8 target, u8 attr);
>>> +int mbus_dt_setup_win(u32 base, u32 size, u8 target, u8 attr);
>>>    #endif /* __LINUX_MBUS_H */
>> Viele Grüße,
>> Stefan Roese
>>
>> -- 
>> DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
>> HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
>> Phone: (+49)-8142-66989-51 Fax: (+49)-8142-66989-80 Email: sr at denx.de


More information about the U-Boot mailing list