xref: /rk3399_ARM-atf/services/spd/trusty/generic-arm64-smcall.c (revision 39b6cc66d670be41d6b51b644beb675f386a4240)
161496151SArve Hjønnevåg /*
26a23356cSAntonio Nino Diaz  * Copyright (c) 2016-2018, 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 
761496151SArve Hjønnevåg #include <debug.h>
861496151SArve Hjønnevåg #include <runtime_svc.h>
9*39b6cc66SAntonio Nino Diaz #include <stdio.h>
1061496151SArve Hjønnevåg 
1161496151SArve Hjønnevåg #include "generic-arm64-smcall.h"
1261496151SArve Hjønnevåg 
1361496151SArve Hjønnevåg int trusty_disable_serial_debug;
1461496151SArve Hjønnevåg 
1561496151SArve Hjønnevåg struct dputc_state {
1661496151SArve Hjønnevåg 	char linebuf[128];
1761496151SArve Hjønnevåg 	unsigned l;
1861496151SArve Hjønnevåg };
1961496151SArve Hjønnevåg 
2061496151SArve Hjønnevåg static struct dputc_state dputc_state[2];
2161496151SArve Hjønnevåg 
2261496151SArve Hjønnevåg static void trusty_dputc(char ch, int secure)
2361496151SArve Hjønnevåg {
2461496151SArve Hjønnevåg 	unsigned i;
2561496151SArve Hjønnevåg 	struct dputc_state *s = &dputc_state[!secure];
2661496151SArve Hjønnevåg 
2761496151SArve Hjønnevåg 	if (trusty_disable_serial_debug)
2861496151SArve Hjønnevåg 		return;
2961496151SArve Hjønnevåg 
3061496151SArve Hjønnevåg 	s->linebuf[s->l++] = ch;
3161496151SArve Hjønnevåg 	if (s->l == sizeof(s->linebuf) || ch == '\n') {
3261496151SArve Hjønnevåg 		if (secure)
33*39b6cc66SAntonio Nino Diaz 			printf("secure os: ");
3461496151SArve Hjønnevåg 		else
35*39b6cc66SAntonio Nino Diaz 			printf("non-secure os: ");
3661496151SArve Hjønnevåg 		for (i = 0; i < s->l; i++) {
3761496151SArve Hjønnevåg 			putchar(s->linebuf[i]);
3861496151SArve Hjønnevåg 		}
3961496151SArve Hjønnevåg 		if (ch != '\n') {
40*39b6cc66SAntonio Nino Diaz 			printf(" <...>\n");
4161496151SArve Hjønnevåg 		}
4261496151SArve Hjønnevåg 		s->l = 0;
4361496151SArve Hjønnevåg 	}
4461496151SArve Hjønnevåg }
4561496151SArve Hjønnevåg 
4661496151SArve Hjønnevåg static uint64_t trusty_get_reg_base(uint32_t reg)
4761496151SArve Hjønnevåg {
4861496151SArve Hjønnevåg 	switch (reg) {
4961496151SArve Hjønnevåg 	case 0:
5061496151SArve Hjønnevåg 		return PLAT_ARM_GICD_BASE;
5161496151SArve Hjønnevåg 
5261496151SArve Hjønnevåg 	case 1:
5361496151SArve Hjønnevåg 		return PLAT_ARM_GICC_BASE;
5461496151SArve Hjønnevåg 
5561496151SArve Hjønnevåg 	default:
5661496151SArve Hjønnevåg 		NOTICE("%s(0x%x) unknown reg\n", __func__, reg);
5761496151SArve Hjønnevåg 		return SMC_UNK;
5861496151SArve Hjønnevåg 	}
5961496151SArve Hjønnevåg }
6061496151SArve Hjønnevåg 
612de6deaaSSandrine Bailleux static uintptr_t trusty_generic_platform_smc(uint32_t smc_fid,
622de6deaaSSandrine Bailleux 			 u_register_t x1,
632de6deaaSSandrine Bailleux 			 u_register_t x2,
642de6deaaSSandrine Bailleux 			 u_register_t x3,
652de6deaaSSandrine Bailleux 			 u_register_t x4,
6661496151SArve Hjønnevåg 			 void *cookie,
6761496151SArve Hjønnevåg 			 void *handle,
682de6deaaSSandrine Bailleux 			 u_register_t flags)
6961496151SArve Hjønnevåg {
7061496151SArve Hjønnevåg 	switch (smc_fid) {
7161496151SArve Hjønnevåg 	case SMC_FC_DEBUG_PUTC:
7261496151SArve Hjønnevåg 		trusty_dputc(x1, is_caller_secure(flags));
7361496151SArve Hjønnevåg 		SMC_RET1(handle, 0);
7461496151SArve Hjønnevåg 
7561496151SArve Hjønnevåg 	case SMC_FC_GET_REG_BASE:
7661496151SArve Hjønnevåg 	case SMC_FC64_GET_REG_BASE:
7761496151SArve Hjønnevåg 		SMC_RET1(handle, trusty_get_reg_base(x1));
7861496151SArve Hjønnevåg 
7961496151SArve Hjønnevåg 	default:
8061496151SArve Hjønnevåg 		NOTICE("%s(0x%x, 0x%lx) unknown smc\n", __func__, smc_fid, x1);
8161496151SArve Hjønnevåg 		SMC_RET1(handle, SMC_UNK);
8261496151SArve Hjønnevåg 	}
8361496151SArve Hjønnevåg }
8461496151SArve Hjønnevåg 
8561496151SArve Hjønnevåg /* Define a SPD runtime service descriptor for fast SMC calls */
8661496151SArve Hjønnevåg DECLARE_RT_SVC(
8761496151SArve Hjønnevåg 	trusty_fast,
8861496151SArve Hjønnevåg 
8961496151SArve Hjønnevåg 	SMC_ENTITY_PLATFORM_MONITOR,
9061496151SArve Hjønnevåg 	SMC_ENTITY_PLATFORM_MONITOR,
9161496151SArve Hjønnevåg 	SMC_TYPE_FAST,
9261496151SArve Hjønnevåg 	NULL,
9361496151SArve Hjønnevåg 	trusty_generic_platform_smc
9461496151SArve Hjønnevåg );
9561496151SArve Hjønnevåg 
96