1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2017-2020, ARM Limited and Contributors. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #include <errno.h> 8*91f16700Schasinglulu 9*91f16700Schasinglulu #include <platform_def.h> 10*91f16700Schasinglulu 11*91f16700Schasinglulu #include <common/bl_common.h> 12*91f16700Schasinglulu #include <common/debug.h> 13*91f16700Schasinglulu #include <common/desc_image_load.h> 14*91f16700Schasinglulu #include <common/image_decompress.h> 15*91f16700Schasinglulu #include <drivers/io/io_storage.h> 16*91f16700Schasinglulu #include <lib/xlat_tables/xlat_tables_v2.h> 17*91f16700Schasinglulu #include <plat/common/platform.h> 18*91f16700Schasinglulu #ifdef UNIPHIER_DECOMPRESS_GZIP 19*91f16700Schasinglulu #include <tf_gunzip.h> 20*91f16700Schasinglulu #endif 21*91f16700Schasinglulu 22*91f16700Schasinglulu #include "uniphier.h" 23*91f16700Schasinglulu 24*91f16700Schasinglulu #define UNIPHIER_IMAGE_BUF_OFFSET 0x03800000UL 25*91f16700Schasinglulu #define UNIPHIER_IMAGE_BUF_SIZE 0x00800000UL 26*91f16700Schasinglulu 27*91f16700Schasinglulu static uintptr_t uniphier_mem_base = UNIPHIER_MEM_BASE; 28*91f16700Schasinglulu static unsigned int uniphier_soc = UNIPHIER_SOC_UNKNOWN; 29*91f16700Schasinglulu static int uniphier_bl2_kick_scp; 30*91f16700Schasinglulu 31*91f16700Schasinglulu void bl2_el3_early_platform_setup(u_register_t x0, u_register_t x1, 32*91f16700Schasinglulu u_register_t x2, u_register_t x3) 33*91f16700Schasinglulu { 34*91f16700Schasinglulu uniphier_soc = uniphier_get_soc_id(); 35*91f16700Schasinglulu if (uniphier_soc == UNIPHIER_SOC_UNKNOWN) 36*91f16700Schasinglulu plat_error_handler(-ENOTSUP); 37*91f16700Schasinglulu 38*91f16700Schasinglulu uniphier_console_setup(uniphier_soc); 39*91f16700Schasinglulu } 40*91f16700Schasinglulu 41*91f16700Schasinglulu void bl2_el3_plat_arch_setup(void) 42*91f16700Schasinglulu { 43*91f16700Schasinglulu int skip_scp = 0; 44*91f16700Schasinglulu int ret; 45*91f16700Schasinglulu 46*91f16700Schasinglulu uniphier_mmap_setup(uniphier_soc); 47*91f16700Schasinglulu 48*91f16700Schasinglulu /* add relocation offset (run-time-address - link-address) */ 49*91f16700Schasinglulu uniphier_mem_base += BL_CODE_BASE - BL2_BASE; 50*91f16700Schasinglulu 51*91f16700Schasinglulu ret = uniphier_io_setup(uniphier_soc, uniphier_mem_base); 52*91f16700Schasinglulu if (ret) { 53*91f16700Schasinglulu ERROR("failed to setup io devices\n"); 54*91f16700Schasinglulu plat_error_handler(ret); 55*91f16700Schasinglulu } 56*91f16700Schasinglulu 57*91f16700Schasinglulu switch (uniphier_get_boot_master(uniphier_soc)) { 58*91f16700Schasinglulu case UNIPHIER_BOOT_MASTER_THIS: 59*91f16700Schasinglulu INFO("Booting from this SoC\n"); 60*91f16700Schasinglulu skip_scp = 1; 61*91f16700Schasinglulu break; 62*91f16700Schasinglulu case UNIPHIER_BOOT_MASTER_SCP: 63*91f16700Schasinglulu INFO("Booting from on-chip SCP\n"); 64*91f16700Schasinglulu if (uniphier_scp_is_running()) { 65*91f16700Schasinglulu INFO("SCP is already running. SCP_BL2 load will be skipped.\n"); 66*91f16700Schasinglulu skip_scp = 1; 67*91f16700Schasinglulu } 68*91f16700Schasinglulu 69*91f16700Schasinglulu /* 70*91f16700Schasinglulu * SCP must be kicked every time even if it is already running 71*91f16700Schasinglulu * because it polls this event after the reboot of the backend. 72*91f16700Schasinglulu */ 73*91f16700Schasinglulu uniphier_bl2_kick_scp = 1; 74*91f16700Schasinglulu break; 75*91f16700Schasinglulu case UNIPHIER_BOOT_MASTER_EXT: 76*91f16700Schasinglulu INFO("Booting from external SCP\n"); 77*91f16700Schasinglulu skip_scp = 1; 78*91f16700Schasinglulu break; 79*91f16700Schasinglulu default: 80*91f16700Schasinglulu plat_error_handler(-ENOTSUP); 81*91f16700Schasinglulu break; 82*91f16700Schasinglulu } 83*91f16700Schasinglulu 84*91f16700Schasinglulu if (skip_scp) { 85*91f16700Schasinglulu struct image_info *image_info; 86*91f16700Schasinglulu 87*91f16700Schasinglulu image_info = uniphier_get_image_info(SCP_BL2_IMAGE_ID); 88*91f16700Schasinglulu image_info->h.attr |= IMAGE_ATTRIB_SKIP_LOADING; 89*91f16700Schasinglulu } 90*91f16700Schasinglulu } 91*91f16700Schasinglulu 92*91f16700Schasinglulu void bl2_platform_setup(void) 93*91f16700Schasinglulu { 94*91f16700Schasinglulu } 95*91f16700Schasinglulu 96*91f16700Schasinglulu void plat_flush_next_bl_params(void) 97*91f16700Schasinglulu { 98*91f16700Schasinglulu flush_bl_params_desc(); 99*91f16700Schasinglulu } 100*91f16700Schasinglulu 101*91f16700Schasinglulu bl_load_info_t *plat_get_bl_image_load_info(void) 102*91f16700Schasinglulu { 103*91f16700Schasinglulu return get_bl_load_info_from_mem_params_desc(); 104*91f16700Schasinglulu } 105*91f16700Schasinglulu 106*91f16700Schasinglulu bl_params_t *plat_get_next_bl_params(void) 107*91f16700Schasinglulu { 108*91f16700Schasinglulu return get_next_bl_params_from_mem_params_desc(); 109*91f16700Schasinglulu } 110*91f16700Schasinglulu 111*91f16700Schasinglulu void bl2_plat_preload_setup(void) 112*91f16700Schasinglulu { 113*91f16700Schasinglulu #ifdef UNIPHIER_DECOMPRESS_GZIP 114*91f16700Schasinglulu uintptr_t buf_base = uniphier_mem_base + UNIPHIER_IMAGE_BUF_OFFSET; 115*91f16700Schasinglulu int ret; 116*91f16700Schasinglulu 117*91f16700Schasinglulu ret = mmap_add_dynamic_region(buf_base, buf_base, 118*91f16700Schasinglulu UNIPHIER_IMAGE_BUF_SIZE, 119*91f16700Schasinglulu MT_MEMORY | MT_RW | MT_NS); 120*91f16700Schasinglulu if (ret) 121*91f16700Schasinglulu plat_error_handler(ret); 122*91f16700Schasinglulu 123*91f16700Schasinglulu image_decompress_init(buf_base, UNIPHIER_IMAGE_BUF_SIZE, gunzip); 124*91f16700Schasinglulu #endif 125*91f16700Schasinglulu 126*91f16700Schasinglulu uniphier_init_image_descs(uniphier_mem_base); 127*91f16700Schasinglulu } 128*91f16700Schasinglulu 129*91f16700Schasinglulu int bl2_plat_handle_pre_image_load(unsigned int image_id) 130*91f16700Schasinglulu { 131*91f16700Schasinglulu struct image_info *image_info; 132*91f16700Schasinglulu int ret; 133*91f16700Schasinglulu 134*91f16700Schasinglulu image_info = uniphier_get_image_info(image_id); 135*91f16700Schasinglulu 136*91f16700Schasinglulu ret = mmap_add_dynamic_region(image_info->image_base, 137*91f16700Schasinglulu image_info->image_base, 138*91f16700Schasinglulu image_info->image_max_size, 139*91f16700Schasinglulu MT_MEMORY | MT_RW | MT_NS); 140*91f16700Schasinglulu if (ret) 141*91f16700Schasinglulu return ret; 142*91f16700Schasinglulu 143*91f16700Schasinglulu #ifdef UNIPHIER_DECOMPRESS_GZIP 144*91f16700Schasinglulu image_decompress_prepare(image_info); 145*91f16700Schasinglulu #endif 146*91f16700Schasinglulu return 0; 147*91f16700Schasinglulu } 148*91f16700Schasinglulu 149*91f16700Schasinglulu int bl2_plat_handle_post_image_load(unsigned int image_id) 150*91f16700Schasinglulu { 151*91f16700Schasinglulu struct image_info *image_info = uniphier_get_image_info(image_id); 152*91f16700Schasinglulu #ifdef UNIPHIER_DECOMPRESS_GZIP 153*91f16700Schasinglulu int ret; 154*91f16700Schasinglulu 155*91f16700Schasinglulu if (!(image_info->h.attr & IMAGE_ATTRIB_SKIP_LOADING)) { 156*91f16700Schasinglulu ret = image_decompress(uniphier_get_image_info(image_id)); 157*91f16700Schasinglulu if (ret) 158*91f16700Schasinglulu return ret; 159*91f16700Schasinglulu } 160*91f16700Schasinglulu #endif 161*91f16700Schasinglulu 162*91f16700Schasinglulu if (image_id == SCP_BL2_IMAGE_ID && uniphier_bl2_kick_scp) 163*91f16700Schasinglulu uniphier_scp_start(image_info->image_base); 164*91f16700Schasinglulu 165*91f16700Schasinglulu return 0; 166*91f16700Schasinglulu } 167