octeon_ep: control net framework to support VF offloads
authorShinas Rasheed <srasheed@marvell.com>
Fri, 15 Dec 2023 18:14:24 +0000 (10:14 -0800)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 19 Dec 2023 11:00:53 +0000 (12:00 +0100)
Inquire firmware on supported offloads, as well as convey offloads
enabled dynamically to firmware for the VFs. Implement control net API
to support the same.

Signed-off-by: Shinas Rasheed <srasheed@marvell.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/marvell/octeon_ep/octep_pfvf_mbox.c
drivers/net/ethernet/marvell/octeon_ep/octep_pfvf_mbox.h

index fb4da72e5193f09a587e48aebfa86dfb675a8ccf..dbb5b8f4ef3066cf564fa69f9707262c93f83608 100644 (file)
@@ -158,6 +158,47 @@ static void octep_pfvf_dev_remove(struct octep_device *oct,  u32 vf_id,
        rsp->s.type = OCTEP_PFVF_MBOX_TYPE_RSP_ACK;
 }
 
+static void octep_pfvf_get_fw_info(struct octep_device *oct,  u32 vf_id,
+                                  union octep_pfvf_mbox_word cmd,
+                                  union octep_pfvf_mbox_word *rsp)
+{
+       struct octep_fw_info fw_info;
+       int err;
+
+       err = octep_ctrl_net_get_info(oct, vf_id, &fw_info);
+       if (err) {
+               rsp->s_fw_info.type = OCTEP_PFVF_MBOX_TYPE_RSP_NACK;
+               dev_err(&oct->pdev->dev, "Get VF info failed via host control Mbox\n");
+               return;
+       }
+
+       rsp->s_fw_info.pkind = fw_info.pkind;
+       rsp->s_fw_info.fsz = fw_info.fsz;
+       rsp->s_fw_info.rx_ol_flags = fw_info.rx_ol_flags;
+       rsp->s_fw_info.tx_ol_flags = fw_info.tx_ol_flags;
+
+       rsp->s_fw_info.type = OCTEP_PFVF_MBOX_TYPE_RSP_ACK;
+}
+
+static void octep_pfvf_set_offloads(struct octep_device *oct, u32 vf_id,
+                                   union octep_pfvf_mbox_word cmd,
+                                   union octep_pfvf_mbox_word *rsp)
+{
+       struct octep_ctrl_net_offloads offloads = {
+               .rx_offloads = cmd.s_offloads.rx_ol_flags,
+               .tx_offloads = cmd.s_offloads.tx_ol_flags
+       };
+       int err;
+
+       err = octep_ctrl_net_set_offloads(oct, vf_id, &offloads, true);
+       if (err) {
+               rsp->s_offloads.type = OCTEP_PFVF_MBOX_TYPE_RSP_NACK;
+               dev_err(&oct->pdev->dev, "Set VF offloads failed via host control Mbox\n");
+               return;
+       }
+       rsp->s_offloads.type = OCTEP_PFVF_MBOX_TYPE_RSP_ACK;
+}
+
 int octep_setup_pfvf_mbox(struct octep_device *oct)
 {
        int i = 0, num_vfs = 0, rings_per_vf = 0;
@@ -334,6 +375,12 @@ void octep_pfvf_mbox_work(struct work_struct *work)
        case OCTEP_PFVF_MBOX_CMD_DEV_REMOVE:
                octep_pfvf_dev_remove(oct, vf_id, cmd, &rsp);
                break;
+       case OCTEP_PFVF_MBOX_CMD_GET_FW_INFO:
+               octep_pfvf_get_fw_info(oct, vf_id, cmd, &rsp);
+               break;
+       case OCTEP_PFVF_MBOX_CMD_SET_OFFLOADS:
+               octep_pfvf_set_offloads(oct, vf_id, cmd, &rsp);
+               break;
        default:
                dev_err(&oct->pdev->dev, "PF-VF mailbox: invalid opcode %d\n", cmd.s.opcode);
                rsp.s.type = OCTEP_PFVF_MBOX_TYPE_RSP_NACK;
index af4dcf5ef7f1d5ff39874797fe4b1d1c7435da99..c18a9f26fc314c9d9660a4cf77066cfed0871987 100644 (file)
 enum octep_pfvf_mbox_version {
        OCTEP_PFVF_MBOX_VERSION_V0,
        OCTEP_PFVF_MBOX_VERSION_V1,
+       OCTEP_PFVF_MBOX_VERSION_V2,
 };
 
-#define OCTEP_PFVF_MBOX_VERSION_CURRENT        OCTEP_PFVF_MBOX_VERSION_V1
+#define OCTEP_PFVF_MBOX_VERSION_CURRENT        OCTEP_PFVF_MBOX_VERSION_V2
 
 enum octep_pfvf_mbox_opcode {
        OCTEP_PFVF_MBOX_CMD_VERSION,
@@ -34,6 +35,8 @@ enum octep_pfvf_mbox_opcode {
        OCTEP_PFVF_MBOX_CMD_GET_LINK_STATUS,
        OCTEP_PFVF_MBOX_CMD_GET_MTU,
        OCTEP_PFVF_MBOX_CMD_DEV_REMOVE,
+       OCTEP_PFVF_MBOX_CMD_GET_FW_INFO,
+       OCTEP_PFVF_MBOX_CMD_SET_OFFLOADS,
        OCTEP_PFVF_MBOX_CMD_MAX,
 };
 
@@ -138,6 +141,22 @@ union octep_pfvf_mbox_word {
                u64 status:1;
                u64 rsvd:53;
        } s_link_status;
+       struct {
+               u64 opcode:8;
+               u64 type:2;
+               u64 pkind:8;
+               u64 fsz:8;
+               u64 rx_ol_flags:16;
+               u64 tx_ol_flags:16;
+               u64 rsvd:6;
+       } s_fw_info;
+       struct {
+               u64 opcode:8;
+               u64 type:2;
+               u64 rsvd:22;
+               u64 rx_ol_flags:16;
+               u64 tx_ol_flags:16;
+       } s_offloads;
 } __packed;
 
 void octep_pfvf_mbox_work(struct work_struct *work);