blob: bf98fcf648b6c3599513bfa47406379b1b33b43a [file] [log] [blame]
Varun Wadekar921b9062015-08-25 17:03:14 +05301/*
Varun Wadekar59c3aa02015-09-09 11:33:08 +05302 * Copyright (c) 2015-2016, ARM Limited and Contributors. All rights reserved.
Varun Wadekar921b9062015-08-25 17:03:14 +05303 *
dp-armfa3cf0b2017-05-03 09:38:09 +01004 * SPDX-License-Identifier: BSD-3-Clause
Varun Wadekar921b9062015-08-25 17:03:14 +05305 */
6
Antonio Nino Diaze0f90632018-12-14 00:18:21 +00007#include <assert.h>
8#include <errno.h>
9
Varun Wadekar921b9062015-08-25 17:03:14 +053010#include <arch.h>
11#include <arch_helpers.h>
Antonio Nino Diaze0f90632018-12-14 00:18:21 +000012#include <common/bl_common.h>
13#include <common/debug.h>
14#include <common/runtime_svc.h>
Varun Wadekard64db962016-09-23 14:28:16 -070015#include <denver.h>
Antonio Nino Diaze0f90632018-12-14 00:18:21 +000016#include <lib/el3_runtime/context_mgmt.h>
17
Varun Wadekar59c3aa02015-09-09 11:33:08 +053018#include <mce.h>
Varun Wadekara7c1ea72016-02-03 09:51:25 -080019#include <memctrl.h>
Varun Wadekar59c3aa02015-09-09 11:33:08 +053020#include <t18x_ari.h>
Varun Wadekar921b9062015-08-25 17:03:14 +053021#include <tegra_private.h>
22
Varun Wadekard66ee542016-02-29 10:24:30 -080023extern uint32_t tegra186_system_powerdn_state;
24
Varun Wadekar921b9062015-08-25 17:03:14 +053025/*******************************************************************************
Varun Wadekard64db962016-09-23 14:28:16 -070026 * Offset to read the ref_clk counter value
27 ******************************************************************************/
28#define REF_CLK_OFFSET 4
29
30/*******************************************************************************
Varun Wadekar921b9062015-08-25 17:03:14 +053031 * Tegra186 SiP SMCs
32 ******************************************************************************/
Varun Wadekar14f39572017-04-17 11:54:33 -070033#define TEGRA_SIP_SYSTEM_SHUTDOWN_STATE 0xC2FFFE01
34#define TEGRA_SIP_GET_ACTMON_CLK_COUNTERS 0xC2FFFE02
35#define TEGRA_SIP_MCE_CMD_ENTER_CSTATE 0xC2FFFF00
36#define TEGRA_SIP_MCE_CMD_UPDATE_CSTATE_INFO 0xC2FFFF01
37#define TEGRA_SIP_MCE_CMD_UPDATE_CROSSOVER_TIME 0xC2FFFF02
38#define TEGRA_SIP_MCE_CMD_READ_CSTATE_STATS 0xC2FFFF03
39#define TEGRA_SIP_MCE_CMD_WRITE_CSTATE_STATS 0xC2FFFF04
40#define TEGRA_SIP_MCE_CMD_IS_SC7_ALLOWED 0xC2FFFF05
41#define TEGRA_SIP_MCE_CMD_ONLINE_CORE 0xC2FFFF06
42#define TEGRA_SIP_MCE_CMD_CC3_CTRL 0xC2FFFF07
43#define TEGRA_SIP_MCE_CMD_ECHO_DATA 0xC2FFFF08
44#define TEGRA_SIP_MCE_CMD_READ_VERSIONS 0xC2FFFF09
45#define TEGRA_SIP_MCE_CMD_ENUM_FEATURES 0xC2FFFF0A
46#define TEGRA_SIP_MCE_CMD_ROC_FLUSH_CACHE_TRBITS 0xC2FFFF0B
47#define TEGRA_SIP_MCE_CMD_ENUM_READ_MCA 0xC2FFFF0C
48#define TEGRA_SIP_MCE_CMD_ENUM_WRITE_MCA 0xC2FFFF0D
49#define TEGRA_SIP_MCE_CMD_ROC_FLUSH_CACHE 0xC2FFFF0E
50#define TEGRA_SIP_MCE_CMD_ROC_CLEAN_CACHE 0xC2FFFF0F
51#define TEGRA_SIP_MCE_CMD_ENABLE_LATIC 0xC2FFFF10
52#define TEGRA_SIP_MCE_CMD_UNCORE_PERFMON_REQ 0xC2FFFF11
53#define TEGRA_SIP_MCE_CMD_MISC_CCPLEX 0xC2FFFF12
Varun Wadekar921b9062015-08-25 17:03:14 +053054
55/*******************************************************************************
Varun Wadekar59c3aa02015-09-09 11:33:08 +053056 * This function is responsible for handling all T186 SiP calls
Varun Wadekar921b9062015-08-25 17:03:14 +053057 ******************************************************************************/
Varun Wadekar59c3aa02015-09-09 11:33:08 +053058int plat_sip_handler(uint32_t smc_fid,
59 uint64_t x1,
60 uint64_t x2,
61 uint64_t x3,
62 uint64_t x4,
63 void *cookie,
64 void *handle,
65 uint64_t flags)
Varun Wadekar921b9062015-08-25 17:03:14 +053066{
Varun Wadekar59c3aa02015-09-09 11:33:08 +053067 int mce_ret;
Varun Wadekard64db962016-09-23 14:28:16 -070068 int impl, cpu;
69 uint32_t base, core_clk_ctr, ref_clk_ctr;
Varun Wadekar921b9062015-08-25 17:03:14 +053070
Varun Wadekar14f39572017-04-17 11:54:33 -070071 if (((smc_fid >> FUNCID_CC_SHIFT) & FUNCID_CC_MASK) == SMC_32) {
72 /* 32-bit function, clear top parameter bits */
73
74 x1 = (uint32_t)x1;
75 x2 = (uint32_t)x2;
76 x3 = (uint32_t)x3;
77 }
Varun Wadekar921b9062015-08-25 17:03:14 +053078
Varun Wadekar59c3aa02015-09-09 11:33:08 +053079 /*
Varun Wadekar14f39572017-04-17 11:54:33 -070080 * Convert SMC FID to SMC64, to support SMC32/SMC64 configurations
81 */
82 smc_fid |= (SMC_64 << FUNCID_CC_SHIFT);
83
84 switch (smc_fid) {
85 /*
Varun Wadekar59c3aa02015-09-09 11:33:08 +053086 * Micro Coded Engine (MCE) commands reside in the 0x82FFFF00 -
87 * 0x82FFFFFF SiP SMC space
88 */
89 case TEGRA_SIP_MCE_CMD_ENTER_CSTATE:
90 case TEGRA_SIP_MCE_CMD_UPDATE_CSTATE_INFO:
91 case TEGRA_SIP_MCE_CMD_UPDATE_CROSSOVER_TIME:
92 case TEGRA_SIP_MCE_CMD_READ_CSTATE_STATS:
93 case TEGRA_SIP_MCE_CMD_WRITE_CSTATE_STATS:
94 case TEGRA_SIP_MCE_CMD_IS_SC7_ALLOWED:
95 case TEGRA_SIP_MCE_CMD_CC3_CTRL:
96 case TEGRA_SIP_MCE_CMD_ECHO_DATA:
97 case TEGRA_SIP_MCE_CMD_READ_VERSIONS:
98 case TEGRA_SIP_MCE_CMD_ENUM_FEATURES:
99 case TEGRA_SIP_MCE_CMD_ROC_FLUSH_CACHE_TRBITS:
100 case TEGRA_SIP_MCE_CMD_ENUM_READ_MCA:
101 case TEGRA_SIP_MCE_CMD_ENUM_WRITE_MCA:
102 case TEGRA_SIP_MCE_CMD_ROC_FLUSH_CACHE:
103 case TEGRA_SIP_MCE_CMD_ROC_CLEAN_CACHE:
Varun Wadekarad2824f2016-03-28 13:44:35 -0700104 case TEGRA_SIP_MCE_CMD_ENABLE_LATIC:
Varun Wadekar4ff3e8d2016-04-29 10:40:02 -0700105 case TEGRA_SIP_MCE_CMD_UNCORE_PERFMON_REQ:
Krishna Sitaramanb429d562016-07-19 16:36:13 -0700106 case TEGRA_SIP_MCE_CMD_MISC_CCPLEX:
Varun Wadekar921b9062015-08-25 17:03:14 +0530107
108 /* clean up the high bits */
Varun Wadekar59c3aa02015-09-09 11:33:08 +0530109 smc_fid &= MCE_CMD_MASK;
Varun Wadekar921b9062015-08-25 17:03:14 +0530110
Varun Wadekar59c3aa02015-09-09 11:33:08 +0530111 /* execute the command and store the result */
112 mce_ret = mce_command_handler(smc_fid, x1, x2, x3);
Varun Wadekar14f39572017-04-17 11:54:33 -0700113 write_ctx_reg(get_gpregs_ctx(handle), CTX_GPREG_X0,
114 (uint64_t)mce_ret);
Varun Wadekar921b9062015-08-25 17:03:14 +0530115
Varun Wadekar59c3aa02015-09-09 11:33:08 +0530116 return 0;
Varun Wadekar921b9062015-08-25 17:03:14 +0530117
Varun Wadekard66ee542016-02-29 10:24:30 -0800118 case TEGRA_SIP_SYSTEM_SHUTDOWN_STATE:
119
120 /* clean up the high bits */
121 x1 = (uint32_t)x1;
122
123 /*
124 * SC8 is a special Tegra186 system state where the CPUs and
125 * DRAM are powered down but the other subsystem is still
126 * alive.
127 */
128 if ((x1 == TEGRA_ARI_SYSTEM_SC8) ||
129 (x1 == TEGRA_ARI_MISC_CCPLEX_SHUTDOWN_POWER_OFF)) {
130
131 tegra186_system_powerdn_state = x1;
132 flush_dcache_range(
133 (uintptr_t)&tegra186_system_powerdn_state,
134 sizeof(tegra186_system_powerdn_state));
135
136 } else {
137
138 ERROR("%s: unhandled powerdn state (%d)\n", __func__,
139 (uint32_t)x1);
140 return -ENOTSUP;
141 }
142
143 return 0;
144
Varun Wadekard64db962016-09-23 14:28:16 -0700145 /*
146 * This function ID reads the Activity monitor's core/ref clock
147 * counter values for a core/cluster.
148 *
149 * x1 = MPIDR of the target core
150 * x2 = MIDR of the target core
151 */
152 case TEGRA_SIP_GET_ACTMON_CLK_COUNTERS:
153
154 cpu = (uint32_t)x1 & MPIDR_CPU_MASK;
155 impl = ((uint32_t)x2 >> MIDR_IMPL_SHIFT) & MIDR_IMPL_MASK;
156
157 /* sanity check target CPU number */
158 if (cpu > PLATFORM_MAX_CPUS_PER_CLUSTER)
159 return -EINVAL;
160
161 /* get the base address for the current CPU */
162 base = (impl == DENVER_IMPL) ? TEGRA_DENVER_ACTMON_CTR_BASE :
163 TEGRA_ARM_ACTMON_CTR_BASE;
164
165 /* read the clock counter values */
166 core_clk_ctr = mmio_read_32(base + (8 * cpu));
167 ref_clk_ctr = mmio_read_32(base + (8 * cpu) + REF_CLK_OFFSET);
168
169 /* return the counter values as two different parameters */
Varun Wadekar14f39572017-04-17 11:54:33 -0700170 write_ctx_reg(get_gpregs_ctx(handle), CTX_GPREG_X1,
171 (uint64_t)core_clk_ctr);
172 write_ctx_reg(get_gpregs_ctx(handle), CTX_GPREG_X2,
173 (uint64_t)ref_clk_ctr);
Varun Wadekard64db962016-09-23 14:28:16 -0700174
175 return 0;
176
Varun Wadekar921b9062015-08-25 17:03:14 +0530177 default:
Varun Wadekar921b9062015-08-25 17:03:14 +0530178 break;
179 }
180
Varun Wadekar59c3aa02015-09-09 11:33:08 +0530181 return -ENOTSUP;
Varun Wadekar921b9062015-08-25 17:03:14 +0530182}