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