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 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 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 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