The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/qlnx/qlnxe/ecore_spq.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*
    2  * Copyright (c) 2017-2018 Cavium, Inc. 
    3  * All rights reserved.
    4  *
    5  *  Redistribution and use in source and binary forms, with or without
    6  *  modification, are permitted provided that the following conditions
    7  *  are met:
    8  *
    9  *  1. Redistributions of source code must retain the above copyright
   10  *     notice, this list of conditions and the following disclaimer.
   11  *  2. Redistributions in binary form must reproduce the above copyright
   12  *     notice, this list of conditions and the following disclaimer in the
   13  *     documentation and/or other materials provided with the distribution.
   14  *
   15  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
   16  *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   17  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   18  *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
   19  *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   20  *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   21  *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   22  *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   23  *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   24  *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   25  *  POSSIBILITY OF SUCH DAMAGE.
   26  *
   27  * $FreeBSD$
   28  *
   29  */
   30 
   31 #ifndef __ECORE_SPQ_H__
   32 #define __ECORE_SPQ_H__
   33 
   34 #include "ecore_hsi_common.h"
   35 #include "ecore_status.h"
   36 #include "ecore_hsi_eth.h"
   37 #include "ecore_hsi_fcoe.h"
   38 #include "tcp_common.h"
   39 #include "ecore_hsi_iscsi.h"
   40 #include "ecore_hsi_roce.h"
   41 #include "ecore_hsi_iwarp.h"
   42 #include "ecore_chain.h"
   43 #include "ecore_sp_api.h"
   44 
   45 union ramrod_data
   46 {
   47         struct pf_start_ramrod_data                     pf_start;
   48         struct pf_update_ramrod_data                    pf_update;
   49         struct rl_update_ramrod_data                    rl_update;
   50         struct rx_queue_start_ramrod_data               rx_queue_start;
   51         struct rx_queue_update_ramrod_data              rx_queue_update;
   52         struct rx_queue_stop_ramrod_data                rx_queue_stop;
   53         struct tx_queue_start_ramrod_data               tx_queue_start;
   54         struct tx_queue_stop_ramrod_data                tx_queue_stop;
   55         struct vport_start_ramrod_data                  vport_start;
   56         struct vport_stop_ramrod_data                   vport_stop;
   57         struct rx_update_gft_filter_data                rx_update_gft;
   58         struct vport_update_ramrod_data                 vport_update;
   59         struct core_rx_start_ramrod_data                core_rx_queue_start;
   60         struct core_rx_stop_ramrod_data                 core_rx_queue_stop;
   61         struct core_tx_start_ramrod_data                core_tx_queue_start;
   62         struct core_tx_stop_ramrod_data                 core_tx_queue_stop;
   63         struct vport_filter_update_ramrod_data          vport_filter_update;
   64 
   65         struct rdma_init_func_ramrod_data               rdma_init_func;
   66         struct rdma_close_func_ramrod_data              rdma_close_func;
   67         struct rdma_register_tid_ramrod_data            rdma_register_tid;
   68         struct rdma_deregister_tid_ramrod_data          rdma_deregister_tid;
   69         struct roce_create_qp_resp_ramrod_data          roce_create_qp_resp;
   70         struct roce_create_qp_req_ramrod_data           roce_create_qp_req;
   71         struct roce_modify_qp_resp_ramrod_data          roce_modify_qp_resp;
   72         struct roce_modify_qp_req_ramrod_data           roce_modify_qp_req;
   73         struct roce_query_qp_resp_ramrod_data           roce_query_qp_resp;
   74         struct roce_query_qp_req_ramrod_data            roce_query_qp_req;
   75         struct roce_destroy_qp_resp_ramrod_data         roce_destroy_qp_resp;
   76         struct roce_destroy_qp_req_ramrod_data          roce_destroy_qp_req;
   77         struct roce_init_func_ramrod_data               roce_init_func;
   78 
   79         struct rdma_create_cq_ramrod_data               rdma_create_cq;
   80         struct rdma_resize_cq_ramrod_data               rdma_resize_cq;
   81         struct rdma_destroy_cq_ramrod_data              rdma_destroy_cq;        
   82         struct rdma_srq_create_ramrod_data              rdma_create_srq;
   83         struct rdma_srq_destroy_ramrod_data             rdma_destroy_srq;
   84         struct rdma_srq_modify_ramrod_data              rdma_modify_srq;
   85 
   86         struct iwarp_create_qp_ramrod_data              iwarp_create_qp;
   87         struct iwarp_tcp_offload_ramrod_data            iwarp_tcp_offload;
   88         struct iwarp_mpa_offload_ramrod_data            iwarp_mpa_offload;
   89         struct iwarp_modify_qp_ramrod_data              iwarp_modify_qp;
   90         struct iwarp_query_qp_ramrod_data               iwarp_query_qp;
   91         struct iwarp_init_func_ramrod_data              iwarp_init_func;
   92 
   93         struct fcoe_init_ramrod_params                  fcoe_init;
   94         struct fcoe_conn_offload_ramrod_params          fcoe_conn_ofld;
   95         struct fcoe_conn_terminate_ramrod_params        fcoe_conn_terminate;
   96         struct fcoe_stat_ramrod_params                  fcoe_stat;
   97 
   98         struct iscsi_slow_path_hdr                      iscsi_empty;
   99         struct iscsi_init_ramrod_params                 iscsi_init;
  100         struct iscsi_spe_func_dstry                     iscsi_destroy;
  101         struct iscsi_spe_conn_offload                   iscsi_conn_offload;
  102         struct iscsi_conn_update_ramrod_params          iscsi_conn_update;
  103         struct iscsi_spe_conn_mac_update                iscsi_conn_mac_update;
  104         struct iscsi_spe_conn_termination               iscsi_conn_terminate;
  105         struct iscsi_spe_conn_statistics                iscsi_conn_statistics;
  106 
  107         struct vf_start_ramrod_data                     vf_start;
  108         struct vf_stop_ramrod_data                      vf_stop;
  109 };
  110 
  111 #define EQ_MAX_CREDIT   0xffffffff
  112 
  113 enum spq_priority {
  114         ECORE_SPQ_PRIORITY_NORMAL,
  115         ECORE_SPQ_PRIORITY_HIGH,
  116 };
  117 
  118 union ecore_spq_req_comp {
  119         struct ecore_spq_comp_cb cb;
  120         u64                      *done_addr;
  121 };
  122 
  123 /* SPQ_MODE_EBLOCK */
  124 struct ecore_spq_comp_done {
  125         u64 done;
  126         u8  fw_return_code;
  127 };
  128 
  129 struct ecore_spq_entry {
  130         osal_list_entry_t               list;
  131 
  132         u8                              flags;
  133 
  134         /* HSI slow path element */
  135         struct slow_path_element        elem;
  136 
  137         union ramrod_data               ramrod;
  138 
  139         enum spq_priority               priority;
  140 
  141         /* pending queue for this entry */
  142         osal_list_t                     *queue;
  143 
  144         enum spq_mode                   comp_mode;
  145         struct ecore_spq_comp_cb        comp_cb;
  146         struct ecore_spq_comp_done      comp_done; /* SPQ_MODE_EBLOCK */
  147 };
  148 
  149 struct ecore_eq {
  150         struct ecore_chain      chain;
  151         u8                      eq_sb_index;    /* index within the SB */
  152         __le16                  *p_fw_cons;     /* ptr to index value */
  153 };
  154 
  155 struct ecore_consq {
  156         struct ecore_chain      chain;
  157 };
  158 
  159 typedef enum _ecore_status_t
  160 (*ecore_spq_async_comp_cb)(struct ecore_hwfn *p_hwfn,
  161                            u8 opcode,
  162                            u16 echo,
  163                            union event_ring_data *data,
  164                            u8 fw_return_code);
  165 
  166 enum _ecore_status_t
  167 ecore_spq_register_async_cb(struct ecore_hwfn *p_hwfn,
  168                             enum protocol_type protocol_id,
  169                             ecore_spq_async_comp_cb cb);
  170 
  171 void
  172 ecore_spq_unregister_async_cb(struct ecore_hwfn *p_hwfn,
  173                               enum protocol_type protocol_id);
  174 
  175 struct ecore_spq {
  176         osal_spinlock_t                 lock;
  177 
  178         osal_list_t                     unlimited_pending;
  179         osal_list_t                     pending;
  180         osal_list_t                     completion_pending;
  181         osal_list_t                     free_pool;
  182 
  183         struct ecore_chain              chain;
  184 
  185         /* allocated dma-able memory for spq entries (+ramrod data) */
  186         dma_addr_t                      p_phys;
  187         struct ecore_spq_entry          *p_virt;
  188 
  189         /* Bitmap for handling out-of-order completions */
  190 #define SPQ_RING_SIZE           \
  191         (CORE_SPQE_PAGE_SIZE_BYTES / sizeof(struct slow_path_element))
  192 #define SPQ_COMP_BMAP_SIZE      (SPQ_RING_SIZE / (sizeof(unsigned long) * 8 /* BITS_PER_LONG */))
  193         unsigned long                   p_comp_bitmap[SPQ_COMP_BMAP_SIZE];
  194         u8                              comp_bitmap_idx;
  195 #define SPQ_COMP_BMAP_SET_BIT(p_spq, idx)                                       \
  196         do {                                                                    \
  197                 OSAL_SET_BIT(((idx) % SPQ_RING_SIZE), (p_spq)->p_comp_bitmap);  \
  198         } while (0)
  199 #define SPQ_COMP_BMAP_CLEAR_BIT(p_spq, idx)                                             \
  200         do {                                                                            \
  201                 OSAL_CLEAR_BIT(((idx) % SPQ_RING_SIZE), (p_spq)->p_comp_bitmap);        \
  202         } while (0)
  203 #define SPQ_COMP_BMAP_TEST_BIT(p_spq, idx)      \
  204         (OSAL_TEST_BIT(((idx) % SPQ_RING_SIZE), (p_spq)->p_comp_bitmap))
  205 
  206         /* Statistics */
  207         u32                             unlimited_pending_count;
  208         u32                             normal_count;
  209         u32                             high_count;
  210         u32                             comp_sent_count;
  211         u32                             comp_count;
  212 
  213         u32                             cid;
  214 
  215         u32                             db_addr_offset;
  216         struct core_db_data             db_data;
  217         ecore_spq_async_comp_cb         async_comp_cb[MAX_PROTOCOL_TYPE];
  218 };
  219 
  220 struct ecore_port;
  221 struct ecore_hwfn;
  222 
  223 /**
  224  * @brief ecore_spq_post - Posts a Slow hwfn request to FW, or lacking that
  225  *        Pends it to the future list.
  226  *
  227  * @param p_hwfn
  228  * @param p_req
  229  *
  230  * @return enum _ecore_status_t
  231  */
  232 enum _ecore_status_t ecore_spq_post(struct ecore_hwfn      *p_hwfn,
  233                                     struct ecore_spq_entry *p_ent,
  234                                     u8                     *fw_return_code);
  235 
  236 /**
  237  * @brief ecore_spq_allocate - Alloocates & initializes the SPQ and EQ.
  238  *
  239  * @param p_hwfn
  240  *
  241  * @return enum _ecore_status_t
  242  */
  243 enum _ecore_status_t ecore_spq_alloc(struct ecore_hwfn  *p_hwfn);
  244 
  245 /**
  246  * @brief ecore_spq_setup - Reset the SPQ to its start state.
  247  *
  248  * @param p_hwfn
  249  */
  250 void ecore_spq_setup(struct ecore_hwfn *p_hwfn);
  251 
  252 /**
  253  * @brief ecore_spq_deallocate - Deallocates the given SPQ struct.
  254  *
  255  * @param p_hwfn
  256  */
  257 void ecore_spq_free(struct ecore_hwfn *p_hwfn);
  258 
  259 /**
  260  * @brief ecore_spq_get_entry - Obtain an entrry from the spq
  261  *        free pool list.
  262  *
  263  *
  264  *
  265  * @param p_hwfn
  266  * @param pp_ent
  267  *
  268  * @return enum _ecore_status_t
  269  */
  270 enum _ecore_status_t
  271 ecore_spq_get_entry(struct ecore_hwfn           *p_hwfn,
  272                     struct ecore_spq_entry      **pp_ent);
  273 
  274 /**
  275  * @brief ecore_spq_return_entry - Return an entry to spq free
  276  *                                 pool list
  277  *
  278  * @param p_hwfn
  279  * @param p_ent
  280  */
  281 void ecore_spq_return_entry(struct ecore_hwfn           *p_hwfn,
  282                             struct ecore_spq_entry      *p_ent);
  283 /**
  284  * @brief ecore_eq_allocate - Allocates & initializes an EQ struct
  285  *
  286  * @param p_hwfn
  287  * @param num_elem number of elements in the eq
  288  *
  289  * @return enum _ecore_status_t
  290  */
  291 enum _ecore_status_t ecore_eq_alloc(struct ecore_hwfn   *p_hwfn, u16 num_elem);
  292 
  293 /**
  294  * @brief ecore_eq_setup - Reset the EQ to its start state.
  295  *
  296  * @param p_hwfn
  297  */
  298 void ecore_eq_setup(struct ecore_hwfn *p_hwfn);
  299 
  300 /**
  301  * @brief ecore_eq_free - deallocates the given EQ struct.
  302  *
  303  * @param p_hwfn
  304  */
  305 void ecore_eq_free(struct ecore_hwfn *p_hwfn);
  306 
  307 /**
  308  * @brief ecore_eq_prod_update - update the FW with default EQ producer
  309  *
  310  * @param p_hwfn
  311  * @param prod
  312  */
  313 void ecore_eq_prod_update(struct ecore_hwfn     *p_hwfn,
  314                           u16                   prod);
  315 
  316 /**
  317  * @brief ecore_eq_completion - Completes currently pending EQ elements
  318  *
  319  * @param p_hwfn
  320  * @param cookie
  321  *
  322  * @return enum _ecore_status_t
  323  */
  324 enum _ecore_status_t ecore_eq_completion(struct ecore_hwfn      *p_hwfn,
  325                                          void                   *cookie);
  326 
  327 /**
  328  * @brief ecore_spq_completion - Completes a single event
  329  *
  330  * @param p_hwfn
  331  * @param echo - echo value from cookie (used for determining completion)
  332  * @param p_data - data from cookie (used in callback function if applicable)
  333  *
  334  * @return enum _ecore_status_t
  335  */
  336 enum _ecore_status_t ecore_spq_completion(struct ecore_hwfn     *p_hwfn,
  337                                           __le16                echo,
  338                                           u8                    fw_return_code,
  339                                           union event_ring_data *p_data);
  340 
  341 /**
  342  * @brief ecore_spq_get_cid - Given p_hwfn, return cid for the hwfn's SPQ
  343  *
  344  * @param p_hwfn
  345  *
  346  * @return u32 - SPQ CID
  347  */
  348 u32 ecore_spq_get_cid(struct ecore_hwfn *p_hwfn);
  349 
  350 /**
  351  * @brief ecore_consq_alloc - Allocates & initializes an ConsQ struct
  352  *
  353  * @param p_hwfn
  354  *
  355  * @return enum _ecore_status_t
  356  */
  357 enum _ecore_status_t ecore_consq_alloc(struct ecore_hwfn *p_hwfn);
  358 
  359 /**
  360  * @brief ecore_consq_setup - Reset the ConsQ to its start state.
  361  *
  362  * @param p_hwfn
  363  */
  364 void ecore_consq_setup(struct ecore_hwfn *p_hwfn);
  365 
  366 /**
  367  * @brief ecore_consq_free - deallocates the given ConsQ struct.
  368  *
  369  * @param p_hwfn
  370  */
  371 void ecore_consq_free(struct ecore_hwfn *p_hwfn);
  372 enum _ecore_status_t ecore_spq_pend_post(struct ecore_hwfn *p_hwfn);
  373 #endif /* __ECORE_SPQ_H__ */

Cache object: 60b1cc1a0027f9a98fe5fa1c6fb80456


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.