1c7e9729dSAlejandro Lucero /* SPDX-License-Identifier: BSD-3-Clause 2c7e9729dSAlejandro Lucero * Copyright(c) 2018 Netronome Systems, Inc. 3c7e9729dSAlejandro Lucero * All rights reserved. 4c7e9729dSAlejandro Lucero */ 5c7e9729dSAlejandro Lucero 6c7e9729dSAlejandro Lucero #ifndef __NFP_MIP_H__ 7c7e9729dSAlejandro Lucero #define __NFP_MIP_H__ 8c7e9729dSAlejandro Lucero 9a68914baSChaoyong He #include "nfp_cpp.h" 10c7e9729dSAlejandro Lucero 11*c82ca09cSPeng Zhang /* "MIP\0" */ 12*c82ca09cSPeng Zhang #define NFP_MIP_SIGNATURE rte_cpu_to_le_32(0x0050494d) 13*c82ca09cSPeng Zhang #define NFP_MIP_VERSION rte_cpu_to_le_32(1) 14*c82ca09cSPeng Zhang 15*c82ca09cSPeng Zhang /* nfp_mip_entry_type */ 16*c82ca09cSPeng Zhang #define NFP_MIP_TYPE_FWINFO 0x70000002 17*c82ca09cSPeng Zhang 18*c82ca09cSPeng Zhang /* Each packed struct field is stored as Little Endian */ 19*c82ca09cSPeng Zhang struct nfp_mip { 20*c82ca09cSPeng Zhang rte_le32_t signature; 21*c82ca09cSPeng Zhang rte_le32_t mip_version; 22*c82ca09cSPeng Zhang 23*c82ca09cSPeng Zhang rte_le32_t mip_size; 24*c82ca09cSPeng Zhang rte_le32_t first_entry; 25*c82ca09cSPeng Zhang 26*c82ca09cSPeng Zhang rte_le32_t version; 27*c82ca09cSPeng Zhang rte_le32_t buildnum; 28*c82ca09cSPeng Zhang rte_le32_t buildtime; 29*c82ca09cSPeng Zhang rte_le32_t loadtime; 30*c82ca09cSPeng Zhang 31*c82ca09cSPeng Zhang rte_le32_t symtab_addr; 32*c82ca09cSPeng Zhang rte_le32_t symtab_size; 33*c82ca09cSPeng Zhang rte_le32_t strtab_addr; 34*c82ca09cSPeng Zhang rte_le32_t strtab_size; 35*c82ca09cSPeng Zhang 36*c82ca09cSPeng Zhang char name[16]; 37*c82ca09cSPeng Zhang char toolchain[32]; 38*c82ca09cSPeng Zhang }; 39*c82ca09cSPeng Zhang 40*c82ca09cSPeng Zhang struct nfp_mip_entry { 41*c82ca09cSPeng Zhang uint32_t type; 42*c82ca09cSPeng Zhang uint32_t version; 43*c82ca09cSPeng Zhang uint32_t offset_next; 44*c82ca09cSPeng Zhang }; 45*c82ca09cSPeng Zhang 46*c82ca09cSPeng Zhang /* 47*c82ca09cSPeng Zhang * A key-value pair has no imposed limit, but it is recommended that 48*c82ca09cSPeng Zhang * consumers only allocate enough memory for keys they plan to process and 49*c82ca09cSPeng Zhang * skip over unused keys or ignore values that are longer than expected. 50*c82ca09cSPeng Zhang * 51*c82ca09cSPeng Zhang * For MIPv1, this will be preceded by struct nfp_mip_entry. 52*c82ca09cSPeng Zhang * The entry size will be the size of key_value_strs, round to the next 53*c82ca09cSPeng Zhang * 4-byte multiple. If entry size is 0, then there are no key-value strings 54*c82ca09cSPeng Zhang * and it will not contain an empty string. 55*c82ca09cSPeng Zhang * 56*c82ca09cSPeng Zhang * The following keys are reserved and possibly set by the linker. The 57*c82ca09cSPeng Zhang * convention is to start linker-set keys with a capital letter. Reserved 58*c82ca09cSPeng Zhang * entries will be placed first in key_value_strs, user entries will be 59*c82ca09cSPeng Zhang * placed next and be sorted alphabetically. 60*c82ca09cSPeng Zhang * TypeId - Present if a user specified fw_typeid when linking. 61*c82ca09cSPeng Zhang * 62*c82ca09cSPeng Zhang * The following keys are reserved, but not used. Their values are in the 63*c82ca09cSPeng Zhang * root MIP struct. 64*c82ca09cSPeng Zhang */ 65*c82ca09cSPeng Zhang struct nfp_mip_fwinfo_entry { 66*c82ca09cSPeng Zhang /** The byte size of @p key_value_strs. */ 67*c82ca09cSPeng Zhang uint32_t kv_len; 68*c82ca09cSPeng Zhang 69*c82ca09cSPeng Zhang /** The number of key-value pairs in the following string. */ 70*c82ca09cSPeng Zhang uint32_t num; 71*c82ca09cSPeng Zhang 72*c82ca09cSPeng Zhang /** 73*c82ca09cSPeng Zhang * A series of NUL terminated strings, terminated by an extra 74*c82ca09cSPeng Zhang * NUL which is also the last byte of the entry, so an iterator 75*c82ca09cSPeng Zhang * can either check on size or when key[0] == '\0'. 76*c82ca09cSPeng Zhang */ 77*c82ca09cSPeng Zhang char key_value_strs[]; 78*c82ca09cSPeng Zhang }; 79c7e9729dSAlejandro Lucero 80c7e9729dSAlejandro Lucero struct nfp_mip *nfp_mip_open(struct nfp_cpp *cpp); 81c7e9729dSAlejandro Lucero void nfp_mip_close(struct nfp_mip *mip); 82c7e9729dSAlejandro Lucero 83c7e9729dSAlejandro Lucero const char *nfp_mip_name(const struct nfp_mip *mip); 84*c82ca09cSPeng Zhang uint32_t nfp_mip_fw_version(const struct nfp_mip *mip); 85c7e9729dSAlejandro Lucero void nfp_mip_symtab(const struct nfp_mip *mip, uint32_t *addr, uint32_t *size); 86c7e9729dSAlejandro Lucero void nfp_mip_strtab(const struct nfp_mip *mip, uint32_t *addr, uint32_t *size); 87f842b01aSChaoyong He 882cd8817aSChaoyong He #endif /* __NFP_MIP_H__ */ 89