xref: /rk3399_ARM-atf/plat/qti/msm8916/msm8916_setup.c (revision 840831b2e0ad48517b8e9dd2ab216b3411e5d3e0)
1*840831b2SStephan Gerhold /*
2*840831b2SStephan Gerhold  * Copyright (c) 2021-2023, Stephan Gerhold <stephan@gerhold.net>
3*840831b2SStephan Gerhold  *
4*840831b2SStephan Gerhold  * SPDX-License-Identifier: BSD-3-Clause
5*840831b2SStephan Gerhold  */
6*840831b2SStephan Gerhold 
7*840831b2SStephan Gerhold #include <common/bl_common.h>
8*840831b2SStephan Gerhold #include <drivers/console.h>
9*840831b2SStephan Gerhold #include <drivers/generic_delay_timer.h>
10*840831b2SStephan Gerhold #include <lib/mmio.h>
11*840831b2SStephan Gerhold #include <lib/xlat_tables/xlat_mmu_helpers.h>
12*840831b2SStephan Gerhold #include <lib/xlat_tables/xlat_tables_v2.h>
13*840831b2SStephan Gerhold 
14*840831b2SStephan Gerhold #include "msm8916_gicv2.h"
15*840831b2SStephan Gerhold #include <msm8916_mmap.h>
16*840831b2SStephan Gerhold #include "msm8916_setup.h"
17*840831b2SStephan Gerhold #include <uartdm_console.h>
18*840831b2SStephan Gerhold 
19*840831b2SStephan Gerhold static const mmap_region_t msm8916_mmap[] = {
20*840831b2SStephan Gerhold 	MAP_REGION_FLAT(PCNOC_BASE, PCNOC_SIZE,
21*840831b2SStephan Gerhold 			MT_DEVICE | MT_RW | MT_SECURE | MT_EXECUTE_NEVER),
22*840831b2SStephan Gerhold 	MAP_REGION_FLAT(APCS_BASE, APCS_SIZE,
23*840831b2SStephan Gerhold 			MT_DEVICE | MT_RW | MT_SECURE | MT_EXECUTE_NEVER),
24*840831b2SStephan Gerhold 	{},
25*840831b2SStephan Gerhold };
26*840831b2SStephan Gerhold 
27*840831b2SStephan Gerhold static console_t console;
28*840831b2SStephan Gerhold 
29*840831b2SStephan Gerhold unsigned int plat_get_syscnt_freq2(void)
30*840831b2SStephan Gerhold {
31*840831b2SStephan Gerhold 	return PLAT_SYSCNT_FREQ;
32*840831b2SStephan Gerhold }
33*840831b2SStephan Gerhold 
34*840831b2SStephan Gerhold #define GPIO_BLSP_UART2_TX		4
35*840831b2SStephan Gerhold #define GPIO_BLSP_UART2_RX		5
36*840831b2SStephan Gerhold #define GPIO_CFG_FUNC_BLSP_UART2	(U(0x2) << 2)
37*840831b2SStephan Gerhold #define GPIO_CFG_DRV_STRENGTH_16MA	(U(0x7) << 6)
38*840831b2SStephan Gerhold 
39*840831b2SStephan Gerhold #define CLK_ENABLE			BIT_32(0)
40*840831b2SStephan Gerhold #define CLK_OFF				BIT_32(31)
41*840831b2SStephan Gerhold #define GCC_BLSP1_AHB_CBCR		(GCC_BASE + 0x01008)
42*840831b2SStephan Gerhold #define GCC_BLSP1_UART2_APPS_CBCR	(GCC_BASE + 0x0302c)
43*840831b2SStephan Gerhold #define GCC_APCS_CLOCK_BRANCH_ENA_VOTE	(GCC_BASE + 0x45004)
44*840831b2SStephan Gerhold #define BLSP1_AHB_CLK_ENA		BIT_32(10)
45*840831b2SStephan Gerhold 
46*840831b2SStephan Gerhold /*
47*840831b2SStephan Gerhold  * The previous boot stage seems to disable most of the UART setup before exit
48*840831b2SStephan Gerhold  * so it must be enabled here again before the UART console can be used.
49*840831b2SStephan Gerhold  */
50*840831b2SStephan Gerhold static void msm8916_enable_blsp_uart2(void)
51*840831b2SStephan Gerhold {
52*840831b2SStephan Gerhold 	/* Route GPIOs to BLSP UART2 */
53*840831b2SStephan Gerhold 	mmio_write_32(TLMM_GPIO_CFG(GPIO_BLSP_UART2_TX),
54*840831b2SStephan Gerhold 		      GPIO_CFG_FUNC_BLSP_UART2 | GPIO_CFG_DRV_STRENGTH_16MA);
55*840831b2SStephan Gerhold 	mmio_write_32(TLMM_GPIO_CFG(GPIO_BLSP_UART2_RX),
56*840831b2SStephan Gerhold 		      GPIO_CFG_FUNC_BLSP_UART2 | GPIO_CFG_DRV_STRENGTH_16MA);
57*840831b2SStephan Gerhold 
58*840831b2SStephan Gerhold 	/* Enable AHB clock */
59*840831b2SStephan Gerhold 	mmio_setbits_32(GCC_APCS_CLOCK_BRANCH_ENA_VOTE, BLSP1_AHB_CLK_ENA);
60*840831b2SStephan Gerhold 	while (mmio_read_32(GCC_BLSP1_AHB_CBCR) & CLK_OFF)
61*840831b2SStephan Gerhold 		;
62*840831b2SStephan Gerhold 
63*840831b2SStephan Gerhold 	/* Enable BLSP UART2 clock */
64*840831b2SStephan Gerhold 	mmio_setbits_32(GCC_BLSP1_UART2_APPS_CBCR, CLK_ENABLE);
65*840831b2SStephan Gerhold 	while (mmio_read_32(GCC_BLSP1_UART2_APPS_CBCR) & CLK_OFF)
66*840831b2SStephan Gerhold 		;
67*840831b2SStephan Gerhold }
68*840831b2SStephan Gerhold 
69*840831b2SStephan Gerhold void msm8916_early_platform_setup(void)
70*840831b2SStephan Gerhold {
71*840831b2SStephan Gerhold 	/* Initialize the debug console as early as possible */
72*840831b2SStephan Gerhold 	msm8916_enable_blsp_uart2();
73*840831b2SStephan Gerhold 	console_uartdm_register(&console, BLSP_UART2_BASE);
74*840831b2SStephan Gerhold }
75*840831b2SStephan Gerhold 
76*840831b2SStephan Gerhold void msm8916_plat_arch_setup(uintptr_t base, size_t size)
77*840831b2SStephan Gerhold {
78*840831b2SStephan Gerhold 	mmap_add_region(base, base, size, MT_RW_DATA | MT_SECURE);
79*840831b2SStephan Gerhold 	mmap_add_region(BL_CODE_BASE, BL_CODE_BASE,
80*840831b2SStephan Gerhold 			BL_CODE_END - BL_CODE_BASE,
81*840831b2SStephan Gerhold 			MT_CODE | MT_SECURE);
82*840831b2SStephan Gerhold 	mmap_add_region(BL_RO_DATA_BASE, BL_RO_DATA_BASE,
83*840831b2SStephan Gerhold 			BL_RO_DATA_END - BL_RO_DATA_BASE,
84*840831b2SStephan Gerhold 			MT_RO_DATA | MT_SECURE);
85*840831b2SStephan Gerhold 	mmap_add_region(BL_COHERENT_RAM_BASE, BL_COHERENT_RAM_BASE,
86*840831b2SStephan Gerhold 			BL_COHERENT_RAM_END - BL_COHERENT_RAM_BASE,
87*840831b2SStephan Gerhold 			MT_DEVICE | MT_RW | MT_SECURE | MT_EXECUTE_NEVER);
88*840831b2SStephan Gerhold 
89*840831b2SStephan Gerhold 	mmap_add(msm8916_mmap);
90*840831b2SStephan Gerhold 	init_xlat_tables();
91*840831b2SStephan Gerhold }
92*840831b2SStephan Gerhold 
93*840831b2SStephan Gerhold void msm8916_platform_setup(void)
94*840831b2SStephan Gerhold {
95*840831b2SStephan Gerhold 	generic_delay_timer_init();
96*840831b2SStephan Gerhold 	msm8916_gicv2_init();
97*840831b2SStephan Gerhold }
98