f041d0a26ad5e9ae1c565ce406f2cdd64eda0ce2
[muen/linux.git] / drivers / net / ethernet / marvell / octeontx2 / af / rvu.h
1 /* SPDX-License-Identifier: GPL-2.0
2  * Marvell OcteonTx2 RVU Admin Function driver
3  *
4  * Copyright (C) 2018 Marvell International Ltd.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  */
10
11 #ifndef RVU_H
12 #define RVU_H
13
14 #include "rvu_struct.h"
15 #include "common.h"
16 #include "mbox.h"
17
18 /* PCI device IDs */
19 #define PCI_DEVID_OCTEONTX2_RVU_AF              0xA065
20
21 /* PCI BAR nos */
22 #define PCI_AF_REG_BAR_NUM                      0
23 #define PCI_PF_REG_BAR_NUM                      2
24 #define PCI_MBOX_BAR_NUM                        4
25
26 #define NAME_SIZE                               32
27
28 /* PF_FUNC */
29 #define RVU_PFVF_PF_SHIFT       10
30 #define RVU_PFVF_PF_MASK        0x3F
31 #define RVU_PFVF_FUNC_SHIFT     0
32 #define RVU_PFVF_FUNC_MASK      0x3FF
33
34 struct rvu_work {
35         struct  work_struct work;
36         struct  rvu *rvu;
37 };
38
39 struct rsrc_bmap {
40         unsigned long *bmap;    /* Pointer to resource bitmap */
41         u16  max;               /* Max resource id or count */
42 };
43
44 struct rvu_block {
45         struct rsrc_bmap        lf;
46         struct admin_queue      *aq; /* NIX/NPA AQ */
47         u16  *fn_map; /* LF to pcifunc mapping */
48         bool multislot;
49         bool implemented;
50         u8   addr;  /* RVU_BLOCK_ADDR_E */
51         u8   type;  /* RVU_BLOCK_TYPE_E */
52         u8   lfshift;
53         u64  lookup_reg;
54         u64  pf_lfcnt_reg;
55         u64  vf_lfcnt_reg;
56         u64  lfcfg_reg;
57         u64  msixcfg_reg;
58         u64  lfreset_reg;
59         unsigned char name[NAME_SIZE];
60 };
61
62 /* Structure for per RVU func info ie PF/VF */
63 struct rvu_pfvf {
64         bool            npalf; /* Only one NPALF per RVU_FUNC */
65         bool            nixlf; /* Only one NIXLF per RVU_FUNC */
66         u16             sso;
67         u16             ssow;
68         u16             cptlfs;
69         u16             timlfs;
70
71         /* Block LF's MSIX vector info */
72         struct rsrc_bmap msix;      /* Bitmap for MSIX vector alloc */
73 #define MSIX_BLKLF(blkaddr, lf) (((blkaddr) << 8) | ((lf) & 0xFF))
74         u16              *msix_lfmap; /* Vector to block LF mapping */
75
76         /* NPA contexts */
77         struct qmem     *aura_ctx;
78         struct qmem     *pool_ctx;
79         struct qmem     *npa_qints_ctx;
80         unsigned long   *aura_bmap;
81         unsigned long   *pool_bmap;
82
83         /* NIX contexts */
84         struct qmem     *rq_ctx;
85         struct qmem     *sq_ctx;
86         struct qmem     *cq_ctx;
87         struct qmem     *rss_ctx;
88         struct qmem     *cq_ints_ctx;
89         struct qmem     *nix_qints_ctx;
90         unsigned long   *sq_bmap;
91         unsigned long   *rq_bmap;
92         unsigned long   *cq_bmap;
93
94         u8              mac_addr[ETH_ALEN]; /* MAC address of this PF/VF */
95 };
96
97 struct nix_txsch {
98         struct rsrc_bmap schq;
99         u8   lvl;
100         u16  *pfvf_map;
101 };
102
103 struct nix_hw {
104         struct nix_txsch txsch[NIX_TXSCH_LVL_CNT]; /* Tx schedulers */
105 };
106
107 struct rvu_hwinfo {
108         u8      total_pfs;   /* MAX RVU PFs HW supports */
109         u16     total_vfs;   /* Max RVU VFs HW supports */
110         u16     max_vfs_per_pf; /* Max VFs that can be attached to a PF */
111         u8      cgx;
112         u8      lmac_per_cgx;
113         u8      cgx_links;
114         u8      lbk_links;
115         u8      sdp_links;
116
117         struct rvu_block block[BLK_COUNT]; /* Block info */
118         struct nix_hw    *nix0;
119 };
120
121 struct rvu {
122         void __iomem            *afreg_base;
123         void __iomem            *pfreg_base;
124         struct pci_dev          *pdev;
125         struct device           *dev;
126         struct rvu_hwinfo       *hw;
127         struct rvu_pfvf         *pf;
128         struct rvu_pfvf         *hwvf;
129         spinlock_t              rsrc_lock; /* Serialize resource alloc/free */
130
131         /* Mbox */
132         struct otx2_mbox        mbox;
133         struct rvu_work         *mbox_wrk;
134         struct otx2_mbox        mbox_up;
135         struct rvu_work         *mbox_wrk_up;
136         struct workqueue_struct *mbox_wq;
137
138         /* MSI-X */
139         u16                     num_vec;
140         char                    *irq_name;
141         bool                    *irq_allocated;
142         dma_addr_t              msix_base_iova;
143
144         /* CGX */
145 #define PF_CGXMAP_BASE          1 /* PF 0 is reserved for RVU PF */
146         u8                      cgx_mapped_pfs;
147         u8                      cgx_cnt; /* available cgx ports */
148         u8                      *pf2cgxlmac_map; /* pf to cgx_lmac map */
149         u16                     *cgxlmac2pf_map; /* bitmap of mapped pfs for
150                                                   * every cgx lmac port
151                                                   */
152         unsigned long           pf_notify_bmap; /* Flags for PF notification */
153         void                    **cgx_idmap; /* cgx id to cgx data map table */
154         struct                  work_struct cgx_evh_work;
155         struct                  workqueue_struct *cgx_evh_wq;
156         spinlock_t              cgx_evq_lock; /* cgx event queue lock */
157         struct list_head        cgx_evq_head; /* cgx event queue head */
158 };
159
160 static inline void rvu_write64(struct rvu *rvu, u64 block, u64 offset, u64 val)
161 {
162         writeq(val, rvu->afreg_base + ((block << 28) | offset));
163 }
164
165 static inline u64 rvu_read64(struct rvu *rvu, u64 block, u64 offset)
166 {
167         return readq(rvu->afreg_base + ((block << 28) | offset));
168 }
169
170 static inline void rvupf_write64(struct rvu *rvu, u64 offset, u64 val)
171 {
172         writeq(val, rvu->pfreg_base + offset);
173 }
174
175 static inline u64 rvupf_read64(struct rvu *rvu, u64 offset)
176 {
177         return readq(rvu->pfreg_base + offset);
178 }
179
180 /* Function Prototypes
181  * RVU
182  */
183 int rvu_alloc_bitmap(struct rsrc_bmap *rsrc);
184 int rvu_alloc_rsrc(struct rsrc_bmap *rsrc);
185 void rvu_free_rsrc(struct rsrc_bmap *rsrc, int id);
186 int rvu_rsrc_free_count(struct rsrc_bmap *rsrc);
187 int rvu_alloc_rsrc_contig(struct rsrc_bmap *rsrc, int nrsrc);
188 bool rvu_rsrc_check_contig(struct rsrc_bmap *rsrc, int nrsrc);
189 int rvu_get_pf(u16 pcifunc);
190 struct rvu_pfvf *rvu_get_pfvf(struct rvu *rvu, int pcifunc);
191 void rvu_get_pf_numvfs(struct rvu *rvu, int pf, int *numvfs, int *hwvf);
192 bool is_block_implemented(struct rvu_hwinfo *hw, int blkaddr);
193 int rvu_get_lf(struct rvu *rvu, struct rvu_block *block, u16 pcifunc, u16 slot);
194 int rvu_lf_reset(struct rvu *rvu, struct rvu_block *block, int lf);
195 int rvu_get_blkaddr(struct rvu *rvu, int blktype, u16 pcifunc);
196 int rvu_poll_reg(struct rvu *rvu, u64 block, u64 offset, u64 mask, bool zero);
197
198 /* RVU HW reg validation */
199 enum regmap_block {
200         TXSCHQ_HWREGMAP = 0,
201         MAX_HWREGMAP,
202 };
203
204 bool rvu_check_valid_reg(int regmap, int regblk, u64 reg);
205
206 /* NPA/NIX AQ APIs */
207 int rvu_aq_alloc(struct rvu *rvu, struct admin_queue **ad_queue,
208                  int qsize, int inst_size, int res_size);
209 void rvu_aq_free(struct rvu *rvu, struct admin_queue *aq);
210
211 /* CGX APIs */
212 static inline bool is_pf_cgxmapped(struct rvu *rvu, u8 pf)
213 {
214         return (pf >= PF_CGXMAP_BASE && pf <= rvu->cgx_mapped_pfs);
215 }
216
217 static inline void rvu_get_cgx_lmac_id(u8 map, u8 *cgx_id, u8 *lmac_id)
218 {
219         *cgx_id = (map >> 4) & 0xF;
220         *lmac_id = (map & 0xF);
221 }
222
223 int rvu_cgx_probe(struct rvu *rvu);
224 void rvu_cgx_wq_destroy(struct rvu *rvu);
225 int rvu_cgx_config_rxtx(struct rvu *rvu, u16 pcifunc, bool start);
226 int rvu_mbox_handler_CGX_START_RXTX(struct rvu *rvu, struct msg_req *req,
227                                     struct msg_rsp *rsp);
228 int rvu_mbox_handler_CGX_STOP_RXTX(struct rvu *rvu, struct msg_req *req,
229                                    struct msg_rsp *rsp);
230 int rvu_mbox_handler_CGX_STATS(struct rvu *rvu, struct msg_req *req,
231                                struct cgx_stats_rsp *rsp);
232 int rvu_mbox_handler_CGX_MAC_ADDR_SET(struct rvu *rvu,
233                                       struct cgx_mac_addr_set_or_get *req,
234                                       struct cgx_mac_addr_set_or_get *rsp);
235 int rvu_mbox_handler_CGX_MAC_ADDR_GET(struct rvu *rvu,
236                                       struct cgx_mac_addr_set_or_get *req,
237                                       struct cgx_mac_addr_set_or_get *rsp);
238 int rvu_mbox_handler_CGX_PROMISC_ENABLE(struct rvu *rvu, struct msg_req *req,
239                                         struct msg_rsp *rsp);
240 int rvu_mbox_handler_CGX_PROMISC_DISABLE(struct rvu *rvu, struct msg_req *req,
241                                          struct msg_rsp *rsp);
242 int rvu_mbox_handler_CGX_START_LINKEVENTS(struct rvu *rvu, struct msg_req *req,
243                                           struct msg_rsp *rsp);
244 int rvu_mbox_handler_CGX_STOP_LINKEVENTS(struct rvu *rvu, struct msg_req *req,
245                                          struct msg_rsp *rsp);
246 int rvu_mbox_handler_CGX_GET_LINKINFO(struct rvu *rvu, struct msg_req *req,
247                                       struct cgx_link_info_msg *rsp);
248 int rvu_mbox_handler_CGX_INTLBK_ENABLE(struct rvu *rvu, struct msg_req *req,
249                                        struct msg_rsp *rsp);
250 int rvu_mbox_handler_CGX_INTLBK_DISABLE(struct rvu *rvu, struct msg_req *req,
251                                         struct msg_rsp *rsp);
252
253 /* NPA APIs */
254 int rvu_npa_init(struct rvu *rvu);
255 void rvu_npa_freemem(struct rvu *rvu);
256 int rvu_mbox_handler_NPA_AQ_ENQ(struct rvu *rvu,
257                                 struct npa_aq_enq_req *req,
258                                 struct npa_aq_enq_rsp *rsp);
259 int rvu_mbox_handler_NPA_HWCTX_DISABLE(struct rvu *rvu,
260                                        struct hwctx_disable_req *req,
261                                        struct msg_rsp *rsp);
262 int rvu_mbox_handler_NPA_LF_ALLOC(struct rvu *rvu,
263                                   struct npa_lf_alloc_req *req,
264                                   struct npa_lf_alloc_rsp *rsp);
265 int rvu_mbox_handler_NPA_LF_FREE(struct rvu *rvu, struct msg_req *req,
266                                  struct msg_rsp *rsp);
267
268 /* NIX APIs */
269 int rvu_nix_init(struct rvu *rvu);
270 void rvu_nix_freemem(struct rvu *rvu);
271 int rvu_mbox_handler_NIX_LF_ALLOC(struct rvu *rvu,
272                                   struct nix_lf_alloc_req *req,
273                                   struct nix_lf_alloc_rsp *rsp);
274 int rvu_mbox_handler_NIX_LF_FREE(struct rvu *rvu, struct msg_req *req,
275                                  struct msg_rsp *rsp);
276 int rvu_mbox_handler_NIX_AQ_ENQ(struct rvu *rvu,
277                                 struct nix_aq_enq_req *req,
278                                 struct nix_aq_enq_rsp *rsp);
279 int rvu_mbox_handler_NIX_HWCTX_DISABLE(struct rvu *rvu,
280                                        struct hwctx_disable_req *req,
281                                        struct msg_rsp *rsp);
282 int rvu_mbox_handler_NIX_TXSCH_ALLOC(struct rvu *rvu,
283                                      struct nix_txsch_alloc_req *req,
284                                      struct nix_txsch_alloc_rsp *rsp);
285 int rvu_mbox_handler_NIX_TXSCH_FREE(struct rvu *rvu,
286                                     struct nix_txsch_free_req *req,
287                                     struct msg_rsp *rsp);
288 int rvu_mbox_handler_NIX_TXSCHQ_CFG(struct rvu *rvu,
289                                     struct nix_txschq_config *req,
290                                     struct msg_rsp *rsp);
291 int rvu_mbox_handler_NIX_STATS_RST(struct rvu *rvu, struct msg_req *req,
292                                    struct msg_rsp *rsp);
293 #endif /* RVU_H */