19f3183d2SMingkai Hu/* 29f3183d2SMingkai Hu * (C) Copyright 2014-2015 Freescale Semiconductor 39f3183d2SMingkai Hu * 49f3183d2SMingkai Hu * SPDX-License-Identifier: GPL-2.0+ 59f3183d2SMingkai Hu * 69f3183d2SMingkai Hu * Extracted from armv8/start.S 79f3183d2SMingkai Hu */ 89f3183d2SMingkai Hu 99f3183d2SMingkai Hu#include <config.h> 109f3183d2SMingkai Hu#include <linux/linkage.h> 119f3183d2SMingkai Hu#include <asm/gic.h> 129f3183d2SMingkai Hu#include <asm/macro.h> 13fa18ed76SWenbin Song#include <asm/arch-fsl-layerscape/soc.h> 149f3183d2SMingkai Hu#ifdef CONFIG_MP 159f3183d2SMingkai Hu#include <asm/arch/mp.h> 169f3183d2SMingkai Hu#endif 17f6a70b3aSPriyanka Jain#ifdef CONFIG_FSL_LSCH3 18f6a70b3aSPriyanka Jain#include <asm/arch-fsl-layerscape/immap_lsch3.h> 19f6a70b3aSPriyanka Jain#endif 20ec6617c3SAlison Wang#include <asm/u-boot.h> 219f3183d2SMingkai Hu 22fa18ed76SWenbin Song/* Get GIC offset 23fa18ed76SWenbin Song* For LS1043a rev1.0, GIC base address align with 4k. 24fa18ed76SWenbin Song* For LS1043a rev1.1, if DCFG_GIC400_ALIGN[GIC_ADDR_BIT] 25fa18ed76SWenbin Song* is set, GIC base address align with 4K, or else align 26fa18ed76SWenbin Song* with 64k. 27fa18ed76SWenbin Song* output: 28fa18ed76SWenbin Song* x0: the base address of GICD 29fa18ed76SWenbin Song* x1: the base address of GICC 30fa18ed76SWenbin Song*/ 31fa18ed76SWenbin SongENTRY(get_gic_offset) 32fa18ed76SWenbin Song ldr x0, =GICD_BASE 33fa18ed76SWenbin Song#ifdef CONFIG_GICV2 34fa18ed76SWenbin Song ldr x1, =GICC_BASE 35fa18ed76SWenbin Song#endif 36fa18ed76SWenbin Song#ifdef CONFIG_HAS_FEATURE_GIC64K_ALIGN 37fa18ed76SWenbin Song ldr x2, =DCFG_CCSR_SVR 38fa18ed76SWenbin Song ldr w2, [x2] 39fa18ed76SWenbin Song rev w2, w2 40*739cab17SWenbin song lsr w3, w2, #16 41*739cab17SWenbin song ldr w4, =SVR_DEV(SVR_LS1043A) 42fa18ed76SWenbin Song cmp w3, w4 43fa18ed76SWenbin Song b.ne 1f 44fa18ed76SWenbin Song ands w2, w2, #0xff 45fa18ed76SWenbin Song cmp w2, #REV1_0 46fa18ed76SWenbin Song b.eq 1f 47fa18ed76SWenbin Song ldr x2, =SCFG_GIC400_ALIGN 48fa18ed76SWenbin Song ldr w2, [x2] 49fa18ed76SWenbin Song rev w2, w2 50fa18ed76SWenbin Song tbnz w2, #GIC_ADDR_BIT, 1f 51fa18ed76SWenbin Song ldr x0, =GICD_BASE_64K 52fa18ed76SWenbin Song#ifdef CONFIG_GICV2 53fa18ed76SWenbin Song ldr x1, =GICC_BASE_64K 54fa18ed76SWenbin Song#endif 55fa18ed76SWenbin Song1: 56fa18ed76SWenbin Song#endif 57fa18ed76SWenbin Song ret 58fa18ed76SWenbin SongENDPROC(get_gic_offset) 59fa18ed76SWenbin Song 60fa18ed76SWenbin SongENTRY(smp_kick_all_cpus) 61fa18ed76SWenbin Song /* Kick secondary cpus up by SGI 0 interrupt */ 62fa18ed76SWenbin Song#if defined(CONFIG_GICV2) || defined(CONFIG_GICV3) 63fa18ed76SWenbin Song mov x29, lr /* Save LR */ 64fa18ed76SWenbin Song bl get_gic_offset 65fa18ed76SWenbin Song bl gic_kick_secondary_cpus 66fa18ed76SWenbin Song mov lr, x29 /* Restore LR */ 67fa18ed76SWenbin Song#endif 68fa18ed76SWenbin Song ret 69fa18ed76SWenbin SongENDPROC(smp_kick_all_cpus) 70fa18ed76SWenbin Song 71fa18ed76SWenbin Song 729f3183d2SMingkai HuENTRY(lowlevel_init) 739f3183d2SMingkai Hu mov x29, lr /* Save LR */ 749f3183d2SMingkai Hu 75399e2bb6SYork Sun switch_el x1, 1f, 100f, 100f /* skip if not in EL3 */ 76399e2bb6SYork Sun1: 77399e2bb6SYork Sun 789f3183d2SMingkai Hu#ifdef CONFIG_FSL_LSCH3 792b690b98SPrabhakar Kushwaha 802b690b98SPrabhakar Kushwaha /* Set Wuo bit for RN-I 20 */ 814a3ab193SYork Sun#ifdef CONFIG_ARCH_LS2080A 822b690b98SPrabhakar Kushwaha ldr x0, =CCI_AUX_CONTROL_BASE(20) 832b690b98SPrabhakar Kushwaha ldr x1, =0x00000010 842b690b98SPrabhakar Kushwaha bl ccn504_set_aux 85d037261fSPriyanka Jain 86d037261fSPriyanka Jain /* 87d037261fSPriyanka Jain * Set forced-order mode in RNI-6, RNI-20 88d037261fSPriyanka Jain * This is required for performance optimization on LS2088A 89d037261fSPriyanka Jain * LS2080A family does not support setting forced-order mode, 90d037261fSPriyanka Jain * so skip this operation for LS2080A family 91d037261fSPriyanka Jain */ 92d037261fSPriyanka Jain bl get_svr 93d037261fSPriyanka Jain lsr w0, w0, #16 94*739cab17SWenbin song ldr w1, =SVR_DEV(SVR_LS2080A) 95d037261fSPriyanka Jain cmp w0, w1 96d037261fSPriyanka Jain b.eq 1f 97d037261fSPriyanka Jain 98d037261fSPriyanka Jain ldr x0, =CCI_AUX_CONTROL_BASE(6) 99d037261fSPriyanka Jain ldr x1, =0x00000020 100d037261fSPriyanka Jain bl ccn504_set_aux 101d037261fSPriyanka Jain ldr x0, =CCI_AUX_CONTROL_BASE(20) 102d037261fSPriyanka Jain ldr x1, =0x00000020 103d037261fSPriyanka Jain bl ccn504_set_aux 104d037261fSPriyanka Jain1: 1052b690b98SPrabhakar Kushwaha#endif 1062b690b98SPrabhakar Kushwaha 1079f3183d2SMingkai Hu /* Add fully-coherent masters to DVM domain */ 1089f3183d2SMingkai Hu ldr x0, =CCI_MN_BASE 1099f3183d2SMingkai Hu ldr x1, =CCI_MN_RNF_NODEID_LIST 1109f3183d2SMingkai Hu ldr x2, =CCI_MN_DVM_DOMAIN_CTL_SET 1119f3183d2SMingkai Hu bl ccn504_add_masters_to_dvm 1129f3183d2SMingkai Hu 1139f3183d2SMingkai Hu /* Set all RN-I ports to QoS of 15 */ 1149f3183d2SMingkai Hu ldr x0, =CCI_S0_QOS_CONTROL_BASE(0) 1159f3183d2SMingkai Hu ldr x1, =0x00FF000C 1169f3183d2SMingkai Hu bl ccn504_set_qos 1179f3183d2SMingkai Hu ldr x0, =CCI_S1_QOS_CONTROL_BASE(0) 1189f3183d2SMingkai Hu ldr x1, =0x00FF000C 1199f3183d2SMingkai Hu bl ccn504_set_qos 1209f3183d2SMingkai Hu ldr x0, =CCI_S2_QOS_CONTROL_BASE(0) 1219f3183d2SMingkai Hu ldr x1, =0x00FF000C 1229f3183d2SMingkai Hu bl ccn504_set_qos 1239f3183d2SMingkai Hu 1249f3183d2SMingkai Hu ldr x0, =CCI_S0_QOS_CONTROL_BASE(2) 1259f3183d2SMingkai Hu ldr x1, =0x00FF000C 1269f3183d2SMingkai Hu bl ccn504_set_qos 1279f3183d2SMingkai Hu ldr x0, =CCI_S1_QOS_CONTROL_BASE(2) 1289f3183d2SMingkai Hu ldr x1, =0x00FF000C 1299f3183d2SMingkai Hu bl ccn504_set_qos 1309f3183d2SMingkai Hu ldr x0, =CCI_S2_QOS_CONTROL_BASE(2) 1319f3183d2SMingkai Hu ldr x1, =0x00FF000C 1329f3183d2SMingkai Hu bl ccn504_set_qos 1339f3183d2SMingkai Hu 1349f3183d2SMingkai Hu ldr x0, =CCI_S0_QOS_CONTROL_BASE(6) 1359f3183d2SMingkai Hu ldr x1, =0x00FF000C 1369f3183d2SMingkai Hu bl ccn504_set_qos 1379f3183d2SMingkai Hu ldr x0, =CCI_S1_QOS_CONTROL_BASE(6) 1389f3183d2SMingkai Hu ldr x1, =0x00FF000C 1399f3183d2SMingkai Hu bl ccn504_set_qos 1409f3183d2SMingkai Hu ldr x0, =CCI_S2_QOS_CONTROL_BASE(6) 1419f3183d2SMingkai Hu ldr x1, =0x00FF000C 1429f3183d2SMingkai Hu bl ccn504_set_qos 1439f3183d2SMingkai Hu 1449f3183d2SMingkai Hu ldr x0, =CCI_S0_QOS_CONTROL_BASE(12) 1459f3183d2SMingkai Hu ldr x1, =0x00FF000C 1469f3183d2SMingkai Hu bl ccn504_set_qos 1479f3183d2SMingkai Hu ldr x0, =CCI_S1_QOS_CONTROL_BASE(12) 1489f3183d2SMingkai Hu ldr x1, =0x00FF000C 1499f3183d2SMingkai Hu bl ccn504_set_qos 1509f3183d2SMingkai Hu ldr x0, =CCI_S2_QOS_CONTROL_BASE(12) 1519f3183d2SMingkai Hu ldr x1, =0x00FF000C 1529f3183d2SMingkai Hu bl ccn504_set_qos 1539f3183d2SMingkai Hu 1549f3183d2SMingkai Hu ldr x0, =CCI_S0_QOS_CONTROL_BASE(16) 1559f3183d2SMingkai Hu ldr x1, =0x00FF000C 1569f3183d2SMingkai Hu bl ccn504_set_qos 1579f3183d2SMingkai Hu ldr x0, =CCI_S1_QOS_CONTROL_BASE(16) 1589f3183d2SMingkai Hu ldr x1, =0x00FF000C 1599f3183d2SMingkai Hu bl ccn504_set_qos 1609f3183d2SMingkai Hu ldr x0, =CCI_S2_QOS_CONTROL_BASE(16) 1619f3183d2SMingkai Hu ldr x1, =0x00FF000C 1629f3183d2SMingkai Hu bl ccn504_set_qos 1639f3183d2SMingkai Hu 1649f3183d2SMingkai Hu ldr x0, =CCI_S0_QOS_CONTROL_BASE(20) 1659f3183d2SMingkai Hu ldr x1, =0x00FF000C 1669f3183d2SMingkai Hu bl ccn504_set_qos 1679f3183d2SMingkai Hu ldr x0, =CCI_S1_QOS_CONTROL_BASE(20) 1689f3183d2SMingkai Hu ldr x1, =0x00FF000C 1699f3183d2SMingkai Hu bl ccn504_set_qos 1709f3183d2SMingkai Hu ldr x0, =CCI_S2_QOS_CONTROL_BASE(20) 1719f3183d2SMingkai Hu ldr x1, =0x00FF000C 1729f3183d2SMingkai Hu bl ccn504_set_qos 1739f3183d2SMingkai Hu#endif 1749f3183d2SMingkai Hu 1751e49a231SPrabhakar Kushwaha#ifdef SMMU_BASE 1769f3183d2SMingkai Hu /* Set the SMMU page size in the sACR register */ 1779f3183d2SMingkai Hu ldr x1, =SMMU_BASE 1789f3183d2SMingkai Hu ldr w0, [x1, #0x10] 1799f3183d2SMingkai Hu orr w0, w0, #1 << 16 /* set sACR.pagesize to indicate 64K page */ 1809f3183d2SMingkai Hu str w0, [x1, #0x10] 1811e49a231SPrabhakar Kushwaha#endif 1829f3183d2SMingkai Hu 1839f3183d2SMingkai Hu /* Initialize GIC Secure Bank Status */ 1849f3183d2SMingkai Hu#if defined(CONFIG_GICV2) || defined(CONFIG_GICV3) 1859f3183d2SMingkai Hu branch_if_slave x0, 1f 186fa18ed76SWenbin Song bl get_gic_offset 1879f3183d2SMingkai Hu bl gic_init_secure 1889f3183d2SMingkai Hu1: 1899f3183d2SMingkai Hu#ifdef CONFIG_GICV3 1909f3183d2SMingkai Hu ldr x0, =GICR_BASE 1919f3183d2SMingkai Hu bl gic_init_secure_percpu 1929f3183d2SMingkai Hu#elif defined(CONFIG_GICV2) 193fa18ed76SWenbin Song bl get_gic_offset 1949f3183d2SMingkai Hu bl gic_init_secure_percpu 1959f3183d2SMingkai Hu#endif 1969f3183d2SMingkai Hu#endif 1979f3183d2SMingkai Hu 198399e2bb6SYork Sun100: 1999f3183d2SMingkai Hu branch_if_master x0, x1, 2f 2009f3183d2SMingkai Hu 2019f3183d2SMingkai Hu#if defined(CONFIG_MP) && defined(CONFIG_ARMV8_MULTIENTRY) 2029f3183d2SMingkai Hu ldr x0, =secondary_boot_func 2039f3183d2SMingkai Hu blr x0 2049f3183d2SMingkai Hu#endif 2059f3183d2SMingkai Hu 2069f3183d2SMingkai Hu2: 207399e2bb6SYork Sun switch_el x1, 1f, 100f, 100f /* skip if not in EL3 */ 208399e2bb6SYork Sun1: 2099f3183d2SMingkai Hu#ifdef CONFIG_FSL_TZPC_BP147 2109f3183d2SMingkai Hu /* Set Non Secure access for all devices protected via TZPC */ 2119f3183d2SMingkai Hu ldr x1, =TZPCDECPROT_0_SET_BASE /* Decode Protection-0 Set Reg */ 2129f3183d2SMingkai Hu orr w0, w0, #1 << 3 /* DCFG_RESET is accessible from NS world */ 2139f3183d2SMingkai Hu str w0, [x1] 2149f3183d2SMingkai Hu 2159f3183d2SMingkai Hu isb 2169f3183d2SMingkai Hu dsb sy 2179f3183d2SMingkai Hu#endif 2189f3183d2SMingkai Hu 2199f3183d2SMingkai Hu#ifdef CONFIG_FSL_TZASC_400 220d5df606dSPriyanka Jain /* 221d5df606dSPriyanka Jain * LS2080 and its personalities does not support TZASC 222d5df606dSPriyanka Jain * So skip TZASC related operations 223d5df606dSPriyanka Jain */ 224d5df606dSPriyanka Jain bl get_svr 225d5df606dSPriyanka Jain lsr w0, w0, #16 226*739cab17SWenbin song ldr w1, =SVR_DEV(SVR_LS2080A) 227d5df606dSPriyanka Jain cmp w0, w1 228d5df606dSPriyanka Jain b.eq 1f 229d5df606dSPriyanka Jain 2309f3183d2SMingkai Hu /* Set TZASC so that: 2319f3183d2SMingkai Hu * a. We use only Region0 whose global secure write/read is EN 2329f3183d2SMingkai Hu * b. We use only Region0 whose NSAID write/read is EN 2339f3183d2SMingkai Hu * 2349f3183d2SMingkai Hu * NOTE: As per the CCSR map doc, TZASC 3 and TZASC 4 are just 2359f3183d2SMingkai Hu * placeholders. 2369f3183d2SMingkai Hu */ 23785a9a14eSAshish kumar#ifdef CONFIG_FSL_TZASC_1 2389f3183d2SMingkai Hu ldr x1, =TZASC_GATE_KEEPER(0) 2397cfbb4abSPriyanka Jain ldr w0, [x1] /* Filter 0 Gate Keeper Register */ 2407cfbb4abSPriyanka Jain orr w0, w0, #1 << 0 /* Set open_request for Filter 0 */ 2417cfbb4abSPriyanka Jain str w0, [x1] 2429f3183d2SMingkai Hu 2439f3183d2SMingkai Hu ldr x1, =TZASC_REGION_ATTRIBUTES_0(0) 2447cfbb4abSPriyanka Jain ldr w0, [x1] /* Region-0 Attributes Register */ 2457cfbb4abSPriyanka Jain orr w0, w0, #1 << 31 /* Set Sec global write en, Bit[31] */ 2467cfbb4abSPriyanka Jain orr w0, w0, #1 << 30 /* Set Sec global read en, Bit[30] */ 2477cfbb4abSPriyanka Jain str w0, [x1] 2489f3183d2SMingkai Hu 24985a9a14eSAshish kumar ldr x1, =TZASC_REGION_ID_ACCESS_0(0) 25085a9a14eSAshish kumar ldr w0, [x1] /* Region-0 Access Register */ 25185a9a14eSAshish kumar mov w0, #0xFFFFFFFF /* Set nsaid_wr_en and nsaid_rd_en */ 25285a9a14eSAshish kumar str w0, [x1] 25385a9a14eSAshish kumar#endif 25485a9a14eSAshish kumar#ifdef CONFIG_FSL_TZASC_2 25585a9a14eSAshish kumar ldr x1, =TZASC_GATE_KEEPER(1) 25685a9a14eSAshish kumar ldr w0, [x1] /* Filter 0 Gate Keeper Register */ 25785a9a14eSAshish kumar orr w0, w0, #1 << 0 /* Set open_request for Filter 0 */ 25885a9a14eSAshish kumar str w0, [x1] 25985a9a14eSAshish kumar 2609f3183d2SMingkai Hu ldr x1, =TZASC_REGION_ATTRIBUTES_0(1) 2617cfbb4abSPriyanka Jain ldr w0, [x1] /* Region-1 Attributes Register */ 2627cfbb4abSPriyanka Jain orr w0, w0, #1 << 31 /* Set Sec global write en, Bit[31] */ 2637cfbb4abSPriyanka Jain orr w0, w0, #1 << 30 /* Set Sec global read en, Bit[30] */ 2647cfbb4abSPriyanka Jain str w0, [x1] 2659f3183d2SMingkai Hu 2669f3183d2SMingkai Hu ldr x1, =TZASC_REGION_ID_ACCESS_0(1) 2679f3183d2SMingkai Hu ldr w0, [x1] /* Region-1 Attributes Register */ 2689f3183d2SMingkai Hu mov w0, #0xFFFFFFFF /* Set nsaid_wr_en and nsaid_rd_en */ 2699f3183d2SMingkai Hu str w0, [x1] 27085a9a14eSAshish kumar#endif 2719f3183d2SMingkai Hu isb 2729f3183d2SMingkai Hu dsb sy 2739f3183d2SMingkai Hu#endif 274399e2bb6SYork Sun100: 275d5df606dSPriyanka Jain1: 276da28e58aSYork Sun#ifdef CONFIG_ARCH_LS1046A 277399e2bb6SYork Sun switch_el x1, 1f, 100f, 100f /* skip if not in EL3 */ 278399e2bb6SYork Sun1: 27913f79880SMingkai Hu /* Initialize the L2 RAM latency */ 28013f79880SMingkai Hu mrs x1, S3_1_c11_c0_2 28113f79880SMingkai Hu mov x0, #0x1C7 28213f79880SMingkai Hu /* Clear L2 Tag RAM latency and L2 Data RAM latency */ 28313f79880SMingkai Hu bic x1, x1, x0 28413f79880SMingkai Hu /* Set L2 data ram latency bits [2:0] */ 28513f79880SMingkai Hu orr x1, x1, #0x2 28613f79880SMingkai Hu /* set L2 tag ram latency bits [8:6] */ 28713f79880SMingkai Hu orr x1, x1, #0x80 28813f79880SMingkai Hu msr S3_1_c11_c0_2, x1 28913f79880SMingkai Hu isb 290399e2bb6SYork Sun100: 29113f79880SMingkai Hu#endif 29213f79880SMingkai Hu 2933b6bf811SHou Zhiqiang#if defined(CONFIG_FSL_LSCH2) && !defined(CONFIG_SPL_BUILD) 2943b6bf811SHou Zhiqiang bl fsl_ocram_init 2953b6bf811SHou Zhiqiang#endif 2963b6bf811SHou Zhiqiang 2979f3183d2SMingkai Hu mov lr, x29 /* Restore LR */ 2989f3183d2SMingkai Hu ret 2999f3183d2SMingkai HuENDPROC(lowlevel_init) 3009f3183d2SMingkai Hu 3013b6bf811SHou Zhiqiang#if defined(CONFIG_FSL_LSCH2) && !defined(CONFIG_SPL_BUILD) 3023b6bf811SHou ZhiqiangENTRY(fsl_ocram_init) 3033b6bf811SHou Zhiqiang mov x28, lr /* Save LR */ 3043b6bf811SHou Zhiqiang bl fsl_clear_ocram 3053b6bf811SHou Zhiqiang bl fsl_ocram_clear_ecc_err 3063b6bf811SHou Zhiqiang mov lr, x28 /* Restore LR */ 3073b6bf811SHou Zhiqiang ret 3083b6bf811SHou ZhiqiangENDPROC(fsl_ocram_init) 3093b6bf811SHou Zhiqiang 3103b6bf811SHou ZhiqiangENTRY(fsl_clear_ocram) 3113b6bf811SHou Zhiqiang/* Clear OCRAM */ 3123b6bf811SHou Zhiqiang ldr x0, =CONFIG_SYS_FSL_OCRAM_BASE 3133b6bf811SHou Zhiqiang ldr x1, =(CONFIG_SYS_FSL_OCRAM_BASE + CONFIG_SYS_FSL_OCRAM_SIZE) 3143b6bf811SHou Zhiqiang mov x2, #0 3153b6bf811SHou Zhiqiangclear_loop: 3163b6bf811SHou Zhiqiang str x2, [x0] 3173b6bf811SHou Zhiqiang add x0, x0, #8 3183b6bf811SHou Zhiqiang cmp x0, x1 3193b6bf811SHou Zhiqiang b.lo clear_loop 3203b6bf811SHou Zhiqiang ret 3213b6bf811SHou ZhiqiangENDPROC(fsl_clear_ocram) 3223b6bf811SHou Zhiqiang 3233b6bf811SHou ZhiqiangENTRY(fsl_ocram_clear_ecc_err) 3243b6bf811SHou Zhiqiang /* OCRAM1/2 ECC status bit */ 3253b6bf811SHou Zhiqiang mov w1, #0x60 3263b6bf811SHou Zhiqiang ldr x0, =DCSR_DCFG_SBEESR2 3273b6bf811SHou Zhiqiang str w1, [x0] 3283b6bf811SHou Zhiqiang ldr x0, =DCSR_DCFG_MBEESR2 3293b6bf811SHou Zhiqiang str w1, [x0] 3303b6bf811SHou Zhiqiang ret 3313b6bf811SHou ZhiqiangENDPROC(fsl_ocram_init) 3323b6bf811SHou Zhiqiang#endif 3333b6bf811SHou Zhiqiang 334b7f2bbffSPrabhakar Kushwaha#ifdef CONFIG_FSL_LSCH3 335f6a70b3aSPriyanka Jain .globl get_svr 336f6a70b3aSPriyanka Jainget_svr: 337f6a70b3aSPriyanka Jain ldr x1, =FSL_LSCH3_SVR 338f6a70b3aSPriyanka Jain ldr w0, [x1] 339f6a70b3aSPriyanka Jain ret 340f6a70b3aSPriyanka Jain 3419f3183d2SMingkai Huhnf_pstate_poll: 3429f3183d2SMingkai Hu /* x0 has the desired status, return 0 for success, 1 for timeout 3439f3183d2SMingkai Hu * clobber x1, x2, x3, x4, x6, x7 3449f3183d2SMingkai Hu */ 3459f3183d2SMingkai Hu mov x1, x0 3469f3183d2SMingkai Hu mov x7, #0 /* flag for timeout */ 3479f3183d2SMingkai Hu mrs x3, cntpct_el0 /* read timer */ 3489f3183d2SMingkai Hu add x3, x3, #1200 /* timeout after 100 microseconds */ 3499f3183d2SMingkai Hu mov x0, #0x18 3509f3183d2SMingkai Hu movk x0, #0x420, lsl #16 /* HNF0_PSTATE_STATUS */ 3519f3183d2SMingkai Hu mov w6, #8 /* HN-F node count */ 3529f3183d2SMingkai Hu1: 3539f3183d2SMingkai Hu ldr x2, [x0] 3549f3183d2SMingkai Hu cmp x2, x1 /* check status */ 3559f3183d2SMingkai Hu b.eq 2f 3569f3183d2SMingkai Hu mrs x4, cntpct_el0 3579f3183d2SMingkai Hu cmp x4, x3 3589f3183d2SMingkai Hu b.ls 1b 3599f3183d2SMingkai Hu mov x7, #1 /* timeout */ 3609f3183d2SMingkai Hu b 3f 3619f3183d2SMingkai Hu2: 3629f3183d2SMingkai Hu add x0, x0, #0x10000 /* move to next node */ 3639f3183d2SMingkai Hu subs w6, w6, #1 3649f3183d2SMingkai Hu cbnz w6, 1b 3659f3183d2SMingkai Hu3: 3669f3183d2SMingkai Hu mov x0, x7 3679f3183d2SMingkai Hu ret 3689f3183d2SMingkai Hu 3699f3183d2SMingkai Huhnf_set_pstate: 3709f3183d2SMingkai Hu /* x0 has the desired state, clobber x1, x2, x6 */ 3719f3183d2SMingkai Hu mov x1, x0 3729f3183d2SMingkai Hu /* power state to SFONLY */ 3739f3183d2SMingkai Hu mov w6, #8 /* HN-F node count */ 3749f3183d2SMingkai Hu mov x0, #0x10 3759f3183d2SMingkai Hu movk x0, #0x420, lsl #16 /* HNF0_PSTATE_REQ */ 3769f3183d2SMingkai Hu1: /* set pstate to sfonly */ 3779f3183d2SMingkai Hu ldr x2, [x0] 3789f3183d2SMingkai Hu and x2, x2, #0xfffffffffffffffc /* & HNFPSTAT_MASK */ 3799f3183d2SMingkai Hu orr x2, x2, x1 3809f3183d2SMingkai Hu str x2, [x0] 3819f3183d2SMingkai Hu add x0, x0, #0x10000 /* move to next node */ 3829f3183d2SMingkai Hu subs w6, w6, #1 3839f3183d2SMingkai Hu cbnz w6, 1b 3849f3183d2SMingkai Hu 3859f3183d2SMingkai Hu ret 3869f3183d2SMingkai Hu 3871ab557a0SStephen WarrenENTRY(__asm_flush_l3_dcache) 3889f3183d2SMingkai Hu /* 3899f3183d2SMingkai Hu * Return status in x0 3909f3183d2SMingkai Hu * success 0 391399e2bb6SYork Sun * timeout 1 for setting SFONLY, 2 for FAM, 3 for both 3929f3183d2SMingkai Hu */ 3939f3183d2SMingkai Hu mov x29, lr 3949f3183d2SMingkai Hu mov x8, #0 3959f3183d2SMingkai Hu 396399e2bb6SYork Sun switch_el x0, 1f, 100f, 100f /* skip if not in EL3 */ 397399e2bb6SYork Sun 398399e2bb6SYork Sun1: 3999f3183d2SMingkai Hu dsb sy 4009f3183d2SMingkai Hu mov x0, #0x1 /* HNFPSTAT_SFONLY */ 4019f3183d2SMingkai Hu bl hnf_set_pstate 4029f3183d2SMingkai Hu 4039f3183d2SMingkai Hu mov x0, #0x4 /* SFONLY status */ 4049f3183d2SMingkai Hu bl hnf_pstate_poll 4059f3183d2SMingkai Hu cbz x0, 1f 4069f3183d2SMingkai Hu mov x8, #1 /* timeout */ 4079f3183d2SMingkai Hu1: 4089f3183d2SMingkai Hu dsb sy 4099f3183d2SMingkai Hu mov x0, #0x3 /* HNFPSTAT_FAM */ 4109f3183d2SMingkai Hu bl hnf_set_pstate 4119f3183d2SMingkai Hu 4129f3183d2SMingkai Hu mov x0, #0xc /* FAM status */ 4139f3183d2SMingkai Hu bl hnf_pstate_poll 4149f3183d2SMingkai Hu cbz x0, 1f 4159f3183d2SMingkai Hu add x8, x8, #0x2 416399e2bb6SYork Sun100: 4179f3183d2SMingkai Hu1: 4189f3183d2SMingkai Hu mov x0, x8 4199f3183d2SMingkai Hu mov lr, x29 4209f3183d2SMingkai Hu ret 4211ab557a0SStephen WarrenENDPROC(__asm_flush_l3_dcache) 422b7f2bbffSPrabhakar Kushwaha#endif 4239f3183d2SMingkai Hu 4249f3183d2SMingkai Hu#ifdef CONFIG_MP 4259f3183d2SMingkai Hu /* Keep literals not used by the secondary boot code outside it */ 4269f3183d2SMingkai Hu .ltorg 4279f3183d2SMingkai Hu 4289f3183d2SMingkai Hu /* Using 64 bit alignment since the spin table is accessed as data */ 4299f3183d2SMingkai Hu .align 4 4309f3183d2SMingkai Hu .global secondary_boot_code 4319f3183d2SMingkai Hu /* Secondary Boot Code starts here */ 4329f3183d2SMingkai Husecondary_boot_code: 4339f3183d2SMingkai Hu .global __spin_table 4349f3183d2SMingkai Hu__spin_table: 4359f3183d2SMingkai Hu .space CONFIG_MAX_CPUS*SPIN_TABLE_ELEM_SIZE 4369f3183d2SMingkai Hu 4379f3183d2SMingkai Hu .align 2 4389f3183d2SMingkai HuENTRY(secondary_boot_func) 4399f3183d2SMingkai Hu /* 4409f3183d2SMingkai Hu * MPIDR_EL1 Fields: 4419f3183d2SMingkai Hu * MPIDR[1:0] = AFF0_CPUID <- Core ID (0,1) 4429f3183d2SMingkai Hu * MPIDR[7:2] = AFF0_RES 4439f3183d2SMingkai Hu * MPIDR[15:8] = AFF1_CLUSTERID <- Cluster ID (0,1,2,3) 4449f3183d2SMingkai Hu * MPIDR[23:16] = AFF2_CLUSTERID 4459f3183d2SMingkai Hu * MPIDR[24] = MT 4469f3183d2SMingkai Hu * MPIDR[29:25] = RES0 4479f3183d2SMingkai Hu * MPIDR[30] = U 4489f3183d2SMingkai Hu * MPIDR[31] = ME 4499f3183d2SMingkai Hu * MPIDR[39:32] = AFF3 4509f3183d2SMingkai Hu * 4519f3183d2SMingkai Hu * Linear Processor ID (LPID) calculation from MPIDR_EL1: 4529f3183d2SMingkai Hu * (We only use AFF0_CPUID and AFF1_CLUSTERID for now 4539f3183d2SMingkai Hu * until AFF2_CLUSTERID and AFF3 have non-zero values) 4549f3183d2SMingkai Hu * 4559f3183d2SMingkai Hu * LPID = MPIDR[15:8] | MPIDR[1:0] 4569f3183d2SMingkai Hu */ 4579f3183d2SMingkai Hu mrs x0, mpidr_el1 4589f3183d2SMingkai Hu ubfm x1, x0, #8, #15 4599f3183d2SMingkai Hu ubfm x2, x0, #0, #1 4609f3183d2SMingkai Hu orr x10, x2, x1, lsl #2 /* x10 has LPID */ 4619f3183d2SMingkai Hu ubfm x9, x0, #0, #15 /* x9 contains MPIDR[15:0] */ 4629f3183d2SMingkai Hu /* 4639f3183d2SMingkai Hu * offset of the spin table element for this core from start of spin 4649f3183d2SMingkai Hu * table (each elem is padded to 64 bytes) 4659f3183d2SMingkai Hu */ 4669f3183d2SMingkai Hu lsl x1, x10, #6 4679f3183d2SMingkai Hu ldr x0, =__spin_table 4689f3183d2SMingkai Hu /* physical address of this cpus spin table element */ 4699f3183d2SMingkai Hu add x11, x1, x0 4709f3183d2SMingkai Hu 4719f3183d2SMingkai Hu ldr x0, =__real_cntfrq 4729f3183d2SMingkai Hu ldr x0, [x0] 4739f3183d2SMingkai Hu msr cntfrq_el0, x0 /* set with real frequency */ 4749f3183d2SMingkai Hu str x9, [x11, #16] /* LPID */ 4759f3183d2SMingkai Hu mov x4, #1 4769f3183d2SMingkai Hu str x4, [x11, #8] /* STATUS */ 4779f3183d2SMingkai Hu dsb sy 4789f3183d2SMingkai Hu#if defined(CONFIG_GICV3) 4799f3183d2SMingkai Hu gic_wait_for_interrupt_m x0 4809f3183d2SMingkai Hu#elif defined(CONFIG_GICV2) 481fa18ed76SWenbin Song bl get_gic_offset 482fa18ed76SWenbin Song mov x0, x1 4839f3183d2SMingkai Hu gic_wait_for_interrupt_m x0, w1 4849f3183d2SMingkai Hu#endif 4859f3183d2SMingkai Hu 4869f3183d2SMingkai Huslave_cpu: 4879f3183d2SMingkai Hu wfe 4889f3183d2SMingkai Hu ldr x0, [x11] 4899f3183d2SMingkai Hu cbz x0, slave_cpu 4909f3183d2SMingkai Hu#ifndef CONFIG_ARMV8_SWITCH_TO_EL1 4919f3183d2SMingkai Hu mrs x1, sctlr_el2 4929f3183d2SMingkai Hu#else 4939f3183d2SMingkai Hu mrs x1, sctlr_el1 4949f3183d2SMingkai Hu#endif 4959f3183d2SMingkai Hu tbz x1, #25, cpu_is_le 4969f3183d2SMingkai Hu rev x0, x0 /* BE to LE conversion */ 4979f3183d2SMingkai Hucpu_is_le: 498ec6617c3SAlison Wang ldr x5, [x11, #24] 499020b3ce8SAlison Wang cbz x5, 1f 500ec6617c3SAlison Wang 501ec6617c3SAlison Wang#ifdef CONFIG_ARMV8_SWITCH_TO_EL1 5027c5e1febSAlison Wang adr x4, secondary_switch_to_el1 5037c5e1febSAlison Wang ldr x5, =ES_TO_AARCH64 504ec6617c3SAlison Wang#else 5057c5e1febSAlison Wang ldr x4, [x11] 5067c5e1febSAlison Wang ldr x5, =ES_TO_AARCH32 507ec6617c3SAlison Wang#endif 508ec6617c3SAlison Wang bl secondary_switch_to_el2 509ec6617c3SAlison Wang 510ec6617c3SAlison Wang1: 511ec6617c3SAlison Wang#ifdef CONFIG_ARMV8_SWITCH_TO_EL1 5127c5e1febSAlison Wang adr x4, secondary_switch_to_el1 513ec6617c3SAlison Wang#else 5147c5e1febSAlison Wang ldr x4, [x11] 515ec6617c3SAlison Wang#endif 5167c5e1febSAlison Wang ldr x5, =ES_TO_AARCH64 517ec6617c3SAlison Wang bl secondary_switch_to_el2 518ec6617c3SAlison Wang 5199f3183d2SMingkai HuENDPROC(secondary_boot_func) 5209f3183d2SMingkai Hu 5219f3183d2SMingkai HuENTRY(secondary_switch_to_el2) 5227c5e1febSAlison Wang switch_el x6, 1f, 0f, 0f 5239f3183d2SMingkai Hu0: ret 5247c5e1febSAlison Wang1: armv8_switch_to_el2_m x4, x5, x6 5259f3183d2SMingkai HuENDPROC(secondary_switch_to_el2) 5269f3183d2SMingkai Hu 5279f3183d2SMingkai HuENTRY(secondary_switch_to_el1) 528ec6617c3SAlison Wang mrs x0, mpidr_el1 529ec6617c3SAlison Wang ubfm x1, x0, #8, #15 530ec6617c3SAlison Wang ubfm x2, x0, #0, #1 531ec6617c3SAlison Wang orr x10, x2, x1, lsl #2 /* x10 has LPID */ 532ec6617c3SAlison Wang 533ec6617c3SAlison Wang lsl x1, x10, #6 534ec6617c3SAlison Wang ldr x0, =__spin_table 535ec6617c3SAlison Wang /* physical address of this cpus spin table element */ 536ec6617c3SAlison Wang add x11, x1, x0 537ec6617c3SAlison Wang 5387c5e1febSAlison Wang ldr x4, [x11] 539ec6617c3SAlison Wang 540ec6617c3SAlison Wang ldr x5, [x11, #24] 541020b3ce8SAlison Wang cbz x5, 2f 542ec6617c3SAlison Wang 5437c5e1febSAlison Wang ldr x5, =ES_TO_AARCH32 544ec6617c3SAlison Wang bl switch_to_el1 545ec6617c3SAlison Wang 5467c5e1febSAlison Wang2: ldr x5, =ES_TO_AARCH64 547ec6617c3SAlison Wang 548ec6617c3SAlison Wangswitch_to_el1: 5497c5e1febSAlison Wang switch_el x6, 0f, 1f, 0f 5509f3183d2SMingkai Hu0: ret 5517c5e1febSAlison Wang1: armv8_switch_to_el1_m x4, x5, x6 5529f3183d2SMingkai HuENDPROC(secondary_switch_to_el1) 5539f3183d2SMingkai Hu 5549f3183d2SMingkai Hu /* Ensure that the literals used by the secondary boot code are 5559f3183d2SMingkai Hu * assembled within it (this is required so that we can protect 5569f3183d2SMingkai Hu * this area with a single memreserve region 5579f3183d2SMingkai Hu */ 5589f3183d2SMingkai Hu .ltorg 5599f3183d2SMingkai Hu 5609f3183d2SMingkai Hu /* 64 bit alignment for elements accessed as data */ 5619f3183d2SMingkai Hu .align 4 5629f3183d2SMingkai Hu .global __real_cntfrq 5639f3183d2SMingkai Hu__real_cntfrq: 5649f3183d2SMingkai Hu .quad COUNTER_FREQUENCY 5659f3183d2SMingkai Hu .globl __secondary_boot_code_size 5669f3183d2SMingkai Hu .type __secondary_boot_code_size, %object 5679f3183d2SMingkai Hu /* Secondary Boot Code ends here */ 5689f3183d2SMingkai Hu__secondary_boot_code_size: 5699f3183d2SMingkai Hu .quad .-secondary_boot_code 5709f3183d2SMingkai Hu#endif 571