summaryrefslogtreecommitdiff
path: root/drivers/net/ethernet/qlogic/qed/qed_hw.h
blob: e535983ce21bba380024b76d3f1ecd280475c5c9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */
/* QLogic qed NIC Driver
 * Copyright (c) 2015-2017  QLogic Corporation
 * Copyright (c) 2019-2020 Marvell International Ltd.
 */

#ifndef _QED_HW_H
#define _QED_HW_H

#include <linux/types.h>
#include <linux/bitops.h>
#include <linux/slab.h>
#include <linux/string.h>
#include "qed.h"
#include "qed_dev_api.h"

/* Forward decleration */
struct qed_ptt;

enum reserved_ptts {
	RESERVED_PTT_EDIAG,
	RESERVED_PTT_USER_SPACE,
	RESERVED_PTT_MAIN,
	RESERVED_PTT_DPC,
	RESERVED_PTT_MAX
};

enum _dmae_cmd_dst_mask {
	DMAE_CMD_DST_MASK_NONE	= 0,
	DMAE_CMD_DST_MASK_PCIE	= 1,
	DMAE_CMD_DST_MASK_GRC	= 2
};

enum _dmae_cmd_src_mask {
	DMAE_CMD_SRC_MASK_PCIE	= 0,
	DMAE_CMD_SRC_MASK_GRC	= 1
};

enum _dmae_cmd_crc_mask {
	DMAE_CMD_COMP_CRC_EN_MASK_NONE	= 0,
	DMAE_CMD_COMP_CRC_EN_MASK_SET	= 1
};

/* definitions for DMA constants */
#define DMAE_GO_VALUE   0x1

#define DMAE_COMPLETION_VAL     0xD1AE
#define DMAE_CMD_ENDIANITY      0x2

#define DMAE_CMD_SIZE   14
#define DMAE_CMD_SIZE_TO_FILL   (DMAE_CMD_SIZE - 5)
#define DMAE_MIN_WAIT_TIME      0x2
#define DMAE_MAX_CLIENTS        32

/**
 * qed_gtt_init(): Initialize GTT windows.
 *
 * @p_hwfn: HW device data.
 *
 * Return: Void.
 */
void qed_gtt_init(struct qed_hwfn *p_hwfn);

/**
 * qed_ptt_invalidate(): Forces all ptt entries to be re-configured
 *
 * @p_hwfn: HW device data.
 *
 * Return: Void.
 */
void qed_ptt_invalidate(struct qed_hwfn *p_hwfn);

/**
 * qed_ptt_pool_alloc(): Allocate and initialize PTT pool.
 *
 * @p_hwfn: HW device data.
 *
 * Return: struct _qed_status - success (0), negative - error.
 */
int qed_ptt_pool_alloc(struct qed_hwfn *p_hwfn);

/**
 * qed_ptt_pool_free(): Free PTT pool.
 *
 * @p_hwfn: HW device data.
 *
 * Return: Void.
 */
void qed_ptt_pool_free(struct qed_hwfn *p_hwfn);

/**
 * qed_ptt_get_hw_addr(): Get PTT's GRC/HW address.
 *
 * @p_hwfn: HW device data.
 * @p_ptt: P_ptt
 *
 * Return: u32.
 */
u32 qed_ptt_get_hw_addr(struct qed_hwfn *p_hwfn,
			struct qed_ptt *p_ptt);

/**
 * qed_ptt_get_bar_addr(): Get PPT's external BAR address.
 *
 * @p_ptt: P_ptt
 *
 * Return: u32.
 */
u32 qed_ptt_get_bar_addr(struct qed_ptt *p_ptt);

/**
 * qed_ptt_set_win(): Set PTT Window's GRC BAR address
 *
 * @p_hwfn: HW device data.
 * @new_hw_addr: New HW address.
 * @p_ptt: P_Ptt
 *
 * Return: Void.
 */
void qed_ptt_set_win(struct qed_hwfn *p_hwfn,
		     struct qed_ptt *p_ptt,
		     u32 new_hw_addr);

/**
 * qed_get_reserved_ptt(): Get a specific reserved PTT.
 *
 * @p_hwfn: HW device data.
 * @ptt_idx: Ptt Index.
 *
 * Return: struct qed_ptt *.
 */
struct qed_ptt *qed_get_reserved_ptt(struct qed_hwfn *p_hwfn,
				     enum reserved_ptts ptt_idx);

/**
 * qed_wr(): Write value to BAR using the given ptt.
 *
 * @p_hwfn: HW device data.
 * @p_ptt: P_ptt.
 * @val: Val.
 * @hw_addr: HW address
 *
 * Return: Void.
 */
void qed_wr(struct qed_hwfn *p_hwfn,
	    struct qed_ptt *p_ptt,
	    u32 hw_addr,
	    u32 val);

/**
 * qed_rd(): Read value from BAR using the given ptt.
 *
 * @p_hwfn: HW device data.
 * @p_ptt: P_ptt.
 * @hw_addr: HW address
 *
 * Return: Void.
 */
u32 qed_rd(struct qed_hwfn *p_hwfn,
	   struct qed_ptt *p_ptt,
	   u32 hw_addr);

/**
 * qed_memcpy_from(): Copy n bytes from BAR using the given ptt.
 *
 * @p_hwfn: HW device data.
 * @p_ptt: P_ptt.
 * @dest: Destination.
 * @hw_addr: HW address.
 * @n: N
 *
 * Return: Void.
 */
void qed_memcpy_from(struct qed_hwfn *p_hwfn,
		     struct qed_ptt *p_ptt,
		     void *dest,
		     u32 hw_addr,
		     size_t n);

/**
 * qed_memcpy_to(): Copy n bytes to BAR using the given  ptt
 *
 * @p_hwfn: HW device data.
 * @p_ptt: P_ptt.
 * @hw_addr: HW address.
 * @src: Source.
 * @n: N
 *
 * Return: Void.
 */
void qed_memcpy_to(struct qed_hwfn *p_hwfn,
		   struct qed_ptt *p_ptt,
		   u32 hw_addr,
		   void *src,
		   size_t n);
/**
 * qed_fid_pretend(): pretend to another function when
 *                    accessing the ptt window. There is no way to unpretend
 *                    a function. The only way to cancel a pretend is to
 *                    pretend back to the original function.
 *
 * @p_hwfn: HW device data.
 * @p_ptt: P_ptt.
 * @fid: fid field of pxp_pretend structure. Can contain
 *        either pf / vf, port/path fields are don't care.
 *
 * Return: Void.
 */
void qed_fid_pretend(struct qed_hwfn *p_hwfn,
		     struct qed_ptt *p_ptt,
		     u16 fid);

/**
 * qed_port_pretend(): Pretend to another port when accessing the ptt window
 *
 * @p_hwfn: HW device data.
 * @p_ptt: P_ptt.
 * @port_id: The port to pretend to
 *
 * Return: Void.
 */
void qed_port_pretend(struct qed_hwfn *p_hwfn,
		      struct qed_ptt *p_ptt,
		      u8 port_id);

/**
 * qed_port_unpretend(): Cancel any previously set port pretend
 *
 * @p_hwfn: HW device data.
 * @p_ptt: P_ptt.
 *
 * Return: Void.
 */
void qed_port_unpretend(struct qed_hwfn *p_hwfn,
			struct qed_ptt *p_ptt);

/**
 * qed_port_fid_pretend(): Pretend to another port and another function
 *                         when accessing the ptt window
 *
 * @p_hwfn: HW device data.
 * @p_ptt: P_ptt.
 * @port_id: The port to pretend to
 * @fid: fid field of pxp_pretend structure. Can contain either pf / vf.
 *
 * Return: Void.
 */
void qed_port_fid_pretend(struct qed_hwfn *p_hwfn,
			  struct qed_ptt *p_ptt, u8 port_id, u16 fid);

/**
 * qed_vfid_to_concrete(): Build a concrete FID for a given VF ID
 *
 * @p_hwfn: HW device data.
 * @vfid: VFID.
 *
 * Return: Void.
 */
u32 qed_vfid_to_concrete(struct qed_hwfn *p_hwfn, u8 vfid);

/**
 * qed_dmae_idx_to_go_cmd(): Map the idx to dmae cmd
 *    this is declared here since other files will require it.
 *
 * @idx: Index
 *
 * Return: Void.
 */
u32 qed_dmae_idx_to_go_cmd(u8 idx);

/**
 * qed_dmae_info_alloc(): Init the dmae_info structure
 *                        which is part of p_hwfn.
 *
 * @p_hwfn: HW device data.
 *
 * Return: Int.
 */
int qed_dmae_info_alloc(struct qed_hwfn *p_hwfn);

/**
 * qed_dmae_info_free(): Free the dmae_info structure
 *                       which is part of p_hwfn.
 *
 * @p_hwfn: HW device data.
 *
 * Return: Void.
 */
void qed_dmae_info_free(struct qed_hwfn *p_hwfn);

union qed_qm_pq_params {
	struct {
		u8 q_idx;
	} iscsi;

	struct {
		u8 tc;
	}	core;

	struct {
		u8	is_vf;
		u8	vf_id;
		u8	tc;
	}	eth;

	struct {
		u8 dcqcn;
		u8 qpid;	/* roce relative */
	} roce;
};

int qed_init_fw_data(struct qed_dev *cdev,
		     const u8 *fw_data);

int qed_dmae_sanity(struct qed_hwfn *p_hwfn,
		    struct qed_ptt *p_ptt, const char *phase);

#define QED_HW_ERR_MAX_STR_SIZE 256

/**
 * qed_hw_err_notify(): Notify upper layer driver and management FW
 *                      about a HW error.
 *
 * @p_hwfn: HW device data.
 * @p_ptt: P_ptt.
 * @err_type: Err Type.
 * @fmt: Debug data buffer to send to the MFW
 * @...: buffer format args
 *
 * Return void.
 */
void __printf(4, 5) __cold qed_hw_err_notify(struct qed_hwfn *p_hwfn,
					     struct qed_ptt *p_ptt,
					     enum qed_hw_err_type err_type,
					     const char *fmt, ...);
#endif