Commit 2f1b2820 authored by Jason Gunthorpe's avatar Jason Gunthorpe

Merge branch 'irdma_dscp' into rdma.git for-next

Shiraz Saleem says:

====================
Add support for DSCP QoS

git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/linux iwl-next
====================

Link: https://lore.kernel.org/r/20220207235921.1303522-1-anthony.l.nguyen@intel.com/Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
parents b1377cc3 4b860c91
...@@ -2200,7 +2200,7 @@ irdma_make_cm_node(struct irdma_cm_core *cm_core, struct irdma_device *iwdev, ...@@ -2200,7 +2200,7 @@ irdma_make_cm_node(struct irdma_cm_core *cm_core, struct irdma_device *iwdev,
/* set our node specific transport info */ /* set our node specific transport info */
cm_node->ipv4 = cm_info->ipv4; cm_node->ipv4 = cm_info->ipv4;
cm_node->vlan_id = cm_info->vlan_id; cm_node->vlan_id = cm_info->vlan_id;
if (cm_node->vlan_id >= VLAN_N_VID && iwdev->dcb) if (cm_node->vlan_id >= VLAN_N_VID && iwdev->dcb_vlan_mode)
cm_node->vlan_id = 0; cm_node->vlan_id = 0;
cm_node->tos = cm_info->tos; cm_node->tos = cm_info->tos;
cm_node->user_pri = cm_info->user_pri; cm_node->user_pri = cm_info->user_pri;
...@@ -2209,8 +2209,12 @@ irdma_make_cm_node(struct irdma_cm_core *cm_core, struct irdma_device *iwdev, ...@@ -2209,8 +2209,12 @@ irdma_make_cm_node(struct irdma_cm_core *cm_core, struct irdma_device *iwdev,
ibdev_warn(&iwdev->ibdev, ibdev_warn(&iwdev->ibdev,
"application TOS[%d] and remote client TOS[%d] mismatch\n", "application TOS[%d] and remote client TOS[%d] mismatch\n",
listener->tos, cm_info->tos); listener->tos, cm_info->tos);
cm_node->tos = max(listener->tos, cm_info->tos); if (iwdev->vsi.dscp_mode) {
cm_node->user_pri = rt_tos2priority(cm_node->tos); cm_node->user_pri = listener->user_pri;
} else {
cm_node->tos = max(listener->tos, cm_info->tos);
cm_node->user_pri = rt_tos2priority(cm_node->tos);
}
ibdev_dbg(&iwdev->ibdev, ibdev_dbg(&iwdev->ibdev,
"DCB: listener: TOS:[%d] UP:[%d]\n", cm_node->tos, "DCB: listener: TOS:[%d] UP:[%d]\n", cm_node->tos,
cm_node->user_pri); cm_node->user_pri);
...@@ -3835,7 +3839,11 @@ int irdma_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) ...@@ -3835,7 +3839,11 @@ int irdma_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
cm_info.cm_id = cm_id; cm_info.cm_id = cm_id;
cm_info.qh_qpid = iwdev->vsi.ilq->qp_id; cm_info.qh_qpid = iwdev->vsi.ilq->qp_id;
cm_info.tos = cm_id->tos; cm_info.tos = cm_id->tos;
cm_info.user_pri = rt_tos2priority(cm_id->tos); if (iwdev->vsi.dscp_mode)
cm_info.user_pri =
iwqp->sc_qp.vsi->dscp_map[irdma_tos2dscp(cm_info.tos)];
else
cm_info.user_pri = rt_tos2priority(cm_id->tos);
if (iwqp->sc_qp.dev->ws_add(iwqp->sc_qp.vsi, cm_info.user_pri)) if (iwqp->sc_qp.dev->ws_add(iwqp->sc_qp.vsi, cm_info.user_pri))
return -ENOMEM; return -ENOMEM;
...@@ -3959,7 +3967,7 @@ int irdma_create_listen(struct iw_cm_id *cm_id, int backlog) ...@@ -3959,7 +3967,7 @@ int irdma_create_listen(struct iw_cm_id *cm_id, int backlog)
} }
} }
if (cm_info.vlan_id >= VLAN_N_VID && iwdev->dcb) if (cm_info.vlan_id >= VLAN_N_VID && iwdev->dcb_vlan_mode)
cm_info.vlan_id = 0; cm_info.vlan_id = 0;
cm_info.backlog = backlog; cm_info.backlog = backlog;
cm_info.cm_id = cm_id; cm_info.cm_id = cm_id;
...@@ -3977,7 +3985,11 @@ int irdma_create_listen(struct iw_cm_id *cm_id, int backlog) ...@@ -3977,7 +3985,11 @@ int irdma_create_listen(struct iw_cm_id *cm_id, int backlog)
cm_id->provider_data = cm_listen_node; cm_id->provider_data = cm_listen_node;
cm_listen_node->tos = cm_id->tos; cm_listen_node->tos = cm_id->tos;
cm_listen_node->user_pri = rt_tos2priority(cm_id->tos); if (iwdev->vsi.dscp_mode)
cm_listen_node->user_pri =
iwdev->vsi.dscp_map[irdma_tos2dscp(cm_id->tos)];
else
cm_listen_node->user_pri = rt_tos2priority(cm_id->tos);
cm_info.user_pri = cm_listen_node->user_pri; cm_info.user_pri = cm_listen_node->user_pri;
if (!cm_listen_node->reused_node) { if (!cm_listen_node->reused_node) {
if (wildcard) { if (wildcard) {
......
...@@ -384,6 +384,13 @@ int irdma_schedule_cm_timer(struct irdma_cm_node *cm_node, ...@@ -384,6 +384,13 @@ int irdma_schedule_cm_timer(struct irdma_cm_node *cm_node,
struct irdma_puda_buf *sqbuf, struct irdma_puda_buf *sqbuf,
enum irdma_timer_type type, int send_retrans, enum irdma_timer_type type, int send_retrans,
int close_when_complete); int close_when_complete);
static inline u8 irdma_tos2dscp(u8 tos)
{
#define IRDMA_DSCP_VAL GENMASK(7, 2)
return (u8)FIELD_GET(IRDMA_DSCP_VAL, tos);
}
int irdma_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param); int irdma_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param);
int irdma_reject(struct iw_cm_id *cm_id, const void *pdata, u8 pdata_len); int irdma_reject(struct iw_cm_id *cm_id, const void *pdata, u8 pdata_len);
int irdma_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param); int irdma_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param);
......
...@@ -70,6 +70,31 @@ void irdma_sc_suspend_resume_qps(struct irdma_sc_vsi *vsi, u8 op) ...@@ -70,6 +70,31 @@ void irdma_sc_suspend_resume_qps(struct irdma_sc_vsi *vsi, u8 op)
} }
} }
static void irdma_set_qos_info(struct irdma_sc_vsi *vsi,
struct irdma_l2params *l2p)
{
u8 i;
vsi->qos_rel_bw = l2p->vsi_rel_bw;
vsi->qos_prio_type = l2p->vsi_prio_type;
vsi->dscp_mode = l2p->dscp_mode;
if (l2p->dscp_mode) {
memcpy(vsi->dscp_map, l2p->dscp_map, sizeof(vsi->dscp_map));
for (i = 0; i < IRDMA_MAX_USER_PRIORITY; i++)
l2p->up2tc[i] = i;
}
for (i = 0; i < IRDMA_MAX_USER_PRIORITY; i++) {
if (vsi->dev->hw_attrs.uk_attrs.hw_rev == IRDMA_GEN_1)
vsi->qos[i].qs_handle = l2p->qs_handle_list[i];
vsi->qos[i].traffic_class = l2p->up2tc[i];
vsi->qos[i].rel_bw =
l2p->tc_info[vsi->qos[i].traffic_class].rel_bw;
vsi->qos[i].prio_type =
l2p->tc_info[vsi->qos[i].traffic_class].prio_type;
vsi->qos[i].valid = false;
}
}
/** /**
* irdma_change_l2params - given the new l2 parameters, change all qp * irdma_change_l2params - given the new l2 parameters, change all qp
* @vsi: RDMA VSI pointer * @vsi: RDMA VSI pointer
...@@ -88,6 +113,7 @@ void irdma_change_l2params(struct irdma_sc_vsi *vsi, ...@@ -88,6 +113,7 @@ void irdma_change_l2params(struct irdma_sc_vsi *vsi,
return; return;
vsi->tc_change_pending = false; vsi->tc_change_pending = false;
irdma_set_qos_info(vsi, l2params);
irdma_sc_suspend_resume_qps(vsi, IRDMA_OP_RESUME); irdma_sc_suspend_resume_qps(vsi, IRDMA_OP_RESUME);
} }
...@@ -1845,7 +1871,6 @@ static void irdma_null_ws_reset(struct irdma_sc_vsi *vsi) ...@@ -1845,7 +1871,6 @@ static void irdma_null_ws_reset(struct irdma_sc_vsi *vsi)
void irdma_sc_vsi_init(struct irdma_sc_vsi *vsi, void irdma_sc_vsi_init(struct irdma_sc_vsi *vsi,
struct irdma_vsi_init_info *info) struct irdma_vsi_init_info *info)
{ {
struct irdma_l2params *l2p;
int i; int i;
vsi->dev = info->dev; vsi->dev = info->dev;
...@@ -1858,18 +1883,8 @@ void irdma_sc_vsi_init(struct irdma_sc_vsi *vsi, ...@@ -1858,18 +1883,8 @@ void irdma_sc_vsi_init(struct irdma_sc_vsi *vsi,
if (vsi->dev->hw_attrs.uk_attrs.hw_rev == IRDMA_GEN_1) if (vsi->dev->hw_attrs.uk_attrs.hw_rev == IRDMA_GEN_1)
vsi->fcn_id = info->dev->hmc_fn_id; vsi->fcn_id = info->dev->hmc_fn_id;
l2p = info->params; irdma_set_qos_info(vsi, info->params);
vsi->qos_rel_bw = l2p->vsi_rel_bw;
vsi->qos_prio_type = l2p->vsi_prio_type;
for (i = 0; i < IRDMA_MAX_USER_PRIORITY; i++) { for (i = 0; i < IRDMA_MAX_USER_PRIORITY; i++) {
if (vsi->dev->hw_attrs.uk_attrs.hw_rev == IRDMA_GEN_1)
vsi->qos[i].qs_handle = l2p->qs_handle_list[i];
vsi->qos[i].traffic_class = info->params->up2tc[i];
vsi->qos[i].rel_bw =
l2p->tc_info[vsi->qos[i].traffic_class].rel_bw;
vsi->qos[i].prio_type =
l2p->tc_info[vsi->qos[i].traffic_class].prio_type;
vsi->qos[i].valid = false;
mutex_init(&vsi->qos[i].qos_mutex); mutex_init(&vsi->qos[i].qos_mutex);
INIT_LIST_HEAD(&vsi->qos[i].qplist); INIT_LIST_HEAD(&vsi->qos[i].qplist);
} }
......
...@@ -138,7 +138,7 @@ static int i40iw_open(struct i40e_info *cdev_info, struct i40e_client *client) ...@@ -138,7 +138,7 @@ static int i40iw_open(struct i40e_info *cdev_info, struct i40e_client *client)
if (last_qset == IRDMA_NO_QSET) if (last_qset == IRDMA_NO_QSET)
last_qset = qset; last_qset = qset;
else if ((qset != last_qset) && (qset != IRDMA_NO_QSET)) else if ((qset != last_qset) && (qset != IRDMA_NO_QSET))
iwdev->dcb = true; iwdev->dcb_vlan_mode = true;
} }
if (irdma_rt_init_hw(iwdev, &l2params)) { if (irdma_rt_init_hw(iwdev, &l2params)) {
......
...@@ -79,6 +79,10 @@ static void irdma_fill_qos_info(struct irdma_l2params *l2params, ...@@ -79,6 +79,10 @@ static void irdma_fill_qos_info(struct irdma_l2params *l2params,
} }
for (i = 0; i < IIDC_MAX_USER_PRIORITY; i++) for (i = 0; i < IIDC_MAX_USER_PRIORITY; i++)
l2params->up2tc[i] = qos_info->up2tc[i]; l2params->up2tc[i] = qos_info->up2tc[i];
if (qos_info->pfc_mode == IIDC_DSCP_PFC_MODE) {
l2params->dscp_mode = true;
memcpy(l2params->dscp_map, qos_info->dscp_map, sizeof(l2params->dscp_map));
}
} }
static void irdma_iidc_event_handler(struct ice_pf *pf, struct iidc_event *event) static void irdma_iidc_event_handler(struct ice_pf *pf, struct iidc_event *event)
...@@ -108,8 +112,9 @@ static void irdma_iidc_event_handler(struct ice_pf *pf, struct iidc_event *event ...@@ -108,8 +112,9 @@ static void irdma_iidc_event_handler(struct ice_pf *pf, struct iidc_event *event
l2params.tc_changed = true; l2params.tc_changed = true;
ibdev_dbg(&iwdev->ibdev, "CLNT: TC Change\n"); ibdev_dbg(&iwdev->ibdev, "CLNT: TC Change\n");
ice_get_qos_params(pf, &qos_info); ice_get_qos_params(pf, &qos_info);
iwdev->dcb = qos_info.num_tc > 1;
irdma_fill_qos_info(&l2params, &qos_info); irdma_fill_qos_info(&l2params, &qos_info);
if (iwdev->rf->protocol_used != IRDMA_IWARP_PROTOCOL_ONLY)
iwdev->dcb_vlan_mode = qos_info.num_tc > 1 && !l2params.dscp_mode;
irdma_change_l2params(&iwdev->vsi, &l2params); irdma_change_l2params(&iwdev->vsi, &l2params);
} else if (*event->type & BIT(IIDC_EVENT_CRIT_ERR)) { } else if (*event->type & BIT(IIDC_EVENT_CRIT_ERR)) {
ibdev_warn(&iwdev->ibdev, "ICE OICR event notification: oicr = 0x%08x\n", ibdev_warn(&iwdev->ibdev, "ICE OICR event notification: oicr = 0x%08x\n",
...@@ -283,6 +288,9 @@ static int irdma_probe(struct auxiliary_device *aux_dev, const struct auxiliary_ ...@@ -283,6 +288,9 @@ static int irdma_probe(struct auxiliary_device *aux_dev, const struct auxiliary_
l2params.mtu = iwdev->netdev->mtu; l2params.mtu = iwdev->netdev->mtu;
ice_get_qos_params(pf, &qos_info); ice_get_qos_params(pf, &qos_info);
irdma_fill_qos_info(&l2params, &qos_info); irdma_fill_qos_info(&l2params, &qos_info);
if (iwdev->rf->protocol_used != IRDMA_IWARP_PROTOCOL_ONLY)
iwdev->dcb_vlan_mode = l2params.num_tc > 1 && !l2params.dscp_mode;
if (irdma_rt_init_hw(iwdev, &l2params)) { if (irdma_rt_init_hw(iwdev, &l2params)) {
err = -EIO; err = -EIO;
goto err_rt_init; goto err_rt_init;
......
...@@ -345,7 +345,7 @@ struct irdma_device { ...@@ -345,7 +345,7 @@ struct irdma_device {
u8 iw_status; u8 iw_status;
bool roce_mode:1; bool roce_mode:1;
bool roce_dcqcn_en:1; bool roce_dcqcn_en:1;
bool dcb:1; bool dcb_vlan_mode:1;
bool iw_ooo:1; bool iw_ooo:1;
enum init_completion_state init_state; enum init_completion_state init_state;
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/bitfield.h> #include <linux/bitfield.h>
#include <linux/net/intel/iidc.h>
#include <crypto/hash.h> #include <crypto/hash.h>
#include <rdma/ib_verbs.h> #include <rdma/ib_verbs.h>
......
...@@ -611,6 +611,8 @@ struct irdma_sc_vsi { ...@@ -611,6 +611,8 @@ struct irdma_sc_vsi {
struct irdma_ws_node *tc_node); struct irdma_ws_node *tc_node);
u8 qos_rel_bw; u8 qos_rel_bw;
u8 qos_prio_type; u8 qos_prio_type;
u8 dscp_map[IIDC_MAX_DSCP_MAPPING];
bool dscp_mode:1;
}; };
struct irdma_sc_dev { struct irdma_sc_dev {
...@@ -735,11 +737,13 @@ struct irdma_l2params { ...@@ -735,11 +737,13 @@ struct irdma_l2params {
u16 qs_handle_list[IRDMA_MAX_USER_PRIORITY]; u16 qs_handle_list[IRDMA_MAX_USER_PRIORITY];
u16 mtu; u16 mtu;
u8 up2tc[IRDMA_MAX_USER_PRIORITY]; u8 up2tc[IRDMA_MAX_USER_PRIORITY];
u8 dscp_map[IIDC_MAX_DSCP_MAPPING];
u8 num_tc; u8 num_tc;
u8 vsi_rel_bw; u8 vsi_rel_bw;
u8 vsi_prio_type; u8 vsi_prio_type;
bool mtu_changed:1; bool mtu_changed:1;
bool tc_changed:1; bool tc_changed:1;
bool dscp_mode:1;
}; };
struct irdma_vsi_init_info { struct irdma_vsi_init_info {
......
...@@ -1189,7 +1189,7 @@ int irdma_modify_qp_roce(struct ib_qp *ibqp, struct ib_qp_attr *attr, ...@@ -1189,7 +1189,7 @@ int irdma_modify_qp_roce(struct ib_qp *ibqp, struct ib_qp_attr *attr,
if (ret) if (ret)
return ret; return ret;
if (vlan_id >= VLAN_N_VID && iwdev->dcb) if (vlan_id >= VLAN_N_VID && iwdev->dcb_vlan_mode)
vlan_id = 0; vlan_id = 0;
if (vlan_id < VLAN_N_VID) { if (vlan_id < VLAN_N_VID) {
udp_info->insert_vlan_tag = true; udp_info->insert_vlan_tag = true;
...@@ -4229,7 +4229,7 @@ static int irdma_create_ah(struct ib_ah *ibah, ...@@ -4229,7 +4229,7 @@ static int irdma_create_ah(struct ib_ah *ibah,
goto error; goto error;
} }
if (ah_info->vlan_tag >= VLAN_N_VID && iwdev->dcb) if (ah_info->vlan_tag >= VLAN_N_VID && iwdev->dcb_vlan_mode)
ah_info->vlan_tag = 0; ah_info->vlan_tag = 0;
if (ah_info->vlan_tag < VLAN_N_VID) { if (ah_info->vlan_tag < VLAN_N_VID) {
......
...@@ -227,6 +227,11 @@ void ice_get_qos_params(struct ice_pf *pf, struct iidc_qos_params *qos) ...@@ -227,6 +227,11 @@ void ice_get_qos_params(struct ice_pf *pf, struct iidc_qos_params *qos)
for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++) for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++)
qos->tc_info[i].rel_bw = dcbx_cfg->etscfg.tcbwtable[i]; qos->tc_info[i].rel_bw = dcbx_cfg->etscfg.tcbwtable[i];
qos->pfc_mode = dcbx_cfg->pfc_mode;
if (qos->pfc_mode == IIDC_DSCP_PFC_MODE)
for (i = 0; i < IIDC_MAX_DSCP_MAPPING; i++)
qos->dscp_map[i] = dcbx_cfg->dscp_map[i];
} }
EXPORT_SYMBOL_GPL(ice_get_qos_params); EXPORT_SYMBOL_GPL(ice_get_qos_params);
......
...@@ -32,6 +32,8 @@ enum iidc_rdma_protocol { ...@@ -32,6 +32,8 @@ enum iidc_rdma_protocol {
}; };
#define IIDC_MAX_USER_PRIORITY 8 #define IIDC_MAX_USER_PRIORITY 8
#define IIDC_MAX_DSCP_MAPPING 64
#define IIDC_DSCP_PFC_MODE 0x1
/* Struct to hold per RDMA Qset info */ /* Struct to hold per RDMA Qset info */
struct iidc_rdma_qset_params { struct iidc_rdma_qset_params {
...@@ -60,6 +62,8 @@ struct iidc_qos_params { ...@@ -60,6 +62,8 @@ struct iidc_qos_params {
u8 vport_relative_bw; u8 vport_relative_bw;
u8 vport_priority_type; u8 vport_priority_type;
u8 num_tc; u8 num_tc;
u8 pfc_mode;
u8 dscp_map[IIDC_MAX_DSCP_MAPPING];
}; };
struct iidc_event { struct iidc_event {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment