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