17
17
#include "npc.h"
18
18
#include "cgx.h"
19
19
20
+ static void nix_free_tx_vtag_entries (struct rvu * rvu , u16 pcifunc );
20
21
static int rvu_nix_get_bpid (struct rvu * rvu , struct nix_bp_cfg_req * req ,
21
22
int type , int chan_id );
22
23
@@ -1251,6 +1252,10 @@ int rvu_mbox_handler_nix_lf_free(struct rvu *rvu, struct nix_lf_free_req *req,
1251
1252
else
1252
1253
rvu_npc_free_mcam_entries (rvu , pcifunc , nixlf );
1253
1254
1255
+ /* Free any tx vtag def entries used by this NIX LF */
1256
+ if (!(req -> flags & NIX_LF_DONT_FREE_TX_VTAG ))
1257
+ nix_free_tx_vtag_entries (rvu , pcifunc );
1258
+
1254
1259
nix_interface_deinit (rvu , pcifunc , nixlf );
1255
1260
1256
1261
/* Reset this NIX LF */
@@ -1992,9 +1997,149 @@ static int nix_rx_vtag_cfg(struct rvu *rvu, int nixlf, int blkaddr,
1992
1997
return 0 ;
1993
1998
}
1994
1999
2000
+ static int nix_tx_vtag_free (struct rvu * rvu , int blkaddr ,
2001
+ u16 pcifunc , int index )
2002
+ {
2003
+ struct nix_hw * nix_hw = get_nix_hw (rvu -> hw , blkaddr );
2004
+ struct nix_txvlan * vlan = & nix_hw -> txvlan ;
2005
+
2006
+ if (vlan -> entry2pfvf_map [index ] != pcifunc )
2007
+ return NIX_AF_ERR_PARAM ;
2008
+
2009
+ rvu_write64 (rvu , blkaddr ,
2010
+ NIX_AF_TX_VTAG_DEFX_DATA (index ), 0x0ull );
2011
+ rvu_write64 (rvu , blkaddr ,
2012
+ NIX_AF_TX_VTAG_DEFX_CTL (index ), 0x0ull );
2013
+
2014
+ vlan -> entry2pfvf_map [index ] = 0 ;
2015
+ rvu_free_rsrc (& vlan -> rsrc , index );
2016
+
2017
+ return 0 ;
2018
+ }
2019
+
2020
+ static void nix_free_tx_vtag_entries (struct rvu * rvu , u16 pcifunc )
2021
+ {
2022
+ struct nix_txvlan * vlan ;
2023
+ struct nix_hw * nix_hw ;
2024
+ int index , blkaddr ;
2025
+
2026
+ blkaddr = rvu_get_blkaddr (rvu , BLKTYPE_NIX , pcifunc );
2027
+ if (blkaddr < 0 )
2028
+ return ;
2029
+
2030
+ nix_hw = get_nix_hw (rvu -> hw , blkaddr );
2031
+ vlan = & nix_hw -> txvlan ;
2032
+
2033
+ mutex_lock (& vlan -> rsrc_lock );
2034
+ /* Scan all the entries and free the ones mapped to 'pcifunc' */
2035
+ for (index = 0 ; index < vlan -> rsrc .max ; index ++ ) {
2036
+ if (vlan -> entry2pfvf_map [index ] == pcifunc )
2037
+ nix_tx_vtag_free (rvu , blkaddr , pcifunc , index );
2038
+ }
2039
+ mutex_unlock (& vlan -> rsrc_lock );
2040
+ }
2041
+
2042
+ static int nix_tx_vtag_alloc (struct rvu * rvu , int blkaddr ,
2043
+ u64 vtag , u8 size )
2044
+ {
2045
+ struct nix_hw * nix_hw = get_nix_hw (rvu -> hw , blkaddr );
2046
+ struct nix_txvlan * vlan = & nix_hw -> txvlan ;
2047
+ u64 regval ;
2048
+ int index ;
2049
+
2050
+ mutex_lock (& vlan -> rsrc_lock );
2051
+
2052
+ index = rvu_alloc_rsrc (& vlan -> rsrc );
2053
+ if (index < 0 ) {
2054
+ mutex_unlock (& vlan -> rsrc_lock );
2055
+ return index ;
2056
+ }
2057
+
2058
+ mutex_unlock (& vlan -> rsrc_lock );
2059
+
2060
+ regval = size ? vtag : vtag << 32 ;
2061
+
2062
+ rvu_write64 (rvu , blkaddr ,
2063
+ NIX_AF_TX_VTAG_DEFX_DATA (index ), regval );
2064
+ rvu_write64 (rvu , blkaddr ,
2065
+ NIX_AF_TX_VTAG_DEFX_CTL (index ), size );
2066
+
2067
+ return index ;
2068
+ }
2069
+
2070
+ static int nix_tx_vtag_decfg (struct rvu * rvu , int blkaddr ,
2071
+ struct nix_vtag_config * req )
2072
+ {
2073
+ struct nix_hw * nix_hw = get_nix_hw (rvu -> hw , blkaddr );
2074
+ struct nix_txvlan * vlan = & nix_hw -> txvlan ;
2075
+ u16 pcifunc = req -> hdr .pcifunc ;
2076
+ int idx0 = req -> tx .vtag0_idx ;
2077
+ int idx1 = req -> tx .vtag1_idx ;
2078
+ int err ;
2079
+
2080
+ if (req -> tx .free_vtag0 && req -> tx .free_vtag1 )
2081
+ if (vlan -> entry2pfvf_map [idx0 ] != pcifunc ||
2082
+ vlan -> entry2pfvf_map [idx1 ] != pcifunc )
2083
+ return NIX_AF_ERR_PARAM ;
2084
+
2085
+ mutex_lock (& vlan -> rsrc_lock );
2086
+
2087
+ if (req -> tx .free_vtag0 ) {
2088
+ err = nix_tx_vtag_free (rvu , blkaddr , pcifunc , idx0 );
2089
+ if (err )
2090
+ goto exit ;
2091
+ }
2092
+
2093
+ if (req -> tx .free_vtag1 )
2094
+ err = nix_tx_vtag_free (rvu , blkaddr , pcifunc , idx1 );
2095
+
2096
+ exit :
2097
+ mutex_unlock (& vlan -> rsrc_lock );
2098
+ return err ;
2099
+ }
2100
+
2101
+ static int nix_tx_vtag_cfg (struct rvu * rvu , int blkaddr ,
2102
+ struct nix_vtag_config * req ,
2103
+ struct nix_vtag_config_rsp * rsp )
2104
+ {
2105
+ struct nix_hw * nix_hw = get_nix_hw (rvu -> hw , blkaddr );
2106
+ struct nix_txvlan * vlan = & nix_hw -> txvlan ;
2107
+ u16 pcifunc = req -> hdr .pcifunc ;
2108
+
2109
+ if (req -> tx .cfg_vtag0 ) {
2110
+ rsp -> vtag0_idx =
2111
+ nix_tx_vtag_alloc (rvu , blkaddr ,
2112
+ req -> tx .vtag0 , req -> vtag_size );
2113
+
2114
+ if (rsp -> vtag0_idx < 0 )
2115
+ return NIX_AF_ERR_TX_VTAG_NOSPC ;
2116
+
2117
+ vlan -> entry2pfvf_map [rsp -> vtag0_idx ] = pcifunc ;
2118
+ }
2119
+
2120
+ if (req -> tx .cfg_vtag1 ) {
2121
+ rsp -> vtag1_idx =
2122
+ nix_tx_vtag_alloc (rvu , blkaddr ,
2123
+ req -> tx .vtag1 , req -> vtag_size );
2124
+
2125
+ if (rsp -> vtag1_idx < 0 )
2126
+ goto err_free ;
2127
+
2128
+ vlan -> entry2pfvf_map [rsp -> vtag1_idx ] = pcifunc ;
2129
+ }
2130
+
2131
+ return 0 ;
2132
+
2133
+ err_free :
2134
+ if (req -> tx .cfg_vtag0 )
2135
+ nix_tx_vtag_free (rvu , blkaddr , pcifunc , rsp -> vtag0_idx );
2136
+
2137
+ return NIX_AF_ERR_TX_VTAG_NOSPC ;
2138
+ }
2139
+
1995
2140
int rvu_mbox_handler_nix_vtag_cfg (struct rvu * rvu ,
1996
2141
struct nix_vtag_config * req ,
1997
- struct msg_rsp * rsp )
2142
+ struct nix_vtag_config_rsp * rsp )
1998
2143
{
1999
2144
u16 pcifunc = req -> hdr .pcifunc ;
2000
2145
int blkaddr , nixlf , err ;
@@ -2004,12 +2149,21 @@ int rvu_mbox_handler_nix_vtag_cfg(struct rvu *rvu,
2004
2149
return err ;
2005
2150
2006
2151
if (req -> cfg_type ) {
2152
+ /* rx vtag configuration */
2007
2153
err = nix_rx_vtag_cfg (rvu , nixlf , blkaddr , req );
2008
2154
if (err )
2009
2155
return NIX_AF_ERR_PARAM ;
2010
2156
} else {
2011
- /* TODO: handle tx vtag configuration */
2012
- return 0 ;
2157
+ /* tx vtag configuration */
2158
+ if ((req -> tx .cfg_vtag0 || req -> tx .cfg_vtag1 ) &&
2159
+ (req -> tx .free_vtag0 || req -> tx .free_vtag1 ))
2160
+ return NIX_AF_ERR_PARAM ;
2161
+
2162
+ if (req -> tx .cfg_vtag0 || req -> tx .cfg_vtag1 )
2163
+ return nix_tx_vtag_cfg (rvu , blkaddr , req , rsp );
2164
+
2165
+ if (req -> tx .free_vtag0 || req -> tx .free_vtag1 )
2166
+ return nix_tx_vtag_decfg (rvu , blkaddr , req );
2013
2167
}
2014
2168
2015
2169
return 0 ;
@@ -2247,6 +2401,31 @@ static int nix_setup_mcast(struct rvu *rvu, struct nix_hw *nix_hw, int blkaddr)
2247
2401
return nix_setup_bcast_tables (rvu , nix_hw );
2248
2402
}
2249
2403
2404
+ static int nix_setup_txvlan (struct rvu * rvu , struct nix_hw * nix_hw )
2405
+ {
2406
+ struct nix_txvlan * vlan = & nix_hw -> txvlan ;
2407
+ int err ;
2408
+
2409
+ /* Allocate resource bimap for tx vtag def registers*/
2410
+ vlan -> rsrc .max = NIX_TX_VTAG_DEF_MAX ;
2411
+ err = rvu_alloc_bitmap (& vlan -> rsrc );
2412
+ if (err )
2413
+ return - ENOMEM ;
2414
+
2415
+ /* Alloc memory for saving entry to RVU PFFUNC allocation mapping */
2416
+ vlan -> entry2pfvf_map = devm_kcalloc (rvu -> dev , vlan -> rsrc .max ,
2417
+ sizeof (u16 ), GFP_KERNEL );
2418
+ if (!vlan -> entry2pfvf_map )
2419
+ goto free_mem ;
2420
+
2421
+ mutex_init (& vlan -> rsrc_lock );
2422
+ return 0 ;
2423
+
2424
+ free_mem :
2425
+ kfree (vlan -> rsrc .bmap );
2426
+ return - ENOMEM ;
2427
+ }
2428
+
2250
2429
static int nix_setup_txschq (struct rvu * rvu , struct nix_hw * nix_hw , int blkaddr )
2251
2430
{
2252
2431
struct nix_txsch * txsch ;
@@ -3241,6 +3420,10 @@ static int rvu_nix_block_init(struct rvu *rvu, struct nix_hw *nix_hw)
3241
3420
if (err )
3242
3421
return err ;
3243
3422
3423
+ err = nix_setup_txvlan (rvu , nix_hw );
3424
+ if (err )
3425
+ return err ;
3426
+
3244
3427
/* Configure segmentation offload formats */
3245
3428
nix_setup_lso (rvu , nix_hw , blkaddr );
3246
3429
@@ -3327,6 +3510,7 @@ static void rvu_nix_block_freemem(struct rvu *rvu, int blkaddr,
3327
3510
{
3328
3511
struct nix_txsch * txsch ;
3329
3512
struct nix_mcast * mcast ;
3513
+ struct nix_txvlan * vlan ;
3330
3514
struct nix_hw * nix_hw ;
3331
3515
int lvl ;
3332
3516
@@ -3342,6 +3526,11 @@ static void rvu_nix_block_freemem(struct rvu *rvu, int blkaddr,
3342
3526
kfree (txsch -> schq .bmap );
3343
3527
}
3344
3528
3529
+ vlan = & nix_hw -> txvlan ;
3530
+ kfree (vlan -> rsrc .bmap );
3531
+ mutex_destroy (& vlan -> rsrc_lock );
3532
+ devm_kfree (rvu -> dev , vlan -> entry2pfvf_map );
3533
+
3345
3534
mcast = & nix_hw -> mcast ;
3346
3535
qmem_free (rvu -> dev , mcast -> mce_ctx );
3347
3536
qmem_free (rvu -> dev , mcast -> mcast_buf );
0 commit comments