183d290c5STom Rini/* SPDX-License-Identifier: GPL-2.0+ */ 29f3183d2SMingkai Hu/* 39f3183d2SMingkai Hu * (C) Copyright 2014-2015 Freescale Semiconductor 49f3183d2SMingkai Hu * 59f3183d2SMingkai Hu * Extracted from armv8/start.S 69f3183d2SMingkai Hu */ 79f3183d2SMingkai Hu 89f3183d2SMingkai Hu#include <config.h> 99f3183d2SMingkai Hu#include <linux/linkage.h> 109f3183d2SMingkai Hu#include <asm/gic.h> 119f3183d2SMingkai Hu#include <asm/macro.h> 12fa18ed76SWenbin Song#include <asm/arch-fsl-layerscape/soc.h> 139f3183d2SMingkai Hu#ifdef CONFIG_MP 149f3183d2SMingkai Hu#include <asm/arch/mp.h> 159f3183d2SMingkai Hu#endif 16f6a70b3aSPriyanka Jain#ifdef CONFIG_FSL_LSCH3 17f6a70b3aSPriyanka Jain#include <asm/arch-fsl-layerscape/immap_lsch3.h> 18f6a70b3aSPriyanka Jain#endif 19ec6617c3SAlison Wang#include <asm/u-boot.h> 209f3183d2SMingkai Hu 21fa18ed76SWenbin Song/* Get GIC offset 22fa18ed76SWenbin Song* For LS1043a rev1.0, GIC base address align with 4k. 23fa18ed76SWenbin Song* For LS1043a rev1.1, if DCFG_GIC400_ALIGN[GIC_ADDR_BIT] 24fa18ed76SWenbin Song* is set, GIC base address align with 4K, or else align 25fa18ed76SWenbin Song* with 64k. 26fa18ed76SWenbin Song* output: 27fa18ed76SWenbin Song* x0: the base address of GICD 28fa18ed76SWenbin Song* x1: the base address of GICC 29fa18ed76SWenbin Song*/ 30fa18ed76SWenbin SongENTRY(get_gic_offset) 31fa18ed76SWenbin Song ldr x0, =GICD_BASE 32fa18ed76SWenbin Song#ifdef CONFIG_GICV2 33fa18ed76SWenbin Song ldr x1, =GICC_BASE 34fa18ed76SWenbin Song#endif 35fa18ed76SWenbin Song#ifdef CONFIG_HAS_FEATURE_GIC64K_ALIGN 36fa18ed76SWenbin Song ldr x2, =DCFG_CCSR_SVR 37fa18ed76SWenbin Song ldr w2, [x2] 38fa18ed76SWenbin Song rev w2, w2 39a8f33034SWenbin song lsr w3, w2, #16 40a8f33034SWenbin song ldr w4, =SVR_DEV(SVR_LS1043A) 41fa18ed76SWenbin Song cmp w3, w4 42fa18ed76SWenbin Song b.ne 1f 43fa18ed76SWenbin Song ands w2, w2, #0xff 44fa18ed76SWenbin Song cmp w2, #REV1_0 45fa18ed76SWenbin Song b.eq 1f 46fa18ed76SWenbin Song ldr x2, =SCFG_GIC400_ALIGN 47fa18ed76SWenbin Song ldr w2, [x2] 48fa18ed76SWenbin Song rev w2, w2 49fa18ed76SWenbin Song tbnz w2, #GIC_ADDR_BIT, 1f 50fa18ed76SWenbin Song ldr x0, =GICD_BASE_64K 51fa18ed76SWenbin Song#ifdef CONFIG_GICV2 52fa18ed76SWenbin Song ldr x1, =GICC_BASE_64K 53fa18ed76SWenbin Song#endif 54fa18ed76SWenbin Song1: 55fa18ed76SWenbin Song#endif 56fa18ed76SWenbin Song ret 57fa18ed76SWenbin SongENDPROC(get_gic_offset) 58fa18ed76SWenbin Song 59fa18ed76SWenbin SongENTRY(smp_kick_all_cpus) 60fa18ed76SWenbin Song /* Kick secondary cpus up by SGI 0 interrupt */ 61fa18ed76SWenbin Song#if defined(CONFIG_GICV2) || defined(CONFIG_GICV3) 62fa18ed76SWenbin Song mov x29, lr /* Save LR */ 63fa18ed76SWenbin Song bl get_gic_offset 64fa18ed76SWenbin Song bl gic_kick_secondary_cpus 65fa18ed76SWenbin Song mov lr, x29 /* Restore LR */ 66fa18ed76SWenbin Song#endif 67fa18ed76SWenbin Song ret 68fa18ed76SWenbin SongENDPROC(smp_kick_all_cpus) 69fa18ed76SWenbin Song 70fa18ed76SWenbin Song 719f3183d2SMingkai HuENTRY(lowlevel_init) 729f3183d2SMingkai Hu mov x29, lr /* Save LR */ 739f3183d2SMingkai Hu 74bb50569dSYork Sun /* unmask SError and abort */ 75bb50569dSYork Sun msr daifclr, #4 76bb50569dSYork Sun 77bb50569dSYork Sun /* Set HCR_EL2[AMO] so SError @EL2 is taken */ 78bb50569dSYork Sun mrs x0, hcr_el2 79bb50569dSYork Sun orr x0, x0, #0x20 /* AMO */ 80bb50569dSYork Sun msr hcr_el2, x0 81bb50569dSYork Sun isb 82bb50569dSYork Sun 83399e2bb6SYork Sun switch_el x1, 1f, 100f, 100f /* skip if not in EL3 */ 84399e2bb6SYork Sun1: 85399e2bb6SYork Sun 86c055cee1SAshish Kumar#if defined (CONFIG_SYS_FSL_HAS_CCN504) 872b690b98SPrabhakar Kushwaha 882b690b98SPrabhakar Kushwaha /* Set Wuo bit for RN-I 20 */ 894a3ab193SYork Sun#ifdef CONFIG_ARCH_LS2080A 902b690b98SPrabhakar Kushwaha ldr x0, =CCI_AUX_CONTROL_BASE(20) 912b690b98SPrabhakar Kushwaha ldr x1, =0x00000010 922b690b98SPrabhakar Kushwaha bl ccn504_set_aux 93d037261fSPriyanka Jain 94d037261fSPriyanka Jain /* 95d037261fSPriyanka Jain * Set forced-order mode in RNI-6, RNI-20 96d037261fSPriyanka Jain * This is required for performance optimization on LS2088A 97d037261fSPriyanka Jain * LS2080A family does not support setting forced-order mode, 98d037261fSPriyanka Jain * so skip this operation for LS2080A family 99d037261fSPriyanka Jain */ 100d037261fSPriyanka Jain bl get_svr 101d037261fSPriyanka Jain lsr w0, w0, #16 102a8f33034SWenbin song ldr w1, =SVR_DEV(SVR_LS2080A) 103d037261fSPriyanka Jain cmp w0, w1 104d037261fSPriyanka Jain b.eq 1f 105d037261fSPriyanka Jain 106d037261fSPriyanka Jain ldr x0, =CCI_AUX_CONTROL_BASE(6) 107d037261fSPriyanka Jain ldr x1, =0x00000020 108d037261fSPriyanka Jain bl ccn504_set_aux 109d037261fSPriyanka Jain ldr x0, =CCI_AUX_CONTROL_BASE(20) 110d037261fSPriyanka Jain ldr x1, =0x00000020 111d037261fSPriyanka Jain bl ccn504_set_aux 112d037261fSPriyanka Jain1: 1132b690b98SPrabhakar Kushwaha#endif 1142b690b98SPrabhakar Kushwaha 1159f3183d2SMingkai Hu /* Add fully-coherent masters to DVM domain */ 1169f3183d2SMingkai Hu ldr x0, =CCI_MN_BASE 1179f3183d2SMingkai Hu ldr x1, =CCI_MN_RNF_NODEID_LIST 1189f3183d2SMingkai Hu ldr x2, =CCI_MN_DVM_DOMAIN_CTL_SET 1199f3183d2SMingkai Hu bl ccn504_add_masters_to_dvm 1209f3183d2SMingkai Hu 1219f3183d2SMingkai Hu /* Set all RN-I ports to QoS of 15 */ 1229f3183d2SMingkai Hu ldr x0, =CCI_S0_QOS_CONTROL_BASE(0) 1239f3183d2SMingkai Hu ldr x1, =0x00FF000C 1249f3183d2SMingkai Hu bl ccn504_set_qos 1259f3183d2SMingkai Hu ldr x0, =CCI_S1_QOS_CONTROL_BASE(0) 1269f3183d2SMingkai Hu ldr x1, =0x00FF000C 1279f3183d2SMingkai Hu bl ccn504_set_qos 1289f3183d2SMingkai Hu ldr x0, =CCI_S2_QOS_CONTROL_BASE(0) 1299f3183d2SMingkai Hu ldr x1, =0x00FF000C 1309f3183d2SMingkai Hu bl ccn504_set_qos 1319f3183d2SMingkai Hu 1329f3183d2SMingkai Hu ldr x0, =CCI_S0_QOS_CONTROL_BASE(2) 1339f3183d2SMingkai Hu ldr x1, =0x00FF000C 1349f3183d2SMingkai Hu bl ccn504_set_qos 1359f3183d2SMingkai Hu ldr x0, =CCI_S1_QOS_CONTROL_BASE(2) 1369f3183d2SMingkai Hu ldr x1, =0x00FF000C 1379f3183d2SMingkai Hu bl ccn504_set_qos 1389f3183d2SMingkai Hu ldr x0, =CCI_S2_QOS_CONTROL_BASE(2) 1399f3183d2SMingkai Hu ldr x1, =0x00FF000C 1409f3183d2SMingkai Hu bl ccn504_set_qos 1419f3183d2SMingkai Hu 1429f3183d2SMingkai Hu ldr x0, =CCI_S0_QOS_CONTROL_BASE(6) 1439f3183d2SMingkai Hu ldr x1, =0x00FF000C 1449f3183d2SMingkai Hu bl ccn504_set_qos 1459f3183d2SMingkai Hu ldr x0, =CCI_S1_QOS_CONTROL_BASE(6) 1469f3183d2SMingkai Hu ldr x1, =0x00FF000C 1479f3183d2SMingkai Hu bl ccn504_set_qos 1489f3183d2SMingkai Hu ldr x0, =CCI_S2_QOS_CONTROL_BASE(6) 1499f3183d2SMingkai Hu ldr x1, =0x00FF000C 1509f3183d2SMingkai Hu bl ccn504_set_qos 1519f3183d2SMingkai Hu 1529f3183d2SMingkai Hu ldr x0, =CCI_S0_QOS_CONTROL_BASE(12) 1539f3183d2SMingkai Hu ldr x1, =0x00FF000C 1549f3183d2SMingkai Hu bl ccn504_set_qos 1559f3183d2SMingkai Hu ldr x0, =CCI_S1_QOS_CONTROL_BASE(12) 1569f3183d2SMingkai Hu ldr x1, =0x00FF000C 1579f3183d2SMingkai Hu bl ccn504_set_qos 1589f3183d2SMingkai Hu ldr x0, =CCI_S2_QOS_CONTROL_BASE(12) 1599f3183d2SMingkai Hu ldr x1, =0x00FF000C 1609f3183d2SMingkai Hu bl ccn504_set_qos 1619f3183d2SMingkai Hu 1629f3183d2SMingkai Hu ldr x0, =CCI_S0_QOS_CONTROL_BASE(16) 1639f3183d2SMingkai Hu ldr x1, =0x00FF000C 1649f3183d2SMingkai Hu bl ccn504_set_qos 1659f3183d2SMingkai Hu ldr x0, =CCI_S1_QOS_CONTROL_BASE(16) 1669f3183d2SMingkai Hu ldr x1, =0x00FF000C 1679f3183d2SMingkai Hu bl ccn504_set_qos 1689f3183d2SMingkai Hu ldr x0, =CCI_S2_QOS_CONTROL_BASE(16) 1699f3183d2SMingkai Hu ldr x1, =0x00FF000C 1709f3183d2SMingkai Hu bl ccn504_set_qos 1719f3183d2SMingkai Hu 1729f3183d2SMingkai Hu ldr x0, =CCI_S0_QOS_CONTROL_BASE(20) 1739f3183d2SMingkai Hu ldr x1, =0x00FF000C 1749f3183d2SMingkai Hu bl ccn504_set_qos 1759f3183d2SMingkai Hu ldr x0, =CCI_S1_QOS_CONTROL_BASE(20) 1769f3183d2SMingkai Hu ldr x1, =0x00FF000C 1779f3183d2SMingkai Hu bl ccn504_set_qos 1789f3183d2SMingkai Hu ldr x0, =CCI_S2_QOS_CONTROL_BASE(20) 1799f3183d2SMingkai Hu ldr x1, =0x00FF000C 1809f3183d2SMingkai Hu bl ccn504_set_qos 181c055cee1SAshish Kumar#endif /* CONFIG_SYS_FSL_HAS_CCN504 */ 1829f3183d2SMingkai Hu 1831e49a231SPrabhakar Kushwaha#ifdef SMMU_BASE 1849f3183d2SMingkai Hu /* Set the SMMU page size in the sACR register */ 1859f3183d2SMingkai Hu ldr x1, =SMMU_BASE 1869f3183d2SMingkai Hu ldr w0, [x1, #0x10] 1879f3183d2SMingkai Hu orr w0, w0, #1 << 16 /* set sACR.pagesize to indicate 64K page */ 1889f3183d2SMingkai Hu str w0, [x1, #0x10] 1891e49a231SPrabhakar Kushwaha#endif 1909f3183d2SMingkai Hu 1919f3183d2SMingkai Hu /* Initialize GIC Secure Bank Status */ 1929f3183d2SMingkai Hu#if defined(CONFIG_GICV2) || defined(CONFIG_GICV3) 1939f3183d2SMingkai Hu branch_if_slave x0, 1f 194fa18ed76SWenbin Song bl get_gic_offset 1959f3183d2SMingkai Hu bl gic_init_secure 1969f3183d2SMingkai Hu1: 1979f3183d2SMingkai Hu#ifdef CONFIG_GICV3 1989f3183d2SMingkai Hu ldr x0, =GICR_BASE 1999f3183d2SMingkai Hu bl gic_init_secure_percpu 2009f3183d2SMingkai Hu#elif defined(CONFIG_GICV2) 201fa18ed76SWenbin Song bl get_gic_offset 2029f3183d2SMingkai Hu bl gic_init_secure_percpu 2039f3183d2SMingkai Hu#endif 2049f3183d2SMingkai Hu#endif 2059f3183d2SMingkai Hu 206399e2bb6SYork Sun100: 2079f3183d2SMingkai Hu branch_if_master x0, x1, 2f 2089f3183d2SMingkai Hu 2099f3183d2SMingkai Hu#if defined(CONFIG_MP) && defined(CONFIG_ARMV8_MULTIENTRY) 2109f3183d2SMingkai Hu ldr x0, =secondary_boot_func 2119f3183d2SMingkai Hu blr x0 2129f3183d2SMingkai Hu#endif 2139f3183d2SMingkai Hu 2149f3183d2SMingkai Hu2: 215399e2bb6SYork Sun switch_el x1, 1f, 100f, 100f /* skip if not in EL3 */ 216399e2bb6SYork Sun1: 2179f3183d2SMingkai Hu#ifdef CONFIG_FSL_TZPC_BP147 2189f3183d2SMingkai Hu /* Set Non Secure access for all devices protected via TZPC */ 2199f3183d2SMingkai Hu ldr x1, =TZPCDECPROT_0_SET_BASE /* Decode Protection-0 Set Reg */ 2209f3183d2SMingkai Hu orr w0, w0, #1 << 3 /* DCFG_RESET is accessible from NS world */ 2219f3183d2SMingkai Hu str w0, [x1] 2229f3183d2SMingkai Hu 2239f3183d2SMingkai Hu isb 2249f3183d2SMingkai Hu dsb sy 2259f3183d2SMingkai Hu#endif 2269f3183d2SMingkai Hu 2279f3183d2SMingkai Hu#ifdef CONFIG_FSL_TZASC_400 228d5df606dSPriyanka Jain /* 229d5df606dSPriyanka Jain * LS2080 and its personalities does not support TZASC 230d5df606dSPriyanka Jain * So skip TZASC related operations 231d5df606dSPriyanka Jain */ 232d5df606dSPriyanka Jain bl get_svr 233d5df606dSPriyanka Jain lsr w0, w0, #16 234a8f33034SWenbin song ldr w1, =SVR_DEV(SVR_LS2080A) 235d5df606dSPriyanka Jain cmp w0, w1 236d5df606dSPriyanka Jain b.eq 1f 237d5df606dSPriyanka Jain 2389f3183d2SMingkai Hu /* Set TZASC so that: 2399f3183d2SMingkai Hu * a. We use only Region0 whose global secure write/read is EN 2409f3183d2SMingkai Hu * b. We use only Region0 whose NSAID write/read is EN 2419f3183d2SMingkai Hu * 2429f3183d2SMingkai Hu * NOTE: As per the CCSR map doc, TZASC 3 and TZASC 4 are just 2439f3183d2SMingkai Hu * placeholders. 2449f3183d2SMingkai Hu */ 245bda33d3cSSriram Dash 246bda33d3cSSriram Dash.macro tzasc_prog, xreg 247bda33d3cSSriram Dash 248bda33d3cSSriram Dash mov x12, TZASC1_BASE 249bda33d3cSSriram Dash mov x16, #0x10000 250bda33d3cSSriram Dash mul x14, \xreg, x16 251bda33d3cSSriram Dash add x14, x14,x12 252bda33d3cSSriram Dash mov x1, #0x8 253bda33d3cSSriram Dash add x1, x1, x14 254bda33d3cSSriram Dash 2557cfbb4abSPriyanka Jain ldr w0, [x1] /* Filter 0 Gate Keeper Register */ 2567cfbb4abSPriyanka Jain orr w0, w0, #1 << 0 /* Set open_request for Filter 0 */ 2577cfbb4abSPriyanka Jain str w0, [x1] 2589f3183d2SMingkai Hu 259bda33d3cSSriram Dash mov x1, #0x110 260bda33d3cSSriram Dash add x1, x1, x14 261bda33d3cSSriram Dash 2627cfbb4abSPriyanka Jain ldr w0, [x1] /* Region-0 Attributes Register */ 2637cfbb4abSPriyanka Jain orr w0, w0, #1 << 31 /* Set Sec global write en, Bit[31] */ 2647cfbb4abSPriyanka Jain orr w0, w0, #1 << 30 /* Set Sec global read en, Bit[30] */ 2657cfbb4abSPriyanka Jain str w0, [x1] 2669f3183d2SMingkai Hu 267bda33d3cSSriram Dash mov x1, #0x114 268bda33d3cSSriram Dash add x1, x1, x14 269bda33d3cSSriram Dash 27085a9a14eSAshish kumar ldr w0, [x1] /* Region-0 Access Register */ 27185a9a14eSAshish kumar mov w0, #0xFFFFFFFF /* Set nsaid_wr_en and nsaid_rd_en */ 27285a9a14eSAshish kumar str w0, [x1] 273bda33d3cSSriram Dash.endm 274bda33d3cSSriram Dash 275bda33d3cSSriram Dash#ifdef CONFIG_FSL_TZASC_1 276bda33d3cSSriram Dash mov x13, #0 277bda33d3cSSriram Dash tzasc_prog x13 278bda33d3cSSriram Dash 27985a9a14eSAshish kumar#endif 28085a9a14eSAshish kumar#ifdef CONFIG_FSL_TZASC_2 281bda33d3cSSriram Dash mov x13, #1 282bda33d3cSSriram Dash tzasc_prog x13 28385a9a14eSAshish kumar 28485a9a14eSAshish kumar#endif 2859f3183d2SMingkai Hu isb 2869f3183d2SMingkai Hu dsb sy 2879f3183d2SMingkai Hu#endif 288399e2bb6SYork Sun100: 289d5df606dSPriyanka Jain1: 290da28e58aSYork Sun#ifdef CONFIG_ARCH_LS1046A 291399e2bb6SYork Sun switch_el x1, 1f, 100f, 100f /* skip if not in EL3 */ 292399e2bb6SYork Sun1: 29313f79880SMingkai Hu /* Initialize the L2 RAM latency */ 29413f79880SMingkai Hu mrs x1, S3_1_c11_c0_2 29513f79880SMingkai Hu mov x0, #0x1C7 29613f79880SMingkai Hu /* Clear L2 Tag RAM latency and L2 Data RAM latency */ 29713f79880SMingkai Hu bic x1, x1, x0 29813f79880SMingkai Hu /* Set L2 data ram latency bits [2:0] */ 29913f79880SMingkai Hu orr x1, x1, #0x2 30013f79880SMingkai Hu /* set L2 tag ram latency bits [8:6] */ 30113f79880SMingkai Hu orr x1, x1, #0x80 30213f79880SMingkai Hu msr S3_1_c11_c0_2, x1 30313f79880SMingkai Hu isb 304399e2bb6SYork Sun100: 30513f79880SMingkai Hu#endif 30613f79880SMingkai Hu 3075a73ec61SRajesh Bhagat#if !defined(CONFIG_TFABOOT) && \ 3085a73ec61SRajesh Bhagat (defined(CONFIG_FSL_LSCH2) && !defined(CONFIG_SPL_BUILD)) 3093b6bf811SHou Zhiqiang bl fsl_ocram_init 3103b6bf811SHou Zhiqiang#endif 3113b6bf811SHou Zhiqiang 3129f3183d2SMingkai Hu mov lr, x29 /* Restore LR */ 3139f3183d2SMingkai Hu ret 3149f3183d2SMingkai HuENDPROC(lowlevel_init) 3159f3183d2SMingkai Hu 3163b6bf811SHou Zhiqiang#if defined(CONFIG_FSL_LSCH2) && !defined(CONFIG_SPL_BUILD) 3173b6bf811SHou ZhiqiangENTRY(fsl_ocram_init) 3183b6bf811SHou Zhiqiang mov x28, lr /* Save LR */ 3193b6bf811SHou Zhiqiang bl fsl_clear_ocram 3203b6bf811SHou Zhiqiang bl fsl_ocram_clear_ecc_err 3213b6bf811SHou Zhiqiang mov lr, x28 /* Restore LR */ 3223b6bf811SHou Zhiqiang ret 3233b6bf811SHou ZhiqiangENDPROC(fsl_ocram_init) 3243b6bf811SHou Zhiqiang 3253b6bf811SHou ZhiqiangENTRY(fsl_clear_ocram) 3263b6bf811SHou Zhiqiang/* Clear OCRAM */ 3273b6bf811SHou Zhiqiang ldr x0, =CONFIG_SYS_FSL_OCRAM_BASE 3283b6bf811SHou Zhiqiang ldr x1, =(CONFIG_SYS_FSL_OCRAM_BASE + CONFIG_SYS_FSL_OCRAM_SIZE) 3293b6bf811SHou Zhiqiang mov x2, #0 3303b6bf811SHou Zhiqiangclear_loop: 3313b6bf811SHou Zhiqiang str x2, [x0] 3323b6bf811SHou Zhiqiang add x0, x0, #8 3333b6bf811SHou Zhiqiang cmp x0, x1 3343b6bf811SHou Zhiqiang b.lo clear_loop 3353b6bf811SHou Zhiqiang ret 3363b6bf811SHou ZhiqiangENDPROC(fsl_clear_ocram) 3373b6bf811SHou Zhiqiang 3383b6bf811SHou ZhiqiangENTRY(fsl_ocram_clear_ecc_err) 3393b6bf811SHou Zhiqiang /* OCRAM1/2 ECC status bit */ 3403b6bf811SHou Zhiqiang mov w1, #0x60 3413b6bf811SHou Zhiqiang ldr x0, =DCSR_DCFG_SBEESR2 3423b6bf811SHou Zhiqiang str w1, [x0] 3433b6bf811SHou Zhiqiang ldr x0, =DCSR_DCFG_MBEESR2 3443b6bf811SHou Zhiqiang str w1, [x0] 3453b6bf811SHou Zhiqiang ret 3463b6bf811SHou ZhiqiangENDPROC(fsl_ocram_init) 3473b6bf811SHou Zhiqiang#endif 3483b6bf811SHou Zhiqiang 349b7f2bbffSPrabhakar Kushwaha#ifdef CONFIG_FSL_LSCH3 350f6a70b3aSPriyanka Jain .globl get_svr 351f6a70b3aSPriyanka Jainget_svr: 352f6a70b3aSPriyanka Jain ldr x1, =FSL_LSCH3_SVR 353f6a70b3aSPriyanka Jain ldr w0, [x1] 354f6a70b3aSPriyanka Jain ret 355c055cee1SAshish Kumar#endif 356f6a70b3aSPriyanka Jain 357*4909b89eSPriyanka Jain#if defined(CONFIG_SYS_FSL_HAS_CCN504) || defined(CONFIG_SYS_FSL_HAS_CCN508) 3589f3183d2SMingkai Huhnf_pstate_poll: 3599f3183d2SMingkai Hu /* x0 has the desired status, return 0 for success, 1 for timeout 3609f3183d2SMingkai Hu * clobber x1, x2, x3, x4, x6, x7 3619f3183d2SMingkai Hu */ 3629f3183d2SMingkai Hu mov x1, x0 3639f3183d2SMingkai Hu mov x7, #0 /* flag for timeout */ 3649f3183d2SMingkai Hu mrs x3, cntpct_el0 /* read timer */ 3659f3183d2SMingkai Hu add x3, x3, #1200 /* timeout after 100 microseconds */ 3669f3183d2SMingkai Hu mov x0, #0x18 3679f3183d2SMingkai Hu movk x0, #0x420, lsl #16 /* HNF0_PSTATE_STATUS */ 3689f3183d2SMingkai Hu mov w6, #8 /* HN-F node count */ 3699f3183d2SMingkai Hu1: 3709f3183d2SMingkai Hu ldr x2, [x0] 3719f3183d2SMingkai Hu cmp x2, x1 /* check status */ 3729f3183d2SMingkai Hu b.eq 2f 3739f3183d2SMingkai Hu mrs x4, cntpct_el0 3749f3183d2SMingkai Hu cmp x4, x3 3759f3183d2SMingkai Hu b.ls 1b 3769f3183d2SMingkai Hu mov x7, #1 /* timeout */ 3779f3183d2SMingkai Hu b 3f 3789f3183d2SMingkai Hu2: 3799f3183d2SMingkai Hu add x0, x0, #0x10000 /* move to next node */ 3809f3183d2SMingkai Hu subs w6, w6, #1 3819f3183d2SMingkai Hu cbnz w6, 1b 3829f3183d2SMingkai Hu3: 3839f3183d2SMingkai Hu mov x0, x7 3849f3183d2SMingkai Hu ret 3859f3183d2SMingkai Hu 3869f3183d2SMingkai Huhnf_set_pstate: 3879f3183d2SMingkai Hu /* x0 has the desired state, clobber x1, x2, x6 */ 3889f3183d2SMingkai Hu mov x1, x0 3899f3183d2SMingkai Hu /* power state to SFONLY */ 3909f3183d2SMingkai Hu mov w6, #8 /* HN-F node count */ 3919f3183d2SMingkai Hu mov x0, #0x10 3929f3183d2SMingkai Hu movk x0, #0x420, lsl #16 /* HNF0_PSTATE_REQ */ 3939f3183d2SMingkai Hu1: /* set pstate to sfonly */ 3949f3183d2SMingkai Hu ldr x2, [x0] 3959f3183d2SMingkai Hu and x2, x2, #0xfffffffffffffffc /* & HNFPSTAT_MASK */ 3969f3183d2SMingkai Hu orr x2, x2, x1 3979f3183d2SMingkai Hu str x2, [x0] 3989f3183d2SMingkai Hu add x0, x0, #0x10000 /* move to next node */ 3999f3183d2SMingkai Hu subs w6, w6, #1 4009f3183d2SMingkai Hu cbnz w6, 1b 4019f3183d2SMingkai Hu 4029f3183d2SMingkai Hu ret 4039f3183d2SMingkai Hu 4041ab557a0SStephen WarrenENTRY(__asm_flush_l3_dcache) 4059f3183d2SMingkai Hu /* 4069f3183d2SMingkai Hu * Return status in x0 4079f3183d2SMingkai Hu * success 0 408399e2bb6SYork Sun * timeout 1 for setting SFONLY, 2 for FAM, 3 for both 4099f3183d2SMingkai Hu */ 4109f3183d2SMingkai Hu mov x29, lr 4119f3183d2SMingkai Hu mov x8, #0 4129f3183d2SMingkai Hu 4139f3183d2SMingkai Hu dsb sy 4149f3183d2SMingkai Hu mov x0, #0x1 /* HNFPSTAT_SFONLY */ 4159f3183d2SMingkai Hu bl hnf_set_pstate 4169f3183d2SMingkai Hu 4179f3183d2SMingkai Hu mov x0, #0x4 /* SFONLY status */ 4189f3183d2SMingkai Hu bl hnf_pstate_poll 4199f3183d2SMingkai Hu cbz x0, 1f 4209f3183d2SMingkai Hu mov x8, #1 /* timeout */ 4219f3183d2SMingkai Hu1: 4229f3183d2SMingkai Hu dsb sy 4239f3183d2SMingkai Hu mov x0, #0x3 /* HNFPSTAT_FAM */ 4249f3183d2SMingkai Hu bl hnf_set_pstate 4259f3183d2SMingkai Hu 4269f3183d2SMingkai Hu mov x0, #0xc /* FAM status */ 4279f3183d2SMingkai Hu bl hnf_pstate_poll 4289f3183d2SMingkai Hu cbz x0, 1f 4299f3183d2SMingkai Hu add x8, x8, #0x2 4309f3183d2SMingkai Hu1: 4319f3183d2SMingkai Hu mov x0, x8 4329f3183d2SMingkai Hu mov lr, x29 4339f3183d2SMingkai Hu ret 4341ab557a0SStephen WarrenENDPROC(__asm_flush_l3_dcache) 435c055cee1SAshish Kumar#endif /* CONFIG_SYS_FSL_HAS_CCN504 */ 4369f3183d2SMingkai Hu 4379f3183d2SMingkai Hu#ifdef CONFIG_MP 4389f3183d2SMingkai Hu /* Keep literals not used by the secondary boot code outside it */ 4399f3183d2SMingkai Hu .ltorg 4409f3183d2SMingkai Hu 4419f3183d2SMingkai Hu /* Using 64 bit alignment since the spin table is accessed as data */ 4429f3183d2SMingkai Hu .align 4 4439f3183d2SMingkai Hu .global secondary_boot_code 4449f3183d2SMingkai Hu /* Secondary Boot Code starts here */ 4459f3183d2SMingkai Husecondary_boot_code: 4469f3183d2SMingkai Hu .global __spin_table 4479f3183d2SMingkai Hu__spin_table: 4489f3183d2SMingkai Hu .space CONFIG_MAX_CPUS*SPIN_TABLE_ELEM_SIZE 4499f3183d2SMingkai Hu 4509f3183d2SMingkai Hu .align 2 4519f3183d2SMingkai HuENTRY(secondary_boot_func) 4529f3183d2SMingkai Hu /* 4539f3183d2SMingkai Hu * MPIDR_EL1 Fields: 4549f3183d2SMingkai Hu * MPIDR[1:0] = AFF0_CPUID <- Core ID (0,1) 4559f3183d2SMingkai Hu * MPIDR[7:2] = AFF0_RES 4569f3183d2SMingkai Hu * MPIDR[15:8] = AFF1_CLUSTERID <- Cluster ID (0,1,2,3) 4579f3183d2SMingkai Hu * MPIDR[23:16] = AFF2_CLUSTERID 4589f3183d2SMingkai Hu * MPIDR[24] = MT 4599f3183d2SMingkai Hu * MPIDR[29:25] = RES0 4609f3183d2SMingkai Hu * MPIDR[30] = U 4619f3183d2SMingkai Hu * MPIDR[31] = ME 4629f3183d2SMingkai Hu * MPIDR[39:32] = AFF3 4639f3183d2SMingkai Hu * 4649f3183d2SMingkai Hu * Linear Processor ID (LPID) calculation from MPIDR_EL1: 4659f3183d2SMingkai Hu * (We only use AFF0_CPUID and AFF1_CLUSTERID for now 4669f3183d2SMingkai Hu * until AFF2_CLUSTERID and AFF3 have non-zero values) 4679f3183d2SMingkai Hu * 4689f3183d2SMingkai Hu * LPID = MPIDR[15:8] | MPIDR[1:0] 4699f3183d2SMingkai Hu */ 4709f3183d2SMingkai Hu mrs x0, mpidr_el1 4719f3183d2SMingkai Hu ubfm x1, x0, #8, #15 4729f3183d2SMingkai Hu ubfm x2, x0, #0, #1 4739f3183d2SMingkai Hu orr x10, x2, x1, lsl #2 /* x10 has LPID */ 4749f3183d2SMingkai Hu ubfm x9, x0, #0, #15 /* x9 contains MPIDR[15:0] */ 4759f3183d2SMingkai Hu /* 4769f3183d2SMingkai Hu * offset of the spin table element for this core from start of spin 4779f3183d2SMingkai Hu * table (each elem is padded to 64 bytes) 4789f3183d2SMingkai Hu */ 4799f3183d2SMingkai Hu lsl x1, x10, #6 4809f3183d2SMingkai Hu ldr x0, =__spin_table 4819f3183d2SMingkai Hu /* physical address of this cpus spin table element */ 4829f3183d2SMingkai Hu add x11, x1, x0 4839f3183d2SMingkai Hu 4849f3183d2SMingkai Hu ldr x0, =__real_cntfrq 4859f3183d2SMingkai Hu ldr x0, [x0] 4869f3183d2SMingkai Hu msr cntfrq_el0, x0 /* set with real frequency */ 4879f3183d2SMingkai Hu str x9, [x11, #16] /* LPID */ 4889f3183d2SMingkai Hu mov x4, #1 4899f3183d2SMingkai Hu str x4, [x11, #8] /* STATUS */ 4909f3183d2SMingkai Hu dsb sy 4919f3183d2SMingkai Hu#if defined(CONFIG_GICV3) 4929f3183d2SMingkai Hu gic_wait_for_interrupt_m x0 4939f3183d2SMingkai Hu#elif defined(CONFIG_GICV2) 494fa18ed76SWenbin Song bl get_gic_offset 495fa18ed76SWenbin Song mov x0, x1 4969f3183d2SMingkai Hu gic_wait_for_interrupt_m x0, w1 4979f3183d2SMingkai Hu#endif 4989f3183d2SMingkai Hu 4999f3183d2SMingkai Huslave_cpu: 5009f3183d2SMingkai Hu wfe 5019f3183d2SMingkai Hu ldr x0, [x11] 5029f3183d2SMingkai Hu cbz x0, slave_cpu 5039f3183d2SMingkai Hu#ifndef CONFIG_ARMV8_SWITCH_TO_EL1 5049f3183d2SMingkai Hu mrs x1, sctlr_el2 5059f3183d2SMingkai Hu#else 5069f3183d2SMingkai Hu mrs x1, sctlr_el1 5079f3183d2SMingkai Hu#endif 5089f3183d2SMingkai Hu tbz x1, #25, cpu_is_le 5099f3183d2SMingkai Hu rev x0, x0 /* BE to LE conversion */ 5109f3183d2SMingkai Hucpu_is_le: 511ec6617c3SAlison Wang ldr x5, [x11, #24] 512020b3ce8SAlison Wang cbz x5, 1f 513ec6617c3SAlison Wang 514ec6617c3SAlison Wang#ifdef CONFIG_ARMV8_SWITCH_TO_EL1 5157c5e1febSAlison Wang adr x4, secondary_switch_to_el1 5167c5e1febSAlison Wang ldr x5, =ES_TO_AARCH64 517ec6617c3SAlison Wang#else 5187c5e1febSAlison Wang ldr x4, [x11] 5197c5e1febSAlison Wang ldr x5, =ES_TO_AARCH32 520ec6617c3SAlison Wang#endif 521ec6617c3SAlison Wang bl secondary_switch_to_el2 522ec6617c3SAlison Wang 523ec6617c3SAlison Wang1: 524ec6617c3SAlison Wang#ifdef CONFIG_ARMV8_SWITCH_TO_EL1 5257c5e1febSAlison Wang adr x4, secondary_switch_to_el1 526ec6617c3SAlison Wang#else 5277c5e1febSAlison Wang ldr x4, [x11] 528ec6617c3SAlison Wang#endif 5297c5e1febSAlison Wang ldr x5, =ES_TO_AARCH64 530ec6617c3SAlison Wang bl secondary_switch_to_el2 531ec6617c3SAlison Wang 5329f3183d2SMingkai HuENDPROC(secondary_boot_func) 5339f3183d2SMingkai Hu 5349f3183d2SMingkai HuENTRY(secondary_switch_to_el2) 5357c5e1febSAlison Wang switch_el x6, 1f, 0f, 0f 5369f3183d2SMingkai Hu0: ret 5377c5e1febSAlison Wang1: armv8_switch_to_el2_m x4, x5, x6 5389f3183d2SMingkai HuENDPROC(secondary_switch_to_el2) 5399f3183d2SMingkai Hu 5409f3183d2SMingkai HuENTRY(secondary_switch_to_el1) 541ec6617c3SAlison Wang mrs x0, mpidr_el1 542ec6617c3SAlison Wang ubfm x1, x0, #8, #15 543ec6617c3SAlison Wang ubfm x2, x0, #0, #1 544ec6617c3SAlison Wang orr x10, x2, x1, lsl #2 /* x10 has LPID */ 545ec6617c3SAlison Wang 546ec6617c3SAlison Wang lsl x1, x10, #6 547ec6617c3SAlison Wang ldr x0, =__spin_table 548ec6617c3SAlison Wang /* physical address of this cpus spin table element */ 549ec6617c3SAlison Wang add x11, x1, x0 550ec6617c3SAlison Wang 5517c5e1febSAlison Wang ldr x4, [x11] 552ec6617c3SAlison Wang 553ec6617c3SAlison Wang ldr x5, [x11, #24] 554020b3ce8SAlison Wang cbz x5, 2f 555ec6617c3SAlison Wang 5567c5e1febSAlison Wang ldr x5, =ES_TO_AARCH32 557ec6617c3SAlison Wang bl switch_to_el1 558ec6617c3SAlison Wang 5597c5e1febSAlison Wang2: ldr x5, =ES_TO_AARCH64 560ec6617c3SAlison Wang 561ec6617c3SAlison Wangswitch_to_el1: 5627c5e1febSAlison Wang switch_el x6, 0f, 1f, 0f 5639f3183d2SMingkai Hu0: ret 5647c5e1febSAlison Wang1: armv8_switch_to_el1_m x4, x5, x6 5659f3183d2SMingkai HuENDPROC(secondary_switch_to_el1) 5669f3183d2SMingkai Hu 5679f3183d2SMingkai Hu /* Ensure that the literals used by the secondary boot code are 5689f3183d2SMingkai Hu * assembled within it (this is required so that we can protect 5699f3183d2SMingkai Hu * this area with a single memreserve region 5709f3183d2SMingkai Hu */ 5719f3183d2SMingkai Hu .ltorg 5729f3183d2SMingkai Hu 5739f3183d2SMingkai Hu /* 64 bit alignment for elements accessed as data */ 5749f3183d2SMingkai Hu .align 4 5759f3183d2SMingkai Hu .global __real_cntfrq 5769f3183d2SMingkai Hu__real_cntfrq: 5779f3183d2SMingkai Hu .quad COUNTER_FREQUENCY 5789f3183d2SMingkai Hu .globl __secondary_boot_code_size 5799f3183d2SMingkai Hu .type __secondary_boot_code_size, %object 5809f3183d2SMingkai Hu /* Secondary Boot Code ends here */ 5819f3183d2SMingkai Hu__secondary_boot_code_size: 5829f3183d2SMingkai Hu .quad .-secondary_boot_code 5839f3183d2SMingkai Hu#endif 584