blob: 8c7854e9c8e0067c70cf7dd21f7d01561213c4eb [file] [log] [blame]
Varun Wadekarecd6a5a2018-04-09 17:48:58 -07001/*
2 * Copyright (c) 2019, NVIDIA CORPORATION. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#include <arch.h>
8#include <arch_helpers.h>
9#include <assert.h>
10#include <common/bl_common.h>
11#include <context.h>
12#include <lib/el3_runtime/context_mgmt.h>
13#include <common/debug.h>
14#include <denver.h>
15#include <mce.h>
16#include <mce_private.h>
Steven Kao2cdb6782017-01-05 17:04:40 +080017#include <platform_def.h>
Steven Kao6f373a22017-09-29 18:09:17 +080018#include <stdbool.h>
Varun Wadekarecd6a5a2018-04-09 17:48:58 -070019#include <string.h>
20#include <errno.h>
Steven Kao2cdb6782017-01-05 17:04:40 +080021#include <t194_nvg.h>
Varun Wadekarecd6a5a2018-04-09 17:48:58 -070022#include <tegra_def.h>
23#include <tegra_platform.h>
24
Steven Kao6f373a22017-09-29 18:09:17 +080025/* Handler to check if MCE firmware is supported */
26static bool mce_firmware_not_supported(void)
27{
28 bool status;
29
30 /* these platforms do not load MCE firmware */
31 status = tegra_platform_is_linsim() || tegra_platform_is_qt() ||
32 tegra_platform_is_virt_dev_kit();
33
34 return status;
35}
36
Varun Wadekarecd6a5a2018-04-09 17:48:58 -070037/*******************************************************************************
38 * Common handler for all MCE commands
39 ******************************************************************************/
Anthony Zhou5e890b32017-04-28 13:52:58 +080040int32_t mce_command_handler(uint64_t cmd, uint64_t arg0, uint64_t arg1,
Varun Wadekarecd6a5a2018-04-09 17:48:58 -070041 uint64_t arg2)
42{
Steven Kao2cdb6782017-01-05 17:04:40 +080043 int32_t ret = 0;
Varun Wadekarecd6a5a2018-04-09 17:48:58 -070044
45 switch (cmd) {
Anthony Zhouc46150f2017-09-20 17:18:56 +080046 case (uint64_t)MCE_CMD_ENTER_CSTATE:
Steven Kao2cdb6782017-01-05 17:04:40 +080047 ret = nvg_enter_cstate((uint32_t)arg0, (uint32_t)arg1);
48 if (ret < 0) {
49 ERROR("%s: enter_cstate failed(%d)\n", __func__, ret);
50 }
51
Varun Wadekarecd6a5a2018-04-09 17:48:58 -070052 break;
53
Anthony Zhouc46150f2017-09-20 17:18:56 +080054 case (uint64_t)MCE_CMD_IS_SC7_ALLOWED:
Steven Kao2cdb6782017-01-05 17:04:40 +080055 ret = nvg_is_sc7_allowed();
56 if (ret < 0) {
57 ERROR("%s: is_sc7_allowed failed(%d)\n", __func__, ret);
Steven Kao2cdb6782017-01-05 17:04:40 +080058 }
Varun Wadekarecd6a5a2018-04-09 17:48:58 -070059
Varun Wadekarecd6a5a2018-04-09 17:48:58 -070060 break;
61
Anthony Zhouc46150f2017-09-20 17:18:56 +080062 case (uint64_t)MCE_CMD_ONLINE_CORE:
Steven Kao2cdb6782017-01-05 17:04:40 +080063 ret = nvg_online_core((uint32_t)arg0);
64 if (ret < 0) {
65 ERROR("%s: online_core failed(%d)\n", __func__, ret);
66 }
Varun Wadekarecd6a5a2018-04-09 17:48:58 -070067
68 break;
69
Varun Wadekarecd6a5a2018-04-09 17:48:58 -070070 default:
Anthony Zhou5e890b32017-04-28 13:52:58 +080071 ERROR("unknown MCE command (%llu)\n", cmd);
Varun Wadekar7aa6c032017-10-19 12:02:17 -070072 ret = -EINVAL;
Steven Kao2cdb6782017-01-05 17:04:40 +080073 break;
Varun Wadekarecd6a5a2018-04-09 17:48:58 -070074 }
75
76 return ret;
77}
78
Varun Wadekarecd6a5a2018-04-09 17:48:58 -070079/*******************************************************************************
80 * Handler to update carveout values for Video Memory Carveout region
81 ******************************************************************************/
Steven Kao2cdb6782017-01-05 17:04:40 +080082int32_t mce_update_gsc_videomem(void)
Varun Wadekarecd6a5a2018-04-09 17:48:58 -070083{
Steven Kao6f373a22017-09-29 18:09:17 +080084 int32_t ret;
85
86 /*
87 * MCE firmware is not running on simulation platforms.
88 */
89 if (mce_firmware_not_supported()) {
90 ret = -EINVAL;
91 } else {
92 ret = nvg_update_ccplex_gsc((uint32_t)TEGRA_NVG_CHANNEL_UPDATE_GSC_VPR);
93 }
94
95 return ret;
Varun Wadekarecd6a5a2018-04-09 17:48:58 -070096}
97
98/*******************************************************************************
99 * Handler to update carveout values for TZDRAM aperture
100 ******************************************************************************/
Steven Kao2cdb6782017-01-05 17:04:40 +0800101int32_t mce_update_gsc_tzdram(void)
Varun Wadekarecd6a5a2018-04-09 17:48:58 -0700102{
Steven Kao6f373a22017-09-29 18:09:17 +0800103 int32_t ret;
104
105 /*
106 * MCE firmware is not running on simulation platforms.
107 */
108 if (mce_firmware_not_supported()) {
109 ret = -EINVAL;
110 } else {
111 ret = nvg_update_ccplex_gsc((uint32_t)TEGRA_NVG_CHANNEL_UPDATE_GSC_TZ_DRAM);
112 }
113
114 return ret;
Varun Wadekarecd6a5a2018-04-09 17:48:58 -0700115}
116
117/*******************************************************************************
118 * Handler to update carveout values for TZ SysRAM aperture
119 ******************************************************************************/
Steven Kao2cdb6782017-01-05 17:04:40 +0800120int32_t mce_update_gsc_tzram(void)
Varun Wadekarecd6a5a2018-04-09 17:48:58 -0700121{
Steven Kao6f373a22017-09-29 18:09:17 +0800122 int32_t ret;
123
124 /*
125 * MCE firmware is not running on simulation platforms.
126 */
127 if (mce_firmware_not_supported()) {
128 ret = -EINVAL;
129 } else {
130 ret = nvg_update_ccplex_gsc((uint32_t)TEGRA_NVG_CHANNEL_UPDATE_GSC_TZRAM);
131 }
132
133 return ret;
Varun Wadekarecd6a5a2018-04-09 17:48:58 -0700134}
135
136/*******************************************************************************
Varun Wadekarecd6a5a2018-04-09 17:48:58 -0700137 * Handler to issue the UPDATE_CSTATE_INFO request
138 ******************************************************************************/
Anthony Zhou5e890b32017-04-28 13:52:58 +0800139void mce_update_cstate_info(const mce_cstate_info_t *cstate)
Varun Wadekarecd6a5a2018-04-09 17:48:58 -0700140{
141 /* issue the UPDATE_CSTATE_INFO request */
Steven Kao2cdb6782017-01-05 17:04:40 +0800142 nvg_update_cstate_info(cstate->cluster, cstate->ccplex, cstate->system,
143 cstate->wake_mask, cstate->update_wake_mask);
Varun Wadekarecd6a5a2018-04-09 17:48:58 -0700144}
145
146/*******************************************************************************
147 * Handler to read the MCE firmware version and check if it is compatible
148 * with interface header the BL3-1 was compiled against
149 ******************************************************************************/
150void mce_verify_firmware_version(void)
151{
152 uint64_t version;
153 uint32_t major, minor;
154
155 /*
156 * MCE firmware is not running on simulation platforms.
157 */
Steven Kao6f373a22017-09-29 18:09:17 +0800158 if (mce_firmware_not_supported()) {
Varun Wadekarecd6a5a2018-04-09 17:48:58 -0700159 return;
Steven Kao2cdb6782017-01-05 17:04:40 +0800160 }
Varun Wadekarecd6a5a2018-04-09 17:48:58 -0700161
162 /*
163 * Read the MCE firmware version and extract the major and minor
164 * version fields
165 */
Steven Kao2cdb6782017-01-05 17:04:40 +0800166 version = nvg_get_version();
167 minor = (uint32_t)version;
168 major = (uint32_t)(version >> 32);
Varun Wadekarecd6a5a2018-04-09 17:48:58 -0700169
Varun Wadekar093bfaa2017-11-07 08:50:55 -0800170 INFO("MCE Version - HW=%u:%u, SW=%u:%u\n", major, minor,
171 TEGRA_NVG_VERSION_MAJOR, TEGRA_NVG_VERSION_MINOR);
Varun Wadekarecd6a5a2018-04-09 17:48:58 -0700172
173 /*
174 * Verify that the MCE firmware version and the interface header
175 * match
176 */
Steven Kao2cdb6782017-01-05 17:04:40 +0800177 if (major != (uint32_t)TEGRA_NVG_VERSION_MAJOR) {
Varun Wadekarecd6a5a2018-04-09 17:48:58 -0700178 ERROR("MCE major version mismatch\n");
179 panic();
180 }
181
Steven Kao2cdb6782017-01-05 17:04:40 +0800182 if (minor < (uint32_t)TEGRA_NVG_VERSION_MINOR) {
Varun Wadekarecd6a5a2018-04-09 17:48:58 -0700183 ERROR("MCE minor version mismatch\n");
184 panic();
185 }
186}