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