xref: /rk3399_ARM-atf/services/spd/trusty/generic-arm64-smcall.c (revision 98ab180565bc60fbb66ffc2932c0001e0711b313)
161496151SArve Hjønnevåg /*
210608a63SAntonio Nino Diaz  * Copyright (c) 2016-2019, ARM Limited and Contributors. All rights reserved.
361496151SArve Hjønnevåg  *
464b33235SArve Hjønnevåg  * SPDX-License-Identifier: BSD-3-Clause
561496151SArve Hjønnevåg  */
661496151SArve Hjønnevåg 
739b6cc66SAntonio Nino Diaz #include <stdio.h>
861496151SArve Hjønnevåg 
909d40e0eSAntonio Nino Diaz #include <common/debug.h>
1009d40e0eSAntonio Nino Diaz #include <common/runtime_svc.h>
1110608a63SAntonio Nino Diaz #include <platform_def.h>
1209d40e0eSAntonio Nino Diaz 
1361496151SArve Hjønnevåg #include "generic-arm64-smcall.h"
1461496151SArve Hjønnevåg 
15471e8fa7SArve Hjønnevåg #ifndef PLAT_ARM_GICD_BASE
16471e8fa7SArve Hjønnevåg #ifdef GICD_BASE
17471e8fa7SArve Hjønnevåg #define PLAT_ARM_GICD_BASE GICD_BASE
18471e8fa7SArve Hjønnevåg #define PLAT_ARM_GICC_BASE GICC_BASE
19*76776c2cSArve Hjønnevåg #ifdef GICR_BASE
20*76776c2cSArve Hjønnevåg #define PLAT_ARM_GICR_BASE GICR_BASE
21*76776c2cSArve Hjønnevåg #endif
22471e8fa7SArve Hjønnevåg #else
23471e8fa7SArve Hjønnevåg #error PLAT_ARM_GICD_BASE or GICD_BASE must be defined
24471e8fa7SArve Hjønnevåg #endif
25471e8fa7SArve Hjønnevåg #endif
26471e8fa7SArve Hjønnevåg 
27*76776c2cSArve Hjønnevåg #ifndef PLAT_ARM_GICR_BASE
28*76776c2cSArve Hjønnevåg #define PLAT_ARM_GICR_BASE SMC_UNK
29*76776c2cSArve Hjønnevåg #endif
30*76776c2cSArve Hjønnevåg 
3161496151SArve Hjønnevåg int trusty_disable_serial_debug;
3261496151SArve Hjønnevåg 
3361496151SArve Hjønnevåg struct dputc_state {
3461496151SArve Hjønnevåg 	char linebuf[128];
3561496151SArve Hjønnevåg 	unsigned l;
3661496151SArve Hjønnevåg };
3761496151SArve Hjønnevåg 
3861496151SArve Hjønnevåg static struct dputc_state dputc_state[2];
3961496151SArve Hjønnevåg 
trusty_dputc(char ch,int secure)4061496151SArve Hjønnevåg static void trusty_dputc(char ch, int secure)
4161496151SArve Hjønnevåg {
4261496151SArve Hjønnevåg 	unsigned i;
4361496151SArve Hjønnevåg 	struct dputc_state *s = &dputc_state[!secure];
4461496151SArve Hjønnevåg 
4561496151SArve Hjønnevåg 	if (trusty_disable_serial_debug)
4661496151SArve Hjønnevåg 		return;
4761496151SArve Hjønnevåg 
4861496151SArve Hjønnevåg 	s->linebuf[s->l++] = ch;
4961496151SArve Hjønnevåg 	if (s->l == sizeof(s->linebuf) || ch == '\n') {
5061496151SArve Hjønnevåg 		if (secure)
5139b6cc66SAntonio Nino Diaz 			printf("secure os: ");
5261496151SArve Hjønnevåg 		else
5339b6cc66SAntonio Nino Diaz 			printf("non-secure os: ");
5461496151SArve Hjønnevåg 		for (i = 0; i < s->l; i++) {
5561496151SArve Hjønnevåg 			putchar(s->linebuf[i]);
5661496151SArve Hjønnevåg 		}
5761496151SArve Hjønnevåg 		if (ch != '\n') {
5839b6cc66SAntonio Nino Diaz 			printf(" <...>\n");
5961496151SArve Hjønnevåg 		}
6061496151SArve Hjønnevåg 		s->l = 0;
6161496151SArve Hjønnevåg 	}
6261496151SArve Hjønnevåg }
6361496151SArve Hjønnevåg 
trusty_get_reg_base(uint32_t reg)6461496151SArve Hjønnevåg static uint64_t trusty_get_reg_base(uint32_t reg)
6561496151SArve Hjønnevåg {
6661496151SArve Hjønnevåg 	switch (reg) {
67*76776c2cSArve Hjønnevåg 	case SMC_GET_GIC_BASE_GICD:
6861496151SArve Hjønnevåg 		return PLAT_ARM_GICD_BASE;
6961496151SArve Hjønnevåg 
70*76776c2cSArve Hjønnevåg 	case SMC_GET_GIC_BASE_GICC:
7161496151SArve Hjønnevåg 		return PLAT_ARM_GICC_BASE;
7261496151SArve Hjønnevåg 
73*76776c2cSArve Hjønnevåg 	case SMC_GET_GIC_BASE_GICR:
74*76776c2cSArve Hjønnevåg 		return PLAT_ARM_GICR_BASE;
75*76776c2cSArve Hjønnevåg 
7661496151SArve Hjønnevåg 	default:
7761496151SArve Hjønnevåg 		NOTICE("%s(0x%x) unknown reg\n", __func__, reg);
7861496151SArve Hjønnevåg 		return SMC_UNK;
7961496151SArve Hjønnevåg 	}
8061496151SArve Hjønnevåg }
8161496151SArve Hjønnevåg 
trusty_generic_platform_smc(uint32_t smc_fid,u_register_t x1,u_register_t x2,u_register_t x3,u_register_t x4,void * cookie,void * handle,u_register_t flags)822de6deaaSSandrine Bailleux static uintptr_t trusty_generic_platform_smc(uint32_t smc_fid,
832de6deaaSSandrine Bailleux 			 u_register_t x1,
842de6deaaSSandrine Bailleux 			 u_register_t x2,
852de6deaaSSandrine Bailleux 			 u_register_t x3,
862de6deaaSSandrine Bailleux 			 u_register_t x4,
8761496151SArve Hjønnevåg 			 void *cookie,
8861496151SArve Hjønnevåg 			 void *handle,
892de6deaaSSandrine Bailleux 			 u_register_t flags)
9061496151SArve Hjønnevåg {
9161496151SArve Hjønnevåg 	switch (smc_fid) {
9261496151SArve Hjønnevåg 	case SMC_FC_DEBUG_PUTC:
9361496151SArve Hjønnevåg 		trusty_dputc(x1, is_caller_secure(flags));
9461496151SArve Hjønnevåg 		SMC_RET1(handle, 0);
9561496151SArve Hjønnevåg 
9661496151SArve Hjønnevåg 	case SMC_FC_GET_REG_BASE:
9761496151SArve Hjønnevåg 	case SMC_FC64_GET_REG_BASE:
9861496151SArve Hjønnevåg 		SMC_RET1(handle, trusty_get_reg_base(x1));
9961496151SArve Hjønnevåg 
10061496151SArve Hjønnevåg 	default:
10161496151SArve Hjønnevåg 		NOTICE("%s(0x%x, 0x%lx) unknown smc\n", __func__, smc_fid, x1);
10261496151SArve Hjønnevåg 		SMC_RET1(handle, SMC_UNK);
10361496151SArve Hjønnevåg 	}
10461496151SArve Hjønnevåg }
10561496151SArve Hjønnevåg 
10661496151SArve Hjønnevåg /* Define a SPD runtime service descriptor for fast SMC calls */
10761496151SArve Hjønnevåg DECLARE_RT_SVC(
10861496151SArve Hjønnevåg 	trusty_fast,
10961496151SArve Hjønnevåg 
11061496151SArve Hjønnevåg 	SMC_ENTITY_PLATFORM_MONITOR,
11161496151SArve Hjønnevåg 	SMC_ENTITY_PLATFORM_MONITOR,
11261496151SArve Hjønnevåg 	SMC_TYPE_FAST,
11361496151SArve Hjønnevåg 	NULL,
11461496151SArve Hjønnevåg 	trusty_generic_platform_smc
11561496151SArve Hjønnevåg );
11661496151SArve Hjønnevåg 
117