1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /****************************************************************************
3  * Driver for AMD network controllers and boards
4  * Copyright (C) 2025, Advanced Micro Devices, Inc.
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU General Public License version 2 as published
8  * by the Free Software Foundation, incorporated herein by reference.
9  */
10 
11 #ifndef _EFX_FW_FORMATS_H
12 #define _EFX_FW_FORMATS_H
13 
14 /* Header layouts of firmware update images recognised by Efx NICs.
15  * The sources-of-truth for these layouts are AMD internal documents
16  * and sfregistry headers, neither of which are available externally
17  * nor usable directly by the driver.
18  *
19  * While each format includes a 'magic number', these are at different
20  * offsets in the various formats, and a legal header for one format
21  * could have the right value in whichever field occupies that offset
22  * to match another format's magic.
23  * Besides, some packaging formats (such as CMS/PKCS#7 signed images)
24  * prepend a header for which finding the size is a non-trivial task;
25  * rather than trying to parse those headers, we search byte-by-byte
26  * through the provided firmware image looking for a valid header.
27  * Thus, format recognition has to include validation of the checksum
28  * field, even though the firmware will validate that itself before
29  * applying the image.
30  */
31 
32 /* EF10 (Medford2, X2) "reflash" header format.  Defined in SF-121352-AN */
33 #define EFX_REFLASH_HEADER_MAGIC_OFST 0
34 #define EFX_REFLASH_HEADER_MAGIC_LEN 4
35 #define EFX_REFLASH_HEADER_MAGIC_VALUE 0x106F1A5
36 
37 #define EFX_REFLASH_HEADER_VERSION_OFST 4
38 #define EFX_REFLASH_HEADER_VERSION_LEN 4
39 #define EFX_REFLASH_HEADER_VERSION_VALUE 4
40 
41 #define EFX_REFLASH_HEADER_FIRMWARE_TYPE_OFST 8
42 #define EFX_REFLASH_HEADER_FIRMWARE_TYPE_LEN 4
43 #define EFX_REFLASH_FIRMWARE_TYPE_BOOTROM 0x2
44 #define EFX_REFLASH_FIRMWARE_TYPE_BUNDLE 0xd
45 
46 #define EFX_REFLASH_HEADER_FIRMWARE_SUBTYPE_OFST 12
47 #define EFX_REFLASH_HEADER_FIRMWARE_SUBTYPE_LEN 4
48 
49 #define EFX_REFLASH_HEADER_PAYLOAD_SIZE_OFST 16
50 #define EFX_REFLASH_HEADER_PAYLOAD_SIZE_LEN 4
51 
52 #define EFX_REFLASH_HEADER_LENGTH_OFST 20
53 #define EFX_REFLASH_HEADER_LENGTH_LEN 4
54 
55 /* Reflash trailer */
56 #define EFX_REFLASH_TRAILER_CRC_OFST 0
57 #define EFX_REFLASH_TRAILER_CRC_LEN 4
58 
59 #define EFX_REFLASH_TRAILER_LEN	\
60 	(EFX_REFLASH_TRAILER_CRC_OFST + EFX_REFLASH_TRAILER_CRC_LEN)
61 
62 /* EF100 "SmartNIC image" header format.
63  * Defined in sfregistry "src/layout/snic_image_hdr.h".
64  */
65 #define EFX_SNICIMAGE_HEADER_MAGIC_OFST 16
66 #define EFX_SNICIMAGE_HEADER_MAGIC_LEN 4
67 #define EFX_SNICIMAGE_HEADER_MAGIC_VALUE 0x541C057A
68 
69 #define EFX_SNICIMAGE_HEADER_VERSION_OFST 20
70 #define EFX_SNICIMAGE_HEADER_VERSION_LEN 4
71 #define EFX_SNICIMAGE_HEADER_VERSION_VALUE 1
72 
73 #define EFX_SNICIMAGE_HEADER_LENGTH_OFST 24
74 #define EFX_SNICIMAGE_HEADER_LENGTH_LEN 4
75 
76 #define EFX_SNICIMAGE_HEADER_PARTITION_TYPE_OFST 36
77 #define EFX_SNICIMAGE_HEADER_PARTITION_TYPE_LEN 4
78 
79 #define EFX_SNICIMAGE_HEADER_PARTITION_SUBTYPE_OFST 40
80 #define EFX_SNICIMAGE_HEADER_PARTITION_SUBTYPE_LEN 4
81 
82 #define EFX_SNICIMAGE_HEADER_PAYLOAD_SIZE_OFST 60
83 #define EFX_SNICIMAGE_HEADER_PAYLOAD_SIZE_LEN 4
84 
85 #define EFX_SNICIMAGE_HEADER_CRC_OFST 64
86 #define EFX_SNICIMAGE_HEADER_CRC_LEN 4
87 
88 #define EFX_SNICIMAGE_HEADER_MINLEN 256
89 
90 /* EF100 "SmartNIC bundle" header format.  Defined in SF-122606-TC */
91 #define EFX_SNICBUNDLE_HEADER_MAGIC_OFST 0
92 #define EFX_SNICBUNDLE_HEADER_MAGIC_LEN 4
93 #define EFX_SNICBUNDLE_HEADER_MAGIC_VALUE 0xB1001001
94 
95 #define EFX_SNICBUNDLE_HEADER_VERSION_OFST 4
96 #define EFX_SNICBUNDLE_HEADER_VERSION_LEN 4
97 #define EFX_SNICBUNDLE_HEADER_VERSION_VALUE 1
98 
99 #define EFX_SNICBUNDLE_HEADER_BUNDLE_TYPE_OFST 8
100 #define EFX_SNICBUNDLE_HEADER_BUNDLE_TYPE_LEN 4
101 
102 #define EFX_SNICBUNDLE_HEADER_BUNDLE_SUBTYPE_OFST 12
103 #define EFX_SNICBUNDLE_HEADER_BUNDLE_SUBTYPE_LEN 4
104 
105 #define EFX_SNICBUNDLE_HEADER_LENGTH_OFST 20
106 #define EFX_SNICBUNDLE_HEADER_LENGTH_LEN 4
107 
108 #define EFX_SNICBUNDLE_HEADER_CRC_OFST 224
109 #define EFX_SNICBUNDLE_HEADER_CRC_LEN 4
110 
111 #define EFX_SNICBUNDLE_HEADER_LEN	\
112 	(EFX_SNICBUNDLE_HEADER_CRC_OFST + EFX_SNICBUNDLE_HEADER_CRC_LEN)
113 
114 #endif /* _EFX_FW_FORMATS_H */
115