1*d6ac6f45SJoshua Washington /* SPDX-License-Identifier: BSD-3-Clause
2*d6ac6f45SJoshua Washington * Copyright (c) 2023 Google LLC
3*d6ac6f45SJoshua Washington */
4*d6ac6f45SJoshua Washington
5*d6ac6f45SJoshua Washington #include "gve_adminq.h"
6*d6ac6f45SJoshua Washington #include "gve_ethdev.h"
7*d6ac6f45SJoshua Washington
8*d6ac6f45SJoshua Washington #define GVE_RSS_HASH_IPV4 BIT(0)
9*d6ac6f45SJoshua Washington #define GVE_RSS_HASH_TCPV4 BIT(1)
10*d6ac6f45SJoshua Washington #define GVE_RSS_HASH_IPV6 BIT(2)
11*d6ac6f45SJoshua Washington #define GVE_RSS_HASH_IPV6_EX BIT(3)
12*d6ac6f45SJoshua Washington #define GVE_RSS_HASH_TCPV6 BIT(4)
13*d6ac6f45SJoshua Washington #define GVE_RSS_HASH_TCPV6_EX BIT(5)
14*d6ac6f45SJoshua Washington #define GVE_RSS_HASH_UDPV4 BIT(6)
15*d6ac6f45SJoshua Washington #define GVE_RSS_HASH_UDPV6 BIT(7)
16*d6ac6f45SJoshua Washington #define GVE_RSS_HASH_UDPV6_EX BIT(8)
17*d6ac6f45SJoshua Washington
18*d6ac6f45SJoshua Washington #define GVE_RSS_OFFLOAD_DEFAULT ( \
19*d6ac6f45SJoshua Washington GVE_RSS_HASH_IPV4 | \
20*d6ac6f45SJoshua Washington GVE_RSS_HASH_TCPV4 | \
21*d6ac6f45SJoshua Washington GVE_RSS_HASH_IPV6 | \
22*d6ac6f45SJoshua Washington GVE_RSS_HASH_IPV6_EX | \
23*d6ac6f45SJoshua Washington GVE_RSS_HASH_TCPV6 | \
24*d6ac6f45SJoshua Washington GVE_RSS_HASH_TCPV6_EX | \
25*d6ac6f45SJoshua Washington GVE_RSS_HASH_UDPV4 | \
26*d6ac6f45SJoshua Washington GVE_RSS_HASH_UDPV6 | \
27*d6ac6f45SJoshua Washington GVE_RSS_HASH_UDPV6_EX)
28*d6ac6f45SJoshua Washington
29*d6ac6f45SJoshua Washington /**
30*d6ac6f45SJoshua Washington * Generates default RSS redirection table based on the number of queues the
31*d6ac6f45SJoshua Washington * device is configured with. This assigns hash values to queues in a
32*d6ac6f45SJoshua Washington * round-robin manner.
33*d6ac6f45SJoshua Washington */
34*d6ac6f45SJoshua Washington int
35*d6ac6f45SJoshua Washington gve_generate_rss_reta(struct rte_eth_dev *dev, struct gve_rss_config *config);
36*d6ac6f45SJoshua Washington
37*d6ac6f45SJoshua Washington /**
38*d6ac6f45SJoshua Washington * Initializes `gve_rss_conf`, setting the fields to default values and
39*d6ac6f45SJoshua Washington * allocating memory for the RSS key and redirection table.
40*d6ac6f45SJoshua Washington */
41*d6ac6f45SJoshua Washington int
42*d6ac6f45SJoshua Washington gve_init_rss_config(struct gve_rss_config *gve_rss_conf,
43*d6ac6f45SJoshua Washington uint16_t key_size, uint16_t indir_size);
44*d6ac6f45SJoshua Washington
45*d6ac6f45SJoshua Washington /**
46*d6ac6f45SJoshua Washington * Initializes `gve_rss_conf` based on the RSS configuration stored in `priv`.
47*d6ac6f45SJoshua Washington */
48*d6ac6f45SJoshua Washington int
49*d6ac6f45SJoshua Washington gve_init_rss_config_from_priv(struct gve_priv *priv,
50*d6ac6f45SJoshua Washington struct gve_rss_config *gve_rss_conf);
51*d6ac6f45SJoshua Washington
52*d6ac6f45SJoshua Washington /**
53*d6ac6f45SJoshua Washington * Frees RSS key and redriection table pointers stored in `gve_rss_conf`.
54*d6ac6f45SJoshua Washington */
55*d6ac6f45SJoshua Washington void
56*d6ac6f45SJoshua Washington gve_free_rss_config(struct gve_rss_config *gve_rss_conf);
57*d6ac6f45SJoshua Washington
58*d6ac6f45SJoshua Washington /**
59*d6ac6f45SJoshua Washington * Updates the rss_config stored in `priv` with the contents of `config`.
60*d6ac6f45SJoshua Washington */
61*d6ac6f45SJoshua Washington int
62*d6ac6f45SJoshua Washington gve_update_priv_rss_config(struct gve_priv *priv,
63*d6ac6f45SJoshua Washington struct gve_rss_config *config);
64*d6ac6f45SJoshua Washington
65*d6ac6f45SJoshua Washington /**
66*d6ac6f45SJoshua Washington * Updates the RSS key stored in `gve_rss_conf`. It is prioritized as follows:
67*d6ac6f45SJoshua Washington * 1) retrieve from `rss_conf`, if non-null
68*d6ac6f45SJoshua Washington * 2) retrieve from `priv`, if non-null
69*d6ac6f45SJoshua Washington * If keys from both sources are unset, return -EINVAL.
70*d6ac6f45SJoshua Washington */
71*d6ac6f45SJoshua Washington int
72*d6ac6f45SJoshua Washington gve_update_rss_key(struct gve_priv *priv, struct gve_rss_config *gve_rss_conf,
73*d6ac6f45SJoshua Washington struct rte_eth_rss_conf *rss_conf);
74*d6ac6f45SJoshua Washington
75*d6ac6f45SJoshua Washington /**
76*d6ac6f45SJoshua Washington * Updates the RSS hash types stored in `gve_rss_conf`. It is prioritized as
77*d6ac6f45SJoshua Washington * follows:
78*d6ac6f45SJoshua Washington * 1) retrieve from `rss_conf`, if set
79*d6ac6f45SJoshua Washington * 2) retrieve from priv, if RSS has been configured
80*d6ac6f45SJoshua Washington * 3) set default RSS offload
81*d6ac6f45SJoshua Washington */
82*d6ac6f45SJoshua Washington int
83*d6ac6f45SJoshua Washington gve_update_rss_hash_types(struct gve_priv *priv,
84*d6ac6f45SJoshua Washington struct gve_rss_config *gve_rss_conf, struct rte_eth_rss_conf *rss_conf);
85*d6ac6f45SJoshua Washington
86*d6ac6f45SJoshua Washington /**
87*d6ac6f45SJoshua Washington * Ensures that only supported RSS hash fields are set in `rte_rss_hf`.
88*d6ac6f45SJoshua Washington */
89*d6ac6f45SJoshua Washington static inline int
gve_validate_rss_hf(uint64_t rte_rss_hf)90*d6ac6f45SJoshua Washington gve_validate_rss_hf(uint64_t rte_rss_hf) {
91*d6ac6f45SJoshua Washington return rte_rss_hf & ~GVE_RTE_RSS_OFFLOAD_ALL;
92*d6ac6f45SJoshua Washington }
93*d6ac6f45SJoshua Washington
94*d6ac6f45SJoshua Washington /**
95*d6ac6f45SJoshua Washington * Converts RSS hash types from RTE values to GVE values, storing them in
96*d6ac6f45SJoshua Washington * `gve_rss_conf`.
97*d6ac6f45SJoshua Washington */
98*d6ac6f45SJoshua Washington void
99*d6ac6f45SJoshua Washington rte_to_gve_rss_hf(uint64_t rte_rss_hf, struct gve_rss_config *gve_rss_conf);
100*d6ac6f45SJoshua Washington
101*d6ac6f45SJoshua Washington /**
102*d6ac6f45SJoshua Washington * Converts RSS hash types from GVE values to RTE values, storing them in
103*d6ac6f45SJoshua Washington * `rss_conf`.
104*d6ac6f45SJoshua Washington */
105*d6ac6f45SJoshua Washington void
106*d6ac6f45SJoshua Washington gve_to_rte_rss_hf(uint16_t gve_rss_types, struct rte_eth_rss_conf *rss_conf);
107*d6ac6f45SJoshua Washington
108