xref: /freebsd/sys/dev/cxgbe/cudbg/cudbg_lib.c (revision fdafd315)
1f856f099SNavdeep Parhar /*-
2f856f099SNavdeep Parhar  * Copyright (c) 2017 Chelsio Communications, Inc.
3f856f099SNavdeep Parhar  * All rights reserved.
4f856f099SNavdeep Parhar  *
5f856f099SNavdeep Parhar  * Redistribution and use in source and binary forms, with or without
6f856f099SNavdeep Parhar  * modification, are permitted provided that the following conditions
7f856f099SNavdeep Parhar  * are met:
8f856f099SNavdeep Parhar  * 1. Redistributions of source code must retain the above copyright
9f856f099SNavdeep Parhar  *    notice, this list of conditions and the following disclaimer.
10f856f099SNavdeep Parhar  * 2. Redistributions in binary form must reproduce the above copyright
11f856f099SNavdeep Parhar  *    notice, this list of conditions and the following disclaimer in the
12f856f099SNavdeep Parhar  *    documentation and/or other materials provided with the distribution.
13f856f099SNavdeep Parhar  *
14f856f099SNavdeep Parhar  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15f856f099SNavdeep Parhar  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16f856f099SNavdeep Parhar  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17f856f099SNavdeep Parhar  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18f856f099SNavdeep Parhar  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19f856f099SNavdeep Parhar  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20f856f099SNavdeep Parhar  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21f856f099SNavdeep Parhar  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22f856f099SNavdeep Parhar  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23f856f099SNavdeep Parhar  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24f856f099SNavdeep Parhar  * SUCH DAMAGE.
25f856f099SNavdeep Parhar  */
26f856f099SNavdeep Parhar 
27f856f099SNavdeep Parhar #include <sys/types.h>
28f856f099SNavdeep Parhar #include <sys/param.h>
29f856f099SNavdeep Parhar 
30f856f099SNavdeep Parhar #include "common/common.h"
31f856f099SNavdeep Parhar #include "common/t4_regs.h"
32f856f099SNavdeep Parhar #include "cudbg.h"
33f856f099SNavdeep Parhar #include "cudbg_lib_common.h"
34f856f099SNavdeep Parhar #include "cudbg_lib.h"
35f856f099SNavdeep Parhar #include "cudbg_entity.h"
36f856f099SNavdeep Parhar #define  BUFFER_WARN_LIMIT 10000000
37f856f099SNavdeep Parhar 
38f856f099SNavdeep Parhar struct large_entity large_entity_list[] = {
39f856f099SNavdeep Parhar 	{CUDBG_EDC0, 0, 0},
40f856f099SNavdeep Parhar 	{CUDBG_EDC1, 0 , 0},
41f856f099SNavdeep Parhar 	{CUDBG_MC0, 0, 0},
42f856f099SNavdeep Parhar 	{CUDBG_MC1, 0, 0}
43f856f099SNavdeep Parhar };
44f856f099SNavdeep Parhar 
is_fw_attached(struct cudbg_init * pdbg_init)45f856f099SNavdeep Parhar static int is_fw_attached(struct cudbg_init *pdbg_init)
46f856f099SNavdeep Parhar {
47f856f099SNavdeep Parhar 
48f856f099SNavdeep Parhar 	return (pdbg_init->adap->flags & FW_OK);
49f856f099SNavdeep Parhar }
50f856f099SNavdeep Parhar 
51f856f099SNavdeep Parhar /* This function will add additional padding bytes into debug_buffer to make it
52f856f099SNavdeep Parhar  * 4 byte aligned.*/
align_debug_buffer(struct cudbg_buffer * dbg_buff,struct cudbg_entity_hdr * entity_hdr)53f856f099SNavdeep Parhar static void align_debug_buffer(struct cudbg_buffer *dbg_buff,
54f856f099SNavdeep Parhar 			struct cudbg_entity_hdr *entity_hdr)
55f856f099SNavdeep Parhar {
56f856f099SNavdeep Parhar 	u8 zero_buf[4] = {0};
57f856f099SNavdeep Parhar 	u8 padding, remain;
58f856f099SNavdeep Parhar 
59f856f099SNavdeep Parhar 	remain = (dbg_buff->offset - entity_hdr->start_offset) % 4;
60f856f099SNavdeep Parhar 	padding = 4 - remain;
61f856f099SNavdeep Parhar 	if (remain) {
62f856f099SNavdeep Parhar 		memcpy(((u8 *) dbg_buff->data) + dbg_buff->offset, &zero_buf,
63f856f099SNavdeep Parhar 		       padding);
64f856f099SNavdeep Parhar 		dbg_buff->offset += padding;
65f856f099SNavdeep Parhar 		entity_hdr->num_pad = padding;
66f856f099SNavdeep Parhar 	}
67f856f099SNavdeep Parhar 
68f856f099SNavdeep Parhar 	entity_hdr->size = dbg_buff->offset - entity_hdr->start_offset;
69f856f099SNavdeep Parhar }
70f856f099SNavdeep Parhar 
read_sge_ctxt(struct cudbg_init * pdbg_init,u32 cid,enum ctxt_type ctype,u32 * data)71f856f099SNavdeep Parhar static void read_sge_ctxt(struct cudbg_init *pdbg_init, u32 cid,
72f856f099SNavdeep Parhar 			  enum ctxt_type ctype, u32 *data)
73f856f099SNavdeep Parhar {
74f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
75f856f099SNavdeep Parhar 	int rc = -1;
76f856f099SNavdeep Parhar 
778ee789e9SNavdeep Parhar 	if (is_fw_attached(pdbg_init)) {
788ee789e9SNavdeep Parhar 		rc = begin_synchronized_op(padap, NULL, SLEEP_OK | INTR_OK,
798ee789e9SNavdeep Parhar 		    "t4cudf");
808ee789e9SNavdeep Parhar 		if (rc != 0)
818ee789e9SNavdeep Parhar 			goto out;
82f856f099SNavdeep Parhar 		rc = t4_sge_ctxt_rd(padap, padap->mbox, cid, ctype,
83f856f099SNavdeep Parhar 				    data);
848ee789e9SNavdeep Parhar 		end_synchronized_op(padap, 0);
858ee789e9SNavdeep Parhar 	}
86f856f099SNavdeep Parhar 
878ee789e9SNavdeep Parhar out:
88f856f099SNavdeep Parhar 	if (rc)
89f856f099SNavdeep Parhar 		t4_sge_ctxt_rd_bd(padap, cid, ctype, data);
90f856f099SNavdeep Parhar }
91f856f099SNavdeep Parhar 
get_next_ext_entity_hdr(void * outbuf,u32 * ext_size,struct cudbg_buffer * dbg_buff,struct cudbg_entity_hdr ** entity_hdr)92f856f099SNavdeep Parhar static int get_next_ext_entity_hdr(void *outbuf, u32 *ext_size,
93f856f099SNavdeep Parhar 			    struct cudbg_buffer *dbg_buff,
94f856f099SNavdeep Parhar 			    struct cudbg_entity_hdr **entity_hdr)
95f856f099SNavdeep Parhar {
96f856f099SNavdeep Parhar 	struct cudbg_hdr *cudbg_hdr = (struct cudbg_hdr *)outbuf;
97f856f099SNavdeep Parhar 	int rc = 0;
98f856f099SNavdeep Parhar 	u32 ext_offset = cudbg_hdr->data_len;
99f856f099SNavdeep Parhar 	*ext_size = 0;
100f856f099SNavdeep Parhar 
101f856f099SNavdeep Parhar 	if (dbg_buff->size - dbg_buff->offset <=
102f856f099SNavdeep Parhar 		 sizeof(struct cudbg_entity_hdr)) {
103f856f099SNavdeep Parhar 		rc = CUDBG_STATUS_BUFFER_SHORT;
104f856f099SNavdeep Parhar 		goto err;
105f856f099SNavdeep Parhar 	}
106f856f099SNavdeep Parhar 
107f856f099SNavdeep Parhar 	*entity_hdr = (struct cudbg_entity_hdr *)
108f856f099SNavdeep Parhar 		       ((char *)outbuf + cudbg_hdr->data_len);
109f856f099SNavdeep Parhar 
110f856f099SNavdeep Parhar 	/* Find the last extended entity header */
111f856f099SNavdeep Parhar 	while ((*entity_hdr)->size) {
112f856f099SNavdeep Parhar 
113f856f099SNavdeep Parhar 		ext_offset += sizeof(struct cudbg_entity_hdr) +
114f856f099SNavdeep Parhar 				     (*entity_hdr)->size;
115f856f099SNavdeep Parhar 
116f856f099SNavdeep Parhar 		*ext_size += (*entity_hdr)->size +
117f856f099SNavdeep Parhar 			      sizeof(struct cudbg_entity_hdr);
118f856f099SNavdeep Parhar 
119f856f099SNavdeep Parhar 		if (dbg_buff->size - dbg_buff->offset + *ext_size  <=
120f856f099SNavdeep Parhar 			sizeof(struct cudbg_entity_hdr)) {
121f856f099SNavdeep Parhar 			rc = CUDBG_STATUS_BUFFER_SHORT;
122f856f099SNavdeep Parhar 			goto err;
123f856f099SNavdeep Parhar 		}
124f856f099SNavdeep Parhar 
125f856f099SNavdeep Parhar 		if (ext_offset != (*entity_hdr)->next_ext_offset) {
126f856f099SNavdeep Parhar 			ext_offset -= sizeof(struct cudbg_entity_hdr) +
127f856f099SNavdeep Parhar 				     (*entity_hdr)->size;
128f856f099SNavdeep Parhar 			break;
129f856f099SNavdeep Parhar 		}
130f856f099SNavdeep Parhar 
131f856f099SNavdeep Parhar 		(*entity_hdr)->next_ext_offset = *ext_size;
132f856f099SNavdeep Parhar 
133f856f099SNavdeep Parhar 		*entity_hdr = (struct cudbg_entity_hdr *)
134f856f099SNavdeep Parhar 					   ((char *)outbuf +
135f856f099SNavdeep Parhar 					   ext_offset);
136f856f099SNavdeep Parhar 	}
137f856f099SNavdeep Parhar 
138f856f099SNavdeep Parhar 	/* update the data offset */
139f856f099SNavdeep Parhar 	dbg_buff->offset = ext_offset;
140f856f099SNavdeep Parhar err:
141f856f099SNavdeep Parhar 	return rc;
142f856f099SNavdeep Parhar }
143f856f099SNavdeep Parhar 
wr_entity_to_flash(void * handle,struct cudbg_buffer * dbg_buff,u32 cur_entity_data_offset,u32 cur_entity_size,int entity_nu,u32 ext_size)144f856f099SNavdeep Parhar static int wr_entity_to_flash(void *handle, struct cudbg_buffer *dbg_buff,
145f856f099SNavdeep Parhar 		       u32 cur_entity_data_offset,
146f856f099SNavdeep Parhar 		       u32 cur_entity_size,
147f856f099SNavdeep Parhar 		       int entity_nu, u32 ext_size)
148f856f099SNavdeep Parhar {
149f856f099SNavdeep Parhar 	struct cudbg_private *priv = handle;
150f856f099SNavdeep Parhar 	struct cudbg_init *cudbg_init = &priv->dbg_init;
151f856f099SNavdeep Parhar 	struct cudbg_flash_sec_info *sec_info = &priv->sec_info;
152f856f099SNavdeep Parhar 	u64 timestamp;
153f856f099SNavdeep Parhar 	u32 cur_entity_hdr_offset = sizeof(struct cudbg_hdr);
154f856f099SNavdeep Parhar 	u32 remain_flash_size;
155f856f099SNavdeep Parhar 	u32 flash_data_offset;
156f856f099SNavdeep Parhar 	u32 data_hdr_size;
157f856f099SNavdeep Parhar 	int rc = -1;
158f856f099SNavdeep Parhar 
159f856f099SNavdeep Parhar 	data_hdr_size = CUDBG_MAX_ENTITY * sizeof(struct cudbg_entity_hdr) +
160f856f099SNavdeep Parhar 			sizeof(struct cudbg_hdr);
161f856f099SNavdeep Parhar 
162f856f099SNavdeep Parhar 	flash_data_offset = (FLASH_CUDBG_NSECS *
163f856f099SNavdeep Parhar 			     (sizeof(struct cudbg_flash_hdr) +
164f856f099SNavdeep Parhar 			      data_hdr_size)) +
165f856f099SNavdeep Parhar 			    (cur_entity_data_offset - data_hdr_size);
166f856f099SNavdeep Parhar 
167f856f099SNavdeep Parhar 	if (flash_data_offset > CUDBG_FLASH_SIZE) {
168f856f099SNavdeep Parhar 		update_skip_size(sec_info, cur_entity_size);
169f856f099SNavdeep Parhar 		if (cudbg_init->verbose)
170f856f099SNavdeep Parhar 			cudbg_init->print("Large entity skipping...\n");
171f856f099SNavdeep Parhar 		return rc;
172f856f099SNavdeep Parhar 	}
173f856f099SNavdeep Parhar 
174f856f099SNavdeep Parhar 	remain_flash_size = CUDBG_FLASH_SIZE - flash_data_offset;
175f856f099SNavdeep Parhar 
176f856f099SNavdeep Parhar 	if (cur_entity_size > remain_flash_size) {
177f856f099SNavdeep Parhar 		update_skip_size(sec_info, cur_entity_size);
178f856f099SNavdeep Parhar 		if (cudbg_init->verbose)
179f856f099SNavdeep Parhar 			cudbg_init->print("Large entity skipping...\n");
180f856f099SNavdeep Parhar 	} else {
181f856f099SNavdeep Parhar 		timestamp = 0;
182f856f099SNavdeep Parhar 
183f856f099SNavdeep Parhar 		cur_entity_hdr_offset +=
184f856f099SNavdeep Parhar 			(sizeof(struct cudbg_entity_hdr) *
185f856f099SNavdeep Parhar 			(entity_nu - 1));
186f856f099SNavdeep Parhar 
187f856f099SNavdeep Parhar 		rc = cudbg_write_flash(handle, timestamp, dbg_buff,
188f856f099SNavdeep Parhar 				       cur_entity_data_offset,
189f856f099SNavdeep Parhar 				       cur_entity_hdr_offset,
190f856f099SNavdeep Parhar 				       cur_entity_size,
191f856f099SNavdeep Parhar 				       ext_size);
192f856f099SNavdeep Parhar 		if (rc == CUDBG_STATUS_FLASH_FULL && cudbg_init->verbose)
193f856f099SNavdeep Parhar 			cudbg_init->print("\n\tFLASH is full... "
194f856f099SNavdeep Parhar 				"can not write in flash more\n\n");
195f856f099SNavdeep Parhar 	}
196f856f099SNavdeep Parhar 
197f856f099SNavdeep Parhar 	return rc;
198f856f099SNavdeep Parhar }
199f856f099SNavdeep Parhar 
cudbg_collect(void * handle,void * outbuf,u32 * outbuf_size)200f856f099SNavdeep Parhar int cudbg_collect(void *handle, void *outbuf, u32 *outbuf_size)
201f856f099SNavdeep Parhar {
202f856f099SNavdeep Parhar 	struct cudbg_entity_hdr *entity_hdr = NULL;
203f856f099SNavdeep Parhar 	struct cudbg_entity_hdr *ext_entity_hdr = NULL;
204f856f099SNavdeep Parhar 	struct cudbg_hdr *cudbg_hdr;
205f856f099SNavdeep Parhar 	struct cudbg_buffer dbg_buff;
206f856f099SNavdeep Parhar 	struct cudbg_error cudbg_err = {0};
207f856f099SNavdeep Parhar 	int large_entity_code;
208f856f099SNavdeep Parhar 
209f856f099SNavdeep Parhar 	u8 *dbg_bitmap = ((struct cudbg_private *)handle)->dbg_init.dbg_bitmap;
210f856f099SNavdeep Parhar 	struct cudbg_init *cudbg_init =
211f856f099SNavdeep Parhar 		&(((struct cudbg_private *)handle)->dbg_init);
212f856f099SNavdeep Parhar 	struct adapter *padap = cudbg_init->adap;
213f856f099SNavdeep Parhar 	u32 total_size, remaining_buf_size;
214f856f099SNavdeep Parhar 	u32 ext_size = 0;
215f856f099SNavdeep Parhar 	int index, bit, i, rc = -1;
216f856f099SNavdeep Parhar 	int all;
217f856f099SNavdeep Parhar 	bool flag_ext = 0;
218f856f099SNavdeep Parhar 
219f856f099SNavdeep Parhar 	reset_skip_entity();
220f856f099SNavdeep Parhar 
221f856f099SNavdeep Parhar 	dbg_buff.data = outbuf;
222f856f099SNavdeep Parhar 	dbg_buff.size = *outbuf_size;
223f856f099SNavdeep Parhar 	dbg_buff.offset = 0;
224f856f099SNavdeep Parhar 
225f856f099SNavdeep Parhar 	cudbg_hdr = (struct cudbg_hdr *)dbg_buff.data;
226f856f099SNavdeep Parhar 	cudbg_hdr->signature = CUDBG_SIGNATURE;
227f856f099SNavdeep Parhar 	cudbg_hdr->hdr_len = sizeof(struct cudbg_hdr);
228f856f099SNavdeep Parhar 	cudbg_hdr->major_ver = CUDBG_MAJOR_VERSION;
229f856f099SNavdeep Parhar 	cudbg_hdr->minor_ver = CUDBG_MINOR_VERSION;
230f856f099SNavdeep Parhar 	cudbg_hdr->max_entities = CUDBG_MAX_ENTITY;
231f856f099SNavdeep Parhar 	cudbg_hdr->chip_ver = padap->params.chipid;
232f856f099SNavdeep Parhar 
233f856f099SNavdeep Parhar 	if (cudbg_hdr->data_len)
234f856f099SNavdeep Parhar 		flag_ext = 1;
235f856f099SNavdeep Parhar 
236f856f099SNavdeep Parhar 	if (cudbg_init->use_flash) {
237f856f099SNavdeep Parhar #ifndef notyet
238f856f099SNavdeep Parhar 		rc = t4_get_flash_params(padap);
239f856f099SNavdeep Parhar 		if (rc) {
240f856f099SNavdeep Parhar 			if (cudbg_init->verbose)
241f856f099SNavdeep Parhar 				cudbg_init->print("\nGet flash params failed.\n\n");
242f856f099SNavdeep Parhar 			cudbg_init->use_flash = 0;
243f856f099SNavdeep Parhar 		}
244f856f099SNavdeep Parhar #endif
245f856f099SNavdeep Parhar 
246f856f099SNavdeep Parhar #ifdef notyet
247f856f099SNavdeep Parhar 		/* Timestamp is mandatory. If it is not passed then disable
248f856f099SNavdeep Parhar 		 * flash support
249f856f099SNavdeep Parhar 		 */
250f856f099SNavdeep Parhar 		if (!cudbg_init->dbg_params[CUDBG_TIMESTAMP_PARAM].u.time) {
251f856f099SNavdeep Parhar 			if (cudbg_init->verbose)
252f856f099SNavdeep Parhar 				cudbg_init->print("\nTimestamp param missing,"
253f856f099SNavdeep Parhar 					  "so ignoring flash write request\n\n");
254f856f099SNavdeep Parhar 			cudbg_init->use_flash = 0;
255f856f099SNavdeep Parhar 		}
256f856f099SNavdeep Parhar #endif
257f856f099SNavdeep Parhar 	}
258f856f099SNavdeep Parhar 
259f856f099SNavdeep Parhar 	if (sizeof(struct cudbg_entity_hdr) * CUDBG_MAX_ENTITY >
260f856f099SNavdeep Parhar 	    dbg_buff.size) {
261f856f099SNavdeep Parhar 		rc = CUDBG_STATUS_SMALL_BUFF;
262f856f099SNavdeep Parhar 		total_size = cudbg_hdr->hdr_len;
263f856f099SNavdeep Parhar 		goto err;
264f856f099SNavdeep Parhar 	}
265f856f099SNavdeep Parhar 
266f856f099SNavdeep Parhar 	/* If ext flag is set then move the offset to the end of the buf
267f856f099SNavdeep Parhar 	 * so that we can add ext entities
268f856f099SNavdeep Parhar 	 */
269f856f099SNavdeep Parhar 	if (flag_ext) {
270f856f099SNavdeep Parhar 		ext_entity_hdr = (struct cudbg_entity_hdr *)
271f856f099SNavdeep Parhar 			      ((char *)outbuf + cudbg_hdr->hdr_len +
272f856f099SNavdeep Parhar 			      (sizeof(struct cudbg_entity_hdr) *
273f856f099SNavdeep Parhar 			      (CUDBG_EXT_ENTITY - 1)));
274f856f099SNavdeep Parhar 		ext_entity_hdr->start_offset = cudbg_hdr->data_len;
275f856f099SNavdeep Parhar 		ext_entity_hdr->entity_type = CUDBG_EXT_ENTITY;
276f856f099SNavdeep Parhar 		ext_entity_hdr->size = 0;
277f856f099SNavdeep Parhar 		dbg_buff.offset = cudbg_hdr->data_len;
278f856f099SNavdeep Parhar 	} else {
279f856f099SNavdeep Parhar 		dbg_buff.offset += cudbg_hdr->hdr_len; /* move 24 bytes*/
280f856f099SNavdeep Parhar 		dbg_buff.offset += CUDBG_MAX_ENTITY *
281f856f099SNavdeep Parhar 					sizeof(struct cudbg_entity_hdr);
282f856f099SNavdeep Parhar 	}
283f856f099SNavdeep Parhar 
284f856f099SNavdeep Parhar 	total_size = dbg_buff.offset;
285f856f099SNavdeep Parhar 	all = dbg_bitmap[0] & (1 << CUDBG_ALL);
286f856f099SNavdeep Parhar 
287f856f099SNavdeep Parhar 	/*sort(large_entity_list);*/
288f856f099SNavdeep Parhar 
289f856f099SNavdeep Parhar 	for (i = 1; i < CUDBG_MAX_ENTITY; i++) {
290f856f099SNavdeep Parhar 		index = i / 8;
291f856f099SNavdeep Parhar 		bit = i % 8;
292f856f099SNavdeep Parhar 
293f856f099SNavdeep Parhar 		if (entity_list[i].bit == CUDBG_EXT_ENTITY)
294f856f099SNavdeep Parhar 			continue;
295f856f099SNavdeep Parhar 
296f856f099SNavdeep Parhar 		if (all || (dbg_bitmap[index] & (1 << bit))) {
297f856f099SNavdeep Parhar 
298f856f099SNavdeep Parhar 			if (!flag_ext) {
299f856f099SNavdeep Parhar 				rc = get_entity_hdr(outbuf, i, dbg_buff.size,
300f856f099SNavdeep Parhar 						    &entity_hdr);
301f856f099SNavdeep Parhar 				if (rc)
302f856f099SNavdeep Parhar 					cudbg_hdr->hdr_flags = rc;
303f856f099SNavdeep Parhar 			} else {
304f856f099SNavdeep Parhar 				rc = get_next_ext_entity_hdr(outbuf, &ext_size,
305f856f099SNavdeep Parhar 							     &dbg_buff,
306f856f099SNavdeep Parhar 							     &entity_hdr);
307f856f099SNavdeep Parhar 				if (rc)
308f856f099SNavdeep Parhar 					goto err;
309f856f099SNavdeep Parhar 
310f856f099SNavdeep Parhar 				/* move the offset after the ext header */
311f856f099SNavdeep Parhar 				dbg_buff.offset +=
312f856f099SNavdeep Parhar 					sizeof(struct cudbg_entity_hdr);
313f856f099SNavdeep Parhar 			}
314f856f099SNavdeep Parhar 
315f856f099SNavdeep Parhar 			entity_hdr->entity_type = i;
316f856f099SNavdeep Parhar 			entity_hdr->start_offset = dbg_buff.offset;
317f856f099SNavdeep Parhar 			/* process each entity by calling process_entity fp */
318f856f099SNavdeep Parhar 			remaining_buf_size = dbg_buff.size - dbg_buff.offset;
319f856f099SNavdeep Parhar 
320f856f099SNavdeep Parhar 			if ((remaining_buf_size <= BUFFER_WARN_LIMIT) &&
321f856f099SNavdeep Parhar 			    is_large_entity(i)) {
322f856f099SNavdeep Parhar 				if (cudbg_init->verbose)
323f856f099SNavdeep Parhar 					cudbg_init->print("Skipping %s\n",
324f856f099SNavdeep Parhar 					    entity_list[i].name);
325f856f099SNavdeep Parhar 				skip_entity(i);
326f856f099SNavdeep Parhar 				continue;
327f856f099SNavdeep Parhar 			} else {
328f856f099SNavdeep Parhar 
329f856f099SNavdeep Parhar 				/* If fw_attach is 0, then skip entities which
330f856f099SNavdeep Parhar 				 * communicates with firmware
331f856f099SNavdeep Parhar 				 */
332f856f099SNavdeep Parhar 
333f856f099SNavdeep Parhar 				if (!is_fw_attached(cudbg_init) &&
334f856f099SNavdeep Parhar 				    (entity_list[i].flag &
335f856f099SNavdeep Parhar 				    (1 << ENTITY_FLAG_FW_NO_ATTACH))) {
336f856f099SNavdeep Parhar 					if (cudbg_init->verbose)
337f856f099SNavdeep Parhar 						cudbg_init->print("Skipping %s entity,"\
338f856f099SNavdeep Parhar 							  "because fw_attach "\
339f856f099SNavdeep Parhar 							  "is 0\n",
340f856f099SNavdeep Parhar 							  entity_list[i].name);
341f856f099SNavdeep Parhar 					continue;
342f856f099SNavdeep Parhar 				}
343f856f099SNavdeep Parhar 
344f856f099SNavdeep Parhar 				if (cudbg_init->verbose)
345f856f099SNavdeep Parhar 					cudbg_init->print("collecting debug entity: "\
346f856f099SNavdeep Parhar 						  "%s\n", entity_list[i].name);
347f856f099SNavdeep Parhar 				memset(&cudbg_err, 0,
348f856f099SNavdeep Parhar 				       sizeof(struct cudbg_error));
349f856f099SNavdeep Parhar 				rc = process_entity[i-1](cudbg_init, &dbg_buff,
350f856f099SNavdeep Parhar 							 &cudbg_err);
351f856f099SNavdeep Parhar 			}
352f856f099SNavdeep Parhar 
353f856f099SNavdeep Parhar 			if (rc) {
354f856f099SNavdeep Parhar 				entity_hdr->size = 0;
355f856f099SNavdeep Parhar 				dbg_buff.offset = entity_hdr->start_offset;
356f856f099SNavdeep Parhar 			} else
357f856f099SNavdeep Parhar 				align_debug_buffer(&dbg_buff, entity_hdr);
358f856f099SNavdeep Parhar 
359f856f099SNavdeep Parhar 			if (cudbg_err.sys_err)
360f856f099SNavdeep Parhar 				rc = CUDBG_SYSTEM_ERROR;
361f856f099SNavdeep Parhar 
362f856f099SNavdeep Parhar 			entity_hdr->hdr_flags =  rc;
363f856f099SNavdeep Parhar 			entity_hdr->sys_err = cudbg_err.sys_err;
364f856f099SNavdeep Parhar 			entity_hdr->sys_warn =	cudbg_err.sys_warn;
365f856f099SNavdeep Parhar 
366f856f099SNavdeep Parhar 			/* We don't want to include ext entity size in global
367f856f099SNavdeep Parhar 			 * header
368f856f099SNavdeep Parhar 			 */
369f856f099SNavdeep Parhar 			if (!flag_ext)
370f856f099SNavdeep Parhar 				total_size += entity_hdr->size;
371f856f099SNavdeep Parhar 
372f856f099SNavdeep Parhar 			cudbg_hdr->data_len = total_size;
373f856f099SNavdeep Parhar 			*outbuf_size = total_size;
374f856f099SNavdeep Parhar 
375f856f099SNavdeep Parhar 			/* consider the size of the ext entity header and data
376f856f099SNavdeep Parhar 			 * also
377f856f099SNavdeep Parhar 			 */
378f856f099SNavdeep Parhar 			if (flag_ext) {
379f856f099SNavdeep Parhar 				ext_size += (sizeof(struct cudbg_entity_hdr) +
380f856f099SNavdeep Parhar 					     entity_hdr->size);
381f856f099SNavdeep Parhar 				entity_hdr->start_offset -= cudbg_hdr->data_len;
382f856f099SNavdeep Parhar 				ext_entity_hdr->size = ext_size;
383f856f099SNavdeep Parhar 				entity_hdr->next_ext_offset = ext_size;
384f856f099SNavdeep Parhar 				entity_hdr->flag |= CUDBG_EXT_DATA_VALID;
385f856f099SNavdeep Parhar 			}
386f856f099SNavdeep Parhar 
387f856f099SNavdeep Parhar 			if (cudbg_init->use_flash) {
388f856f099SNavdeep Parhar 				if (flag_ext) {
389f856f099SNavdeep Parhar 					wr_entity_to_flash(handle,
390f856f099SNavdeep Parhar 							   &dbg_buff,
391f856f099SNavdeep Parhar 							   ext_entity_hdr->
392f856f099SNavdeep Parhar 							   start_offset,
393f856f099SNavdeep Parhar 							   entity_hdr->
394f856f099SNavdeep Parhar 							   size,
395f856f099SNavdeep Parhar 							   CUDBG_EXT_ENTITY,
396f856f099SNavdeep Parhar 							   ext_size);
397f856f099SNavdeep Parhar 				}
398f856f099SNavdeep Parhar 				else
399f856f099SNavdeep Parhar 					wr_entity_to_flash(handle,
400f856f099SNavdeep Parhar 							   &dbg_buff,
401f856f099SNavdeep Parhar 							   entity_hdr->\
402f856f099SNavdeep Parhar 							   start_offset,
403f856f099SNavdeep Parhar 							   entity_hdr->size,
404f856f099SNavdeep Parhar 							   i, ext_size);
405f856f099SNavdeep Parhar 			}
406f856f099SNavdeep Parhar 		}
407f856f099SNavdeep Parhar 	}
408f856f099SNavdeep Parhar 
409f856f099SNavdeep Parhar 	for (i = 0; i < sizeof(large_entity_list) / sizeof(struct large_entity);
410f856f099SNavdeep Parhar 	     i++) {
411f856f099SNavdeep Parhar 		large_entity_code = large_entity_list[i].entity_code;
412f856f099SNavdeep Parhar 		if (large_entity_list[i].skip_flag) {
413f856f099SNavdeep Parhar 			if (!flag_ext) {
414f856f099SNavdeep Parhar 				rc = get_entity_hdr(outbuf, large_entity_code,
415f856f099SNavdeep Parhar 						    dbg_buff.size, &entity_hdr);
416f856f099SNavdeep Parhar 				if (rc)
417f856f099SNavdeep Parhar 					cudbg_hdr->hdr_flags = rc;
418f856f099SNavdeep Parhar 			} else {
419f856f099SNavdeep Parhar 				rc = get_next_ext_entity_hdr(outbuf, &ext_size,
420f856f099SNavdeep Parhar 							     &dbg_buff,
421f856f099SNavdeep Parhar 							     &entity_hdr);
422f856f099SNavdeep Parhar 				if (rc)
423f856f099SNavdeep Parhar 					goto err;
424f856f099SNavdeep Parhar 
425f856f099SNavdeep Parhar 				dbg_buff.offset +=
426f856f099SNavdeep Parhar 					sizeof(struct cudbg_entity_hdr);
427f856f099SNavdeep Parhar 			}
428f856f099SNavdeep Parhar 
429f856f099SNavdeep Parhar 			/* If fw_attach is 0, then skip entities which
430f856f099SNavdeep Parhar 			 * communicates with firmware
431f856f099SNavdeep Parhar 			 */
432f856f099SNavdeep Parhar 			if (!is_fw_attached(cudbg_init) &&
433f856f099SNavdeep Parhar 			    (entity_list[large_entity_code].flag &
434f856f099SNavdeep Parhar 			    (1 << ENTITY_FLAG_FW_NO_ATTACH))) {
435f856f099SNavdeep Parhar 				if (cudbg_init->verbose)
436f856f099SNavdeep Parhar 					cudbg_init->print("Skipping %s entity,"\
437f856f099SNavdeep Parhar 						  "because fw_attach "\
438f856f099SNavdeep Parhar 						  "is 0\n",
439f856f099SNavdeep Parhar 						  entity_list[large_entity_code]
440f856f099SNavdeep Parhar 						  .name);
441f856f099SNavdeep Parhar 				continue;
442f856f099SNavdeep Parhar 			}
443f856f099SNavdeep Parhar 
444f856f099SNavdeep Parhar 			entity_hdr->entity_type = large_entity_code;
445f856f099SNavdeep Parhar 			entity_hdr->start_offset = dbg_buff.offset;
446f856f099SNavdeep Parhar 			if (cudbg_init->verbose)
447f856f099SNavdeep Parhar 				cudbg_init->print("Re-trying debug entity: %s\n",
448f856f099SNavdeep Parhar 					  entity_list[large_entity_code].name);
449f856f099SNavdeep Parhar 
450f856f099SNavdeep Parhar 			memset(&cudbg_err, 0, sizeof(struct cudbg_error));
451f856f099SNavdeep Parhar 			rc = process_entity[large_entity_code - 1](cudbg_init,
452f856f099SNavdeep Parhar 								   &dbg_buff,
453f856f099SNavdeep Parhar 								   &cudbg_err);
454f856f099SNavdeep Parhar 			if (rc) {
455f856f099SNavdeep Parhar 				entity_hdr->size = 0;
456f856f099SNavdeep Parhar 				dbg_buff.offset = entity_hdr->start_offset;
457f856f099SNavdeep Parhar 			} else
458f856f099SNavdeep Parhar 				align_debug_buffer(&dbg_buff, entity_hdr);
459f856f099SNavdeep Parhar 
460f856f099SNavdeep Parhar 			if (cudbg_err.sys_err)
461f856f099SNavdeep Parhar 				rc = CUDBG_SYSTEM_ERROR;
462f856f099SNavdeep Parhar 
463f856f099SNavdeep Parhar 			entity_hdr->hdr_flags = rc;
464f856f099SNavdeep Parhar 			entity_hdr->sys_err = cudbg_err.sys_err;
465f856f099SNavdeep Parhar 			entity_hdr->sys_warn =	cudbg_err.sys_warn;
466f856f099SNavdeep Parhar 
467f856f099SNavdeep Parhar 			/* We don't want to include ext entity size in global
468f856f099SNavdeep Parhar 			 * header
469f856f099SNavdeep Parhar 			 */
470f856f099SNavdeep Parhar 			if (!flag_ext)
471f856f099SNavdeep Parhar 				total_size += entity_hdr->size;
472f856f099SNavdeep Parhar 
473f856f099SNavdeep Parhar 			cudbg_hdr->data_len = total_size;
474f856f099SNavdeep Parhar 			*outbuf_size = total_size;
475f856f099SNavdeep Parhar 
476f856f099SNavdeep Parhar 			/* consider the size of the ext entity header and
477f856f099SNavdeep Parhar 			 * data also
478f856f099SNavdeep Parhar 			 */
479f856f099SNavdeep Parhar 			if (flag_ext) {
480f856f099SNavdeep Parhar 				ext_size += (sizeof(struct cudbg_entity_hdr) +
481f856f099SNavdeep Parhar 						   entity_hdr->size);
482f856f099SNavdeep Parhar 				entity_hdr->start_offset -=
483f856f099SNavdeep Parhar 							cudbg_hdr->data_len;
484f856f099SNavdeep Parhar 				ext_entity_hdr->size = ext_size;
485f856f099SNavdeep Parhar 				entity_hdr->flag |= CUDBG_EXT_DATA_VALID;
486f856f099SNavdeep Parhar 			}
487f856f099SNavdeep Parhar 
488f856f099SNavdeep Parhar 			if (cudbg_init->use_flash) {
489f856f099SNavdeep Parhar 				if (flag_ext)
490f856f099SNavdeep Parhar 					wr_entity_to_flash(handle,
491f856f099SNavdeep Parhar 							   &dbg_buff,
492f856f099SNavdeep Parhar 							   ext_entity_hdr->
493f856f099SNavdeep Parhar 							   start_offset,
494f856f099SNavdeep Parhar 							   entity_hdr->size,
495f856f099SNavdeep Parhar 							   CUDBG_EXT_ENTITY,
496f856f099SNavdeep Parhar 							   ext_size);
497f856f099SNavdeep Parhar 				else
498f856f099SNavdeep Parhar 					wr_entity_to_flash(handle,
499f856f099SNavdeep Parhar 							   &dbg_buff,
500f856f099SNavdeep Parhar 							   entity_hdr->
501f856f099SNavdeep Parhar 							   start_offset,
502f856f099SNavdeep Parhar 							   entity_hdr->
503f856f099SNavdeep Parhar 							   size,
504f856f099SNavdeep Parhar 							   large_entity_list[i].
505f856f099SNavdeep Parhar 							   entity_code,
506f856f099SNavdeep Parhar 							   ext_size);
507f856f099SNavdeep Parhar 			}
508f856f099SNavdeep Parhar 		}
509f856f099SNavdeep Parhar 	}
510f856f099SNavdeep Parhar 
511f856f099SNavdeep Parhar 	cudbg_hdr->data_len = total_size;
512f856f099SNavdeep Parhar 	*outbuf_size = total_size;
513f856f099SNavdeep Parhar 
514f856f099SNavdeep Parhar 	if (flag_ext)
515f856f099SNavdeep Parhar 		*outbuf_size += ext_size;
516f856f099SNavdeep Parhar 
517f856f099SNavdeep Parhar 	return 0;
518f856f099SNavdeep Parhar err:
519f856f099SNavdeep Parhar 	return rc;
520f856f099SNavdeep Parhar }
521f856f099SNavdeep Parhar 
reset_skip_entity(void)522f856f099SNavdeep Parhar void reset_skip_entity(void)
523f856f099SNavdeep Parhar {
524f856f099SNavdeep Parhar 	int i;
525f856f099SNavdeep Parhar 
526f856f099SNavdeep Parhar 	for (i = 0; i < ARRAY_SIZE(large_entity_list); i++)
527f856f099SNavdeep Parhar 		large_entity_list[i].skip_flag = 0;
528f856f099SNavdeep Parhar }
529f856f099SNavdeep Parhar 
skip_entity(int entity_code)530f856f099SNavdeep Parhar void skip_entity(int entity_code)
531f856f099SNavdeep Parhar {
532f856f099SNavdeep Parhar 	int i;
533f856f099SNavdeep Parhar 	for (i = 0; i < sizeof(large_entity_list) / sizeof(struct large_entity);
534f856f099SNavdeep Parhar 	     i++) {
535f856f099SNavdeep Parhar 		if (large_entity_list[i].entity_code == entity_code)
536f856f099SNavdeep Parhar 			large_entity_list[i].skip_flag = 1;
537f856f099SNavdeep Parhar 	}
538f856f099SNavdeep Parhar }
539f856f099SNavdeep Parhar 
is_large_entity(int entity_code)540f856f099SNavdeep Parhar int is_large_entity(int entity_code)
541f856f099SNavdeep Parhar {
542f856f099SNavdeep Parhar 	int i;
543f856f099SNavdeep Parhar 
544f856f099SNavdeep Parhar 	for (i = 0; i < sizeof(large_entity_list) / sizeof(struct large_entity);
545f856f099SNavdeep Parhar 	     i++) {
546f856f099SNavdeep Parhar 		if (large_entity_list[i].entity_code == entity_code)
547f856f099SNavdeep Parhar 			return 1;
548f856f099SNavdeep Parhar 	}
549f856f099SNavdeep Parhar 	return 0;
550f856f099SNavdeep Parhar }
551f856f099SNavdeep Parhar 
get_entity_hdr(void * outbuf,int i,u32 size,struct cudbg_entity_hdr ** entity_hdr)552f856f099SNavdeep Parhar int get_entity_hdr(void *outbuf, int i, u32 size,
553f856f099SNavdeep Parhar 		   struct cudbg_entity_hdr **entity_hdr)
554f856f099SNavdeep Parhar {
555f856f099SNavdeep Parhar 	int rc = 0;
556f856f099SNavdeep Parhar 	struct cudbg_hdr *cudbg_hdr = (struct cudbg_hdr *)outbuf;
557f856f099SNavdeep Parhar 
558f856f099SNavdeep Parhar 	if (cudbg_hdr->hdr_len + (sizeof(struct cudbg_entity_hdr)*i) > size)
559f856f099SNavdeep Parhar 		return CUDBG_STATUS_SMALL_BUFF;
560f856f099SNavdeep Parhar 
561f856f099SNavdeep Parhar 	*entity_hdr = (struct cudbg_entity_hdr *)
562f856f099SNavdeep Parhar 		      ((char *)outbuf+cudbg_hdr->hdr_len +
563f856f099SNavdeep Parhar 		       (sizeof(struct cudbg_entity_hdr)*(i-1)));
564f856f099SNavdeep Parhar 	return rc;
565f856f099SNavdeep Parhar }
566f856f099SNavdeep Parhar 
collect_rss(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)567f856f099SNavdeep Parhar static int collect_rss(struct cudbg_init *pdbg_init,
568f856f099SNavdeep Parhar 		       struct cudbg_buffer *dbg_buff,
569f856f099SNavdeep Parhar 		       struct cudbg_error *cudbg_err)
570f856f099SNavdeep Parhar {
571f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
572f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
573f856f099SNavdeep Parhar 	u32 size;
574f856f099SNavdeep Parhar 	int rc = 0;
575f856f099SNavdeep Parhar 
576a2e160c5SNavdeep Parhar 	size = padap->chip_params->rss_nentries * sizeof(u16);
577f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, size, &scratch_buff);
578f856f099SNavdeep Parhar 	if (rc)
579f856f099SNavdeep Parhar 		goto err;
580f856f099SNavdeep Parhar 
581f856f099SNavdeep Parhar 	rc = t4_read_rss(padap, (u16 *)scratch_buff.data);
582f856f099SNavdeep Parhar 	if (rc) {
583f856f099SNavdeep Parhar 		if (pdbg_init->verbose)
584f856f099SNavdeep Parhar 			pdbg_init->print("%s(), t4_read_rss failed!, rc: %d\n",
585f856f099SNavdeep Parhar 				 __func__, rc);
586f856f099SNavdeep Parhar 		cudbg_err->sys_err = rc;
587f856f099SNavdeep Parhar 		goto err1;
588f856f099SNavdeep Parhar 	}
589f856f099SNavdeep Parhar 
590f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
591f856f099SNavdeep Parhar 	if (rc)
592f856f099SNavdeep Parhar 		goto err1;
593f856f099SNavdeep Parhar 
594f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
595f856f099SNavdeep Parhar 
596f856f099SNavdeep Parhar err1:
597f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
598f856f099SNavdeep Parhar err:
599f856f099SNavdeep Parhar 	return rc;
600f856f099SNavdeep Parhar }
601f856f099SNavdeep Parhar 
collect_sw_state(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)602f856f099SNavdeep Parhar static int collect_sw_state(struct cudbg_init *pdbg_init,
603f856f099SNavdeep Parhar 			    struct cudbg_buffer *dbg_buff,
604f856f099SNavdeep Parhar 			    struct cudbg_error *cudbg_err)
605f856f099SNavdeep Parhar {
606f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
607f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
608f856f099SNavdeep Parhar 	struct sw_state *swstate;
609f856f099SNavdeep Parhar 	u32 size;
610f856f099SNavdeep Parhar 	int rc = 0;
611f856f099SNavdeep Parhar 
612f856f099SNavdeep Parhar 	size = sizeof(struct sw_state);
613f856f099SNavdeep Parhar 
614f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, size, &scratch_buff);
615f856f099SNavdeep Parhar 	if (rc)
616f856f099SNavdeep Parhar 		goto err;
617f856f099SNavdeep Parhar 
618f856f099SNavdeep Parhar 	swstate = (struct sw_state *) scratch_buff.data;
619f856f099SNavdeep Parhar 
620f856f099SNavdeep Parhar 	swstate->fw_state = t4_read_reg(padap, A_PCIE_FW);
621f856f099SNavdeep Parhar 	snprintf(swstate->caller_string, sizeof(swstate->caller_string), "%s",
622f856f099SNavdeep Parhar 	    "FreeBSD");
623f856f099SNavdeep Parhar 	swstate->os_type = 0;
624f856f099SNavdeep Parhar 
625f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
626f856f099SNavdeep Parhar 	if (rc)
627f856f099SNavdeep Parhar 		goto err1;
628f856f099SNavdeep Parhar 
629f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
630f856f099SNavdeep Parhar 
631f856f099SNavdeep Parhar err1:
632f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
633f856f099SNavdeep Parhar err:
634f856f099SNavdeep Parhar 	return rc;
635f856f099SNavdeep Parhar }
636f856f099SNavdeep Parhar 
collect_ddp_stats(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)637f856f099SNavdeep Parhar static int collect_ddp_stats(struct cudbg_init *pdbg_init,
638f856f099SNavdeep Parhar 			     struct cudbg_buffer *dbg_buff,
639f856f099SNavdeep Parhar 			     struct cudbg_error *cudbg_err)
640f856f099SNavdeep Parhar {
641f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
642f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
643f856f099SNavdeep Parhar 	struct tp_usm_stats  *tp_usm_stats_buff;
644f856f099SNavdeep Parhar 	u32 size;
645f856f099SNavdeep Parhar 	int rc = 0;
646f856f099SNavdeep Parhar 
647f856f099SNavdeep Parhar 	size = sizeof(struct tp_usm_stats);
648f856f099SNavdeep Parhar 
649f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, size, &scratch_buff);
650f856f099SNavdeep Parhar 	if (rc)
651f856f099SNavdeep Parhar 		goto err;
652f856f099SNavdeep Parhar 
653f856f099SNavdeep Parhar 	tp_usm_stats_buff = (struct tp_usm_stats *) scratch_buff.data;
654f856f099SNavdeep Parhar 
655f856f099SNavdeep Parhar 	/* spin_lock(&padap->stats_lock);	TODO*/
656f856f099SNavdeep Parhar 	t4_get_usm_stats(padap, tp_usm_stats_buff, 1);
657f856f099SNavdeep Parhar 	/* spin_unlock(&padap->stats_lock);	TODO*/
658f856f099SNavdeep Parhar 
659f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
660f856f099SNavdeep Parhar 	if (rc)
661f856f099SNavdeep Parhar 		goto err1;
662f856f099SNavdeep Parhar 
663f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
664f856f099SNavdeep Parhar 
665f856f099SNavdeep Parhar err1:
666f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
667f856f099SNavdeep Parhar err:
668f856f099SNavdeep Parhar 	return rc;
669f856f099SNavdeep Parhar }
670f856f099SNavdeep Parhar 
collect_ulptx_la(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)671f856f099SNavdeep Parhar static int collect_ulptx_la(struct cudbg_init *pdbg_init,
672f856f099SNavdeep Parhar 			    struct cudbg_buffer *dbg_buff,
673f856f099SNavdeep Parhar 			    struct cudbg_error *cudbg_err)
674f856f099SNavdeep Parhar {
675f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
676f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
677f856f099SNavdeep Parhar 	struct struct_ulptx_la *ulptx_la_buff;
678f856f099SNavdeep Parhar 	u32 size, i, j;
679f856f099SNavdeep Parhar 	int rc = 0;
680f856f099SNavdeep Parhar 
681f856f099SNavdeep Parhar 	size = sizeof(struct struct_ulptx_la);
682f856f099SNavdeep Parhar 
683f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, size, &scratch_buff);
684f856f099SNavdeep Parhar 	if (rc)
685f856f099SNavdeep Parhar 		goto err;
686f856f099SNavdeep Parhar 
687f856f099SNavdeep Parhar 	ulptx_la_buff = (struct struct_ulptx_la *) scratch_buff.data;
688f856f099SNavdeep Parhar 
689f856f099SNavdeep Parhar 	for (i = 0; i < CUDBG_NUM_ULPTX; i++) {
690f856f099SNavdeep Parhar 		ulptx_la_buff->rdptr[i] = t4_read_reg(padap,
691f856f099SNavdeep Parhar 						      A_ULP_TX_LA_RDPTR_0 +
692f856f099SNavdeep Parhar 						      0x10 * i);
693f856f099SNavdeep Parhar 		ulptx_la_buff->wrptr[i] = t4_read_reg(padap,
694f856f099SNavdeep Parhar 						      A_ULP_TX_LA_WRPTR_0 +
695f856f099SNavdeep Parhar 						      0x10 * i);
696f856f099SNavdeep Parhar 		ulptx_la_buff->rddata[i] = t4_read_reg(padap,
697f856f099SNavdeep Parhar 						       A_ULP_TX_LA_RDDATA_0 +
698f856f099SNavdeep Parhar 						       0x10 * i);
699f856f099SNavdeep Parhar 		for (j = 0; j < CUDBG_NUM_ULPTX_READ; j++) {
700f856f099SNavdeep Parhar 			ulptx_la_buff->rd_data[i][j] =
701f856f099SNavdeep Parhar 				t4_read_reg(padap,
702f856f099SNavdeep Parhar 					    A_ULP_TX_LA_RDDATA_0 + 0x10 * i);
703f856f099SNavdeep Parhar 		}
704f856f099SNavdeep Parhar 	}
705f856f099SNavdeep Parhar 
706f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
707f856f099SNavdeep Parhar 	if (rc)
708f856f099SNavdeep Parhar 		goto err1;
709f856f099SNavdeep Parhar 
710f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
711f856f099SNavdeep Parhar 
712f856f099SNavdeep Parhar err1:
713f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
714f856f099SNavdeep Parhar err:
715f856f099SNavdeep Parhar 	return rc;
716f856f099SNavdeep Parhar 
717f856f099SNavdeep Parhar }
718f856f099SNavdeep Parhar 
collect_ulprx_la(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)719f856f099SNavdeep Parhar static int collect_ulprx_la(struct cudbg_init *pdbg_init,
720f856f099SNavdeep Parhar 			    struct cudbg_buffer *dbg_buff,
721f856f099SNavdeep Parhar 			    struct cudbg_error *cudbg_err)
722f856f099SNavdeep Parhar {
723f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
724f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
725f856f099SNavdeep Parhar 	struct struct_ulprx_la *ulprx_la_buff;
726f856f099SNavdeep Parhar 	u32 size;
727f856f099SNavdeep Parhar 	int rc = 0;
728f856f099SNavdeep Parhar 
729f856f099SNavdeep Parhar 	size = sizeof(struct struct_ulprx_la);
730f856f099SNavdeep Parhar 
731f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, size, &scratch_buff);
732f856f099SNavdeep Parhar 	if (rc)
733f856f099SNavdeep Parhar 		goto err;
734f856f099SNavdeep Parhar 
735f856f099SNavdeep Parhar 	ulprx_la_buff = (struct struct_ulprx_la *) scratch_buff.data;
736f856f099SNavdeep Parhar 	t4_ulprx_read_la(padap, (u32 *)ulprx_la_buff->data);
737f856f099SNavdeep Parhar 	ulprx_la_buff->size = ULPRX_LA_SIZE;
738f856f099SNavdeep Parhar 
739f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
740f856f099SNavdeep Parhar 	if (rc)
741f856f099SNavdeep Parhar 		goto err1;
742f856f099SNavdeep Parhar 
743f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
744f856f099SNavdeep Parhar 
745f856f099SNavdeep Parhar err1:
746f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
747f856f099SNavdeep Parhar err:
748f856f099SNavdeep Parhar 	return rc;
749f856f099SNavdeep Parhar }
750f856f099SNavdeep Parhar 
collect_cpl_stats(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)751f856f099SNavdeep Parhar static int collect_cpl_stats(struct cudbg_init *pdbg_init,
752f856f099SNavdeep Parhar 			     struct cudbg_buffer *dbg_buff,
753f856f099SNavdeep Parhar 			     struct cudbg_error *cudbg_err)
754f856f099SNavdeep Parhar {
755f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
756f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
757f856f099SNavdeep Parhar 	struct struct_tp_cpl_stats *tp_cpl_stats_buff;
758f856f099SNavdeep Parhar 	u32 size;
759f856f099SNavdeep Parhar 	int rc = 0;
760f856f099SNavdeep Parhar 
761f856f099SNavdeep Parhar 	size = sizeof(struct struct_tp_cpl_stats);
762f856f099SNavdeep Parhar 
763f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, size, &scratch_buff);
764f856f099SNavdeep Parhar 	if (rc)
765f856f099SNavdeep Parhar 		goto err;
766f856f099SNavdeep Parhar 
767f856f099SNavdeep Parhar 	tp_cpl_stats_buff = (struct struct_tp_cpl_stats *) scratch_buff.data;
768f856f099SNavdeep Parhar 	tp_cpl_stats_buff->nchan = padap->chip_params->nchan;
769f856f099SNavdeep Parhar 
770f856f099SNavdeep Parhar 	/* spin_lock(&padap->stats_lock);	TODO*/
771f856f099SNavdeep Parhar 	t4_tp_get_cpl_stats(padap, &tp_cpl_stats_buff->stats, 1);
772f856f099SNavdeep Parhar 	/* spin_unlock(&padap->stats_lock);	TODO*/
773f856f099SNavdeep Parhar 
774f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
775f856f099SNavdeep Parhar 	if (rc)
776f856f099SNavdeep Parhar 		goto err1;
777f856f099SNavdeep Parhar 
778f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
779f856f099SNavdeep Parhar 
780f856f099SNavdeep Parhar err1:
781f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
782f856f099SNavdeep Parhar err:
783f856f099SNavdeep Parhar 	return rc;
784f856f099SNavdeep Parhar }
785f856f099SNavdeep Parhar 
collect_wc_stats(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)786f856f099SNavdeep Parhar static int collect_wc_stats(struct cudbg_init *pdbg_init,
787f856f099SNavdeep Parhar 			    struct cudbg_buffer *dbg_buff,
788f856f099SNavdeep Parhar 			    struct cudbg_error *cudbg_err)
789f856f099SNavdeep Parhar {
790f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
791f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
792f856f099SNavdeep Parhar 	struct struct_wc_stats *wc_stats_buff;
793f856f099SNavdeep Parhar 	u32 val1;
794f856f099SNavdeep Parhar 	u32 val2;
795f856f099SNavdeep Parhar 	u32 size;
796f856f099SNavdeep Parhar 
797f856f099SNavdeep Parhar 	int rc = 0;
798f856f099SNavdeep Parhar 
799f856f099SNavdeep Parhar 	size = sizeof(struct struct_wc_stats);
800f856f099SNavdeep Parhar 
801f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, size, &scratch_buff);
802f856f099SNavdeep Parhar 	if (rc)
803f856f099SNavdeep Parhar 		goto err;
804f856f099SNavdeep Parhar 
805f856f099SNavdeep Parhar 	wc_stats_buff = (struct struct_wc_stats *) scratch_buff.data;
806f856f099SNavdeep Parhar 
807f856f099SNavdeep Parhar 	if (!is_t4(padap)) {
808f856f099SNavdeep Parhar 		val1 = t4_read_reg(padap, A_SGE_STAT_TOTAL);
809f856f099SNavdeep Parhar 		val2 = t4_read_reg(padap, A_SGE_STAT_MATCH);
810f856f099SNavdeep Parhar 		wc_stats_buff->wr_cl_success = val1 - val2;
811f856f099SNavdeep Parhar 		wc_stats_buff->wr_cl_fail = val2;
812f856f099SNavdeep Parhar 	} else {
813f856f099SNavdeep Parhar 		wc_stats_buff->wr_cl_success = 0;
814f856f099SNavdeep Parhar 		wc_stats_buff->wr_cl_fail = 0;
815f856f099SNavdeep Parhar 	}
816f856f099SNavdeep Parhar 
817f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
818f856f099SNavdeep Parhar 	if (rc)
819f856f099SNavdeep Parhar 		goto err1;
820f856f099SNavdeep Parhar 
821f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
822f856f099SNavdeep Parhar err1:
823f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
824f856f099SNavdeep Parhar err:
825f856f099SNavdeep Parhar 	return rc;
826f856f099SNavdeep Parhar }
827f856f099SNavdeep Parhar 
mem_desc_cmp(const void * a,const void * b)828f856f099SNavdeep Parhar static int mem_desc_cmp(const void *a, const void *b)
829f856f099SNavdeep Parhar {
830f856f099SNavdeep Parhar 	return ((const struct struct_mem_desc *)a)->base -
831f856f099SNavdeep Parhar 		((const struct struct_mem_desc *)b)->base;
832f856f099SNavdeep Parhar }
833f856f099SNavdeep Parhar 
fill_meminfo(struct adapter * padap,struct struct_meminfo * meminfo_buff)834f856f099SNavdeep Parhar static int fill_meminfo(struct adapter *padap,
835f856f099SNavdeep Parhar 			struct struct_meminfo *meminfo_buff)
836f856f099SNavdeep Parhar {
837f856f099SNavdeep Parhar 	struct struct_mem_desc *md;
838f856f099SNavdeep Parhar 	u32 size, lo, hi;
839f856f099SNavdeep Parhar 	u32 used, alloc;
840f856f099SNavdeep Parhar 	int n, i, rc = 0;
841f856f099SNavdeep Parhar 
842f856f099SNavdeep Parhar 	size = sizeof(struct struct_meminfo);
843f856f099SNavdeep Parhar 
844f856f099SNavdeep Parhar 	memset(meminfo_buff->avail, 0,
845f856f099SNavdeep Parhar 	       ARRAY_SIZE(meminfo_buff->avail) *
846f856f099SNavdeep Parhar 	       sizeof(struct struct_mem_desc));
847f856f099SNavdeep Parhar 	memset(meminfo_buff->mem, 0,
848f856f099SNavdeep Parhar 	       (ARRAY_SIZE(region) + 3) * sizeof(struct struct_mem_desc));
849f856f099SNavdeep Parhar 	md  = meminfo_buff->mem;
850f856f099SNavdeep Parhar 
851f856f099SNavdeep Parhar 	for (i = 0; i < ARRAY_SIZE(meminfo_buff->mem); i++) {
852f856f099SNavdeep Parhar 		meminfo_buff->mem[i].limit = 0;
853f856f099SNavdeep Parhar 		meminfo_buff->mem[i].idx = i;
854f856f099SNavdeep Parhar 	}
855f856f099SNavdeep Parhar 
856f856f099SNavdeep Parhar 	i = 0;
857f856f099SNavdeep Parhar 
858f856f099SNavdeep Parhar 	lo = t4_read_reg(padap, A_MA_TARGET_MEM_ENABLE);
859f856f099SNavdeep Parhar 
860f856f099SNavdeep Parhar 	if (lo & F_EDRAM0_ENABLE) {
861f856f099SNavdeep Parhar 		hi = t4_read_reg(padap, A_MA_EDRAM0_BAR);
862f856f099SNavdeep Parhar 		meminfo_buff->avail[i].base = G_EDRAM0_BASE(hi) << 20;
863f856f099SNavdeep Parhar 		meminfo_buff->avail[i].limit = meminfo_buff->avail[i].base +
864f856f099SNavdeep Parhar 					       (G_EDRAM0_SIZE(hi) << 20);
865f856f099SNavdeep Parhar 		meminfo_buff->avail[i].idx = 0;
866f856f099SNavdeep Parhar 		i++;
867f856f099SNavdeep Parhar 	}
868f856f099SNavdeep Parhar 
869f856f099SNavdeep Parhar 	if (lo & F_EDRAM1_ENABLE) {
870f856f099SNavdeep Parhar 		hi =  t4_read_reg(padap, A_MA_EDRAM1_BAR);
871f856f099SNavdeep Parhar 		meminfo_buff->avail[i].base = G_EDRAM1_BASE(hi) << 20;
872f856f099SNavdeep Parhar 		meminfo_buff->avail[i].limit = meminfo_buff->avail[i].base +
873f856f099SNavdeep Parhar 					       (G_EDRAM1_SIZE(hi) << 20);
874f856f099SNavdeep Parhar 		meminfo_buff->avail[i].idx = 1;
875f856f099SNavdeep Parhar 		i++;
876f856f099SNavdeep Parhar 	}
877f856f099SNavdeep Parhar 
878f856f099SNavdeep Parhar 	if (is_t5(padap)) {
879f856f099SNavdeep Parhar 		if (lo & F_EXT_MEM0_ENABLE) {
880f856f099SNavdeep Parhar 			hi = t4_read_reg(padap, A_MA_EXT_MEMORY0_BAR);
881f856f099SNavdeep Parhar 			meminfo_buff->avail[i].base = G_EXT_MEM_BASE(hi) << 20;
882f856f099SNavdeep Parhar 			meminfo_buff->avail[i].limit =
883f856f099SNavdeep Parhar 				meminfo_buff->avail[i].base +
884f856f099SNavdeep Parhar 				(G_EXT_MEM_SIZE(hi) << 20);
885f856f099SNavdeep Parhar 			meminfo_buff->avail[i].idx = 3;
886f856f099SNavdeep Parhar 			i++;
887f856f099SNavdeep Parhar 		}
888f856f099SNavdeep Parhar 
889f856f099SNavdeep Parhar 		if (lo & F_EXT_MEM1_ENABLE) {
890f856f099SNavdeep Parhar 			hi = t4_read_reg(padap, A_MA_EXT_MEMORY1_BAR);
891f856f099SNavdeep Parhar 			meminfo_buff->avail[i].base = G_EXT_MEM1_BASE(hi) << 20;
892f856f099SNavdeep Parhar 			meminfo_buff->avail[i].limit =
893f856f099SNavdeep Parhar 				meminfo_buff->avail[i].base +
894f856f099SNavdeep Parhar 				(G_EXT_MEM1_SIZE(hi) << 20);
895f856f099SNavdeep Parhar 			meminfo_buff->avail[i].idx = 4;
896f856f099SNavdeep Parhar 			i++;
897f856f099SNavdeep Parhar 		}
898f856f099SNavdeep Parhar 	} else if (is_t6(padap)) {
899f856f099SNavdeep Parhar 		if (lo & F_EXT_MEM_ENABLE) {
900f856f099SNavdeep Parhar 			hi = t4_read_reg(padap, A_MA_EXT_MEMORY_BAR);
901f856f099SNavdeep Parhar 			meminfo_buff->avail[i].base = G_EXT_MEM_BASE(hi) << 20;
902f856f099SNavdeep Parhar 			meminfo_buff->avail[i].limit =
903f856f099SNavdeep Parhar 				meminfo_buff->avail[i].base +
904f856f099SNavdeep Parhar 				(G_EXT_MEM_SIZE(hi) << 20);
905f856f099SNavdeep Parhar 			meminfo_buff->avail[i].idx = 2;
906f856f099SNavdeep Parhar 			i++;
907f856f099SNavdeep Parhar 		}
908f856f099SNavdeep Parhar 	}
909f856f099SNavdeep Parhar 
910f856f099SNavdeep Parhar 	if (!i) {				   /* no memory available */
911f856f099SNavdeep Parhar 		rc = CUDBG_STATUS_ENTITY_NOT_FOUND;
912f856f099SNavdeep Parhar 		goto err;
913f856f099SNavdeep Parhar 	}
914f856f099SNavdeep Parhar 
915f856f099SNavdeep Parhar 	meminfo_buff->avail_c = i;
916f856f099SNavdeep Parhar 	qsort(meminfo_buff->avail, i, sizeof(struct struct_mem_desc),
917f856f099SNavdeep Parhar 	    mem_desc_cmp);
918f856f099SNavdeep Parhar 	(md++)->base = t4_read_reg(padap, A_SGE_DBQ_CTXT_BADDR);
919f856f099SNavdeep Parhar 	(md++)->base = t4_read_reg(padap, A_SGE_IMSG_CTXT_BADDR);
920f856f099SNavdeep Parhar 	(md++)->base = t4_read_reg(padap, A_SGE_FLM_CACHE_BADDR);
921f856f099SNavdeep Parhar 	(md++)->base = t4_read_reg(padap, A_TP_CMM_TCB_BASE);
922f856f099SNavdeep Parhar 	(md++)->base = t4_read_reg(padap, A_TP_CMM_MM_BASE);
923f856f099SNavdeep Parhar 	(md++)->base = t4_read_reg(padap, A_TP_CMM_TIMER_BASE);
924f856f099SNavdeep Parhar 	(md++)->base = t4_read_reg(padap, A_TP_CMM_MM_RX_FLST_BASE);
925f856f099SNavdeep Parhar 	(md++)->base = t4_read_reg(padap, A_TP_CMM_MM_TX_FLST_BASE);
926f856f099SNavdeep Parhar 	(md++)->base = t4_read_reg(padap, A_TP_CMM_MM_PS_FLST_BASE);
927f856f099SNavdeep Parhar 
928f856f099SNavdeep Parhar 	/* the next few have explicit upper bounds */
929f856f099SNavdeep Parhar 	md->base = t4_read_reg(padap, A_TP_PMM_TX_BASE);
930f856f099SNavdeep Parhar 	md->limit = md->base - 1 +
931f856f099SNavdeep Parhar 		    t4_read_reg(padap,
932f856f099SNavdeep Parhar 				A_TP_PMM_TX_PAGE_SIZE) *
933f856f099SNavdeep Parhar 				G_PMTXMAXPAGE(t4_read_reg(padap,
934f856f099SNavdeep Parhar 							  A_TP_PMM_TX_MAX_PAGE)
935f856f099SNavdeep Parhar 					     );
936f856f099SNavdeep Parhar 	md++;
937f856f099SNavdeep Parhar 
938f856f099SNavdeep Parhar 	md->base = t4_read_reg(padap, A_TP_PMM_RX_BASE);
939f856f099SNavdeep Parhar 	md->limit = md->base - 1 +
940f856f099SNavdeep Parhar 		    t4_read_reg(padap,
941f856f099SNavdeep Parhar 				A_TP_PMM_RX_PAGE_SIZE) *
942f856f099SNavdeep Parhar 				G_PMRXMAXPAGE(t4_read_reg(padap,
943f856f099SNavdeep Parhar 							  A_TP_PMM_RX_MAX_PAGE)
944f856f099SNavdeep Parhar 					      );
945f856f099SNavdeep Parhar 	md++;
946f856f099SNavdeep Parhar 	if (t4_read_reg(padap, A_LE_DB_CONFIG) & F_HASHEN) {
947f856f099SNavdeep Parhar 		if (chip_id(padap) <= CHELSIO_T5) {
948f856f099SNavdeep Parhar 			hi = t4_read_reg(padap, A_LE_DB_TID_HASHBASE) / 4;
949f856f099SNavdeep Parhar 			md->base = t4_read_reg(padap, A_LE_DB_HASH_TID_BASE);
950f856f099SNavdeep Parhar 		} else {
951f856f099SNavdeep Parhar 			hi = t4_read_reg(padap, A_LE_DB_HASH_TID_BASE);
952f856f099SNavdeep Parhar 			md->base = t4_read_reg(padap,
953f856f099SNavdeep Parhar 					       A_LE_DB_HASH_TBL_BASE_ADDR);
954f856f099SNavdeep Parhar 		}
955f856f099SNavdeep Parhar 		md->limit = 0;
956f856f099SNavdeep Parhar 	} else {
957f856f099SNavdeep Parhar 		md->base = 0;
958f856f099SNavdeep Parhar 		md->idx = ARRAY_SIZE(region);  /* hide it */
959f856f099SNavdeep Parhar 	}
960f856f099SNavdeep Parhar 	md++;
961f856f099SNavdeep Parhar #define ulp_region(reg) \
962f856f099SNavdeep Parhar 	{\
963f856f099SNavdeep Parhar 		md->base = t4_read_reg(padap, A_ULP_ ## reg ## _LLIMIT);\
964f856f099SNavdeep Parhar 		(md++)->limit = t4_read_reg(padap, A_ULP_ ## reg ## _ULIMIT);\
965f856f099SNavdeep Parhar 	}
966f856f099SNavdeep Parhar 
967f856f099SNavdeep Parhar 	ulp_region(RX_ISCSI);
968f856f099SNavdeep Parhar 	ulp_region(RX_TDDP);
969f856f099SNavdeep Parhar 	ulp_region(TX_TPT);
970f856f099SNavdeep Parhar 	ulp_region(RX_STAG);
971f856f099SNavdeep Parhar 	ulp_region(RX_RQ);
972f856f099SNavdeep Parhar 	ulp_region(RX_RQUDP);
973f856f099SNavdeep Parhar 	ulp_region(RX_PBL);
974f856f099SNavdeep Parhar 	ulp_region(TX_PBL);
975f856f099SNavdeep Parhar #undef ulp_region
976f856f099SNavdeep Parhar 	md->base = 0;
977f856f099SNavdeep Parhar 	md->idx = ARRAY_SIZE(region);
978f856f099SNavdeep Parhar 	if (!is_t4(padap)) {
979f856f099SNavdeep Parhar 		u32 sge_ctrl = t4_read_reg(padap, A_SGE_CONTROL2);
980f856f099SNavdeep Parhar 		u32 fifo_size = t4_read_reg(padap, A_SGE_DBVFIFO_SIZE);
981f856f099SNavdeep Parhar 		if (is_t5(padap)) {
982f856f099SNavdeep Parhar 			if (sge_ctrl & F_VFIFO_ENABLE)
983f856f099SNavdeep Parhar 				size = G_DBVFIFO_SIZE(fifo_size);
984f856f099SNavdeep Parhar 		} else
985f856f099SNavdeep Parhar 			size = G_T6_DBVFIFO_SIZE(fifo_size);
986f856f099SNavdeep Parhar 
987f856f099SNavdeep Parhar 		if (size) {
988f856f099SNavdeep Parhar 			md->base = G_BASEADDR(t4_read_reg(padap,
989f856f099SNavdeep Parhar 							  A_SGE_DBVFIFO_BADDR));
990f856f099SNavdeep Parhar 			md->limit = md->base + (size << 2) - 1;
991f856f099SNavdeep Parhar 		}
992f856f099SNavdeep Parhar 	}
993f856f099SNavdeep Parhar 
994f856f099SNavdeep Parhar 	md++;
995f856f099SNavdeep Parhar 
996f856f099SNavdeep Parhar 	md->base = t4_read_reg(padap, A_ULP_RX_CTX_BASE);
997f856f099SNavdeep Parhar 	md->limit = 0;
998f856f099SNavdeep Parhar 	md++;
999f856f099SNavdeep Parhar 	md->base = t4_read_reg(padap, A_ULP_TX_ERR_TABLE_BASE);
1000f856f099SNavdeep Parhar 	md->limit = 0;
1001f856f099SNavdeep Parhar 	md++;
1002f856f099SNavdeep Parhar #ifndef __NO_DRIVER_OCQ_SUPPORT__
1003f856f099SNavdeep Parhar 	/*md->base = padap->vres.ocq.start;*/
1004f856f099SNavdeep Parhar 	/*if (adap->vres.ocq.size)*/
1005f856f099SNavdeep Parhar 	/*	  md->limit = md->base + adap->vres.ocq.size - 1;*/
1006f856f099SNavdeep Parhar 	/*else*/
1007f856f099SNavdeep Parhar 	md->idx = ARRAY_SIZE(region);  /* hide it */
1008f856f099SNavdeep Parhar 	md++;
1009f856f099SNavdeep Parhar #endif
1010f856f099SNavdeep Parhar 
1011f856f099SNavdeep Parhar 	/* add any address-space holes, there can be up to 3 */
1012f856f099SNavdeep Parhar 	for (n = 0; n < i - 1; n++)
1013f856f099SNavdeep Parhar 		if (meminfo_buff->avail[n].limit <
1014f856f099SNavdeep Parhar 		    meminfo_buff->avail[n + 1].base)
1015f856f099SNavdeep Parhar 			(md++)->base = meminfo_buff->avail[n].limit;
1016f856f099SNavdeep Parhar 
1017f856f099SNavdeep Parhar 	if (meminfo_buff->avail[n].limit)
1018f856f099SNavdeep Parhar 		(md++)->base = meminfo_buff->avail[n].limit;
1019f856f099SNavdeep Parhar 
1020f856f099SNavdeep Parhar 	n = (int) (md - meminfo_buff->mem);
1021f856f099SNavdeep Parhar 	meminfo_buff->mem_c = n;
1022f856f099SNavdeep Parhar 
1023f856f099SNavdeep Parhar 	qsort(meminfo_buff->mem, n, sizeof(struct struct_mem_desc),
1024f856f099SNavdeep Parhar 	    mem_desc_cmp);
1025f856f099SNavdeep Parhar 
1026f856f099SNavdeep Parhar 	lo = t4_read_reg(padap, A_CIM_SDRAM_BASE_ADDR);
1027f856f099SNavdeep Parhar 	hi = t4_read_reg(padap, A_CIM_SDRAM_ADDR_SIZE) + lo - 1;
1028f856f099SNavdeep Parhar 	meminfo_buff->up_ram_lo = lo;
1029f856f099SNavdeep Parhar 	meminfo_buff->up_ram_hi = hi;
1030f856f099SNavdeep Parhar 
1031f856f099SNavdeep Parhar 	lo = t4_read_reg(padap, A_CIM_EXTMEM2_BASE_ADDR);
1032f856f099SNavdeep Parhar 	hi = t4_read_reg(padap, A_CIM_EXTMEM2_ADDR_SIZE) + lo - 1;
1033f856f099SNavdeep Parhar 	meminfo_buff->up_extmem2_lo = lo;
1034f856f099SNavdeep Parhar 	meminfo_buff->up_extmem2_hi = hi;
1035f856f099SNavdeep Parhar 
1036f856f099SNavdeep Parhar 	lo = t4_read_reg(padap, A_TP_PMM_RX_MAX_PAGE);
1037f856f099SNavdeep Parhar 	meminfo_buff->rx_pages_data[0] =  G_PMRXMAXPAGE(lo);
1038f856f099SNavdeep Parhar 	meminfo_buff->rx_pages_data[1] =
1039f856f099SNavdeep Parhar 		t4_read_reg(padap, A_TP_PMM_RX_PAGE_SIZE) >> 10;
1040f856f099SNavdeep Parhar 	meminfo_buff->rx_pages_data[2] = (lo & F_PMRXNUMCHN) ? 2 : 1 ;
1041f856f099SNavdeep Parhar 
1042f856f099SNavdeep Parhar 	lo = t4_read_reg(padap, A_TP_PMM_TX_MAX_PAGE);
1043f856f099SNavdeep Parhar 	hi = t4_read_reg(padap, A_TP_PMM_TX_PAGE_SIZE);
1044f856f099SNavdeep Parhar 	meminfo_buff->tx_pages_data[0] = G_PMTXMAXPAGE(lo);
1045f856f099SNavdeep Parhar 	meminfo_buff->tx_pages_data[1] =
1046f856f099SNavdeep Parhar 		hi >= (1 << 20) ? (hi >> 20) : (hi >> 10);
1047f856f099SNavdeep Parhar 	meminfo_buff->tx_pages_data[2] =
1048f856f099SNavdeep Parhar 		hi >= (1 << 20) ? 'M' : 'K';
1049f856f099SNavdeep Parhar 	meminfo_buff->tx_pages_data[3] = 1 << G_PMTXNUMCHN(lo);
1050f856f099SNavdeep Parhar 
1051f856f099SNavdeep Parhar 	for (i = 0; i < 4; i++) {
1052f856f099SNavdeep Parhar 		if (chip_id(padap) > CHELSIO_T5)
1053f856f099SNavdeep Parhar 			lo = t4_read_reg(padap,
1054f856f099SNavdeep Parhar 					 A_MPS_RX_MAC_BG_PG_CNT0 + i * 4);
1055f856f099SNavdeep Parhar 		else
1056f856f099SNavdeep Parhar 			lo = t4_read_reg(padap, A_MPS_RX_PG_RSV0 + i * 4);
1057f856f099SNavdeep Parhar 		if (is_t5(padap)) {
1058f856f099SNavdeep Parhar 			used = G_T5_USED(lo);
1059f856f099SNavdeep Parhar 			alloc = G_T5_ALLOC(lo);
1060f856f099SNavdeep Parhar 		} else {
1061f856f099SNavdeep Parhar 			used = G_USED(lo);
1062f856f099SNavdeep Parhar 			alloc = G_ALLOC(lo);
1063f856f099SNavdeep Parhar 		}
1064f856f099SNavdeep Parhar 		meminfo_buff->port_used[i] = used;
1065f856f099SNavdeep Parhar 		meminfo_buff->port_alloc[i] = alloc;
1066f856f099SNavdeep Parhar 	}
1067f856f099SNavdeep Parhar 
1068f856f099SNavdeep Parhar 	for (i = 0; i < padap->chip_params->nchan; i++) {
1069f856f099SNavdeep Parhar 		if (chip_id(padap) > CHELSIO_T5)
1070f856f099SNavdeep Parhar 			lo = t4_read_reg(padap,
1071f856f099SNavdeep Parhar 					 A_MPS_RX_LPBK_BG_PG_CNT0 + i * 4);
1072f856f099SNavdeep Parhar 		else
1073f856f099SNavdeep Parhar 			lo = t4_read_reg(padap, A_MPS_RX_PG_RSV4 + i * 4);
1074f856f099SNavdeep Parhar 		if (is_t5(padap)) {
1075f856f099SNavdeep Parhar 			used = G_T5_USED(lo);
1076f856f099SNavdeep Parhar 			alloc = G_T5_ALLOC(lo);
1077f856f099SNavdeep Parhar 		} else {
1078f856f099SNavdeep Parhar 			used = G_USED(lo);
1079f856f099SNavdeep Parhar 			alloc = G_ALLOC(lo);
1080f856f099SNavdeep Parhar 		}
1081f856f099SNavdeep Parhar 		meminfo_buff->loopback_used[i] = used;
1082f856f099SNavdeep Parhar 		meminfo_buff->loopback_alloc[i] = alloc;
1083f856f099SNavdeep Parhar 	}
1084f856f099SNavdeep Parhar err:
1085f856f099SNavdeep Parhar 	return rc;
1086f856f099SNavdeep Parhar }
1087f856f099SNavdeep Parhar 
collect_meminfo(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)1088f856f099SNavdeep Parhar static int collect_meminfo(struct cudbg_init *pdbg_init,
1089f856f099SNavdeep Parhar 			   struct cudbg_buffer *dbg_buff,
1090f856f099SNavdeep Parhar 			   struct cudbg_error *cudbg_err)
1091f856f099SNavdeep Parhar {
1092f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
1093f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
1094f856f099SNavdeep Parhar 	struct struct_meminfo *meminfo_buff;
1095f856f099SNavdeep Parhar 	int rc = 0;
1096f856f099SNavdeep Parhar 	u32 size;
1097f856f099SNavdeep Parhar 
1098f856f099SNavdeep Parhar 	size = sizeof(struct struct_meminfo);
1099f856f099SNavdeep Parhar 
1100f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, size, &scratch_buff);
1101f856f099SNavdeep Parhar 	if (rc)
1102f856f099SNavdeep Parhar 		goto err;
1103f856f099SNavdeep Parhar 
1104f856f099SNavdeep Parhar 	meminfo_buff = (struct struct_meminfo *)scratch_buff.data;
1105f856f099SNavdeep Parhar 
1106f856f099SNavdeep Parhar 	rc = fill_meminfo(padap, meminfo_buff);
1107f856f099SNavdeep Parhar 	if (rc)
1108f856f099SNavdeep Parhar 		goto err;
1109f856f099SNavdeep Parhar 
1110f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
1111f856f099SNavdeep Parhar 	if (rc)
1112f856f099SNavdeep Parhar 		goto err1;
1113f856f099SNavdeep Parhar 
1114f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
1115f856f099SNavdeep Parhar err1:
1116f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
1117f856f099SNavdeep Parhar err:
1118f856f099SNavdeep Parhar 	return rc;
1119f856f099SNavdeep Parhar }
1120f856f099SNavdeep Parhar 
collect_lb_stats(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)1121f856f099SNavdeep Parhar static int collect_lb_stats(struct cudbg_init *pdbg_init,
1122f856f099SNavdeep Parhar 			    struct cudbg_buffer *dbg_buff,
1123f856f099SNavdeep Parhar 			    struct cudbg_error *cudbg_err)
1124f856f099SNavdeep Parhar {
1125f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
1126f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
1127f856f099SNavdeep Parhar 	struct lb_port_stats *tmp_stats;
1128f856f099SNavdeep Parhar 	struct struct_lb_stats *lb_stats_buff;
1129f856f099SNavdeep Parhar 	u32 i, n, size;
1130f856f099SNavdeep Parhar 	int rc = 0;
1131f856f099SNavdeep Parhar 
1132f856f099SNavdeep Parhar 	rc = padap->params.nports;
1133f856f099SNavdeep Parhar 	if (rc < 0)
1134f856f099SNavdeep Parhar 		goto err;
1135f856f099SNavdeep Parhar 
1136f856f099SNavdeep Parhar 	n = rc;
1137f856f099SNavdeep Parhar 	size = sizeof(struct struct_lb_stats) +
1138f856f099SNavdeep Parhar 	       n * sizeof(struct lb_port_stats);
1139f856f099SNavdeep Parhar 
1140f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, size, &scratch_buff);
1141f856f099SNavdeep Parhar 	if (rc)
1142f856f099SNavdeep Parhar 		goto err;
1143f856f099SNavdeep Parhar 
1144f856f099SNavdeep Parhar 	lb_stats_buff = (struct struct_lb_stats *) scratch_buff.data;
1145f856f099SNavdeep Parhar 
1146f856f099SNavdeep Parhar 	lb_stats_buff->nchan = n;
1147f856f099SNavdeep Parhar 	tmp_stats = lb_stats_buff->s;
1148f856f099SNavdeep Parhar 
1149f856f099SNavdeep Parhar 	for (i = 0; i < n; i += 2, tmp_stats += 2) {
1150f856f099SNavdeep Parhar 		t4_get_lb_stats(padap, i, tmp_stats);
1151f856f099SNavdeep Parhar 		t4_get_lb_stats(padap, i + 1, tmp_stats+1);
1152f856f099SNavdeep Parhar 	}
1153f856f099SNavdeep Parhar 
1154f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
1155f856f099SNavdeep Parhar 	if (rc)
1156f856f099SNavdeep Parhar 		goto err1;
1157f856f099SNavdeep Parhar 
1158f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
1159f856f099SNavdeep Parhar err1:
1160f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
1161f856f099SNavdeep Parhar err:
1162f856f099SNavdeep Parhar 	return rc;
1163f856f099SNavdeep Parhar }
1164f856f099SNavdeep Parhar 
collect_rdma_stats(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_er)1165f856f099SNavdeep Parhar static int collect_rdma_stats(struct cudbg_init *pdbg_init,
1166f856f099SNavdeep Parhar 			      struct cudbg_buffer *dbg_buff,
1167f856f099SNavdeep Parhar 			      struct cudbg_error *cudbg_er)
1168f856f099SNavdeep Parhar {
1169f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
1170f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
1171f856f099SNavdeep Parhar 	struct tp_rdma_stats *rdma_stats_buff;
1172f856f099SNavdeep Parhar 	u32 size;
1173f856f099SNavdeep Parhar 	int rc = 0;
1174f856f099SNavdeep Parhar 
1175f856f099SNavdeep Parhar 	size = sizeof(struct tp_rdma_stats);
1176f856f099SNavdeep Parhar 
1177f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, size, &scratch_buff);
1178f856f099SNavdeep Parhar 	if (rc)
1179f856f099SNavdeep Parhar 		goto err;
1180f856f099SNavdeep Parhar 
1181f856f099SNavdeep Parhar 	rdma_stats_buff = (struct tp_rdma_stats *) scratch_buff.data;
1182f856f099SNavdeep Parhar 
1183f856f099SNavdeep Parhar 	/* spin_lock(&padap->stats_lock);	TODO*/
1184f856f099SNavdeep Parhar 	t4_tp_get_rdma_stats(padap, rdma_stats_buff, 1);
1185f856f099SNavdeep Parhar 	/* spin_unlock(&padap->stats_lock);	TODO*/
1186f856f099SNavdeep Parhar 
1187f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
1188f856f099SNavdeep Parhar 	if (rc)
1189f856f099SNavdeep Parhar 		goto err1;
1190f856f099SNavdeep Parhar 
1191f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
1192f856f099SNavdeep Parhar err1:
1193f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
1194f856f099SNavdeep Parhar err:
1195f856f099SNavdeep Parhar 	return rc;
1196f856f099SNavdeep Parhar }
1197f856f099SNavdeep Parhar 
collect_clk_info(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)1198f856f099SNavdeep Parhar static int collect_clk_info(struct cudbg_init *pdbg_init,
1199f856f099SNavdeep Parhar 			    struct cudbg_buffer *dbg_buff,
1200f856f099SNavdeep Parhar 			    struct cudbg_error *cudbg_err)
1201f856f099SNavdeep Parhar {
1202f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
1203f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
1204f856f099SNavdeep Parhar 	struct struct_clk_info *clk_info_buff;
1205f856f099SNavdeep Parhar 	u64 tp_tick_us;
1206f856f099SNavdeep Parhar 	int size;
1207f856f099SNavdeep Parhar 	int rc = 0;
1208f856f099SNavdeep Parhar 
1209f856f099SNavdeep Parhar 	if (!padap->params.vpd.cclk) {
1210f856f099SNavdeep Parhar 		rc =  CUDBG_STATUS_CCLK_NOT_DEFINED;
1211f856f099SNavdeep Parhar 		goto err;
1212f856f099SNavdeep Parhar 	}
1213f856f099SNavdeep Parhar 
1214f856f099SNavdeep Parhar 	size = sizeof(struct struct_clk_info);
1215f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, size, &scratch_buff);
1216f856f099SNavdeep Parhar 	if (rc)
1217f856f099SNavdeep Parhar 		goto err;
1218f856f099SNavdeep Parhar 
1219f856f099SNavdeep Parhar 	clk_info_buff = (struct struct_clk_info *) scratch_buff.data;
1220f856f099SNavdeep Parhar 
1221f856f099SNavdeep Parhar 	clk_info_buff->cclk_ps = 1000000000 / padap->params.vpd.cclk;  /* in ps
1222f856f099SNavdeep Parhar 	*/
1223f856f099SNavdeep Parhar 	clk_info_buff->res = t4_read_reg(padap, A_TP_TIMER_RESOLUTION);
1224f856f099SNavdeep Parhar 	clk_info_buff->tre = G_TIMERRESOLUTION(clk_info_buff->res);
1225f856f099SNavdeep Parhar 	clk_info_buff->dack_re = G_DELAYEDACKRESOLUTION(clk_info_buff->res);
1226f856f099SNavdeep Parhar 	tp_tick_us = (clk_info_buff->cclk_ps << clk_info_buff->tre) / 1000000;
1227f856f099SNavdeep Parhar 	/* in us */
1228f856f099SNavdeep Parhar 	clk_info_buff->dack_timer = ((clk_info_buff->cclk_ps <<
1229f856f099SNavdeep Parhar 				      clk_info_buff->dack_re) / 1000000) *
1230f856f099SNavdeep Parhar 				     t4_read_reg(padap, A_TP_DACK_TIMER);
1231f856f099SNavdeep Parhar 
1232f856f099SNavdeep Parhar 	clk_info_buff->retransmit_min =
1233f856f099SNavdeep Parhar 		tp_tick_us * t4_read_reg(padap, A_TP_RXT_MIN);
1234f856f099SNavdeep Parhar 	clk_info_buff->retransmit_max =
1235f856f099SNavdeep Parhar 		tp_tick_us * t4_read_reg(padap, A_TP_RXT_MAX);
1236f856f099SNavdeep Parhar 
1237f856f099SNavdeep Parhar 	clk_info_buff->persist_timer_min =
1238f856f099SNavdeep Parhar 		tp_tick_us * t4_read_reg(padap, A_TP_PERS_MIN);
1239f856f099SNavdeep Parhar 	clk_info_buff->persist_timer_max =
1240f856f099SNavdeep Parhar 		tp_tick_us * t4_read_reg(padap, A_TP_PERS_MAX);
1241f856f099SNavdeep Parhar 
1242f856f099SNavdeep Parhar 	clk_info_buff->keepalive_idle_timer =
1243f856f099SNavdeep Parhar 		tp_tick_us * t4_read_reg(padap, A_TP_KEEP_IDLE);
1244f856f099SNavdeep Parhar 	clk_info_buff->keepalive_interval =
1245f856f099SNavdeep Parhar 		tp_tick_us * t4_read_reg(padap, A_TP_KEEP_INTVL);
1246f856f099SNavdeep Parhar 
1247f856f099SNavdeep Parhar 	clk_info_buff->initial_srtt =
1248f856f099SNavdeep Parhar 		tp_tick_us * G_INITSRTT(t4_read_reg(padap, A_TP_INIT_SRTT));
1249f856f099SNavdeep Parhar 	clk_info_buff->finwait2_timer =
1250f856f099SNavdeep Parhar 		tp_tick_us * t4_read_reg(padap, A_TP_FINWAIT2_TIMER);
1251f856f099SNavdeep Parhar 
1252f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
1253f856f099SNavdeep Parhar 
1254f856f099SNavdeep Parhar 	if (rc)
1255f856f099SNavdeep Parhar 		goto err1;
1256f856f099SNavdeep Parhar 
1257f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
1258f856f099SNavdeep Parhar err1:
1259f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
1260f856f099SNavdeep Parhar err:
1261f856f099SNavdeep Parhar 	return rc;
1262f856f099SNavdeep Parhar 
1263f856f099SNavdeep Parhar }
1264f856f099SNavdeep Parhar 
collect_macstats(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)1265f856f099SNavdeep Parhar static int collect_macstats(struct cudbg_init *pdbg_init,
1266f856f099SNavdeep Parhar 			    struct cudbg_buffer *dbg_buff,
1267f856f099SNavdeep Parhar 			    struct cudbg_error *cudbg_err)
1268f856f099SNavdeep Parhar {
1269f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
1270f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
1271f856f099SNavdeep Parhar 	struct struct_mac_stats_rev1 *mac_stats_buff;
1272f856f099SNavdeep Parhar 	u32 i, n, size;
1273f856f099SNavdeep Parhar 	int rc = 0;
1274f856f099SNavdeep Parhar 
1275f856f099SNavdeep Parhar 	rc = padap->params.nports;
1276f856f099SNavdeep Parhar 	if (rc < 0)
1277f856f099SNavdeep Parhar 		goto err;
1278f856f099SNavdeep Parhar 
1279f856f099SNavdeep Parhar 	n = rc;
1280f856f099SNavdeep Parhar 	size = sizeof(struct struct_mac_stats_rev1);
1281f856f099SNavdeep Parhar 
1282f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, size, &scratch_buff);
1283f856f099SNavdeep Parhar 	if (rc)
1284f856f099SNavdeep Parhar 		goto err;
1285f856f099SNavdeep Parhar 
1286f856f099SNavdeep Parhar 	mac_stats_buff = (struct struct_mac_stats_rev1 *) scratch_buff.data;
1287f856f099SNavdeep Parhar 
1288f856f099SNavdeep Parhar 	mac_stats_buff->ver_hdr.signature = CUDBG_ENTITY_SIGNATURE;
1289f856f099SNavdeep Parhar 	mac_stats_buff->ver_hdr.revision = CUDBG_MAC_STATS_REV;
1290f856f099SNavdeep Parhar 	mac_stats_buff->ver_hdr.size = sizeof(struct struct_mac_stats_rev1) -
1291f856f099SNavdeep Parhar 				       sizeof(struct cudbg_ver_hdr);
1292f856f099SNavdeep Parhar 
1293f856f099SNavdeep Parhar 	mac_stats_buff->port_count = n;
1294f856f099SNavdeep Parhar 	for (i = 0; i <  mac_stats_buff->port_count; i++)
1295f856f099SNavdeep Parhar 		t4_get_port_stats(padap, i, &mac_stats_buff->stats[i]);
1296f856f099SNavdeep Parhar 
1297f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
1298f856f099SNavdeep Parhar 	if (rc)
1299f856f099SNavdeep Parhar 		goto err1;
1300f856f099SNavdeep Parhar 
1301f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
1302f856f099SNavdeep Parhar err1:
1303f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
1304f856f099SNavdeep Parhar err:
1305f856f099SNavdeep Parhar 	return rc;
1306f856f099SNavdeep Parhar }
1307f856f099SNavdeep Parhar 
collect_cim_pif_la(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)1308f856f099SNavdeep Parhar static int collect_cim_pif_la(struct cudbg_init *pdbg_init,
1309f856f099SNavdeep Parhar 			      struct cudbg_buffer *dbg_buff,
1310f856f099SNavdeep Parhar 			      struct cudbg_error *cudbg_err)
1311f856f099SNavdeep Parhar {
1312f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
1313f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
1314f856f099SNavdeep Parhar 	struct cim_pif_la *cim_pif_la_buff;
1315f856f099SNavdeep Parhar 	u32 size;
1316f856f099SNavdeep Parhar 	int rc = 0;
1317f856f099SNavdeep Parhar 
1318f856f099SNavdeep Parhar 	size = sizeof(struct cim_pif_la) +
1319f856f099SNavdeep Parhar 	       2 * CIM_PIFLA_SIZE * 6 * sizeof(u32);
1320f856f099SNavdeep Parhar 
1321f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, size, &scratch_buff);
1322f856f099SNavdeep Parhar 	if (rc)
1323f856f099SNavdeep Parhar 		goto err;
1324f856f099SNavdeep Parhar 
1325f856f099SNavdeep Parhar 	cim_pif_la_buff = (struct cim_pif_la *) scratch_buff.data;
1326f856f099SNavdeep Parhar 	cim_pif_la_buff->size = CIM_PIFLA_SIZE;
1327f856f099SNavdeep Parhar 
1328f856f099SNavdeep Parhar 	t4_cim_read_pif_la(padap, (u32 *)cim_pif_la_buff->data,
1329f856f099SNavdeep Parhar 			   (u32 *)cim_pif_la_buff->data + 6 * CIM_PIFLA_SIZE,
1330f856f099SNavdeep Parhar 			   NULL, NULL);
1331f856f099SNavdeep Parhar 
1332f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
1333f856f099SNavdeep Parhar 	if (rc)
1334f856f099SNavdeep Parhar 		goto err1;
1335f856f099SNavdeep Parhar 
1336f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
1337f856f099SNavdeep Parhar err1:
1338f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
1339f856f099SNavdeep Parhar err:
1340f856f099SNavdeep Parhar 	return rc;
1341f856f099SNavdeep Parhar }
1342f856f099SNavdeep Parhar 
collect_tp_la(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)1343f856f099SNavdeep Parhar static int collect_tp_la(struct cudbg_init *pdbg_init,
1344f856f099SNavdeep Parhar 			 struct cudbg_buffer *dbg_buff,
1345f856f099SNavdeep Parhar 			 struct cudbg_error *cudbg_err)
1346f856f099SNavdeep Parhar {
1347f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
1348f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
1349f856f099SNavdeep Parhar 	struct struct_tp_la *tp_la_buff;
1350f856f099SNavdeep Parhar 	u32 size;
1351f856f099SNavdeep Parhar 	int rc = 0;
1352f856f099SNavdeep Parhar 
1353f856f099SNavdeep Parhar 	size = sizeof(struct struct_tp_la) + TPLA_SIZE *  sizeof(u64);
1354f856f099SNavdeep Parhar 
1355f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, size, &scratch_buff);
1356f856f099SNavdeep Parhar 	if (rc)
1357f856f099SNavdeep Parhar 		goto err;
1358f856f099SNavdeep Parhar 
1359f856f099SNavdeep Parhar 	tp_la_buff = (struct struct_tp_la *) scratch_buff.data;
1360f856f099SNavdeep Parhar 
1361f856f099SNavdeep Parhar 	tp_la_buff->mode = G_DBGLAMODE(t4_read_reg(padap, A_TP_DBG_LA_CONFIG));
1362f856f099SNavdeep Parhar 	t4_tp_read_la(padap, (u64 *)tp_la_buff->data, NULL);
1363f856f099SNavdeep Parhar 
1364f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
1365f856f099SNavdeep Parhar 	if (rc)
1366f856f099SNavdeep Parhar 		goto err1;
1367f856f099SNavdeep Parhar 
1368f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
1369f856f099SNavdeep Parhar err1:
1370f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
1371f856f099SNavdeep Parhar err:
1372f856f099SNavdeep Parhar 	return rc;
1373f856f099SNavdeep Parhar }
1374f856f099SNavdeep Parhar 
collect_fcoe_stats(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)1375f856f099SNavdeep Parhar static int collect_fcoe_stats(struct cudbg_init *pdbg_init,
1376f856f099SNavdeep Parhar 			      struct cudbg_buffer *dbg_buff,
1377f856f099SNavdeep Parhar 			      struct cudbg_error *cudbg_err)
1378f856f099SNavdeep Parhar {
1379f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
1380f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
1381f856f099SNavdeep Parhar 	struct struct_tp_fcoe_stats  *tp_fcoe_stats_buff;
1382f856f099SNavdeep Parhar 	u32 size;
1383f856f099SNavdeep Parhar 	int rc = 0;
1384f856f099SNavdeep Parhar 
1385f856f099SNavdeep Parhar 	size = sizeof(struct struct_tp_fcoe_stats);
1386f856f099SNavdeep Parhar 
1387f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, size, &scratch_buff);
1388f856f099SNavdeep Parhar 	if (rc)
1389f856f099SNavdeep Parhar 		goto err;
1390f856f099SNavdeep Parhar 
1391f856f099SNavdeep Parhar 	tp_fcoe_stats_buff = (struct struct_tp_fcoe_stats *) scratch_buff.data;
1392f856f099SNavdeep Parhar 
1393f856f099SNavdeep Parhar 	/* spin_lock(&padap->stats_lock);	TODO*/
1394f856f099SNavdeep Parhar 	t4_get_fcoe_stats(padap, 0, &tp_fcoe_stats_buff->stats[0], 1);
1395f856f099SNavdeep Parhar 	t4_get_fcoe_stats(padap, 1, &tp_fcoe_stats_buff->stats[1], 1);
1396f856f099SNavdeep Parhar 	if (padap->chip_params->nchan == NCHAN) {
1397f856f099SNavdeep Parhar 		t4_get_fcoe_stats(padap, 2, &tp_fcoe_stats_buff->stats[2], 1);
1398f856f099SNavdeep Parhar 		t4_get_fcoe_stats(padap, 3, &tp_fcoe_stats_buff->stats[3], 1);
1399f856f099SNavdeep Parhar 	}
1400f856f099SNavdeep Parhar 	/* spin_unlock(&padap->stats_lock);	TODO*/
1401f856f099SNavdeep Parhar 
1402f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
1403f856f099SNavdeep Parhar 	if (rc)
1404f856f099SNavdeep Parhar 		goto err1;
1405f856f099SNavdeep Parhar 
1406f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
1407f856f099SNavdeep Parhar err1:
1408f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
1409f856f099SNavdeep Parhar err:
1410f856f099SNavdeep Parhar 	return rc;
1411f856f099SNavdeep Parhar }
1412f856f099SNavdeep Parhar 
collect_tp_err_stats(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)1413f856f099SNavdeep Parhar static int collect_tp_err_stats(struct cudbg_init *pdbg_init,
1414f856f099SNavdeep Parhar 				struct cudbg_buffer *dbg_buff,
1415f856f099SNavdeep Parhar 				struct cudbg_error *cudbg_err)
1416f856f099SNavdeep Parhar {
1417f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
1418f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
1419f856f099SNavdeep Parhar 	struct struct_tp_err_stats *tp_err_stats_buff;
1420f856f099SNavdeep Parhar 	u32 size;
1421f856f099SNavdeep Parhar 	int rc = 0;
1422f856f099SNavdeep Parhar 
1423f856f099SNavdeep Parhar 	size = sizeof(struct struct_tp_err_stats);
1424f856f099SNavdeep Parhar 
1425f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, size, &scratch_buff);
1426f856f099SNavdeep Parhar 	if (rc)
1427f856f099SNavdeep Parhar 		goto err;
1428f856f099SNavdeep Parhar 
1429f856f099SNavdeep Parhar 	tp_err_stats_buff = (struct struct_tp_err_stats *) scratch_buff.data;
1430f856f099SNavdeep Parhar 
1431f856f099SNavdeep Parhar 	/* spin_lock(&padap->stats_lock);	TODO*/
1432f856f099SNavdeep Parhar 	t4_tp_get_err_stats(padap, &tp_err_stats_buff->stats, 1);
1433f856f099SNavdeep Parhar 	/* spin_unlock(&padap->stats_lock);	TODO*/
1434f856f099SNavdeep Parhar 	tp_err_stats_buff->nchan = padap->chip_params->nchan;
1435f856f099SNavdeep Parhar 
1436f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
1437f856f099SNavdeep Parhar 	if (rc)
1438f856f099SNavdeep Parhar 		goto err1;
1439f856f099SNavdeep Parhar 
1440f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
1441f856f099SNavdeep Parhar err1:
1442f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
1443f856f099SNavdeep Parhar err:
1444f856f099SNavdeep Parhar 	return rc;
1445f856f099SNavdeep Parhar }
1446f856f099SNavdeep Parhar 
collect_tcp_stats(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)1447f856f099SNavdeep Parhar static int collect_tcp_stats(struct cudbg_init *pdbg_init,
1448f856f099SNavdeep Parhar 			     struct cudbg_buffer *dbg_buff,
1449f856f099SNavdeep Parhar 			     struct cudbg_error *cudbg_err)
1450f856f099SNavdeep Parhar {
1451f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
1452f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
1453f856f099SNavdeep Parhar 	struct struct_tcp_stats *tcp_stats_buff;
1454f856f099SNavdeep Parhar 	u32 size;
1455f856f099SNavdeep Parhar 	int rc = 0;
1456f856f099SNavdeep Parhar 
1457f856f099SNavdeep Parhar 	size = sizeof(struct struct_tcp_stats);
1458f856f099SNavdeep Parhar 
1459f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, size, &scratch_buff);
1460f856f099SNavdeep Parhar 	if (rc)
1461f856f099SNavdeep Parhar 		goto err;
1462f856f099SNavdeep Parhar 
1463f856f099SNavdeep Parhar 	tcp_stats_buff = (struct struct_tcp_stats *) scratch_buff.data;
1464f856f099SNavdeep Parhar 
1465f856f099SNavdeep Parhar 	/* spin_lock(&padap->stats_lock);	TODO*/
1466f856f099SNavdeep Parhar 	t4_tp_get_tcp_stats(padap, &tcp_stats_buff->v4, &tcp_stats_buff->v6, 1);
1467f856f099SNavdeep Parhar 	/* spin_unlock(&padap->stats_lock);	TODO*/
1468f856f099SNavdeep Parhar 
1469f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
1470f856f099SNavdeep Parhar 	if (rc)
1471f856f099SNavdeep Parhar 		goto err1;
1472f856f099SNavdeep Parhar 
1473f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
1474f856f099SNavdeep Parhar err1:
1475f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
1476f856f099SNavdeep Parhar err:
1477f856f099SNavdeep Parhar 	return rc;
1478f856f099SNavdeep Parhar }
1479f856f099SNavdeep Parhar 
collect_hw_sched(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)1480f856f099SNavdeep Parhar static int collect_hw_sched(struct cudbg_init *pdbg_init,
1481f856f099SNavdeep Parhar 			    struct cudbg_buffer *dbg_buff,
1482f856f099SNavdeep Parhar 			    struct cudbg_error *cudbg_err)
1483f856f099SNavdeep Parhar {
1484f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
1485f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
1486f856f099SNavdeep Parhar 	struct struct_hw_sched *hw_sched_buff;
1487f856f099SNavdeep Parhar 	u32 size;
1488f856f099SNavdeep Parhar 	int i, rc = 0;
1489f856f099SNavdeep Parhar 
1490f856f099SNavdeep Parhar 	if (!padap->params.vpd.cclk) {
1491f856f099SNavdeep Parhar 		rc =  CUDBG_STATUS_CCLK_NOT_DEFINED;
1492f856f099SNavdeep Parhar 		goto err;
1493f856f099SNavdeep Parhar 	}
1494f856f099SNavdeep Parhar 
1495f856f099SNavdeep Parhar 	size = sizeof(struct struct_hw_sched);
1496f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, size, &scratch_buff);
1497f856f099SNavdeep Parhar 	if (rc)
1498f856f099SNavdeep Parhar 		goto err;
1499f856f099SNavdeep Parhar 
1500f856f099SNavdeep Parhar 	hw_sched_buff = (struct struct_hw_sched *) scratch_buff.data;
1501f856f099SNavdeep Parhar 
1502f856f099SNavdeep Parhar 	hw_sched_buff->map = t4_read_reg(padap, A_TP_TX_MOD_QUEUE_REQ_MAP);
1503f856f099SNavdeep Parhar 	hw_sched_buff->mode = G_TIMERMODE(t4_read_reg(padap, A_TP_MOD_CONFIG));
1504f856f099SNavdeep Parhar 	t4_read_pace_tbl(padap, hw_sched_buff->pace_tab);
1505f856f099SNavdeep Parhar 
1506f856f099SNavdeep Parhar 	for (i = 0; i < NTX_SCHED; ++i) {
1507f856f099SNavdeep Parhar 		t4_get_tx_sched(padap, i, &hw_sched_buff->kbps[i],
1508f856f099SNavdeep Parhar 		    &hw_sched_buff->ipg[i], 1);
1509f856f099SNavdeep Parhar 	}
1510f856f099SNavdeep Parhar 
1511f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
1512f856f099SNavdeep Parhar 	if (rc)
1513f856f099SNavdeep Parhar 		goto err1;
1514f856f099SNavdeep Parhar 
1515f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
1516f856f099SNavdeep Parhar err1:
1517f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
1518f856f099SNavdeep Parhar err:
1519f856f099SNavdeep Parhar 	return rc;
1520f856f099SNavdeep Parhar }
1521f856f099SNavdeep Parhar 
collect_pm_stats(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)1522f856f099SNavdeep Parhar static int collect_pm_stats(struct cudbg_init *pdbg_init,
1523f856f099SNavdeep Parhar 			    struct cudbg_buffer *dbg_buff,
1524f856f099SNavdeep Parhar 			    struct cudbg_error *cudbg_err)
1525f856f099SNavdeep Parhar {
1526f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
1527f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
1528f856f099SNavdeep Parhar 	struct struct_pm_stats *pm_stats_buff;
1529f856f099SNavdeep Parhar 	u32 size;
1530f856f099SNavdeep Parhar 	int rc = 0;
1531f856f099SNavdeep Parhar 
1532f856f099SNavdeep Parhar 	size = sizeof(struct struct_pm_stats);
1533f856f099SNavdeep Parhar 
1534f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, size, &scratch_buff);
1535f856f099SNavdeep Parhar 	if (rc)
1536f856f099SNavdeep Parhar 		goto err;
1537f856f099SNavdeep Parhar 
1538f856f099SNavdeep Parhar 	pm_stats_buff = (struct struct_pm_stats *) scratch_buff.data;
1539f856f099SNavdeep Parhar 
1540f856f099SNavdeep Parhar 	t4_pmtx_get_stats(padap, pm_stats_buff->tx_cnt, pm_stats_buff->tx_cyc);
1541f856f099SNavdeep Parhar 	t4_pmrx_get_stats(padap, pm_stats_buff->rx_cnt, pm_stats_buff->rx_cyc);
1542f856f099SNavdeep Parhar 
1543f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
1544f856f099SNavdeep Parhar 	if (rc)
1545f856f099SNavdeep Parhar 		goto err1;
1546f856f099SNavdeep Parhar 
1547f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
1548f856f099SNavdeep Parhar err1:
1549f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
1550f856f099SNavdeep Parhar err:
1551f856f099SNavdeep Parhar 	return rc;
1552f856f099SNavdeep Parhar }
1553f856f099SNavdeep Parhar 
collect_path_mtu(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)1554f856f099SNavdeep Parhar static int collect_path_mtu(struct cudbg_init *pdbg_init,
1555f856f099SNavdeep Parhar 			    struct cudbg_buffer *dbg_buff,
1556f856f099SNavdeep Parhar 			    struct cudbg_error *cudbg_err)
1557f856f099SNavdeep Parhar {
1558f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
1559f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
1560f856f099SNavdeep Parhar 	u32 size;
1561f856f099SNavdeep Parhar 	int rc = 0;
1562f856f099SNavdeep Parhar 
1563f856f099SNavdeep Parhar 	size = NMTUS  * sizeof(u16);
1564f856f099SNavdeep Parhar 
1565f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, size, &scratch_buff);
1566f856f099SNavdeep Parhar 	if (rc)
1567f856f099SNavdeep Parhar 		goto err;
1568f856f099SNavdeep Parhar 
1569f856f099SNavdeep Parhar 	t4_read_mtu_tbl(padap, (u16 *)scratch_buff.data, NULL);
1570f856f099SNavdeep Parhar 
1571f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
1572f856f099SNavdeep Parhar 	if (rc)
1573f856f099SNavdeep Parhar 		goto err1;
1574f856f099SNavdeep Parhar 
1575f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
1576f856f099SNavdeep Parhar err1:
1577f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
1578f856f099SNavdeep Parhar err:
1579f856f099SNavdeep Parhar 	return rc;
1580f856f099SNavdeep Parhar }
1581f856f099SNavdeep Parhar 
collect_rss_key(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)1582f856f099SNavdeep Parhar static int collect_rss_key(struct cudbg_init *pdbg_init,
1583f856f099SNavdeep Parhar 			   struct cudbg_buffer *dbg_buff,
1584f856f099SNavdeep Parhar 			   struct cudbg_error *cudbg_err)
1585f856f099SNavdeep Parhar {
1586f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
1587f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
1588f856f099SNavdeep Parhar 	u32 size;
1589f856f099SNavdeep Parhar 
1590f856f099SNavdeep Parhar 	int rc = 0;
1591f856f099SNavdeep Parhar 
1592f856f099SNavdeep Parhar 	size = 10  * sizeof(u32);
1593f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, size, &scratch_buff);
1594f856f099SNavdeep Parhar 	if (rc)
1595f856f099SNavdeep Parhar 		goto err;
1596f856f099SNavdeep Parhar 
1597f856f099SNavdeep Parhar 	t4_read_rss_key(padap, (u32 *)scratch_buff.data, 1);
1598f856f099SNavdeep Parhar 
1599f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
1600f856f099SNavdeep Parhar 	if (rc)
1601f856f099SNavdeep Parhar 		goto err1;
1602f856f099SNavdeep Parhar 
1603f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
1604f856f099SNavdeep Parhar err1:
1605f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
1606f856f099SNavdeep Parhar err:
1607f856f099SNavdeep Parhar 	return rc;
1608f856f099SNavdeep Parhar }
1609f856f099SNavdeep Parhar 
collect_rss_config(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)1610f856f099SNavdeep Parhar static int collect_rss_config(struct cudbg_init *pdbg_init,
1611f856f099SNavdeep Parhar 			      struct cudbg_buffer *dbg_buff,
1612f856f099SNavdeep Parhar 			      struct cudbg_error *cudbg_err)
1613f856f099SNavdeep Parhar {
1614f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
1615f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
1616f856f099SNavdeep Parhar 	struct rss_config *rss_conf;
1617f856f099SNavdeep Parhar 	int rc;
1618f856f099SNavdeep Parhar 	u32 size;
1619f856f099SNavdeep Parhar 
1620f856f099SNavdeep Parhar 	size = sizeof(struct rss_config);
1621f856f099SNavdeep Parhar 
1622f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, size, &scratch_buff);
1623f856f099SNavdeep Parhar 	if (rc)
1624f856f099SNavdeep Parhar 		goto err;
1625f856f099SNavdeep Parhar 
1626f856f099SNavdeep Parhar 	rss_conf =  (struct rss_config *)scratch_buff.data;
1627f856f099SNavdeep Parhar 
1628f856f099SNavdeep Parhar 	rss_conf->tp_rssconf = t4_read_reg(padap, A_TP_RSS_CONFIG);
1629f856f099SNavdeep Parhar 	rss_conf->tp_rssconf_tnl = t4_read_reg(padap, A_TP_RSS_CONFIG_TNL);
1630f856f099SNavdeep Parhar 	rss_conf->tp_rssconf_ofd = t4_read_reg(padap, A_TP_RSS_CONFIG_OFD);
1631f856f099SNavdeep Parhar 	rss_conf->tp_rssconf_syn = t4_read_reg(padap, A_TP_RSS_CONFIG_SYN);
1632f856f099SNavdeep Parhar 	rss_conf->tp_rssconf_vrt = t4_read_reg(padap, A_TP_RSS_CONFIG_VRT);
1633f856f099SNavdeep Parhar 	rss_conf->tp_rssconf_cng = t4_read_reg(padap, A_TP_RSS_CONFIG_CNG);
1634f856f099SNavdeep Parhar 	rss_conf->chip = padap->params.chipid;
1635f856f099SNavdeep Parhar 
1636f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
1637f856f099SNavdeep Parhar 	if (rc)
1638f856f099SNavdeep Parhar 		goto err1;
1639f856f099SNavdeep Parhar 
1640f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
1641f856f099SNavdeep Parhar 
1642f856f099SNavdeep Parhar err1:
1643f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
1644f856f099SNavdeep Parhar err:
1645f856f099SNavdeep Parhar 	return rc;
1646f856f099SNavdeep Parhar }
1647f856f099SNavdeep Parhar 
collect_rss_vf_config(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)1648f856f099SNavdeep Parhar static int collect_rss_vf_config(struct cudbg_init *pdbg_init,
1649f856f099SNavdeep Parhar 				 struct cudbg_buffer *dbg_buff,
1650f856f099SNavdeep Parhar 				 struct cudbg_error *cudbg_err)
1651f856f099SNavdeep Parhar {
1652f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
1653f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
1654f856f099SNavdeep Parhar 	struct rss_vf_conf *vfconf;
1655f856f099SNavdeep Parhar 	int vf, rc, vf_count;
1656f856f099SNavdeep Parhar 	u32 size;
1657f856f099SNavdeep Parhar 
1658f856f099SNavdeep Parhar 	vf_count = padap->chip_params->vfcount;
1659f856f099SNavdeep Parhar 	size = vf_count * sizeof(*vfconf);
1660f856f099SNavdeep Parhar 
1661f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, size, &scratch_buff);
1662f856f099SNavdeep Parhar 	if (rc)
1663f856f099SNavdeep Parhar 		goto err;
1664f856f099SNavdeep Parhar 
1665f856f099SNavdeep Parhar 	vfconf =  (struct rss_vf_conf *)scratch_buff.data;
1666f856f099SNavdeep Parhar 
1667f856f099SNavdeep Parhar 	for (vf = 0; vf < vf_count; vf++) {
1668f856f099SNavdeep Parhar 		t4_read_rss_vf_config(padap, vf, &vfconf[vf].rss_vf_vfl,
1669f856f099SNavdeep Parhar 				      &vfconf[vf].rss_vf_vfh, 1);
1670f856f099SNavdeep Parhar 	}
1671f856f099SNavdeep Parhar 
1672f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
1673f856f099SNavdeep Parhar 	if (rc)
1674f856f099SNavdeep Parhar 		goto err1;
1675f856f099SNavdeep Parhar 
1676f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
1677f856f099SNavdeep Parhar 
1678f856f099SNavdeep Parhar err1:
1679f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
1680f856f099SNavdeep Parhar err:
1681f856f099SNavdeep Parhar 	return rc;
1682f856f099SNavdeep Parhar }
1683f856f099SNavdeep Parhar 
collect_rss_pf_config(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)1684f856f099SNavdeep Parhar static int collect_rss_pf_config(struct cudbg_init *pdbg_init,
1685f856f099SNavdeep Parhar 				 struct cudbg_buffer *dbg_buff,
1686f856f099SNavdeep Parhar 				 struct cudbg_error *cudbg_err)
1687f856f099SNavdeep Parhar {
1688f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
1689f856f099SNavdeep Parhar 	struct rss_pf_conf *pfconf;
1690f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
1691f856f099SNavdeep Parhar 	u32 rss_pf_map, rss_pf_mask, size;
1692f856f099SNavdeep Parhar 	int pf, rc;
1693f856f099SNavdeep Parhar 
1694f856f099SNavdeep Parhar 	size = 8  * sizeof(*pfconf);
1695f856f099SNavdeep Parhar 
1696f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, size, &scratch_buff);
1697f856f099SNavdeep Parhar 	if (rc)
1698f856f099SNavdeep Parhar 		goto err;
1699f856f099SNavdeep Parhar 
1700f856f099SNavdeep Parhar 	pfconf =  (struct rss_pf_conf *)scratch_buff.data;
1701f856f099SNavdeep Parhar 
1702f856f099SNavdeep Parhar 	rss_pf_map = t4_read_rss_pf_map(padap, 1);
1703f856f099SNavdeep Parhar 	rss_pf_mask = t4_read_rss_pf_mask(padap, 1);
1704f856f099SNavdeep Parhar 
1705f856f099SNavdeep Parhar 	for (pf = 0; pf < 8; pf++) {
1706f856f099SNavdeep Parhar 		pfconf[pf].rss_pf_map = rss_pf_map;
1707f856f099SNavdeep Parhar 		pfconf[pf].rss_pf_mask = rss_pf_mask;
1708f856f099SNavdeep Parhar 		/* no return val */
1709f856f099SNavdeep Parhar 		t4_read_rss_pf_config(padap, pf, &pfconf[pf].rss_pf_config, 1);
1710f856f099SNavdeep Parhar 	}
1711f856f099SNavdeep Parhar 
1712f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
1713f856f099SNavdeep Parhar 	if (rc)
1714f856f099SNavdeep Parhar 		goto err1;
1715f856f099SNavdeep Parhar 
1716f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
1717f856f099SNavdeep Parhar err1:
1718f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
1719f856f099SNavdeep Parhar err:
1720f856f099SNavdeep Parhar 	return rc;
1721f856f099SNavdeep Parhar }
1722f856f099SNavdeep Parhar 
check_valid(u32 * buf,int type)1723f856f099SNavdeep Parhar static int check_valid(u32 *buf, int type)
1724f856f099SNavdeep Parhar {
1725f856f099SNavdeep Parhar 	int index;
1726f856f099SNavdeep Parhar 	int bit;
1727f856f099SNavdeep Parhar 	int bit_pos = 0;
1728f856f099SNavdeep Parhar 
1729f856f099SNavdeep Parhar 	switch (type) {
1730f856f099SNavdeep Parhar 	case CTXT_EGRESS:
1731f856f099SNavdeep Parhar 		bit_pos = 176;
1732f856f099SNavdeep Parhar 		break;
1733f856f099SNavdeep Parhar 	case CTXT_INGRESS:
1734f856f099SNavdeep Parhar 		bit_pos = 141;
1735f856f099SNavdeep Parhar 		break;
1736f856f099SNavdeep Parhar 	case CTXT_FLM:
1737f856f099SNavdeep Parhar 		bit_pos = 89;
1738f856f099SNavdeep Parhar 		break;
1739f856f099SNavdeep Parhar 	}
1740f856f099SNavdeep Parhar 	index = bit_pos / 32;
1741f856f099SNavdeep Parhar 	bit =  bit_pos % 32;
1742f856f099SNavdeep Parhar 
1743f856f099SNavdeep Parhar 	return buf[index] & (1U << bit);
1744f856f099SNavdeep Parhar }
1745f856f099SNavdeep Parhar 
1746f856f099SNavdeep Parhar /**
1747f856f099SNavdeep Parhar  * Get EGRESS, INGRESS, FLM, and CNM max qid.
1748f856f099SNavdeep Parhar  *
1749f856f099SNavdeep Parhar  * For EGRESS and INGRESS, do the following calculation.
1750f856f099SNavdeep Parhar  * max_qid = (DBQ/IMSG context region size in bytes) /
1751f856f099SNavdeep Parhar  *	     (size of context in bytes).
1752f856f099SNavdeep Parhar  *
1753f856f099SNavdeep Parhar  * For FLM, do the following calculation.
1754f856f099SNavdeep Parhar  * max_qid = (FLM cache region size in bytes) /
1755f856f099SNavdeep Parhar  *	     ((number of pointers cached in EDRAM) * 8 (bytes per pointer)).
1756f856f099SNavdeep Parhar  *
1757f856f099SNavdeep Parhar  * There's a 1-to-1 mapping between FLM and CNM if there's no header splitting
1758f856f099SNavdeep Parhar  * enabled; i.e., max CNM qid is equal to max FLM qid. However, if header
1759f856f099SNavdeep Parhar  * splitting is enabled, then max CNM qid is half of max FLM qid.
1760f856f099SNavdeep Parhar  */
get_max_ctxt_qid(struct adapter * padap,struct struct_meminfo * meminfo,u32 * max_ctx_qid,u8 nelem)1761f856f099SNavdeep Parhar static int get_max_ctxt_qid(struct adapter *padap,
1762f856f099SNavdeep Parhar 			    struct struct_meminfo *meminfo,
1763f856f099SNavdeep Parhar 			    u32 *max_ctx_qid, u8 nelem)
1764f856f099SNavdeep Parhar {
1765f856f099SNavdeep Parhar 	u32 i, idx, found = 0;
1766f856f099SNavdeep Parhar 
1767f856f099SNavdeep Parhar 	if (nelem != (CTXT_CNM + 1))
1768f856f099SNavdeep Parhar 		return -EINVAL;
1769f856f099SNavdeep Parhar 
1770f856f099SNavdeep Parhar 	for (i = 0; i < meminfo->mem_c; i++) {
1771f856f099SNavdeep Parhar 		if (meminfo->mem[i].idx >= ARRAY_SIZE(region))
1772f856f099SNavdeep Parhar 			continue;                        /* skip holes */
1773f856f099SNavdeep Parhar 
1774f856f099SNavdeep Parhar 		idx = meminfo->mem[i].idx;
1775f856f099SNavdeep Parhar 		/* Get DBQ, IMSG, and FLM context region size */
1776f856f099SNavdeep Parhar 		if (idx <= CTXT_FLM) {
1777f856f099SNavdeep Parhar 			if (!(meminfo->mem[i].limit))
1778f856f099SNavdeep Parhar 				meminfo->mem[i].limit =
1779f856f099SNavdeep Parhar 					i < meminfo->mem_c - 1 ?
1780f856f099SNavdeep Parhar 					meminfo->mem[i + 1].base - 1 : ~0;
1781f856f099SNavdeep Parhar 
1782f856f099SNavdeep Parhar 			if (idx < CTXT_FLM) {
1783f856f099SNavdeep Parhar 				/* Get EGRESS and INGRESS max qid. */
1784f856f099SNavdeep Parhar 				max_ctx_qid[idx] = (meminfo->mem[i].limit -
1785f856f099SNavdeep Parhar 						    meminfo->mem[i].base + 1) /
1786f856f099SNavdeep Parhar 						   CUDBG_CTXT_SIZE_BYTES;
1787f856f099SNavdeep Parhar 				found++;
1788f856f099SNavdeep Parhar 			} else {
1789f856f099SNavdeep Parhar 				/* Get FLM and CNM max qid. */
1790f856f099SNavdeep Parhar 				u32 value, edram_ptr_count;
1791f856f099SNavdeep Parhar 				u8 bytes_per_ptr = 8;
1792f856f099SNavdeep Parhar 				u8 nohdr;
1793f856f099SNavdeep Parhar 
1794f856f099SNavdeep Parhar 				value = t4_read_reg(padap, A_SGE_FLM_CFG);
1795f856f099SNavdeep Parhar 
1796f856f099SNavdeep Parhar 				/* Check if header splitting is enabled. */
1797f856f099SNavdeep Parhar 				nohdr = (value >> S_NOHDR) & 1U;
1798f856f099SNavdeep Parhar 
1799f856f099SNavdeep Parhar 				/* Get the number of pointers in EDRAM per
1800f856f099SNavdeep Parhar 				 * qid in units of 32.
1801f856f099SNavdeep Parhar 				 */
1802f856f099SNavdeep Parhar 				edram_ptr_count = 32 *
1803f856f099SNavdeep Parhar 						  (1U << G_EDRAMPTRCNT(value));
1804f856f099SNavdeep Parhar 
1805f856f099SNavdeep Parhar 				/* EDRAMPTRCNT value of 3 is reserved.
1806f856f099SNavdeep Parhar 				 * So don't exceed 128.
1807f856f099SNavdeep Parhar 				 */
1808f856f099SNavdeep Parhar 				if (edram_ptr_count > 128)
1809f856f099SNavdeep Parhar 					edram_ptr_count = 128;
1810f856f099SNavdeep Parhar 
1811f856f099SNavdeep Parhar 				max_ctx_qid[idx] = (meminfo->mem[i].limit -
1812f856f099SNavdeep Parhar 						    meminfo->mem[i].base + 1) /
1813f856f099SNavdeep Parhar 						   (edram_ptr_count *
1814f856f099SNavdeep Parhar 						    bytes_per_ptr);
1815f856f099SNavdeep Parhar 				found++;
1816f856f099SNavdeep Parhar 
1817f856f099SNavdeep Parhar 				/* CNM has 1-to-1 mapping with FLM.
1818f856f099SNavdeep Parhar 				 * However, if header splitting is enabled,
1819f856f099SNavdeep Parhar 				 * then max CNM qid is half of max FLM qid.
1820f856f099SNavdeep Parhar 				 */
1821f856f099SNavdeep Parhar 				max_ctx_qid[CTXT_CNM] = nohdr ?
1822f856f099SNavdeep Parhar 							max_ctx_qid[idx] :
1823f856f099SNavdeep Parhar 							max_ctx_qid[idx] >> 1;
1824f856f099SNavdeep Parhar 
1825f856f099SNavdeep Parhar 				/* One more increment for CNM */
1826f856f099SNavdeep Parhar 				found++;
1827f856f099SNavdeep Parhar 			}
1828f856f099SNavdeep Parhar 		}
1829f856f099SNavdeep Parhar 		if (found == nelem)
1830f856f099SNavdeep Parhar 			break;
1831f856f099SNavdeep Parhar 	}
1832f856f099SNavdeep Parhar 
1833f856f099SNavdeep Parhar 	/* Sanity check. Ensure the values are within known max. */
1834f856f099SNavdeep Parhar 	max_ctx_qid[CTXT_EGRESS] = min_t(u32, max_ctx_qid[CTXT_EGRESS],
1835f856f099SNavdeep Parhar 					 M_CTXTQID);
1836f856f099SNavdeep Parhar 	max_ctx_qid[CTXT_INGRESS] = min_t(u32, max_ctx_qid[CTXT_INGRESS],
1837f856f099SNavdeep Parhar 					  CUDBG_MAX_INGRESS_QIDS);
1838f856f099SNavdeep Parhar 	max_ctx_qid[CTXT_FLM] = min_t(u32, max_ctx_qid[CTXT_FLM],
1839f856f099SNavdeep Parhar 				      CUDBG_MAX_FL_QIDS);
1840f856f099SNavdeep Parhar 	max_ctx_qid[CTXT_CNM] = min_t(u32, max_ctx_qid[CTXT_CNM],
1841f856f099SNavdeep Parhar 				      CUDBG_MAX_CNM_QIDS);
1842f856f099SNavdeep Parhar 	return 0;
1843f856f099SNavdeep Parhar }
1844f856f099SNavdeep Parhar 
collect_dump_context(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)1845f856f099SNavdeep Parhar static int collect_dump_context(struct cudbg_init *pdbg_init,
1846f856f099SNavdeep Parhar 				struct cudbg_buffer *dbg_buff,
1847f856f099SNavdeep Parhar 				struct cudbg_error *cudbg_err)
1848f856f099SNavdeep Parhar {
1849f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
1850f856f099SNavdeep Parhar 	struct cudbg_buffer temp_buff;
1851f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
1852f856f099SNavdeep Parhar 	u32 size = 0, next_offset = 0, total_size = 0;
1853f856f099SNavdeep Parhar 	struct cudbg_ch_cntxt *buff = NULL;
1854f856f099SNavdeep Parhar 	struct struct_meminfo meminfo;
1855f856f099SNavdeep Parhar 	int bytes = 0;
1856f856f099SNavdeep Parhar 	int rc = 0;
1857f856f099SNavdeep Parhar 	u32 i, j;
1858f856f099SNavdeep Parhar 	u32 max_ctx_qid[CTXT_CNM + 1];
1859f856f099SNavdeep Parhar 	bool limit_qid = false;
1860f856f099SNavdeep Parhar 	u32 qid_count = 0;
1861f856f099SNavdeep Parhar 
1862f856f099SNavdeep Parhar 	rc = fill_meminfo(padap, &meminfo);
1863f856f099SNavdeep Parhar 	if (rc)
1864f856f099SNavdeep Parhar 		goto err;
1865f856f099SNavdeep Parhar 
1866f856f099SNavdeep Parhar 	/* Get max valid qid for each type of queue */
1867f856f099SNavdeep Parhar 	rc = get_max_ctxt_qid(padap, &meminfo, max_ctx_qid, CTXT_CNM + 1);
1868f856f099SNavdeep Parhar 	if (rc)
1869f856f099SNavdeep Parhar 		goto err;
1870f856f099SNavdeep Parhar 
1871f856f099SNavdeep Parhar 	/* There are four types of queues. Collect context upto max
1872f856f099SNavdeep Parhar 	 * qid of each type of queue.
1873f856f099SNavdeep Parhar 	 */
1874f856f099SNavdeep Parhar 	for (i = CTXT_EGRESS; i <= CTXT_CNM; i++)
1875f856f099SNavdeep Parhar 		size += sizeof(struct cudbg_ch_cntxt) * max_ctx_qid[i];
1876f856f099SNavdeep Parhar 
1877f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, size, &scratch_buff);
1878f856f099SNavdeep Parhar 	if (rc == CUDBG_STATUS_NO_SCRATCH_MEM) {
1879f856f099SNavdeep Parhar 		/* Not enough scratch Memory available.
1880f856f099SNavdeep Parhar 		 * Collect context of at least CUDBG_LOWMEM_MAX_CTXT_QIDS
1881f856f099SNavdeep Parhar 		 * for each queue type.
1882f856f099SNavdeep Parhar 		 */
1883f856f099SNavdeep Parhar 		size = 0;
1884f856f099SNavdeep Parhar 		for (i = CTXT_EGRESS; i <= CTXT_CNM; i++)
1885f856f099SNavdeep Parhar 			size += sizeof(struct cudbg_ch_cntxt) *
1886f856f099SNavdeep Parhar 				CUDBG_LOWMEM_MAX_CTXT_QIDS;
1887f856f099SNavdeep Parhar 
1888f856f099SNavdeep Parhar 		limit_qid = true;
1889f856f099SNavdeep Parhar 		rc = get_scratch_buff(dbg_buff, size, &scratch_buff);
1890f856f099SNavdeep Parhar 		if (rc)
1891f856f099SNavdeep Parhar 			goto err;
1892f856f099SNavdeep Parhar 	}
1893f856f099SNavdeep Parhar 
1894f856f099SNavdeep Parhar 	buff = (struct cudbg_ch_cntxt *)scratch_buff.data;
1895f856f099SNavdeep Parhar 
1896f856f099SNavdeep Parhar 	/* Collect context data */
1897f856f099SNavdeep Parhar 	for (i = CTXT_EGRESS; i <= CTXT_FLM; i++) {
1898f856f099SNavdeep Parhar 		qid_count = 0;
1899f856f099SNavdeep Parhar 		for (j = 0; j < max_ctx_qid[i]; j++) {
1900f856f099SNavdeep Parhar 			read_sge_ctxt(pdbg_init, j, i, buff->data);
1901f856f099SNavdeep Parhar 
1902f856f099SNavdeep Parhar 			rc = check_valid(buff->data, i);
1903f856f099SNavdeep Parhar 			if (rc) {
1904f856f099SNavdeep Parhar 				buff->cntxt_type = i;
1905f856f099SNavdeep Parhar 				buff->cntxt_id = j;
1906f856f099SNavdeep Parhar 				buff++;
1907f856f099SNavdeep Parhar 				total_size += sizeof(struct cudbg_ch_cntxt);
1908f856f099SNavdeep Parhar 
1909f856f099SNavdeep Parhar 				if (i == CTXT_FLM) {
1910f856f099SNavdeep Parhar 					read_sge_ctxt(pdbg_init, j, CTXT_CNM,
1911f856f099SNavdeep Parhar 						      buff->data);
1912f856f099SNavdeep Parhar 					buff->cntxt_type = CTXT_CNM;
1913f856f099SNavdeep Parhar 					buff->cntxt_id = j;
1914f856f099SNavdeep Parhar 					buff++;
1915f856f099SNavdeep Parhar 					total_size +=
1916f856f099SNavdeep Parhar 						sizeof(struct cudbg_ch_cntxt);
1917f856f099SNavdeep Parhar 				}
1918f856f099SNavdeep Parhar 				qid_count++;
1919f856f099SNavdeep Parhar 			}
1920f856f099SNavdeep Parhar 
1921f856f099SNavdeep Parhar 			/* If there's not enough space to collect more qids,
1922f856f099SNavdeep Parhar 			 * then bail and move on to next queue type.
1923f856f099SNavdeep Parhar 			 */
1924f856f099SNavdeep Parhar 			if (limit_qid &&
1925f856f099SNavdeep Parhar 			    qid_count >= CUDBG_LOWMEM_MAX_CTXT_QIDS)
1926f856f099SNavdeep Parhar 				break;
1927f856f099SNavdeep Parhar 		}
1928f856f099SNavdeep Parhar 	}
1929f856f099SNavdeep Parhar 
1930f856f099SNavdeep Parhar 	scratch_buff.size = total_size;
1931f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
1932f856f099SNavdeep Parhar 	if (rc)
1933f856f099SNavdeep Parhar 		goto err1;
1934f856f099SNavdeep Parhar 
1935f856f099SNavdeep Parhar 	/* Splitting buffer and writing in terms of CUDBG_CHUNK_SIZE */
1936f856f099SNavdeep Parhar 	while (total_size > 0) {
1937f856f099SNavdeep Parhar 		bytes = min_t(unsigned long, (unsigned long)total_size,
1938f856f099SNavdeep Parhar 			      (unsigned long)CUDBG_CHUNK_SIZE);
1939f856f099SNavdeep Parhar 		temp_buff.size = bytes;
1940f856f099SNavdeep Parhar 		temp_buff.data = (void *)((char *)scratch_buff.data +
1941f856f099SNavdeep Parhar 					  next_offset);
1942f856f099SNavdeep Parhar 
1943f856f099SNavdeep Parhar 		rc = compress_buff(&temp_buff, dbg_buff);
1944f856f099SNavdeep Parhar 		if (rc)
1945f856f099SNavdeep Parhar 			goto err1;
1946f856f099SNavdeep Parhar 
1947f856f099SNavdeep Parhar 		total_size -= bytes;
1948f856f099SNavdeep Parhar 		next_offset += bytes;
1949f856f099SNavdeep Parhar 	}
1950f856f099SNavdeep Parhar 
1951f856f099SNavdeep Parhar err1:
1952f856f099SNavdeep Parhar 	scratch_buff.size = size;
1953f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
1954f856f099SNavdeep Parhar err:
1955f856f099SNavdeep Parhar 	return rc;
1956f856f099SNavdeep Parhar }
1957f856f099SNavdeep Parhar 
collect_fw_devlog(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)1958f856f099SNavdeep Parhar static int collect_fw_devlog(struct cudbg_init *pdbg_init,
1959f856f099SNavdeep Parhar 			     struct cudbg_buffer *dbg_buff,
1960f856f099SNavdeep Parhar 			     struct cudbg_error *cudbg_err)
1961f856f099SNavdeep Parhar {
1962f856f099SNavdeep Parhar #ifdef notyet
1963f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
1964f856f099SNavdeep Parhar 	struct devlog_params *dparams = &padap->params.devlog;
1965f856f099SNavdeep Parhar 	struct cudbg_param *params = NULL;
1966f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
1967f856f099SNavdeep Parhar 	u32 offset;
1968f856f099SNavdeep Parhar 	int rc = 0, i;
1969f856f099SNavdeep Parhar 
1970f856f099SNavdeep Parhar 	rc = t4_init_devlog_params(padap, 1);
1971f856f099SNavdeep Parhar 
1972f856f099SNavdeep Parhar 	if (rc < 0) {
1973f856f099SNavdeep Parhar 		pdbg_init->print("%s(), t4_init_devlog_params failed!, rc: "\
1974f856f099SNavdeep Parhar 				 "%d\n", __func__, rc);
1975f856f099SNavdeep Parhar 		for (i = 0; i < pdbg_init->dbg_params_cnt; i++) {
1976f856f099SNavdeep Parhar 			if (pdbg_init->dbg_params[i].param_type ==
1977f856f099SNavdeep Parhar 			    CUDBG_DEVLOG_PARAM) {
1978f856f099SNavdeep Parhar 				params = &pdbg_init->dbg_params[i];
1979f856f099SNavdeep Parhar 				break;
1980f856f099SNavdeep Parhar 			}
1981f856f099SNavdeep Parhar 		}
1982f856f099SNavdeep Parhar 
1983f856f099SNavdeep Parhar 		if (params) {
1984f856f099SNavdeep Parhar 			dparams->memtype = params->u.devlog_param.memtype;
1985f856f099SNavdeep Parhar 			dparams->start = params->u.devlog_param.start;
1986f856f099SNavdeep Parhar 			dparams->size = params->u.devlog_param.size;
1987f856f099SNavdeep Parhar 		} else {
1988f856f099SNavdeep Parhar 			cudbg_err->sys_err = rc;
1989f856f099SNavdeep Parhar 			goto err;
1990f856f099SNavdeep Parhar 		}
1991f856f099SNavdeep Parhar 	}
1992f856f099SNavdeep Parhar 
1993f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, dparams->size, &scratch_buff);
1994f856f099SNavdeep Parhar 
1995f856f099SNavdeep Parhar 	if (rc)
1996f856f099SNavdeep Parhar 		goto err;
1997f856f099SNavdeep Parhar 
1998f856f099SNavdeep Parhar 	/* Collect FW devlog */
1999f856f099SNavdeep Parhar 	if (dparams->start != 0) {
2000f856f099SNavdeep Parhar 		offset = scratch_buff.offset;
2001f856f099SNavdeep Parhar 		rc = t4_memory_rw(padap, padap->params.drv_memwin,
2002f856f099SNavdeep Parhar 				  dparams->memtype, dparams->start,
2003f856f099SNavdeep Parhar 				  dparams->size,
2004f856f099SNavdeep Parhar 				  (__be32 *)((char *)scratch_buff.data +
2005f856f099SNavdeep Parhar 					     offset), 1);
2006f856f099SNavdeep Parhar 
2007f856f099SNavdeep Parhar 		if (rc) {
2008f856f099SNavdeep Parhar 			pdbg_init->print("%s(), t4_memory_rw failed!, rc: "\
2009f856f099SNavdeep Parhar 					 "%d\n", __func__, rc);
2010f856f099SNavdeep Parhar 			cudbg_err->sys_err = rc;
2011f856f099SNavdeep Parhar 			goto err1;
2012f856f099SNavdeep Parhar 		}
2013f856f099SNavdeep Parhar 	}
2014f856f099SNavdeep Parhar 
2015f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
2016f856f099SNavdeep Parhar 
2017f856f099SNavdeep Parhar 	if (rc)
2018f856f099SNavdeep Parhar 		goto err1;
2019f856f099SNavdeep Parhar 
2020f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
2021f856f099SNavdeep Parhar 
2022f856f099SNavdeep Parhar err1:
2023f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
2024f856f099SNavdeep Parhar err:
2025f856f099SNavdeep Parhar 	return rc;
2026f856f099SNavdeep Parhar #endif
20276cc4520bSNavdeep Parhar 	return (CUDBG_STATUS_NOT_IMPLEMENTED);
2028f856f099SNavdeep Parhar }
2029f856f099SNavdeep Parhar /* CIM OBQ */
2030f856f099SNavdeep Parhar 
collect_cim_obq_ulp0(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)2031f856f099SNavdeep Parhar static int collect_cim_obq_ulp0(struct cudbg_init *pdbg_init,
2032f856f099SNavdeep Parhar 				struct cudbg_buffer *dbg_buff,
2033f856f099SNavdeep Parhar 				struct cudbg_error *cudbg_err)
2034f856f099SNavdeep Parhar {
2035f856f099SNavdeep Parhar 	int rc = 0, qid = 0;
2036f856f099SNavdeep Parhar 
2037f856f099SNavdeep Parhar 	rc = read_cim_obq(pdbg_init, dbg_buff, cudbg_err, qid);
2038f856f099SNavdeep Parhar 
2039f856f099SNavdeep Parhar 	return rc;
2040f856f099SNavdeep Parhar }
2041f856f099SNavdeep Parhar 
collect_cim_obq_ulp1(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)2042f856f099SNavdeep Parhar static int collect_cim_obq_ulp1(struct cudbg_init *pdbg_init,
2043f856f099SNavdeep Parhar 				struct cudbg_buffer *dbg_buff,
2044f856f099SNavdeep Parhar 				struct cudbg_error *cudbg_err)
2045f856f099SNavdeep Parhar {
2046f856f099SNavdeep Parhar 	int rc = 0, qid = 1;
2047f856f099SNavdeep Parhar 
2048f856f099SNavdeep Parhar 	rc = read_cim_obq(pdbg_init, dbg_buff, cudbg_err, qid);
2049f856f099SNavdeep Parhar 
2050f856f099SNavdeep Parhar 	return rc;
2051f856f099SNavdeep Parhar }
2052f856f099SNavdeep Parhar 
collect_cim_obq_ulp2(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)2053f856f099SNavdeep Parhar static int collect_cim_obq_ulp2(struct cudbg_init *pdbg_init,
2054f856f099SNavdeep Parhar 				struct cudbg_buffer *dbg_buff,
2055f856f099SNavdeep Parhar 				struct cudbg_error *cudbg_err)
2056f856f099SNavdeep Parhar {
2057f856f099SNavdeep Parhar 	int rc = 0, qid = 2;
2058f856f099SNavdeep Parhar 
2059f856f099SNavdeep Parhar 	rc = read_cim_obq(pdbg_init, dbg_buff, cudbg_err, qid);
2060f856f099SNavdeep Parhar 
2061f856f099SNavdeep Parhar 	return rc;
2062f856f099SNavdeep Parhar }
2063f856f099SNavdeep Parhar 
collect_cim_obq_ulp3(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)2064f856f099SNavdeep Parhar static int collect_cim_obq_ulp3(struct cudbg_init *pdbg_init,
2065f856f099SNavdeep Parhar 				struct cudbg_buffer *dbg_buff,
2066f856f099SNavdeep Parhar 				struct cudbg_error *cudbg_err)
2067f856f099SNavdeep Parhar {
2068f856f099SNavdeep Parhar 	int rc = 0, qid = 3;
2069f856f099SNavdeep Parhar 
2070f856f099SNavdeep Parhar 	rc = read_cim_obq(pdbg_init, dbg_buff, cudbg_err, qid);
2071f856f099SNavdeep Parhar 
2072f856f099SNavdeep Parhar 	return rc;
2073f856f099SNavdeep Parhar }
2074f856f099SNavdeep Parhar 
collect_cim_obq_sge(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)2075f856f099SNavdeep Parhar static int collect_cim_obq_sge(struct cudbg_init *pdbg_init,
2076f856f099SNavdeep Parhar 			       struct cudbg_buffer *dbg_buff,
2077f856f099SNavdeep Parhar 			       struct cudbg_error *cudbg_err)
2078f856f099SNavdeep Parhar {
2079f856f099SNavdeep Parhar 	int rc = 0, qid = 4;
2080f856f099SNavdeep Parhar 
2081f856f099SNavdeep Parhar 	rc = read_cim_obq(pdbg_init, dbg_buff, cudbg_err, qid);
2082f856f099SNavdeep Parhar 
2083f856f099SNavdeep Parhar 	return rc;
2084f856f099SNavdeep Parhar }
2085f856f099SNavdeep Parhar 
collect_cim_obq_ncsi(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)2086f856f099SNavdeep Parhar static int collect_cim_obq_ncsi(struct cudbg_init *pdbg_init,
2087f856f099SNavdeep Parhar 				struct cudbg_buffer *dbg_buff,
2088f856f099SNavdeep Parhar 				struct cudbg_error *cudbg_err)
2089f856f099SNavdeep Parhar {
2090f856f099SNavdeep Parhar 	int rc = 0, qid = 5;
2091f856f099SNavdeep Parhar 
2092f856f099SNavdeep Parhar 	rc = read_cim_obq(pdbg_init, dbg_buff, cudbg_err, qid);
2093f856f099SNavdeep Parhar 
2094f856f099SNavdeep Parhar 	return rc;
2095f856f099SNavdeep Parhar }
2096f856f099SNavdeep Parhar 
collect_obq_sge_rx_q0(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)2097f856f099SNavdeep Parhar static int collect_obq_sge_rx_q0(struct cudbg_init *pdbg_init,
2098f856f099SNavdeep Parhar 				 struct cudbg_buffer *dbg_buff,
2099f856f099SNavdeep Parhar 				 struct cudbg_error *cudbg_err)
2100f856f099SNavdeep Parhar {
2101f856f099SNavdeep Parhar 	int rc = 0, qid = 6;
2102f856f099SNavdeep Parhar 
2103f856f099SNavdeep Parhar 	rc = read_cim_obq(pdbg_init, dbg_buff, cudbg_err, qid);
2104f856f099SNavdeep Parhar 
2105f856f099SNavdeep Parhar 	return rc;
2106f856f099SNavdeep Parhar }
2107f856f099SNavdeep Parhar 
collect_obq_sge_rx_q1(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)2108f856f099SNavdeep Parhar static int collect_obq_sge_rx_q1(struct cudbg_init *pdbg_init,
2109f856f099SNavdeep Parhar 				 struct cudbg_buffer *dbg_buff,
2110f856f099SNavdeep Parhar 				 struct cudbg_error *cudbg_err)
2111f856f099SNavdeep Parhar {
2112f856f099SNavdeep Parhar 	int rc = 0, qid = 7;
2113f856f099SNavdeep Parhar 
2114f856f099SNavdeep Parhar 	rc = read_cim_obq(pdbg_init, dbg_buff, cudbg_err, qid);
2115f856f099SNavdeep Parhar 
2116f856f099SNavdeep Parhar 	return rc;
2117f856f099SNavdeep Parhar }
2118f856f099SNavdeep Parhar 
read_cim_obq(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err,int qid)2119f856f099SNavdeep Parhar static int read_cim_obq(struct cudbg_init *pdbg_init,
2120f856f099SNavdeep Parhar 			struct cudbg_buffer *dbg_buff,
2121f856f099SNavdeep Parhar 			struct cudbg_error *cudbg_err, int qid)
2122f856f099SNavdeep Parhar {
2123f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
2124f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
2125f856f099SNavdeep Parhar 	u32 qsize;
2126f856f099SNavdeep Parhar 	int rc;
2127f856f099SNavdeep Parhar 	int no_of_read_words;
2128f856f099SNavdeep Parhar 
2129f856f099SNavdeep Parhar 	/* collect CIM OBQ */
2130f856f099SNavdeep Parhar 	qsize =  6 * CIM_OBQ_SIZE * 4 *  sizeof(u32);
2131f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, qsize, &scratch_buff);
2132f856f099SNavdeep Parhar 	if (rc)
2133f856f099SNavdeep Parhar 		goto err;
2134f856f099SNavdeep Parhar 
2135f856f099SNavdeep Parhar 	/* t4_read_cim_obq will return no. of read words or error */
2136f856f099SNavdeep Parhar 	no_of_read_words = t4_read_cim_obq(padap, qid,
2137f856f099SNavdeep Parhar 					   (u32 *)((u32 *)scratch_buff.data +
2138f856f099SNavdeep Parhar 					   scratch_buff.offset), qsize);
2139f856f099SNavdeep Parhar 
2140f856f099SNavdeep Parhar 	/* no_of_read_words is less than or equal to 0 means error */
2141f856f099SNavdeep Parhar 	if (no_of_read_words <= 0) {
2142f856f099SNavdeep Parhar 		if (no_of_read_words == 0)
2143f856f099SNavdeep Parhar 			rc = CUDBG_SYSTEM_ERROR;
2144f856f099SNavdeep Parhar 		else
2145f856f099SNavdeep Parhar 			rc = no_of_read_words;
2146f856f099SNavdeep Parhar 		if (pdbg_init->verbose)
2147f856f099SNavdeep Parhar 			pdbg_init->print("%s: t4_read_cim_obq failed (%d)\n",
2148f856f099SNavdeep Parhar 				 __func__, rc);
2149f856f099SNavdeep Parhar 		cudbg_err->sys_err = rc;
2150f856f099SNavdeep Parhar 		goto err1;
2151f856f099SNavdeep Parhar 	}
2152f856f099SNavdeep Parhar 
2153f856f099SNavdeep Parhar 	scratch_buff.size = no_of_read_words * 4;
2154f856f099SNavdeep Parhar 
2155f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
2156f856f099SNavdeep Parhar 
2157f856f099SNavdeep Parhar 	if (rc)
2158f856f099SNavdeep Parhar 		goto err1;
2159f856f099SNavdeep Parhar 
2160f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
2161f856f099SNavdeep Parhar 
2162f856f099SNavdeep Parhar 	if (rc)
2163f856f099SNavdeep Parhar 		goto err1;
2164f856f099SNavdeep Parhar 
2165f856f099SNavdeep Parhar err1:
2166f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
2167f856f099SNavdeep Parhar err:
2168f856f099SNavdeep Parhar 	return rc;
2169f856f099SNavdeep Parhar }
2170f856f099SNavdeep Parhar 
2171f856f099SNavdeep Parhar /* CIM IBQ */
2172f856f099SNavdeep Parhar 
collect_cim_ibq_tp0(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)2173f856f099SNavdeep Parhar static int collect_cim_ibq_tp0(struct cudbg_init *pdbg_init,
2174f856f099SNavdeep Parhar 			       struct cudbg_buffer *dbg_buff,
2175f856f099SNavdeep Parhar 			       struct cudbg_error *cudbg_err)
2176f856f099SNavdeep Parhar {
2177f856f099SNavdeep Parhar 	int rc = 0, qid = 0;
2178f856f099SNavdeep Parhar 
2179f856f099SNavdeep Parhar 	rc = read_cim_ibq(pdbg_init, dbg_buff, cudbg_err, qid);
2180f856f099SNavdeep Parhar 	return rc;
2181f856f099SNavdeep Parhar }
2182f856f099SNavdeep Parhar 
collect_cim_ibq_tp1(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)2183f856f099SNavdeep Parhar static int collect_cim_ibq_tp1(struct cudbg_init *pdbg_init,
2184f856f099SNavdeep Parhar 			       struct cudbg_buffer *dbg_buff,
2185f856f099SNavdeep Parhar 			       struct cudbg_error *cudbg_err)
2186f856f099SNavdeep Parhar {
2187f856f099SNavdeep Parhar 	int rc = 0, qid = 1;
2188f856f099SNavdeep Parhar 
2189f856f099SNavdeep Parhar 	rc = read_cim_ibq(pdbg_init, dbg_buff, cudbg_err, qid);
2190f856f099SNavdeep Parhar 	return rc;
2191f856f099SNavdeep Parhar }
2192f856f099SNavdeep Parhar 
collect_cim_ibq_ulp(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)2193f856f099SNavdeep Parhar static int collect_cim_ibq_ulp(struct cudbg_init *pdbg_init,
2194f856f099SNavdeep Parhar 			       struct cudbg_buffer *dbg_buff,
2195f856f099SNavdeep Parhar 			       struct cudbg_error *cudbg_err)
2196f856f099SNavdeep Parhar {
2197f856f099SNavdeep Parhar 	int rc = 0, qid = 2;
2198f856f099SNavdeep Parhar 
2199f856f099SNavdeep Parhar 	rc = read_cim_ibq(pdbg_init, dbg_buff, cudbg_err, qid);
2200f856f099SNavdeep Parhar 	return rc;
2201f856f099SNavdeep Parhar }
2202f856f099SNavdeep Parhar 
collect_cim_ibq_sge0(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)2203f856f099SNavdeep Parhar static int collect_cim_ibq_sge0(struct cudbg_init *pdbg_init,
2204f856f099SNavdeep Parhar 				struct cudbg_buffer *dbg_buff,
2205f856f099SNavdeep Parhar 				struct cudbg_error *cudbg_err)
2206f856f099SNavdeep Parhar {
2207f856f099SNavdeep Parhar 	int rc = 0, qid = 3;
2208f856f099SNavdeep Parhar 
2209f856f099SNavdeep Parhar 	rc = read_cim_ibq(pdbg_init, dbg_buff, cudbg_err, qid);
2210f856f099SNavdeep Parhar 	return rc;
2211f856f099SNavdeep Parhar }
2212f856f099SNavdeep Parhar 
collect_cim_ibq_sge1(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)2213f856f099SNavdeep Parhar static int collect_cim_ibq_sge1(struct cudbg_init *pdbg_init,
2214f856f099SNavdeep Parhar 				struct cudbg_buffer *dbg_buff,
2215f856f099SNavdeep Parhar 				struct cudbg_error *cudbg_err)
2216f856f099SNavdeep Parhar {
2217f856f099SNavdeep Parhar 	int rc = 0, qid = 4;
2218f856f099SNavdeep Parhar 
2219f856f099SNavdeep Parhar 	rc = read_cim_ibq(pdbg_init, dbg_buff, cudbg_err, qid);
2220f856f099SNavdeep Parhar 	return rc;
2221f856f099SNavdeep Parhar }
2222f856f099SNavdeep Parhar 
collect_cim_ibq_ncsi(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)2223f856f099SNavdeep Parhar static int collect_cim_ibq_ncsi(struct cudbg_init *pdbg_init,
2224f856f099SNavdeep Parhar 				struct cudbg_buffer *dbg_buff,
2225f856f099SNavdeep Parhar 				struct cudbg_error *cudbg_err)
2226f856f099SNavdeep Parhar {
2227f856f099SNavdeep Parhar 	int rc, qid = 5;
2228f856f099SNavdeep Parhar 
2229f856f099SNavdeep Parhar 	rc = read_cim_ibq(pdbg_init, dbg_buff, cudbg_err, qid);
2230f856f099SNavdeep Parhar 	return rc;
2231f856f099SNavdeep Parhar }
2232f856f099SNavdeep Parhar 
read_cim_ibq(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err,int qid)2233f856f099SNavdeep Parhar static int read_cim_ibq(struct cudbg_init *pdbg_init,
2234f856f099SNavdeep Parhar 			struct cudbg_buffer *dbg_buff,
2235f856f099SNavdeep Parhar 			struct cudbg_error *cudbg_err, int qid)
2236f856f099SNavdeep Parhar {
2237f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
2238f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
2239f856f099SNavdeep Parhar 	u32 qsize;
2240f856f099SNavdeep Parhar 	int rc;
2241f856f099SNavdeep Parhar 	int no_of_read_words;
2242f856f099SNavdeep Parhar 
2243f856f099SNavdeep Parhar 	/* collect CIM IBQ */
2244f856f099SNavdeep Parhar 	qsize = CIM_IBQ_SIZE * 4 *  sizeof(u32);
2245f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, qsize, &scratch_buff);
2246f856f099SNavdeep Parhar 
2247f856f099SNavdeep Parhar 	if (rc)
2248f856f099SNavdeep Parhar 		goto err;
2249f856f099SNavdeep Parhar 
2250f856f099SNavdeep Parhar 	/* t4_read_cim_ibq will return no. of read words or error */
2251f856f099SNavdeep Parhar 	no_of_read_words = t4_read_cim_ibq(padap, qid,
2252f856f099SNavdeep Parhar 					   (u32 *)((u32 *)scratch_buff.data +
2253f856f099SNavdeep Parhar 					   scratch_buff.offset), qsize);
2254f856f099SNavdeep Parhar 	/* no_of_read_words is less than or equal to 0 means error */
2255f856f099SNavdeep Parhar 	if (no_of_read_words <= 0) {
2256f856f099SNavdeep Parhar 		if (no_of_read_words == 0)
2257f856f099SNavdeep Parhar 			rc = CUDBG_SYSTEM_ERROR;
2258f856f099SNavdeep Parhar 		else
2259f856f099SNavdeep Parhar 			rc = no_of_read_words;
2260f856f099SNavdeep Parhar 		if (pdbg_init->verbose)
2261f856f099SNavdeep Parhar 			pdbg_init->print("%s: t4_read_cim_ibq failed (%d)\n",
2262f856f099SNavdeep Parhar 				 __func__, rc);
2263f856f099SNavdeep Parhar 		cudbg_err->sys_err = rc;
2264f856f099SNavdeep Parhar 		goto err1;
2265f856f099SNavdeep Parhar 	}
2266f856f099SNavdeep Parhar 
2267f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
2268f856f099SNavdeep Parhar 	if (rc)
2269f856f099SNavdeep Parhar 		goto err1;
2270f856f099SNavdeep Parhar 
2271f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
2272f856f099SNavdeep Parhar 	if (rc)
2273f856f099SNavdeep Parhar 		goto err1;
2274f856f099SNavdeep Parhar 
2275f856f099SNavdeep Parhar err1:
2276f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
2277f856f099SNavdeep Parhar 
2278f856f099SNavdeep Parhar err:
2279f856f099SNavdeep Parhar 	return rc;
2280f856f099SNavdeep Parhar }
2281f856f099SNavdeep Parhar 
collect_cim_ma_la(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)2282f856f099SNavdeep Parhar static int collect_cim_ma_la(struct cudbg_init *pdbg_init,
2283f856f099SNavdeep Parhar 			     struct cudbg_buffer *dbg_buff,
2284f856f099SNavdeep Parhar 			     struct cudbg_error *cudbg_err)
2285f856f099SNavdeep Parhar {
2286f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
2287f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
2288f856f099SNavdeep Parhar 	u32 rc = 0;
2289f856f099SNavdeep Parhar 
2290f856f099SNavdeep Parhar 	/* collect CIM MA LA */
2291f856f099SNavdeep Parhar 	scratch_buff.size =  2 * CIM_MALA_SIZE * 5 * sizeof(u32);
2292f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, scratch_buff.size, &scratch_buff);
2293f856f099SNavdeep Parhar 	if (rc)
2294f856f099SNavdeep Parhar 		goto err;
2295f856f099SNavdeep Parhar 
2296f856f099SNavdeep Parhar 	/* no return */
2297f856f099SNavdeep Parhar 	t4_cim_read_ma_la(padap,
2298f856f099SNavdeep Parhar 			  (u32 *) ((char *)scratch_buff.data +
2299f856f099SNavdeep Parhar 				   scratch_buff.offset),
2300f856f099SNavdeep Parhar 			  (u32 *) ((char *)scratch_buff.data +
2301f856f099SNavdeep Parhar 				   scratch_buff.offset + 5 * CIM_MALA_SIZE));
2302f856f099SNavdeep Parhar 
2303f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
2304f856f099SNavdeep Parhar 	if (rc)
2305f856f099SNavdeep Parhar 		goto err1;
2306f856f099SNavdeep Parhar 
2307f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
2308f856f099SNavdeep Parhar 
2309f856f099SNavdeep Parhar err1:
2310f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
2311f856f099SNavdeep Parhar err:
2312f856f099SNavdeep Parhar 	return rc;
2313f856f099SNavdeep Parhar }
2314f856f099SNavdeep Parhar 
collect_cim_la(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)2315f856f099SNavdeep Parhar static int collect_cim_la(struct cudbg_init *pdbg_init,
2316f856f099SNavdeep Parhar 			  struct cudbg_buffer *dbg_buff,
2317f856f099SNavdeep Parhar 			  struct cudbg_error *cudbg_err)
2318f856f099SNavdeep Parhar {
2319f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
2320f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
2321f856f099SNavdeep Parhar 
2322f856f099SNavdeep Parhar 	int rc;
2323f856f099SNavdeep Parhar 	u32 cfg = 0;
2324f856f099SNavdeep Parhar 	int size;
2325f856f099SNavdeep Parhar 
2326f856f099SNavdeep Parhar 	/* collect CIM LA */
2327f856f099SNavdeep Parhar 	if (is_t6(padap)) {
2328f856f099SNavdeep Parhar 		size = padap->params.cim_la_size / 10 + 1;
2329f856f099SNavdeep Parhar 		size *= 11 * sizeof(u32);
2330f856f099SNavdeep Parhar 	} else {
2331f856f099SNavdeep Parhar 		size = padap->params.cim_la_size / 8;
2332f856f099SNavdeep Parhar 		size *= 8 * sizeof(u32);
2333f856f099SNavdeep Parhar 	}
2334f856f099SNavdeep Parhar 
2335f856f099SNavdeep Parhar 	size += sizeof(cfg);
2336f856f099SNavdeep Parhar 
2337f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, size, &scratch_buff);
2338f856f099SNavdeep Parhar 	if (rc)
2339f856f099SNavdeep Parhar 		goto err;
2340f856f099SNavdeep Parhar 
2341f856f099SNavdeep Parhar 	rc = t4_cim_read(padap, A_UP_UP_DBG_LA_CFG, 1, &cfg);
2342f856f099SNavdeep Parhar 
2343f856f099SNavdeep Parhar 	if (rc) {
2344f856f099SNavdeep Parhar 		if (pdbg_init->verbose)
2345f856f099SNavdeep Parhar 			pdbg_init->print("%s: t4_cim_read failed (%d)\n",
2346f856f099SNavdeep Parhar 				 __func__, rc);
2347f856f099SNavdeep Parhar 		cudbg_err->sys_err = rc;
2348f856f099SNavdeep Parhar 		goto err1;
2349f856f099SNavdeep Parhar 	}
2350f856f099SNavdeep Parhar 
2351f856f099SNavdeep Parhar 	memcpy((char *)scratch_buff.data + scratch_buff.offset, &cfg,
2352f856f099SNavdeep Parhar 	       sizeof(cfg));
2353f856f099SNavdeep Parhar 
2354f856f099SNavdeep Parhar 	rc = t4_cim_read_la(padap,
2355f856f099SNavdeep Parhar 			    (u32 *) ((char *)scratch_buff.data +
2356f856f099SNavdeep Parhar 				     scratch_buff.offset + sizeof(cfg)), NULL);
2357f856f099SNavdeep Parhar 	if (rc < 0) {
2358f856f099SNavdeep Parhar 		if (pdbg_init->verbose)
2359f856f099SNavdeep Parhar 			pdbg_init->print("%s: t4_cim_read_la failed (%d)\n",
2360f856f099SNavdeep Parhar 				 __func__, rc);
2361f856f099SNavdeep Parhar 		cudbg_err->sys_err = rc;
2362f856f099SNavdeep Parhar 		goto err1;
2363f856f099SNavdeep Parhar 	}
2364f856f099SNavdeep Parhar 
2365f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
2366f856f099SNavdeep Parhar 	if (rc)
2367f856f099SNavdeep Parhar 		goto err1;
2368f856f099SNavdeep Parhar 
2369f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
2370f856f099SNavdeep Parhar 	if (rc)
2371f856f099SNavdeep Parhar 		goto err1;
2372f856f099SNavdeep Parhar 
2373f856f099SNavdeep Parhar err1:
2374f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
2375f856f099SNavdeep Parhar err:
2376f856f099SNavdeep Parhar 	return rc;
2377f856f099SNavdeep Parhar }
2378f856f099SNavdeep Parhar 
collect_cim_qcfg(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)2379f856f099SNavdeep Parhar static int collect_cim_qcfg(struct cudbg_init *pdbg_init,
2380f856f099SNavdeep Parhar 			    struct cudbg_buffer *dbg_buff,
2381f856f099SNavdeep Parhar 			    struct cudbg_error *cudbg_err)
2382f856f099SNavdeep Parhar {
2383f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
2384f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
2385f856f099SNavdeep Parhar 	u32 offset;
238639d5cbdcSNavdeep Parhar 	int rc = 0;
2387f856f099SNavdeep Parhar 
2388f856f099SNavdeep Parhar 	struct struct_cim_qcfg *cim_qcfg_data = NULL;
2389f856f099SNavdeep Parhar 
2390f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, sizeof(struct struct_cim_qcfg),
2391f856f099SNavdeep Parhar 			      &scratch_buff);
2392f856f099SNavdeep Parhar 
2393f856f099SNavdeep Parhar 	if (rc)
2394f856f099SNavdeep Parhar 		goto err;
2395f856f099SNavdeep Parhar 
2396f856f099SNavdeep Parhar 	offset = scratch_buff.offset;
2397f856f099SNavdeep Parhar 
2398f856f099SNavdeep Parhar 	cim_qcfg_data =
2399f856f099SNavdeep Parhar 		(struct struct_cim_qcfg *)((u8 *)((char *)scratch_buff.data +
2400f856f099SNavdeep Parhar 					   offset));
2401f856f099SNavdeep Parhar 
2402f856f099SNavdeep Parhar 	rc = t4_cim_read(padap, A_UP_IBQ_0_RDADDR,
2403f856f099SNavdeep Parhar 			 ARRAY_SIZE(cim_qcfg_data->stat), cim_qcfg_data->stat);
2404f856f099SNavdeep Parhar 
2405f856f099SNavdeep Parhar 	if (rc) {
2406f856f099SNavdeep Parhar 		if (pdbg_init->verbose)
2407f856f099SNavdeep Parhar 			pdbg_init->print("%s: t4_cim_read IBQ_0_RDADDR failed (%d)\n",
2408f856f099SNavdeep Parhar 			    __func__, rc);
2409f856f099SNavdeep Parhar 		cudbg_err->sys_err = rc;
2410f856f099SNavdeep Parhar 		goto err1;
2411f856f099SNavdeep Parhar 	}
2412f856f099SNavdeep Parhar 
2413f856f099SNavdeep Parhar 	rc = t4_cim_read(padap, A_UP_OBQ_0_REALADDR,
2414f856f099SNavdeep Parhar 			 ARRAY_SIZE(cim_qcfg_data->obq_wr),
2415f856f099SNavdeep Parhar 			 cim_qcfg_data->obq_wr);
2416f856f099SNavdeep Parhar 
2417f856f099SNavdeep Parhar 	if (rc) {
2418f856f099SNavdeep Parhar 		if (pdbg_init->verbose)
2419f856f099SNavdeep Parhar 			pdbg_init->print("%s: t4_cim_read OBQ_0_REALADDR failed (%d)\n",
2420f856f099SNavdeep Parhar 			    __func__, rc);
2421f856f099SNavdeep Parhar 		cudbg_err->sys_err = rc;
2422f856f099SNavdeep Parhar 		goto err1;
2423f856f099SNavdeep Parhar 	}
2424f856f099SNavdeep Parhar 
2425f856f099SNavdeep Parhar 	/* no return val */
2426f856f099SNavdeep Parhar 	t4_read_cimq_cfg(padap,
2427f856f099SNavdeep Parhar 			cim_qcfg_data->base,
2428f856f099SNavdeep Parhar 			cim_qcfg_data->size,
2429f856f099SNavdeep Parhar 			cim_qcfg_data->thres);
2430f856f099SNavdeep Parhar 
2431f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
2432f856f099SNavdeep Parhar 	if (rc)
2433f856f099SNavdeep Parhar 		goto err1;
2434f856f099SNavdeep Parhar 
2435f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
2436f856f099SNavdeep Parhar 	if (rc)
2437f856f099SNavdeep Parhar 		goto err1;
2438f856f099SNavdeep Parhar 
2439f856f099SNavdeep Parhar err1:
2440f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
2441f856f099SNavdeep Parhar err:
2442f856f099SNavdeep Parhar 	return rc;
2443f856f099SNavdeep Parhar }
2444f856f099SNavdeep Parhar 
2445f856f099SNavdeep Parhar /**
2446f856f099SNavdeep Parhar  * Fetch the TX/RX payload regions start and end.
2447f856f099SNavdeep Parhar  *
2448f856f099SNavdeep Parhar  * @padap (IN): adapter handle.
2449f856f099SNavdeep Parhar  * @mem_type (IN): EDC0, EDC1, MC/MC0/MC1.
2450f856f099SNavdeep Parhar  * @mem_tot_len (IN): total length of @mem_type memory region to read.
2451f856f099SNavdeep Parhar  * @payload_type (IN): TX or RX Payload.
2452f856f099SNavdeep Parhar  * @reg_info (OUT): store the payload region info.
2453f856f099SNavdeep Parhar  *
2454f856f099SNavdeep Parhar  * Fetch the TX/RX payload region information from meminfo.
2455f856f099SNavdeep Parhar  * However, reading from the @mem_type region starts at 0 and not
2456f856f099SNavdeep Parhar  * from whatever base info is stored in meminfo.  Hence, if the
2457f856f099SNavdeep Parhar  * payload region exists, then calculate the payload region
2458f856f099SNavdeep Parhar  * start and end wrt 0 and @mem_tot_len, respectively, and set
2459f856f099SNavdeep Parhar  * @reg_info->exist to true. Otherwise, set @reg_info->exist to false.
2460f856f099SNavdeep Parhar  */
2461f856f099SNavdeep Parhar #ifdef notyet
get_payload_range(struct adapter * padap,u8 mem_type,unsigned long mem_tot_len,u8 payload_type,struct struct_region_info * reg_info)2462f856f099SNavdeep Parhar static int get_payload_range(struct adapter *padap, u8 mem_type,
2463f856f099SNavdeep Parhar 			     unsigned long mem_tot_len, u8 payload_type,
2464f856f099SNavdeep Parhar 			     struct struct_region_info *reg_info)
2465f856f099SNavdeep Parhar {
2466f856f099SNavdeep Parhar 	struct struct_meminfo meminfo;
2467f856f099SNavdeep Parhar 	struct struct_mem_desc mem_region;
2468f856f099SNavdeep Parhar 	struct struct_mem_desc payload;
2469f856f099SNavdeep Parhar 	u32 i, idx, found = 0;
2470f856f099SNavdeep Parhar 	u8 mc_type;
2471f856f099SNavdeep Parhar 	int rc;
2472f856f099SNavdeep Parhar 
2473f856f099SNavdeep Parhar 	/* Get meminfo of all regions */
2474f856f099SNavdeep Parhar 	rc = fill_meminfo(padap, &meminfo);
2475f856f099SNavdeep Parhar 	if (rc)
2476f856f099SNavdeep Parhar 		return rc;
2477f856f099SNavdeep Parhar 
2478f856f099SNavdeep Parhar 	/* Extract the specified TX or RX Payload region range */
2479f856f099SNavdeep Parhar 	memset(&payload, 0, sizeof(struct struct_mem_desc));
2480f856f099SNavdeep Parhar 	for (i = 0; i < meminfo.mem_c; i++) {
2481f856f099SNavdeep Parhar 		if (meminfo.mem[i].idx >= ARRAY_SIZE(region))
2482f856f099SNavdeep Parhar 			continue;                        /* skip holes */
2483f856f099SNavdeep Parhar 
2484f856f099SNavdeep Parhar 		idx = meminfo.mem[i].idx;
2485f856f099SNavdeep Parhar 		/* Get TX or RX Payload region start and end */
2486f856f099SNavdeep Parhar 		if (idx == payload_type) {
2487f856f099SNavdeep Parhar 			if (!(meminfo.mem[i].limit))
2488f856f099SNavdeep Parhar 				meminfo.mem[i].limit =
2489f856f099SNavdeep Parhar 					i < meminfo.mem_c - 1 ?
2490f856f099SNavdeep Parhar 					meminfo.mem[i + 1].base - 1 : ~0;
2491f856f099SNavdeep Parhar 
2492f856f099SNavdeep Parhar 			memcpy(&payload, &meminfo.mem[i], sizeof(payload));
2493f856f099SNavdeep Parhar 			found = 1;
2494f856f099SNavdeep Parhar 			break;
2495f856f099SNavdeep Parhar 		}
2496f856f099SNavdeep Parhar 	}
2497f856f099SNavdeep Parhar 
2498f856f099SNavdeep Parhar 	/* If TX or RX Payload region is not found return error. */
2499f856f099SNavdeep Parhar 	if (!found)
2500f856f099SNavdeep Parhar 		return -EINVAL;
2501f856f099SNavdeep Parhar 
2502f856f099SNavdeep Parhar 	if (mem_type < MEM_MC) {
2503f856f099SNavdeep Parhar 		memcpy(&mem_region, &meminfo.avail[mem_type],
2504f856f099SNavdeep Parhar 		       sizeof(mem_region));
2505f856f099SNavdeep Parhar 	} else {
2506f856f099SNavdeep Parhar 		/* Check if both MC0 and MC1 exist by checking if a
2507f856f099SNavdeep Parhar 		 * base address for the specified @mem_type exists.
2508f856f099SNavdeep Parhar 		 * If a base address exists, then there is MC1 and
2509f856f099SNavdeep Parhar 		 * hence use the base address stored at index 3.
2510f856f099SNavdeep Parhar 		 * Otherwise, use the base address stored at index 2.
2511f856f099SNavdeep Parhar 		 */
2512f856f099SNavdeep Parhar 		mc_type = meminfo.avail[mem_type].base ?
2513f856f099SNavdeep Parhar 			  mem_type : mem_type - 1;
2514f856f099SNavdeep Parhar 		memcpy(&mem_region, &meminfo.avail[mc_type],
2515f856f099SNavdeep Parhar 		       sizeof(mem_region));
2516f856f099SNavdeep Parhar 	}
2517f856f099SNavdeep Parhar 
2518f856f099SNavdeep Parhar 	/* Check if payload region exists in current memory */
2519f856f099SNavdeep Parhar 	if (payload.base < mem_region.base && payload.limit < mem_region.base) {
2520f856f099SNavdeep Parhar 		reg_info->exist = false;
2521f856f099SNavdeep Parhar 		return 0;
2522f856f099SNavdeep Parhar 	}
2523f856f099SNavdeep Parhar 
2524f856f099SNavdeep Parhar 	/* Get Payload region start and end with respect to 0 and
2525f856f099SNavdeep Parhar 	 * mem_tot_len, respectively.  This is because reading from the
2526f856f099SNavdeep Parhar 	 * memory region starts at 0 and not at base info stored in meminfo.
2527f856f099SNavdeep Parhar 	 */
2528f856f099SNavdeep Parhar 	if (payload.base < mem_region.limit) {
2529f856f099SNavdeep Parhar 		reg_info->exist = true;
2530f856f099SNavdeep Parhar 		if (payload.base >= mem_region.base)
2531f856f099SNavdeep Parhar 			reg_info->start = payload.base - mem_region.base;
2532f856f099SNavdeep Parhar 		else
2533f856f099SNavdeep Parhar 			reg_info->start = 0;
2534f856f099SNavdeep Parhar 
2535f856f099SNavdeep Parhar 		if (payload.limit < mem_region.limit)
2536f856f099SNavdeep Parhar 			reg_info->end = payload.limit - mem_region.base;
2537f856f099SNavdeep Parhar 		else
2538f856f099SNavdeep Parhar 			reg_info->end = mem_tot_len;
2539f856f099SNavdeep Parhar 	}
2540f856f099SNavdeep Parhar 
2541f856f099SNavdeep Parhar 	return 0;
2542f856f099SNavdeep Parhar }
2543f856f099SNavdeep Parhar #endif
2544f856f099SNavdeep Parhar 
read_fw_mem(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,u8 mem_type,unsigned long tot_len,struct cudbg_error * cudbg_err)2545f856f099SNavdeep Parhar static int read_fw_mem(struct cudbg_init *pdbg_init,
2546f856f099SNavdeep Parhar 			struct cudbg_buffer *dbg_buff, u8 mem_type,
2547f856f099SNavdeep Parhar 			unsigned long tot_len, struct cudbg_error *cudbg_err)
2548f856f099SNavdeep Parhar {
2549f856f099SNavdeep Parhar #ifdef notyet
2550f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
2551f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
2552f856f099SNavdeep Parhar 	unsigned long bytes_read = 0;
2553f856f099SNavdeep Parhar 	unsigned long bytes_left;
2554f856f099SNavdeep Parhar 	unsigned long bytes;
2555f856f099SNavdeep Parhar 	int	      rc;
2556f856f099SNavdeep Parhar 	struct struct_region_info payload[2]; /* TX and RX Payload Region */
2557f856f099SNavdeep Parhar 	u16 get_payload_flag;
2558f856f099SNavdeep Parhar 	u8 i;
2559f856f099SNavdeep Parhar 
2560f856f099SNavdeep Parhar 	get_payload_flag =
2561f856f099SNavdeep Parhar 		pdbg_init->dbg_params[CUDBG_GET_PAYLOAD_PARAM].param_type;
2562f856f099SNavdeep Parhar 
2563f856f099SNavdeep Parhar 	/* If explicitly asked to get TX/RX Payload data,
2564f856f099SNavdeep Parhar 	 * then don't zero out the payload data. Otherwise,
2565f856f099SNavdeep Parhar 	 * zero out the payload data.
2566f856f099SNavdeep Parhar 	 */
2567f856f099SNavdeep Parhar 	if (!get_payload_flag) {
2568f856f099SNavdeep Parhar 		u8 region_index[2];
2569f856f099SNavdeep Parhar 		u8 j = 0;
2570f856f099SNavdeep Parhar 
2571f856f099SNavdeep Parhar 		/* Find the index of TX and RX Payload regions in meminfo */
2572f856f099SNavdeep Parhar 		for (i = 0; i < ARRAY_SIZE(region); i++) {
2573f856f099SNavdeep Parhar 			if (!strcmp(region[i], "Tx payload:") ||
2574f856f099SNavdeep Parhar 			    !strcmp(region[i], "Rx payload:")) {
2575f856f099SNavdeep Parhar 				region_index[j] = i;
2576f856f099SNavdeep Parhar 				j++;
2577f856f099SNavdeep Parhar 				if (j == 2)
2578f856f099SNavdeep Parhar 					break;
2579f856f099SNavdeep Parhar 			}
2580f856f099SNavdeep Parhar 		}
2581f856f099SNavdeep Parhar 
2582f856f099SNavdeep Parhar 		/* Get TX/RX Payload region range if they exist */
2583f856f099SNavdeep Parhar 		memset(payload, 0, ARRAY_SIZE(payload) * sizeof(payload[0]));
2584f856f099SNavdeep Parhar 		for (i = 0; i < ARRAY_SIZE(payload); i++) {
2585f856f099SNavdeep Parhar 			rc = get_payload_range(padap, mem_type, tot_len,
2586f856f099SNavdeep Parhar 					       region_index[i],
2587f856f099SNavdeep Parhar 					       &payload[i]);
2588f856f099SNavdeep Parhar 			if (rc)
2589f856f099SNavdeep Parhar 				goto err;
2590f856f099SNavdeep Parhar 
2591f856f099SNavdeep Parhar 			if (payload[i].exist) {
2592f856f099SNavdeep Parhar 				/* Align start and end to avoid wrap around */
2593f856f099SNavdeep Parhar 				payload[i].start =
2594f856f099SNavdeep Parhar 					roundup(payload[i].start,
2595f856f099SNavdeep Parhar 					    CUDBG_CHUNK_SIZE);
2596f856f099SNavdeep Parhar 				payload[i].end =
2597f856f099SNavdeep Parhar 					rounddown(payload[i].end,
2598f856f099SNavdeep Parhar 					    CUDBG_CHUNK_SIZE);
2599f856f099SNavdeep Parhar 			}
2600f856f099SNavdeep Parhar 		}
2601f856f099SNavdeep Parhar 	}
2602f856f099SNavdeep Parhar 
2603f856f099SNavdeep Parhar 	bytes_left = tot_len;
2604f856f099SNavdeep Parhar 	scratch_buff.size = tot_len;
2605f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
2606f856f099SNavdeep Parhar 	if (rc)
2607f856f099SNavdeep Parhar 		goto err;
2608f856f099SNavdeep Parhar 
2609f856f099SNavdeep Parhar 	while (bytes_left > 0) {
2610f856f099SNavdeep Parhar 		bytes = min_t(unsigned long, bytes_left, (unsigned long)CUDBG_CHUNK_SIZE);
2611f856f099SNavdeep Parhar 		rc = get_scratch_buff(dbg_buff, bytes, &scratch_buff);
2612f856f099SNavdeep Parhar 
2613f856f099SNavdeep Parhar 		if (rc) {
2614f856f099SNavdeep Parhar 			rc = CUDBG_STATUS_NO_SCRATCH_MEM;
2615f856f099SNavdeep Parhar 			goto err;
2616f856f099SNavdeep Parhar 		}
2617f856f099SNavdeep Parhar 
2618f856f099SNavdeep Parhar 		if (!get_payload_flag) {
2619f856f099SNavdeep Parhar 			for (i = 0; i < ARRAY_SIZE(payload); i++) {
2620f856f099SNavdeep Parhar 				if (payload[i].exist &&
2621f856f099SNavdeep Parhar 				    bytes_read >= payload[i].start &&
2622f856f099SNavdeep Parhar 				    (bytes_read + bytes) <= payload[i].end) {
2623f856f099SNavdeep Parhar 					memset(scratch_buff.data, 0, bytes);
2624f856f099SNavdeep Parhar 					/* TX and RX Payload regions
2625f856f099SNavdeep Parhar 					 * can't overlap.
2626f856f099SNavdeep Parhar 					 */
2627f856f099SNavdeep Parhar 					goto skip_read;
2628f856f099SNavdeep Parhar 				}
2629f856f099SNavdeep Parhar 			}
2630f856f099SNavdeep Parhar 		}
2631f856f099SNavdeep Parhar 
2632f856f099SNavdeep Parhar 		/* Read from file */
2633f856f099SNavdeep Parhar 		/*fread(scratch_buff.data, 1, Bytes, in);*/
2634f856f099SNavdeep Parhar 		rc = t4_memory_rw(padap, MEMWIN_NIC, mem_type, bytes_read,
2635f856f099SNavdeep Parhar 				  bytes, (__be32 *)(scratch_buff.data), 1);
2636f856f099SNavdeep Parhar 
2637f856f099SNavdeep Parhar 		if (rc) {
2638f856f099SNavdeep Parhar 			if (pdbg_init->verbose)
2639f856f099SNavdeep Parhar 				pdbg_init->print("%s: t4_memory_rw failed (%d)",
2640f856f099SNavdeep Parhar 				    __func__, rc);
2641f856f099SNavdeep Parhar 			cudbg_err->sys_err = rc;
2642f856f099SNavdeep Parhar 			goto err1;
2643f856f099SNavdeep Parhar 		}
2644f856f099SNavdeep Parhar 
2645f856f099SNavdeep Parhar skip_read:
2646f856f099SNavdeep Parhar 		rc = compress_buff(&scratch_buff, dbg_buff);
2647f856f099SNavdeep Parhar 		if (rc)
2648f856f099SNavdeep Parhar 			goto err1;
2649f856f099SNavdeep Parhar 
2650f856f099SNavdeep Parhar 		bytes_left -= bytes;
2651f856f099SNavdeep Parhar 		bytes_read += bytes;
2652f856f099SNavdeep Parhar 		release_scratch_buff(&scratch_buff, dbg_buff);
2653f856f099SNavdeep Parhar 	}
2654f856f099SNavdeep Parhar 
2655f856f099SNavdeep Parhar err1:
2656f856f099SNavdeep Parhar 	if (rc)
2657f856f099SNavdeep Parhar 		release_scratch_buff(&scratch_buff, dbg_buff);
2658f856f099SNavdeep Parhar 
2659f856f099SNavdeep Parhar err:
2660f856f099SNavdeep Parhar 	return rc;
2661f856f099SNavdeep Parhar #endif
26626cc4520bSNavdeep Parhar 	return (CUDBG_STATUS_NOT_IMPLEMENTED);
2663f856f099SNavdeep Parhar }
2664f856f099SNavdeep Parhar 
collect_mem_info(struct cudbg_init * pdbg_init,struct card_mem * mem_info)2665f856f099SNavdeep Parhar static void collect_mem_info(struct cudbg_init *pdbg_init,
2666f856f099SNavdeep Parhar 			     struct card_mem *mem_info)
2667f856f099SNavdeep Parhar {
2668f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
2669f856f099SNavdeep Parhar 	u32 value;
2670f856f099SNavdeep Parhar 	int t4 = 0;
2671f856f099SNavdeep Parhar 
2672f856f099SNavdeep Parhar 	if (is_t4(padap))
2673f856f099SNavdeep Parhar 		t4 = 1;
2674f856f099SNavdeep Parhar 
2675f856f099SNavdeep Parhar 	if (t4) {
2676f856f099SNavdeep Parhar 		value = t4_read_reg(padap, A_MA_EXT_MEMORY_BAR);
2677f856f099SNavdeep Parhar 		value = G_EXT_MEM_SIZE(value);
2678f856f099SNavdeep Parhar 		mem_info->size_mc0 = (u16)value;  /* size in MB */
2679f856f099SNavdeep Parhar 
2680f856f099SNavdeep Parhar 		value = t4_read_reg(padap, A_MA_TARGET_MEM_ENABLE);
2681f856f099SNavdeep Parhar 		if (value & F_EXT_MEM_ENABLE)
2682f856f099SNavdeep Parhar 			mem_info->mem_flag |= (1 << MC0_FLAG); /* set mc0 flag
2683f856f099SNavdeep Parhar 								  bit */
2684f856f099SNavdeep Parhar 	} else {
2685f856f099SNavdeep Parhar 		value = t4_read_reg(padap, A_MA_EXT_MEMORY0_BAR);
2686f856f099SNavdeep Parhar 		value = G_EXT_MEM0_SIZE(value);
2687f856f099SNavdeep Parhar 		mem_info->size_mc0 = (u16)value;
2688f856f099SNavdeep Parhar 
2689f856f099SNavdeep Parhar 		value = t4_read_reg(padap, A_MA_EXT_MEMORY1_BAR);
2690f856f099SNavdeep Parhar 		value = G_EXT_MEM1_SIZE(value);
2691f856f099SNavdeep Parhar 		mem_info->size_mc1 = (u16)value;
2692f856f099SNavdeep Parhar 
2693f856f099SNavdeep Parhar 		value = t4_read_reg(padap, A_MA_TARGET_MEM_ENABLE);
2694f856f099SNavdeep Parhar 		if (value & F_EXT_MEM0_ENABLE)
2695f856f099SNavdeep Parhar 			mem_info->mem_flag |= (1 << MC0_FLAG);
2696f856f099SNavdeep Parhar 		if (value & F_EXT_MEM1_ENABLE)
2697f856f099SNavdeep Parhar 			mem_info->mem_flag |= (1 << MC1_FLAG);
2698f856f099SNavdeep Parhar 	}
2699f856f099SNavdeep Parhar 
2700f856f099SNavdeep Parhar 	value = t4_read_reg(padap, A_MA_EDRAM0_BAR);
2701f856f099SNavdeep Parhar 	value = G_EDRAM0_SIZE(value);
2702f856f099SNavdeep Parhar 	mem_info->size_edc0 = (u16)value;
2703f856f099SNavdeep Parhar 
2704f856f099SNavdeep Parhar 	value = t4_read_reg(padap, A_MA_EDRAM1_BAR);
2705f856f099SNavdeep Parhar 	value = G_EDRAM1_SIZE(value);
2706f856f099SNavdeep Parhar 	mem_info->size_edc1 = (u16)value;
2707f856f099SNavdeep Parhar 
2708f856f099SNavdeep Parhar 	value = t4_read_reg(padap, A_MA_TARGET_MEM_ENABLE);
2709f856f099SNavdeep Parhar 	if (value & F_EDRAM0_ENABLE)
2710f856f099SNavdeep Parhar 		mem_info->mem_flag |= (1 << EDC0_FLAG);
2711f856f099SNavdeep Parhar 	if (value & F_EDRAM1_ENABLE)
2712f856f099SNavdeep Parhar 		mem_info->mem_flag |= (1 << EDC1_FLAG);
2713f856f099SNavdeep Parhar 
2714f856f099SNavdeep Parhar }
2715f856f099SNavdeep Parhar 
cudbg_t4_fwcache(struct cudbg_init * pdbg_init,struct cudbg_error * cudbg_err)2716f856f099SNavdeep Parhar static void cudbg_t4_fwcache(struct cudbg_init *pdbg_init,
2717f856f099SNavdeep Parhar 				struct cudbg_error *cudbg_err)
2718f856f099SNavdeep Parhar {
2719f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
2720f856f099SNavdeep Parhar 	int rc;
2721f856f099SNavdeep Parhar 
2722f856f099SNavdeep Parhar 	if (is_fw_attached(pdbg_init)) {
2723f856f099SNavdeep Parhar 
2724f856f099SNavdeep Parhar 		/* Flush uP dcache before reading edcX/mcX  */
27258ee789e9SNavdeep Parhar 		rc = begin_synchronized_op(padap, NULL, SLEEP_OK | INTR_OK,
27268ee789e9SNavdeep Parhar 		    "t4cudl");
27278ee789e9SNavdeep Parhar 		if (rc == 0) {
2728f856f099SNavdeep Parhar 			rc = t4_fwcache(padap, FW_PARAM_DEV_FWCACHE_FLUSH);
27298ee789e9SNavdeep Parhar 			end_synchronized_op(padap, 0);
27308ee789e9SNavdeep Parhar 		}
2731f856f099SNavdeep Parhar 
2732f856f099SNavdeep Parhar 		if (rc) {
2733f856f099SNavdeep Parhar 			if (pdbg_init->verbose)
2734f856f099SNavdeep Parhar 				pdbg_init->print("%s: t4_fwcache failed (%d)\n",
2735f856f099SNavdeep Parhar 				 __func__, rc);
2736f856f099SNavdeep Parhar 			cudbg_err->sys_warn = rc;
2737f856f099SNavdeep Parhar 		}
2738f856f099SNavdeep Parhar 	}
2739f856f099SNavdeep Parhar }
2740f856f099SNavdeep Parhar 
collect_edc0_meminfo(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)2741f856f099SNavdeep Parhar static int collect_edc0_meminfo(struct cudbg_init *pdbg_init,
2742f856f099SNavdeep Parhar 				struct cudbg_buffer *dbg_buff,
2743f856f099SNavdeep Parhar 				struct cudbg_error *cudbg_err)
2744f856f099SNavdeep Parhar {
2745f856f099SNavdeep Parhar 	struct card_mem mem_info = {0};
2746f856f099SNavdeep Parhar 	unsigned long edc0_size;
2747f856f099SNavdeep Parhar 	int rc;
2748f856f099SNavdeep Parhar 
2749f856f099SNavdeep Parhar 	cudbg_t4_fwcache(pdbg_init, cudbg_err);
2750f856f099SNavdeep Parhar 
2751f856f099SNavdeep Parhar 	collect_mem_info(pdbg_init, &mem_info);
2752f856f099SNavdeep Parhar 
2753f856f099SNavdeep Parhar 	if (mem_info.mem_flag & (1 << EDC0_FLAG)) {
2754f856f099SNavdeep Parhar 		edc0_size = (((unsigned long)mem_info.size_edc0) * 1024 * 1024);
2755f856f099SNavdeep Parhar 		rc = read_fw_mem(pdbg_init, dbg_buff, MEM_EDC0,
2756f856f099SNavdeep Parhar 				 edc0_size, cudbg_err);
2757f856f099SNavdeep Parhar 		if (rc)
2758f856f099SNavdeep Parhar 			goto err;
2759f856f099SNavdeep Parhar 
2760f856f099SNavdeep Parhar 	} else {
2761f856f099SNavdeep Parhar 		rc = CUDBG_STATUS_ENTITY_NOT_FOUND;
2762f856f099SNavdeep Parhar 		if (pdbg_init->verbose)
2763f856f099SNavdeep Parhar 			pdbg_init->print("%s(), collect_mem_info failed!, %s\n",
2764f856f099SNavdeep Parhar 				 __func__, err_msg[-rc]);
2765f856f099SNavdeep Parhar 		goto err;
2766f856f099SNavdeep Parhar 
2767f856f099SNavdeep Parhar 	}
2768f856f099SNavdeep Parhar err:
2769f856f099SNavdeep Parhar 	return rc;
2770f856f099SNavdeep Parhar }
2771f856f099SNavdeep Parhar 
collect_edc1_meminfo(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)2772f856f099SNavdeep Parhar static int collect_edc1_meminfo(struct cudbg_init *pdbg_init,
2773f856f099SNavdeep Parhar 				struct cudbg_buffer *dbg_buff,
2774f856f099SNavdeep Parhar 				struct cudbg_error *cudbg_err)
2775f856f099SNavdeep Parhar {
2776f856f099SNavdeep Parhar 	struct card_mem mem_info = {0};
2777f856f099SNavdeep Parhar 	unsigned long edc1_size;
2778f856f099SNavdeep Parhar 	int rc;
2779f856f099SNavdeep Parhar 
2780f856f099SNavdeep Parhar 	cudbg_t4_fwcache(pdbg_init, cudbg_err);
2781f856f099SNavdeep Parhar 
2782f856f099SNavdeep Parhar 	collect_mem_info(pdbg_init, &mem_info);
2783f856f099SNavdeep Parhar 
2784f856f099SNavdeep Parhar 	if (mem_info.mem_flag & (1 << EDC1_FLAG)) {
2785f856f099SNavdeep Parhar 		edc1_size = (((unsigned long)mem_info.size_edc1) * 1024 * 1024);
2786f856f099SNavdeep Parhar 		rc = read_fw_mem(pdbg_init, dbg_buff, MEM_EDC1,
2787f856f099SNavdeep Parhar 				 edc1_size, cudbg_err);
2788f856f099SNavdeep Parhar 		if (rc)
2789f856f099SNavdeep Parhar 			goto err;
2790f856f099SNavdeep Parhar 	} else {
2791f856f099SNavdeep Parhar 		rc = CUDBG_STATUS_ENTITY_NOT_FOUND;
2792f856f099SNavdeep Parhar 		if (pdbg_init->verbose)
2793f856f099SNavdeep Parhar 			pdbg_init->print("%s(), collect_mem_info failed!, %s\n",
2794f856f099SNavdeep Parhar 				 __func__, err_msg[-rc]);
2795f856f099SNavdeep Parhar 		goto err;
2796f856f099SNavdeep Parhar 	}
2797f856f099SNavdeep Parhar 
2798f856f099SNavdeep Parhar err:
2799f856f099SNavdeep Parhar 
2800f856f099SNavdeep Parhar 	return rc;
2801f856f099SNavdeep Parhar }
2802f856f099SNavdeep Parhar 
collect_mc0_meminfo(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)2803f856f099SNavdeep Parhar static int collect_mc0_meminfo(struct cudbg_init *pdbg_init,
2804f856f099SNavdeep Parhar 			       struct cudbg_buffer *dbg_buff,
2805f856f099SNavdeep Parhar 			       struct cudbg_error *cudbg_err)
2806f856f099SNavdeep Parhar {
2807f856f099SNavdeep Parhar 	struct card_mem mem_info = {0};
2808f856f099SNavdeep Parhar 	unsigned long mc0_size;
2809f856f099SNavdeep Parhar 	int rc;
2810f856f099SNavdeep Parhar 
2811f856f099SNavdeep Parhar 	cudbg_t4_fwcache(pdbg_init, cudbg_err);
2812f856f099SNavdeep Parhar 
2813f856f099SNavdeep Parhar 	collect_mem_info(pdbg_init, &mem_info);
2814f856f099SNavdeep Parhar 
2815f856f099SNavdeep Parhar 	if (mem_info.mem_flag & (1 << MC0_FLAG)) {
2816f856f099SNavdeep Parhar 		mc0_size = (((unsigned long)mem_info.size_mc0) * 1024 * 1024);
2817f856f099SNavdeep Parhar 		rc = read_fw_mem(pdbg_init, dbg_buff, MEM_MC0,
2818f856f099SNavdeep Parhar 				 mc0_size, cudbg_err);
2819f856f099SNavdeep Parhar 		if (rc)
2820f856f099SNavdeep Parhar 			goto err;
2821f856f099SNavdeep Parhar 	} else {
2822f856f099SNavdeep Parhar 		rc = CUDBG_STATUS_ENTITY_NOT_FOUND;
2823f856f099SNavdeep Parhar 		if (pdbg_init->verbose)
2824f856f099SNavdeep Parhar 			pdbg_init->print("%s(), collect_mem_info failed!, %s\n",
2825f856f099SNavdeep Parhar 				 __func__, err_msg[-rc]);
2826f856f099SNavdeep Parhar 		goto err;
2827f856f099SNavdeep Parhar 	}
2828f856f099SNavdeep Parhar 
2829f856f099SNavdeep Parhar err:
2830f856f099SNavdeep Parhar 	return rc;
2831f856f099SNavdeep Parhar }
2832f856f099SNavdeep Parhar 
collect_mc1_meminfo(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)2833f856f099SNavdeep Parhar static int collect_mc1_meminfo(struct cudbg_init *pdbg_init,
2834f856f099SNavdeep Parhar 			       struct cudbg_buffer *dbg_buff,
2835f856f099SNavdeep Parhar 			       struct cudbg_error *cudbg_err)
2836f856f099SNavdeep Parhar {
2837f856f099SNavdeep Parhar 	struct card_mem mem_info = {0};
2838f856f099SNavdeep Parhar 	unsigned long mc1_size;
2839f856f099SNavdeep Parhar 	int rc;
2840f856f099SNavdeep Parhar 
2841f856f099SNavdeep Parhar 	cudbg_t4_fwcache(pdbg_init, cudbg_err);
2842f856f099SNavdeep Parhar 
2843f856f099SNavdeep Parhar 	collect_mem_info(pdbg_init, &mem_info);
2844f856f099SNavdeep Parhar 
2845f856f099SNavdeep Parhar 	if (mem_info.mem_flag & (1 << MC1_FLAG)) {
2846f856f099SNavdeep Parhar 		mc1_size = (((unsigned long)mem_info.size_mc1) * 1024 * 1024);
2847f856f099SNavdeep Parhar 		rc = read_fw_mem(pdbg_init, dbg_buff, MEM_MC1,
2848f856f099SNavdeep Parhar 				 mc1_size, cudbg_err);
2849f856f099SNavdeep Parhar 		if (rc)
2850f856f099SNavdeep Parhar 			goto err;
2851f856f099SNavdeep Parhar 	} else {
2852f856f099SNavdeep Parhar 		rc = CUDBG_STATUS_ENTITY_NOT_FOUND;
2853f856f099SNavdeep Parhar 
2854f856f099SNavdeep Parhar 		if (pdbg_init->verbose)
2855f856f099SNavdeep Parhar 			pdbg_init->print("%s(), collect_mem_info failed!, %s\n",
2856f856f099SNavdeep Parhar 				 __func__, err_msg[-rc]);
2857f856f099SNavdeep Parhar 		goto err;
2858f856f099SNavdeep Parhar 	}
2859f856f099SNavdeep Parhar err:
2860f856f099SNavdeep Parhar 	return rc;
2861f856f099SNavdeep Parhar }
2862f856f099SNavdeep Parhar 
collect_reg_dump(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)2863f856f099SNavdeep Parhar static int collect_reg_dump(struct cudbg_init *pdbg_init,
2864f856f099SNavdeep Parhar 			    struct cudbg_buffer *dbg_buff,
2865f856f099SNavdeep Parhar 			    struct cudbg_error *cudbg_err)
2866f856f099SNavdeep Parhar {
2867f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
2868f856f099SNavdeep Parhar 	struct cudbg_buffer tmp_scratch_buff;
2869f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
2870f856f099SNavdeep Parhar 	unsigned long	     bytes_read = 0;
2871f856f099SNavdeep Parhar 	unsigned long	     bytes_left;
2872f856f099SNavdeep Parhar 	u32		     buf_size = 0, bytes = 0;
2873f856f099SNavdeep Parhar 	int		     rc = 0;
2874f856f099SNavdeep Parhar 
2875f856f099SNavdeep Parhar 	if (is_t4(padap))
2876f856f099SNavdeep Parhar 		buf_size = T4_REGMAP_SIZE ;/*+ sizeof(unsigned int);*/
2877f856f099SNavdeep Parhar 	else if (is_t5(padap) || is_t6(padap))
2878f856f099SNavdeep Parhar 		buf_size = T5_REGMAP_SIZE;
2879f856f099SNavdeep Parhar 
2880f856f099SNavdeep Parhar 	scratch_buff.size = buf_size;
2881f856f099SNavdeep Parhar 
2882f856f099SNavdeep Parhar 	tmp_scratch_buff = scratch_buff;
2883f856f099SNavdeep Parhar 
2884f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, scratch_buff.size, &scratch_buff);
2885f856f099SNavdeep Parhar 	if (rc)
2886f856f099SNavdeep Parhar 		goto err;
2887f856f099SNavdeep Parhar 
2888f856f099SNavdeep Parhar 	/* no return */
2889f856f099SNavdeep Parhar 	t4_get_regs(padap, (void *)scratch_buff.data, scratch_buff.size);
2890f856f099SNavdeep Parhar 	bytes_left =   scratch_buff.size;
2891f856f099SNavdeep Parhar 
2892f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
2893f856f099SNavdeep Parhar 	if (rc)
2894f856f099SNavdeep Parhar 		goto err1;
2895f856f099SNavdeep Parhar 
2896f856f099SNavdeep Parhar 	while (bytes_left > 0) {
2897f856f099SNavdeep Parhar 		tmp_scratch_buff.data =
2898f856f099SNavdeep Parhar 			((char *)scratch_buff.data) + bytes_read;
2899f856f099SNavdeep Parhar 		bytes = min_t(unsigned long, bytes_left, (unsigned long)CUDBG_CHUNK_SIZE);
2900f856f099SNavdeep Parhar 		tmp_scratch_buff.size = bytes;
2901f856f099SNavdeep Parhar 		compress_buff(&tmp_scratch_buff, dbg_buff);
2902f856f099SNavdeep Parhar 		bytes_left -= bytes;
2903f856f099SNavdeep Parhar 		bytes_read += bytes;
2904f856f099SNavdeep Parhar 	}
2905f856f099SNavdeep Parhar 
2906f856f099SNavdeep Parhar err1:
2907f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
2908f856f099SNavdeep Parhar err:
2909f856f099SNavdeep Parhar 	return rc;
2910f856f099SNavdeep Parhar }
2911f856f099SNavdeep Parhar 
collect_cctrl(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)2912f856f099SNavdeep Parhar static int collect_cctrl(struct cudbg_init *pdbg_init,
2913f856f099SNavdeep Parhar 			 struct cudbg_buffer *dbg_buff,
2914f856f099SNavdeep Parhar 			 struct cudbg_error *cudbg_err)
2915f856f099SNavdeep Parhar {
2916f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
2917f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
2918f856f099SNavdeep Parhar 	u32 size;
2919f856f099SNavdeep Parhar 	int rc;
2920f856f099SNavdeep Parhar 
2921f856f099SNavdeep Parhar 	size = sizeof(u16) * NMTUS * NCCTRL_WIN;
2922f856f099SNavdeep Parhar 	scratch_buff.size = size;
2923f856f099SNavdeep Parhar 
2924f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, scratch_buff.size, &scratch_buff);
2925f856f099SNavdeep Parhar 	if (rc)
2926f856f099SNavdeep Parhar 		goto err;
2927f856f099SNavdeep Parhar 
2928f856f099SNavdeep Parhar 	t4_read_cong_tbl(padap, (void *)scratch_buff.data);
2929f856f099SNavdeep Parhar 
2930f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
2931f856f099SNavdeep Parhar 	if (rc)
2932f856f099SNavdeep Parhar 		goto err1;
2933f856f099SNavdeep Parhar 
2934f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
2935f856f099SNavdeep Parhar 
2936f856f099SNavdeep Parhar err1:
2937f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
2938f856f099SNavdeep Parhar err:
2939f856f099SNavdeep Parhar 	return rc;
2940f856f099SNavdeep Parhar }
2941f856f099SNavdeep Parhar 
check_busy_bit(struct adapter * padap)2942f856f099SNavdeep Parhar static int check_busy_bit(struct adapter *padap)
2943f856f099SNavdeep Parhar {
2944f856f099SNavdeep Parhar 	u32 val;
2945f856f099SNavdeep Parhar 	u32 busy = 1;
2946f856f099SNavdeep Parhar 	int i = 0;
2947f856f099SNavdeep Parhar 	int retry = 10;
2948f856f099SNavdeep Parhar 	int status = 0;
2949f856f099SNavdeep Parhar 
2950fb0493d5SDimitry Andric 	while (busy && i < retry) {
2951f856f099SNavdeep Parhar 		val = t4_read_reg(padap, A_CIM_HOST_ACC_CTRL);
2952f856f099SNavdeep Parhar 		busy = (0 != (val & CUDBG_CIM_BUSY_BIT));
2953f856f099SNavdeep Parhar 		i++;
2954f856f099SNavdeep Parhar 	}
2955f856f099SNavdeep Parhar 
2956f856f099SNavdeep Parhar 	if (busy)
2957f856f099SNavdeep Parhar 		status = -1;
2958f856f099SNavdeep Parhar 
2959f856f099SNavdeep Parhar 	return status;
2960f856f099SNavdeep Parhar }
2961f856f099SNavdeep Parhar 
cim_ha_rreg(struct adapter * padap,u32 addr,u32 * val)2962f856f099SNavdeep Parhar static int cim_ha_rreg(struct adapter *padap, u32 addr, u32 *val)
2963f856f099SNavdeep Parhar {
2964f856f099SNavdeep Parhar 	int rc = 0;
2965f856f099SNavdeep Parhar 
2966f856f099SNavdeep Parhar 	/* write register address into the A_CIM_HOST_ACC_CTRL */
2967f856f099SNavdeep Parhar 	t4_write_reg(padap, A_CIM_HOST_ACC_CTRL, addr);
2968f856f099SNavdeep Parhar 
2969f856f099SNavdeep Parhar 	/* Poll HOSTBUSY */
2970f856f099SNavdeep Parhar 	rc = check_busy_bit(padap);
2971f856f099SNavdeep Parhar 	if (rc)
2972f856f099SNavdeep Parhar 		goto err;
2973f856f099SNavdeep Parhar 
2974f856f099SNavdeep Parhar 	/* Read value from A_CIM_HOST_ACC_DATA */
2975f856f099SNavdeep Parhar 	*val = t4_read_reg(padap, A_CIM_HOST_ACC_DATA);
2976f856f099SNavdeep Parhar 
2977f856f099SNavdeep Parhar err:
2978f856f099SNavdeep Parhar 	return rc;
2979f856f099SNavdeep Parhar }
2980f856f099SNavdeep Parhar 
dump_up_cim(struct adapter * padap,struct cudbg_init * pdbg_init,struct ireg_field * up_cim_reg,u32 * buff)2981f856f099SNavdeep Parhar static int dump_up_cim(struct adapter *padap, struct cudbg_init *pdbg_init,
2982f856f099SNavdeep Parhar 		       struct ireg_field *up_cim_reg, u32 *buff)
2983f856f099SNavdeep Parhar {
2984f856f099SNavdeep Parhar 	u32 i;
2985f856f099SNavdeep Parhar 	int rc = 0;
2986f856f099SNavdeep Parhar 
2987f856f099SNavdeep Parhar 	for (i = 0; i < up_cim_reg->ireg_offset_range; i++) {
2988f856f099SNavdeep Parhar 		rc = cim_ha_rreg(padap,
2989f856f099SNavdeep Parhar 				 up_cim_reg->ireg_local_offset + (i * 4),
2990f856f099SNavdeep Parhar 				buff);
2991f856f099SNavdeep Parhar 		if (rc) {
2992f856f099SNavdeep Parhar 			if (pdbg_init->verbose)
2993f856f099SNavdeep Parhar 				pdbg_init->print("BUSY timeout reading"
2994f856f099SNavdeep Parhar 					 "CIM_HOST_ACC_CTRL\n");
2995f856f099SNavdeep Parhar 			goto err;
2996f856f099SNavdeep Parhar 		}
2997f856f099SNavdeep Parhar 
2998f856f099SNavdeep Parhar 		buff++;
2999f856f099SNavdeep Parhar 	}
3000f856f099SNavdeep Parhar 
3001f856f099SNavdeep Parhar err:
3002f856f099SNavdeep Parhar 	return rc;
3003f856f099SNavdeep Parhar }
3004f856f099SNavdeep Parhar 
collect_up_cim_indirect(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)3005f856f099SNavdeep Parhar static int collect_up_cim_indirect(struct cudbg_init *pdbg_init,
3006f856f099SNavdeep Parhar 				   struct cudbg_buffer *dbg_buff,
3007f856f099SNavdeep Parhar 				   struct cudbg_error *cudbg_err)
3008f856f099SNavdeep Parhar {
3009f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
3010f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
3011f856f099SNavdeep Parhar 	struct ireg_buf *up_cim;
3012f856f099SNavdeep Parhar 	u32 size;
3013f856f099SNavdeep Parhar 	int i, rc, n;
3014f856f099SNavdeep Parhar 
3015f856f099SNavdeep Parhar 	n = sizeof(t5_up_cim_reg_array) / (4 * sizeof(u32));
3016f856f099SNavdeep Parhar 	size = sizeof(struct ireg_buf) * n;
3017f856f099SNavdeep Parhar 	scratch_buff.size = size;
3018f856f099SNavdeep Parhar 
3019f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, scratch_buff.size, &scratch_buff);
3020f856f099SNavdeep Parhar 	if (rc)
3021f856f099SNavdeep Parhar 		goto err;
3022f856f099SNavdeep Parhar 
3023f856f099SNavdeep Parhar 	up_cim = (struct ireg_buf *)scratch_buff.data;
3024f856f099SNavdeep Parhar 
3025f856f099SNavdeep Parhar 	for (i = 0; i < n; i++) {
3026f856f099SNavdeep Parhar 		struct ireg_field *up_cim_reg = &up_cim->tp_pio;
3027f856f099SNavdeep Parhar 		u32 *buff = up_cim->outbuf;
3028f856f099SNavdeep Parhar 
3029f856f099SNavdeep Parhar 		if (is_t5(padap)) {
3030f856f099SNavdeep Parhar 			up_cim_reg->ireg_addr = t5_up_cim_reg_array[i][0];
3031f856f099SNavdeep Parhar 			up_cim_reg->ireg_data = t5_up_cim_reg_array[i][1];
3032f856f099SNavdeep Parhar 			up_cim_reg->ireg_local_offset =
3033f856f099SNavdeep Parhar 						t5_up_cim_reg_array[i][2];
3034f856f099SNavdeep Parhar 			up_cim_reg->ireg_offset_range =
3035f856f099SNavdeep Parhar 						t5_up_cim_reg_array[i][3];
3036f856f099SNavdeep Parhar 		} else if (is_t6(padap)) {
3037f856f099SNavdeep Parhar 			up_cim_reg->ireg_addr = t6_up_cim_reg_array[i][0];
3038f856f099SNavdeep Parhar 			up_cim_reg->ireg_data = t6_up_cim_reg_array[i][1];
3039f856f099SNavdeep Parhar 			up_cim_reg->ireg_local_offset =
3040f856f099SNavdeep Parhar 						t6_up_cim_reg_array[i][2];
3041f856f099SNavdeep Parhar 			up_cim_reg->ireg_offset_range =
3042f856f099SNavdeep Parhar 						t6_up_cim_reg_array[i][3];
3043f856f099SNavdeep Parhar 		}
3044f856f099SNavdeep Parhar 
3045f856f099SNavdeep Parhar 		rc = dump_up_cim(padap, pdbg_init, up_cim_reg, buff);
3046f856f099SNavdeep Parhar 
3047f856f099SNavdeep Parhar 		up_cim++;
3048f856f099SNavdeep Parhar 	}
3049f856f099SNavdeep Parhar 
3050f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
3051f856f099SNavdeep Parhar 	if (rc)
3052f856f099SNavdeep Parhar 		goto err1;
3053f856f099SNavdeep Parhar 
3054f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
3055f856f099SNavdeep Parhar 
3056f856f099SNavdeep Parhar err1:
3057f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
3058f856f099SNavdeep Parhar err:
3059f856f099SNavdeep Parhar 	return rc;
3060f856f099SNavdeep Parhar }
3061f856f099SNavdeep Parhar 
collect_mbox_log(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)3062f856f099SNavdeep Parhar static int collect_mbox_log(struct cudbg_init *pdbg_init,
3063f856f099SNavdeep Parhar 			    struct cudbg_buffer *dbg_buff,
3064f856f099SNavdeep Parhar 			    struct cudbg_error *cudbg_err)
3065f856f099SNavdeep Parhar {
3066f856f099SNavdeep Parhar #ifdef notyet
3067f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
3068f856f099SNavdeep Parhar 	struct cudbg_mbox_log *mboxlog = NULL;
3069f856f099SNavdeep Parhar 	struct mbox_cmd_log *log = NULL;
3070f856f099SNavdeep Parhar 	struct mbox_cmd *entry;
3071f856f099SNavdeep Parhar 	u64 flit;
3072f856f099SNavdeep Parhar 	u32 size;
3073f856f099SNavdeep Parhar 	unsigned int entry_idx;
3074f856f099SNavdeep Parhar 	int i, k, rc;
3075f856f099SNavdeep Parhar 	u16 mbox_cmds;
3076f856f099SNavdeep Parhar 
3077f856f099SNavdeep Parhar 	if (pdbg_init->dbg_params[CUDBG_MBOX_LOG_PARAM].u.mboxlog_param.log) {
3078f856f099SNavdeep Parhar 		log = pdbg_init->dbg_params[CUDBG_MBOX_LOG_PARAM].u.
3079f856f099SNavdeep Parhar 			mboxlog_param.log;
3080f856f099SNavdeep Parhar 		mbox_cmds = pdbg_init->dbg_params[CUDBG_MBOX_LOG_PARAM].u.
3081f856f099SNavdeep Parhar 				mboxlog_param.mbox_cmds;
3082f856f099SNavdeep Parhar 	} else {
3083f856f099SNavdeep Parhar 		if (pdbg_init->verbose)
3084f856f099SNavdeep Parhar 			pdbg_init->print("Mbox log is not requested\n");
3085f856f099SNavdeep Parhar 		return CUDBG_STATUS_ENTITY_NOT_REQUESTED;
3086f856f099SNavdeep Parhar 	}
3087f856f099SNavdeep Parhar 
3088f856f099SNavdeep Parhar 	size = sizeof(struct cudbg_mbox_log) * mbox_cmds;
3089f856f099SNavdeep Parhar 	scratch_buff.size = size;
3090f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, scratch_buff.size, &scratch_buff);
3091f856f099SNavdeep Parhar 	if (rc)
3092f856f099SNavdeep Parhar 		goto err;
3093f856f099SNavdeep Parhar 
3094f856f099SNavdeep Parhar 	mboxlog = (struct cudbg_mbox_log *)scratch_buff.data;
3095f856f099SNavdeep Parhar 
3096f856f099SNavdeep Parhar 	for (k = 0; k < mbox_cmds; k++) {
3097f856f099SNavdeep Parhar 		entry_idx = log->cursor + k;
3098f856f099SNavdeep Parhar 		if (entry_idx >= log->size)
3099f856f099SNavdeep Parhar 			entry_idx -= log->size;
3100f856f099SNavdeep Parhar 		entry = mbox_cmd_log_entry(log, entry_idx);
3101f856f099SNavdeep Parhar 
3102f856f099SNavdeep Parhar 		/* skip over unused entries */
3103f856f099SNavdeep Parhar 		if (entry->timestamp == 0)
3104f856f099SNavdeep Parhar 			continue;
3105f856f099SNavdeep Parhar 
3106f856f099SNavdeep Parhar 		memcpy(&mboxlog->entry, entry, sizeof(struct mbox_cmd));
3107f856f099SNavdeep Parhar 
3108f856f099SNavdeep Parhar 		for (i = 0; i < MBOX_LEN / 8; i++) {
3109f856f099SNavdeep Parhar 			flit = entry->cmd[i];
3110f856f099SNavdeep Parhar 			mboxlog->hi[i] = (u32)(flit >> 32);
3111f856f099SNavdeep Parhar 			mboxlog->lo[i] = (u32)flit;
3112f856f099SNavdeep Parhar 		}
3113f856f099SNavdeep Parhar 
3114f856f099SNavdeep Parhar 		mboxlog++;
3115f856f099SNavdeep Parhar 	}
3116f856f099SNavdeep Parhar 
3117f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
3118f856f099SNavdeep Parhar 	if (rc)
3119f856f099SNavdeep Parhar 		goto err1;
3120f856f099SNavdeep Parhar 
3121f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
3122f856f099SNavdeep Parhar 
3123f856f099SNavdeep Parhar err1:
3124f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
3125f856f099SNavdeep Parhar err:
3126f856f099SNavdeep Parhar 	return rc;
3127f856f099SNavdeep Parhar #endif
31286cc4520bSNavdeep Parhar 	return (CUDBG_STATUS_NOT_IMPLEMENTED);
3129f856f099SNavdeep Parhar }
3130f856f099SNavdeep Parhar 
collect_pbt_tables(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)3131f856f099SNavdeep Parhar static int collect_pbt_tables(struct cudbg_init *pdbg_init,
3132f856f099SNavdeep Parhar 			      struct cudbg_buffer *dbg_buff,
3133f856f099SNavdeep Parhar 			      struct cudbg_error *cudbg_err)
3134f856f099SNavdeep Parhar {
3135f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
3136f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
3137f856f099SNavdeep Parhar 	struct cudbg_pbt_tables *pbt = NULL;
3138f856f099SNavdeep Parhar 	u32 size;
3139f856f099SNavdeep Parhar 	u32 addr;
3140f856f099SNavdeep Parhar 	int i, rc;
3141f856f099SNavdeep Parhar 
3142f856f099SNavdeep Parhar 	size = sizeof(struct cudbg_pbt_tables);
3143f856f099SNavdeep Parhar 	scratch_buff.size = size;
3144f856f099SNavdeep Parhar 
3145f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, scratch_buff.size, &scratch_buff);
3146f856f099SNavdeep Parhar 	if (rc)
3147f856f099SNavdeep Parhar 		goto err;
3148f856f099SNavdeep Parhar 
3149f856f099SNavdeep Parhar 	pbt = (struct cudbg_pbt_tables *)scratch_buff.data;
3150f856f099SNavdeep Parhar 
3151f856f099SNavdeep Parhar 	/* PBT dynamic entries */
3152f856f099SNavdeep Parhar 	addr = CUDBG_CHAC_PBT_ADDR;
3153f856f099SNavdeep Parhar 	for (i = 0; i < CUDBG_PBT_DYNAMIC_ENTRIES; i++) {
3154f856f099SNavdeep Parhar 		rc = cim_ha_rreg(padap, addr + (i * 4), &pbt->pbt_dynamic[i]);
3155f856f099SNavdeep Parhar 		if (rc) {
3156f856f099SNavdeep Parhar 			if (pdbg_init->verbose)
3157f856f099SNavdeep Parhar 				pdbg_init->print("BUSY timeout reading"
3158f856f099SNavdeep Parhar 					 "CIM_HOST_ACC_CTRL\n");
3159f856f099SNavdeep Parhar 			goto err1;
3160f856f099SNavdeep Parhar 		}
3161f856f099SNavdeep Parhar 	}
3162f856f099SNavdeep Parhar 
3163f856f099SNavdeep Parhar 	/* PBT static entries */
3164f856f099SNavdeep Parhar 
3165f856f099SNavdeep Parhar 	/* static entries start when bit 6 is set */
3166f856f099SNavdeep Parhar 	addr = CUDBG_CHAC_PBT_ADDR + (1 << 6);
3167f856f099SNavdeep Parhar 	for (i = 0; i < CUDBG_PBT_STATIC_ENTRIES; i++) {
3168f856f099SNavdeep Parhar 		rc = cim_ha_rreg(padap, addr + (i * 4), &pbt->pbt_static[i]);
3169f856f099SNavdeep Parhar 		if (rc) {
3170f856f099SNavdeep Parhar 			if (pdbg_init->verbose)
3171f856f099SNavdeep Parhar 				pdbg_init->print("BUSY timeout reading"
3172f856f099SNavdeep Parhar 					 "CIM_HOST_ACC_CTRL\n");
3173f856f099SNavdeep Parhar 			goto err1;
3174f856f099SNavdeep Parhar 		}
3175f856f099SNavdeep Parhar 	}
3176f856f099SNavdeep Parhar 
3177f856f099SNavdeep Parhar 	/* LRF entries */
3178f856f099SNavdeep Parhar 	addr = CUDBG_CHAC_PBT_LRF;
3179f856f099SNavdeep Parhar 	for (i = 0; i < CUDBG_LRF_ENTRIES; i++) {
3180f856f099SNavdeep Parhar 		rc = cim_ha_rreg(padap, addr + (i * 4), &pbt->lrf_table[i]);
3181f856f099SNavdeep Parhar 		if (rc) {
3182f856f099SNavdeep Parhar 			if (pdbg_init->verbose)
3183f856f099SNavdeep Parhar 				pdbg_init->print("BUSY timeout reading"
3184f856f099SNavdeep Parhar 					 "CIM_HOST_ACC_CTRL\n");
3185f856f099SNavdeep Parhar 			goto err1;
3186f856f099SNavdeep Parhar 		}
3187f856f099SNavdeep Parhar 	}
3188f856f099SNavdeep Parhar 
3189f856f099SNavdeep Parhar 	/* PBT data entries */
3190f856f099SNavdeep Parhar 	addr = CUDBG_CHAC_PBT_DATA;
3191f856f099SNavdeep Parhar 	for (i = 0; i < CUDBG_PBT_DATA_ENTRIES; i++) {
3192f856f099SNavdeep Parhar 		rc = cim_ha_rreg(padap, addr + (i * 4), &pbt->pbt_data[i]);
3193f856f099SNavdeep Parhar 		if (rc) {
3194f856f099SNavdeep Parhar 			if (pdbg_init->verbose)
3195f856f099SNavdeep Parhar 				pdbg_init->print("BUSY timeout reading"
3196f856f099SNavdeep Parhar 					 "CIM_HOST_ACC_CTRL\n");
3197f856f099SNavdeep Parhar 			goto err1;
3198f856f099SNavdeep Parhar 		}
3199f856f099SNavdeep Parhar 	}
3200f856f099SNavdeep Parhar 
3201f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
3202f856f099SNavdeep Parhar 	if (rc)
3203f856f099SNavdeep Parhar 		goto err1;
3204f856f099SNavdeep Parhar 
3205f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
3206f856f099SNavdeep Parhar 
3207f856f099SNavdeep Parhar err1:
3208f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
3209f856f099SNavdeep Parhar err:
3210f856f099SNavdeep Parhar 	return rc;
3211f856f099SNavdeep Parhar }
3212f856f099SNavdeep Parhar 
collect_pm_indirect(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)3213f856f099SNavdeep Parhar static int collect_pm_indirect(struct cudbg_init *pdbg_init,
3214f856f099SNavdeep Parhar 			       struct cudbg_buffer *dbg_buff,
3215f856f099SNavdeep Parhar 			       struct cudbg_error *cudbg_err)
3216f856f099SNavdeep Parhar {
3217f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
3218f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
3219f856f099SNavdeep Parhar 	struct ireg_buf *ch_pm;
3220f856f099SNavdeep Parhar 	u32 size;
3221f856f099SNavdeep Parhar 	int i, rc, n;
3222f856f099SNavdeep Parhar 
3223f856f099SNavdeep Parhar 	n = sizeof(t5_pm_rx_array) / (4 * sizeof(u32));
3224f856f099SNavdeep Parhar 	size = sizeof(struct ireg_buf) * n * 2;
3225f856f099SNavdeep Parhar 	scratch_buff.size = size;
3226f856f099SNavdeep Parhar 
3227f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, scratch_buff.size, &scratch_buff);
3228f856f099SNavdeep Parhar 	if (rc)
3229f856f099SNavdeep Parhar 		goto err;
3230f856f099SNavdeep Parhar 
3231f856f099SNavdeep Parhar 	ch_pm = (struct ireg_buf *)scratch_buff.data;
3232f856f099SNavdeep Parhar 
3233f856f099SNavdeep Parhar 	/*PM_RX*/
3234f856f099SNavdeep Parhar 	for (i = 0; i < n; i++) {
3235f856f099SNavdeep Parhar 		struct ireg_field *pm_pio = &ch_pm->tp_pio;
3236f856f099SNavdeep Parhar 		u32 *buff = ch_pm->outbuf;
3237f856f099SNavdeep Parhar 
3238f856f099SNavdeep Parhar 		pm_pio->ireg_addr = t5_pm_rx_array[i][0];
3239f856f099SNavdeep Parhar 		pm_pio->ireg_data = t5_pm_rx_array[i][1];
3240f856f099SNavdeep Parhar 		pm_pio->ireg_local_offset = t5_pm_rx_array[i][2];
3241f856f099SNavdeep Parhar 		pm_pio->ireg_offset_range = t5_pm_rx_array[i][3];
3242f856f099SNavdeep Parhar 
3243f856f099SNavdeep Parhar 		t4_read_indirect(padap,
3244f856f099SNavdeep Parhar 				pm_pio->ireg_addr,
3245f856f099SNavdeep Parhar 				pm_pio->ireg_data,
3246f856f099SNavdeep Parhar 				buff,
3247f856f099SNavdeep Parhar 				pm_pio->ireg_offset_range,
3248f856f099SNavdeep Parhar 				pm_pio->ireg_local_offset);
3249f856f099SNavdeep Parhar 
3250f856f099SNavdeep Parhar 		ch_pm++;
3251f856f099SNavdeep Parhar 	}
3252f856f099SNavdeep Parhar 
3253f856f099SNavdeep Parhar 	/*PM_Tx*/
3254f856f099SNavdeep Parhar 	n = sizeof(t5_pm_tx_array) / (4 * sizeof(u32));
3255f856f099SNavdeep Parhar 	for (i = 0; i < n; i++) {
3256f856f099SNavdeep Parhar 		struct ireg_field *pm_pio = &ch_pm->tp_pio;
3257f856f099SNavdeep Parhar 		u32 *buff = ch_pm->outbuf;
3258f856f099SNavdeep Parhar 
3259f856f099SNavdeep Parhar 		pm_pio->ireg_addr = t5_pm_tx_array[i][0];
3260f856f099SNavdeep Parhar 		pm_pio->ireg_data = t5_pm_tx_array[i][1];
3261f856f099SNavdeep Parhar 		pm_pio->ireg_local_offset = t5_pm_tx_array[i][2];
3262f856f099SNavdeep Parhar 		pm_pio->ireg_offset_range = t5_pm_tx_array[i][3];
3263f856f099SNavdeep Parhar 
3264f856f099SNavdeep Parhar 		t4_read_indirect(padap,
3265f856f099SNavdeep Parhar 				pm_pio->ireg_addr,
3266f856f099SNavdeep Parhar 				pm_pio->ireg_data,
3267f856f099SNavdeep Parhar 				buff,
3268f856f099SNavdeep Parhar 				pm_pio->ireg_offset_range,
3269f856f099SNavdeep Parhar 				pm_pio->ireg_local_offset);
3270f856f099SNavdeep Parhar 
3271f856f099SNavdeep Parhar 		ch_pm++;
3272f856f099SNavdeep Parhar 	}
3273f856f099SNavdeep Parhar 
3274f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
3275f856f099SNavdeep Parhar 	if (rc)
3276f856f099SNavdeep Parhar 		goto err1;
3277f856f099SNavdeep Parhar 
3278f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
3279f856f099SNavdeep Parhar 
3280f856f099SNavdeep Parhar err1:
3281f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
3282f856f099SNavdeep Parhar err:
3283f856f099SNavdeep Parhar 	return rc;
3284f856f099SNavdeep Parhar 
3285f856f099SNavdeep Parhar }
3286f856f099SNavdeep Parhar 
collect_tid(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)3287f856f099SNavdeep Parhar static int collect_tid(struct cudbg_init *pdbg_init,
3288f856f099SNavdeep Parhar 		       struct cudbg_buffer *dbg_buff,
3289f856f099SNavdeep Parhar 		       struct cudbg_error *cudbg_err)
3290f856f099SNavdeep Parhar {
3291f856f099SNavdeep Parhar 
3292f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
3293f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
3294f856f099SNavdeep Parhar 	struct tid_info_region *tid;
3295f856f099SNavdeep Parhar 	struct tid_info_region_rev1 *tid1;
3296f856f099SNavdeep Parhar 	u32 para[7], val[7];
3297f856f099SNavdeep Parhar 	u32 mbox, pf;
3298f856f099SNavdeep Parhar 	int rc;
3299f856f099SNavdeep Parhar 
3300f856f099SNavdeep Parhar 	scratch_buff.size = sizeof(struct tid_info_region_rev1);
3301f856f099SNavdeep Parhar 
3302f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, scratch_buff.size, &scratch_buff);
3303f856f099SNavdeep Parhar 	if (rc)
3304f856f099SNavdeep Parhar 		goto err;
3305f856f099SNavdeep Parhar 
3306f856f099SNavdeep Parhar #define FW_PARAM_DEV_A(param) \
3307f856f099SNavdeep Parhar 	(V_FW_PARAMS_MNEM(FW_PARAMS_MNEM_DEV) | \
3308f856f099SNavdeep Parhar 	 V_FW_PARAMS_PARAM_X(FW_PARAMS_PARAM_DEV_##param))
3309f856f099SNavdeep Parhar #define FW_PARAM_PFVF_A(param) \
3310f856f099SNavdeep Parhar 	(V_FW_PARAMS_MNEM(FW_PARAMS_MNEM_PFVF) | \
3311f856f099SNavdeep Parhar 	 V_FW_PARAMS_PARAM_X(FW_PARAMS_PARAM_PFVF_##param)|  \
3312f856f099SNavdeep Parhar 	 V_FW_PARAMS_PARAM_Y(0) | \
3313f856f099SNavdeep Parhar 	 V_FW_PARAMS_PARAM_Z(0))
3314f856f099SNavdeep Parhar #define MAX_ATIDS_A 8192U
3315f856f099SNavdeep Parhar 
3316f856f099SNavdeep Parhar 	tid1 = (struct tid_info_region_rev1 *)scratch_buff.data;
3317f856f099SNavdeep Parhar 	tid = &(tid1->tid);
3318f856f099SNavdeep Parhar 	tid1->ver_hdr.signature = CUDBG_ENTITY_SIGNATURE;
3319f856f099SNavdeep Parhar 	tid1->ver_hdr.revision = CUDBG_TID_INFO_REV;
3320f856f099SNavdeep Parhar 	tid1->ver_hdr.size = sizeof(struct tid_info_region_rev1) -
3321f856f099SNavdeep Parhar 			     sizeof(struct cudbg_ver_hdr);
3322f856f099SNavdeep Parhar 
3323f856f099SNavdeep Parhar 	if (is_t5(padap)) {
3324f856f099SNavdeep Parhar 		tid->hash_base = t4_read_reg(padap, A_LE_DB_TID_HASHBASE);
3325f856f099SNavdeep Parhar 		tid1->tid_start = 0;
3326f856f099SNavdeep Parhar 	} else if (is_t6(padap)) {
3327f856f099SNavdeep Parhar 		tid->hash_base = t4_read_reg(padap, A_T6_LE_DB_HASH_TID_BASE);
3328f856f099SNavdeep Parhar 		tid1->tid_start = t4_read_reg(padap, A_LE_DB_ACTIVE_TABLE_START_INDEX);
3329f856f099SNavdeep Parhar 	}
3330f856f099SNavdeep Parhar 
3331f856f099SNavdeep Parhar 	tid->le_db_conf = t4_read_reg(padap, A_LE_DB_CONFIG);
3332f856f099SNavdeep Parhar 
3333f856f099SNavdeep Parhar 	para[0] = FW_PARAM_PFVF_A(FILTER_START);
3334f856f099SNavdeep Parhar 	para[1] = FW_PARAM_PFVF_A(FILTER_END);
3335f856f099SNavdeep Parhar 	para[2] = FW_PARAM_PFVF_A(ACTIVE_FILTER_START);
3336f856f099SNavdeep Parhar 	para[3] = FW_PARAM_PFVF_A(ACTIVE_FILTER_END);
3337f856f099SNavdeep Parhar 	para[4] = FW_PARAM_DEV_A(NTID);
3338f856f099SNavdeep Parhar 	para[5] = FW_PARAM_PFVF_A(SERVER_START);
3339f856f099SNavdeep Parhar 	para[6] = FW_PARAM_PFVF_A(SERVER_END);
3340f856f099SNavdeep Parhar 
33418ee789e9SNavdeep Parhar 	rc = begin_synchronized_op(padap, NULL, SLEEP_OK | INTR_OK, "t4cudq");
33428ee789e9SNavdeep Parhar 	if (rc)
33438ee789e9SNavdeep Parhar 		goto err;
3344f856f099SNavdeep Parhar 	mbox = padap->mbox;
3345f856f099SNavdeep Parhar 	pf = padap->pf;
3346f856f099SNavdeep Parhar 	rc = t4_query_params(padap, mbox, pf, 0, 7, para, val);
3347f856f099SNavdeep Parhar 	if (rc <  0) {
3348f856f099SNavdeep Parhar 		if (rc == -FW_EPERM) {
3349f856f099SNavdeep Parhar 			/* It looks like we don't have permission to use
3350f856f099SNavdeep Parhar 			 * padap->mbox.
3351f856f099SNavdeep Parhar 			 *
3352f856f099SNavdeep Parhar 			 * Try mbox 4.  If it works, we'll continue to
3353f856f099SNavdeep Parhar 			 * collect the rest of tid info from mbox 4.
3354f856f099SNavdeep Parhar 			 * Else, quit trying to collect tid info.
3355f856f099SNavdeep Parhar 			 */
3356f856f099SNavdeep Parhar 			mbox = 4;
3357f856f099SNavdeep Parhar 			pf = 4;
3358f856f099SNavdeep Parhar 			rc = t4_query_params(padap, mbox, pf, 0, 7, para, val);
3359f856f099SNavdeep Parhar 			if (rc < 0) {
3360f856f099SNavdeep Parhar 				cudbg_err->sys_err = rc;
3361f856f099SNavdeep Parhar 				goto err1;
3362f856f099SNavdeep Parhar 			}
3363f856f099SNavdeep Parhar 		} else {
3364f856f099SNavdeep Parhar 			cudbg_err->sys_err = rc;
3365f856f099SNavdeep Parhar 			goto err1;
3366f856f099SNavdeep Parhar 		}
3367f856f099SNavdeep Parhar 	}
3368f856f099SNavdeep Parhar 
3369f856f099SNavdeep Parhar 	tid->ftid_base = val[0];
3370f856f099SNavdeep Parhar 	tid->nftids = val[1] - val[0] + 1;
3371f856f099SNavdeep Parhar 	/*active filter region*/
3372f856f099SNavdeep Parhar 	if (val[2] != val[3]) {
3373f856f099SNavdeep Parhar #ifdef notyet
3374f856f099SNavdeep Parhar 		tid->flags |= FW_OFLD_CONN;
3375f856f099SNavdeep Parhar #endif
3376f856f099SNavdeep Parhar 		tid->aftid_base = val[2];
3377f856f099SNavdeep Parhar 		tid->aftid_end = val[3];
3378f856f099SNavdeep Parhar 	}
3379f856f099SNavdeep Parhar 	tid->ntids = val[4];
3380f856f099SNavdeep Parhar 	tid->natids = min_t(u32, tid->ntids / 2, MAX_ATIDS_A);
3381f856f099SNavdeep Parhar 	tid->stid_base = val[5];
3382f856f099SNavdeep Parhar 	tid->nstids = val[6] - val[5] + 1;
3383f856f099SNavdeep Parhar 
3384f856f099SNavdeep Parhar 	if (chip_id(padap) >= CHELSIO_T6) {
3385f856f099SNavdeep Parhar 		para[0] = FW_PARAM_PFVF_A(HPFILTER_START);
3386f856f099SNavdeep Parhar 		para[1] = FW_PARAM_PFVF_A(HPFILTER_END);
3387f856f099SNavdeep Parhar 		rc = t4_query_params(padap, mbox, pf, 0, 2, para, val);
3388f856f099SNavdeep Parhar 		if (rc < 0) {
3389f856f099SNavdeep Parhar 			cudbg_err->sys_err = rc;
3390f856f099SNavdeep Parhar 			goto err1;
3391f856f099SNavdeep Parhar 		}
3392f856f099SNavdeep Parhar 
3393f856f099SNavdeep Parhar 		tid->hpftid_base = val[0];
3394f856f099SNavdeep Parhar 		tid->nhpftids = val[1] - val[0] + 1;
3395f856f099SNavdeep Parhar 	}
3396f856f099SNavdeep Parhar 
3397f856f099SNavdeep Parhar 	if (chip_id(padap) <= CHELSIO_T5) {
3398f856f099SNavdeep Parhar 		tid->sb = t4_read_reg(padap, A_LE_DB_SERVER_INDEX) / 4;
3399f856f099SNavdeep Parhar 		tid->hash_base /= 4;
3400f856f099SNavdeep Parhar 	} else
3401f856f099SNavdeep Parhar 		tid->sb = t4_read_reg(padap, A_LE_DB_SRVR_START_INDEX);
3402f856f099SNavdeep Parhar 
3403f856f099SNavdeep Parhar 	/*UO context range*/
3404f856f099SNavdeep Parhar 	para[0] = FW_PARAM_PFVF_A(ETHOFLD_START);
3405f856f099SNavdeep Parhar 	para[1] = FW_PARAM_PFVF_A(ETHOFLD_END);
3406f856f099SNavdeep Parhar 
3407f856f099SNavdeep Parhar 	rc = t4_query_params(padap, mbox, pf, 0, 2, para, val);
3408f856f099SNavdeep Parhar 	if (rc <  0) {
3409f856f099SNavdeep Parhar 		cudbg_err->sys_err = rc;
3410f856f099SNavdeep Parhar 		goto err1;
3411f856f099SNavdeep Parhar 	}
3412f856f099SNavdeep Parhar 
3413f856f099SNavdeep Parhar 	if (val[0] != val[1]) {
3414f856f099SNavdeep Parhar 		tid->uotid_base = val[0];
3415f856f099SNavdeep Parhar 		tid->nuotids = val[1] - val[0] + 1;
3416f856f099SNavdeep Parhar 	}
3417f856f099SNavdeep Parhar 	tid->IP_users = t4_read_reg(padap, A_LE_DB_ACT_CNT_IPV4);
3418f856f099SNavdeep Parhar 	tid->IPv6_users = t4_read_reg(padap, A_LE_DB_ACT_CNT_IPV6);
3419f856f099SNavdeep Parhar 
3420f856f099SNavdeep Parhar #undef FW_PARAM_PFVF_A
3421f856f099SNavdeep Parhar #undef FW_PARAM_DEV_A
3422f856f099SNavdeep Parhar #undef MAX_ATIDS_A
3423f856f099SNavdeep Parhar 
3424f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
3425f856f099SNavdeep Parhar 	if (rc)
3426f856f099SNavdeep Parhar 		goto err1;
3427f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
3428f856f099SNavdeep Parhar 
3429f856f099SNavdeep Parhar err1:
34308ee789e9SNavdeep Parhar 	end_synchronized_op(padap, 0);
3431f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
3432f856f099SNavdeep Parhar err:
3433f856f099SNavdeep Parhar 	return rc;
3434f856f099SNavdeep Parhar }
3435f856f099SNavdeep Parhar 
collect_tx_rate(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)3436f856f099SNavdeep Parhar static int collect_tx_rate(struct cudbg_init *pdbg_init,
3437f856f099SNavdeep Parhar 			   struct cudbg_buffer *dbg_buff,
3438f856f099SNavdeep Parhar 			   struct cudbg_error *cudbg_err)
3439f856f099SNavdeep Parhar {
3440f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
3441f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
3442f856f099SNavdeep Parhar 	struct tx_rate *tx_rate;
3443f856f099SNavdeep Parhar 	u32 size;
3444f856f099SNavdeep Parhar 	int rc;
3445f856f099SNavdeep Parhar 
3446f856f099SNavdeep Parhar 	size = sizeof(struct tx_rate);
3447f856f099SNavdeep Parhar 	scratch_buff.size = size;
3448f856f099SNavdeep Parhar 
3449f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, scratch_buff.size, &scratch_buff);
3450f856f099SNavdeep Parhar 	if (rc)
3451f856f099SNavdeep Parhar 		goto err;
3452f856f099SNavdeep Parhar 
3453f856f099SNavdeep Parhar 	tx_rate = (struct tx_rate *)scratch_buff.data;
3454f856f099SNavdeep Parhar 	t4_get_chan_txrate(padap, tx_rate->nrate, tx_rate->orate);
3455f856f099SNavdeep Parhar 	tx_rate->nchan = padap->chip_params->nchan;
3456f856f099SNavdeep Parhar 
3457f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
3458f856f099SNavdeep Parhar 	if (rc)
3459f856f099SNavdeep Parhar 		goto err1;
3460f856f099SNavdeep Parhar 
3461f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
3462f856f099SNavdeep Parhar 
3463f856f099SNavdeep Parhar err1:
3464f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
3465f856f099SNavdeep Parhar err:
3466f856f099SNavdeep Parhar 	return rc;
3467f856f099SNavdeep Parhar }
3468f856f099SNavdeep Parhar 
cudbg_tcamxy2valmask(u64 x,u64 y,u8 * addr,u64 * mask)3469f856f099SNavdeep Parhar static inline void cudbg_tcamxy2valmask(u64 x, u64 y, u8 *addr, u64 *mask)
3470f856f099SNavdeep Parhar {
3471f856f099SNavdeep Parhar 	*mask = x | y;
3472f856f099SNavdeep Parhar 	y = (__force u64)cpu_to_be64(y);
3473f856f099SNavdeep Parhar 	memcpy(addr, (char *)&y + 2, ETH_ALEN);
3474f856f099SNavdeep Parhar }
3475f856f099SNavdeep Parhar 
mps_rpl_backdoor(struct adapter * padap,struct fw_ldst_mps_rplc * mps_rplc)3476f856f099SNavdeep Parhar static void mps_rpl_backdoor(struct adapter *padap, struct fw_ldst_mps_rplc *mps_rplc)
3477f856f099SNavdeep Parhar {
3478f856f099SNavdeep Parhar 	if (is_t5(padap)) {
3479f856f099SNavdeep Parhar 		mps_rplc->rplc255_224 = htonl(t4_read_reg(padap,
3480f856f099SNavdeep Parhar 							  A_MPS_VF_RPLCT_MAP3));
3481f856f099SNavdeep Parhar 		mps_rplc->rplc223_192 = htonl(t4_read_reg(padap,
3482f856f099SNavdeep Parhar 							  A_MPS_VF_RPLCT_MAP2));
3483f856f099SNavdeep Parhar 		mps_rplc->rplc191_160 = htonl(t4_read_reg(padap,
3484f856f099SNavdeep Parhar 							  A_MPS_VF_RPLCT_MAP1));
3485f856f099SNavdeep Parhar 		mps_rplc->rplc159_128 = htonl(t4_read_reg(padap,
3486f856f099SNavdeep Parhar 							  A_MPS_VF_RPLCT_MAP0));
3487f856f099SNavdeep Parhar 	} else {
3488f856f099SNavdeep Parhar 		mps_rplc->rplc255_224 = htonl(t4_read_reg(padap,
3489f856f099SNavdeep Parhar 							  A_MPS_VF_RPLCT_MAP7));
3490f856f099SNavdeep Parhar 		mps_rplc->rplc223_192 = htonl(t4_read_reg(padap,
3491f856f099SNavdeep Parhar 							  A_MPS_VF_RPLCT_MAP6));
3492f856f099SNavdeep Parhar 		mps_rplc->rplc191_160 = htonl(t4_read_reg(padap,
3493f856f099SNavdeep Parhar 							  A_MPS_VF_RPLCT_MAP5));
3494f856f099SNavdeep Parhar 		mps_rplc->rplc159_128 = htonl(t4_read_reg(padap,
3495f856f099SNavdeep Parhar 							  A_MPS_VF_RPLCT_MAP4));
3496f856f099SNavdeep Parhar 	}
3497f856f099SNavdeep Parhar 	mps_rplc->rplc127_96 = htonl(t4_read_reg(padap, A_MPS_VF_RPLCT_MAP3));
3498f856f099SNavdeep Parhar 	mps_rplc->rplc95_64 = htonl(t4_read_reg(padap, A_MPS_VF_RPLCT_MAP2));
3499f856f099SNavdeep Parhar 	mps_rplc->rplc63_32 = htonl(t4_read_reg(padap, A_MPS_VF_RPLCT_MAP1));
3500f856f099SNavdeep Parhar 	mps_rplc->rplc31_0 = htonl(t4_read_reg(padap, A_MPS_VF_RPLCT_MAP0));
3501f856f099SNavdeep Parhar }
3502f856f099SNavdeep Parhar 
collect_mps_tcam(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)3503f856f099SNavdeep Parhar static int collect_mps_tcam(struct cudbg_init *pdbg_init,
3504f856f099SNavdeep Parhar 			    struct cudbg_buffer *dbg_buff,
3505f856f099SNavdeep Parhar 			    struct cudbg_error *cudbg_err)
3506f856f099SNavdeep Parhar {
3507f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
3508f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
3509f856f099SNavdeep Parhar 	struct cudbg_mps_tcam *tcam = NULL;
3510f856f099SNavdeep Parhar 	u32 size = 0, i, n, total_size = 0;
3511f856f099SNavdeep Parhar 	u32 ctl, data2;
3512f856f099SNavdeep Parhar 	u64 tcamy, tcamx, val;
3513f856f099SNavdeep Parhar 	int rc;
3514f856f099SNavdeep Parhar 
3515f856f099SNavdeep Parhar 	n = padap->chip_params->mps_tcam_size;
3516f856f099SNavdeep Parhar 	size = sizeof(struct cudbg_mps_tcam) * n;
3517f856f099SNavdeep Parhar 	scratch_buff.size = size;
3518f856f099SNavdeep Parhar 
3519f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, scratch_buff.size, &scratch_buff);
3520f856f099SNavdeep Parhar 	if (rc)
3521f856f099SNavdeep Parhar 		goto err;
3522f856f099SNavdeep Parhar 	memset(scratch_buff.data, 0, size);
3523f856f099SNavdeep Parhar 
3524f856f099SNavdeep Parhar 	tcam = (struct cudbg_mps_tcam *)scratch_buff.data;
3525f856f099SNavdeep Parhar 	for (i = 0; i < n; i++) {
3526f856f099SNavdeep Parhar 		if (chip_id(padap) >= CHELSIO_T6) {
3527f856f099SNavdeep Parhar 			/* CtlReqID   - 1: use Host Driver Requester ID
3528f856f099SNavdeep Parhar 			 * CtlCmdType - 0: Read, 1: Write
3529f856f099SNavdeep Parhar 			 * CtlTcamSel - 0: TCAM0, 1: TCAM1
3530f856f099SNavdeep Parhar 			 * CtlXYBitSel- 0: Y bit, 1: X bit
3531f856f099SNavdeep Parhar 			 */
3532f856f099SNavdeep Parhar 
3533f856f099SNavdeep Parhar 			/* Read tcamy */
3534f856f099SNavdeep Parhar 			ctl = (V_CTLREQID(1) |
3535f856f099SNavdeep Parhar 			       V_CTLCMDTYPE(0) | V_CTLXYBITSEL(0));
3536f856f099SNavdeep Parhar 			if (i < 256)
3537f856f099SNavdeep Parhar 				ctl |= V_CTLTCAMINDEX(i) | V_CTLTCAMSEL(0);
3538f856f099SNavdeep Parhar 			else
3539f856f099SNavdeep Parhar 				ctl |= V_CTLTCAMINDEX(i - 256) |
3540f856f099SNavdeep Parhar 				       V_CTLTCAMSEL(1);
3541f856f099SNavdeep Parhar 
3542f856f099SNavdeep Parhar 			t4_write_reg(padap, A_MPS_CLS_TCAM_DATA2_CTL, ctl);
3543f856f099SNavdeep Parhar 			val = t4_read_reg(padap, A_MPS_CLS_TCAM_RDATA1_REQ_ID1);
3544f856f099SNavdeep Parhar 			tcamy = G_DMACH(val) << 32;
3545f856f099SNavdeep Parhar 			tcamy |= t4_read_reg(padap, A_MPS_CLS_TCAM_RDATA0_REQ_ID1);
3546f856f099SNavdeep Parhar 			data2 = t4_read_reg(padap, A_MPS_CLS_TCAM_RDATA2_REQ_ID1);
3547f856f099SNavdeep Parhar 			tcam->lookup_type = G_DATALKPTYPE(data2);
3548f856f099SNavdeep Parhar 
3549f856f099SNavdeep Parhar 			/* 0 - Outer header, 1 - Inner header
3550f856f099SNavdeep Parhar 			 * [71:48] bit locations are overloaded for
3551f856f099SNavdeep Parhar 			 * outer vs. inner lookup types.
3552f856f099SNavdeep Parhar 			 */
3553f856f099SNavdeep Parhar 
3554f856f099SNavdeep Parhar 			if (tcam->lookup_type &&
3555f856f099SNavdeep Parhar 			    (tcam->lookup_type != M_DATALKPTYPE)) {
3556f856f099SNavdeep Parhar 				/* Inner header VNI */
3557f856f099SNavdeep Parhar 				tcam->vniy = ((data2 & F_DATAVIDH2) << 23) |
3558f856f099SNavdeep Parhar 					     (G_DATAVIDH1(data2) << 16) |
3559f856f099SNavdeep Parhar 					     G_VIDL(val);
3560f856f099SNavdeep Parhar 				tcam->dip_hit = data2 & F_DATADIPHIT;
3561f856f099SNavdeep Parhar 			} else {
3562f856f099SNavdeep Parhar 				tcam->vlan_vld = data2 & F_DATAVIDH2;
3563f856f099SNavdeep Parhar 				tcam->ivlan = G_VIDL(val);
3564f856f099SNavdeep Parhar 			}
3565f856f099SNavdeep Parhar 
3566f856f099SNavdeep Parhar 			tcam->port_num = G_DATAPORTNUM(data2);
3567f856f099SNavdeep Parhar 
3568f856f099SNavdeep Parhar 			/* Read tcamx. Change the control param */
3569f856f099SNavdeep Parhar 			ctl |= V_CTLXYBITSEL(1);
3570f856f099SNavdeep Parhar 			t4_write_reg(padap, A_MPS_CLS_TCAM_DATA2_CTL, ctl);
3571f856f099SNavdeep Parhar 			val = t4_read_reg(padap, A_MPS_CLS_TCAM_RDATA1_REQ_ID1);
3572f856f099SNavdeep Parhar 			tcamx = G_DMACH(val) << 32;
3573f856f099SNavdeep Parhar 			tcamx |= t4_read_reg(padap, A_MPS_CLS_TCAM_RDATA0_REQ_ID1);
3574f856f099SNavdeep Parhar 			data2 = t4_read_reg(padap, A_MPS_CLS_TCAM_RDATA2_REQ_ID1);
3575f856f099SNavdeep Parhar 			if (tcam->lookup_type &&
3576f856f099SNavdeep Parhar 			    (tcam->lookup_type != M_DATALKPTYPE)) {
3577f856f099SNavdeep Parhar 				/* Inner header VNI mask */
3578f856f099SNavdeep Parhar 				tcam->vnix = ((data2 & F_DATAVIDH2) << 23) |
3579f856f099SNavdeep Parhar 					     (G_DATAVIDH1(data2) << 16) |
3580f856f099SNavdeep Parhar 					     G_VIDL(val);
3581f856f099SNavdeep Parhar 			}
3582f856f099SNavdeep Parhar 		} else {
3583f856f099SNavdeep Parhar 			tcamy = t4_read_reg64(padap, MPS_CLS_TCAM_Y_L(i));
3584f856f099SNavdeep Parhar 			tcamx = t4_read_reg64(padap, MPS_CLS_TCAM_X_L(i));
3585f856f099SNavdeep Parhar 		}
3586f856f099SNavdeep Parhar 
3587f856f099SNavdeep Parhar 		if (tcamx & tcamy)
3588f856f099SNavdeep Parhar 			continue;
3589f856f099SNavdeep Parhar 
3590f856f099SNavdeep Parhar 		tcam->cls_lo = t4_read_reg(padap, MPS_CLS_SRAM_L(i));
3591f856f099SNavdeep Parhar 		tcam->cls_hi = t4_read_reg(padap, MPS_CLS_SRAM_H(i));
3592f856f099SNavdeep Parhar 
3593f856f099SNavdeep Parhar 		if (is_t5(padap))
3594f856f099SNavdeep Parhar 			tcam->repli = (tcam->cls_lo & F_REPLICATE);
3595f856f099SNavdeep Parhar 		else if (is_t6(padap))
3596f856f099SNavdeep Parhar 			tcam->repli = (tcam->cls_lo & F_T6_REPLICATE);
3597f856f099SNavdeep Parhar 
3598f856f099SNavdeep Parhar 		if (tcam->repli) {
3599f856f099SNavdeep Parhar 			struct fw_ldst_cmd ldst_cmd;
3600f856f099SNavdeep Parhar 			struct fw_ldst_mps_rplc mps_rplc;
3601f856f099SNavdeep Parhar 
3602f856f099SNavdeep Parhar 			memset(&ldst_cmd, 0, sizeof(ldst_cmd));
3603f856f099SNavdeep Parhar 			ldst_cmd.op_to_addrspace =
3604f856f099SNavdeep Parhar 				htonl(V_FW_CMD_OP(FW_LDST_CMD) |
3605f856f099SNavdeep Parhar 				      F_FW_CMD_REQUEST |
3606f856f099SNavdeep Parhar 				      F_FW_CMD_READ |
3607f856f099SNavdeep Parhar 				      V_FW_LDST_CMD_ADDRSPACE(
3608f856f099SNavdeep Parhar 					      FW_LDST_ADDRSPC_MPS));
3609f856f099SNavdeep Parhar 
3610f856f099SNavdeep Parhar 			ldst_cmd.cycles_to_len16 = htonl(FW_LEN16(ldst_cmd));
3611f856f099SNavdeep Parhar 
3612f856f099SNavdeep Parhar 			ldst_cmd.u.mps.rplc.fid_idx =
3613f856f099SNavdeep Parhar 				htons(V_FW_LDST_CMD_FID(FW_LDST_MPS_RPLC) |
3614f856f099SNavdeep Parhar 				      V_FW_LDST_CMD_IDX(i));
3615f856f099SNavdeep Parhar 
36168ee789e9SNavdeep Parhar 			rc = begin_synchronized_op(padap, NULL,
36178ee789e9SNavdeep Parhar 			    SLEEP_OK | INTR_OK, "t4cudm");
36188ee789e9SNavdeep Parhar 			if (rc == 0) {
3619f856f099SNavdeep Parhar 				rc = t4_wr_mbox(padap, padap->mbox, &ldst_cmd,
3620f856f099SNavdeep Parhar 						sizeof(ldst_cmd), &ldst_cmd);
36218ee789e9SNavdeep Parhar 				end_synchronized_op(padap, 0);
36228ee789e9SNavdeep Parhar 			}
3623f856f099SNavdeep Parhar 
3624f856f099SNavdeep Parhar 			if (rc)
3625f856f099SNavdeep Parhar 				mps_rpl_backdoor(padap, &mps_rplc);
3626f856f099SNavdeep Parhar 			else
3627f856f099SNavdeep Parhar 				mps_rplc = ldst_cmd.u.mps.rplc;
3628f856f099SNavdeep Parhar 
3629f856f099SNavdeep Parhar 			tcam->rplc[0] = ntohl(mps_rplc.rplc31_0);
3630f856f099SNavdeep Parhar 			tcam->rplc[1] = ntohl(mps_rplc.rplc63_32);
3631f856f099SNavdeep Parhar 			tcam->rplc[2] = ntohl(mps_rplc.rplc95_64);
3632f856f099SNavdeep Parhar 			tcam->rplc[3] = ntohl(mps_rplc.rplc127_96);
3633f856f099SNavdeep Parhar 			if (padap->chip_params->mps_rplc_size >
3634f856f099SNavdeep Parhar 					CUDBG_MAX_RPLC_SIZE) {
3635f856f099SNavdeep Parhar 				tcam->rplc[4] = ntohl(mps_rplc.rplc159_128);
3636f856f099SNavdeep Parhar 				tcam->rplc[5] = ntohl(mps_rplc.rplc191_160);
3637f856f099SNavdeep Parhar 				tcam->rplc[6] = ntohl(mps_rplc.rplc223_192);
3638f856f099SNavdeep Parhar 				tcam->rplc[7] = ntohl(mps_rplc.rplc255_224);
3639f856f099SNavdeep Parhar 			}
3640f856f099SNavdeep Parhar 		}
3641f856f099SNavdeep Parhar 		cudbg_tcamxy2valmask(tcamx, tcamy, tcam->addr, &tcam->mask);
3642f856f099SNavdeep Parhar 
3643f856f099SNavdeep Parhar 		tcam->idx = i;
3644f856f099SNavdeep Parhar 		tcam->rplc_size = padap->chip_params->mps_rplc_size;
3645f856f099SNavdeep Parhar 
3646f856f099SNavdeep Parhar 		total_size += sizeof(struct cudbg_mps_tcam);
3647f856f099SNavdeep Parhar 
3648f856f099SNavdeep Parhar 		tcam++;
3649f856f099SNavdeep Parhar 	}
3650f856f099SNavdeep Parhar 
3651f856f099SNavdeep Parhar 	if (total_size == 0) {
3652f856f099SNavdeep Parhar 		rc = CUDBG_SYSTEM_ERROR;
3653f856f099SNavdeep Parhar 		goto err1;
3654f856f099SNavdeep Parhar 	}
3655f856f099SNavdeep Parhar 
3656f856f099SNavdeep Parhar 	scratch_buff.size = total_size;
3657f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
3658f856f099SNavdeep Parhar 	if (rc)
3659f856f099SNavdeep Parhar 		goto err1;
3660f856f099SNavdeep Parhar 
3661f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
3662f856f099SNavdeep Parhar 
3663f856f099SNavdeep Parhar err1:
3664f856f099SNavdeep Parhar 	scratch_buff.size = size;
3665f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
3666f856f099SNavdeep Parhar err:
3667f856f099SNavdeep Parhar 	return rc;
3668f856f099SNavdeep Parhar }
3669f856f099SNavdeep Parhar 
collect_pcie_config(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)3670f856f099SNavdeep Parhar static int collect_pcie_config(struct cudbg_init *pdbg_init,
3671f856f099SNavdeep Parhar 			       struct cudbg_buffer *dbg_buff,
3672f856f099SNavdeep Parhar 			       struct cudbg_error *cudbg_err)
3673f856f099SNavdeep Parhar {
3674f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
3675f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
3676f856f099SNavdeep Parhar 	u32 size, *value, j;
3677f856f099SNavdeep Parhar 	int i, rc, n;
3678f856f099SNavdeep Parhar 
3679f856f099SNavdeep Parhar 	size = sizeof(u32) * NUM_PCIE_CONFIG_REGS;
3680f856f099SNavdeep Parhar 	n = sizeof(t5_pcie_config_array) / (2 * sizeof(u32));
3681f856f099SNavdeep Parhar 	scratch_buff.size = size;
3682f856f099SNavdeep Parhar 
3683f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, scratch_buff.size, &scratch_buff);
3684f856f099SNavdeep Parhar 	if (rc)
3685f856f099SNavdeep Parhar 		goto err;
3686f856f099SNavdeep Parhar 
3687f856f099SNavdeep Parhar 	value = (u32 *)scratch_buff.data;
3688f856f099SNavdeep Parhar 	for (i = 0; i < n; i++) {
3689f856f099SNavdeep Parhar 		for (j = t5_pcie_config_array[i][0];
3690f856f099SNavdeep Parhar 		     j <= t5_pcie_config_array[i][1]; j += 4) {
3691f856f099SNavdeep Parhar 			*value++ = t4_hw_pci_read_cfg4(padap, j);
3692f856f099SNavdeep Parhar 		}
3693f856f099SNavdeep Parhar 	}
3694f856f099SNavdeep Parhar 
3695f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
3696f856f099SNavdeep Parhar 	if (rc)
3697f856f099SNavdeep Parhar 		goto err1;
3698f856f099SNavdeep Parhar 
3699f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
3700f856f099SNavdeep Parhar 
3701f856f099SNavdeep Parhar err1:
3702f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
3703f856f099SNavdeep Parhar err:
3704f856f099SNavdeep Parhar 	return rc;
3705f856f099SNavdeep Parhar }
3706f856f099SNavdeep Parhar 
cudbg_read_tid(struct cudbg_init * pdbg_init,u32 tid,struct cudbg_tid_data * tid_data)3707f856f099SNavdeep Parhar static int cudbg_read_tid(struct cudbg_init *pdbg_init, u32 tid,
3708f856f099SNavdeep Parhar 			  struct cudbg_tid_data *tid_data)
3709f856f099SNavdeep Parhar {
3710f856f099SNavdeep Parhar 	int i, cmd_retry = 8;
3711f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
3712f856f099SNavdeep Parhar 	u32 val;
3713f856f099SNavdeep Parhar 
3714f856f099SNavdeep Parhar 	/* Fill REQ_DATA regs with 0's */
3715f856f099SNavdeep Parhar 	for (i = 0; i < CUDBG_NUM_REQ_REGS; i++)
3716f856f099SNavdeep Parhar 		t4_write_reg(padap, A_LE_DB_DBGI_REQ_DATA + (i << 2), 0);
3717f856f099SNavdeep Parhar 
3718f856f099SNavdeep Parhar 	/* Write DBIG command */
3719f856f099SNavdeep Parhar 	val = (0x4 << S_DBGICMD) | tid;
3720f856f099SNavdeep Parhar 	t4_write_reg(padap, A_LE_DB_DBGI_REQ_TCAM_CMD, val);
3721f856f099SNavdeep Parhar 	tid_data->dbig_cmd = val;
3722f856f099SNavdeep Parhar 
3723f856f099SNavdeep Parhar 	val = 0;
3724f856f099SNavdeep Parhar 	val |= 1 << S_DBGICMDSTRT;
3725f856f099SNavdeep Parhar 	val |= 1;  /* LE mode */
3726f856f099SNavdeep Parhar 	t4_write_reg(padap, A_LE_DB_DBGI_CONFIG, val);
3727f856f099SNavdeep Parhar 	tid_data->dbig_conf = val;
3728f856f099SNavdeep Parhar 
3729f856f099SNavdeep Parhar 	/* Poll the DBGICMDBUSY bit */
3730f856f099SNavdeep Parhar 	val = 1;
3731f856f099SNavdeep Parhar 	while (val) {
3732f856f099SNavdeep Parhar 		val = t4_read_reg(padap, A_LE_DB_DBGI_CONFIG);
3733f856f099SNavdeep Parhar 		val = (val >> S_DBGICMDBUSY) & 1;
3734f856f099SNavdeep Parhar 		cmd_retry--;
3735f856f099SNavdeep Parhar 		if (!cmd_retry) {
3736f856f099SNavdeep Parhar 			if (pdbg_init->verbose)
3737f856f099SNavdeep Parhar 				pdbg_init->print("%s(): Timeout waiting for non-busy\n",
3738f856f099SNavdeep Parhar 					 __func__);
3739f856f099SNavdeep Parhar 			return CUDBG_SYSTEM_ERROR;
3740f856f099SNavdeep Parhar 		}
3741f856f099SNavdeep Parhar 	}
3742f856f099SNavdeep Parhar 
3743f856f099SNavdeep Parhar 	/* Check RESP status */
3744f856f099SNavdeep Parhar 	val = 0;
3745f856f099SNavdeep Parhar 	val = t4_read_reg(padap, A_LE_DB_DBGI_RSP_STATUS);
3746f856f099SNavdeep Parhar 	tid_data->dbig_rsp_stat = val;
3747f856f099SNavdeep Parhar 	if (!(val & 1)) {
3748f856f099SNavdeep Parhar 		if (pdbg_init->verbose)
3749f856f099SNavdeep Parhar 			pdbg_init->print("%s(): DBGI command failed\n", __func__);
3750f856f099SNavdeep Parhar 		return CUDBG_SYSTEM_ERROR;
3751f856f099SNavdeep Parhar 	}
3752f856f099SNavdeep Parhar 
3753f856f099SNavdeep Parhar 	/* Read RESP data */
3754f856f099SNavdeep Parhar 	for (i = 0; i < CUDBG_NUM_REQ_REGS; i++)
3755f856f099SNavdeep Parhar 		tid_data->data[i] = t4_read_reg(padap,
3756f856f099SNavdeep Parhar 						A_LE_DB_DBGI_RSP_DATA +
3757f856f099SNavdeep Parhar 						(i << 2));
3758f856f099SNavdeep Parhar 
3759f856f099SNavdeep Parhar 	tid_data->tid = tid;
3760f856f099SNavdeep Parhar 
3761f856f099SNavdeep Parhar 	return 0;
3762f856f099SNavdeep Parhar }
3763f856f099SNavdeep Parhar 
collect_le_tcam(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)3764f856f099SNavdeep Parhar static int collect_le_tcam(struct cudbg_init *pdbg_init,
3765f856f099SNavdeep Parhar 			   struct cudbg_buffer *dbg_buff,
3766f856f099SNavdeep Parhar 			   struct cudbg_error *cudbg_err)
3767f856f099SNavdeep Parhar {
3768f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
3769f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
3770f856f099SNavdeep Parhar 	struct cudbg_tcam tcam_region = {0};
3771f856f099SNavdeep Parhar 	struct cudbg_tid_data *tid_data = NULL;
3772f856f099SNavdeep Parhar 	u32 value, bytes = 0, bytes_left  = 0;
3773f856f099SNavdeep Parhar 	u32 i;
3774f856f099SNavdeep Parhar 	int rc, size;
3775f856f099SNavdeep Parhar 
3776f856f099SNavdeep Parhar 	/* Get the LE regions */
3777f856f099SNavdeep Parhar 	value = t4_read_reg(padap, A_LE_DB_TID_HASHBASE); /* Get hash base
3778f856f099SNavdeep Parhar 							     index */
3779f856f099SNavdeep Parhar 	tcam_region.tid_hash_base = value;
3780f856f099SNavdeep Parhar 
3781f856f099SNavdeep Parhar 	/* Get routing table index */
3782f856f099SNavdeep Parhar 	value = t4_read_reg(padap, A_LE_DB_ROUTING_TABLE_INDEX);
3783f856f099SNavdeep Parhar 	tcam_region.routing_start = value;
3784f856f099SNavdeep Parhar 
3785f856f099SNavdeep Parhar 	/*Get clip table index */
3786f856f099SNavdeep Parhar 	value = t4_read_reg(padap, A_LE_DB_CLIP_TABLE_INDEX);
3787f856f099SNavdeep Parhar 	tcam_region.clip_start = value;
3788f856f099SNavdeep Parhar 
3789f856f099SNavdeep Parhar 	/* Get filter table index */
3790f856f099SNavdeep Parhar 	value = t4_read_reg(padap, A_LE_DB_FILTER_TABLE_INDEX);
3791f856f099SNavdeep Parhar 	tcam_region.filter_start = value;
3792f856f099SNavdeep Parhar 
3793f856f099SNavdeep Parhar 	/* Get server table index */
3794f856f099SNavdeep Parhar 	value = t4_read_reg(padap, A_LE_DB_SERVER_INDEX);
3795f856f099SNavdeep Parhar 	tcam_region.server_start = value;
3796f856f099SNavdeep Parhar 
3797f856f099SNavdeep Parhar 	/* Check whether hash is enabled and calculate the max tids */
3798f856f099SNavdeep Parhar 	value = t4_read_reg(padap, A_LE_DB_CONFIG);
3799f856f099SNavdeep Parhar 	if ((value >> S_HASHEN) & 1) {
3800f856f099SNavdeep Parhar 		value = t4_read_reg(padap, A_LE_DB_HASH_CONFIG);
3801f856f099SNavdeep Parhar 		if (chip_id(padap) > CHELSIO_T5)
3802f856f099SNavdeep Parhar 			tcam_region.max_tid = (value & 0xFFFFF) +
3803f856f099SNavdeep Parhar 					      tcam_region.tid_hash_base;
3804f856f099SNavdeep Parhar 		else {	    /* for T5 */
3805f856f099SNavdeep Parhar 			value = G_HASHTIDSIZE(value);
3806f856f099SNavdeep Parhar 			value = 1 << value;
3807f856f099SNavdeep Parhar 			tcam_region.max_tid = value +
3808f856f099SNavdeep Parhar 				tcam_region.tid_hash_base;
3809f856f099SNavdeep Parhar 		}
3810f856f099SNavdeep Parhar 	} else	 /* hash not enabled */
3811f856f099SNavdeep Parhar 		tcam_region.max_tid = CUDBG_MAX_TCAM_TID;
3812f856f099SNavdeep Parhar 
3813f856f099SNavdeep Parhar 	size = sizeof(struct cudbg_tid_data) * tcam_region.max_tid;
3814f856f099SNavdeep Parhar 	size += sizeof(struct cudbg_tcam);
3815f856f099SNavdeep Parhar 	scratch_buff.size = size;
3816f856f099SNavdeep Parhar 
3817f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
3818f856f099SNavdeep Parhar 	if (rc)
3819f856f099SNavdeep Parhar 		goto err;
3820f856f099SNavdeep Parhar 
3821f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, CUDBG_CHUNK_SIZE, &scratch_buff);
3822f856f099SNavdeep Parhar 	if (rc)
3823f856f099SNavdeep Parhar 		goto err;
3824f856f099SNavdeep Parhar 
3825f856f099SNavdeep Parhar 	memcpy(scratch_buff.data, &tcam_region, sizeof(struct cudbg_tcam));
3826f856f099SNavdeep Parhar 
3827f856f099SNavdeep Parhar 	tid_data = (struct cudbg_tid_data *)(((struct cudbg_tcam *)
3828f856f099SNavdeep Parhar 					     scratch_buff.data) + 1);
3829f856f099SNavdeep Parhar 	bytes_left = CUDBG_CHUNK_SIZE - sizeof(struct cudbg_tcam);
3830f856f099SNavdeep Parhar 	bytes = sizeof(struct cudbg_tcam);
3831f856f099SNavdeep Parhar 
3832f856f099SNavdeep Parhar 	/* read all tid */
3833f856f099SNavdeep Parhar 	for (i = 0; i < tcam_region.max_tid; i++) {
3834f856f099SNavdeep Parhar 		if (bytes_left < sizeof(struct cudbg_tid_data)) {
3835f856f099SNavdeep Parhar 			scratch_buff.size = bytes;
3836f856f099SNavdeep Parhar 			rc = compress_buff(&scratch_buff, dbg_buff);
3837f856f099SNavdeep Parhar 			if (rc)
3838f856f099SNavdeep Parhar 				goto err1;
3839f856f099SNavdeep Parhar 			scratch_buff.size = CUDBG_CHUNK_SIZE;
3840f856f099SNavdeep Parhar 			release_scratch_buff(&scratch_buff, dbg_buff);
3841f856f099SNavdeep Parhar 
3842f856f099SNavdeep Parhar 			/* new alloc */
3843f856f099SNavdeep Parhar 			rc = get_scratch_buff(dbg_buff, CUDBG_CHUNK_SIZE,
3844f856f099SNavdeep Parhar 					      &scratch_buff);
3845f856f099SNavdeep Parhar 			if (rc)
3846f856f099SNavdeep Parhar 				goto err;
3847f856f099SNavdeep Parhar 
3848f856f099SNavdeep Parhar 			tid_data = (struct cudbg_tid_data *)(scratch_buff.data);
3849f856f099SNavdeep Parhar 			bytes_left = CUDBG_CHUNK_SIZE;
3850f856f099SNavdeep Parhar 			bytes = 0;
3851f856f099SNavdeep Parhar 		}
3852f856f099SNavdeep Parhar 
3853f856f099SNavdeep Parhar 		rc = cudbg_read_tid(pdbg_init, i, tid_data);
3854f856f099SNavdeep Parhar 
3855f856f099SNavdeep Parhar 		if (rc) {
3856f856f099SNavdeep Parhar 			cudbg_err->sys_err = rc;
3857f856f099SNavdeep Parhar 			goto err1;
3858f856f099SNavdeep Parhar 		}
3859f856f099SNavdeep Parhar 
3860f856f099SNavdeep Parhar 		tid_data++;
3861f856f099SNavdeep Parhar 		bytes_left -= sizeof(struct cudbg_tid_data);
3862f856f099SNavdeep Parhar 		bytes += sizeof(struct cudbg_tid_data);
3863f856f099SNavdeep Parhar 	}
3864f856f099SNavdeep Parhar 
3865f856f099SNavdeep Parhar 	if (bytes) {
3866f856f099SNavdeep Parhar 		scratch_buff.size = bytes;
3867f856f099SNavdeep Parhar 		rc = compress_buff(&scratch_buff, dbg_buff);
3868f856f099SNavdeep Parhar 	}
3869f856f099SNavdeep Parhar 
3870f856f099SNavdeep Parhar err1:
3871f856f099SNavdeep Parhar 	scratch_buff.size = CUDBG_CHUNK_SIZE;
3872f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
3873f856f099SNavdeep Parhar err:
3874f856f099SNavdeep Parhar 	return rc;
3875f856f099SNavdeep Parhar }
3876f856f099SNavdeep Parhar 
collect_ma_indirect(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)3877f856f099SNavdeep Parhar static int collect_ma_indirect(struct cudbg_init *pdbg_init,
3878f856f099SNavdeep Parhar 			       struct cudbg_buffer *dbg_buff,
3879f856f099SNavdeep Parhar 			       struct cudbg_error *cudbg_err)
3880f856f099SNavdeep Parhar {
3881f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
3882f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
3883f856f099SNavdeep Parhar 	struct ireg_buf *ma_indr = NULL;
3884f856f099SNavdeep Parhar 	u32 size, j;
3885f856f099SNavdeep Parhar 	int i, rc, n;
3886f856f099SNavdeep Parhar 
3887f856f099SNavdeep Parhar 	if (chip_id(padap) < CHELSIO_T6) {
3888f856f099SNavdeep Parhar 		if (pdbg_init->verbose)
3889f856f099SNavdeep Parhar 			pdbg_init->print("MA indirect available only in T6\n");
3890f856f099SNavdeep Parhar 		rc = CUDBG_STATUS_ENTITY_NOT_FOUND;
3891f856f099SNavdeep Parhar 		goto err;
3892f856f099SNavdeep Parhar 	}
3893f856f099SNavdeep Parhar 
3894f856f099SNavdeep Parhar 	n = sizeof(t6_ma_ireg_array) / (4 * sizeof(u32));
3895f856f099SNavdeep Parhar 	size = sizeof(struct ireg_buf) * n * 2;
3896f856f099SNavdeep Parhar 	scratch_buff.size = size;
3897f856f099SNavdeep Parhar 
3898f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, scratch_buff.size, &scratch_buff);
3899f856f099SNavdeep Parhar 	if (rc)
3900f856f099SNavdeep Parhar 		goto err;
3901f856f099SNavdeep Parhar 
3902f856f099SNavdeep Parhar 	ma_indr = (struct ireg_buf *)scratch_buff.data;
3903f856f099SNavdeep Parhar 
3904f856f099SNavdeep Parhar 	for (i = 0; i < n; i++) {
3905f856f099SNavdeep Parhar 		struct ireg_field *ma_fli = &ma_indr->tp_pio;
3906f856f099SNavdeep Parhar 		u32 *buff = ma_indr->outbuf;
3907f856f099SNavdeep Parhar 
3908f856f099SNavdeep Parhar 		ma_fli->ireg_addr = t6_ma_ireg_array[i][0];
3909f856f099SNavdeep Parhar 		ma_fli->ireg_data = t6_ma_ireg_array[i][1];
3910f856f099SNavdeep Parhar 		ma_fli->ireg_local_offset = t6_ma_ireg_array[i][2];
3911f856f099SNavdeep Parhar 		ma_fli->ireg_offset_range = t6_ma_ireg_array[i][3];
3912f856f099SNavdeep Parhar 
3913f856f099SNavdeep Parhar 		t4_read_indirect(padap, ma_fli->ireg_addr, ma_fli->ireg_data,
3914f856f099SNavdeep Parhar 				 buff, ma_fli->ireg_offset_range,
3915f856f099SNavdeep Parhar 				 ma_fli->ireg_local_offset);
3916f856f099SNavdeep Parhar 
3917f856f099SNavdeep Parhar 		ma_indr++;
3918f856f099SNavdeep Parhar 
3919f856f099SNavdeep Parhar 	}
3920f856f099SNavdeep Parhar 
3921f856f099SNavdeep Parhar 	n = sizeof(t6_ma_ireg_array2) / (4 * sizeof(u32));
3922f856f099SNavdeep Parhar 
3923f856f099SNavdeep Parhar 	for (i = 0; i < n; i++) {
3924f856f099SNavdeep Parhar 		struct ireg_field *ma_fli = &ma_indr->tp_pio;
3925f856f099SNavdeep Parhar 		u32 *buff = ma_indr->outbuf;
3926f856f099SNavdeep Parhar 
3927f856f099SNavdeep Parhar 		ma_fli->ireg_addr = t6_ma_ireg_array2[i][0];
3928f856f099SNavdeep Parhar 		ma_fli->ireg_data = t6_ma_ireg_array2[i][1];
3929f856f099SNavdeep Parhar 		ma_fli->ireg_local_offset = t6_ma_ireg_array2[i][2];
3930f856f099SNavdeep Parhar 
3931f856f099SNavdeep Parhar 		for (j = 0; j < t6_ma_ireg_array2[i][3]; j++) {
3932f856f099SNavdeep Parhar 			t4_read_indirect(padap, ma_fli->ireg_addr,
3933f856f099SNavdeep Parhar 					 ma_fli->ireg_data, buff, 1,
3934f856f099SNavdeep Parhar 					 ma_fli->ireg_local_offset);
3935f856f099SNavdeep Parhar 			buff++;
3936f856f099SNavdeep Parhar 			ma_fli->ireg_local_offset += 0x20;
3937f856f099SNavdeep Parhar 		}
3938f856f099SNavdeep Parhar 		ma_indr++;
3939f856f099SNavdeep Parhar 	}
3940f856f099SNavdeep Parhar 
3941f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
3942f856f099SNavdeep Parhar 	if (rc)
3943f856f099SNavdeep Parhar 		goto err1;
3944f856f099SNavdeep Parhar 
3945f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
3946f856f099SNavdeep Parhar 
3947f856f099SNavdeep Parhar err1:
3948f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
3949f856f099SNavdeep Parhar err:
3950f856f099SNavdeep Parhar 	return rc;
3951f856f099SNavdeep Parhar }
3952f856f099SNavdeep Parhar 
collect_hma_indirect(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)3953f856f099SNavdeep Parhar static int collect_hma_indirect(struct cudbg_init *pdbg_init,
3954f856f099SNavdeep Parhar 			       struct cudbg_buffer *dbg_buff,
3955f856f099SNavdeep Parhar 			       struct cudbg_error *cudbg_err)
3956f856f099SNavdeep Parhar {
3957f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
3958f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
3959f856f099SNavdeep Parhar 	struct ireg_buf *hma_indr = NULL;
3960f856f099SNavdeep Parhar 	u32 size;
3961f856f099SNavdeep Parhar 	int i, rc, n;
3962f856f099SNavdeep Parhar 
3963f856f099SNavdeep Parhar 	if (chip_id(padap) < CHELSIO_T6) {
3964f856f099SNavdeep Parhar 		if (pdbg_init->verbose)
3965f856f099SNavdeep Parhar 			pdbg_init->print("HMA indirect available only in T6\n");
3966f856f099SNavdeep Parhar 		rc = CUDBG_STATUS_ENTITY_NOT_FOUND;
3967f856f099SNavdeep Parhar 		goto err;
3968f856f099SNavdeep Parhar 	}
3969f856f099SNavdeep Parhar 
3970f856f099SNavdeep Parhar 	n = sizeof(t6_hma_ireg_array) / (4 * sizeof(u32));
3971f856f099SNavdeep Parhar 	size = sizeof(struct ireg_buf) * n;
3972f856f099SNavdeep Parhar 	scratch_buff.size = size;
3973f856f099SNavdeep Parhar 
3974f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, scratch_buff.size, &scratch_buff);
3975f856f099SNavdeep Parhar 	if (rc)
3976f856f099SNavdeep Parhar 		goto err;
3977f856f099SNavdeep Parhar 
3978f856f099SNavdeep Parhar 	hma_indr = (struct ireg_buf *)scratch_buff.data;
3979f856f099SNavdeep Parhar 
3980f856f099SNavdeep Parhar 	for (i = 0; i < n; i++) {
3981f856f099SNavdeep Parhar 		struct ireg_field *hma_fli = &hma_indr->tp_pio;
3982f856f099SNavdeep Parhar 		u32 *buff = hma_indr->outbuf;
3983f856f099SNavdeep Parhar 
3984f856f099SNavdeep Parhar 		hma_fli->ireg_addr = t6_hma_ireg_array[i][0];
3985f856f099SNavdeep Parhar 		hma_fli->ireg_data = t6_hma_ireg_array[i][1];
3986f856f099SNavdeep Parhar 		hma_fli->ireg_local_offset = t6_hma_ireg_array[i][2];
3987f856f099SNavdeep Parhar 		hma_fli->ireg_offset_range = t6_hma_ireg_array[i][3];
3988f856f099SNavdeep Parhar 
3989f856f099SNavdeep Parhar 		t4_read_indirect(padap, hma_fli->ireg_addr, hma_fli->ireg_data,
3990f856f099SNavdeep Parhar 				 buff, hma_fli->ireg_offset_range,
3991f856f099SNavdeep Parhar 				 hma_fli->ireg_local_offset);
3992f856f099SNavdeep Parhar 
3993f856f099SNavdeep Parhar 		hma_indr++;
3994f856f099SNavdeep Parhar 
3995f856f099SNavdeep Parhar 	}
3996f856f099SNavdeep Parhar 
3997f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
3998f856f099SNavdeep Parhar 	if (rc)
3999f856f099SNavdeep Parhar 		goto err1;
4000f856f099SNavdeep Parhar 
4001f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
4002f856f099SNavdeep Parhar 
4003f856f099SNavdeep Parhar err1:
4004f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
4005f856f099SNavdeep Parhar err:
4006f856f099SNavdeep Parhar 	return rc;
4007f856f099SNavdeep Parhar }
4008f856f099SNavdeep Parhar 
collect_pcie_indirect(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)4009f856f099SNavdeep Parhar static int collect_pcie_indirect(struct cudbg_init *pdbg_init,
4010f856f099SNavdeep Parhar 				 struct cudbg_buffer *dbg_buff,
4011f856f099SNavdeep Parhar 				 struct cudbg_error *cudbg_err)
4012f856f099SNavdeep Parhar {
4013f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
4014f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
4015f856f099SNavdeep Parhar 	struct ireg_buf *ch_pcie;
4016f856f099SNavdeep Parhar 	u32 size;
4017f856f099SNavdeep Parhar 	int i, rc, n;
4018f856f099SNavdeep Parhar 
4019f856f099SNavdeep Parhar 	n = sizeof(t5_pcie_pdbg_array) / (4 * sizeof(u32));
4020f856f099SNavdeep Parhar 	size = sizeof(struct ireg_buf) * n * 2;
4021f856f099SNavdeep Parhar 	scratch_buff.size = size;
4022f856f099SNavdeep Parhar 
4023f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, scratch_buff.size, &scratch_buff);
4024f856f099SNavdeep Parhar 	if (rc)
4025f856f099SNavdeep Parhar 		goto err;
4026f856f099SNavdeep Parhar 
4027f856f099SNavdeep Parhar 	ch_pcie = (struct ireg_buf *)scratch_buff.data;
4028f856f099SNavdeep Parhar 
4029f856f099SNavdeep Parhar 	/*PCIE_PDBG*/
4030f856f099SNavdeep Parhar 	for (i = 0; i < n; i++) {
4031f856f099SNavdeep Parhar 		struct ireg_field *pcie_pio = &ch_pcie->tp_pio;
4032f856f099SNavdeep Parhar 		u32 *buff = ch_pcie->outbuf;
4033f856f099SNavdeep Parhar 
4034f856f099SNavdeep Parhar 		pcie_pio->ireg_addr = t5_pcie_pdbg_array[i][0];
4035f856f099SNavdeep Parhar 		pcie_pio->ireg_data = t5_pcie_pdbg_array[i][1];
4036f856f099SNavdeep Parhar 		pcie_pio->ireg_local_offset = t5_pcie_pdbg_array[i][2];
4037f856f099SNavdeep Parhar 		pcie_pio->ireg_offset_range = t5_pcie_pdbg_array[i][3];
4038f856f099SNavdeep Parhar 
4039f856f099SNavdeep Parhar 		t4_read_indirect(padap,
4040f856f099SNavdeep Parhar 				pcie_pio->ireg_addr,
4041f856f099SNavdeep Parhar 				pcie_pio->ireg_data,
4042f856f099SNavdeep Parhar 				buff,
4043f856f099SNavdeep Parhar 				pcie_pio->ireg_offset_range,
4044f856f099SNavdeep Parhar 				pcie_pio->ireg_local_offset);
4045f856f099SNavdeep Parhar 
4046f856f099SNavdeep Parhar 		ch_pcie++;
4047f856f099SNavdeep Parhar 	}
4048f856f099SNavdeep Parhar 
4049f856f099SNavdeep Parhar 	/*PCIE_CDBG*/
4050f856f099SNavdeep Parhar 	n = sizeof(t5_pcie_cdbg_array) / (4 * sizeof(u32));
4051f856f099SNavdeep Parhar 	for (i = 0; i < n; i++) {
4052f856f099SNavdeep Parhar 		struct ireg_field *pcie_pio = &ch_pcie->tp_pio;
4053f856f099SNavdeep Parhar 		u32 *buff = ch_pcie->outbuf;
4054f856f099SNavdeep Parhar 
4055f856f099SNavdeep Parhar 		pcie_pio->ireg_addr = t5_pcie_cdbg_array[i][0];
4056f856f099SNavdeep Parhar 		pcie_pio->ireg_data = t5_pcie_cdbg_array[i][1];
4057f856f099SNavdeep Parhar 		pcie_pio->ireg_local_offset = t5_pcie_cdbg_array[i][2];
4058f856f099SNavdeep Parhar 		pcie_pio->ireg_offset_range = t5_pcie_cdbg_array[i][3];
4059f856f099SNavdeep Parhar 
4060f856f099SNavdeep Parhar 		t4_read_indirect(padap,
4061f856f099SNavdeep Parhar 				pcie_pio->ireg_addr,
4062f856f099SNavdeep Parhar 				pcie_pio->ireg_data,
4063f856f099SNavdeep Parhar 				buff,
4064f856f099SNavdeep Parhar 				pcie_pio->ireg_offset_range,
4065f856f099SNavdeep Parhar 				pcie_pio->ireg_local_offset);
4066f856f099SNavdeep Parhar 
4067f856f099SNavdeep Parhar 		ch_pcie++;
4068f856f099SNavdeep Parhar 	}
4069f856f099SNavdeep Parhar 
4070f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
4071f856f099SNavdeep Parhar 	if (rc)
4072f856f099SNavdeep Parhar 		goto err1;
4073f856f099SNavdeep Parhar 
4074f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
4075f856f099SNavdeep Parhar 
4076f856f099SNavdeep Parhar err1:
4077f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
4078f856f099SNavdeep Parhar err:
4079f856f099SNavdeep Parhar 	return rc;
4080f856f099SNavdeep Parhar 
4081f856f099SNavdeep Parhar }
4082f856f099SNavdeep Parhar 
collect_tp_indirect(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)4083f856f099SNavdeep Parhar static int collect_tp_indirect(struct cudbg_init *pdbg_init,
4084f856f099SNavdeep Parhar 			       struct cudbg_buffer *dbg_buff,
4085f856f099SNavdeep Parhar 			       struct cudbg_error *cudbg_err)
4086f856f099SNavdeep Parhar {
4087f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
4088f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
4089f856f099SNavdeep Parhar 	struct ireg_buf *ch_tp_pio;
4090f856f099SNavdeep Parhar 	u32 size;
4091f856f099SNavdeep Parhar 	int i, rc, n = 0;
4092f856f099SNavdeep Parhar 
4093f856f099SNavdeep Parhar 	if (is_t5(padap))
4094f856f099SNavdeep Parhar 		n = sizeof(t5_tp_pio_array) / (4 * sizeof(u32));
4095f856f099SNavdeep Parhar 	else if (is_t6(padap))
4096f856f099SNavdeep Parhar 		n = sizeof(t6_tp_pio_array) / (4 * sizeof(u32));
4097f856f099SNavdeep Parhar 
4098f856f099SNavdeep Parhar 	size = sizeof(struct ireg_buf) * n * 3;
4099f856f099SNavdeep Parhar 	scratch_buff.size = size;
4100f856f099SNavdeep Parhar 
4101f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, scratch_buff.size, &scratch_buff);
4102f856f099SNavdeep Parhar 	if (rc)
4103f856f099SNavdeep Parhar 		goto err;
4104f856f099SNavdeep Parhar 
4105f856f099SNavdeep Parhar 	ch_tp_pio = (struct ireg_buf *)scratch_buff.data;
4106f856f099SNavdeep Parhar 
4107f856f099SNavdeep Parhar 	/* TP_PIO*/
4108f856f099SNavdeep Parhar 	for (i = 0; i < n; i++) {
4109f856f099SNavdeep Parhar 		struct ireg_field *tp_pio = &ch_tp_pio->tp_pio;
4110f856f099SNavdeep Parhar 		u32 *buff = ch_tp_pio->outbuf;
4111f856f099SNavdeep Parhar 
4112f856f099SNavdeep Parhar 		if (is_t5(padap)) {
4113f856f099SNavdeep Parhar 			tp_pio->ireg_addr = t5_tp_pio_array[i][0];
4114f856f099SNavdeep Parhar 			tp_pio->ireg_data = t5_tp_pio_array[i][1];
4115f856f099SNavdeep Parhar 			tp_pio->ireg_local_offset = t5_tp_pio_array[i][2];
4116f856f099SNavdeep Parhar 			tp_pio->ireg_offset_range = t5_tp_pio_array[i][3];
4117f856f099SNavdeep Parhar 		} else if (is_t6(padap)) {
4118f856f099SNavdeep Parhar 			tp_pio->ireg_addr = t6_tp_pio_array[i][0];
4119f856f099SNavdeep Parhar 			tp_pio->ireg_data = t6_tp_pio_array[i][1];
4120f856f099SNavdeep Parhar 			tp_pio->ireg_local_offset = t6_tp_pio_array[i][2];
4121f856f099SNavdeep Parhar 			tp_pio->ireg_offset_range = t6_tp_pio_array[i][3];
4122f856f099SNavdeep Parhar 		}
4123f856f099SNavdeep Parhar 
4124f856f099SNavdeep Parhar 		t4_tp_pio_read(padap, buff, tp_pio->ireg_offset_range,
4125f856f099SNavdeep Parhar 			       tp_pio->ireg_local_offset, true);
4126f856f099SNavdeep Parhar 
4127f856f099SNavdeep Parhar 		ch_tp_pio++;
4128f856f099SNavdeep Parhar 	}
4129f856f099SNavdeep Parhar 
4130f856f099SNavdeep Parhar 	/* TP_TM_PIO*/
4131f856f099SNavdeep Parhar 	if (is_t5(padap))
4132f856f099SNavdeep Parhar 		n = sizeof(t5_tp_tm_pio_array) / (4 * sizeof(u32));
4133f856f099SNavdeep Parhar 	else if (is_t6(padap))
4134f856f099SNavdeep Parhar 		n = sizeof(t6_tp_tm_pio_array) / (4 * sizeof(u32));
4135f856f099SNavdeep Parhar 
4136f856f099SNavdeep Parhar 	for (i = 0; i < n; i++) {
4137f856f099SNavdeep Parhar 		struct ireg_field *tp_pio = &ch_tp_pio->tp_pio;
4138f856f099SNavdeep Parhar 		u32 *buff = ch_tp_pio->outbuf;
4139f856f099SNavdeep Parhar 
4140f856f099SNavdeep Parhar 		if (is_t5(padap)) {
4141f856f099SNavdeep Parhar 			tp_pio->ireg_addr = t5_tp_tm_pio_array[i][0];
4142f856f099SNavdeep Parhar 			tp_pio->ireg_data = t5_tp_tm_pio_array[i][1];
4143f856f099SNavdeep Parhar 			tp_pio->ireg_local_offset = t5_tp_tm_pio_array[i][2];
4144f856f099SNavdeep Parhar 			tp_pio->ireg_offset_range = t5_tp_tm_pio_array[i][3];
4145f856f099SNavdeep Parhar 		} else if (is_t6(padap)) {
4146f856f099SNavdeep Parhar 			tp_pio->ireg_addr = t6_tp_tm_pio_array[i][0];
4147f856f099SNavdeep Parhar 			tp_pio->ireg_data = t6_tp_tm_pio_array[i][1];
4148f856f099SNavdeep Parhar 			tp_pio->ireg_local_offset = t6_tp_tm_pio_array[i][2];
4149f856f099SNavdeep Parhar 			tp_pio->ireg_offset_range = t6_tp_tm_pio_array[i][3];
4150f856f099SNavdeep Parhar 		}
4151f856f099SNavdeep Parhar 
4152f856f099SNavdeep Parhar 		t4_tp_tm_pio_read(padap, buff, tp_pio->ireg_offset_range,
4153f856f099SNavdeep Parhar 				  tp_pio->ireg_local_offset, true);
4154f856f099SNavdeep Parhar 
4155f856f099SNavdeep Parhar 		ch_tp_pio++;
4156f856f099SNavdeep Parhar 	}
4157f856f099SNavdeep Parhar 
4158f856f099SNavdeep Parhar 	/* TP_MIB_INDEX*/
4159f856f099SNavdeep Parhar 	if (is_t5(padap))
4160f856f099SNavdeep Parhar 		n = sizeof(t5_tp_mib_index_array) / (4 * sizeof(u32));
4161f856f099SNavdeep Parhar 	else if (is_t6(padap))
4162f856f099SNavdeep Parhar 		n = sizeof(t6_tp_mib_index_array) / (4 * sizeof(u32));
4163f856f099SNavdeep Parhar 
4164f856f099SNavdeep Parhar 	for (i = 0; i < n ; i++) {
4165f856f099SNavdeep Parhar 		struct ireg_field *tp_pio = &ch_tp_pio->tp_pio;
4166f856f099SNavdeep Parhar 		u32 *buff = ch_tp_pio->outbuf;
4167f856f099SNavdeep Parhar 
4168f856f099SNavdeep Parhar 		if (is_t5(padap)) {
4169f856f099SNavdeep Parhar 			tp_pio->ireg_addr = t5_tp_mib_index_array[i][0];
4170f856f099SNavdeep Parhar 			tp_pio->ireg_data = t5_tp_mib_index_array[i][1];
4171f856f099SNavdeep Parhar 			tp_pio->ireg_local_offset =
4172f856f099SNavdeep Parhar 				t5_tp_mib_index_array[i][2];
4173f856f099SNavdeep Parhar 			tp_pio->ireg_offset_range =
4174f856f099SNavdeep Parhar 				t5_tp_mib_index_array[i][3];
4175f856f099SNavdeep Parhar 		} else if (is_t6(padap)) {
4176f856f099SNavdeep Parhar 			tp_pio->ireg_addr = t6_tp_mib_index_array[i][0];
4177f856f099SNavdeep Parhar 			tp_pio->ireg_data = t6_tp_mib_index_array[i][1];
4178f856f099SNavdeep Parhar 			tp_pio->ireg_local_offset =
4179f856f099SNavdeep Parhar 				t6_tp_mib_index_array[i][2];
4180f856f099SNavdeep Parhar 			tp_pio->ireg_offset_range =
4181f856f099SNavdeep Parhar 				t6_tp_mib_index_array[i][3];
4182f856f099SNavdeep Parhar 		}
4183f856f099SNavdeep Parhar 
4184f856f099SNavdeep Parhar 		t4_tp_mib_read(padap, buff, tp_pio->ireg_offset_range,
4185f856f099SNavdeep Parhar 			       tp_pio->ireg_local_offset, true);
4186f856f099SNavdeep Parhar 
4187f856f099SNavdeep Parhar 		ch_tp_pio++;
4188f856f099SNavdeep Parhar 	}
4189f856f099SNavdeep Parhar 
4190f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
4191f856f099SNavdeep Parhar 	if (rc)
4192f856f099SNavdeep Parhar 		goto err1;
4193f856f099SNavdeep Parhar 
4194f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
4195f856f099SNavdeep Parhar 
4196f856f099SNavdeep Parhar err1:
4197f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
4198f856f099SNavdeep Parhar err:
4199f856f099SNavdeep Parhar 	return rc;
4200f856f099SNavdeep Parhar }
4201f856f099SNavdeep Parhar 
collect_sge_indirect(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)4202f856f099SNavdeep Parhar static int collect_sge_indirect(struct cudbg_init *pdbg_init,
4203f856f099SNavdeep Parhar 				struct cudbg_buffer *dbg_buff,
4204f856f099SNavdeep Parhar 				struct cudbg_error *cudbg_err)
4205f856f099SNavdeep Parhar {
4206f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
4207f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
4208f856f099SNavdeep Parhar 	struct ireg_buf *ch_sge_dbg;
4209f856f099SNavdeep Parhar 	u32 size;
4210f856f099SNavdeep Parhar 	int i, rc;
4211f856f099SNavdeep Parhar 
4212f856f099SNavdeep Parhar 	size = sizeof(struct ireg_buf) * 2;
4213f856f099SNavdeep Parhar 	scratch_buff.size = size;
4214f856f099SNavdeep Parhar 
4215f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, scratch_buff.size, &scratch_buff);
4216f856f099SNavdeep Parhar 	if (rc)
4217f856f099SNavdeep Parhar 		goto err;
4218f856f099SNavdeep Parhar 
4219f856f099SNavdeep Parhar 	ch_sge_dbg = (struct ireg_buf *)scratch_buff.data;
4220f856f099SNavdeep Parhar 
4221f856f099SNavdeep Parhar 	for (i = 0; i < 2; i++) {
4222f856f099SNavdeep Parhar 		struct ireg_field *sge_pio = &ch_sge_dbg->tp_pio;
4223f856f099SNavdeep Parhar 		u32 *buff = ch_sge_dbg->outbuf;
4224f856f099SNavdeep Parhar 
4225f856f099SNavdeep Parhar 		sge_pio->ireg_addr = t5_sge_dbg_index_array[i][0];
4226f856f099SNavdeep Parhar 		sge_pio->ireg_data = t5_sge_dbg_index_array[i][1];
4227f856f099SNavdeep Parhar 		sge_pio->ireg_local_offset = t5_sge_dbg_index_array[i][2];
4228f856f099SNavdeep Parhar 		sge_pio->ireg_offset_range = t5_sge_dbg_index_array[i][3];
4229f856f099SNavdeep Parhar 
4230f856f099SNavdeep Parhar 		t4_read_indirect(padap,
4231f856f099SNavdeep Parhar 				sge_pio->ireg_addr,
4232f856f099SNavdeep Parhar 				sge_pio->ireg_data,
4233f856f099SNavdeep Parhar 				buff,
4234f856f099SNavdeep Parhar 				sge_pio->ireg_offset_range,
4235f856f099SNavdeep Parhar 				sge_pio->ireg_local_offset);
4236f856f099SNavdeep Parhar 
4237f856f099SNavdeep Parhar 		ch_sge_dbg++;
4238f856f099SNavdeep Parhar 	}
4239f856f099SNavdeep Parhar 
4240f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
4241f856f099SNavdeep Parhar 	if (rc)
4242f856f099SNavdeep Parhar 		goto err1;
4243f856f099SNavdeep Parhar 
4244f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
4245f856f099SNavdeep Parhar 
4246f856f099SNavdeep Parhar err1:
4247f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
4248f856f099SNavdeep Parhar err:
4249f856f099SNavdeep Parhar 	return rc;
4250f856f099SNavdeep Parhar }
4251f856f099SNavdeep Parhar 
collect_full(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)4252f856f099SNavdeep Parhar static int collect_full(struct cudbg_init *pdbg_init,
4253f856f099SNavdeep Parhar 			struct cudbg_buffer *dbg_buff,
4254f856f099SNavdeep Parhar 			struct cudbg_error *cudbg_err)
4255f856f099SNavdeep Parhar {
4256f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
4257f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
4258f856f099SNavdeep Parhar 	u32 reg_addr, reg_data, reg_local_offset, reg_offset_range;
4259f856f099SNavdeep Parhar 	u32 *sp;
4260f856f099SNavdeep Parhar 	int rc;
4261f856f099SNavdeep Parhar 	int nreg = 0;
4262f856f099SNavdeep Parhar 
4263f856f099SNavdeep Parhar 	/* Collect Registers:
4264f856f099SNavdeep Parhar 	 * TP_DBG_SCHED_TX (0x7e40 + 0x6a),
4265f856f099SNavdeep Parhar 	 * TP_DBG_SCHED_RX (0x7e40 + 0x6b),
4266f856f099SNavdeep Parhar 	 * TP_DBG_CSIDE_INT (0x7e40 + 0x23f),
4267f856f099SNavdeep Parhar 	 * TP_DBG_ESIDE_INT (0x7e40 + 0x148),
4268f856f099SNavdeep Parhar 	 * PCIE_CDEBUG_INDEX[AppData0] (0x5a10 + 2),
4269f856f099SNavdeep Parhar 	 * PCIE_CDEBUG_INDEX[AppData1] (0x5a10 + 3)  This is for T6
4270f856f099SNavdeep Parhar 	 * SGE_DEBUG_DATA_HIGH_INDEX_10 (0x12a8)
4271f856f099SNavdeep Parhar 	 **/
4272f856f099SNavdeep Parhar 
4273f856f099SNavdeep Parhar 	if (is_t5(padap))
4274f856f099SNavdeep Parhar 		nreg = 6;
4275f856f099SNavdeep Parhar 	else if (is_t6(padap))
4276f856f099SNavdeep Parhar 		nreg = 7;
4277f856f099SNavdeep Parhar 
4278f856f099SNavdeep Parhar 	scratch_buff.size = nreg * sizeof(u32);
4279f856f099SNavdeep Parhar 
4280f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, scratch_buff.size, &scratch_buff);
4281f856f099SNavdeep Parhar 	if (rc)
4282f856f099SNavdeep Parhar 		goto err;
4283f856f099SNavdeep Parhar 
4284f856f099SNavdeep Parhar 	sp = (u32 *)scratch_buff.data;
4285f856f099SNavdeep Parhar 
4286f856f099SNavdeep Parhar 	/* TP_DBG_SCHED_TX */
4287f856f099SNavdeep Parhar 	reg_local_offset = t5_tp_pio_array[3][2] + 0xa;
4288f856f099SNavdeep Parhar 	reg_offset_range = 1;
4289f856f099SNavdeep Parhar 
4290f856f099SNavdeep Parhar 	t4_tp_pio_read(padap, sp, reg_offset_range, reg_local_offset, true);
4291f856f099SNavdeep Parhar 
4292f856f099SNavdeep Parhar 	sp++;
4293f856f099SNavdeep Parhar 
4294f856f099SNavdeep Parhar 	/* TP_DBG_SCHED_RX */
4295f856f099SNavdeep Parhar 	reg_local_offset = t5_tp_pio_array[3][2] + 0xb;
4296f856f099SNavdeep Parhar 	reg_offset_range = 1;
4297f856f099SNavdeep Parhar 
4298f856f099SNavdeep Parhar 	t4_tp_pio_read(padap, sp, reg_offset_range, reg_local_offset, true);
4299f856f099SNavdeep Parhar 
4300f856f099SNavdeep Parhar 	sp++;
4301f856f099SNavdeep Parhar 
4302f856f099SNavdeep Parhar 	/* TP_DBG_CSIDE_INT */
4303f856f099SNavdeep Parhar 	reg_local_offset = t5_tp_pio_array[9][2] + 0xf;
4304f856f099SNavdeep Parhar 	reg_offset_range = 1;
4305f856f099SNavdeep Parhar 
4306f856f099SNavdeep Parhar 	t4_tp_pio_read(padap, sp, reg_offset_range, reg_local_offset, true);
4307f856f099SNavdeep Parhar 
4308f856f099SNavdeep Parhar 	sp++;
4309f856f099SNavdeep Parhar 
4310f856f099SNavdeep Parhar 	/* TP_DBG_ESIDE_INT */
4311f856f099SNavdeep Parhar 	reg_local_offset = t5_tp_pio_array[8][2] + 3;
4312f856f099SNavdeep Parhar 	reg_offset_range = 1;
4313f856f099SNavdeep Parhar 
4314f856f099SNavdeep Parhar 	t4_tp_pio_read(padap, sp, reg_offset_range, reg_local_offset, true);
4315f856f099SNavdeep Parhar 
4316f856f099SNavdeep Parhar 	sp++;
4317f856f099SNavdeep Parhar 
4318f856f099SNavdeep Parhar 	/* PCIE_CDEBUG_INDEX[AppData0] */
4319f856f099SNavdeep Parhar 	reg_addr = t5_pcie_cdbg_array[0][0];
4320f856f099SNavdeep Parhar 	reg_data = t5_pcie_cdbg_array[0][1];
4321f856f099SNavdeep Parhar 	reg_local_offset = t5_pcie_cdbg_array[0][2] + 2;
4322f856f099SNavdeep Parhar 	reg_offset_range = 1;
4323f856f099SNavdeep Parhar 
4324f856f099SNavdeep Parhar 	t4_read_indirect(padap, reg_addr, reg_data, sp, reg_offset_range,
4325f856f099SNavdeep Parhar 			 reg_local_offset);
4326f856f099SNavdeep Parhar 
4327f856f099SNavdeep Parhar 	sp++;
4328f856f099SNavdeep Parhar 
4329f856f099SNavdeep Parhar 	if (is_t6(padap)) {
4330f856f099SNavdeep Parhar 		/* PCIE_CDEBUG_INDEX[AppData1] */
4331f856f099SNavdeep Parhar 		reg_addr = t5_pcie_cdbg_array[0][0];
4332f856f099SNavdeep Parhar 		reg_data = t5_pcie_cdbg_array[0][1];
4333f856f099SNavdeep Parhar 		reg_local_offset = t5_pcie_cdbg_array[0][2] + 3;
4334f856f099SNavdeep Parhar 		reg_offset_range = 1;
4335f856f099SNavdeep Parhar 
4336f856f099SNavdeep Parhar 		t4_read_indirect(padap, reg_addr, reg_data, sp,
4337f856f099SNavdeep Parhar 				 reg_offset_range, reg_local_offset);
4338f856f099SNavdeep Parhar 
4339f856f099SNavdeep Parhar 		sp++;
4340f856f099SNavdeep Parhar 	}
4341f856f099SNavdeep Parhar 
4342f856f099SNavdeep Parhar 	/* SGE_DEBUG_DATA_HIGH_INDEX_10 */
4343f856f099SNavdeep Parhar 	*sp = t4_read_reg(padap, A_SGE_DEBUG_DATA_HIGH_INDEX_10);
4344f856f099SNavdeep Parhar 
4345f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
4346f856f099SNavdeep Parhar 	if (rc)
4347f856f099SNavdeep Parhar 		goto err1;
4348f856f099SNavdeep Parhar 
4349f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
4350f856f099SNavdeep Parhar 
4351f856f099SNavdeep Parhar err1:
4352f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
4353f856f099SNavdeep Parhar err:
4354f856f099SNavdeep Parhar 	return rc;
4355f856f099SNavdeep Parhar }
4356f856f099SNavdeep Parhar 
collect_vpd_data(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)4357f856f099SNavdeep Parhar static int collect_vpd_data(struct cudbg_init *pdbg_init,
4358f856f099SNavdeep Parhar 			    struct cudbg_buffer *dbg_buff,
4359f856f099SNavdeep Parhar 			    struct cudbg_error *cudbg_err)
4360f856f099SNavdeep Parhar {
4361f856f099SNavdeep Parhar #ifdef notyet
4362f856f099SNavdeep Parhar 	struct cudbg_buffer scratch_buff;
4363f856f099SNavdeep Parhar 	struct adapter *padap = pdbg_init->adap;
4364f856f099SNavdeep Parhar 	struct struct_vpd_data *vpd_data;
4365f856f099SNavdeep Parhar 	char vpd_ver[4];
4366f856f099SNavdeep Parhar 	u32 fw_vers;
4367f856f099SNavdeep Parhar 	u32 size;
4368f856f099SNavdeep Parhar 	int rc;
4369f856f099SNavdeep Parhar 
4370f856f099SNavdeep Parhar 	size = sizeof(struct struct_vpd_data);
4371f856f099SNavdeep Parhar 	scratch_buff.size = size;
4372f856f099SNavdeep Parhar 
4373f856f099SNavdeep Parhar 	rc = get_scratch_buff(dbg_buff, scratch_buff.size, &scratch_buff);
4374f856f099SNavdeep Parhar 	if (rc)
4375f856f099SNavdeep Parhar 		goto err;
4376f856f099SNavdeep Parhar 
4377f856f099SNavdeep Parhar 	vpd_data = (struct struct_vpd_data *)scratch_buff.data;
4378f856f099SNavdeep Parhar 
4379f856f099SNavdeep Parhar 	if (is_t5(padap)) {
4380f856f099SNavdeep Parhar 		read_vpd_reg(padap, SN_REG_ADDR, SN_MAX_LEN, vpd_data->sn);
4381f856f099SNavdeep Parhar 		read_vpd_reg(padap, BN_REG_ADDR, BN_MAX_LEN, vpd_data->bn);
4382f856f099SNavdeep Parhar 		read_vpd_reg(padap, NA_REG_ADDR, NA_MAX_LEN, vpd_data->na);
4383f856f099SNavdeep Parhar 		read_vpd_reg(padap, MN_REG_ADDR, MN_MAX_LEN, vpd_data->mn);
4384f856f099SNavdeep Parhar 	} else if (is_t6(padap)) {
4385f856f099SNavdeep Parhar 		read_vpd_reg(padap, SN_T6_ADDR, SN_MAX_LEN, vpd_data->sn);
4386f856f099SNavdeep Parhar 		read_vpd_reg(padap, BN_T6_ADDR, BN_MAX_LEN, vpd_data->bn);
4387f856f099SNavdeep Parhar 		read_vpd_reg(padap, NA_T6_ADDR, NA_MAX_LEN, vpd_data->na);
4388f856f099SNavdeep Parhar 		read_vpd_reg(padap, MN_T6_ADDR, MN_MAX_LEN, vpd_data->mn);
4389f856f099SNavdeep Parhar 	}
4390f856f099SNavdeep Parhar 
4391f856f099SNavdeep Parhar 	if (is_fw_attached(pdbg_init)) {
4392f856f099SNavdeep Parhar 	   rc = t4_get_scfg_version(padap, &vpd_data->scfg_vers);
4393f856f099SNavdeep Parhar 	} else {
4394f856f099SNavdeep Parhar 		rc = 1;
4395f856f099SNavdeep Parhar 	}
4396f856f099SNavdeep Parhar 
4397f856f099SNavdeep Parhar 	if (rc) {
4398f856f099SNavdeep Parhar 		/* Now trying with backdoor mechanism */
4399f856f099SNavdeep Parhar 		rc = read_vpd_reg(padap, SCFG_VER_ADDR, SCFG_VER_LEN,
4400f856f099SNavdeep Parhar 				  (u8 *)&vpd_data->scfg_vers);
4401f856f099SNavdeep Parhar 		if (rc)
4402f856f099SNavdeep Parhar 			goto err1;
4403f856f099SNavdeep Parhar 	}
4404f856f099SNavdeep Parhar 
4405f856f099SNavdeep Parhar 	if (is_fw_attached(pdbg_init)) {
4406f856f099SNavdeep Parhar 		rc = t4_get_vpd_version(padap, &vpd_data->vpd_vers);
4407f856f099SNavdeep Parhar 	} else {
4408f856f099SNavdeep Parhar 		rc = 1;
4409f856f099SNavdeep Parhar 	}
4410f856f099SNavdeep Parhar 
4411f856f099SNavdeep Parhar 	if (rc) {
4412f856f099SNavdeep Parhar 		/* Now trying with backdoor mechanism */
4413f856f099SNavdeep Parhar 		rc = read_vpd_reg(padap, VPD_VER_ADDR, VPD_VER_LEN,
4414f856f099SNavdeep Parhar 				  (u8 *)vpd_ver);
4415f856f099SNavdeep Parhar 		if (rc)
4416f856f099SNavdeep Parhar 			goto err1;
4417f856f099SNavdeep Parhar 		/* read_vpd_reg return string of stored hex
4418f856f099SNavdeep Parhar 		 * converting hex string to char string
4419f856f099SNavdeep Parhar 		 * vpd version is 2 bytes only */
4420f856f099SNavdeep Parhar 		sprintf(vpd_ver, "%c%c\n", vpd_ver[0], vpd_ver[1]);
4421f856f099SNavdeep Parhar 		vpd_data->vpd_vers = simple_strtoul(vpd_ver, NULL, 16);
4422f856f099SNavdeep Parhar 	}
4423f856f099SNavdeep Parhar 
4424f856f099SNavdeep Parhar 	/* Get FW version if it's not already filled in */
4425f856f099SNavdeep Parhar 	fw_vers = padap->params.fw_vers;
4426f856f099SNavdeep Parhar 	if (!fw_vers) {
4427f856f099SNavdeep Parhar 		rc = t4_get_fw_version(padap, &fw_vers);
4428f856f099SNavdeep Parhar 		if (rc)
4429f856f099SNavdeep Parhar 			goto err1;
4430f856f099SNavdeep Parhar 	}
4431f856f099SNavdeep Parhar 
4432f856f099SNavdeep Parhar 	vpd_data->fw_major = G_FW_HDR_FW_VER_MAJOR(fw_vers);
4433f856f099SNavdeep Parhar 	vpd_data->fw_minor = G_FW_HDR_FW_VER_MINOR(fw_vers);
4434f856f099SNavdeep Parhar 	vpd_data->fw_micro = G_FW_HDR_FW_VER_MICRO(fw_vers);
4435f856f099SNavdeep Parhar 	vpd_data->fw_build = G_FW_HDR_FW_VER_BUILD(fw_vers);
4436f856f099SNavdeep Parhar 
4437f856f099SNavdeep Parhar 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
4438f856f099SNavdeep Parhar 	if (rc)
4439f856f099SNavdeep Parhar 		goto err1;
4440f856f099SNavdeep Parhar 
4441f856f099SNavdeep Parhar 	rc = compress_buff(&scratch_buff, dbg_buff);
4442f856f099SNavdeep Parhar 
4443f856f099SNavdeep Parhar err1:
4444f856f099SNavdeep Parhar 	release_scratch_buff(&scratch_buff, dbg_buff);
4445f856f099SNavdeep Parhar err:
4446f856f099SNavdeep Parhar 	return rc;
4447f856f099SNavdeep Parhar #endif
44486cc4520bSNavdeep Parhar 	return (CUDBG_STATUS_NOT_IMPLEMENTED);
4449f856f099SNavdeep Parhar }
4450