1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2018-2019, ARM Limited and Contributors. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #include <common/debug.h> 8*91f16700Schasinglulu #include <common/runtime_svc.h> 9*91f16700Schasinglulu #include <lib/mmio.h> 10*91f16700Schasinglulu #include <platform_def.h> 11*91f16700Schasinglulu #include <stdint.h> 12*91f16700Schasinglulu #include <string.h> 13*91f16700Schasinglulu 14*91f16700Schasinglulu #include "aml_private.h" 15*91f16700Schasinglulu 16*91f16700Schasinglulu struct aml_cpu_info { 17*91f16700Schasinglulu uint32_t version; 18*91f16700Schasinglulu uint8_t chip_id[16]; 19*91f16700Schasinglulu }; 20*91f16700Schasinglulu 21*91f16700Schasinglulu static int aml_sip_get_chip_id(uint64_t version) 22*91f16700Schasinglulu { 23*91f16700Schasinglulu struct aml_cpu_info *info = (void *)AML_SHARE_MEM_OUTPUT_BASE; 24*91f16700Schasinglulu uint32_t size; 25*91f16700Schasinglulu 26*91f16700Schasinglulu if (version > 2) 27*91f16700Schasinglulu return -1; 28*91f16700Schasinglulu 29*91f16700Schasinglulu memset(info, 0, sizeof(struct aml_cpu_info)); 30*91f16700Schasinglulu 31*91f16700Schasinglulu if (version == 2) { 32*91f16700Schasinglulu info->version = 2; 33*91f16700Schasinglulu size = 16; 34*91f16700Schasinglulu } else { 35*91f16700Schasinglulu info->version = 1; 36*91f16700Schasinglulu size = 12; 37*91f16700Schasinglulu } 38*91f16700Schasinglulu 39*91f16700Schasinglulu if (aml_scpi_get_chip_id(info->chip_id, size) == 0) 40*91f16700Schasinglulu return -1; 41*91f16700Schasinglulu 42*91f16700Schasinglulu return 0; 43*91f16700Schasinglulu } 44*91f16700Schasinglulu 45*91f16700Schasinglulu /******************************************************************************* 46*91f16700Schasinglulu * This function is responsible for handling all SiP calls 47*91f16700Schasinglulu ******************************************************************************/ 48*91f16700Schasinglulu static uintptr_t aml_sip_handler(uint32_t smc_fid, 49*91f16700Schasinglulu u_register_t x1, u_register_t x2, 50*91f16700Schasinglulu u_register_t x3, u_register_t x4, 51*91f16700Schasinglulu void *cookie, void *handle, 52*91f16700Schasinglulu u_register_t flags) 53*91f16700Schasinglulu { 54*91f16700Schasinglulu switch (smc_fid) { 55*91f16700Schasinglulu 56*91f16700Schasinglulu case AML_SM_GET_SHARE_MEM_INPUT_BASE: 57*91f16700Schasinglulu SMC_RET1(handle, AML_SHARE_MEM_INPUT_BASE); 58*91f16700Schasinglulu 59*91f16700Schasinglulu case AML_SM_GET_SHARE_MEM_OUTPUT_BASE: 60*91f16700Schasinglulu SMC_RET1(handle, AML_SHARE_MEM_OUTPUT_BASE); 61*91f16700Schasinglulu 62*91f16700Schasinglulu case AML_SM_EFUSE_READ: 63*91f16700Schasinglulu { 64*91f16700Schasinglulu void *dst = (void *)AML_SHARE_MEM_OUTPUT_BASE; 65*91f16700Schasinglulu uint64_t ret = aml_efuse_read(dst, (uint32_t)x1, x2); 66*91f16700Schasinglulu 67*91f16700Schasinglulu SMC_RET1(handle, ret); 68*91f16700Schasinglulu } 69*91f16700Schasinglulu case AML_SM_EFUSE_USER_MAX: 70*91f16700Schasinglulu SMC_RET1(handle, aml_efuse_user_max()); 71*91f16700Schasinglulu 72*91f16700Schasinglulu case AML_SM_JTAG_ON: 73*91f16700Schasinglulu aml_scpi_jtag_set_state(AML_JTAG_STATE_ON, x1); 74*91f16700Schasinglulu SMC_RET1(handle, 0); 75*91f16700Schasinglulu 76*91f16700Schasinglulu case AML_SM_JTAG_OFF: 77*91f16700Schasinglulu aml_scpi_jtag_set_state(AML_JTAG_STATE_OFF, x1); 78*91f16700Schasinglulu SMC_RET1(handle, 0); 79*91f16700Schasinglulu 80*91f16700Schasinglulu case AML_SM_GET_CHIP_ID: 81*91f16700Schasinglulu SMC_RET1(handle, aml_sip_get_chip_id(x1)); 82*91f16700Schasinglulu 83*91f16700Schasinglulu default: 84*91f16700Schasinglulu ERROR("BL31: Unhandled SIP SMC: 0x%08x\n", smc_fid); 85*91f16700Schasinglulu break; 86*91f16700Schasinglulu } 87*91f16700Schasinglulu 88*91f16700Schasinglulu SMC_RET1(handle, SMC_UNK); 89*91f16700Schasinglulu } 90*91f16700Schasinglulu 91*91f16700Schasinglulu DECLARE_RT_SVC( 92*91f16700Schasinglulu aml_sip_handler, 93*91f16700Schasinglulu 94*91f16700Schasinglulu OEN_SIP_START, 95*91f16700Schasinglulu OEN_SIP_END, 96*91f16700Schasinglulu SMC_TYPE_FAST, 97*91f16700Schasinglulu NULL, 98*91f16700Schasinglulu aml_sip_handler 99*91f16700Schasinglulu ); 100