xref: /arm-trusted-firmware/plat/amlogic/common/aml_sip_svc.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
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