ice: add new VSI type for subfunctions
authorPiotr Raczynski <piotr.raczynski@intel.com>
Tue, 20 Aug 2024 06:57:46 +0000 (08:57 +0200)
committerTony Nguyen <anthony.l.nguyen@intel.com>
Fri, 6 Sep 2024 17:52:19 +0000 (10:52 -0700)
Add required plumbing for new VSI type dedicated to devlink subfunctions.
Make sure that the vsi is properly configured and destroyed. Also allow
loading XDP and AF_XDP sockets.

The first implementation of devlink subfunctions supports only one Tx/Rx
queue pair per given subfunction.

Reviewed-by: Simon Horman <horms@kernel.org>
Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
Reviewed-by: Wojciech Drewek <wojciech.drewek@intel.com>
Signed-off-by: Piotr Raczynski <piotr.raczynski@intel.com>
Signed-off-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com>
Tested-by: Rafal Romanowski <rafal.romanowski@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
drivers/net/ethernet/intel/ice/ice_base.c
drivers/net/ethernet/intel/ice/ice_dcb_lib.c
drivers/net/ethernet/intel/ice/ice_lib.c
drivers/net/ethernet/intel/ice/ice_main.c
drivers/net/ethernet/intel/ice/ice_type.h
drivers/net/ethernet/intel/ice/ice_xsk.c

index c158749a80e05acc7de270c2df38f4e2c3096c67..4a9a6899fc453cb53b11ad014abceb1ca0fa7441 100644 (file)
@@ -325,6 +325,9 @@ ice_setup_tx_ctx(struct ice_tx_ring *ring, struct ice_tlan_ctx *tlan_ctx, u16 pf
                tlan_ctx->vmvf_num = hw->func_caps.vf_base_id + vsi->vf->vf_id;
                tlan_ctx->vmvf_type = ICE_TLAN_CTX_VMVF_TYPE_VF;
                break;
+       case ICE_VSI_SF:
+               tlan_ctx->vmvf_type = ICE_TLAN_CTX_VMVF_TYPE_VMQ;
+               break;
        default:
                return;
        }
@@ -540,7 +543,7 @@ static int ice_vsi_cfg_rxq(struct ice_rx_ring *ring)
 
        ring->rx_buf_len = ring->vsi->rx_buf_len;
 
-       if (ring->vsi->type == ICE_VSI_PF) {
+       if (ring->vsi->type == ICE_VSI_PF || ring->vsi->type == ICE_VSI_SF) {
                if (!xdp_rxq_info_is_reg(&ring->xdp_rxq)) {
                        err = __xdp_rxq_info_reg(&ring->xdp_rxq, ring->netdev,
                                                 ring->q_index,
index a94e7072b570691007c3c378a00cbeb2f786f774..a7c5108328240095aac4afe923c0b9d813eac1d2 100644 (file)
@@ -187,6 +187,7 @@ void ice_vsi_set_dcb_tc_cfg(struct ice_vsi *vsi)
                vsi->tc_cfg.numtc = ice_dcb_get_num_tc(cfg);
                break;
        case ICE_VSI_CHNL:
+       case ICE_VSI_SF:
                vsi->tc_cfg.ena_tc = BIT(ice_get_first_droptc(vsi));
                vsi->tc_cfg.numtc = 1;
                break;
index 737c00b02dd0e139fa9b5215bb2121e5ef10be07..cb90a393709b3362029c4df4dabf8bd8736daf11 100644 (file)
@@ -20,6 +20,8 @@ const char *ice_vsi_type_str(enum ice_vsi_type vsi_type)
                return "ICE_VSI_PF";
        case ICE_VSI_VF:
                return "ICE_VSI_VF";
+       case ICE_VSI_SF:
+               return "ICE_VSI_SF";
        case ICE_VSI_CTRL:
                return "ICE_VSI_CTRL";
        case ICE_VSI_CHNL:
@@ -135,6 +137,7 @@ static void ice_vsi_set_num_desc(struct ice_vsi *vsi)
 {
        switch (vsi->type) {
        case ICE_VSI_PF:
+       case ICE_VSI_SF:
        case ICE_VSI_CTRL:
        case ICE_VSI_LB:
                /* a user could change the values of num_[tr]x_desc using
@@ -201,6 +204,12 @@ static void ice_vsi_set_num_qs(struct ice_vsi *vsi)
                                           max_t(int, vsi->alloc_rxq,
                                                 vsi->alloc_txq));
                break;
+       case ICE_VSI_SF:
+               vsi->alloc_txq = 1;
+               vsi->alloc_rxq = 1;
+               vsi->num_q_vectors = 1;
+               vsi->irq_dyn_alloc = true;
+               break;
        case ICE_VSI_VF:
                if (vf->num_req_qs)
                        vf->num_vf_qs = vf->num_req_qs;
@@ -559,6 +568,7 @@ ice_vsi_alloc_def(struct ice_vsi *vsi, struct ice_channel *ch)
 
        switch (vsi->type) {
        case ICE_VSI_PF:
+       case ICE_VSI_SF:
                /* Setup default MSIX irq handler for VSI */
                vsi->irq_handler = ice_msix_clean_rings;
                break;
@@ -889,6 +899,11 @@ static void ice_vsi_set_rss_params(struct ice_vsi *vsi)
                                              max_rss_size);
                vsi->rss_lut_type = ICE_LUT_PF;
                break;
+       case ICE_VSI_SF:
+               vsi->rss_table_size = ICE_LUT_VSI_SIZE;
+               vsi->rss_size = min_t(u16, num_online_cpus(), max_rss_size);
+               vsi->rss_lut_type = ICE_LUT_VSI;
+               break;
        case ICE_VSI_VF:
                /* VF VSI will get a small RSS table.
                 * For VSI_LUT, LUT size should be set to 64 bytes.
@@ -1136,6 +1151,7 @@ static void ice_set_rss_vsi_ctx(struct ice_vsi_ctx *ctxt, struct ice_vsi *vsi)
                lut_type = ICE_AQ_VSI_Q_OPT_RSS_LUT_PF;
                break;
        case ICE_VSI_VF:
+       case ICE_VSI_SF:
                /* VF VSI will gets a small RSS table which is a VSI LUT type */
                lut_type = ICE_AQ_VSI_Q_OPT_RSS_LUT_VSI;
                break;
@@ -1214,6 +1230,7 @@ static int ice_vsi_init(struct ice_vsi *vsi, u32 vsi_flags)
        case ICE_VSI_PF:
                ctxt->flags = ICE_AQ_VSI_TYPE_PF;
                break;
+       case ICE_VSI_SF:
        case ICE_VSI_CHNL:
                ctxt->flags = ICE_AQ_VSI_TYPE_VMDQ2;
                break;
@@ -2095,6 +2112,7 @@ static void ice_set_agg_vsi(struct ice_vsi *vsi)
        case ICE_VSI_CHNL:
        case ICE_VSI_LB:
        case ICE_VSI_PF:
+       case ICE_VSI_SF:
                max_agg_nodes = ICE_MAX_PF_AGG_NODES;
                agg_node_id_start = ICE_PF_AGG_NODE_ID_START;
                agg_node_iter = &pf->pf_agg_node[0];
@@ -2264,6 +2282,7 @@ static int ice_vsi_cfg_def(struct ice_vsi *vsi)
 
        switch (vsi->type) {
        case ICE_VSI_CTRL:
+       case ICE_VSI_SF:
        case ICE_VSI_PF:
                ret = ice_vsi_alloc_q_vectors(vsi);
                if (ret)
@@ -2648,7 +2667,8 @@ int ice_ena_vsi(struct ice_vsi *vsi, bool locked)
 
        clear_bit(ICE_VSI_NEEDS_RESTART, vsi->state);
 
-       if (vsi->netdev && vsi->type == ICE_VSI_PF) {
+       if (vsi->netdev && (vsi->type == ICE_VSI_PF ||
+                           vsi->type == ICE_VSI_SF)) {
                if (netif_running(vsi->netdev)) {
                        if (!locked)
                                rtnl_lock();
@@ -2676,7 +2696,8 @@ void ice_dis_vsi(struct ice_vsi *vsi, bool locked)
 
        set_bit(ICE_VSI_NEEDS_RESTART, vsi->state);
 
-       if (vsi->type == ICE_VSI_PF && vsi->netdev) {
+       if (vsi->netdev && (vsi->type == ICE_VSI_PF ||
+                           vsi->type == ICE_VSI_SF)) {
                if (netif_running(vsi->netdev)) {
                        if (!locked)
                                rtnl_lock();
index c7db88b517da26dc5afc0a9286dabdd41b8a6277..ad485d22f30297b9e8c986e929c1dd950a24c972 100644 (file)
@@ -2974,6 +2974,9 @@ int ice_vsi_determine_xdp_res(struct ice_vsi *vsi)
        if (avail < cpus / 2)
                return -ENOMEM;
 
+       if (vsi->type == ICE_VSI_SF)
+               avail = vsi->alloc_txq;
+
        vsi->num_xdp_txq = min_t(u16, avail, cpus);
 
        if (vsi->num_xdp_txq < cpus)
@@ -3095,8 +3098,8 @@ static int ice_xdp(struct net_device *dev, struct netdev_bpf *xdp)
        struct ice_vsi *vsi = np->vsi;
        int ret;
 
-       if (vsi->type != ICE_VSI_PF) {
-               NL_SET_ERR_MSG_MOD(xdp->extack, "XDP can be loaded only on PF VSI");
+       if (vsi->type != ICE_VSI_PF && vsi->type != ICE_VSI_SF) {
+               NL_SET_ERR_MSG_MOD(xdp->extack, "XDP can be loaded only on PF or SF VSI");
                return -EINVAL;
        }
 
index b9e4432323355d94ba89998f56699c85bd6f09b9..45768796691fecca1b5b3c6640063dbe9fdfbef0 100644 (file)
@@ -159,6 +159,7 @@ enum ice_vsi_type {
        ICE_VSI_CTRL = 3,       /* equates to ICE_VSI_PF with 1 queue pair */
        ICE_VSI_CHNL = 4,
        ICE_VSI_LB = 6,
+       ICE_VSI_SF = 9,
 };
 
 struct ice_link_status {
index 5dee829bfc47c5fbe485fb3f41d95bb4857f8799..334ae945d6404ccebe2cc1ff5b16643d5ef6aaa2 100644 (file)
@@ -289,7 +289,7 @@ ice_xsk_pool_enable(struct ice_vsi *vsi, struct xsk_buff_pool *pool, u16 qid)
 {
        int err;
 
-       if (vsi->type != ICE_VSI_PF)
+       if (vsi->type != ICE_VSI_PF && vsi->type != ICE_VSI_SF)
                return -EINVAL;
 
        if (qid >= vsi->netdev->real_num_rx_queues ||