blob: 884762de79e83185b4d81ccc0424296b7a747f85 [file] [log] [blame]
Varun Wadekarecd6a5a2018-04-09 17:48:58 -07001/*
Varun Wadekar953699c2018-06-06 17:26:10 -07002 * Copyright (c) 2019-2020, NVIDIA CORPORATION. All rights reserved.
Varun Wadekarecd6a5a2018-04-09 17:48:58 -07003 *
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 <lib/el3_runtime/context_mgmt.h>
12#include <common/debug.h>
13#include <errno.h>
14#include <mce.h>
15#include <memctrl.h>
16#include <common/runtime_svc.h>
17#include <tegra_private.h>
Vignesh Radhakrishnand7a5c252017-05-25 16:27:42 -070018#include <tegra_platform.h>
Varun Wadekarb11bb892018-12-10 13:28:25 -080019#include <smmu.h>
Vignesh Radhakrishnand7a5c252017-05-25 16:27:42 -070020#include <stdbool.h>
Varun Wadekarecd6a5a2018-04-09 17:48:58 -070021
Varun Wadekarecd6a5a2018-04-09 17:48:58 -070022/*******************************************************************************
Varun Wadekar362a6b22017-11-10 11:04:42 -080023 * Tegra194 SiP SMCs
Varun Wadekarecd6a5a2018-04-09 17:48:58 -070024 ******************************************************************************/
Varun Wadekarb11bb892018-12-10 13:28:25 -080025#define TEGRA_SIP_GET_SMMU_PER 0xC200FF00U
Varun Wadekarecd6a5a2018-04-09 17:48:58 -070026
27/*******************************************************************************
Varun Wadekar362a6b22017-11-10 11:04:42 -080028 * This function is responsible for handling all T194 SiP calls
Varun Wadekarecd6a5a2018-04-09 17:48:58 -070029 ******************************************************************************/
Anthony Zhou8bf6d4e2017-09-20 17:44:43 +080030int32_t plat_sip_handler(uint32_t smc_fid,
Varun Wadekarecd6a5a2018-04-09 17:48:58 -070031 uint64_t x1,
32 uint64_t x2,
33 uint64_t x3,
34 uint64_t x4,
Varun Wadekar5c5f78c2017-04-28 18:15:09 -070035 const void *cookie,
Varun Wadekarecd6a5a2018-04-09 17:48:58 -070036 void *handle,
37 uint64_t flags)
38{
Varun Wadekarb11bb892018-12-10 13:28:25 -080039 int32_t ret = 0;
40 uint32_t i, smmu_per[6] = {0};
41 uint32_t num_smmu_devices = plat_get_num_smmu_devices();
42 uint64_t per[3] = {0ULL};
Anthony Zhou8bf6d4e2017-09-20 17:44:43 +080043
Varun Wadekar7aa6c032017-10-19 12:02:17 -070044 (void)x1;
Anthony Zhou8bf6d4e2017-09-20 17:44:43 +080045 (void)x4;
46 (void)cookie;
47 (void)flags;
Varun Wadekarecd6a5a2018-04-09 17:48:58 -070048
Varun Wadekarb11bb892018-12-10 13:28:25 -080049 switch (smc_fid) {
50 case TEGRA_SIP_GET_SMMU_PER:
51
52 /* make sure we dont go past the array length */
53 assert(num_smmu_devices <= ARRAY_SIZE(smmu_per));
54
55 /* read all supported SMMU_PER records */
56 for (i = 0U; i < num_smmu_devices; i++) {
57 smmu_per[i] = tegra_smmu_read_32(i, SMMU_GSR0_PER);
58 }
59
60 /* pack results into 3 64bit variables. */
61 per[0] = smmu_per[0] | ((uint64_t)smmu_per[1] << 32U);
62 per[1] = smmu_per[2] | ((uint64_t)smmu_per[3] << 32U);
63 per[2] = smmu_per[4] | ((uint64_t)smmu_per[5] << 32U);
64
65 /* provide the results via X1-X3 CPU registers */
66 write_ctx_reg(get_gpregs_ctx(handle), CTX_GPREG_X1, per[0]);
67 write_ctx_reg(get_gpregs_ctx(handle), CTX_GPREG_X2, per[1]);
68 write_ctx_reg(get_gpregs_ctx(handle), CTX_GPREG_X3, per[2]);
69
70 break;
71
72 default:
73 ret = -ENOTSUP;
74 break;
75 }
76
Anthony Zhou8bf6d4e2017-09-20 17:44:43 +080077 return ret;
Varun Wadekarecd6a5a2018-04-09 17:48:58 -070078}