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 <stdbool.h> 10*91f16700Schasinglulu #include <stdint.h> 11*91f16700Schasinglulu 12*91f16700Schasinglulu #include <platform_def.h> 13*91f16700Schasinglulu 14*91f16700Schasinglulu #include <arch_helpers.h> 15*91f16700Schasinglulu #include <common/bl_common.h> 16*91f16700Schasinglulu #include <common/debug.h> 17*91f16700Schasinglulu #include <context.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 <imx8qx_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 /* Default configuration for i.MX8QM/QXP MEK */ 44*91f16700Schasinglulu #if defined(IMX_USE_UART0) 45*91f16700Schasinglulu #define UART_PAD_CTRL (PADRING_IFMUX_EN_MASK | PADRING_GP_EN_MASK | \ 46*91f16700Schasinglulu (SC_PAD_CONFIG_OUT_IN << PADRING_CONFIG_SHIFT) | \ 47*91f16700Schasinglulu (SC_PAD_ISO_OFF << PADRING_LPCONFIG_SHIFT) | \ 48*91f16700Schasinglulu (SC_PAD_28FDSOI_DSE_DV_LOW << PADRING_DSE_SHIFT) | \ 49*91f16700Schasinglulu (SC_PAD_28FDSOI_PS_PD << PADRING_PULL_SHIFT)) 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 54*91f16700Schasinglulu #elif defined(IMX_USE_UART1) 55*91f16700Schasinglulu #define UART_PAD_CTRL (PADRING_IFMUX_EN_MASK | PADRING_GP_EN_MASK | \ 56*91f16700Schasinglulu (SC_PAD_CONFIG_OUT_IN << PADRING_CONFIG_SHIFT) | \ 57*91f16700Schasinglulu (SC_PAD_ISO_OFF << PADRING_LPCONFIG_SHIFT) | \ 58*91f16700Schasinglulu (SC_PAD_28FDSOI_DSE_DV_LOW << PADRING_DSE_SHIFT) | \ 59*91f16700Schasinglulu (SC_PAD_28FDSOI_PS_PD << PADRING_PULL_SHIFT)) 60*91f16700Schasinglulu #define IMX_RES_UART SC_R_UART_1 61*91f16700Schasinglulu #define IMX_PAD_UART_RX SC_P_UART1_RX 62*91f16700Schasinglulu #define IMX_PAD_UART_TX SC_P_UART1_TX 63*91f16700Schasinglulu 64*91f16700Schasinglulu /* 65*91f16700Schasinglulu * On Toradex Colibri i.MX8QXP UART3 on the FLEXCAN2. 66*91f16700Schasinglulu * Use custom pad control for this 67*91f16700Schasinglulu */ 68*91f16700Schasinglulu #elif defined(IMX_USE_UART3) 69*91f16700Schasinglulu /* 70*91f16700Schasinglulu * FLEXCAN2_RX/TX pads are muxed to ADMA_UART3_RX/TX, 71*91f16700Schasinglulu * For ref: 72*91f16700Schasinglulu * 000b - ADMA_FLEXCAN2_RX 73*91f16700Schasinglulu * 001b - ADMA_SAI3_RXD 74*91f16700Schasinglulu * 010b - ADMA_UART3_RX 75*91f16700Schasinglulu * 011b - ADMA_SAI1_RXFS 76*91f16700Schasinglulu * 100b - LSIO_GPIO1_IO19 77*91f16700Schasinglulu */ 78*91f16700Schasinglulu #define UART_PAD_CTRL (PADRING_IFMUX_EN_MASK | PADRING_GP_EN_MASK | \ 79*91f16700Schasinglulu (SC_PAD_CONFIG_OUT_IN << PADRING_CONFIG_SHIFT) | \ 80*91f16700Schasinglulu (2U << PADRING_IFMUX_SHIFT) | \ 81*91f16700Schasinglulu (SC_PAD_ISO_OFF << PADRING_LPCONFIG_SHIFT) | \ 82*91f16700Schasinglulu (SC_PAD_28FDSOI_DSE_DV_LOW << PADRING_DSE_SHIFT) | \ 83*91f16700Schasinglulu (SC_PAD_28FDSOI_PS_PD << PADRING_PULL_SHIFT)) 84*91f16700Schasinglulu #define IMX_RES_UART SC_R_UART_3 85*91f16700Schasinglulu #define IMX_PAD_UART_RX SC_P_FLEXCAN2_RX 86*91f16700Schasinglulu #define IMX_PAD_UART_TX SC_P_FLEXCAN2_TX 87*91f16700Schasinglulu #else 88*91f16700Schasinglulu #error "Provide proper UART configuration in IMX_DEBUG_UART" 89*91f16700Schasinglulu #endif 90*91f16700Schasinglulu 91*91f16700Schasinglulu static const mmap_region_t imx_mmap[] = { 92*91f16700Schasinglulu MAP_REGION_FLAT(IMX_REG_BASE, IMX_REG_SIZE, MT_DEVICE | MT_RW), 93*91f16700Schasinglulu {0} 94*91f16700Schasinglulu }; 95*91f16700Schasinglulu 96*91f16700Schasinglulu static uint32_t get_spsr_for_bl33_entry(void) 97*91f16700Schasinglulu { 98*91f16700Schasinglulu unsigned long el_status; 99*91f16700Schasinglulu unsigned long mode; 100*91f16700Schasinglulu uint32_t spsr; 101*91f16700Schasinglulu 102*91f16700Schasinglulu /* figure out what mode we enter the non-secure world */ 103*91f16700Schasinglulu el_status = read_id_aa64pfr0_el1() >> ID_AA64PFR0_EL2_SHIFT; 104*91f16700Schasinglulu el_status &= ID_AA64PFR0_ELX_MASK; 105*91f16700Schasinglulu 106*91f16700Schasinglulu mode = (el_status) ? MODE_EL2 : MODE_EL1; 107*91f16700Schasinglulu 108*91f16700Schasinglulu spsr = SPSR_64(mode, MODE_SP_ELX, DISABLE_ALL_EXCEPTIONS); 109*91f16700Schasinglulu return spsr; 110*91f16700Schasinglulu } 111*91f16700Schasinglulu 112*91f16700Schasinglulu #if DEBUG_CONSOLE_A35 113*91f16700Schasinglulu static void lpuart32_serial_setbrg(unsigned int base, int baudrate) 114*91f16700Schasinglulu { 115*91f16700Schasinglulu unsigned int sbr, osr, baud_diff, tmp_osr, tmp_sbr; 116*91f16700Schasinglulu unsigned int diff1, diff2, tmp, rate; 117*91f16700Schasinglulu 118*91f16700Schasinglulu if (baudrate == 0) 119*91f16700Schasinglulu panic(); 120*91f16700Schasinglulu 121*91f16700Schasinglulu sc_pm_get_clock_rate(ipc_handle, IMX_RES_UART, 2, &rate); 122*91f16700Schasinglulu 123*91f16700Schasinglulu baud_diff = baudrate; 124*91f16700Schasinglulu osr = 0; 125*91f16700Schasinglulu sbr = 0; 126*91f16700Schasinglulu for (tmp_osr = 4; tmp_osr <= 32; tmp_osr++) { 127*91f16700Schasinglulu tmp_sbr = (rate / (baudrate * tmp_osr)); 128*91f16700Schasinglulu if (tmp_sbr == 0) 129*91f16700Schasinglulu tmp_sbr = 1; 130*91f16700Schasinglulu 131*91f16700Schasinglulu /* calculate difference in actual baud w/ current values */ 132*91f16700Schasinglulu diff1 = rate / (tmp_osr * tmp_sbr) - baudrate; 133*91f16700Schasinglulu diff2 = rate / (tmp_osr * (tmp_sbr + 1)); 134*91f16700Schasinglulu 135*91f16700Schasinglulu /* select best values between sbr and sbr+1 */ 136*91f16700Schasinglulu if (diff1 > (baudrate - diff2)) { 137*91f16700Schasinglulu diff1 = baudrate - diff2; 138*91f16700Schasinglulu tmp_sbr++; 139*91f16700Schasinglulu } 140*91f16700Schasinglulu 141*91f16700Schasinglulu if (diff1 <= baud_diff) { 142*91f16700Schasinglulu baud_diff = diff1; 143*91f16700Schasinglulu osr = tmp_osr; 144*91f16700Schasinglulu sbr = tmp_sbr; 145*91f16700Schasinglulu } 146*91f16700Schasinglulu } 147*91f16700Schasinglulu 148*91f16700Schasinglulu tmp = mmio_read_32(IMX_BOOT_UART_BASE + BAUD); 149*91f16700Schasinglulu 150*91f16700Schasinglulu if ((osr > 3) && (osr < 8)) 151*91f16700Schasinglulu tmp |= LPUART_BAUD_BOTHEDGE_MASK; 152*91f16700Schasinglulu 153*91f16700Schasinglulu tmp &= ~LPUART_BAUD_OSR_MASK; 154*91f16700Schasinglulu tmp |= LPUART_BAUD_OSR(osr - 1); 155*91f16700Schasinglulu tmp &= ~LPUART_BAUD_SBR_MASK; 156*91f16700Schasinglulu tmp |= LPUART_BAUD_SBR(sbr); 157*91f16700Schasinglulu 158*91f16700Schasinglulu /* explicitly disable 10 bit mode & set 1 stop bit */ 159*91f16700Schasinglulu tmp &= ~(LPUART_BAUD_M10_MASK | LPUART_BAUD_SBNS_MASK); 160*91f16700Schasinglulu 161*91f16700Schasinglulu mmio_write_32(IMX_BOOT_UART_BASE + BAUD, tmp); 162*91f16700Schasinglulu } 163*91f16700Schasinglulu 164*91f16700Schasinglulu static int lpuart32_serial_init(unsigned int base) 165*91f16700Schasinglulu { 166*91f16700Schasinglulu unsigned int tmp; 167*91f16700Schasinglulu 168*91f16700Schasinglulu /* disable TX & RX before enabling clocks */ 169*91f16700Schasinglulu tmp = mmio_read_32(IMX_BOOT_UART_BASE + CTRL); 170*91f16700Schasinglulu tmp &= ~(CTRL_TE | CTRL_RE); 171*91f16700Schasinglulu mmio_write_32(IMX_BOOT_UART_BASE + CTRL, tmp); 172*91f16700Schasinglulu 173*91f16700Schasinglulu mmio_write_32(IMX_BOOT_UART_BASE + MODIR, 0); 174*91f16700Schasinglulu mmio_write_32(IMX_BOOT_UART_BASE + FIFO, ~(FIFO_TXFE | FIFO_RXFE)); 175*91f16700Schasinglulu 176*91f16700Schasinglulu mmio_write_32(IMX_BOOT_UART_BASE + MATCH, 0); 177*91f16700Schasinglulu 178*91f16700Schasinglulu /* provide data bits, parity, stop bit, etc */ 179*91f16700Schasinglulu lpuart32_serial_setbrg(base, IMX_BOOT_UART_BAUDRATE); 180*91f16700Schasinglulu 181*91f16700Schasinglulu /* eight data bits no parity bit */ 182*91f16700Schasinglulu tmp = mmio_read_32(IMX_BOOT_UART_BASE + CTRL); 183*91f16700Schasinglulu tmp &= ~(LPUART_CTRL_PE_MASK | LPUART_CTRL_PT_MASK | LPUART_CTRL_M_MASK); 184*91f16700Schasinglulu mmio_write_32(IMX_BOOT_UART_BASE + CTRL, tmp); 185*91f16700Schasinglulu 186*91f16700Schasinglulu mmio_write_32(IMX_BOOT_UART_BASE + CTRL, CTRL_RE | CTRL_TE); 187*91f16700Schasinglulu 188*91f16700Schasinglulu mmio_write_32(IMX_BOOT_UART_BASE + DATA, 0x55); 189*91f16700Schasinglulu mmio_write_32(IMX_BOOT_UART_BASE + DATA, 0x55); 190*91f16700Schasinglulu mmio_write_32(IMX_BOOT_UART_BASE + DATA, 0x0A); 191*91f16700Schasinglulu 192*91f16700Schasinglulu return 0; 193*91f16700Schasinglulu } 194*91f16700Schasinglulu #endif 195*91f16700Schasinglulu 196*91f16700Schasinglulu void imx8_partition_resources(void) 197*91f16700Schasinglulu { 198*91f16700Schasinglulu sc_rm_pt_t secure_part, os_part; 199*91f16700Schasinglulu sc_rm_mr_t mr, mr_record = 64; 200*91f16700Schasinglulu sc_faddr_t start, end; 201*91f16700Schasinglulu sc_err_t err; 202*91f16700Schasinglulu bool owned; 203*91f16700Schasinglulu int i; 204*91f16700Schasinglulu 205*91f16700Schasinglulu err = sc_rm_get_partition(ipc_handle, &secure_part); 206*91f16700Schasinglulu if (err) 207*91f16700Schasinglulu ERROR("sc_rm_get_partition failed: %u\n", err); 208*91f16700Schasinglulu 209*91f16700Schasinglulu err = sc_rm_partition_alloc(ipc_handle, &os_part, false, false, 210*91f16700Schasinglulu false, false, false); 211*91f16700Schasinglulu if (err) 212*91f16700Schasinglulu ERROR("sc_rm_partition_alloc failed: %u\n", err); 213*91f16700Schasinglulu 214*91f16700Schasinglulu err = sc_rm_set_parent(ipc_handle, os_part, secure_part); 215*91f16700Schasinglulu if (err) 216*91f16700Schasinglulu ERROR("sc_rm_set_parent: %u\n", err); 217*91f16700Schasinglulu 218*91f16700Schasinglulu /* set secure resources to NOT-movable */ 219*91f16700Schasinglulu for (i = 0; i < (ARRAY_SIZE(secure_rsrcs)); i++) { 220*91f16700Schasinglulu err = sc_rm_set_resource_movable(ipc_handle, 221*91f16700Schasinglulu secure_rsrcs[i], secure_rsrcs[i], false); 222*91f16700Schasinglulu if (err) 223*91f16700Schasinglulu ERROR("sc_rm_set_resource_movable: rsrc %u, ret %u\n", 224*91f16700Schasinglulu secure_rsrcs[i], err); 225*91f16700Schasinglulu } 226*91f16700Schasinglulu 227*91f16700Schasinglulu /* move all movable resources and pins to non-secure partition */ 228*91f16700Schasinglulu err = sc_rm_move_all(ipc_handle, secure_part, os_part, true, true); 229*91f16700Schasinglulu if (err) 230*91f16700Schasinglulu ERROR("sc_rm_move_all: %u\n", err); 231*91f16700Schasinglulu 232*91f16700Schasinglulu /* iterate through peripherals to give NS OS part access */ 233*91f16700Schasinglulu for (i = 0; i < ARRAY_SIZE(ns_access_allowed); i++) { 234*91f16700Schasinglulu err = sc_rm_set_peripheral_permissions(ipc_handle, 235*91f16700Schasinglulu ns_access_allowed[i], os_part, SC_RM_PERM_FULL); 236*91f16700Schasinglulu if (err) 237*91f16700Schasinglulu ERROR("sc_rm_set_peripheral_permissions: rsrc %u, \ 238*91f16700Schasinglulu ret %u\n", ns_access_allowed[i], err); 239*91f16700Schasinglulu } 240*91f16700Schasinglulu 241*91f16700Schasinglulu /* 242*91f16700Schasinglulu * sc_rm_set_peripheral_permissions 243*91f16700Schasinglulu * sc_rm_set_memreg_permissions 244*91f16700Schasinglulu * sc_rm_set_pin_movable 245*91f16700Schasinglulu */ 246*91f16700Schasinglulu for (mr = 0; mr < 64; mr++) { 247*91f16700Schasinglulu owned = sc_rm_is_memreg_owned(ipc_handle, mr); 248*91f16700Schasinglulu if (owned) { 249*91f16700Schasinglulu err = sc_rm_get_memreg_info(ipc_handle, mr, &start, &end); 250*91f16700Schasinglulu if (err) 251*91f16700Schasinglulu ERROR("Memreg get info failed, %u\n", mr); 252*91f16700Schasinglulu 253*91f16700Schasinglulu NOTICE("Memreg %u 0x%" PRIx64 " -- 0x%" PRIx64 "\n", mr, start, end); 254*91f16700Schasinglulu if (BL31_BASE >= start && (BL31_LIMIT - 1) <= end) { 255*91f16700Schasinglulu mr_record = mr; /* Record the mr for ATF running */ 256*91f16700Schasinglulu } else { 257*91f16700Schasinglulu err = sc_rm_assign_memreg(ipc_handle, os_part, mr); 258*91f16700Schasinglulu if (err) 259*91f16700Schasinglulu ERROR("Memreg assign failed, 0x%" PRIx64 " -- 0x%" PRIx64 ", \ 260*91f16700Schasinglulu err %d\n", start, end, err); 261*91f16700Schasinglulu } 262*91f16700Schasinglulu } 263*91f16700Schasinglulu } 264*91f16700Schasinglulu 265*91f16700Schasinglulu if (mr_record != 64) { 266*91f16700Schasinglulu err = sc_rm_get_memreg_info(ipc_handle, mr_record, &start, &end); 267*91f16700Schasinglulu if (err) 268*91f16700Schasinglulu ERROR("Memreg get info failed, %u\n", mr_record); 269*91f16700Schasinglulu if ((BL31_LIMIT - 1) < end) { 270*91f16700Schasinglulu err = sc_rm_memreg_alloc(ipc_handle, &mr, BL31_LIMIT, end); 271*91f16700Schasinglulu if (err) 272*91f16700Schasinglulu ERROR("sc_rm_memreg_alloc failed, 0x%" PRIx64 " -- 0x%" PRIx64 "\n", 273*91f16700Schasinglulu (sc_faddr_t)BL31_LIMIT, end); 274*91f16700Schasinglulu err = sc_rm_assign_memreg(ipc_handle, os_part, mr); 275*91f16700Schasinglulu if (err) 276*91f16700Schasinglulu ERROR("Memreg assign failed, 0x%" PRIx64 " -- 0x%" PRIx64 "\n", 277*91f16700Schasinglulu (sc_faddr_t)BL31_LIMIT, end); 278*91f16700Schasinglulu } 279*91f16700Schasinglulu 280*91f16700Schasinglulu if (start < (BL31_BASE - 1)) { 281*91f16700Schasinglulu err = sc_rm_memreg_alloc(ipc_handle, &mr, start, BL31_BASE - 1); 282*91f16700Schasinglulu if (err) 283*91f16700Schasinglulu ERROR("sc_rm_memreg_alloc failed, 0x%" PRIx64 " -- 0x%" PRIx64 "\n", 284*91f16700Schasinglulu start, (sc_faddr_t)BL31_BASE - 1); 285*91f16700Schasinglulu err = sc_rm_assign_memreg(ipc_handle, os_part, mr); 286*91f16700Schasinglulu if (err) 287*91f16700Schasinglulu ERROR("Memreg assign failed, 0x%" PRIx64 " -- 0x%" PRIx64 "\n", 288*91f16700Schasinglulu start, (sc_faddr_t)BL31_BASE - 1); 289*91f16700Schasinglulu } 290*91f16700Schasinglulu } 291*91f16700Schasinglulu 292*91f16700Schasinglulu if (err) 293*91f16700Schasinglulu NOTICE("Partitioning Failed\n"); 294*91f16700Schasinglulu else 295*91f16700Schasinglulu NOTICE("Non-secure Partitioning Succeeded\n"); 296*91f16700Schasinglulu } 297*91f16700Schasinglulu 298*91f16700Schasinglulu void bl31_early_platform_setup2(u_register_t arg0, u_register_t arg1, 299*91f16700Schasinglulu u_register_t arg2, u_register_t arg3) 300*91f16700Schasinglulu { 301*91f16700Schasinglulu #if DEBUG_CONSOLE 302*91f16700Schasinglulu static console_t console; 303*91f16700Schasinglulu #endif 304*91f16700Schasinglulu if (sc_ipc_open(&ipc_handle, SC_IPC_BASE) != SC_ERR_NONE) 305*91f16700Schasinglulu panic(); 306*91f16700Schasinglulu 307*91f16700Schasinglulu #if DEBUG_CONSOLE_A35 308*91f16700Schasinglulu sc_pm_set_resource_power_mode(ipc_handle, IMX_RES_UART, 309*91f16700Schasinglulu SC_PM_PW_MODE_ON); 310*91f16700Schasinglulu sc_pm_clock_rate_t rate = 80000000; 311*91f16700Schasinglulu sc_pm_set_clock_rate(ipc_handle, IMX_RES_UART, 2, &rate); 312*91f16700Schasinglulu sc_pm_clock_enable(ipc_handle, IMX_RES_UART, 2, true, false); 313*91f16700Schasinglulu 314*91f16700Schasinglulu /* Configure UART pads */ 315*91f16700Schasinglulu sc_pad_set(ipc_handle, IMX_PAD_UART_RX, UART_PAD_CTRL); 316*91f16700Schasinglulu sc_pad_set(ipc_handle, IMX_PAD_UART_TX, UART_PAD_CTRL); 317*91f16700Schasinglulu lpuart32_serial_init(IMX_BOOT_UART_BASE); 318*91f16700Schasinglulu #endif 319*91f16700Schasinglulu 320*91f16700Schasinglulu #if DEBUG_CONSOLE 321*91f16700Schasinglulu console_lpuart_register(IMX_BOOT_UART_BASE, IMX_BOOT_UART_CLK_IN_HZ, 322*91f16700Schasinglulu IMX_CONSOLE_BAUDRATE, &console); 323*91f16700Schasinglulu #endif 324*91f16700Schasinglulu /* Turn on MU1 for non-secure OS/Hypervisor */ 325*91f16700Schasinglulu sc_pm_set_resource_power_mode(ipc_handle, SC_R_MU_1A, SC_PM_PW_MODE_ON); 326*91f16700Schasinglulu 327*91f16700Schasinglulu /* Turn on GPT_0's power & clock for non-secure OS/Hypervisor */ 328*91f16700Schasinglulu sc_pm_set_resource_power_mode(ipc_handle, SC_R_GPT_0, SC_PM_PW_MODE_ON); 329*91f16700Schasinglulu sc_pm_clock_enable(ipc_handle, SC_R_GPT_0, SC_PM_CLK_PER, true, 0); 330*91f16700Schasinglulu mmio_write_32(IMX_GPT0_LPCG_BASE, mmio_read_32(IMX_GPT0_LPCG_BASE) | (1 << 25)); 331*91f16700Schasinglulu 332*91f16700Schasinglulu /* 333*91f16700Schasinglulu * create new partition for non-secure OS/Hypervisor 334*91f16700Schasinglulu * uses global structs defined in sec_rsrc.h 335*91f16700Schasinglulu */ 336*91f16700Schasinglulu imx8_partition_resources(); 337*91f16700Schasinglulu 338*91f16700Schasinglulu bl33_image_ep_info.pc = PLAT_NS_IMAGE_OFFSET; 339*91f16700Schasinglulu bl33_image_ep_info.spsr = get_spsr_for_bl33_entry(); 340*91f16700Schasinglulu SET_SECURITY_STATE(bl33_image_ep_info.h.attr, NON_SECURE); 341*91f16700Schasinglulu } 342*91f16700Schasinglulu 343*91f16700Schasinglulu void bl31_plat_arch_setup(void) 344*91f16700Schasinglulu { 345*91f16700Schasinglulu unsigned long ro_start = BL31_RO_START; 346*91f16700Schasinglulu unsigned long ro_size = BL31_RO_END - BL31_RO_START; 347*91f16700Schasinglulu unsigned long rw_start = BL31_RW_START; 348*91f16700Schasinglulu unsigned long rw_size = BL31_RW_END - BL31_RW_START; 349*91f16700Schasinglulu #if USE_COHERENT_MEM 350*91f16700Schasinglulu unsigned long coh_start = BL31_COHERENT_RAM_START; 351*91f16700Schasinglulu unsigned long coh_size = BL31_COHERENT_RAM_END - BL31_COHERENT_RAM_START; 352*91f16700Schasinglulu #endif 353*91f16700Schasinglulu 354*91f16700Schasinglulu mmap_add_region(ro_start, ro_start, ro_size, 355*91f16700Schasinglulu MT_RO | MT_MEMORY | MT_SECURE); 356*91f16700Schasinglulu mmap_add_region(rw_start, rw_start, rw_size, 357*91f16700Schasinglulu MT_RW | MT_MEMORY | MT_SECURE); 358*91f16700Schasinglulu mmap_add(imx_mmap); 359*91f16700Schasinglulu 360*91f16700Schasinglulu #if USE_COHERENT_MEM 361*91f16700Schasinglulu mmap_add_region(coh_start, coh_start, coh_size, 362*91f16700Schasinglulu MT_DEVICE | MT_RW | MT_SECURE); 363*91f16700Schasinglulu #endif 364*91f16700Schasinglulu 365*91f16700Schasinglulu init_xlat_tables(); 366*91f16700Schasinglulu enable_mmu_el3(0); 367*91f16700Schasinglulu } 368*91f16700Schasinglulu 369*91f16700Schasinglulu void bl31_platform_setup(void) 370*91f16700Schasinglulu { 371*91f16700Schasinglulu plat_gic_driver_init(); 372*91f16700Schasinglulu plat_gic_init(); 373*91f16700Schasinglulu } 374*91f16700Schasinglulu 375*91f16700Schasinglulu entry_point_info_t *bl31_plat_get_next_image_ep_info(unsigned int type) 376*91f16700Schasinglulu { 377*91f16700Schasinglulu if (type == NON_SECURE) 378*91f16700Schasinglulu return &bl33_image_ep_info; 379*91f16700Schasinglulu if (type == SECURE) 380*91f16700Schasinglulu return &bl32_image_ep_info; 381*91f16700Schasinglulu 382*91f16700Schasinglulu return NULL; 383*91f16700Schasinglulu } 384*91f16700Schasinglulu 385*91f16700Schasinglulu unsigned int plat_get_syscnt_freq2(void) 386*91f16700Schasinglulu { 387*91f16700Schasinglulu return COUNTER_FREQUENCY; 388*91f16700Schasinglulu } 389*91f16700Schasinglulu 390*91f16700Schasinglulu void bl31_plat_runtime_setup(void) 391*91f16700Schasinglulu { 392*91f16700Schasinglulu return; 393*91f16700Schasinglulu } 394