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