xref: /dpdk/drivers/net/nfp/nfpcore/nfp_mip.h (revision c82ca09c441c4b42f3984d5f6d5fa1b6bfa0a1cd)
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