X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fsfc%2Fsfc_rx.h;h=4ab513915e217edf42d322d869dde2b39b6b5264;hb=refs%2Fheads%2Fdoc-20211126;hp=c0cb17a70355026cf31c6d2bf2b85de629cea8ef;hpb=4ec1fc3ba88183071cf4441d74fdc5a6d5525ade;p=dpdk.git diff --git a/drivers/net/sfc/sfc_rx.h b/drivers/net/sfc/sfc_rx.h index c0cb17a703..4ab513915e 100644 --- a/drivers/net/sfc/sfc_rx.h +++ b/drivers/net/sfc/sfc_rx.h @@ -1,30 +1,10 @@ -/*- - * Copyright (c) 2016 Solarflare Communications Inc. - * All rights reserved. +/* SPDX-License-Identifier: BSD-3-Clause + * + * Copyright(c) 2019-2021 Xilinx, Inc. + * Copyright(c) 2016-2019 Solarflare Communications Inc. * * This software was jointly developed between OKTET Labs (under contract * for Solarflare) and Solarflare Communications, Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, - * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _SFC_RX_H @@ -32,10 +12,12 @@ #include #include -#include +#include #include "efx.h" +#include "sfc_dp_rx.h" + #ifdef __cplusplus extern "C" { #endif @@ -47,7 +29,7 @@ struct sfc_evq; * Software Rx descriptor information associated with hardware Rx * descriptor. */ -struct sfc_rx_sw_desc { +struct sfc_efx_rx_sw_desc { struct rte_mbuf *mbuf; unsigned int flags; unsigned int size; @@ -59,8 +41,6 @@ enum sfc_rxq_state_bit { #define SFC_RXQ_INITIALIZED (1 << SFC_RXQ_INITIALIZED_BIT) SFC_RXQ_STARTED_BIT, #define SFC_RXQ_STARTED (1 << SFC_RXQ_STARTED_BIT) - SFC_RXQ_RUNNING_BIT, -#define SFC_RXQ_RUNNING (1 << SFC_RXQ_RUNNING_BIT) SFC_RXQ_FLUSHING_BIT, #define SFC_RXQ_FLUSHING (1 << SFC_RXQ_FLUSHING_BIT) SFC_RXQ_FLUSHED_BIT, @@ -70,48 +50,54 @@ enum sfc_rxq_state_bit { }; /** - * Receive queue information used on data path. - * Allocated on the socket specified on the queue setup. + * Receive queue control primary process-only information. */ struct sfc_rxq { - /* Used on data path */ struct sfc_evq *evq; - struct sfc_rx_sw_desc *sw_desc; - unsigned int state; - unsigned int ptr_mask; - unsigned int pending; - unsigned int completed; - uint16_t batch_max; - uint16_t prefix_size; -#if EFSYS_OPT_RX_SCALE - unsigned int flags; -#define SFC_RXQ_RSS_HASH 0x1 -#endif - - /* Used on refill */ - unsigned int added; - unsigned int pushed; - unsigned int refill_threshold; - uint8_t port_id; - uint16_t buf_size; - struct rte_mempool *refill_mb_pool; efx_rxq_t *common; efsys_mem_t mem; - - /* Not used on data path */ unsigned int hw_index; + uint16_t buf_size; }; -static inline unsigned int -sfc_rxq_sw_index_by_hw_index(unsigned int hw_index) -{ - return hw_index; -} +struct sfc_rxq *sfc_rxq_by_dp_rxq(const struct sfc_dp_rxq *dp_rxq); + +/** + * Receive queue information used on libefx-based data path. + * Allocated on the socket specified on the queue setup. + */ +struct sfc_efx_rxq { + /* Used on data path */ + struct sfc_evq *evq; + unsigned int flags; +#define SFC_EFX_RXQ_FLAG_STARTED 0x1 +#define SFC_EFX_RXQ_FLAG_RUNNING 0x2 +#define SFC_EFX_RXQ_FLAG_RSS_HASH 0x4 +#define SFC_EFX_RXQ_FLAG_INTR_EN 0x8 + unsigned int ptr_mask; + unsigned int pending; + unsigned int completed; + uint16_t batch_max; + uint16_t prefix_size; + struct sfc_efx_rx_sw_desc *sw_desc; + + /* Used on refill */ + unsigned int added; + unsigned int pushed; + unsigned int max_fill_level; + unsigned int refill_threshold; + uint16_t buf_size; + struct rte_mempool *refill_mb_pool; + efx_rxq_t *common; + + /* Datapath receive queue anchor */ + struct sfc_dp_rxq dp; +}; -static inline unsigned int -sfc_rxq_sw_index(const struct sfc_rxq *rxq) +static inline struct sfc_efx_rxq * +sfc_efx_rxq_by_dp_rxq(struct sfc_dp_rxq *dp_rxq) { - return sfc_rxq_sw_index_by_hw_index(rxq->hw_index); + return container_of(dp_rxq, struct sfc_efx_rxq, dp); } /** @@ -119,40 +105,59 @@ sfc_rxq_sw_index(const struct sfc_rxq *rxq) * Allocated on the same socket as adapter data. */ struct sfc_rxq_info { + unsigned int state; unsigned int max_entries; unsigned int entries; efx_rxq_type_t type; - struct sfc_rxq *rxq; + unsigned int type_flags; + struct sfc_dp_rxq *dp; boolean_t deferred_start; boolean_t deferred_started; + unsigned int refill_threshold; + struct rte_mempool *refill_mb_pool; + unsigned int rxq_flags; }; -int sfc_rx_init(struct sfc_adapter *sa); -void sfc_rx_fini(struct sfc_adapter *sa); +struct sfc_rxq_info *sfc_rxq_info_by_dp_rxq(const struct sfc_dp_rxq *dp_rxq); +struct sfc_rxq_info *sfc_rxq_info_by_ethdev_qid(struct sfc_adapter_shared *sas, + sfc_ethdev_qid_t ethdev_qid); +struct sfc_rxq *sfc_rxq_ctrl_by_ethdev_qid(struct sfc_adapter *sa, + sfc_ethdev_qid_t ethdev_qid); + +int sfc_rx_configure(struct sfc_adapter *sa); +void sfc_rx_close(struct sfc_adapter *sa); int sfc_rx_start(struct sfc_adapter *sa); void sfc_rx_stop(struct sfc_adapter *sa); +int sfc_rx_qinit_info(struct sfc_adapter *sa, sfc_sw_index_t sw_index, + unsigned int extra_efx_type_flags); int sfc_rx_qinit(struct sfc_adapter *sa, unsigned int rx_queue_id, uint16_t nb_rx_desc, unsigned int socket_id, const struct rte_eth_rxconf *rx_conf, struct rte_mempool *mb_pool); -void sfc_rx_qfini(struct sfc_adapter *sa, unsigned int sw_index); -int sfc_rx_qstart(struct sfc_adapter *sa, unsigned int sw_index); -void sfc_rx_qstop(struct sfc_adapter *sa, unsigned int sw_index); - -void sfc_rx_qflush_done(struct sfc_rxq *rxq); -void sfc_rx_qflush_failed(struct sfc_rxq *rxq); - -uint16_t sfc_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, - uint16_t nb_pkts); - -unsigned int sfc_rx_qdesc_npending(struct sfc_adapter *sa, - unsigned int sw_index); -int sfc_rx_qdesc_done(struct sfc_rxq *rxq, unsigned int offset); - -#if EFSYS_OPT_RX_SCALE -efx_rx_hash_type_t sfc_rte_to_efx_hash_type(uint64_t rss_hf); -#endif +void sfc_rx_qfini(struct sfc_adapter *sa, sfc_sw_index_t sw_index); +int sfc_rx_qstart(struct sfc_adapter *sa, sfc_sw_index_t sw_index); +void sfc_rx_qstop(struct sfc_adapter *sa, sfc_sw_index_t sw_index); + +uint64_t sfc_rx_get_dev_offload_caps(struct sfc_adapter *sa); +uint64_t sfc_rx_get_queue_offload_caps(struct sfc_adapter *sa); + +void sfc_rx_qflush_done(struct sfc_rxq_info *rxq_info); +void sfc_rx_qflush_failed(struct sfc_rxq_info *rxq_info); + +unsigned int sfc_rx_get_pushed(struct sfc_adapter *sa, + struct sfc_dp_rxq *dp_rxq); + +int sfc_rx_hash_init(struct sfc_adapter *sa); +void sfc_rx_hash_fini(struct sfc_adapter *sa); +int sfc_rx_hf_rte_to_efx(struct sfc_adapter *sa, uint64_t rte, + efx_rx_hash_type_t *efx); +uint64_t sfc_rx_hf_efx_to_rte(struct sfc_rss *rss, efx_rx_hash_type_t efx); +boolean_t sfc_rx_check_scatter(size_t pdu, size_t rx_buf_size, + uint32_t rx_prefix_size, + boolean_t rx_scatter_enabled, + uint32_t rx_scatter_max, + const char **error); #ifdef __cplusplus }