linux/drivers/net/ethernet/qlogic/qed/qed_sp.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */
   2/* QLogic qed NIC Driver
   3 * Copyright (c) 2015-2017  QLogic Corporation
   4 * Copyright (c) 2019-2020 Marvell International Ltd.
   5 */
   6
   7#ifndef _QED_SP_H
   8#define _QED_SP_H
   9
  10#include <linux/types.h>
  11#include <linux/kernel.h>
  12#include <linux/list.h>
  13#include <linux/slab.h>
  14#include <linux/spinlock.h>
  15#include <linux/qed/qed_chain.h>
  16#include "qed.h"
  17#include "qed_hsi.h"
  18
  19enum spq_mode {
  20        QED_SPQ_MODE_BLOCK,     /* Client will poll a designated mem. address */
  21        QED_SPQ_MODE_CB,        /* Client supplies a callback */
  22        QED_SPQ_MODE_EBLOCK,    /* QED should block until completion */
  23};
  24
  25struct qed_spq_comp_cb {
  26        void    (*function)(struct qed_hwfn *,
  27                            void *,
  28                            union event_ring_data *,
  29                            u8 fw_return_code);
  30        void    *cookie;
  31};
  32
  33/**
  34 * @brief qed_eth_cqe_completion - handles the completion of a
  35 *        ramrod on the cqe ring
  36 *
  37 * @param p_hwfn
  38 * @param cqe
  39 *
  40 * @return int
  41 */
  42int qed_eth_cqe_completion(struct qed_hwfn *p_hwfn,
  43                           struct eth_slow_path_rx_cqe *cqe);
  44
  45/**
  46 *  @file
  47 *
  48 *  QED Slow-hwfn queue interface
  49 */
  50
  51union ramrod_data {
  52        struct pf_start_ramrod_data pf_start;
  53        struct pf_update_ramrod_data pf_update;
  54        struct rx_queue_start_ramrod_data rx_queue_start;
  55        struct rx_queue_update_ramrod_data rx_queue_update;
  56        struct rx_queue_stop_ramrod_data rx_queue_stop;
  57        struct tx_queue_start_ramrod_data tx_queue_start;
  58        struct tx_queue_stop_ramrod_data tx_queue_stop;
  59        struct vport_start_ramrod_data vport_start;
  60        struct vport_stop_ramrod_data vport_stop;
  61        struct rx_update_gft_filter_data rx_update_gft;
  62        struct vport_update_ramrod_data vport_update;
  63        struct core_rx_start_ramrod_data core_rx_queue_start;
  64        struct core_rx_stop_ramrod_data core_rx_queue_stop;
  65        struct core_tx_start_ramrod_data core_tx_queue_start;
  66        struct core_tx_stop_ramrod_data core_tx_queue_stop;
  67        struct vport_filter_update_ramrod_data vport_filter_update;
  68
  69        struct rdma_init_func_ramrod_data rdma_init_func;
  70        struct rdma_close_func_ramrod_data rdma_close_func;
  71        struct rdma_register_tid_ramrod_data rdma_register_tid;
  72        struct rdma_deregister_tid_ramrod_data rdma_deregister_tid;
  73        struct roce_create_qp_resp_ramrod_data roce_create_qp_resp;
  74        struct roce_create_qp_req_ramrod_data roce_create_qp_req;
  75        struct roce_modify_qp_resp_ramrod_data roce_modify_qp_resp;
  76        struct roce_modify_qp_req_ramrod_data roce_modify_qp_req;
  77        struct roce_query_qp_resp_ramrod_data roce_query_qp_resp;
  78        struct roce_query_qp_req_ramrod_data roce_query_qp_req;
  79        struct roce_destroy_qp_resp_ramrod_data roce_destroy_qp_resp;
  80        struct roce_destroy_qp_req_ramrod_data roce_destroy_qp_req;
  81        struct roce_init_func_ramrod_data roce_init_func;
  82        struct rdma_create_cq_ramrod_data rdma_create_cq;
  83        struct rdma_destroy_cq_ramrod_data rdma_destroy_cq;
  84        struct rdma_srq_create_ramrod_data rdma_create_srq;
  85        struct rdma_srq_destroy_ramrod_data rdma_destroy_srq;
  86        struct rdma_srq_modify_ramrod_data rdma_modify_srq;
  87        struct iwarp_create_qp_ramrod_data iwarp_create_qp;
  88        struct iwarp_tcp_offload_ramrod_data iwarp_tcp_offload;
  89        struct iwarp_mpa_offload_ramrod_data iwarp_mpa_offload;
  90        struct iwarp_modify_qp_ramrod_data iwarp_modify_qp;
  91        struct iwarp_init_func_ramrod_data iwarp_init_func;
  92        struct fcoe_init_ramrod_params fcoe_init;
  93        struct fcoe_conn_offload_ramrod_params fcoe_conn_ofld;
  94        struct fcoe_conn_terminate_ramrod_params fcoe_conn_terminate;
  95        struct fcoe_stat_ramrod_params fcoe_stat;
  96
  97        struct iscsi_init_ramrod_params iscsi_init;
  98        struct iscsi_spe_conn_offload iscsi_conn_offload;
  99        struct iscsi_conn_update_ramrod_params iscsi_conn_update;
 100        struct iscsi_spe_conn_mac_update iscsi_conn_mac_update;
 101        struct iscsi_spe_conn_termination iscsi_conn_terminate;
 102
 103        struct vf_start_ramrod_data vf_start;
 104        struct vf_stop_ramrod_data vf_stop;
 105};
 106
 107#define EQ_MAX_CREDIT   0xffffffff
 108
 109enum spq_priority {
 110        QED_SPQ_PRIORITY_NORMAL,
 111        QED_SPQ_PRIORITY_HIGH,
 112};
 113
 114union qed_spq_req_comp {
 115        struct qed_spq_comp_cb  cb;
 116        u64                     *done_addr;
 117};
 118
 119struct qed_spq_comp_done {
 120        unsigned int    done;
 121        u8              fw_return_code;
 122};
 123
 124struct qed_spq_entry {
 125        struct list_head                list;
 126
 127        u8                              flags;
 128
 129        /* HSI slow path element */
 130        struct slow_path_element        elem;
 131
 132        union ramrod_data               ramrod;
 133
 134        enum spq_priority               priority;
 135
 136        /* pending queue for this entry */
 137        struct list_head                *queue;
 138
 139        enum spq_mode                   comp_mode;
 140        struct qed_spq_comp_cb          comp_cb;
 141        struct qed_spq_comp_done        comp_done; /* SPQ_MODE_EBLOCK */
 142
 143        /* Posted entry for unlimited list entry in EBLOCK mode */
 144        struct qed_spq_entry            *post_ent;
 145};
 146
 147struct qed_eq {
 148        struct qed_chain        chain;
 149        u8                      eq_sb_index;    /* index within the SB */
 150        __le16                  *p_fw_cons;     /* ptr to index value */
 151};
 152
 153struct qed_consq {
 154        struct qed_chain chain;
 155};
 156
 157typedef int (*qed_spq_async_comp_cb)(struct qed_hwfn *p_hwfn, u8 opcode,
 158                                     __le16 echo, union event_ring_data *data,
 159                                     u8 fw_return_code);
 160
 161int
 162qed_spq_register_async_cb(struct qed_hwfn *p_hwfn,
 163                          enum protocol_type protocol_id,
 164                          qed_spq_async_comp_cb cb);
 165
 166void
 167qed_spq_unregister_async_cb(struct qed_hwfn *p_hwfn,
 168                            enum protocol_type protocol_id);
 169
 170struct qed_spq {
 171        spinlock_t              lock; /* SPQ lock */
 172
 173        struct list_head        unlimited_pending;
 174        struct list_head        pending;
 175        struct list_head        completion_pending;
 176        struct list_head        free_pool;
 177
 178        struct qed_chain        chain;
 179
 180        /* allocated dma-able memory for spq entries (+ramrod data) */
 181        dma_addr_t              p_phys;
 182        struct qed_spq_entry    *p_virt;
 183
 184#define SPQ_RING_SIZE \
 185        (CORE_SPQE_PAGE_SIZE_BYTES / sizeof(struct slow_path_element))
 186
 187        /* Bitmap for handling out-of-order completions */
 188        DECLARE_BITMAP(p_comp_bitmap, SPQ_RING_SIZE);
 189        u8                      comp_bitmap_idx;
 190
 191        /* Statistics */
 192        u32                     unlimited_pending_count;
 193        u32                     normal_count;
 194        u32                     high_count;
 195        u32                     comp_sent_count;
 196        u32                     comp_count;
 197
 198        u32                     cid;
 199        u32                     db_addr_offset;
 200        struct core_db_data     db_data;
 201        qed_spq_async_comp_cb   async_comp_cb[MAX_PROTOCOL_TYPE];
 202};
 203
 204/**
 205 * @brief qed_spq_post - Posts a Slow hwfn request to FW, or lacking that
 206 *        Pends it to the future list.
 207 *
 208 * @param p_hwfn
 209 * @param p_req
 210 *
 211 * @return int
 212 */
 213int qed_spq_post(struct qed_hwfn *p_hwfn,
 214                 struct qed_spq_entry *p_ent,
 215                 u8 *fw_return_code);
 216
 217/**
 218 * @brief qed_spq_allocate - Alloocates & initializes the SPQ and EQ.
 219 *
 220 * @param p_hwfn
 221 *
 222 * @return int
 223 */
 224int qed_spq_alloc(struct qed_hwfn *p_hwfn);
 225
 226/**
 227 * @brief qed_spq_setup - Reset the SPQ to its start state.
 228 *
 229 * @param p_hwfn
 230 */
 231void qed_spq_setup(struct qed_hwfn *p_hwfn);
 232
 233/**
 234 * @brief qed_spq_deallocate - Deallocates the given SPQ struct.
 235 *
 236 * @param p_hwfn
 237 */
 238void qed_spq_free(struct qed_hwfn *p_hwfn);
 239
 240/**
 241 * @brief qed_spq_get_entry - Obtain an entrry from the spq
 242 *        free pool list.
 243 *
 244 *
 245 *
 246 * @param p_hwfn
 247 * @param pp_ent
 248 *
 249 * @return int
 250 */
 251int
 252qed_spq_get_entry(struct qed_hwfn *p_hwfn,
 253                  struct qed_spq_entry **pp_ent);
 254
 255/**
 256 * @brief qed_spq_return_entry - Return an entry to spq free
 257 *                                 pool list
 258 *
 259 * @param p_hwfn
 260 * @param p_ent
 261 */
 262void qed_spq_return_entry(struct qed_hwfn *p_hwfn,
 263                          struct qed_spq_entry *p_ent);
 264/**
 265 * @brief qed_eq_allocate - Allocates & initializes an EQ struct
 266 *
 267 * @param p_hwfn
 268 * @param num_elem number of elements in the eq
 269 *
 270 * @return int
 271 */
 272int qed_eq_alloc(struct qed_hwfn *p_hwfn, u16 num_elem);
 273
 274/**
 275 * @brief qed_eq_setup - Reset the EQ to its start state.
 276 *
 277 * @param p_hwfn
 278 */
 279void qed_eq_setup(struct qed_hwfn *p_hwfn);
 280
 281/**
 282 * @brief qed_eq_free - deallocates the given EQ struct.
 283 *
 284 * @param p_hwfn
 285 */
 286void qed_eq_free(struct qed_hwfn *p_hwfn);
 287
 288/**
 289 * @brief qed_eq_prod_update - update the FW with default EQ producer
 290 *
 291 * @param p_hwfn
 292 * @param prod
 293 */
 294void qed_eq_prod_update(struct qed_hwfn *p_hwfn,
 295                        u16 prod);
 296
 297/**
 298 * @brief qed_eq_completion - Completes currently pending EQ elements
 299 *
 300 * @param p_hwfn
 301 * @param cookie
 302 *
 303 * @return int
 304 */
 305int qed_eq_completion(struct qed_hwfn *p_hwfn,
 306                      void *cookie);
 307
 308/**
 309 * @brief qed_spq_completion - Completes a single event
 310 *
 311 * @param p_hwfn
 312 * @param echo - echo value from cookie (used for determining completion)
 313 * @param p_data - data from cookie (used in callback function if applicable)
 314 *
 315 * @return int
 316 */
 317int qed_spq_completion(struct qed_hwfn *p_hwfn,
 318                       __le16 echo,
 319                       u8 fw_return_code,
 320                       union event_ring_data *p_data);
 321
 322/**
 323 * @brief qed_spq_get_cid - Given p_hwfn, return cid for the hwfn's SPQ
 324 *
 325 * @param p_hwfn
 326 *
 327 * @return u32 - SPQ CID
 328 */
 329u32 qed_spq_get_cid(struct qed_hwfn *p_hwfn);
 330
 331/**
 332 * @brief qed_consq_alloc - Allocates & initializes an ConsQ
 333 *        struct
 334 *
 335 * @param p_hwfn
 336 *
 337 * @return int
 338 */
 339int qed_consq_alloc(struct qed_hwfn *p_hwfn);
 340
 341/**
 342 * @brief qed_consq_setup - Reset the ConsQ to its start state.
 343 *
 344 * @param p_hwfn
 345 */
 346void qed_consq_setup(struct qed_hwfn *p_hwfn);
 347
 348/**
 349 * @brief qed_consq_free - deallocates the given ConsQ struct.
 350 *
 351 * @param p_hwfn
 352 */
 353void qed_consq_free(struct qed_hwfn *p_hwfn);
 354int qed_spq_pend_post(struct qed_hwfn *p_hwfn);
 355
 356/**
 357 * @file
 358 *
 359 * @brief Slow-hwfn low-level commands (Ramrods) function definitions.
 360 */
 361
 362#define QED_SP_EQ_COMPLETION  0x01
 363#define QED_SP_CQE_COMPLETION 0x02
 364
 365struct qed_sp_init_data {
 366        u32                     cid;
 367        u16                     opaque_fid;
 368
 369        /* Information regarding operation upon sending & completion */
 370        enum spq_mode           comp_mode;
 371        struct qed_spq_comp_cb *p_comp_data;
 372};
 373
 374/**
 375 * @brief Returns a SPQ entry to the pool / frees the entry if allocated.
 376 *        Should be called on in error flows after initializing the SPQ entry
 377 *        and before posting it.
 378 *
 379 * @param p_hwfn
 380 * @param p_ent
 381 */
 382void qed_sp_destroy_request(struct qed_hwfn *p_hwfn,
 383                            struct qed_spq_entry *p_ent);
 384
 385int qed_sp_init_request(struct qed_hwfn *p_hwfn,
 386                        struct qed_spq_entry **pp_ent,
 387                        u8 cmd,
 388                        u8 protocol,
 389                        struct qed_sp_init_data *p_data);
 390
 391/**
 392 * @brief qed_sp_pf_start - PF Function Start Ramrod
 393 *
 394 * This ramrod is sent to initialize a physical function (PF). It will
 395 * configure the function related parameters and write its completion to the
 396 * event ring specified in the parameters.
 397 *
 398 * Ramrods complete on the common event ring for the PF. This ring is
 399 * allocated by the driver on host memory and its parameters are written
 400 * to the internal RAM of the UStorm by the Function Start Ramrod.
 401 *
 402 * @param p_hwfn
 403 * @param p_ptt
 404 * @param p_tunn
 405 * @param allow_npar_tx_switch
 406 *
 407 * @return int
 408 */
 409
 410int qed_sp_pf_start(struct qed_hwfn *p_hwfn,
 411                    struct qed_ptt *p_ptt,
 412                    struct qed_tunnel_info *p_tunn,
 413                    bool allow_npar_tx_switch);
 414
 415/**
 416 * @brief qed_sp_pf_update - PF Function Update Ramrod
 417 *
 418 * This ramrod updates function-related parameters. Every parameter can be
 419 * updated independently, according to configuration flags.
 420 *
 421 * @param p_hwfn
 422 *
 423 * @return int
 424 */
 425
 426int qed_sp_pf_update(struct qed_hwfn *p_hwfn);
 427
 428/**
 429 * @brief qed_sp_pf_update_stag - Update firmware of new outer tag
 430 *
 431 * @param p_hwfn
 432 *
 433 * @return int
 434 */
 435int qed_sp_pf_update_stag(struct qed_hwfn *p_hwfn);
 436
 437/**
 438 * @brief qed_sp_pf_stop - PF Function Stop Ramrod
 439 *
 440 * This ramrod is sent to close a Physical Function (PF). It is the last ramrod
 441 * sent and the last completion written to the PFs Event Ring. This ramrod also
 442 * deletes the context for the Slowhwfn connection on this PF.
 443 *
 444 * @note Not required for first packet.
 445 *
 446 * @param p_hwfn
 447 *
 448 * @return int
 449 */
 450
 451/**
 452 * @brief qed_sp_pf_update_ufp - PF ufp update Ramrod
 453 *
 454 * @param p_hwfn
 455 *
 456 * @return int
 457 */
 458int qed_sp_pf_update_ufp(struct qed_hwfn *p_hwfn);
 459
 460int qed_sp_pf_stop(struct qed_hwfn *p_hwfn);
 461
 462int qed_sp_pf_update_tunn_cfg(struct qed_hwfn *p_hwfn,
 463                              struct qed_ptt *p_ptt,
 464                              struct qed_tunnel_info *p_tunn,
 465                              enum spq_mode comp_mode,
 466                              struct qed_spq_comp_cb *p_comp_data);
 467/**
 468 * @brief qed_sp_heartbeat_ramrod - Send empty Ramrod
 469 *
 470 * @param p_hwfn
 471 *
 472 * @return int
 473 */
 474
 475int qed_sp_heartbeat_ramrod(struct qed_hwfn *p_hwfn);
 476
 477#endif
 478