kernel: backport b53/bcm_sf2 changes from v5.7
[openwrt/openwrt.git] / target / linux / generic / backport-5.4 / 707-v5.7-0010-net-dsa-bcm_sf2-Move-writing-of-CFP_DATA-5-into-slic.patch
1 From c2d639d118d27d6419f5848675ed5c112a86910f Mon Sep 17 00:00:00 2001
2 From: Florian Fainelli <f.fainelli@gmail.com>
3 Date: Mon, 30 Mar 2020 14:38:52 -0700
4 Subject: [PATCH] net: dsa: bcm_sf2: Move writing of CFP_DATA(5) into slicing
5 functions
6
7 In preparation for matching VLANs, move the writing of CFP_DATA(5) into
8 the IPv4 and IPv6 slicing logic since they are part of the per-flow
9 configuration.
10
11 Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
12 Signed-off-by: David S. Miller <davem@davemloft.net>
13 ---
14 drivers/net/dsa/bcm_sf2_cfp.c | 64 +++++++++++++++++------------------
15 1 file changed, 32 insertions(+), 32 deletions(-)
16
17 --- a/drivers/net/dsa/bcm_sf2_cfp.c
18 +++ b/drivers/net/dsa/bcm_sf2_cfp.c
19 @@ -261,11 +261,20 @@ static int bcm_sf2_cfp_act_pol_set(struc
20 static void bcm_sf2_cfp_slice_ipv4(struct bcm_sf2_priv *priv,
21 struct flow_dissector_key_ipv4_addrs *addrs,
22 struct flow_dissector_key_ports *ports,
23 - unsigned int slice_num,
24 + unsigned int slice_num, u8 num_udf,
25 bool mask)
26 {
27 u32 reg, offset;
28
29 + /* UDF_Valid[7:0] [31:24]
30 + * S-Tag [23:8]
31 + * C-Tag [7:0]
32 + */
33 + if (mask)
34 + core_writel(priv, udf_lower_bits(num_udf) << 24, CORE_CFP_MASK_PORT(5));
35 + else
36 + core_writel(priv, udf_lower_bits(num_udf) << 24, CORE_CFP_DATA_PORT(5));
37 +
38 /* C-Tag [31:24]
39 * UDF_n_A8 [23:8]
40 * UDF_n_A7 [7:0]
41 @@ -421,18 +430,11 @@ static int bcm_sf2_cfp_ipv4_rule_set(str
42 core_writel(priv, layout->udfs[slice_num].mask_value |
43 udf_upper_bits(num_udf), CORE_CFP_MASK_PORT(6));
44
45 - /* UDF_Valid[7:0] [31:24]
46 - * S-Tag [23:8]
47 - * C-Tag [7:0]
48 - */
49 - core_writel(priv, udf_lower_bits(num_udf) << 24, CORE_CFP_DATA_PORT(5));
50 -
51 - /* Mask all but valid UDFs */
52 - core_writel(priv, udf_lower_bits(num_udf) << 24, CORE_CFP_MASK_PORT(5));
53 -
54 /* Program the match and the mask */
55 - bcm_sf2_cfp_slice_ipv4(priv, ipv4.key, ports.key, slice_num, false);
56 - bcm_sf2_cfp_slice_ipv4(priv, ipv4.mask, ports.mask, SLICE_NUM_MASK, true);
57 + bcm_sf2_cfp_slice_ipv4(priv, ipv4.key, ports.key, slice_num,
58 + num_udf, false);
59 + bcm_sf2_cfp_slice_ipv4(priv, ipv4.mask, ports.mask, SLICE_NUM_MASK,
60 + num_udf, true);
61
62 /* Insert into TCAM now */
63 bcm_sf2_cfp_rule_addr_set(priv, rule_index);
64 @@ -468,11 +470,20 @@ out_err_flow_rule:
65
66 static void bcm_sf2_cfp_slice_ipv6(struct bcm_sf2_priv *priv,
67 const __be32 *ip6_addr, const __be16 port,
68 - unsigned int slice_num,
69 + unsigned int slice_num, u32 udf_bits,
70 bool mask)
71 {
72 u32 reg, tmp, val, offset;
73
74 + /* UDF_Valid[7:0] [31:24]
75 + * S-Tag [23:8]
76 + * C-Tag [7:0]
77 + */
78 + if (mask)
79 + core_writel(priv, udf_bits << 24, CORE_CFP_MASK_PORT(5));
80 + else
81 + core_writel(priv, udf_bits << 24, CORE_CFP_DATA_PORT(5));
82 +
83 /* C-Tag [31:24]
84 * UDF_n_B8 [23:8] (port)
85 * UDF_n_B7 (upper) [7:0] (addr[15:8])
86 @@ -704,20 +715,13 @@ static int bcm_sf2_cfp_ipv6_rule_set(str
87 reg = layout->udfs[slice_num].mask_value | udf_upper_bits(num_udf);
88 core_writel(priv, reg, CORE_CFP_MASK_PORT(6));
89
90 - /* UDF_Valid[7:0] [31:24]
91 - * S-Tag [23:8]
92 - * C-Tag [7:0]
93 - */
94 - core_writel(priv, udf_lower_bits(num_udf) << 24, CORE_CFP_DATA_PORT(5));
95 -
96 - /* Mask all but valid UDFs */
97 - core_writel(priv, udf_lower_bits(num_udf) << 24, CORE_CFP_MASK_PORT(5));
98 -
99 /* Slice the IPv6 source address and port */
100 bcm_sf2_cfp_slice_ipv6(priv, ipv6.key->src.in6_u.u6_addr32,
101 - ports.key->src, slice_num, false);
102 + ports.key->src, slice_num,
103 + udf_lower_bits(num_udf), false);
104 bcm_sf2_cfp_slice_ipv6(priv, ipv6.mask->src.in6_u.u6_addr32,
105 - ports.mask->src, SLICE_NUM_MASK, true);
106 + ports.mask->src, SLICE_NUM_MASK,
107 + udf_lower_bits(num_udf), true);
108
109 /* Insert into TCAM now because we need to insert a second rule */
110 bcm_sf2_cfp_rule_addr_set(priv, rule_index[0]);
111 @@ -768,16 +772,12 @@ static int bcm_sf2_cfp_ipv6_rule_set(str
112 udf_lower_bits(num_udf) << 8;
113 core_writel(priv, reg, CORE_CFP_MASK_PORT(6));
114
115 - /* Don't care */
116 - core_writel(priv, 0, CORE_CFP_DATA_PORT(5));
117 -
118 - /* Mask all */
119 - core_writel(priv, 0, CORE_CFP_MASK_PORT(5));
120 -
121 bcm_sf2_cfp_slice_ipv6(priv, ipv6.key->dst.in6_u.u6_addr32,
122 - ports.key->dst, slice_num, false);
123 + ports.key->dst, slice_num,
124 + 0, false);
125 bcm_sf2_cfp_slice_ipv6(priv, ipv6.mask->dst.in6_u.u6_addr32,
126 - ports.key->dst, SLICE_NUM_MASK, true);
127 + ports.key->dst, SLICE_NUM_MASK,
128 + 0, true);
129
130 /* Insert into TCAM now */
131 bcm_sf2_cfp_rule_addr_set(priv, rule_index[1]);