xref: /rk3399_ARM-atf/drivers/arm/ethosn/ethosn_big_fw.c (revision 84de50c7d8ca416e504aedb228bb4cab6eed806f)
1313b776fSMikael Olsson /*
2313b776fSMikael Olsson  * Copyright (c) 2023, Arm Limited. All rights reserved.
3313b776fSMikael Olsson  *
4313b776fSMikael Olsson  * SPDX-License-Identifier: BSD-3-Clause
5313b776fSMikael Olsson  */
6313b776fSMikael Olsson 
7313b776fSMikael Olsson #include <common/debug.h>
8313b776fSMikael Olsson 
9313b776fSMikael Olsson #include "ethosn_big_fw.h"
10313b776fSMikael Olsson 
11313b776fSMikael Olsson /* Magic (FourCC) number to identify the big firmware binary */
12313b776fSMikael Olsson #define ETHOSN_BIG_FW_MAGIC	('E' | ('N' << 8) | ('F' << 16) | ('W' << 24))
13313b776fSMikael Olsson 
14313b776fSMikael Olsson /* Supported big firmware version */
15*4796d2d9SRob Hughes #define ETHOSN_BIG_FW_VERSION_MAJOR	15
16313b776fSMikael Olsson 
17313b776fSMikael Olsson #define ETHOSN_ARCH_VER_MAJOR_MASK	U(0xF000)
18313b776fSMikael Olsson #define ETHOSN_ARCH_VER_MAJOR_SHIFT	U(0xC)
19313b776fSMikael Olsson #define ETHOSN_ARCH_VER_MINOR_MASK	U(0xF00)
20313b776fSMikael Olsson #define ETHOSN_ARCH_VER_MINOR_SHIFT	U(0x8)
21313b776fSMikael Olsson #define ETHOSN_ARCH_VER_REV_MASK	U(0xFF)
22313b776fSMikael Olsson 
23313b776fSMikael Olsson /* Convert Arm(R) Ethos(TM)-N NPU architecture version to big firmware format */
24313b776fSMikael Olsson #define ETHOSN_BIG_FW_FORMAT_ARCH_VER(arch_ver)					 \
25313b776fSMikael Olsson 	(arch_ver & ETHOSN_ARCH_VER_MAJOR_MASK) << ETHOSN_ARCH_VER_MAJOR_SHIFT | \
26313b776fSMikael Olsson 	(arch_ver & ETHOSN_ARCH_VER_MINOR_MASK) << ETHOSN_ARCH_VER_MINOR_SHIFT | \
27313b776fSMikael Olsson 	(arch_ver & ETHOSN_ARCH_VER_REV_MASK)
28313b776fSMikael Olsson 
29313b776fSMikael Olsson 
ethosn_big_fw_verify_header(const struct ethosn_big_fw * big_fw,uint32_t npu_arch_ver)30313b776fSMikael Olsson bool ethosn_big_fw_verify_header(const struct ethosn_big_fw *big_fw,
31313b776fSMikael Olsson 				 uint32_t npu_arch_ver)
32313b776fSMikael Olsson {
33313b776fSMikael Olsson 	const uint32_t arch_ver = ETHOSN_BIG_FW_FORMAT_ARCH_VER(npu_arch_ver);
34313b776fSMikael Olsson 
35313b776fSMikael Olsson 	if (big_fw->fw_magic != ETHOSN_BIG_FW_MAGIC) {
36313b776fSMikael Olsson 		ERROR("ETHOSN: Unable to find firmware. Invalid magic value: 0x%02x\n",
37313b776fSMikael Olsson 		      big_fw->fw_magic);
38313b776fSMikael Olsson 
39313b776fSMikael Olsson 		return false;
40313b776fSMikael Olsson 	}
41313b776fSMikael Olsson 
42313b776fSMikael Olsson 	if (big_fw->fw_ver_major != ETHOSN_BIG_FW_VERSION_MAJOR) {
43313b776fSMikael Olsson 		ERROR("ETHOSN: Unsupported firmware version: %u.%u.%u. Expected Version %u.x.x.\n",
44313b776fSMikael Olsson 		      big_fw->fw_ver_major, big_fw->fw_ver_minor,
45313b776fSMikael Olsson 		      big_fw->fw_ver_patch, ETHOSN_BIG_FW_VERSION_MAJOR);
46313b776fSMikael Olsson 
47313b776fSMikael Olsson 		return false;
48313b776fSMikael Olsson 	}
49313b776fSMikael Olsson 
50313b776fSMikael Olsson 	if (big_fw->arch_min > arch_ver || arch_ver > big_fw->arch_max) {
51313b776fSMikael Olsson 		ERROR("ETHOSN: Firmware is not compatbile with architecture version: 0x%02x\n",
52313b776fSMikael Olsson 		      npu_arch_ver);
53313b776fSMikael Olsson 		return false;
54313b776fSMikael Olsson 	}
55313b776fSMikael Olsson 
56313b776fSMikael Olsson 	return true;
57313b776fSMikael Olsson }
58