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 Olssonbool 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