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