Skip to content

Commit

Permalink
net: lan966x: Add IS1 VCAP keyset configuration for lan966x
Browse files Browse the repository at this point in the history
Add IS1 VCAP port keyset configuration for lan966x and also update debug
fs support to show the keyset configuration.

Signed-off-by: Horatiu Vultur <horatiu.vultur@microchip.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
  • Loading branch information
Horatiu Vultur authored and Jakub Kicinski committed Mar 11, 2023
1 parent 99ce286 commit a4d9b3e
Show file tree
Hide file tree
Showing 4 changed files with 383 additions and 16 deletions.
38 changes: 38 additions & 0 deletions drivers/net/ethernet/microchip/lan966x/lan966x_main.h
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,11 @@
#define SE_IDX_QUEUE 0 /* 0-79 : Queue scheduler elements */
#define SE_IDX_PORT 80 /* 80-89 : Port schedular elements */

#define LAN966X_VCAP_CID_IS1_L0 VCAP_CID_INGRESS_L0 /* IS1 lookup 0 */
#define LAN966X_VCAP_CID_IS1_L1 VCAP_CID_INGRESS_L1 /* IS1 lookup 1 */
#define LAN966X_VCAP_CID_IS1_L2 VCAP_CID_INGRESS_L2 /* IS1 lookup 2 */
#define LAN966X_VCAP_CID_IS1_MAX (VCAP_CID_INGRESS_L3 - 1) /* IS1 Max */

#define LAN966X_VCAP_CID_IS2_L0 VCAP_CID_INGRESS_STAGE2_L0 /* IS2 lookup 0 */
#define LAN966X_VCAP_CID_IS2_L1 VCAP_CID_INGRESS_STAGE2_L1 /* IS2 lookup 1 */
#define LAN966X_VCAP_CID_IS2_MAX (VCAP_CID_INGRESS_STAGE2_L2 - 1) /* IS2 Max */
Expand Down Expand Up @@ -139,6 +144,39 @@ enum vcap_is2_port_sel_ipv6 {
VCAP_IS2_PS_IPV6_MAC_ETYPE,
};

enum vcap_is1_port_sel_other {
VCAP_IS1_PS_OTHER_NORMAL,
VCAP_IS1_PS_OTHER_7TUPLE,
VCAP_IS1_PS_OTHER_DBL_VID,
VCAP_IS1_PS_OTHER_DMAC_VID,
};

enum vcap_is1_port_sel_ipv4 {
VCAP_IS1_PS_IPV4_NORMAL,
VCAP_IS1_PS_IPV4_7TUPLE,
VCAP_IS1_PS_IPV4_5TUPLE_IP4,
VCAP_IS1_PS_IPV4_DBL_VID,
VCAP_IS1_PS_IPV4_DMAC_VID,
};

enum vcap_is1_port_sel_ipv6 {
VCAP_IS1_PS_IPV6_NORMAL,
VCAP_IS1_PS_IPV6_7TUPLE,
VCAP_IS1_PS_IPV6_5TUPLE_IP4,
VCAP_IS1_PS_IPV6_NORMAL_IP6,
VCAP_IS1_PS_IPV6_5TUPLE_IP6,
VCAP_IS1_PS_IPV6_DBL_VID,
VCAP_IS1_PS_IPV6_DMAC_VID,
};

enum vcap_is1_port_sel_rt {
VCAP_IS1_PS_RT_NORMAL,
VCAP_IS1_PS_RT_7TUPLE,
VCAP_IS1_PS_RT_DBL_VID,
VCAP_IS1_PS_RT_DMAC_VID,
VCAP_IS1_PS_RT_FOLLOW_OTHER = 7,
};

struct lan966x_port;

struct lan966x_db {
Expand Down
36 changes: 36 additions & 0 deletions drivers/net/ethernet/microchip/lan966x/lan966x_regs.h
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,42 @@ enum lan966x_target {
#define ANA_DROP_CFG_DROP_MC_SMAC_ENA_GET(x)\
FIELD_GET(ANA_DROP_CFG_DROP_MC_SMAC_ENA, x)

/* ANA:PORT:VCAP_CFG */
#define ANA_VCAP_CFG(g) __REG(TARGET_ANA, 0, 1, 28672, g, 9, 128, 12, 0, 1, 4)

#define ANA_VCAP_CFG_S1_ENA BIT(14)
#define ANA_VCAP_CFG_S1_ENA_SET(x)\
FIELD_PREP(ANA_VCAP_CFG_S1_ENA, x)
#define ANA_VCAP_CFG_S1_ENA_GET(x)\
FIELD_GET(ANA_VCAP_CFG_S1_ENA, x)

/* ANA:PORT:VCAP_S1_KEY_CFG */
#define ANA_VCAP_S1_CFG(g, r) __REG(TARGET_ANA, 0, 1, 28672, g, 9, 128, 16, r, 3, 4)

#define ANA_VCAP_S1_CFG_KEY_RT_CFG GENMASK(11, 9)
#define ANA_VCAP_S1_CFG_KEY_RT_CFG_SET(x)\
FIELD_PREP(ANA_VCAP_S1_CFG_KEY_RT_CFG, x)
#define ANA_VCAP_S1_CFG_KEY_RT_CFG_GET(x)\
FIELD_GET(ANA_VCAP_S1_CFG_KEY_RT_CFG, x)

#define ANA_VCAP_S1_CFG_KEY_IP6_CFG GENMASK(8, 6)
#define ANA_VCAP_S1_CFG_KEY_IP6_CFG_SET(x)\
FIELD_PREP(ANA_VCAP_S1_CFG_KEY_IP6_CFG, x)
#define ANA_VCAP_S1_CFG_KEY_IP6_CFG_GET(x)\
FIELD_GET(ANA_VCAP_S1_CFG_KEY_IP6_CFG, x)

#define ANA_VCAP_S1_CFG_KEY_IP4_CFG GENMASK(5, 3)
#define ANA_VCAP_S1_CFG_KEY_IP4_CFG_SET(x)\
FIELD_PREP(ANA_VCAP_S1_CFG_KEY_IP4_CFG, x)
#define ANA_VCAP_S1_CFG_KEY_IP4_CFG_GET(x)\
FIELD_GET(ANA_VCAP_S1_CFG_KEY_IP4_CFG, x)

#define ANA_VCAP_S1_CFG_KEY_OTHER_CFG GENMASK(2, 0)
#define ANA_VCAP_S1_CFG_KEY_OTHER_CFG_SET(x)\
FIELD_PREP(ANA_VCAP_S1_CFG_KEY_OTHER_CFG, x)
#define ANA_VCAP_S1_CFG_KEY_OTHER_CFG_GET(x)\
FIELD_GET(ANA_VCAP_S1_CFG_KEY_OTHER_CFG, x)

/* ANA:PORT:VCAP_S2_CFG */
#define ANA_VCAP_S2_CFG(g) __REG(TARGET_ANA, 0, 1, 28672, g, 9, 128, 28, 0, 1, 4)

Expand Down
133 changes: 129 additions & 4 deletions drivers/net/ethernet/microchip/lan966x/lan966x_vcap_debugfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,124 @@
#include "vcap_api.h"
#include "vcap_api_client.h"

static void lan966x_vcap_port_keys(struct lan966x_port *port,
struct vcap_admin *admin,
struct vcap_output_print *out)
static void lan966x_vcap_is1_port_keys(struct lan966x_port *port,
struct vcap_admin *admin,
struct vcap_output_print *out)
{
struct lan966x *lan966x = port->lan966x;
u32 val;

out->prf(out->dst, " port[%d] (%s): ", port->chip_port,
netdev_name(port->dev));

val = lan_rd(lan966x, ANA_VCAP_CFG(port->chip_port));
out->prf(out->dst, "\n state: ");
if (ANA_VCAP_CFG_S1_ENA_GET(val))
out->prf(out->dst, "on");
else
out->prf(out->dst, "off");

for (int l = 0; l < admin->lookups; ++l) {
out->prf(out->dst, "\n Lookup %d: ", l);

out->prf(out->dst, "\n other: ");
switch (ANA_VCAP_S1_CFG_KEY_OTHER_CFG_GET(val)) {
case VCAP_IS1_PS_OTHER_NORMAL:
out->prf(out->dst, "normal");
break;
case VCAP_IS1_PS_OTHER_7TUPLE:
out->prf(out->dst, "7tuple");
break;
case VCAP_IS1_PS_OTHER_DBL_VID:
out->prf(out->dst, "dbl_vid");
break;
case VCAP_IS1_PS_OTHER_DMAC_VID:
out->prf(out->dst, "dmac_vid");
break;
default:
out->prf(out->dst, "-");
break;
}

out->prf(out->dst, "\n ipv4: ");
switch (ANA_VCAP_S1_CFG_KEY_IP4_CFG_GET(val)) {
case VCAP_IS1_PS_IPV4_NORMAL:
out->prf(out->dst, "normal");
break;
case VCAP_IS1_PS_IPV4_7TUPLE:
out->prf(out->dst, "7tuple");
break;
case VCAP_IS1_PS_IPV4_5TUPLE_IP4:
out->prf(out->dst, "5tuple_ipv4");
break;
case VCAP_IS1_PS_IPV4_DBL_VID:
out->prf(out->dst, "dbl_vid");
break;
case VCAP_IS1_PS_IPV4_DMAC_VID:
out->prf(out->dst, "dmac_vid");
break;
default:
out->prf(out->dst, "-");
break;
}

out->prf(out->dst, "\n ipv6: ");
switch (ANA_VCAP_S1_CFG_KEY_IP6_CFG_GET(val)) {
case VCAP_IS1_PS_IPV6_NORMAL:
out->prf(out->dst, "normal");
break;
case VCAP_IS1_PS_IPV6_7TUPLE:
out->prf(out->dst, "7tuple");
break;
case VCAP_IS1_PS_IPV6_5TUPLE_IP4:
out->prf(out->dst, "5tuple_ip4");
break;
case VCAP_IS1_PS_IPV6_NORMAL_IP6:
out->prf(out->dst, "normal_ip6");
break;
case VCAP_IS1_PS_IPV6_5TUPLE_IP6:
out->prf(out->dst, "5tuple_ip6");
break;
case VCAP_IS1_PS_IPV6_DBL_VID:
out->prf(out->dst, "dbl_vid");
break;
case VCAP_IS1_PS_IPV6_DMAC_VID:
out->prf(out->dst, "dmac_vid");
break;
default:
out->prf(out->dst, "-");
break;
}

out->prf(out->dst, "\n rt: ");
switch (ANA_VCAP_S1_CFG_KEY_RT_CFG_GET(val)) {
case VCAP_IS1_PS_RT_NORMAL:
out->prf(out->dst, "normal");
break;
case VCAP_IS1_PS_RT_7TUPLE:
out->prf(out->dst, "7tuple");
break;
case VCAP_IS1_PS_RT_DBL_VID:
out->prf(out->dst, "dbl_vid");
break;
case VCAP_IS1_PS_RT_DMAC_VID:
out->prf(out->dst, "dmac_vid");
break;
case VCAP_IS1_PS_RT_FOLLOW_OTHER:
out->prf(out->dst, "follow_other");
break;
default:
out->prf(out->dst, "-");
break;
}
}

out->prf(out->dst, "\n");
}

static void lan966x_vcap_is2_port_keys(struct lan966x_port *port,
struct vcap_admin *admin,
struct vcap_output_print *out)
{
struct lan966x *lan966x = port->lan966x;
u32 val;
Expand Down Expand Up @@ -88,7 +203,17 @@ int lan966x_vcap_port_info(struct net_device *dev,
vcap = &vctrl->vcaps[admin->vtype];

out->prf(out->dst, "%s:\n", vcap->name);
lan966x_vcap_port_keys(port, admin, out);
switch (admin->vtype) {
case VCAP_TYPE_IS2:
lan966x_vcap_is2_port_keys(port, admin, out);
break;
case VCAP_TYPE_IS1:
lan966x_vcap_is1_port_keys(port, admin, out);
break;
default:
out->prf(out->dst, " no info\n");
break;
}

return 0;
}
Loading

0 comments on commit a4d9b3e

Please sign in to comment.