1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
/* SPDX-License-Identifier: GPL-2.0 */
/* Copyright (c) Meta Platforms, Inc. and affiliates. */
#ifndef _FBNIC_FW_H_
#define _FBNIC_FW_H_
#include <linux/if_ether.h>
#include <linux/types.h>
struct fbnic_dev;
struct fbnic_tlv_msg;
struct fbnic_fw_mbx {
u8 ready, head, tail;
struct {
struct fbnic_tlv_msg *msg;
dma_addr_t addr;
} buf_info[FBNIC_IPC_MBX_DESC_LEN];
};
// FW_VER_MAX_SIZE must match ETHTOOL_FWVERS_LEN
#define FBNIC_FW_VER_MAX_SIZE 32
// Formatted version is in the format XX.YY.ZZ_RRR_COMMIT
#define FBNIC_FW_CAP_RESP_COMMIT_MAX_SIZE (FBNIC_FW_VER_MAX_SIZE - 13)
#define FBNIC_FW_LOG_MAX_SIZE 256
struct fbnic_fw_ver {
u32 version;
char commit[FBNIC_FW_CAP_RESP_COMMIT_MAX_SIZE];
};
struct fbnic_fw_cap {
struct {
struct fbnic_fw_ver mgmt, bootloader;
} running;
struct {
struct fbnic_fw_ver mgmt, bootloader, undi;
} stored;
u8 active_slot;
u8 bmc_mac_addr[4][ETH_ALEN];
u8 bmc_present : 1;
u8 all_multi : 1;
u8 link_speed;
u8 link_fec;
};
struct fbnic_fw_completion {
struct {
s32 millivolts;
s32 millidegrees;
} tsene;
};
void fbnic_mbx_init(struct fbnic_dev *fbd);
void fbnic_mbx_clean(struct fbnic_dev *fbd);
void fbnic_mbx_poll(struct fbnic_dev *fbd);
int fbnic_mbx_poll_tx_ready(struct fbnic_dev *fbd);
void fbnic_mbx_flush_tx(struct fbnic_dev *fbd);
int fbnic_fw_xmit_ownership_msg(struct fbnic_dev *fbd, bool take_ownership);
int fbnic_fw_init_heartbeat(struct fbnic_dev *fbd, bool poll);
void fbnic_fw_check_heartbeat(struct fbnic_dev *fbd);
#define fbnic_mk_full_fw_ver_str(_rev_id, _delim, _commit, _str, _str_sz) \
do { \
const u32 __rev_id = _rev_id; \
snprintf(_str, _str_sz, "%02lu.%02lu.%02lu-%03lu%s%s", \
FIELD_GET(FBNIC_FW_CAP_RESP_VERSION_MAJOR, __rev_id), \
FIELD_GET(FBNIC_FW_CAP_RESP_VERSION_MINOR, __rev_id), \
FIELD_GET(FBNIC_FW_CAP_RESP_VERSION_PATCH, __rev_id), \
FIELD_GET(FBNIC_FW_CAP_RESP_VERSION_BUILD, __rev_id), \
_delim, _commit); \
} while (0)
#define fbnic_mk_fw_ver_str(_rev_id, _str) \
fbnic_mk_full_fw_ver_str(_rev_id, "", "", _str, sizeof(_str))
#define FW_HEARTBEAT_PERIOD (10 * HZ)
enum {
FBNIC_TLV_MSG_ID_HOST_CAP_REQ = 0x10,
FBNIC_TLV_MSG_ID_FW_CAP_RESP = 0x11,
FBNIC_TLV_MSG_ID_OWNERSHIP_REQ = 0x12,
FBNIC_TLV_MSG_ID_OWNERSHIP_RESP = 0x13,
FBNIC_TLV_MSG_ID_HEARTBEAT_REQ = 0x14,
FBNIC_TLV_MSG_ID_HEARTBEAT_RESP = 0x15,
};
#define FBNIC_FW_CAP_RESP_VERSION_MAJOR CSR_GENMASK(31, 24)
#define FBNIC_FW_CAP_RESP_VERSION_MINOR CSR_GENMASK(23, 16)
#define FBNIC_FW_CAP_RESP_VERSION_PATCH CSR_GENMASK(15, 8)
#define FBNIC_FW_CAP_RESP_VERSION_BUILD CSR_GENMASK(7, 0)
enum {
FBNIC_FW_CAP_RESP_VERSION = 0x0,
FBNIC_FW_CAP_RESP_BMC_PRESENT = 0x1,
FBNIC_FW_CAP_RESP_BMC_MAC_ADDR = 0x2,
FBNIC_FW_CAP_RESP_BMC_MAC_ARRAY = 0x3,
FBNIC_FW_CAP_RESP_STORED_VERSION = 0x4,
FBNIC_FW_CAP_RESP_ACTIVE_FW_SLOT = 0x5,
FBNIC_FW_CAP_RESP_VERSION_COMMIT_STR = 0x6,
FBNIC_FW_CAP_RESP_BMC_ALL_MULTI = 0x8,
FBNIC_FW_CAP_RESP_FW_STATE = 0x9,
FBNIC_FW_CAP_RESP_FW_LINK_SPEED = 0xa,
FBNIC_FW_CAP_RESP_FW_LINK_FEC = 0xb,
FBNIC_FW_CAP_RESP_STORED_COMMIT_STR = 0xc,
FBNIC_FW_CAP_RESP_CMRT_VERSION = 0xd,
FBNIC_FW_CAP_RESP_STORED_CMRT_VERSION = 0xe,
FBNIC_FW_CAP_RESP_CMRT_COMMIT_STR = 0xf,
FBNIC_FW_CAP_RESP_STORED_CMRT_COMMIT_STR = 0x10,
FBNIC_FW_CAP_RESP_UEFI_VERSION = 0x11,
FBNIC_FW_CAP_RESP_UEFI_COMMIT_STR = 0x12,
FBNIC_FW_CAP_RESP_MSG_MAX
};
enum {
FBNIC_FW_LINK_SPEED_25R1 = 1,
FBNIC_FW_LINK_SPEED_50R2 = 2,
FBNIC_FW_LINK_SPEED_50R1 = 3,
FBNIC_FW_LINK_SPEED_100R2 = 4,
};
enum {
FBNIC_FW_LINK_FEC_NONE = 1,
FBNIC_FW_LINK_FEC_RS = 2,
FBNIC_FW_LINK_FEC_BASER = 3,
};
enum {
FBNIC_FW_OWNERSHIP_FLAG = 0x0,
FBNIC_FW_OWNERSHIP_MSG_MAX
};
#endif /* _FBNIC_FW_H_ */
|