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