1 /* 2 * Copyright (c) 2012-2015 Apple Inc. All rights reserved. 3 */ 4 5 #ifndef _PEXPERT_ARM64_COMMON_H 6 #define _PEXPERT_ARM64_COMMON_H 7 8 /* This block of definitions is misplaced to shelter it from lines that will be 9 * removed in rdar://56937184. These definitions must be moved back after that 10 * change has been merged. */ 11 #ifdef APPLE_ARM64_ARCH_FAMILY 12 #endif 13 14 #ifdef ASSEMBLER 15 #define __MSR_STR(x) x 16 #else 17 #define __MSR_STR1(x) #x 18 #define __MSR_STR(x) __MSR_STR1(x) 19 #endif 20 21 #ifdef APPLE_ARM64_ARCH_FAMILY 22 23 24 25 #if defined(APPLETYPHOON) || defined(APPLETWISTER) 26 #define ARM64_REG_CYC_CFG_skipInit (1ULL<<30) 27 #define ARM64_REG_CYC_CFG_deepSleep (1ULL<<24) 28 #else /* defined(APPLECYCLONE) || defined(APPLETYPHOON) || defined(APPLETWISTER) */ 29 #define ARM64_REG_ACC_OVRD_enDeepSleep (1ULL << 34) 30 #define ARM64_REG_ACC_OVRD_disPioOnWfiCpu (1ULL << 32) 31 #define ARM64_REG_ACC_OVRD_dsblClkDtr (1ULL << 29) 32 #define ARM64_REG_ACC_OVRD_cpmWakeUp_mask (3ULL << 27) 33 #define ARM64_REG_ACC_OVRD_cpmWakeUp_force (3ULL << 27) 34 #define ARM64_REG_ACC_OVRD_ok2PwrDnCPM_mask (3ULL << 25) 35 #define ARM64_REG_ACC_OVRD_ok2PwrDnCPM_deny (2ULL << 25) 36 #define ARM64_REG_ACC_OVRD_ok2PwrDnCPM_deepsleep (3ULL << 25) 37 #define ARM64_REG_ACC_OVRD_ok2TrDnLnk_mask (3ULL << 17) 38 #define ARM64_REG_ACC_OVRD_ok2TrDnLnk_deepsleep (3ULL << 17) 39 #define ARM64_REG_ACC_OVRD_disL2Flush4AccSlp_mask (3ULL << 15) 40 #define ARM64_REG_ACC_OVRD_disL2Flush4AccSlp_deepsleep (2ULL << 15) 41 #define ARM64_REG_ACC_OVRD_ok2PwrDnSRM_mask (3ULL << 13) 42 #define ARM64_REG_ACC_OVRD_ok2PwrDnSRM_deepsleep (3ULL << 13) 43 #endif /* defined(APPLECYCLONE) || defined(APPLETYPHOON) || defined(APPLETWISTER) */ 44 45 #define ARM64_REG_CYC_OVRD_irq_mask (3<<22) 46 #define ARM64_REG_CYC_OVRD_irq_disable (2<<22) 47 #define ARM64_REG_CYC_OVRD_fiq_mask (3<<20) 48 #define ARM64_REG_CYC_OVRD_fiq_disable (2<<20) 49 #define ARM64_REG_CYC_OVRD_ok2pwrdn_force_up (2<<24) 50 #define ARM64_REG_CYC_OVRD_ok2pwrdn_force_down (3<<24) 51 #define ARM64_REG_CYC_OVRD_disWfiRetn (1<<0) 52 53 #if defined(APPLEMONSOON) 54 #define ARM64_REG_CYC_OVRD_dsblSnoopTime_mask (3ULL << 30) 55 #define ARM64_REG_CYC_OVRD_dsblSnoopPTime (1ULL << 31) /// Don't fetch the timebase from the P-block 56 #endif /* APPLEMONSOON */ 57 58 #define ARM64_REG_LSU_ERR_STS_L1DTlbMultiHitEN (1ULL<<54) 59 #define ARM64_REG_LSU_ERR_CTL_L1DTlbMultiHitEN (1ULL<<3) 60 61 62 #if defined(HAS_IPI) 63 #define ARM64_REG_IPI_RR_TYPE_IMMEDIATE (0 << 28) 64 #define ARM64_REG_IPI_RR_TYPE_RETRACT (1 << 28) 65 #define ARM64_REG_IPI_RR_TYPE_DEFERRED (2 << 28) 66 #define ARM64_REG_IPI_RR_TYPE_NOWAKE (3 << 28) 67 #endif /* defined(HAS_IPI) */ 68 69 70 71 #endif /* APPLE_ARM64_ARCH_FAMILY */ 72 73 74 #if defined(HAS_BP_RET) 75 #define ARM64_REG_ACC_CFG_bdpSlpEn (1ULL << 2) 76 #define ARM64_REG_ACC_CFG_btpSlpEn (1ULL << 3) 77 #define ARM64_REG_ACC_CFG_bpSlp_mask 3 78 #define ARM64_REG_ACC_CFG_bpSlp_shift 2 79 #endif /* defined(HAS_BP_RET) */ 80 81 82 83 #define MPIDR_PNE_SHIFT 16 // pcore not ecore 84 #define MPIDR_PNE (1 << MPIDR_PNE_SHIFT) 85 86 87 #define CPU_PIO_CPU_STS_OFFSET (0x100ULL) 88 #define CPU_PIO_CPU_STS_cpuRunSt_mask (0xff) 89 90 91 92 #ifdef ASSEMBLER 93 94 /* 95 * arg0: register in which to store result 96 * 0=>not a p-core, non-zero=>p-core 97 */ 98 .macro ARM64_IS_PCORE 99 #if defined(APPLEMONSOON) || HAS_CLUSTER 100 mrs $0, MPIDR_EL1 101 and $0, $0, #(MPIDR_PNE) 102 #endif /* defined(APPLEMONSOON) || HAS_CLUSTER */ 103 .endmacro 104 105 /* 106 * reads a special purpose register, using a different msr for e- vs. p-cores 107 * arg0: register indicating the current core type, see ARM64_IS_PCORE 108 * arg1: register in which to store the result of the read 109 * arg2: SPR to use for e-core 110 * arg3: SPR to use for p-core or non-AMP architecture 111 */ 112 .macro ARM64_READ_EP_SPR 113 #if defined(APPLEMONSOON) || HAS_CLUSTER 114 cbnz $0, 1f 115 // e-core 116 mrs $1, $2 117 b 2f 118 // p-core 119 1: 120 #endif /* defined(APPLEMONSOON) || HAS_CLUSTER */ 121 mrs $1, $3 122 2: 123 .endmacro 124 125 /* 126 * writes a special purpose register, using a different msr for e- vs. p-cores 127 * arg0: register indicating the current core type, see ARM64_IS_PCORE 128 * arg1: register containing the value to write 129 * arg2: SPR to use for e-core 130 * arg3: SPR to use for p-core or non-AMP architecture 131 */ 132 .macro ARM64_WRITE_EP_SPR 133 #if defined(APPLEMONSOON) || HAS_CLUSTER 134 cbnz $0, 1f 135 // e-core 136 msr $2, $1 137 b 2f 138 // p-core 139 1: 140 #endif /* defined(APPLEMONSOON) || HAS_CLUSTER */ 141 msr $3, $1 142 2: 143 .endmacro 144 145 #endif /* ASSEMBLER */ 146 147 #endif /* ! _PEXPERT_ARM_ARM64_H */ 148