-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge tag 'mlx5e-updates-2018-05-19' of git://git.kernel.org/pub/scm/…
…linux/kernel/git/saeed/linux Saeed Mahameed says: ==================== mlx5e-updates-2018-05-19 This series contains updates for mlx5e netdevice driver with one subject, DSCP to priority mapping, in the first patch Huy adds the needed API in dcbnl, the second patch adds the needed mlx5 core capability bits for the feature, and all other patches are mlx5e (netdev) only changes to add support for the feature. From: Huy Nguyen Dscp to priority mapping for Ethernet packet: These patches enable differentiated services code point (dscp) to priority mapping for Ethernet packet. Once this feature is enabled, the packet is routed to the corresponding priority based on its dscp. User can combine this feature with priority flow control (pfc) feature to have priority flow control based on the dscp. Firmware interface: Mellanox firmware provides two control knobs for this feature: QPTS register allow changing the trust state between dscp and pcp mode. The default is pcp mode. Once in dscp mode, firmware will route the packet based on its dscp value if the dscp field exists. QPDPM register allow mapping a specific dscp (0 to 63) to a specific priority (0 to 7). By default, all the dscps are mapped to priority zero. Software interface: This feature is controlled via application priority TLV. IEEE specification P802.1Qcd/D2.1 defines priority selector id 5 for application priority TLV. This APP TLV selector defines DSCP to priority map. This APP TLV can be sent by the switch or can be set locally using software such as lldptool. In mlx5 drivers, we add the support for net dcb's getapp and setapp call back. Mlx5 driver only handles the selector id 5 application entry (dscp application priority application entry). If user sends multiple dscp to priority APP TLV entries on the same dscp, the last sent one will take effect. All the previous sent will be deleted. This attribute combined with pfc attribute allows advanced user to fine tune the qos setting for specific priority queue. For example, user can give dedicated buffer for one or more priorities or user can give large buffer to certain priorities. The dcb buffer configuration will be controlled by lldptool. >> lldptool -T -i eth2 -V BUFFER prio 0,2,5,7,1,2,3,6 maps priorities 0,1,2,3,4,5,6,7 to receive buffer 0,2,5,7,1,2,3,6 >> lldptool -T -i eth2 -V BUFFER size 87296,87296,0,87296,0,0,0,0 sets receive buffer size for buffer 0,1,2,3,4,5,6,7 respectively After discussion on mailing list with Jakub, Jiri, Ido and John, we agreed to choose dcbnl over devlink interface since this feature is intended to set port attributes which are governed by the netdev instance of that port, where devlink API is more suitable for global ASIC configurations. The firmware trust state (in QPTS register) is changed based on the number of dscp to priority application entries. When the first dscp to priority application entry is added by the user, the trust state is changed to dscp. When the last dscp to priority application entry is deleted by the user, the trust state is changed to pcp. When the port is in DSCP trust state, the transmit queue is selected based on the dscp of the skb. When the port is in DSCP trust state and vport inline mode is not NONE, firmware requires mlx5 driver to copy the IP header to the wqe ethernet segment inline header if the skb has it. This is done by changing the transmit queue sq's min inline mode to L3. Note that the min inline mode of sqs that belong to other features such as xdpsq, icosq are not modified. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
- Loading branch information
Showing
17 changed files
with
947 additions
and
80 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
subdir-ccflags-y += -I$(src)/.. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,237 @@ | ||
/* | ||
* Copyright (c) 2018, Mellanox Technologies. All rights reserved. | ||
* | ||
* This software is available to you under a choice of one of two | ||
* licenses. You may choose to be licensed under the terms of the GNU | ||
* General Public License (GPL) Version 2, available from the file | ||
* COPYING in the main directory of this source tree, or the | ||
* OpenIB.org BSD license below: | ||
* | ||
* Redistribution and use in source and binary forms, with or | ||
* without modification, are permitted provided that the following | ||
* conditions are met: | ||
* | ||
* - Redistributions of source code must retain the above | ||
* copyright notice, this list of conditions and the following | ||
* disclaimer. | ||
* | ||
* - Redistributions in binary form must reproduce the above | ||
* copyright notice, this list of conditions and the following | ||
* disclaimer in the documentation and/or other materials | ||
* provided with the distribution. | ||
* | ||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS | ||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN | ||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||
* SOFTWARE. | ||
*/ | ||
|
||
#include "port.h" | ||
|
||
/* speed in units of 1Mb */ | ||
static const u32 mlx5e_link_speed[MLX5E_LINK_MODES_NUMBER] = { | ||
[MLX5E_1000BASE_CX_SGMII] = 1000, | ||
[MLX5E_1000BASE_KX] = 1000, | ||
[MLX5E_10GBASE_CX4] = 10000, | ||
[MLX5E_10GBASE_KX4] = 10000, | ||
[MLX5E_10GBASE_KR] = 10000, | ||
[MLX5E_20GBASE_KR2] = 20000, | ||
[MLX5E_40GBASE_CR4] = 40000, | ||
[MLX5E_40GBASE_KR4] = 40000, | ||
[MLX5E_56GBASE_R4] = 56000, | ||
[MLX5E_10GBASE_CR] = 10000, | ||
[MLX5E_10GBASE_SR] = 10000, | ||
[MLX5E_10GBASE_ER] = 10000, | ||
[MLX5E_40GBASE_SR4] = 40000, | ||
[MLX5E_40GBASE_LR4] = 40000, | ||
[MLX5E_50GBASE_SR2] = 50000, | ||
[MLX5E_100GBASE_CR4] = 100000, | ||
[MLX5E_100GBASE_SR4] = 100000, | ||
[MLX5E_100GBASE_KR4] = 100000, | ||
[MLX5E_100GBASE_LR4] = 100000, | ||
[MLX5E_100BASE_TX] = 100, | ||
[MLX5E_1000BASE_T] = 1000, | ||
[MLX5E_10GBASE_T] = 10000, | ||
[MLX5E_25GBASE_CR] = 25000, | ||
[MLX5E_25GBASE_KR] = 25000, | ||
[MLX5E_25GBASE_SR] = 25000, | ||
[MLX5E_50GBASE_CR2] = 50000, | ||
[MLX5E_50GBASE_KR2] = 50000, | ||
}; | ||
|
||
u32 mlx5e_port_ptys2speed(u32 eth_proto_oper) | ||
{ | ||
unsigned long temp = eth_proto_oper; | ||
u32 speed = 0; | ||
int i; | ||
|
||
i = find_first_bit(&temp, MLX5E_LINK_MODES_NUMBER); | ||
if (i < MLX5E_LINK_MODES_NUMBER) | ||
speed = mlx5e_link_speed[i]; | ||
|
||
return speed; | ||
} | ||
|
||
int mlx5e_port_linkspeed(struct mlx5_core_dev *mdev, u32 *speed) | ||
{ | ||
u32 out[MLX5_ST_SZ_DW(ptys_reg)] = {}; | ||
u32 eth_proto_oper; | ||
int err; | ||
|
||
err = mlx5_query_port_ptys(mdev, out, sizeof(out), MLX5_PTYS_EN, 1); | ||
if (err) | ||
return err; | ||
|
||
eth_proto_oper = MLX5_GET(ptys_reg, out, eth_proto_oper); | ||
*speed = mlx5e_port_ptys2speed(eth_proto_oper); | ||
if (!(*speed)) { | ||
mlx5_core_warn(mdev, "cannot get port speed\n"); | ||
err = -EINVAL; | ||
} | ||
|
||
return err; | ||
} | ||
|
||
int mlx5e_port_max_linkspeed(struct mlx5_core_dev *mdev, u32 *speed) | ||
{ | ||
u32 max_speed = 0; | ||
u32 proto_cap; | ||
int err; | ||
int i; | ||
|
||
err = mlx5_query_port_proto_cap(mdev, &proto_cap, MLX5_PTYS_EN); | ||
if (err) | ||
return err; | ||
|
||
for (i = 0; i < MLX5E_LINK_MODES_NUMBER; ++i) | ||
if (proto_cap & MLX5E_PROT_MASK(i)) | ||
max_speed = max(max_speed, mlx5e_link_speed[i]); | ||
|
||
*speed = max_speed; | ||
return 0; | ||
} | ||
|
||
u32 mlx5e_port_speed2linkmodes(u32 speed) | ||
{ | ||
u32 link_modes = 0; | ||
int i; | ||
|
||
for (i = 0; i < MLX5E_LINK_MODES_NUMBER; ++i) { | ||
if (mlx5e_link_speed[i] == speed) | ||
link_modes |= MLX5E_PROT_MASK(i); | ||
} | ||
|
||
return link_modes; | ||
} | ||
|
||
int mlx5e_port_query_pbmc(struct mlx5_core_dev *mdev, void *out) | ||
{ | ||
int sz = MLX5_ST_SZ_BYTES(pbmc_reg); | ||
void *in; | ||
int err; | ||
|
||
in = kzalloc(sz, GFP_KERNEL); | ||
if (!in) | ||
return -ENOMEM; | ||
|
||
MLX5_SET(pbmc_reg, in, local_port, 1); | ||
err = mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PBMC, 0, 0); | ||
|
||
kfree(in); | ||
return err; | ||
} | ||
|
||
int mlx5e_port_set_pbmc(struct mlx5_core_dev *mdev, void *in) | ||
{ | ||
int sz = MLX5_ST_SZ_BYTES(pbmc_reg); | ||
void *out; | ||
int err; | ||
|
||
out = kzalloc(sz, GFP_KERNEL); | ||
if (!out) | ||
return -ENOMEM; | ||
|
||
MLX5_SET(pbmc_reg, in, local_port, 1); | ||
err = mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PBMC, 0, 1); | ||
|
||
kfree(out); | ||
return err; | ||
} | ||
|
||
/* buffer[i]: buffer that priority i mapped to */ | ||
int mlx5e_port_query_priority2buffer(struct mlx5_core_dev *mdev, u8 *buffer) | ||
{ | ||
int sz = MLX5_ST_SZ_BYTES(pptb_reg); | ||
u32 prio_x_buff; | ||
void *out; | ||
void *in; | ||
int prio; | ||
int err; | ||
|
||
in = kzalloc(sz, GFP_KERNEL); | ||
out = kzalloc(sz, GFP_KERNEL); | ||
if (!in || !out) { | ||
err = -ENOMEM; | ||
goto out; | ||
} | ||
|
||
MLX5_SET(pptb_reg, in, local_port, 1); | ||
err = mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPTB, 0, 0); | ||
if (err) | ||
goto out; | ||
|
||
prio_x_buff = MLX5_GET(pptb_reg, out, prio_x_buff); | ||
for (prio = 0; prio < 8; prio++) { | ||
buffer[prio] = (u8)(prio_x_buff >> (4 * prio)) & 0xF; | ||
mlx5_core_dbg(mdev, "prio %d, buffer %d\n", prio, buffer[prio]); | ||
} | ||
out: | ||
kfree(in); | ||
kfree(out); | ||
return err; | ||
} | ||
|
||
int mlx5e_port_set_priority2buffer(struct mlx5_core_dev *mdev, u8 *buffer) | ||
{ | ||
int sz = MLX5_ST_SZ_BYTES(pptb_reg); | ||
u32 prio_x_buff; | ||
void *out; | ||
void *in; | ||
int prio; | ||
int err; | ||
|
||
in = kzalloc(sz, GFP_KERNEL); | ||
out = kzalloc(sz, GFP_KERNEL); | ||
if (!in || !out) { | ||
err = -ENOMEM; | ||
goto out; | ||
} | ||
|
||
/* First query the pptb register */ | ||
MLX5_SET(pptb_reg, in, local_port, 1); | ||
err = mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPTB, 0, 0); | ||
if (err) | ||
goto out; | ||
|
||
memcpy(in, out, sz); | ||
MLX5_SET(pptb_reg, in, local_port, 1); | ||
|
||
/* Update the pm and prio_x_buff */ | ||
MLX5_SET(pptb_reg, in, pm, 0xFF); | ||
|
||
prio_x_buff = 0; | ||
for (prio = 0; prio < 8; prio++) | ||
prio_x_buff |= (buffer[prio] << (4 * prio)); | ||
MLX5_SET(pptb_reg, in, prio_x_buff, prio_x_buff); | ||
|
||
err = mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPTB, 0, 1); | ||
|
||
out: | ||
kfree(in); | ||
kfree(out); | ||
return err; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
/* | ||
* Copyright (c) 2018, Mellanox Technologies. All rights reserved. | ||
* | ||
* This software is available to you under a choice of one of two | ||
* licenses. You may choose to be licensed under the terms of the GNU | ||
* General Public License (GPL) Version 2, available from the file | ||
* COPYING in the main directory of this source tree, or the | ||
* OpenIB.org BSD license below: | ||
* | ||
* Redistribution and use in source and binary forms, with or | ||
* without modification, are permitted provided that the following | ||
* conditions are met: | ||
* | ||
* - Redistributions of source code must retain the above | ||
* copyright notice, this list of conditions and the following | ||
* disclaimer. | ||
* | ||
* - Redistributions in binary form must reproduce the above | ||
* copyright notice, this list of conditions and the following | ||
* disclaimer in the documentation and/or other materials | ||
* provided with the distribution. | ||
* | ||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS | ||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN | ||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||
* SOFTWARE. | ||
*/ | ||
|
||
#ifndef __MLX5E_EN_PORT_H | ||
#define __MLX5E_EN_PORT_H | ||
|
||
#include <linux/mlx5/driver.h> | ||
#include "en.h" | ||
|
||
u32 mlx5e_port_ptys2speed(u32 eth_proto_oper); | ||
int mlx5e_port_linkspeed(struct mlx5_core_dev *mdev, u32 *speed); | ||
int mlx5e_port_max_linkspeed(struct mlx5_core_dev *mdev, u32 *speed); | ||
u32 mlx5e_port_speed2linkmodes(u32 speed); | ||
|
||
int mlx5e_port_query_pbmc(struct mlx5_core_dev *mdev, void *out); | ||
int mlx5e_port_set_pbmc(struct mlx5_core_dev *mdev, void *in); | ||
int mlx5e_port_query_priority2buffer(struct mlx5_core_dev *mdev, u8 *buffer); | ||
int mlx5e_port_set_priority2buffer(struct mlx5_core_dev *mdev, u8 *buffer); | ||
#endif |
Oops, something went wrong.