1a588e458SMichael Chan /* Broadcom NetXtreme-C/E network driver.
2a588e458SMichael Chan *
3ec86f14eSMichael Chan * Copyright (c) 2016-2018 Broadcom Limited
4a588e458SMichael Chan *
5a588e458SMichael Chan * This program is free software; you can redistribute it and/or modify
6a588e458SMichael Chan * it under the terms of the GNU General Public License as published by
7a588e458SMichael Chan * the Free Software Foundation.
8a588e458SMichael Chan */
9a588e458SMichael Chan
10a588e458SMichael Chan #ifndef BNXT_ULP_H
11a588e458SMichael Chan #define BNXT_ULP_H
12a588e458SMichael Chan
13a588e458SMichael Chan #define BNXT_ROCE_ULP 0
14d2692877SLeon Romanovsky #define BNXT_MAX_ULP 1
15a588e458SMichael Chan
16a588e458SMichael Chan #define BNXT_MIN_ROCE_CP_RINGS 2
17a588e458SMichael Chan #define BNXT_MIN_ROCE_STAT_CTXS 1
1830343221SAjit Khaparde #define BNXT_MAX_ROCE_MSIX 9
1930343221SAjit Khaparde #define BNXT_MAX_VF_ROCE_MSIX 2
20a588e458SMichael Chan
21a588e458SMichael Chan struct hwrm_async_event_cmpl;
22a588e458SMichael Chan struct bnxt;
23a588e458SMichael Chan
24ec86f14eSMichael Chan struct bnxt_msix_entry {
25ec86f14eSMichael Chan u32 vector;
26ec86f14eSMichael Chan u32 ring_idx;
27ec86f14eSMichael Chan u32 db_offset;
28ec86f14eSMichael Chan };
29ec86f14eSMichael Chan
30a588e458SMichael Chan struct bnxt_ulp_ops {
31ec86f14eSMichael Chan void (*ulp_irq_stop)(void *);
32ec86f14eSMichael Chan void (*ulp_irq_restart)(void *, struct bnxt_msix_entry *);
33a588e458SMichael Chan };
34a588e458SMichael Chan
35a588e458SMichael Chan struct bnxt_fw_msg {
36a588e458SMichael Chan void *msg;
37a588e458SMichael Chan int msg_len;
38a588e458SMichael Chan void *resp;
39a588e458SMichael Chan int resp_max_len;
40a588e458SMichael Chan int timeout;
41a588e458SMichael Chan };
42a588e458SMichael Chan
43a588e458SMichael Chan struct bnxt_ulp {
44a588e458SMichael Chan void *handle;
45a588e458SMichael Chan struct bnxt_ulp_ops __rcu *ulp_ops;
46a588e458SMichael Chan unsigned long *async_events_bmap;
47a588e458SMichael Chan u16 max_async_event_id;
48a588e458SMichael Chan u16 msix_requested;
4908654eb2SMichael Chan u16 msix_base;
50a588e458SMichael Chan atomic_t ref_count;
51a588e458SMichael Chan };
52a588e458SMichael Chan
53a588e458SMichael Chan struct bnxt_en_dev {
54a588e458SMichael Chan struct net_device *net;
55a588e458SMichael Chan struct pci_dev *pdev;
5630343221SAjit Khaparde struct bnxt_msix_entry msix_entries[BNXT_MAX_ROCE_MSIX];
57a588e458SMichael Chan u32 flags;
58a588e458SMichael Chan #define BNXT_EN_FLAG_ROCEV1_CAP 0x1
59a588e458SMichael Chan #define BNXT_EN_FLAG_ROCEV2_CAP 0x2
60a588e458SMichael Chan #define BNXT_EN_FLAG_ROCE_CAP (BNXT_EN_FLAG_ROCEV1_CAP | \
61a588e458SMichael Chan BNXT_EN_FLAG_ROCEV2_CAP)
62ec86f14eSMichael Chan #define BNXT_EN_FLAG_MSIX_REQUESTED 0x4
63aa46dfffSVasundhara Volam #define BNXT_EN_FLAG_ULP_STOPPED 0x8
64848dc857SHongguang Gao #define BNXT_EN_FLAG_VF 0x10
65848dc857SHongguang Gao #define BNXT_EN_VF(edev) ((edev)->flags & BNXT_EN_FLAG_VF)
66848dc857SHongguang Gao
67dafcdf5eSAjit Khaparde struct bnxt_ulp *ulp_tbl;
68098286ffSMichael Chan int l2_db_size; /* Doorbell BAR size in
69098286ffSMichael Chan * bytes mapped by L2
70098286ffSMichael Chan * driver.
71098286ffSMichael Chan */
72098286ffSMichael Chan int l2_db_size_nc; /* Doorbell BAR size in
73098286ffSMichael Chan * bytes mapped as non-
74098286ffSMichael Chan * cacheable.
75098286ffSMichael Chan */
76848dc857SHongguang Gao u16 chip_num;
77848dc857SHongguang Gao u16 hw_ring_stats_size;
78848dc857SHongguang Gao u16 pf_port_id;
79848dc857SHongguang Gao unsigned long en_state; /* Could be checked in
80848dc857SHongguang Gao * RoCE driver suspend
81848dc857SHongguang Gao * mode only. Will be
82848dc857SHongguang Gao * updated in resume.
83848dc857SHongguang Gao */
84*61220e09SChandramohan Akula void __iomem *bar0;
85a588e458SMichael Chan };
86a588e458SMichael Chan
bnxt_ulp_registered(struct bnxt_en_dev * edev)87dafcdf5eSAjit Khaparde static inline bool bnxt_ulp_registered(struct bnxt_en_dev *edev)
88a588e458SMichael Chan {
89dafcdf5eSAjit Khaparde if (edev && edev->ulp_tbl)
90a588e458SMichael Chan return true;
91a588e458SMichael Chan return false;
92a588e458SMichael Chan }
93a588e458SMichael Chan
9408654eb2SMichael Chan int bnxt_get_ulp_msix_num(struct bnxt *bp);
9508654eb2SMichael Chan int bnxt_get_ulp_msix_base(struct bnxt *bp);
96c027c6b4SVasundhara Volam int bnxt_get_ulp_stat_ctxs(struct bnxt *bp);
97a588e458SMichael Chan void bnxt_ulp_stop(struct bnxt *bp);
98aa46dfffSVasundhara Volam void bnxt_ulp_start(struct bnxt *bp, int err);
99a588e458SMichael Chan void bnxt_ulp_sriov_cfg(struct bnxt *bp, int num_vfs);
100ec86f14eSMichael Chan void bnxt_ulp_irq_stop(struct bnxt *bp);
101ec86f14eSMichael Chan void bnxt_ulp_irq_restart(struct bnxt *bp, int err);
102a588e458SMichael Chan void bnxt_ulp_async_events(struct bnxt *bp, struct hwrm_async_event_cmpl *cmpl);
103d80d88b0SAjit Khaparde void bnxt_rdma_aux_device_uninit(struct bnxt *bp);
104d80d88b0SAjit Khaparde void bnxt_rdma_aux_device_init(struct bnxt *bp);
10563669ab3SAjit Khaparde int bnxt_register_dev(struct bnxt_en_dev *edev, struct bnxt_ulp_ops *ulp_ops,
10663669ab3SAjit Khaparde void *handle);
10763669ab3SAjit Khaparde void bnxt_unregister_dev(struct bnxt_en_dev *edev);
10863669ab3SAjit Khaparde int bnxt_send_msg(struct bnxt_en_dev *edev, struct bnxt_fw_msg *fw_msg);
10963669ab3SAjit Khaparde int bnxt_register_async_events(struct bnxt_en_dev *edev,
11063669ab3SAjit Khaparde unsigned long *events_bmap, u16 max_id);
111a588e458SMichael Chan #endif
112