xref: /arm-trusted-firmware/drivers/arm/ethosn/ethosn_big_fw.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2023, Arm Limited. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #include <common/debug.h>
8*91f16700Schasinglulu 
9*91f16700Schasinglulu #include "ethosn_big_fw.h"
10*91f16700Schasinglulu 
11*91f16700Schasinglulu /* Magic (FourCC) number to identify the big firmware binary */
12*91f16700Schasinglulu #define ETHOSN_BIG_FW_MAGIC	('E' | ('N' << 8) | ('F' << 16) | ('W' << 24))
13*91f16700Schasinglulu 
14*91f16700Schasinglulu /* Supported big firmware version */
15*91f16700Schasinglulu #define ETHOSN_BIG_FW_VERSION_MAJOR	15
16*91f16700Schasinglulu 
17*91f16700Schasinglulu #define ETHOSN_ARCH_VER_MAJOR_MASK	U(0xF000)
18*91f16700Schasinglulu #define ETHOSN_ARCH_VER_MAJOR_SHIFT	U(0xC)
19*91f16700Schasinglulu #define ETHOSN_ARCH_VER_MINOR_MASK	U(0xF00)
20*91f16700Schasinglulu #define ETHOSN_ARCH_VER_MINOR_SHIFT	U(0x8)
21*91f16700Schasinglulu #define ETHOSN_ARCH_VER_REV_MASK	U(0xFF)
22*91f16700Schasinglulu 
23*91f16700Schasinglulu /* Convert Arm(R) Ethos(TM)-N NPU architecture version to big firmware format */
24*91f16700Schasinglulu #define ETHOSN_BIG_FW_FORMAT_ARCH_VER(arch_ver)					 \
25*91f16700Schasinglulu 	(arch_ver & ETHOSN_ARCH_VER_MAJOR_MASK) << ETHOSN_ARCH_VER_MAJOR_SHIFT | \
26*91f16700Schasinglulu 	(arch_ver & ETHOSN_ARCH_VER_MINOR_MASK) << ETHOSN_ARCH_VER_MINOR_SHIFT | \
27*91f16700Schasinglulu 	(arch_ver & ETHOSN_ARCH_VER_REV_MASK)
28*91f16700Schasinglulu 
29*91f16700Schasinglulu 
30*91f16700Schasinglulu bool ethosn_big_fw_verify_header(const struct ethosn_big_fw *big_fw,
31*91f16700Schasinglulu 				 uint32_t npu_arch_ver)
32*91f16700Schasinglulu {
33*91f16700Schasinglulu 	const uint32_t arch_ver = ETHOSN_BIG_FW_FORMAT_ARCH_VER(npu_arch_ver);
34*91f16700Schasinglulu 
35*91f16700Schasinglulu 	if (big_fw->fw_magic != ETHOSN_BIG_FW_MAGIC) {
36*91f16700Schasinglulu 		ERROR("ETHOSN: Unable to find firmware. Invalid magic value: 0x%02x\n",
37*91f16700Schasinglulu 		      big_fw->fw_magic);
38*91f16700Schasinglulu 
39*91f16700Schasinglulu 		return false;
40*91f16700Schasinglulu 	}
41*91f16700Schasinglulu 
42*91f16700Schasinglulu 	if (big_fw->fw_ver_major != ETHOSN_BIG_FW_VERSION_MAJOR) {
43*91f16700Schasinglulu 		ERROR("ETHOSN: Unsupported firmware version: %u.%u.%u. Expected Version %u.x.x.\n",
44*91f16700Schasinglulu 		      big_fw->fw_ver_major, big_fw->fw_ver_minor,
45*91f16700Schasinglulu 		      big_fw->fw_ver_patch, ETHOSN_BIG_FW_VERSION_MAJOR);
46*91f16700Schasinglulu 
47*91f16700Schasinglulu 		return false;
48*91f16700Schasinglulu 	}
49*91f16700Schasinglulu 
50*91f16700Schasinglulu 	if (big_fw->arch_min > arch_ver || arch_ver > big_fw->arch_max) {
51*91f16700Schasinglulu 		ERROR("ETHOSN: Firmware is not compatbile with architecture version: 0x%02x\n",
52*91f16700Schasinglulu 		      npu_arch_ver);
53*91f16700Schasinglulu 		return false;
54*91f16700Schasinglulu 	}
55*91f16700Schasinglulu 
56*91f16700Schasinglulu 	return true;
57*91f16700Schasinglulu }
58