Varun Wadekar | ecd6a5a | 2018-04-09 17:48:58 -0700 | [diff] [blame] | 1 | /* |
Varun Wadekar | 953699c | 2018-06-06 17:26:10 -0700 | [diff] [blame] | 2 | * Copyright (c) 2019-2020, NVIDIA CORPORATION. All rights reserved. |
Varun Wadekar | ecd6a5a | 2018-04-09 17:48:58 -0700 | [diff] [blame] | 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 <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 Radhakrishnan | d7a5c25 | 2017-05-25 16:27:42 -0700 | [diff] [blame] | 18 | #include <tegra_platform.h> |
Varun Wadekar | b11bb89 | 2018-12-10 13:28:25 -0800 | [diff] [blame] | 19 | #include <smmu.h> |
Vignesh Radhakrishnan | d7a5c25 | 2017-05-25 16:27:42 -0700 | [diff] [blame] | 20 | #include <stdbool.h> |
Varun Wadekar | ecd6a5a | 2018-04-09 17:48:58 -0700 | [diff] [blame] | 21 | |
Varun Wadekar | ecd6a5a | 2018-04-09 17:48:58 -0700 | [diff] [blame] | 22 | /******************************************************************************* |
Varun Wadekar | 362a6b2 | 2017-11-10 11:04:42 -0800 | [diff] [blame] | 23 | * Tegra194 SiP SMCs |
Varun Wadekar | ecd6a5a | 2018-04-09 17:48:58 -0700 | [diff] [blame] | 24 | ******************************************************************************/ |
Varun Wadekar | b11bb89 | 2018-12-10 13:28:25 -0800 | [diff] [blame] | 25 | #define TEGRA_SIP_GET_SMMU_PER 0xC200FF00U |
Varun Wadekar | ecd6a5a | 2018-04-09 17:48:58 -0700 | [diff] [blame] | 26 | |
| 27 | /******************************************************************************* |
Varun Wadekar | 362a6b2 | 2017-11-10 11:04:42 -0800 | [diff] [blame] | 28 | * This function is responsible for handling all T194 SiP calls |
Varun Wadekar | ecd6a5a | 2018-04-09 17:48:58 -0700 | [diff] [blame] | 29 | ******************************************************************************/ |
Anthony Zhou | 8bf6d4e | 2017-09-20 17:44:43 +0800 | [diff] [blame] | 30 | int32_t plat_sip_handler(uint32_t smc_fid, |
Varun Wadekar | ecd6a5a | 2018-04-09 17:48:58 -0700 | [diff] [blame] | 31 | uint64_t x1, |
| 32 | uint64_t x2, |
| 33 | uint64_t x3, |
| 34 | uint64_t x4, |
Varun Wadekar | 5c5f78c | 2017-04-28 18:15:09 -0700 | [diff] [blame] | 35 | const void *cookie, |
Varun Wadekar | ecd6a5a | 2018-04-09 17:48:58 -0700 | [diff] [blame] | 36 | void *handle, |
| 37 | uint64_t flags) |
| 38 | { |
Varun Wadekar | b11bb89 | 2018-12-10 13:28:25 -0800 | [diff] [blame] | 39 | 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 Zhou | 8bf6d4e | 2017-09-20 17:44:43 +0800 | [diff] [blame] | 43 | |
Varun Wadekar | 7aa6c03 | 2017-10-19 12:02:17 -0700 | [diff] [blame] | 44 | (void)x1; |
Anthony Zhou | 8bf6d4e | 2017-09-20 17:44:43 +0800 | [diff] [blame] | 45 | (void)x4; |
| 46 | (void)cookie; |
| 47 | (void)flags; |
Varun Wadekar | ecd6a5a | 2018-04-09 17:48:58 -0700 | [diff] [blame] | 48 | |
Varun Wadekar | b11bb89 | 2018-12-10 13:28:25 -0800 | [diff] [blame] | 49 | 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 Zhou | 8bf6d4e | 2017-09-20 17:44:43 +0800 | [diff] [blame] | 77 | return ret; |
Varun Wadekar | ecd6a5a | 2018-04-09 17:48:58 -0700 | [diff] [blame] | 78 | } |