1// SPDX-License-Identifier: GPL-2.0 2/* 3 * K3: Security functions 4 * 5 * Copyright (C) 2018 Texas Instruments Incorporated - http://www.ti.com/ 6 * Andrew F. Davis <afd@ti.com> 7 */ 8 9#include <common.h> 10#include <cpu_func.h> 11#include <dm.h> 12#include <hang.h> 13#include <image.h> 14#include <log.h> 15#include <asm/cache.h> 16#include <linux/soc/ti/ti_sci_protocol.h> 17#include <mach/spl.h> 18#include <spl.h> 19#include <asm/arch/sys_proto.h> 20 21void board_fit_image_post_process(void **p_image, size_t *p_size) 22{ 23 struct ti_sci_handle *ti_sci = get_ti_sci_handle(); 24 struct ti_sci_proc_ops *proc_ops = &ti_sci->ops.proc_ops; 25 u64 image_addr; 26 u32 image_size; 27 int ret; 28 29 image_addr = (uintptr_t)*p_image; 30 image_size = *p_size; 31 32 debug("Authenticating image at address 0x%016llx\n", image_addr); 33 debug("Authenticating image of size %d bytes\n", image_size); 34 35 flush_dcache_range((unsigned long)image_addr, 36 ALIGN((unsigned long)image_addr + image_size, 37 ARCH_DMA_MINALIGN)); 38 39 /* Authenticate image */ 40 ret = proc_ops->proc_auth_boot_image(ti_sci, &image_addr, &image_size); 41 if (ret) { 42 printf("Authentication failed!\n"); 43 hang(); 44 } 45 46 if (image_size) 47 invalidate_dcache_range((unsigned long)image_addr, 48 ALIGN((unsigned long)image_addr + 49 image_size, ARCH_DMA_MINALIGN)); 50 51 /* 52 * The image_size returned may be 0 when the authentication process has 53 * moved the image. When this happens no further processing on the 54 * image is needed or often even possible as it may have also been 55 * placed behind a firewall when moved. 56 */ 57 *p_size = image_size; 58 59 /* 60 * Output notification of successful authentication to re-assure the 61 * user that the secure code is being processed as expected. However 62 * suppress any such log output in case of building for SPL and booting 63 * via YMODEM. This is done to avoid disturbing the YMODEM serial 64 * protocol transactions. 65 */ 66 if (!(IS_ENABLED(CONFIG_SPL_BUILD) && 67 IS_ENABLED(CONFIG_SPL_YMODEM_SUPPORT) && 68 spl_boot_device() == BOOT_DEVICE_UART)) 69 printf("Authentication passed\n"); 70} 71