129 lines · c
1/* Broadcom NetXtreme-C/E network driver.2 *3 * Copyright (c) 2016-2018 Broadcom Limited4 *5 * This program is free software; you can redistribute it and/or modify6 * it under the terms of the GNU General Public License as published by7 * the Free Software Foundation.8 */9 10#ifndef BNXT_ULP_H11#define BNXT_ULP_H12 13#define BNXT_ROCE_ULP 014#define BNXT_MAX_ULP 115 16#define BNXT_MIN_ROCE_CP_RINGS 217#define BNXT_MIN_ROCE_STAT_CTXS 118 19#define BNXT_MAX_ROCE_MSIX_VF 220#define BNXT_MAX_ROCE_MSIX_NPAR_PF 521#define BNXT_MAX_ROCE_MSIX 6422 23struct hwrm_async_event_cmpl;24struct bnxt;25 26struct bnxt_msix_entry {27 u32 vector;28 u32 ring_idx;29 u32 db_offset;30};31 32struct bnxt_ulp_ops {33 void (*ulp_irq_stop)(void *);34 void (*ulp_irq_restart)(void *, struct bnxt_msix_entry *);35};36 37struct bnxt_fw_msg {38 void *msg;39 int msg_len;40 void *resp;41 int resp_max_len;42 int timeout;43};44 45struct bnxt_ulp {46 void *handle;47 struct bnxt_ulp_ops __rcu *ulp_ops;48 unsigned long *async_events_bmap;49 u16 max_async_event_id;50 u16 msix_requested;51 atomic_t ref_count;52};53 54struct bnxt_en_dev {55 struct net_device *net;56 struct pci_dev *pdev;57 struct bnxt_msix_entry msix_entries[BNXT_MAX_ROCE_MSIX];58 u32 flags;59 #define BNXT_EN_FLAG_ROCEV1_CAP 0x160 #define BNXT_EN_FLAG_ROCEV2_CAP 0x261 #define BNXT_EN_FLAG_ROCE_CAP (BNXT_EN_FLAG_ROCEV1_CAP | \62 BNXT_EN_FLAG_ROCEV2_CAP)63 #define BNXT_EN_FLAG_MSIX_REQUESTED 0x464 #define BNXT_EN_FLAG_ULP_STOPPED 0x865 #define BNXT_EN_FLAG_VF 0x1066#define BNXT_EN_VF(edev) ((edev)->flags & BNXT_EN_FLAG_VF)67 68 struct bnxt_ulp *ulp_tbl;69 int l2_db_size; /* Doorbell BAR size in70 * bytes mapped by L271 * driver.72 */73 int l2_db_size_nc; /* Doorbell BAR size in74 * bytes mapped as non-75 * cacheable.76 */77 int l2_db_offset; /* Doorbell offset in78 * bytes within79 * l2_db_size_nc.80 */81 u16 chip_num;82 u16 hw_ring_stats_size;83 u16 pf_port_id;84 unsigned long en_state; /* Could be checked in85 * RoCE driver suspend86 * mode only. Will be87 * updated in resume.88 */89 void __iomem *bar0;90 91 u16 ulp_num_msix_vec;92 u16 ulp_num_ctxs;93 94 /* serialize ulp operations */95 struct mutex en_dev_lock;96};97 98static inline bool bnxt_ulp_registered(struct bnxt_en_dev *edev)99{100 if (edev && rcu_access_pointer(edev->ulp_tbl->ulp_ops))101 return true;102 return false;103}104 105int bnxt_get_ulp_msix_num(struct bnxt *bp);106int bnxt_get_ulp_msix_num_in_use(struct bnxt *bp);107void bnxt_set_ulp_msix_num(struct bnxt *bp, int num);108int bnxt_get_ulp_stat_ctxs(struct bnxt *bp);109void bnxt_set_ulp_stat_ctxs(struct bnxt *bp, int num_ctxs);110int bnxt_get_ulp_stat_ctxs_in_use(struct bnxt *bp);111void bnxt_set_dflt_ulp_stat_ctxs(struct bnxt *bp);112void bnxt_ulp_stop(struct bnxt *bp);113void bnxt_ulp_start(struct bnxt *bp, int err);114void bnxt_ulp_sriov_cfg(struct bnxt *bp, int num_vfs);115void bnxt_ulp_irq_stop(struct bnxt *bp);116void bnxt_ulp_irq_restart(struct bnxt *bp, int err);117void bnxt_ulp_async_events(struct bnxt *bp, struct hwrm_async_event_cmpl *cmpl);118void bnxt_rdma_aux_device_uninit(struct bnxt *bp);119void bnxt_rdma_aux_device_del(struct bnxt *bp);120void bnxt_rdma_aux_device_add(struct bnxt *bp);121void bnxt_rdma_aux_device_init(struct bnxt *bp);122int bnxt_register_dev(struct bnxt_en_dev *edev, struct bnxt_ulp_ops *ulp_ops,123 void *handle);124void bnxt_unregister_dev(struct bnxt_en_dev *edev);125int bnxt_send_msg(struct bnxt_en_dev *edev, struct bnxt_fw_msg *fw_msg);126int bnxt_register_async_events(struct bnxt_en_dev *edev,127 unsigned long *events_bmap, u16 max_id);128#endif129