1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2018 Netronome Systems, Inc.
3  * All rights reserved.
4  */
5 
6 #ifndef __NFP_HWINFO_H__
7 #define __NFP_HWINFO_H__
8 
9 #include <inttypes.h>
10 
11 #define HWINFO_SIZE_MIN	0x100
12 
13 /*
14  * The Hardware Info Table defines the properties of the system.
15  *
16  * HWInfo v1 Table (fixed size)
17  *
18  * 0x0000: uint32_t version	        Hardware Info Table version (1.0)
19  * 0x0004: uint32_t size	        Total size of the table, including the
20  *					CRC32 (IEEE 802.3)
21  * 0x0008: uint32_t jumptab	        Offset of key/value table
22  * 0x000c: uint32_t keys	        Total number of keys in the key/value
23  *					table
24  * NNNNNN:				Key/value jump table and string data
25  * (size - 4): uint32_t crc32	CRC32 (same as IEEE 802.3, POSIX csum, etc)
26  *				CRC32("",0) = ~0, CRC32("a",1) = 0x48C279FE
27  *
28  * HWInfo v2 Table (variable size)
29  *
30  * 0x0000: uint32_t version	        Hardware Info Table version (2.0)
31  * 0x0004: uint32_t size	        Current size of the data area, excluding
32  *					CRC32
33  * 0x0008: uint32_t limit	        Maximum size of the table
34  * 0x000c: uint32_t reserved	        Unused, set to zero
35  * NNNNNN:			Key/value data
36  * (size - 4): uint32_t crc32	CRC32 (same as IEEE 802.3, POSIX csum, etc)
37  *				CRC32("",0) = ~0, CRC32("a",1) = 0x48C279FE
38  *
39  * If the HWInfo table is in the process of being updated, the low bit of
40  * version will be set.
41  *
42  * HWInfo v1 Key/Value Table
43  * -------------------------
44  *
45  *  The key/value table is a set of offsets to ASCIIZ strings which have
46  *  been strcmp(3) sorted (yes, please use bsearch(3) on the table).
47  *
48  *  All keys are guaranteed to be unique.
49  *
50  * N+0:	uint32_t key_1		Offset to the first key
51  * N+4:	uint32_t val_1		Offset to the first value
52  * N+8: uint32_t key_2		Offset to the second key
53  * N+c: uint32_t val_2		Offset to the second value
54  * ...
55  *
56  * HWInfo v2 Key/Value Table
57  * -------------------------
58  *
59  * Packed UTF8Z strings, ie 'key1\000value1\000key2\000value2\000'
60  *
61  * Unsorted.
62  */
63 
64 #define NFP_HWINFO_VERSION_1 ('H' << 24 | 'I' << 16 | 1 << 8 | 0 << 1 | 0)
65 #define NFP_HWINFO_VERSION_2 ('H' << 24 | 'I' << 16 | 2 << 8 | 0 << 1 | 0)
66 #define NFP_HWINFO_VERSION_UPDATING	BIT(0)
67 
68 struct nfp_hwinfo {
69 	uint8_t start[0];
70 
71 	uint32_t version;
72 	uint32_t size;
73 
74 	/* v2 specific fields */
75 	uint32_t limit;
76 	uint32_t resv;
77 
78 	char data[];
79 };
80 
81 struct nfp_hwinfo *nfp_hwinfo_read(struct nfp_cpp *cpp);
82 
83 const char *nfp_hwinfo_lookup(struct nfp_hwinfo *hwinfo, const char *lookup);
84 
85 #endif
86