Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

octeon_ep: Add control plane host and firmware versions.

Implement control plane mailbox versions for host and firmware.
Versions are published in info area of control mailbox bar4
memory structure.Firmware will publish minimum and maximum
supported versions.Control plane mailbox apis will check for
firmware version before sending any control commands to firmware.
Notifications from firmware will similarly be checked for host
version compatibility.

Signed-off-by: Sathesh Edara <sedara@marvell.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Sathesh Edara and committed by
David S. Miller
a20b4c5f 12aa0a3b

+64 -3
+11
drivers/net/ethernet/marvell/octeon_ep/octep_cp_version.h
··· 1 + /* SPDX-License-Identifier: BSD-3-Clause 2 + * Copyright (c) 2022 Marvell. 3 + */ 4 + #ifndef __OCTEP_CP_VERSION_H__ 5 + #define __OCTEP_CP_VERSION_H__ 6 + 7 + #define OCTEP_CP_VERSION(a, b, c) ((((a) & 0xff) << 16) + \ 8 + (((b) & 0xff) << 8) + \ 9 + ((c) & 0xff)) 10 + 11 + #endif /* __OCTEP_CP_VERSION_H__ */
+8 -1
drivers/net/ethernet/marvell/octeon_ep/octep_ctrl_mbox.c
··· 37 37 38 38 #define OCTEP_CTRL_MBOX_INFO_MAGIC_NUM(m) (m) 39 39 #define OCTEP_CTRL_MBOX_INFO_BARMEM_SZ(m) ((m) + 8) 40 + #define OCTEP_CTRL_MBOX_INFO_HOST_VERSION(m) ((m) + 16) 40 41 #define OCTEP_CTRL_MBOX_INFO_HOST_STATUS(m) ((m) + 24) 42 + #define OCTEP_CTRL_MBOX_INFO_FW_VERSION(m) ((m) + 136) 41 43 #define OCTEP_CTRL_MBOX_INFO_FW_STATUS(m) ((m) + 144) 42 44 43 45 #define OCTEP_CTRL_MBOX_H2FQ_INFO(m) ((m) + OCTEP_CTRL_MBOX_INFO_SZ) ··· 73 71 74 72 int octep_ctrl_mbox_init(struct octep_ctrl_mbox *mbox) 75 73 { 76 - u64 magic_num, status; 74 + u64 magic_num, status, fw_versions; 77 75 78 76 if (!mbox) 79 77 return -EINVAL; ··· 95 93 return -EINVAL; 96 94 } 97 95 96 + fw_versions = readq(OCTEP_CTRL_MBOX_INFO_FW_VERSION(mbox->barmem)); 97 + mbox->min_fw_version = ((fw_versions & 0xffffffff00000000ull) >> 32); 98 + mbox->max_fw_version = (fw_versions & 0xffffffff); 98 99 mbox->barmem_sz = readl(OCTEP_CTRL_MBOX_INFO_BARMEM_SZ(mbox->barmem)); 99 100 100 101 writeq(OCTEP_CTRL_MBOX_STATUS_INIT, ··· 118 113 OCTEP_CTRL_MBOX_TOTAL_INFO_SZ + 119 114 mbox->h2fq.sz; 120 115 116 + writeq(mbox->version, OCTEP_CTRL_MBOX_INFO_HOST_VERSION(mbox->barmem)); 121 117 /* ensure ready state is seen after everything is initialized */ 122 118 wmb(); 123 119 writeq(OCTEP_CTRL_MBOX_STATUS_READY, ··· 264 258 if (!mbox->barmem) 265 259 return -EINVAL; 266 260 261 + writeq(0, OCTEP_CTRL_MBOX_INFO_HOST_VERSION(mbox->barmem)); 267 262 writeq(OCTEP_CTRL_MBOX_STATUS_INVALID, 268 263 OCTEP_CTRL_MBOX_INFO_HOST_STATUS(mbox->barmem)); 269 264 /* ensure uninit state is written before uninitialization */
+6
drivers/net/ethernet/marvell/octeon_ep/octep_ctrl_mbox.h
··· 121 121 }; 122 122 123 123 struct octep_ctrl_mbox { 124 + /* control plane version */ 125 + u64 version; 124 126 /* size of bar memory */ 125 127 u32 barmem_sz; 126 128 /* pointer to BAR memory */ ··· 135 133 struct mutex h2fq_lock; 136 134 /* lock for f2hq */ 137 135 struct mutex f2hq_lock; 136 + /* Min control plane version supported by firmware */ 137 + u32 min_fw_version; 138 + /* Max control plane version supported by firmware */ 139 + u32 max_fw_version; 138 140 }; 139 141 140 142 /* Initialize control mbox.
+35 -2
drivers/net/ethernet/marvell/octeon_ep/octep_ctrl_net.c
··· 14 14 #include "octep_main.h" 15 15 #include "octep_ctrl_net.h" 16 16 17 + /* Control plane version */ 18 + #define OCTEP_CP_VERSION_CURRENT OCTEP_CP_VERSION(1, 0, 0) 19 + 17 20 static const u32 req_hdr_sz = sizeof(union octep_ctrl_net_req_hdr); 18 21 static const u32 mtu_sz = sizeof(struct octep_ctrl_net_h2f_req_cmd_mtu); 19 22 static const u32 mac_sz = sizeof(struct octep_ctrl_net_h2f_req_cmd_mac); 20 23 static const u32 state_sz = sizeof(struct octep_ctrl_net_h2f_req_cmd_state); 21 24 static const u32 link_info_sz = sizeof(struct octep_ctrl_net_link_info); 22 25 static atomic_t ctrl_net_msg_id; 26 + 27 + /* Control plane version in which OCTEP_CTRL_NET_H2F_CMD was added */ 28 + static const u32 octep_ctrl_net_h2f_cmd_versions[OCTEP_CTRL_NET_H2F_CMD_MAX] = { 29 + [OCTEP_CTRL_NET_H2F_CMD_INVALID ... OCTEP_CTRL_NET_H2F_CMD_LINK_INFO] = 30 + OCTEP_CP_VERSION(1, 0, 0) 31 + }; 32 + 33 + /* Control plane version in which OCTEP_CTRL_NET_F2H_CMD was added */ 34 + static const u32 octep_ctrl_net_f2h_cmd_versions[OCTEP_CTRL_NET_F2H_CMD_MAX] = { 35 + [OCTEP_CTRL_NET_F2H_CMD_INVALID ... OCTEP_CTRL_NET_F2H_CMD_LINK_STATUS] = 36 + OCTEP_CP_VERSION(1, 0, 0) 37 + }; 23 38 24 39 static void init_send_req(struct octep_ctrl_mbox_msg *msg, void *buf, 25 40 u16 sz, int vfid) ··· 56 41 struct octep_ctrl_net_wait_data *d, 57 42 bool wait_for_response) 58 43 { 59 - int err, ret; 44 + int err, ret, cmd; 45 + 46 + /* check if firmware is compatible for this request */ 47 + cmd = d->data.req.hdr.s.cmd; 48 + if (octep_ctrl_net_h2f_cmd_versions[cmd] > oct->ctrl_mbox.max_fw_version || 49 + octep_ctrl_net_h2f_cmd_versions[cmd] < oct->ctrl_mbox.min_fw_version) 50 + return -EOPNOTSUPP; 60 51 61 52 err = octep_ctrl_mbox_send(&oct->ctrl_mbox, &d->msg); 62 53 if (err < 0) ··· 105 84 106 85 /* Initialize control mbox */ 107 86 ctrl_mbox = &oct->ctrl_mbox; 87 + ctrl_mbox->version = OCTEP_CP_VERSION_CURRENT; 108 88 ctrl_mbox->barmem = CFG_GET_CTRL_MBOX_MEM_ADDR(oct->conf); 109 89 ret = octep_ctrl_mbox_init(ctrl_mbox); 110 90 if (ret) { 111 91 dev_err(&pdev->dev, "Failed to initialize control mbox\n"); 112 92 return ret; 113 93 } 94 + dev_info(&pdev->dev, "Control plane versions host: %llx, firmware: %x:%x\n", 95 + ctrl_mbox->version, ctrl_mbox->min_fw_version, 96 + ctrl_mbox->max_fw_version); 114 97 oct->ctrl_mbox_ifstats_offset = ctrl_mbox->barmem_sz; 115 98 116 99 return 0; ··· 298 273 { 299 274 struct net_device *netdev = oct->netdev; 300 275 struct octep_ctrl_net_f2h_req *req; 276 + int cmd; 301 277 302 278 req = (struct octep_ctrl_net_f2h_req *)msg->sg_list[0].msg; 303 - switch (req->hdr.s.cmd) { 279 + cmd = req->hdr.s.cmd; 280 + 281 + /* check if we support this command */ 282 + if (octep_ctrl_net_f2h_cmd_versions[cmd] > OCTEP_CP_VERSION_CURRENT || 283 + octep_ctrl_net_f2h_cmd_versions[cmd] < OCTEP_CP_VERSION_CURRENT) 284 + return -EOPNOTSUPP; 285 + 286 + switch (cmd) { 304 287 case OCTEP_CTRL_NET_F2H_CMD_LINK_STATUS: 305 288 if (netif_running(netdev)) { 306 289 if (req->link.state) {
+4
drivers/net/ethernet/marvell/octeon_ep/octep_ctrl_net.h
··· 7 7 #ifndef __OCTEP_CTRL_NET_H__ 8 8 #define __OCTEP_CTRL_NET_H__ 9 9 10 + #include "octep_cp_version.h" 11 + 10 12 #define OCTEP_CTRL_NET_INVALID_VFID (-1) 11 13 12 14 /* Supported commands */ ··· 41 39 OCTEP_CTRL_NET_H2F_CMD_LINK_STATUS, 42 40 OCTEP_CTRL_NET_H2F_CMD_RX_STATE, 43 41 OCTEP_CTRL_NET_H2F_CMD_LINK_INFO, 42 + OCTEP_CTRL_NET_H2F_CMD_MAX 44 43 }; 45 44 46 45 /* Supported fw to host commands */ 47 46 enum octep_ctrl_net_f2h_cmd { 48 47 OCTEP_CTRL_NET_F2H_CMD_INVALID = 0, 49 48 OCTEP_CTRL_NET_F2H_CMD_LINK_STATUS, 49 + OCTEP_CTRL_NET_F2H_CMD_MAX 50 50 }; 51 51 52 52 union octep_ctrl_net_req_hdr {