Re: [PATCH v2 net-next 05/10] net: mscc: ocelot: VCAP IS1 support

2020-06-02 Thread Jakub Kicinski
On Tue,  2 Jun 2020 13:18:23 +0800 Xiaoliang Yang wrote:
> VCAP IS1 is a VCAP module which can filter MAC, IP, VLAN, protocol, and
> TCP/UDP ports keys, and do Qos classified and VLAN retag actions.
> 
> This patch added VCAP IS1 support in ocelot ace driver, which can supports
> vlan modify and skbedit priority action of tc filter.
> Usage:
>   tc qdisc add dev swp0 ingress
>   tc filter add dev swp0 protocol 802.1Q parent : flower \
>   skip_sw vlan_id 1 vlan_prio 1 action vlan modify id 2 priority 2
> 
> Signed-off-by: Xiaoliang Yang 

drivers/net/dsa/ocelot/felix_vsc9959.c:570:19: warning: symbol 
'vsc9959_vcap_is1_keys' was not declared. Should it be static?
drivers/net/dsa/ocelot/felix_vsc9959.c:621:19: warning: symbol 
'vsc9959_vcap_is1_actions' was not declared. Should it be static?
drivers/net/ethernet/mscc/ocelot_ace.c: In function ‘is1_entry_set’:
drivers/net/ethernet/mscc/ocelot_ace.c:733:27: warning: variable ‘ip_data’ 
set but not used [-Wunused-but-set-variable]
 733 |   struct ocelot_vcap_u48 *ip_data;
 |   ^~~
drivers/net/ethernet/mscc/ocelot_ace.c:732:32: warning: variable ‘ds’ set 
but not used [-Wunused-but-set-variable]
 732 |   struct ocelot_vcap_u8 proto, ds;
 |^~
drivers/net/ethernet/mscc/ocelot_ace.c:727:51: warning: variable ‘tcp_psh’ 
set but not used [-Wunused-but-set-variable]
 727 |   enum ocelot_vcap_bit tcp_fin, tcp_syn, tcp_rst, tcp_psh;
 |   ^~~
drivers/net/ethernet/mscc/ocelot_ace.c:727:42: warning: variable ‘tcp_rst’ 
set but not used [-Wunused-but-set-variable]
 727 |   enum ocelot_vcap_bit tcp_fin, tcp_syn, tcp_rst, tcp_psh;
 |  ^~~
drivers/net/ethernet/mscc/ocelot_ace.c:727:33: warning: variable ‘tcp_syn’ 
set but not used [-Wunused-but-set-variable]
 727 |   enum ocelot_vcap_bit tcp_fin, tcp_syn, tcp_rst, tcp_psh;
 | ^~~
drivers/net/ethernet/mscc/ocelot_ace.c:727:24: warning: variable ‘tcp_fin’ 
set but not used [-Wunused-but-set-variable]
 727 |   enum ocelot_vcap_bit tcp_fin, tcp_syn, tcp_rst, tcp_psh;
 |^~~
drivers/net/ethernet/mscc/ocelot_ace.c:726:33: warning: variable ‘tcp_urg’ 
set but not used [-Wunused-but-set-variable]
 726 |   enum ocelot_vcap_bit tcp_ack, tcp_urg;
 | ^~~
drivers/net/ethernet/mscc/ocelot_ace.c:726:24: warning: variable ‘tcp_ack’ 
set but not used [-Wunused-but-set-variable]
 726 |   enum ocelot_vcap_bit tcp_ack, tcp_urg;
 |^~~
drivers/net/ethernet/mscc/ocelot_ace.c:725:24: warning: variable ‘ttl’ set 
but not used [-Wunused-but-set-variable]
 725 |   enum ocelot_vcap_bit ttl, fragment, options;
 |^~~
drivers/net/ethernet/mscc/ocelot_ace.c:724:24: warning: variable ‘seq_zero’ 
set but not used [-Wunused-but-set-variable]
 724 |   enum ocelot_vcap_bit seq_zero, tcp;
 |^~~~
drivers/net/ethernet/mscc/ocelot_ace.c:723:36: warning: variable 
‘sport_eq_dport’ set but not used [-Wunused-but-set-variable]
 723 |   enum ocelot_vcap_bit sip_eq_dip, sport_eq_dport;
 |^~
drivers/net/ethernet/mscc/ocelot_ace.c:723:24: warning: variable 
‘sip_eq_dip’ set but not used [-Wunused-but-set-variable]
 723 |   enum ocelot_vcap_bit sip_eq_dip, sport_eq_dport;
 |^~


[PATCH v2 net-next 05/10] net: mscc: ocelot: VCAP IS1 support

2020-06-01 Thread Xiaoliang Yang
VCAP IS1 is a VCAP module which can filter MAC, IP, VLAN, protocol, and
TCP/UDP ports keys, and do Qos classified and VLAN retag actions.

This patch added VCAP IS1 support in ocelot ace driver, which can supports
vlan modify and skbedit priority action of tc filter.
Usage:
tc qdisc add dev swp0 ingress
tc filter add dev swp0 protocol 802.1Q parent : flower \
skip_sw vlan_id 1 vlan_prio 1 action vlan modify id 2 priority 2

Signed-off-by: Xiaoliang Yang 
---
 drivers/net/dsa/ocelot/felix_vsc9959.c| 102 +++
 drivers/net/ethernet/mscc/ocelot.c|   7 +
 drivers/net/ethernet/mscc/ocelot_ace.c| 198 +-
 drivers/net/ethernet/mscc/ocelot_ace.h|  11 ++
 drivers/net/ethernet/mscc/ocelot_flower.c |  11 ++
 drivers/net/ethernet/mscc/ocelot_regs.c   |   1 +
 include/soc/mscc/ocelot.h |   1 +
 include/soc/mscc/ocelot_vcap.h|  91 ++
 8 files changed, 421 insertions(+), 1 deletion(-)

diff --git a/drivers/net/dsa/ocelot/felix_vsc9959.c 
b/drivers/net/dsa/ocelot/felix_vsc9959.c
index ef3bf875e64c..f08a5f1c61a5 100644
--- a/drivers/net/dsa/ocelot/felix_vsc9959.c
+++ b/drivers/net/dsa/ocelot/felix_vsc9959.c
@@ -16,6 +16,8 @@
 #define VSC9959_VCAP_IS2_CNT   1024
 #define VSC9959_VCAP_IS2_ENTRY_WIDTH   376
 #define VSC9959_VCAP_PORT_CNT  6
+#define VSC9959_VCAP_IS1_CNT   256
+#define VSC9959_VCAP_IS1_ENTRY_WIDTH   376
 
 /* TODO: should find a better place for these */
 #define USXGMII_BMCR_RESET BIT(15)
@@ -337,6 +339,7 @@ static const u32 *vsc9959_regmap[] = {
[QSYS]  = vsc9959_qsys_regmap,
[REW]   = vsc9959_rew_regmap,
[SYS]   = vsc9959_sys_regmap,
+   [S1]= vsc9959_vcap_regmap,
[S2]= vsc9959_vcap_regmap,
[PTP]   = vsc9959_ptp_regmap,
[GCB]   = vsc9959_gcb_regmap,
@@ -369,6 +372,11 @@ static const struct resource vsc9959_target_io_res[] = {
.end= 0x001,
.name   = "sys",
},
+   [S1] = {
+   .start  = 0x005,
+   .end= 0x00503ff,
+   .name   = "s1",
+   },
[S2] = {
.start  = 0x006,
.end= 0x00603ff,
@@ -559,6 +567,80 @@ static const struct ocelot_stat_layout 
vsc9959_stats_layout[] = {
{ .offset = 0x111,  .name = "drop_green_prio_7", },
 };
 
+struct vcap_field vsc9959_vcap_is1_keys[] = {
+   [VCAP_IS1_HK_TYPE]  = {  0,   1},
+   [VCAP_IS1_HK_LOOKUP]= {  1,   2},
+   [VCAP_IS1_HK_IGR_PORT_MASK] = {  3,   7},
+   [VCAP_IS1_HK_RSV]   = { 10,   9},
+   [VCAP_IS1_HK_OAM_Y1731] = { 19,   1},
+   [VCAP_IS1_HK_L2_MC] = { 20,   1},
+   [VCAP_IS1_HK_L2_BC] = { 21,   1},
+   [VCAP_IS1_HK_IP_MC] = { 22,   1},
+   [VCAP_IS1_HK_VLAN_TAGGED]   = { 23,   1},
+   [VCAP_IS1_HK_VLAN_DBL_TAGGED]   = { 24,   1},
+   [VCAP_IS1_HK_TPID]  = { 25,   1},
+   [VCAP_IS1_HK_VID]   = { 26,  12},
+   [VCAP_IS1_HK_DEI]   = { 38,   1},
+   [VCAP_IS1_HK_PCP]   = { 39,   3},
+   /* Specific Fields for IS1 Half Key S1_NORMAL */
+   [VCAP_IS1_HK_L2_SMAC]   = { 42,  48},
+   [VCAP_IS1_HK_ETYPE_LEN] = { 90,   1},
+   [VCAP_IS1_HK_ETYPE] = { 91,  16},
+   [VCAP_IS1_HK_IP_SNAP]   = {107,   1},
+   [VCAP_IS1_HK_IP4]   = {108,   1},
+   /* Layer-3 Information */
+   [VCAP_IS1_HK_L3_FRAGMENT]   = {109,   1},
+   [VCAP_IS1_HK_L3_FRAG_OFS_GT0]   = {110,   1},
+   [VCAP_IS1_HK_L3_OPTIONS]= {111,   1},
+   [VCAP_IS1_HK_L3_DSCP]   = {112,   6},
+   [VCAP_IS1_HK_L3_IP4_SIP]= {118,  32},
+   /* Layer-4 Information */
+   [VCAP_IS1_HK_TCP_UDP]   = {150,   1},
+   [VCAP_IS1_HK_TCP]   = {151,   1},
+   [VCAP_IS1_HK_L4_SPORT]  = {152,  16},
+   [VCAP_IS1_HK_L4_RNG]= {168,   8},
+   /* Specific Fields for IS1 Half Key S1_5TUPLE_IP4 */
+   [VCAP_IS1_HK_IP4_INNER_TPID]= { 42,   1},
+   [VCAP_IS1_HK_IP4_INNER_VID] = { 43,  12},
+   [VCAP_IS1_HK_IP4_INNER_DEI] = { 55,   1},
+   [VCAP_IS1_HK_IP4_INNER_PCP] = { 56,   3},
+   [VCAP_IS1_HK_IP4_IP4]   = { 59,   1},
+   [VCAP_IS1_HK_IP4_L3_FRAGMENT]   = { 60,   1},
+   [VCAP_IS1_HK_IP4_L3_FRAG_OFS_GT0]   = { 61,   1},
+   [VCAP_IS1_HK_IP4_L3_OPTIONS]= { 62,   1},
+   [VCAP_IS1_HK_IP4_L3_DSCP]   = { 63,   6},
+   [VCAP_IS1_HK_IP4_L3_IP4_DIP]