1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2015-2022, ARM Limited and Contributors. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #include <assert.h> 8*91f16700Schasinglulu #include <inttypes.h> 9*91f16700Schasinglulu #include <stdint.h> 10*91f16700Schasinglulu #include <stdbool.h> 11*91f16700Schasinglulu 12*91f16700Schasinglulu #include <platform_def.h> 13*91f16700Schasinglulu 14*91f16700Schasinglulu #include <arch_helpers.h> 15*91f16700Schasinglulu #include <context.h> 16*91f16700Schasinglulu #include <common/bl_common.h> 17*91f16700Schasinglulu #include <common/debug.h> 18*91f16700Schasinglulu #include <drivers/arm/cci.h> 19*91f16700Schasinglulu #include <drivers/console.h> 20*91f16700Schasinglulu #include <lib/el3_runtime/context_mgmt.h> 21*91f16700Schasinglulu #include <lib/mmio.h> 22*91f16700Schasinglulu #include <lib/xlat_tables/xlat_tables_v2.h> 23*91f16700Schasinglulu #include <plat/common/platform.h> 24*91f16700Schasinglulu 25*91f16700Schasinglulu #include <imx8qm_pads.h> 26*91f16700Schasinglulu #include <imx8_iomux.h> 27*91f16700Schasinglulu #include <imx8_lpuart.h> 28*91f16700Schasinglulu #include <plat_imx8.h> 29*91f16700Schasinglulu #include <sci/sci.h> 30*91f16700Schasinglulu #include <sec_rsrc.h> 31*91f16700Schasinglulu 32*91f16700Schasinglulu static const unsigned long BL31_COHERENT_RAM_START = BL_COHERENT_RAM_BASE; 33*91f16700Schasinglulu static const unsigned long BL31_COHERENT_RAM_END = BL_COHERENT_RAM_END; 34*91f16700Schasinglulu static const unsigned long BL31_RO_START = BL_CODE_BASE; 35*91f16700Schasinglulu static const unsigned long BL31_RO_END = BL_CODE_END; 36*91f16700Schasinglulu static const unsigned long BL31_RW_END = BL_END; 37*91f16700Schasinglulu 38*91f16700Schasinglulu IMPORT_SYM(unsigned long, __RW_START__, BL31_RW_START); 39*91f16700Schasinglulu 40*91f16700Schasinglulu static entry_point_info_t bl32_image_ep_info; 41*91f16700Schasinglulu static entry_point_info_t bl33_image_ep_info; 42*91f16700Schasinglulu 43*91f16700Schasinglulu #define UART_PAD_CTRL (PADRING_IFMUX_EN_MASK | PADRING_GP_EN_MASK | \ 44*91f16700Schasinglulu (SC_PAD_CONFIG_OUT_IN << PADRING_CONFIG_SHIFT) | \ 45*91f16700Schasinglulu (SC_PAD_ISO_OFF << PADRING_LPCONFIG_SHIFT) | \ 46*91f16700Schasinglulu (SC_PAD_28FDSOI_DSE_DV_LOW << PADRING_DSE_SHIFT) | \ 47*91f16700Schasinglulu (SC_PAD_28FDSOI_PS_PD << PADRING_PULL_SHIFT)) 48*91f16700Schasinglulu 49*91f16700Schasinglulu #if defined(IMX_USE_UART0) 50*91f16700Schasinglulu #define IMX_RES_UART SC_R_UART_0 51*91f16700Schasinglulu #define IMX_PAD_UART_RX SC_P_UART0_RX 52*91f16700Schasinglulu #define IMX_PAD_UART_TX SC_P_UART0_TX 53*91f16700Schasinglulu #define IMX_PAD_UART_RTS_B SC_P_UART0_RTS_B 54*91f16700Schasinglulu #define IMX_PAD_UART_CTS_B SC_P_UART0_CTS_B 55*91f16700Schasinglulu #elif defined(IMX_USE_UART1) 56*91f16700Schasinglulu #define IMX_RES_UART SC_R_UART_1 57*91f16700Schasinglulu #define IMX_PAD_UART_RX SC_P_UART1_RX 58*91f16700Schasinglulu #define IMX_PAD_UART_TX SC_P_UART1_TX 59*91f16700Schasinglulu #define IMX_PAD_UART_RTS_B SC_P_UART1_RTS_B 60*91f16700Schasinglulu #define IMX_PAD_UART_CTS_B SC_P_UART1_CTS_B 61*91f16700Schasinglulu #else 62*91f16700Schasinglulu #error "Provide proper UART number in IMX_DEBUG_UART" 63*91f16700Schasinglulu #endif 64*91f16700Schasinglulu 65*91f16700Schasinglulu static const int imx8qm_cci_map[] = { 66*91f16700Schasinglulu CLUSTER0_CCI_SLVAE_IFACE, 67*91f16700Schasinglulu CLUSTER1_CCI_SLVAE_IFACE 68*91f16700Schasinglulu }; 69*91f16700Schasinglulu 70*91f16700Schasinglulu static const mmap_region_t imx_mmap[] = { 71*91f16700Schasinglulu MAP_REGION_FLAT(IMX_REG_BASE, IMX_REG_SIZE, MT_DEVICE | MT_RW), 72*91f16700Schasinglulu {0} 73*91f16700Schasinglulu }; 74*91f16700Schasinglulu 75*91f16700Schasinglulu static uint32_t get_spsr_for_bl33_entry(void) 76*91f16700Schasinglulu { 77*91f16700Schasinglulu unsigned long el_status; 78*91f16700Schasinglulu unsigned long mode; 79*91f16700Schasinglulu uint32_t spsr; 80*91f16700Schasinglulu 81*91f16700Schasinglulu /* figure out what mode we enter the non-secure world */ 82*91f16700Schasinglulu el_status = read_id_aa64pfr0_el1() >> ID_AA64PFR0_EL2_SHIFT; 83*91f16700Schasinglulu el_status &= ID_AA64PFR0_ELX_MASK; 84*91f16700Schasinglulu 85*91f16700Schasinglulu mode = (el_status) ? MODE_EL2 : MODE_EL1; 86*91f16700Schasinglulu spsr = SPSR_64(mode, MODE_SP_ELX, DISABLE_ALL_EXCEPTIONS); 87*91f16700Schasinglulu 88*91f16700Schasinglulu return spsr; 89*91f16700Schasinglulu } 90*91f16700Schasinglulu 91*91f16700Schasinglulu #if DEBUG_CONSOLE_A53 92*91f16700Schasinglulu static void lpuart32_serial_setbrg(unsigned int base, int baudrate) 93*91f16700Schasinglulu { 94*91f16700Schasinglulu unsigned int sbr, osr, baud_diff, tmp_osr, tmp_sbr; 95*91f16700Schasinglulu unsigned int diff1, diff2, tmp, rate; 96*91f16700Schasinglulu 97*91f16700Schasinglulu if (baudrate == 0) 98*91f16700Schasinglulu panic(); 99*91f16700Schasinglulu 100*91f16700Schasinglulu sc_pm_get_clock_rate(ipc_handle, IMX_RES_UART, 2, &rate); 101*91f16700Schasinglulu 102*91f16700Schasinglulu baud_diff = baudrate; 103*91f16700Schasinglulu osr = 0; 104*91f16700Schasinglulu sbr = 0; 105*91f16700Schasinglulu for (tmp_osr = 4; tmp_osr <= 32; tmp_osr++) { 106*91f16700Schasinglulu tmp_sbr = (rate / (baudrate * tmp_osr)); 107*91f16700Schasinglulu if (tmp_sbr == 0) 108*91f16700Schasinglulu tmp_sbr = 1; 109*91f16700Schasinglulu 110*91f16700Schasinglulu /* calculate difference in actual baud w/ current values */ 111*91f16700Schasinglulu diff1 = rate / (tmp_osr * tmp_sbr) - baudrate; 112*91f16700Schasinglulu diff2 = rate / (tmp_osr * (tmp_sbr + 1)); 113*91f16700Schasinglulu 114*91f16700Schasinglulu /* select best values between sbr and sbr+1 */ 115*91f16700Schasinglulu if (diff1 > (baudrate - diff2)) { 116*91f16700Schasinglulu diff1 = baudrate - diff2; 117*91f16700Schasinglulu tmp_sbr++; 118*91f16700Schasinglulu } 119*91f16700Schasinglulu 120*91f16700Schasinglulu if (diff1 <= baud_diff) { 121*91f16700Schasinglulu baud_diff = diff1; 122*91f16700Schasinglulu osr = tmp_osr; 123*91f16700Schasinglulu sbr = tmp_sbr; 124*91f16700Schasinglulu } 125*91f16700Schasinglulu } 126*91f16700Schasinglulu 127*91f16700Schasinglulu tmp = mmio_read_32(IMX_BOOT_UART_BASE + BAUD); 128*91f16700Schasinglulu 129*91f16700Schasinglulu if ((osr > 3) && (osr < 8)) 130*91f16700Schasinglulu tmp |= LPUART_BAUD_BOTHEDGE_MASK; 131*91f16700Schasinglulu 132*91f16700Schasinglulu tmp &= ~LPUART_BAUD_OSR_MASK; 133*91f16700Schasinglulu tmp |= LPUART_BAUD_OSR(osr - 1); 134*91f16700Schasinglulu tmp &= ~LPUART_BAUD_SBR_MASK; 135*91f16700Schasinglulu tmp |= LPUART_BAUD_SBR(sbr); 136*91f16700Schasinglulu 137*91f16700Schasinglulu /* explicitly disable 10 bit mode & set 1 stop bit */ 138*91f16700Schasinglulu tmp &= ~(LPUART_BAUD_M10_MASK | LPUART_BAUD_SBNS_MASK); 139*91f16700Schasinglulu 140*91f16700Schasinglulu mmio_write_32(IMX_BOOT_UART_BASE + BAUD, tmp); 141*91f16700Schasinglulu } 142*91f16700Schasinglulu 143*91f16700Schasinglulu static int lpuart32_serial_init(unsigned int base) 144*91f16700Schasinglulu { 145*91f16700Schasinglulu unsigned int tmp; 146*91f16700Schasinglulu 147*91f16700Schasinglulu /* disable TX & RX before enabling clocks */ 148*91f16700Schasinglulu tmp = mmio_read_32(IMX_BOOT_UART_BASE + CTRL); 149*91f16700Schasinglulu tmp &= ~(CTRL_TE | CTRL_RE); 150*91f16700Schasinglulu mmio_write_32(IMX_BOOT_UART_BASE + CTRL, tmp); 151*91f16700Schasinglulu 152*91f16700Schasinglulu mmio_write_32(IMX_BOOT_UART_BASE + MODIR, 0); 153*91f16700Schasinglulu mmio_write_32(IMX_BOOT_UART_BASE + FIFO, ~(FIFO_TXFE | FIFO_RXFE)); 154*91f16700Schasinglulu 155*91f16700Schasinglulu mmio_write_32(IMX_BOOT_UART_BASE + MATCH, 0); 156*91f16700Schasinglulu 157*91f16700Schasinglulu /* provide data bits, parity, stop bit, etc */ 158*91f16700Schasinglulu lpuart32_serial_setbrg(base, IMX_BOOT_UART_BAUDRATE); 159*91f16700Schasinglulu 160*91f16700Schasinglulu /* eight data bits no parity bit */ 161*91f16700Schasinglulu tmp = mmio_read_32(IMX_BOOT_UART_BASE + CTRL); 162*91f16700Schasinglulu tmp &= ~(LPUART_CTRL_PE_MASK | LPUART_CTRL_PT_MASK | LPUART_CTRL_M_MASK); 163*91f16700Schasinglulu mmio_write_32(IMX_BOOT_UART_BASE + CTRL, tmp); 164*91f16700Schasinglulu 165*91f16700Schasinglulu mmio_write_32(IMX_BOOT_UART_BASE + CTRL, CTRL_RE | CTRL_TE); 166*91f16700Schasinglulu 167*91f16700Schasinglulu mmio_write_32(IMX_BOOT_UART_BASE + DATA, 0x55); 168*91f16700Schasinglulu mmio_write_32(IMX_BOOT_UART_BASE + DATA, 0x55); 169*91f16700Schasinglulu mmio_write_32(IMX_BOOT_UART_BASE + DATA, 0x0A); 170*91f16700Schasinglulu 171*91f16700Schasinglulu return 0; 172*91f16700Schasinglulu } 173*91f16700Schasinglulu #endif 174*91f16700Schasinglulu 175*91f16700Schasinglulu void mx8_partition_resources(void) 176*91f16700Schasinglulu { 177*91f16700Schasinglulu sc_rm_pt_t secure_part, os_part; 178*91f16700Schasinglulu sc_rm_mr_t mr, mr_record = 64; 179*91f16700Schasinglulu sc_faddr_t start, end; 180*91f16700Schasinglulu bool owned, owned2; 181*91f16700Schasinglulu sc_err_t err; 182*91f16700Schasinglulu int i; 183*91f16700Schasinglulu 184*91f16700Schasinglulu err = sc_rm_get_partition(ipc_handle, &secure_part); 185*91f16700Schasinglulu 186*91f16700Schasinglulu err = sc_rm_partition_alloc(ipc_handle, &os_part, false, false, 187*91f16700Schasinglulu false, false, false); 188*91f16700Schasinglulu 189*91f16700Schasinglulu err = sc_rm_set_parent(ipc_handle, os_part, secure_part); 190*91f16700Schasinglulu 191*91f16700Schasinglulu /* set secure resources to NOT-movable */ 192*91f16700Schasinglulu for (i = 0; i < ARRAY_SIZE(secure_rsrcs); i++) { 193*91f16700Schasinglulu err = sc_rm_set_resource_movable(ipc_handle, secure_rsrcs[i], 194*91f16700Schasinglulu secure_rsrcs[i], false); 195*91f16700Schasinglulu if (err) 196*91f16700Schasinglulu ERROR("sc_rm_set_resource_movable: rsrc %u, ret %u\n", 197*91f16700Schasinglulu secure_rsrcs[i], err); 198*91f16700Schasinglulu } 199*91f16700Schasinglulu 200*91f16700Schasinglulu owned = sc_rm_is_resource_owned(ipc_handle, SC_R_M4_0_PID0); 201*91f16700Schasinglulu if (owned) { 202*91f16700Schasinglulu err = sc_rm_set_resource_movable(ipc_handle, SC_R_M4_0_PID0, 203*91f16700Schasinglulu SC_R_M4_0_PID0, false); 204*91f16700Schasinglulu if (err) 205*91f16700Schasinglulu ERROR("sc_rm_set_resource_movable: rsrc %u, ret %u\n", 206*91f16700Schasinglulu SC_R_M4_0_PID0, err); 207*91f16700Schasinglulu } 208*91f16700Schasinglulu 209*91f16700Schasinglulu owned2 = sc_rm_is_resource_owned(ipc_handle, SC_R_M4_1_PID0); 210*91f16700Schasinglulu if (owned2) { 211*91f16700Schasinglulu err = sc_rm_set_resource_movable(ipc_handle, SC_R_M4_1_PID0, 212*91f16700Schasinglulu SC_R_M4_1_PID0, false); 213*91f16700Schasinglulu if (err) 214*91f16700Schasinglulu ERROR("sc_rm_set_resource_movable: rsrc %u, ret %u\n", 215*91f16700Schasinglulu SC_R_M4_1_PID0, err); 216*91f16700Schasinglulu } 217*91f16700Schasinglulu /* move all movable resources and pins to non-secure partition */ 218*91f16700Schasinglulu err = sc_rm_move_all(ipc_handle, secure_part, os_part, true, true); 219*91f16700Schasinglulu if (err) 220*91f16700Schasinglulu ERROR("sc_rm_move_all: %u\n", err); 221*91f16700Schasinglulu 222*91f16700Schasinglulu /* iterate through peripherals to give NS OS part access */ 223*91f16700Schasinglulu for (i = 0; i < ARRAY_SIZE(ns_access_allowed); i++) { 224*91f16700Schasinglulu err = sc_rm_set_peripheral_permissions(ipc_handle, ns_access_allowed[i], 225*91f16700Schasinglulu os_part, SC_RM_PERM_FULL); 226*91f16700Schasinglulu if (err) 227*91f16700Schasinglulu ERROR("sc_rm_set_peripheral_permissions: rsrc %u, \ 228*91f16700Schasinglulu ret %u\n", ns_access_allowed[i], err); 229*91f16700Schasinglulu } 230*91f16700Schasinglulu 231*91f16700Schasinglulu if (owned) { 232*91f16700Schasinglulu err = sc_rm_set_resource_movable(ipc_handle, SC_R_M4_0_PID0, 233*91f16700Schasinglulu SC_R_M4_0_PID0, true); 234*91f16700Schasinglulu if (err) 235*91f16700Schasinglulu ERROR("sc_rm_set_resource_movable: rsrc %u, ret %u\n", 236*91f16700Schasinglulu SC_R_M4_0_PID0, err); 237*91f16700Schasinglulu err = sc_rm_assign_resource(ipc_handle, os_part, SC_R_M4_0_PID0); 238*91f16700Schasinglulu if (err) 239*91f16700Schasinglulu ERROR("sc_rm_assign_resource: rsrc %u, ret %u\n", 240*91f16700Schasinglulu SC_R_M4_0_PID0, err); 241*91f16700Schasinglulu } 242*91f16700Schasinglulu if (owned2) { 243*91f16700Schasinglulu err = sc_rm_set_resource_movable(ipc_handle, SC_R_M4_1_PID0, 244*91f16700Schasinglulu SC_R_M4_1_PID0, true); 245*91f16700Schasinglulu if (err) 246*91f16700Schasinglulu ERROR("sc_rm_set_resource_movable: rsrc %u, ret %u\n", 247*91f16700Schasinglulu SC_R_M4_1_PID0, err); 248*91f16700Schasinglulu err = sc_rm_assign_resource(ipc_handle, os_part, SC_R_M4_1_PID0); 249*91f16700Schasinglulu if (err) 250*91f16700Schasinglulu ERROR("sc_rm_assign_resource: rsrc %u, ret %u\n", 251*91f16700Schasinglulu SC_R_M4_1_PID0, err); 252*91f16700Schasinglulu } 253*91f16700Schasinglulu 254*91f16700Schasinglulu /* 255*91f16700Schasinglulu * sc_rm_set_peripheral_permissions 256*91f16700Schasinglulu * sc_rm_set_memreg_permissions 257*91f16700Schasinglulu * sc_rm_set_pin_movable 258*91f16700Schasinglulu */ 259*91f16700Schasinglulu 260*91f16700Schasinglulu for (mr = 0; mr < 64; mr++) { 261*91f16700Schasinglulu owned = sc_rm_is_memreg_owned(ipc_handle, mr); 262*91f16700Schasinglulu if (owned) { 263*91f16700Schasinglulu err = sc_rm_get_memreg_info(ipc_handle, mr, &start, &end); 264*91f16700Schasinglulu if (err) 265*91f16700Schasinglulu ERROR("Memreg get info failed, %u\n", mr); 266*91f16700Schasinglulu NOTICE("Memreg %u 0x%" PRIx64 " -- 0x%" PRIx64 "\n", mr, start, end); 267*91f16700Schasinglulu if (BL31_BASE >= start && (BL31_LIMIT - 1) <= end) { 268*91f16700Schasinglulu mr_record = mr; /* Record the mr for ATF running */ 269*91f16700Schasinglulu } else { 270*91f16700Schasinglulu err = sc_rm_assign_memreg(ipc_handle, os_part, mr); 271*91f16700Schasinglulu if (err) 272*91f16700Schasinglulu ERROR("Memreg assign failed, 0x%" PRIx64 " -- 0x%" PRIx64 ", \ 273*91f16700Schasinglulu err %d\n", start, end, err); 274*91f16700Schasinglulu } 275*91f16700Schasinglulu } 276*91f16700Schasinglulu } 277*91f16700Schasinglulu 278*91f16700Schasinglulu if (mr_record != 64) { 279*91f16700Schasinglulu err = sc_rm_get_memreg_info(ipc_handle, mr_record, &start, &end); 280*91f16700Schasinglulu if (err) 281*91f16700Schasinglulu ERROR("Memreg get info failed, %u\n", mr_record); 282*91f16700Schasinglulu if ((BL31_LIMIT - 1) < end) { 283*91f16700Schasinglulu err = sc_rm_memreg_alloc(ipc_handle, &mr, BL31_LIMIT, end); 284*91f16700Schasinglulu if (err) 285*91f16700Schasinglulu ERROR("sc_rm_memreg_alloc failed, 0x%" PRIx64 " -- 0x%" PRIx64 "\n", 286*91f16700Schasinglulu (sc_faddr_t)BL31_LIMIT, end); 287*91f16700Schasinglulu err = sc_rm_assign_memreg(ipc_handle, os_part, mr); 288*91f16700Schasinglulu if (err) 289*91f16700Schasinglulu ERROR("Memreg assign failed, 0x%" PRIx64 " -- 0x%" PRIx64 "\n", 290*91f16700Schasinglulu (sc_faddr_t)BL31_LIMIT, end); 291*91f16700Schasinglulu } 292*91f16700Schasinglulu 293*91f16700Schasinglulu if (start < (BL31_BASE - 1)) { 294*91f16700Schasinglulu err = sc_rm_memreg_alloc(ipc_handle, &mr, start, BL31_BASE - 1); 295*91f16700Schasinglulu if (err) 296*91f16700Schasinglulu ERROR("sc_rm_memreg_alloc failed, 0x%" PRIx64 " -- 0x%" PRIx64 "\n", 297*91f16700Schasinglulu start, (sc_faddr_t)BL31_BASE - 1); 298*91f16700Schasinglulu err = sc_rm_assign_memreg(ipc_handle, os_part, mr); 299*91f16700Schasinglulu if (err) 300*91f16700Schasinglulu ERROR("Memreg assign failed, 0x%" PRIx64 " -- 0x%" PRIx64 "\n", 301*91f16700Schasinglulu start, (sc_faddr_t)BL31_BASE - 1); 302*91f16700Schasinglulu } 303*91f16700Schasinglulu } 304*91f16700Schasinglulu 305*91f16700Schasinglulu if (err) 306*91f16700Schasinglulu NOTICE("Partitioning Failed\n"); 307*91f16700Schasinglulu else 308*91f16700Schasinglulu NOTICE("Non-secure Partitioning Succeeded\n"); 309*91f16700Schasinglulu 310*91f16700Schasinglulu } 311*91f16700Schasinglulu 312*91f16700Schasinglulu void bl31_early_platform_setup2(u_register_t arg0, u_register_t arg1, 313*91f16700Schasinglulu u_register_t arg2, u_register_t arg3) 314*91f16700Schasinglulu { 315*91f16700Schasinglulu #if DEBUG_CONSOLE 316*91f16700Schasinglulu static console_t console; 317*91f16700Schasinglulu #endif 318*91f16700Schasinglulu if (sc_ipc_open(&ipc_handle, SC_IPC_BASE) != SC_ERR_NONE) 319*91f16700Schasinglulu panic(); 320*91f16700Schasinglulu 321*91f16700Schasinglulu #if DEBUG_CONSOLE_A53 322*91f16700Schasinglulu sc_pm_set_resource_power_mode(ipc_handle, IMX_RES_UART, 323*91f16700Schasinglulu SC_PM_PW_MODE_ON); 324*91f16700Schasinglulu sc_pm_clock_rate_t rate = 80000000; 325*91f16700Schasinglulu sc_pm_set_clock_rate(ipc_handle, IMX_RES_UART, 2, &rate); 326*91f16700Schasinglulu sc_pm_clock_enable(ipc_handle, IMX_RES_UART, 2, true, false); 327*91f16700Schasinglulu 328*91f16700Schasinglulu /* configure UART pads */ 329*91f16700Schasinglulu sc_pad_set(ipc_handle, IMX_PAD_UART_RX, UART_PAD_CTRL); 330*91f16700Schasinglulu sc_pad_set(ipc_handle, IMX_PAD_UART_TX, UART_PAD_CTRL); 331*91f16700Schasinglulu sc_pad_set(ipc_handle, IMX_PAD_UART_RTS_B, UART_PAD_CTRL); 332*91f16700Schasinglulu sc_pad_set(ipc_handle, IMX_PAD_UART_CTS_B, UART_PAD_CTRL); 333*91f16700Schasinglulu lpuart32_serial_init(IMX_BOOT_UART_BASE); 334*91f16700Schasinglulu #endif 335*91f16700Schasinglulu 336*91f16700Schasinglulu #if DEBUG_CONSOLE 337*91f16700Schasinglulu console_lpuart_register(IMX_BOOT_UART_BASE, IMX_BOOT_UART_CLK_IN_HZ, 338*91f16700Schasinglulu IMX_CONSOLE_BAUDRATE, &console); 339*91f16700Schasinglulu #endif 340*91f16700Schasinglulu 341*91f16700Schasinglulu /* turn on MU1 for non-secure OS/Hypervisor */ 342*91f16700Schasinglulu sc_pm_set_resource_power_mode(ipc_handle, SC_R_MU_1A, SC_PM_PW_MODE_ON); 343*91f16700Schasinglulu /* Turn on GPT_0's power & clock for non-secure OS/Hypervisor */ 344*91f16700Schasinglulu sc_pm_set_resource_power_mode(ipc_handle, SC_R_GPT_0, SC_PM_PW_MODE_ON); 345*91f16700Schasinglulu sc_pm_clock_enable(ipc_handle, SC_R_GPT_0, SC_PM_CLK_PER, true, 0); 346*91f16700Schasinglulu mmio_write_32(IMX_GPT_LPCG_BASE, mmio_read_32(IMX_GPT_LPCG_BASE) | (1 << 25)); 347*91f16700Schasinglulu 348*91f16700Schasinglulu /* 349*91f16700Schasinglulu * create new partition for non-secure OS/Hypervisor 350*91f16700Schasinglulu * uses global structs defined in sec_rsrc.h 351*91f16700Schasinglulu */ 352*91f16700Schasinglulu mx8_partition_resources(); 353*91f16700Schasinglulu 354*91f16700Schasinglulu bl33_image_ep_info.pc = PLAT_NS_IMAGE_OFFSET; 355*91f16700Schasinglulu bl33_image_ep_info.spsr = get_spsr_for_bl33_entry(); 356*91f16700Schasinglulu SET_SECURITY_STATE(bl33_image_ep_info.h.attr, NON_SECURE); 357*91f16700Schasinglulu 358*91f16700Schasinglulu /* init the first cluster's cci slave interface */ 359*91f16700Schasinglulu cci_init(PLAT_CCI_BASE, imx8qm_cci_map, PLATFORM_CLUSTER_COUNT); 360*91f16700Schasinglulu cci_enable_snoop_dvm_reqs(MPIDR_AFFLVL1_VAL(read_mpidr_el1())); 361*91f16700Schasinglulu } 362*91f16700Schasinglulu 363*91f16700Schasinglulu void bl31_plat_arch_setup(void) 364*91f16700Schasinglulu { 365*91f16700Schasinglulu unsigned long ro_start = BL31_RO_START; 366*91f16700Schasinglulu unsigned long ro_size = BL31_RO_END - BL31_RO_START; 367*91f16700Schasinglulu unsigned long rw_start = BL31_RW_START; 368*91f16700Schasinglulu unsigned long rw_size = BL31_RW_END - BL31_RW_START; 369*91f16700Schasinglulu #if USE_COHERENT_MEM 370*91f16700Schasinglulu unsigned long coh_start = BL31_COHERENT_RAM_START; 371*91f16700Schasinglulu unsigned long coh_size = BL31_COHERENT_RAM_END - BL31_COHERENT_RAM_START; 372*91f16700Schasinglulu #endif 373*91f16700Schasinglulu 374*91f16700Schasinglulu mmap_add_region(ro_start, ro_start, ro_size, 375*91f16700Schasinglulu MT_RO | MT_MEMORY | MT_SECURE); 376*91f16700Schasinglulu mmap_add_region(rw_start, rw_start, rw_size, 377*91f16700Schasinglulu MT_RW | MT_MEMORY | MT_SECURE); 378*91f16700Schasinglulu mmap_add(imx_mmap); 379*91f16700Schasinglulu 380*91f16700Schasinglulu #if USE_COHERENT_MEM 381*91f16700Schasinglulu mmap_add_region(coh_start, coh_start, coh_size, 382*91f16700Schasinglulu MT_DEVICE | MT_RW | MT_SECURE); 383*91f16700Schasinglulu #endif 384*91f16700Schasinglulu 385*91f16700Schasinglulu /* setup xlat table */ 386*91f16700Schasinglulu init_xlat_tables(); 387*91f16700Schasinglulu /* enable the MMU */ 388*91f16700Schasinglulu enable_mmu_el3(0); 389*91f16700Schasinglulu } 390*91f16700Schasinglulu 391*91f16700Schasinglulu void bl31_platform_setup(void) 392*91f16700Schasinglulu { 393*91f16700Schasinglulu plat_gic_driver_init(); 394*91f16700Schasinglulu plat_gic_init(); 395*91f16700Schasinglulu } 396*91f16700Schasinglulu 397*91f16700Schasinglulu entry_point_info_t *bl31_plat_get_next_image_ep_info(unsigned int type) 398*91f16700Schasinglulu { 399*91f16700Schasinglulu if (type == NON_SECURE) 400*91f16700Schasinglulu return &bl33_image_ep_info; 401*91f16700Schasinglulu if (type == SECURE) 402*91f16700Schasinglulu return &bl32_image_ep_info; 403*91f16700Schasinglulu 404*91f16700Schasinglulu return NULL; 405*91f16700Schasinglulu } 406*91f16700Schasinglulu 407*91f16700Schasinglulu unsigned int plat_get_syscnt_freq2(void) 408*91f16700Schasinglulu { 409*91f16700Schasinglulu return COUNTER_FREQUENCY; 410*91f16700Schasinglulu } 411*91f16700Schasinglulu 412*91f16700Schasinglulu void bl31_plat_runtime_setup(void) 413*91f16700Schasinglulu { 414*91f16700Schasinglulu return; 415*91f16700Schasinglulu } 416