Skip to content

Commit 4b860c9

Browse files
mustafakismailjgunthorpe
authored andcommitted
RDMA/irdma: Add support for DSCP
Add DSCP support for the Intel Ethernet 800 Series devices. Setup VSI DSCP info when PCI driver indicates DSCP mode during driver probe or as notification event. Link: https://lore.kernel.org/r/20220202191921.1638-4-shiraz.saleem@intel.com Signed-off-by: Mustafa Ismail <mustafa.ismail@intel.com> Signed-off-by: Shiraz Saleem <shiraz.saleem@intel.com> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
1 parent 8348305 commit 4b860c9

File tree

6 files changed

+40
-6
lines changed

6 files changed

+40
-6
lines changed

drivers/infiniband/hw/irdma/cm.c

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2209,8 +2209,12 @@ irdma_make_cm_node(struct irdma_cm_core *cm_core, struct irdma_device *iwdev,
22092209
ibdev_warn(&iwdev->ibdev,
22102210
"application TOS[%d] and remote client TOS[%d] mismatch\n",
22112211
listener->tos, cm_info->tos);
2212-
cm_node->tos = max(listener->tos, cm_info->tos);
2213-
cm_node->user_pri = rt_tos2priority(cm_node->tos);
2212+
if (iwdev->vsi.dscp_mode) {
2213+
cm_node->user_pri = listener->user_pri;
2214+
} else {
2215+
cm_node->tos = max(listener->tos, cm_info->tos);
2216+
cm_node->user_pri = rt_tos2priority(cm_node->tos);
2217+
}
22142218
ibdev_dbg(&iwdev->ibdev,
22152219
"DCB: listener: TOS:[%d] UP:[%d]\n", cm_node->tos,
22162220
cm_node->user_pri);
@@ -3835,7 +3839,11 @@ int irdma_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
38353839
cm_info.cm_id = cm_id;
38363840
cm_info.qh_qpid = iwdev->vsi.ilq->qp_id;
38373841
cm_info.tos = cm_id->tos;
3838-
cm_info.user_pri = rt_tos2priority(cm_id->tos);
3842+
if (iwdev->vsi.dscp_mode)
3843+
cm_info.user_pri =
3844+
iwqp->sc_qp.vsi->dscp_map[irdma_tos2dscp(cm_info.tos)];
3845+
else
3846+
cm_info.user_pri = rt_tos2priority(cm_id->tos);
38393847

38403848
if (iwqp->sc_qp.dev->ws_add(iwqp->sc_qp.vsi, cm_info.user_pri))
38413849
return -ENOMEM;
@@ -3977,7 +3985,11 @@ int irdma_create_listen(struct iw_cm_id *cm_id, int backlog)
39773985
cm_id->provider_data = cm_listen_node;
39783986

39793987
cm_listen_node->tos = cm_id->tos;
3980-
cm_listen_node->user_pri = rt_tos2priority(cm_id->tos);
3988+
if (iwdev->vsi.dscp_mode)
3989+
cm_listen_node->user_pri =
3990+
iwdev->vsi.dscp_map[irdma_tos2dscp(cm_id->tos)];
3991+
else
3992+
cm_listen_node->user_pri = rt_tos2priority(cm_id->tos);
39813993
cm_info.user_pri = cm_listen_node->user_pri;
39823994
if (!cm_listen_node->reused_node) {
39833995
if (wildcard) {

drivers/infiniband/hw/irdma/cm.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,13 @@ int irdma_schedule_cm_timer(struct irdma_cm_node *cm_node,
384384
struct irdma_puda_buf *sqbuf,
385385
enum irdma_timer_type type, int send_retrans,
386386
int close_when_complete);
387+
388+
static inline u8 irdma_tos2dscp(u8 tos)
389+
{
390+
#define IRDMA_DSCP_VAL GENMASK(7, 2)
391+
return (u8)FIELD_GET(IRDMA_DSCP_VAL, tos);
392+
}
393+
387394
int irdma_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param);
388395
int irdma_reject(struct iw_cm_id *cm_id, const void *pdata, u8 pdata_len);
389396
int irdma_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param);

drivers/infiniband/hw/irdma/ctrl.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,12 @@ static void irdma_set_qos_info(struct irdma_sc_vsi *vsi,
7777

7878
vsi->qos_rel_bw = l2p->vsi_rel_bw;
7979
vsi->qos_prio_type = l2p->vsi_prio_type;
80+
vsi->dscp_mode = l2p->dscp_mode;
81+
if (l2p->dscp_mode) {
82+
memcpy(vsi->dscp_map, l2p->dscp_map, sizeof(vsi->dscp_map));
83+
for (i = 0; i < IRDMA_MAX_USER_PRIORITY; i++)
84+
l2p->up2tc[i] = i;
85+
}
8086
for (i = 0; i < IRDMA_MAX_USER_PRIORITY; i++) {
8187
if (vsi->dev->hw_attrs.uk_attrs.hw_rev == IRDMA_GEN_1)
8288
vsi->qos[i].qs_handle = l2p->qs_handle_list[i];

drivers/infiniband/hw/irdma/main.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,10 @@ static void irdma_fill_qos_info(struct irdma_l2params *l2params,
7979
}
8080
for (i = 0; i < IIDC_MAX_USER_PRIORITY; i++)
8181
l2params->up2tc[i] = qos_info->up2tc[i];
82+
if (qos_info->pfc_mode == IIDC_DSCP_PFC_MODE) {
83+
l2params->dscp_mode = true;
84+
memcpy(l2params->dscp_map, qos_info->dscp_map, sizeof(l2params->dscp_map));
85+
}
8286
}
8387

8488
static void irdma_iidc_event_handler(struct ice_pf *pf, struct iidc_event *event)
@@ -110,7 +114,7 @@ static void irdma_iidc_event_handler(struct ice_pf *pf, struct iidc_event *event
110114
ice_get_qos_params(pf, &qos_info);
111115
irdma_fill_qos_info(&l2params, &qos_info);
112116
if (iwdev->rf->protocol_used != IRDMA_IWARP_PROTOCOL_ONLY)
113-
iwdev->dcb_vlan_mode = qos_info.num_tc > 1;
117+
iwdev->dcb_vlan_mode = qos_info.num_tc > 1 && !l2params.dscp_mode;
114118
irdma_change_l2params(&iwdev->vsi, &l2params);
115119
} else if (*event->type & BIT(IIDC_EVENT_CRIT_ERR)) {
116120
ibdev_warn(&iwdev->ibdev, "ICE OICR event notification: oicr = 0x%08x\n",
@@ -285,7 +289,7 @@ static int irdma_probe(struct auxiliary_device *aux_dev, const struct auxiliary_
285289
ice_get_qos_params(pf, &qos_info);
286290
irdma_fill_qos_info(&l2params, &qos_info);
287291
if (iwdev->rf->protocol_used != IRDMA_IWARP_PROTOCOL_ONLY)
288-
iwdev->dcb_vlan_mode = l2params.num_tc > 1;
292+
iwdev->dcb_vlan_mode = l2params.num_tc > 1 && !l2params.dscp_mode;
289293

290294
if (irdma_rt_init_hw(iwdev, &l2params)) {
291295
err = -EIO;

drivers/infiniband/hw/irdma/osdep.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
#include <linux/pci.h>
77
#include <linux/bitfield.h>
8+
#include <linux/net/intel/iidc.h>
89
#include <crypto/hash.h>
910
#include <rdma/ib_verbs.h>
1011

drivers/infiniband/hw/irdma/type.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -611,6 +611,8 @@ struct irdma_sc_vsi {
611611
struct irdma_ws_node *tc_node);
612612
u8 qos_rel_bw;
613613
u8 qos_prio_type;
614+
u8 dscp_map[IIDC_MAX_DSCP_MAPPING];
615+
bool dscp_mode:1;
614616
};
615617

616618
struct irdma_sc_dev {
@@ -735,11 +737,13 @@ struct irdma_l2params {
735737
u16 qs_handle_list[IRDMA_MAX_USER_PRIORITY];
736738
u16 mtu;
737739
u8 up2tc[IRDMA_MAX_USER_PRIORITY];
740+
u8 dscp_map[IIDC_MAX_DSCP_MAPPING];
738741
u8 num_tc;
739742
u8 vsi_rel_bw;
740743
u8 vsi_prio_type;
741744
bool mtu_changed:1;
742745
bool tc_changed:1;
746+
bool dscp_mode:1;
743747
};
744748

745749
struct irdma_vsi_init_info {

0 commit comments

Comments
 (0)