1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2021-2022, Arm Limited. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #include <common/bl_common.h> 8*91f16700Schasinglulu #include <common/debug.h> 9*91f16700Schasinglulu #include <drivers/arm/pl011.h> 10*91f16700Schasinglulu #include <drivers/console.h> 11*91f16700Schasinglulu #include <services/rmm_core_manifest.h> 12*91f16700Schasinglulu #include <services/rmmd_svc.h> 13*91f16700Schasinglulu #include <services/trp/platform_trp.h> 14*91f16700Schasinglulu #include <trp_helpers.h> 15*91f16700Schasinglulu 16*91f16700Schasinglulu #include <plat/arm/common/plat_arm.h> 17*91f16700Schasinglulu #include <platform_def.h> 18*91f16700Schasinglulu 19*91f16700Schasinglulu /******************************************************************************* 20*91f16700Schasinglulu * Received from boot manifest and populated here 21*91f16700Schasinglulu ******************************************************************************/ 22*91f16700Schasinglulu extern uint32_t trp_boot_manifest_version; 23*91f16700Schasinglulu 24*91f16700Schasinglulu /******************************************************************************* 25*91f16700Schasinglulu * Initialize the UART 26*91f16700Schasinglulu ******************************************************************************/ 27*91f16700Schasinglulu static console_t arm_trp_runtime_console; 28*91f16700Schasinglulu 29*91f16700Schasinglulu static int arm_trp_process_manifest(struct rmm_manifest *manifest) 30*91f16700Schasinglulu { 31*91f16700Schasinglulu /* padding field on the manifest must be RES0 */ 32*91f16700Schasinglulu assert(manifest->padding == 0U); 33*91f16700Schasinglulu 34*91f16700Schasinglulu /* Verify the Boot Manifest Version. Only the Major is considered */ 35*91f16700Schasinglulu if (RMMD_MANIFEST_VERSION_MAJOR != 36*91f16700Schasinglulu RMMD_GET_MANIFEST_VERSION_MAJOR(manifest->version)) { 37*91f16700Schasinglulu return E_RMM_BOOT_MANIFEST_VERSION_NOT_SUPPORTED; 38*91f16700Schasinglulu } 39*91f16700Schasinglulu 40*91f16700Schasinglulu trp_boot_manifest_version = manifest->version; 41*91f16700Schasinglulu flush_dcache_range((uintptr_t)manifest, sizeof(struct rmm_manifest)); 42*91f16700Schasinglulu 43*91f16700Schasinglulu return 0; 44*91f16700Schasinglulu } 45*91f16700Schasinglulu 46*91f16700Schasinglulu void arm_trp_early_platform_setup(struct rmm_manifest *manifest) 47*91f16700Schasinglulu { 48*91f16700Schasinglulu int rc; 49*91f16700Schasinglulu 50*91f16700Schasinglulu rc = arm_trp_process_manifest(manifest); 51*91f16700Schasinglulu if (rc != 0) { 52*91f16700Schasinglulu trp_boot_abort(rc); 53*91f16700Schasinglulu } 54*91f16700Schasinglulu 55*91f16700Schasinglulu /* 56*91f16700Schasinglulu * Initialize a different console than already in use to display 57*91f16700Schasinglulu * messages from trp 58*91f16700Schasinglulu */ 59*91f16700Schasinglulu rc = console_pl011_register(PLAT_ARM_TRP_UART_BASE, 60*91f16700Schasinglulu PLAT_ARM_TRP_UART_CLK_IN_HZ, 61*91f16700Schasinglulu ARM_CONSOLE_BAUDRATE, 62*91f16700Schasinglulu &arm_trp_runtime_console); 63*91f16700Schasinglulu if (rc == 0) { 64*91f16700Schasinglulu panic(); 65*91f16700Schasinglulu } 66*91f16700Schasinglulu 67*91f16700Schasinglulu console_set_scope(&arm_trp_runtime_console, 68*91f16700Schasinglulu CONSOLE_FLAG_BOOT | CONSOLE_FLAG_RUNTIME); 69*91f16700Schasinglulu } 70*91f16700Schasinglulu 71*91f16700Schasinglulu void trp_early_platform_setup(struct rmm_manifest *manifest) 72*91f16700Schasinglulu { 73*91f16700Schasinglulu arm_trp_early_platform_setup(manifest); 74*91f16700Schasinglulu } 75