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