12bb3e103SShalom Toledo /* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */
22bb3e103SShalom Toledo /* Copyright (c) 2017-2019 Mellanox Technologies. All rights reserved */
32bb3e103SShalom Toledo 
4410ed13cSYotam Gigi #ifndef _MLXFW_MFA2_FORMAT_H
5410ed13cSYotam Gigi #define _MLXFW_MFA2_FORMAT_H
6410ed13cSYotam Gigi 
7410ed13cSYotam Gigi #include "mlxfw_mfa2_file.h"
8410ed13cSYotam Gigi #include "mlxfw_mfa2_tlv.h"
9410ed13cSYotam Gigi 
10410ed13cSYotam Gigi enum mlxfw_mfa2_tlv_type {
11410ed13cSYotam Gigi 	MLXFW_MFA2_TLV_MULTI_PART = 0x01,
12410ed13cSYotam Gigi 	MLXFW_MFA2_TLV_PACKAGE_DESCRIPTOR = 0x02,
13410ed13cSYotam Gigi 	MLXFW_MFA2_TLV_COMPONENT_DESCRIPTOR = 0x04,
14410ed13cSYotam Gigi 	MLXFW_MFA2_TLV_COMPONENT_PTR = 0x22,
15410ed13cSYotam Gigi 	MLXFW_MFA2_TLV_PSID = 0x2A,
16410ed13cSYotam Gigi };
17410ed13cSYotam Gigi 
18410ed13cSYotam Gigi enum mlxfw_mfa2_compression_type {
19410ed13cSYotam Gigi 	MLXFW_MFA2_COMPRESSION_TYPE_NONE,
20410ed13cSYotam Gigi 	MLXFW_MFA2_COMPRESSION_TYPE_XZ,
21410ed13cSYotam Gigi };
22410ed13cSYotam Gigi 
23410ed13cSYotam Gigi struct mlxfw_mfa2_tlv_package_descriptor {
24410ed13cSYotam Gigi 	__be16 num_components;
25410ed13cSYotam Gigi 	__be16 num_devices;
26410ed13cSYotam Gigi 	__be32 cb_offset;
27410ed13cSYotam Gigi 	__be32 cb_archive_size;
28410ed13cSYotam Gigi 	__be32 cb_size_h;
29410ed13cSYotam Gigi 	__be32 cb_size_l;
30410ed13cSYotam Gigi 	u8 padding[3];
31410ed13cSYotam Gigi 	u8 cv_compression;
32410ed13cSYotam Gigi 	__be32 user_data_offset;
33410ed13cSYotam Gigi } __packed;
34410ed13cSYotam Gigi 
35410ed13cSYotam Gigi MLXFW_MFA2_TLV(package_descriptor, struct mlxfw_mfa2_tlv_package_descriptor,
36410ed13cSYotam Gigi 	       MLXFW_MFA2_TLV_PACKAGE_DESCRIPTOR);
37410ed13cSYotam Gigi 
38410ed13cSYotam Gigi struct mlxfw_mfa2_tlv_multi {
39410ed13cSYotam Gigi 	__be16 num_extensions;
40410ed13cSYotam Gigi 	__be16 total_len;
41410ed13cSYotam Gigi } __packed;
42410ed13cSYotam Gigi 
43410ed13cSYotam Gigi MLXFW_MFA2_TLV(multi, struct mlxfw_mfa2_tlv_multi,
44410ed13cSYotam Gigi 	       MLXFW_MFA2_TLV_MULTI_PART);
45410ed13cSYotam Gigi 
46410ed13cSYotam Gigi struct mlxfw_mfa2_tlv_psid {
47*b1cf7a56SGustavo A. R. Silva 	DECLARE_FLEX_ARRAY(u8, psid);
48410ed13cSYotam Gigi } __packed;
49410ed13cSYotam Gigi 
50410ed13cSYotam Gigi MLXFW_MFA2_TLV_VARSIZE(psid, struct mlxfw_mfa2_tlv_psid,
51410ed13cSYotam Gigi 		       MLXFW_MFA2_TLV_PSID);
52410ed13cSYotam Gigi 
53410ed13cSYotam Gigi struct mlxfw_mfa2_tlv_component_ptr {
54410ed13cSYotam Gigi 	__be16 storage_id;
55410ed13cSYotam Gigi 	__be16 component_index;
56410ed13cSYotam Gigi 	__be32 storage_address;
57410ed13cSYotam Gigi } __packed;
58410ed13cSYotam Gigi 
59410ed13cSYotam Gigi MLXFW_MFA2_TLV(component_ptr, struct mlxfw_mfa2_tlv_component_ptr,
60410ed13cSYotam Gigi 	       MLXFW_MFA2_TLV_COMPONENT_PTR);
61410ed13cSYotam Gigi 
62410ed13cSYotam Gigi struct mlxfw_mfa2_tlv_component_descriptor {
63410ed13cSYotam Gigi 	__be16 pldm_classification;
64410ed13cSYotam Gigi 	__be16 identifier;
65410ed13cSYotam Gigi 	__be32 cb_offset_h;
66410ed13cSYotam Gigi 	__be32 cb_offset_l;
67410ed13cSYotam Gigi 	__be32 size;
68410ed13cSYotam Gigi } __packed;
69410ed13cSYotam Gigi 
70410ed13cSYotam Gigi MLXFW_MFA2_TLV(component_descriptor, struct mlxfw_mfa2_tlv_component_descriptor,
71410ed13cSYotam Gigi 	       MLXFW_MFA2_TLV_COMPONENT_DESCRIPTOR);
72410ed13cSYotam Gigi 
73410ed13cSYotam Gigi #endif
74