xref: /rk3399_ARM-atf/plat/qti/msm8916/msm8916_bl31_setup.c (revision dddba19a6a3cb7a1039beaffc3169c4eb3291afd)
1*dddba19aSStephan Gerhold /*
2*dddba19aSStephan Gerhold  * Copyright (c) 2021, Stephan Gerhold <stephan@gerhold.net>
3*dddba19aSStephan Gerhold  *
4*dddba19aSStephan Gerhold  * SPDX-License-Identifier: BSD-3-Clause
5*dddba19aSStephan Gerhold  */
6*dddba19aSStephan Gerhold 
7*dddba19aSStephan Gerhold #include <assert.h>
8*dddba19aSStephan Gerhold 
9*dddba19aSStephan Gerhold #include <arch.h>
10*dddba19aSStephan Gerhold #include <common/debug.h>
11*dddba19aSStephan Gerhold #include <drivers/console.h>
12*dddba19aSStephan Gerhold #include <drivers/generic_delay_timer.h>
13*dddba19aSStephan Gerhold #include <lib/mmio.h>
14*dddba19aSStephan Gerhold #include <lib/xlat_tables/xlat_mmu_helpers.h>
15*dddba19aSStephan Gerhold #include <lib/xlat_tables/xlat_tables_v2.h>
16*dddba19aSStephan Gerhold #include <plat/common/platform.h>
17*dddba19aSStephan Gerhold 
18*dddba19aSStephan Gerhold #include <msm8916_mmap.h>
19*dddba19aSStephan Gerhold #include <platform_def.h>
20*dddba19aSStephan Gerhold #include <uartdm_console.h>
21*dddba19aSStephan Gerhold 
22*dddba19aSStephan Gerhold static const mmap_region_t msm8916_mmap[] = {
23*dddba19aSStephan Gerhold 	MAP_REGION_FLAT(PCNOC_BASE, PCNOC_SIZE,
24*dddba19aSStephan Gerhold 			MT_DEVICE | MT_RW | MT_SECURE | MT_EXECUTE_NEVER),
25*dddba19aSStephan Gerhold 	MAP_REGION_FLAT(APCS_BASE, APCS_SIZE,
26*dddba19aSStephan Gerhold 			MT_DEVICE | MT_RW | MT_SECURE | MT_EXECUTE_NEVER),
27*dddba19aSStephan Gerhold 	{},
28*dddba19aSStephan Gerhold };
29*dddba19aSStephan Gerhold 
30*dddba19aSStephan Gerhold static struct {
31*dddba19aSStephan Gerhold 	entry_point_info_t bl32;
32*dddba19aSStephan Gerhold 	entry_point_info_t bl33;
33*dddba19aSStephan Gerhold } image_ep_info = {
34*dddba19aSStephan Gerhold 	/* BL32 entry point */
35*dddba19aSStephan Gerhold 	SET_STATIC_PARAM_HEAD(bl32, PARAM_EP, VERSION_1,
36*dddba19aSStephan Gerhold 			      entry_point_info_t, SECURE),
37*dddba19aSStephan Gerhold 	.bl32.pc = BL32_BASE,
38*dddba19aSStephan Gerhold 
39*dddba19aSStephan Gerhold 	/* BL33 entry point */
40*dddba19aSStephan Gerhold 	SET_STATIC_PARAM_HEAD(bl33, PARAM_EP, VERSION_1,
41*dddba19aSStephan Gerhold 			      entry_point_info_t, NON_SECURE),
42*dddba19aSStephan Gerhold 	.bl33.pc = PRELOADED_BL33_BASE,
43*dddba19aSStephan Gerhold 	.bl33.spsr = SPSR_64(MODE_EL2, MODE_SP_ELX, DISABLE_ALL_EXCEPTIONS),
44*dddba19aSStephan Gerhold };
45*dddba19aSStephan Gerhold 
46*dddba19aSStephan Gerhold static console_t console;
47*dddba19aSStephan Gerhold 
48*dddba19aSStephan Gerhold unsigned int plat_get_syscnt_freq2(void)
49*dddba19aSStephan Gerhold {
50*dddba19aSStephan Gerhold 	return PLAT_SYSCNT_FREQ;
51*dddba19aSStephan Gerhold }
52*dddba19aSStephan Gerhold 
53*dddba19aSStephan Gerhold #define CLK_ENABLE			BIT_32(0)
54*dddba19aSStephan Gerhold #define CLK_OFF				BIT_32(31)
55*dddba19aSStephan Gerhold 
56*dddba19aSStephan Gerhold #define GPIO_BLSP_UART2_TX		4
57*dddba19aSStephan Gerhold #define GPIO_BLSP_UART2_RX		5
58*dddba19aSStephan Gerhold #define GPIO_CFG_FUNC_BLSP_UART2	(U(0x2) << 2)
59*dddba19aSStephan Gerhold #define GPIO_CFG_DRV_STRENGTH_16MA	(U(0x7) << 6)
60*dddba19aSStephan Gerhold 
61*dddba19aSStephan Gerhold #define GCC_BLSP1_AHB_CBCR		(GCC_BASE + 0x01008)
62*dddba19aSStephan Gerhold #define GCC_BLSP1_UART2_APPS_CBCR	(GCC_BASE + 0x0302c)
63*dddba19aSStephan Gerhold #define GCC_APCS_CLOCK_BRANCH_ENA_VOTE	(GCC_BASE + 0x45004)
64*dddba19aSStephan Gerhold #define BLSP1_AHB_CLK_ENA		BIT_32(10)
65*dddba19aSStephan Gerhold 
66*dddba19aSStephan Gerhold /*
67*dddba19aSStephan Gerhold  * The previous boot stage seems to disable most of the UART setup before exit
68*dddba19aSStephan Gerhold  * so it must be enabled here again before the UART console can be used.
69*dddba19aSStephan Gerhold  */
70*dddba19aSStephan Gerhold static void msm8916_enable_blsp_uart2(void)
71*dddba19aSStephan Gerhold {
72*dddba19aSStephan Gerhold 	/* Route GPIOs to BLSP UART2 */
73*dddba19aSStephan Gerhold 	mmio_write_32(TLMM_GPIO_CFG(GPIO_BLSP_UART2_TX),
74*dddba19aSStephan Gerhold 		      GPIO_CFG_FUNC_BLSP_UART2 | GPIO_CFG_DRV_STRENGTH_16MA);
75*dddba19aSStephan Gerhold 	mmio_write_32(TLMM_GPIO_CFG(GPIO_BLSP_UART2_RX),
76*dddba19aSStephan Gerhold 		      GPIO_CFG_FUNC_BLSP_UART2 | GPIO_CFG_DRV_STRENGTH_16MA);
77*dddba19aSStephan Gerhold 
78*dddba19aSStephan Gerhold 	/* Enable AHB clock */
79*dddba19aSStephan Gerhold 	mmio_setbits_32(GCC_APCS_CLOCK_BRANCH_ENA_VOTE, BLSP1_AHB_CLK_ENA);
80*dddba19aSStephan Gerhold 	while (mmio_read_32(GCC_BLSP1_AHB_CBCR) & CLK_OFF)
81*dddba19aSStephan Gerhold 		;
82*dddba19aSStephan Gerhold 
83*dddba19aSStephan Gerhold 	/* Enable BLSP UART2 clock */
84*dddba19aSStephan Gerhold 	mmio_setbits_32(GCC_BLSP1_UART2_APPS_CBCR, CLK_ENABLE);
85*dddba19aSStephan Gerhold 	while (mmio_read_32(GCC_BLSP1_UART2_APPS_CBCR) & CLK_OFF)
86*dddba19aSStephan Gerhold 		;
87*dddba19aSStephan Gerhold }
88*dddba19aSStephan Gerhold 
89*dddba19aSStephan Gerhold void bl31_early_platform_setup2(u_register_t arg0, u_register_t arg1,
90*dddba19aSStephan Gerhold 				u_register_t arg2, u_register_t arg3)
91*dddba19aSStephan Gerhold {
92*dddba19aSStephan Gerhold 	/* Initialize the debug console as early as possible */
93*dddba19aSStephan Gerhold 	msm8916_enable_blsp_uart2();
94*dddba19aSStephan Gerhold 	console_uartdm_register(&console, BLSP_UART2_BASE);
95*dddba19aSStephan Gerhold }
96*dddba19aSStephan Gerhold 
97*dddba19aSStephan Gerhold void bl31_plat_arch_setup(void)
98*dddba19aSStephan Gerhold {
99*dddba19aSStephan Gerhold 	mmap_add_region(BL31_BASE, BL31_BASE, BL31_END - BL31_BASE,
100*dddba19aSStephan Gerhold 			MT_RW_DATA | MT_SECURE);
101*dddba19aSStephan Gerhold 	mmap_add_region(BL_CODE_BASE, BL_CODE_BASE,
102*dddba19aSStephan Gerhold 			BL_CODE_END - BL_CODE_BASE,
103*dddba19aSStephan Gerhold 			MT_CODE | MT_SECURE);
104*dddba19aSStephan Gerhold 	mmap_add_region(BL_RO_DATA_BASE, BL_RO_DATA_BASE,
105*dddba19aSStephan Gerhold 			BL_RO_DATA_END - BL_RO_DATA_BASE,
106*dddba19aSStephan Gerhold 			MT_RO_DATA | MT_SECURE);
107*dddba19aSStephan Gerhold 	mmap_add_region(BL_COHERENT_RAM_BASE, BL_COHERENT_RAM_BASE,
108*dddba19aSStephan Gerhold 			BL_COHERENT_RAM_END - BL_COHERENT_RAM_BASE,
109*dddba19aSStephan Gerhold 			MT_DEVICE | MT_RW | MT_SECURE | MT_EXECUTE_NEVER);
110*dddba19aSStephan Gerhold 
111*dddba19aSStephan Gerhold 	mmap_add(msm8916_mmap);
112*dddba19aSStephan Gerhold 	init_xlat_tables();
113*dddba19aSStephan Gerhold 	enable_mmu_el3(0);
114*dddba19aSStephan Gerhold }
115*dddba19aSStephan Gerhold 
116*dddba19aSStephan Gerhold void bl31_platform_setup(void)
117*dddba19aSStephan Gerhold {
118*dddba19aSStephan Gerhold 	generic_delay_timer_init();
119*dddba19aSStephan Gerhold }
120*dddba19aSStephan Gerhold 
121*dddba19aSStephan Gerhold entry_point_info_t *bl31_plat_get_next_image_ep_info(uint32_t type)
122*dddba19aSStephan Gerhold {
123*dddba19aSStephan Gerhold 	switch (type) {
124*dddba19aSStephan Gerhold 	case SECURE:
125*dddba19aSStephan Gerhold 		return &image_ep_info.bl32;
126*dddba19aSStephan Gerhold 	case NON_SECURE:
127*dddba19aSStephan Gerhold 		return &image_ep_info.bl33;
128*dddba19aSStephan Gerhold 	default:
129*dddba19aSStephan Gerhold 		assert(sec_state_is_valid(type));
130*dddba19aSStephan Gerhold 		return NULL;
131*dddba19aSStephan Gerhold 	}
132*dddba19aSStephan Gerhold }
133