[U-Boot] [PATCH v3 1/2] spl: rk3399: disable DDR security regions for SPL (for DMA in dw_mmc)

Kever Yang kever.yang at rock-chips.com
Thu Mar 30 03:22:53 UTC 2017


Hi Philipp,


On 03/30/2017 03:20 AM, Philipp Tomsich wrote:
> The RK3399 hangs during DMA of the Designware MMC controller, when
> performing DMA-based transactions in SPL due to the DDR security settings
> left behind by the BootROM (i.e. accesses to the first MB of DRAM are
> restricted... however, the DMA is likely to target this first MB, as it
> transfers from/to the stack).
>
> System security is not affected, as the final security configuration is
> performed by the ATF, which is executed after the SPL stage.
>
> With this fix in place, we can now drop 'fifo-mode' in the DTS for the
> RK3399-Q7 (Puma).
>
> Signed-off-by: Philipp Tomsich <philipp.tomsich at theobroma-systems.com>
>
> ---
>
> Changes in v3:
> - replaces the work-around (i.e. falling back to fifo-mode in SPL) with
>    a permanent fix
>
>   arch/arm/mach-rockchip/rk3399-board-spl.c | 13 +++++++++++++
>   1 file changed, 13 insertions(+)
>
> diff --git a/arch/arm/mach-rockchip/rk3399-board-spl.c b/arch/arm/mach-rockchip/rk3399-board-spl.c
> index 3bfc2d9..c5e32c4 100644
> --- a/arch/arm/mach-rockchip/rk3399-board-spl.c
> +++ b/arch/arm/mach-rockchip/rk3399-board-spl.c
> @@ -186,6 +186,7 @@ void board_debug_uart_init(void)
>   }
>   
>   #define GRF_EMMCCORE_CON11 0xff77f02c
> +#define SGRF_DDR_RGN_CON16 0xff330040
>   void board_init_f(ulong dummy)
>   {
>   	struct udevice *pinctrl;
> @@ -214,6 +215,17 @@ void board_init_f(ulong dummy)
>   		hang();
>   	}
>   
> +	/*
> +	 * Disable DDR security regions.
> +	 *
> +	 * As we are entered from the BootROM, the region from
> +	 * 0x0 through 0xfffff (i.e. the first MB of memory) will
> +	 * be protected. This will cause issues with the DW_MMC
> +	 * driver, which tries to DMA from/to the stack (likely)
> +	 * located in this range.
> +	 */
> +	rk_clrsetreg(SGRF_DDR_RGN_CON16, 0x1FF, 0);
> +
>   	secure_timer_init();
>   
>   	ret = uclass_get_device(UCLASS_PINCTRL, 0, &pinctrl);
> @@ -251,6 +263,7 @@ void spl_board_init(void)
>   #ifdef CONFIG_ROCKCHIP_SPL_BACK_TO_BROM
>   	back_to_bootrom();
>   #endif
> +
>   	return;
>   err:
>   	printf("spl_board_init: Error %d\n", ret);
Reviewed-by: Kever Yang <kever.yang at rock-chips.com>

Thanks,
- Kever



More information about the U-Boot mailing list