16da67e70SIvan Malov /* SPDX-License-Identifier: BSD-3-Clause 26da67e70SIvan Malov * 36da67e70SIvan Malov * Copyright(c) 2022 Xilinx, Inc. 46da67e70SIvan Malov */ 56da67e70SIvan Malov 66da67e70SIvan Malov #ifndef _SFC_FLOW_RSS_H 76da67e70SIvan Malov #define _SFC_FLOW_RSS_H 86da67e70SIvan Malov 96da67e70SIvan Malov #include <stdbool.h> 106da67e70SIvan Malov #include <stdint.h> 116da67e70SIvan Malov 126da67e70SIvan Malov #include <rte_flow.h> 136da67e70SIvan Malov #include <rte_tailq.h> 146da67e70SIvan Malov 156da67e70SIvan Malov #include "efx.h" 166da67e70SIvan Malov 176da67e70SIvan Malov #ifdef __cplusplus 186da67e70SIvan Malov extern "C" { 196da67e70SIvan Malov #endif 206da67e70SIvan Malov 216da67e70SIvan Malov struct sfc_flow_rss_conf { 226da67e70SIvan Malov uint8_t key[EFX_RSS_KEY_SIZE]; 23*68cde2a3SIvan Malov enum rte_eth_hash_function rte_hash_function; 246da67e70SIvan Malov efx_rx_hash_type_t efx_hash_types; 256da67e70SIvan Malov unsigned int nb_qid_offsets; 266da67e70SIvan Malov unsigned int qid_span; 276da67e70SIvan Malov }; 286da67e70SIvan Malov 296da67e70SIvan Malov struct sfc_flow_rss_ctx { 306da67e70SIvan Malov TAILQ_ENTRY(sfc_flow_rss_ctx) entries; 316da67e70SIvan Malov 326da67e70SIvan Malov unsigned int refcnt; 336da67e70SIvan Malov bool dummy; 346da67e70SIvan Malov 356da67e70SIvan Malov unsigned int nic_handle_refcnt; 366da67e70SIvan Malov uint32_t nic_handle; 376da67e70SIvan Malov 386da67e70SIvan Malov struct sfc_flow_rss_conf conf; 396da67e70SIvan Malov 406da67e70SIvan Malov uint16_t *qid_offsets; 416da67e70SIvan Malov }; 426da67e70SIvan Malov 436da67e70SIvan Malov TAILQ_HEAD(sfc_flow_rss_ctx_list, sfc_flow_rss_ctx); 446da67e70SIvan Malov 456da67e70SIvan Malov struct sfc_flow_rss { 46be5cbe47SIvan Malov unsigned int nb_tbl_entries_min; 47be5cbe47SIvan Malov unsigned int nb_tbl_entries_max; 48f6d23053SIvan Malov unsigned int qid_span_max; 49f6d23053SIvan Malov 50be5cbe47SIvan Malov unsigned int *bounce_tbl; /* MAX */ 516da67e70SIvan Malov 526da67e70SIvan Malov struct sfc_flow_rss_ctx_list ctx_list; 536da67e70SIvan Malov }; 546da67e70SIvan Malov 556da67e70SIvan Malov struct sfc_adapter; 566da67e70SIvan Malov 576da67e70SIvan Malov int sfc_flow_rss_attach(struct sfc_adapter *sa); 586da67e70SIvan Malov 596da67e70SIvan Malov void sfc_flow_rss_detach(struct sfc_adapter *sa); 606da67e70SIvan Malov 616da67e70SIvan Malov int sfc_flow_rss_parse_conf(struct sfc_adapter *sa, 626da67e70SIvan Malov const struct rte_flow_action_rss *in, 636da67e70SIvan Malov struct sfc_flow_rss_conf *out, 646da67e70SIvan Malov uint16_t *sw_qid_minp); 656da67e70SIvan Malov 666da67e70SIvan Malov struct sfc_flow_rss_ctx *sfc_flow_rss_ctx_reuse(struct sfc_adapter *sa, 676da67e70SIvan Malov const struct sfc_flow_rss_conf *conf, 686da67e70SIvan Malov uint16_t sw_qid_min, const uint16_t *sw_qids); 696da67e70SIvan Malov 706da67e70SIvan Malov int sfc_flow_rss_ctx_add(struct sfc_adapter *sa, 716da67e70SIvan Malov const struct sfc_flow_rss_conf *conf, 726da67e70SIvan Malov uint16_t sw_qid_min, const uint16_t *sw_qids, 736da67e70SIvan Malov struct sfc_flow_rss_ctx **ctxp); 746da67e70SIvan Malov 756da67e70SIvan Malov void sfc_flow_rss_ctx_del(struct sfc_adapter *sa, struct sfc_flow_rss_ctx *ctx); 766da67e70SIvan Malov 776da67e70SIvan Malov int sfc_flow_rss_ctx_program(struct sfc_adapter *sa, 786da67e70SIvan Malov struct sfc_flow_rss_ctx *ctx); 796da67e70SIvan Malov 806da67e70SIvan Malov void sfc_flow_rss_ctx_terminate(struct sfc_adapter *sa, 816da67e70SIvan Malov struct sfc_flow_rss_ctx *ctx); 826da67e70SIvan Malov 836da67e70SIvan Malov #ifdef __cplusplus 846da67e70SIvan Malov } 856da67e70SIvan Malov #endif 866da67e70SIvan Malov #endif /* _SFC_FLOW_RSS_H */ 87