1 /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */ 2 /* QLogic qed NIC Driver 3 * Copyright (c) 2019-2021 Marvell International Ltd. 4 */ 5 #ifndef _QED_DBG_HSI_H 6 #define _QED_DBG_HSI_H 7 8 #include <linux/types.h> 9 #include <linux/io.h> 10 #include <linux/bitops.h> 11 #include <linux/delay.h> 12 #include <linux/kernel.h> 13 #include <linux/list.h> 14 #include <linux/slab.h> 15 16 /****************************************/ 17 /* Debug Tools HSI constants and macros */ 18 /****************************************/ 19 20 enum block_id { 21 BLOCK_GRC, 22 BLOCK_MISCS, 23 BLOCK_MISC, 24 BLOCK_DBU, 25 BLOCK_PGLUE_B, 26 BLOCK_CNIG, 27 BLOCK_CPMU, 28 BLOCK_NCSI, 29 BLOCK_OPTE, 30 BLOCK_BMB, 31 BLOCK_PCIE, 32 BLOCK_MCP, 33 BLOCK_MCP2, 34 BLOCK_PSWHST, 35 BLOCK_PSWHST2, 36 BLOCK_PSWRD, 37 BLOCK_PSWRD2, 38 BLOCK_PSWWR, 39 BLOCK_PSWWR2, 40 BLOCK_PSWRQ, 41 BLOCK_PSWRQ2, 42 BLOCK_PGLCS, 43 BLOCK_DMAE, 44 BLOCK_PTU, 45 BLOCK_TCM, 46 BLOCK_MCM, 47 BLOCK_UCM, 48 BLOCK_XCM, 49 BLOCK_YCM, 50 BLOCK_PCM, 51 BLOCK_QM, 52 BLOCK_TM, 53 BLOCK_DORQ, 54 BLOCK_BRB, 55 BLOCK_SRC, 56 BLOCK_PRS, 57 BLOCK_TSDM, 58 BLOCK_MSDM, 59 BLOCK_USDM, 60 BLOCK_XSDM, 61 BLOCK_YSDM, 62 BLOCK_PSDM, 63 BLOCK_TSEM, 64 BLOCK_MSEM, 65 BLOCK_USEM, 66 BLOCK_XSEM, 67 BLOCK_YSEM, 68 BLOCK_PSEM, 69 BLOCK_RSS, 70 BLOCK_TMLD, 71 BLOCK_MULD, 72 BLOCK_YULD, 73 BLOCK_XYLD, 74 BLOCK_PRM, 75 BLOCK_PBF_PB1, 76 BLOCK_PBF_PB2, 77 BLOCK_RPB, 78 BLOCK_BTB, 79 BLOCK_PBF, 80 BLOCK_RDIF, 81 BLOCK_TDIF, 82 BLOCK_CDU, 83 BLOCK_CCFC, 84 BLOCK_TCFC, 85 BLOCK_IGU, 86 BLOCK_CAU, 87 BLOCK_UMAC, 88 BLOCK_XMAC, 89 BLOCK_MSTAT, 90 BLOCK_DBG, 91 BLOCK_NIG, 92 BLOCK_WOL, 93 BLOCK_BMBN, 94 BLOCK_IPC, 95 BLOCK_NWM, 96 BLOCK_NWS, 97 BLOCK_MS, 98 BLOCK_PHY_PCIE, 99 BLOCK_LED, 100 BLOCK_AVS_WRAP, 101 BLOCK_PXPREQBUS, 102 BLOCK_BAR0_MAP, 103 BLOCK_MCP_FIO, 104 BLOCK_LAST_INIT, 105 BLOCK_PRS_FC, 106 BLOCK_PBF_FC, 107 BLOCK_NIG_LB_FC, 108 BLOCK_NIG_LB_FC_PLLH, 109 BLOCK_NIG_TX_FC_PLLH, 110 BLOCK_NIG_TX_FC, 111 BLOCK_NIG_RX_FC_PLLH, 112 BLOCK_NIG_RX_FC, 113 MAX_BLOCK_ID 114 }; 115 116 /* binary debug buffer types */ 117 enum bin_dbg_buffer_type { 118 BIN_BUF_DBG_MODE_TREE, 119 BIN_BUF_DBG_DUMP_REG, 120 BIN_BUF_DBG_DUMP_MEM, 121 BIN_BUF_DBG_IDLE_CHK_REGS, 122 BIN_BUF_DBG_IDLE_CHK_IMMS, 123 BIN_BUF_DBG_IDLE_CHK_RULES, 124 BIN_BUF_DBG_IDLE_CHK_PARSING_DATA, 125 BIN_BUF_DBG_ATTN_BLOCKS, 126 BIN_BUF_DBG_ATTN_REGS, 127 BIN_BUF_DBG_ATTN_INDEXES, 128 BIN_BUF_DBG_ATTN_NAME_OFFSETS, 129 BIN_BUF_DBG_BLOCKS, 130 BIN_BUF_DBG_BLOCKS_CHIP_DATA, 131 BIN_BUF_DBG_BUS_LINES, 132 BIN_BUF_DBG_BLOCKS_USER_DATA, 133 BIN_BUF_DBG_BLOCKS_CHIP_USER_DATA, 134 BIN_BUF_DBG_BUS_LINE_NAME_OFFSETS, 135 BIN_BUF_DBG_RESET_REGS, 136 BIN_BUF_DBG_PARSING_STRINGS, 137 MAX_BIN_DBG_BUFFER_TYPE 138 }; 139 140 /* Attention bit mapping */ 141 struct dbg_attn_bit_mapping { 142 u16 data; 143 #define DBG_ATTN_BIT_MAPPING_VAL_MASK 0x7FFF 144 #define DBG_ATTN_BIT_MAPPING_VAL_SHIFT 0 145 #define DBG_ATTN_BIT_MAPPING_IS_UNUSED_BIT_CNT_MASK 0x1 146 #define DBG_ATTN_BIT_MAPPING_IS_UNUSED_BIT_CNT_SHIFT 15 147 }; 148 149 /* Attention block per-type data */ 150 struct dbg_attn_block_type_data { 151 u16 names_offset; 152 u16 reserved1; 153 u8 num_regs; 154 u8 reserved2; 155 u16 regs_offset; 156 157 }; 158 159 /* Block attentions */ 160 struct dbg_attn_block { 161 struct dbg_attn_block_type_data per_type_data[2]; 162 }; 163 164 /* Attention register result */ 165 struct dbg_attn_reg_result { 166 u32 data; 167 #define DBG_ATTN_REG_RESULT_STS_ADDRESS_MASK 0xFFFFFF 168 #define DBG_ATTN_REG_RESULT_STS_ADDRESS_SHIFT 0 169 #define DBG_ATTN_REG_RESULT_NUM_REG_ATTN_MASK 0xFF 170 #define DBG_ATTN_REG_RESULT_NUM_REG_ATTN_SHIFT 24 171 u16 block_attn_offset; 172 u16 reserved; 173 u32 sts_val; 174 u32 mask_val; 175 }; 176 177 /* Attention block result */ 178 struct dbg_attn_block_result { 179 u8 block_id; 180 u8 data; 181 #define DBG_ATTN_BLOCK_RESULT_ATTN_TYPE_MASK 0x3 182 #define DBG_ATTN_BLOCK_RESULT_ATTN_TYPE_SHIFT 0 183 #define DBG_ATTN_BLOCK_RESULT_NUM_REGS_MASK 0x3F 184 #define DBG_ATTN_BLOCK_RESULT_NUM_REGS_SHIFT 2 185 u16 names_offset; 186 struct dbg_attn_reg_result reg_results[15]; 187 }; 188 189 /* Mode header */ 190 struct dbg_mode_hdr { 191 u16 data; 192 #define DBG_MODE_HDR_EVAL_MODE_MASK 0x1 193 #define DBG_MODE_HDR_EVAL_MODE_SHIFT 0 194 #define DBG_MODE_HDR_MODES_BUF_OFFSET_MASK 0x7FFF 195 #define DBG_MODE_HDR_MODES_BUF_OFFSET_SHIFT 1 196 }; 197 198 /* Attention register */ 199 struct dbg_attn_reg { 200 struct dbg_mode_hdr mode; 201 u16 block_attn_offset; 202 u32 data; 203 #define DBG_ATTN_REG_STS_ADDRESS_MASK 0xFFFFFF 204 #define DBG_ATTN_REG_STS_ADDRESS_SHIFT 0 205 #define DBG_ATTN_REG_NUM_REG_ATTN_MASK 0xFF 206 #define DBG_ATTN_REG_NUM_REG_ATTN_SHIFT 24 207 u32 sts_clr_address; 208 u32 mask_address; 209 }; 210 211 /* Attention types */ 212 enum dbg_attn_type { 213 ATTN_TYPE_INTERRUPT, 214 ATTN_TYPE_PARITY, 215 MAX_DBG_ATTN_TYPE 216 }; 217 218 /* Block debug data */ 219 struct dbg_block { 220 u8 name[15]; 221 u8 associated_storm_letter; 222 }; 223 224 /* Chip-specific block debug data */ 225 struct dbg_block_chip { 226 u8 flags; 227 #define DBG_BLOCK_CHIP_IS_REMOVED_MASK 0x1 228 #define DBG_BLOCK_CHIP_IS_REMOVED_SHIFT 0 229 #define DBG_BLOCK_CHIP_HAS_RESET_REG_MASK 0x1 230 #define DBG_BLOCK_CHIP_HAS_RESET_REG_SHIFT 1 231 #define DBG_BLOCK_CHIP_UNRESET_BEFORE_DUMP_MASK 0x1 232 #define DBG_BLOCK_CHIP_UNRESET_BEFORE_DUMP_SHIFT 2 233 #define DBG_BLOCK_CHIP_HAS_DBG_BUS_MASK 0x1 234 #define DBG_BLOCK_CHIP_HAS_DBG_BUS_SHIFT 3 235 #define DBG_BLOCK_CHIP_HAS_LATENCY_EVENTS_MASK 0x1 236 #define DBG_BLOCK_CHIP_HAS_LATENCY_EVENTS_SHIFT 4 237 #define DBG_BLOCK_CHIP_RESERVED0_MASK 0x7 238 #define DBG_BLOCK_CHIP_RESERVED0_SHIFT 5 239 u8 dbg_client_id; 240 u8 reset_reg_id; 241 u8 reset_reg_bit_offset; 242 struct dbg_mode_hdr dbg_bus_mode; 243 u16 reserved1; 244 u8 reserved2; 245 u8 num_of_dbg_bus_lines; 246 u16 dbg_bus_lines_offset; 247 u32 dbg_select_reg_addr; 248 u32 dbg_dword_enable_reg_addr; 249 u32 dbg_shift_reg_addr; 250 u32 dbg_force_valid_reg_addr; 251 u32 dbg_force_frame_reg_addr; 252 }; 253 254 /* Chip-specific block user debug data */ 255 struct dbg_block_chip_user { 256 u8 num_of_dbg_bus_lines; 257 u8 has_latency_events; 258 u16 names_offset; 259 }; 260 261 /* Block user debug data */ 262 struct dbg_block_user { 263 u8 name[16]; 264 }; 265 266 /* Block Debug line data */ 267 struct dbg_bus_line { 268 u8 data; 269 #define DBG_BUS_LINE_NUM_OF_GROUPS_MASK 0xF 270 #define DBG_BUS_LINE_NUM_OF_GROUPS_SHIFT 0 271 #define DBG_BUS_LINE_IS_256B_MASK 0x1 272 #define DBG_BUS_LINE_IS_256B_SHIFT 4 273 #define DBG_BUS_LINE_RESERVED_MASK 0x7 274 #define DBG_BUS_LINE_RESERVED_SHIFT 5 275 u8 group_sizes; 276 }; 277 278 /* Condition header for registers dump */ 279 struct dbg_dump_cond_hdr { 280 struct dbg_mode_hdr mode; /* Mode header */ 281 u8 block_id; /* block ID */ 282 u8 data_size; /* size in dwords of the data following this header */ 283 }; 284 285 /* Memory data for registers dump */ 286 struct dbg_dump_mem { 287 u32 dword0; 288 #define DBG_DUMP_MEM_ADDRESS_MASK 0xFFFFFF 289 #define DBG_DUMP_MEM_ADDRESS_SHIFT 0 290 #define DBG_DUMP_MEM_MEM_GROUP_ID_MASK 0xFF 291 #define DBG_DUMP_MEM_MEM_GROUP_ID_SHIFT 24 292 u32 dword1; 293 #define DBG_DUMP_MEM_LENGTH_MASK 0xFFFFFF 294 #define DBG_DUMP_MEM_LENGTH_SHIFT 0 295 #define DBG_DUMP_MEM_WIDE_BUS_MASK 0x1 296 #define DBG_DUMP_MEM_WIDE_BUS_SHIFT 24 297 #define DBG_DUMP_MEM_RESERVED_MASK 0x7F 298 #define DBG_DUMP_MEM_RESERVED_SHIFT 25 299 }; 300 301 /* Register data for registers dump */ 302 struct dbg_dump_reg { 303 u32 data; 304 #define DBG_DUMP_REG_ADDRESS_MASK 0x7FFFFF 305 #define DBG_DUMP_REG_ADDRESS_SHIFT 0 306 #define DBG_DUMP_REG_WIDE_BUS_MASK 0x1 307 #define DBG_DUMP_REG_WIDE_BUS_SHIFT 23 308 #define DBG_DUMP_REG_LENGTH_MASK 0xFF 309 #define DBG_DUMP_REG_LENGTH_SHIFT 24 310 }; 311 312 /* Split header for registers dump */ 313 struct dbg_dump_split_hdr { 314 u32 hdr; 315 #define DBG_DUMP_SPLIT_HDR_DATA_SIZE_MASK 0xFFFFFF 316 #define DBG_DUMP_SPLIT_HDR_DATA_SIZE_SHIFT 0 317 #define DBG_DUMP_SPLIT_HDR_SPLIT_TYPE_ID_MASK 0xFF 318 #define DBG_DUMP_SPLIT_HDR_SPLIT_TYPE_ID_SHIFT 24 319 }; 320 321 /* Condition header for idle check */ 322 struct dbg_idle_chk_cond_hdr { 323 struct dbg_mode_hdr mode; /* Mode header */ 324 u16 data_size; /* size in dwords of the data following this header */ 325 }; 326 327 /* Idle Check condition register */ 328 struct dbg_idle_chk_cond_reg { 329 u32 data; 330 #define DBG_IDLE_CHK_COND_REG_ADDRESS_MASK 0x7FFFFF 331 #define DBG_IDLE_CHK_COND_REG_ADDRESS_SHIFT 0 332 #define DBG_IDLE_CHK_COND_REG_WIDE_BUS_MASK 0x1 333 #define DBG_IDLE_CHK_COND_REG_WIDE_BUS_SHIFT 23 334 #define DBG_IDLE_CHK_COND_REG_BLOCK_ID_MASK 0xFF 335 #define DBG_IDLE_CHK_COND_REG_BLOCK_ID_SHIFT 24 336 u16 num_entries; 337 u8 entry_size; 338 u8 start_entry; 339 }; 340 341 /* Idle Check info register */ 342 struct dbg_idle_chk_info_reg { 343 u32 data; 344 #define DBG_IDLE_CHK_INFO_REG_ADDRESS_MASK 0x7FFFFF 345 #define DBG_IDLE_CHK_INFO_REG_ADDRESS_SHIFT 0 346 #define DBG_IDLE_CHK_INFO_REG_WIDE_BUS_MASK 0x1 347 #define DBG_IDLE_CHK_INFO_REG_WIDE_BUS_SHIFT 23 348 #define DBG_IDLE_CHK_INFO_REG_BLOCK_ID_MASK 0xFF 349 #define DBG_IDLE_CHK_INFO_REG_BLOCK_ID_SHIFT 24 350 u16 size; /* register size in dwords */ 351 struct dbg_mode_hdr mode; /* Mode header */ 352 }; 353 354 /* Idle Check register */ 355 union dbg_idle_chk_reg { 356 struct dbg_idle_chk_cond_reg cond_reg; /* condition register */ 357 struct dbg_idle_chk_info_reg info_reg; /* info register */ 358 }; 359 360 /* Idle Check result header */ 361 struct dbg_idle_chk_result_hdr { 362 u16 rule_id; /* Failing rule index */ 363 u16 mem_entry_id; /* Failing memory entry index */ 364 u8 num_dumped_cond_regs; /* number of dumped condition registers */ 365 u8 num_dumped_info_regs; /* number of dumped condition registers */ 366 u8 severity; /* from dbg_idle_chk_severity_types enum */ 367 u8 reserved; 368 }; 369 370 /* Idle Check result register header */ 371 struct dbg_idle_chk_result_reg_hdr { 372 u8 data; 373 #define DBG_IDLE_CHK_RESULT_REG_HDR_IS_MEM_MASK 0x1 374 #define DBG_IDLE_CHK_RESULT_REG_HDR_IS_MEM_SHIFT 0 375 #define DBG_IDLE_CHK_RESULT_REG_HDR_REG_ID_MASK 0x7F 376 #define DBG_IDLE_CHK_RESULT_REG_HDR_REG_ID_SHIFT 1 377 u8 start_entry; /* index of the first checked entry */ 378 u16 size; /* register size in dwords */ 379 }; 380 381 /* Idle Check rule */ 382 struct dbg_idle_chk_rule { 383 u16 rule_id; /* Idle Check rule ID */ 384 u8 severity; /* value from dbg_idle_chk_severity_types enum */ 385 u8 cond_id; /* Condition ID */ 386 u8 num_cond_regs; /* number of condition registers */ 387 u8 num_info_regs; /* number of info registers */ 388 u8 num_imms; /* number of immediates in the condition */ 389 u8 reserved1; 390 u16 reg_offset; /* offset of this rules registers in the idle check 391 * register array (in dbg_idle_chk_reg units). 392 */ 393 u16 imm_offset; /* offset of this rules immediate values in the 394 * immediate values array (in dwords). 395 */ 396 }; 397 398 /* Idle Check rule parsing data */ 399 struct dbg_idle_chk_rule_parsing_data { 400 u32 data; 401 #define DBG_IDLE_CHK_RULE_PARSING_DATA_HAS_FW_MSG_MASK 0x1 402 #define DBG_IDLE_CHK_RULE_PARSING_DATA_HAS_FW_MSG_SHIFT 0 403 #define DBG_IDLE_CHK_RULE_PARSING_DATA_STR_OFFSET_MASK 0x7FFFFFFF 404 #define DBG_IDLE_CHK_RULE_PARSING_DATA_STR_OFFSET_SHIFT 1 405 }; 406 407 /* Idle check severity types */ 408 enum dbg_idle_chk_severity_types { 409 /* idle check failure should cause an error */ 410 IDLE_CHK_SEVERITY_ERROR, 411 /* idle check failure should cause an error only if theres no traffic */ 412 IDLE_CHK_SEVERITY_ERROR_NO_TRAFFIC, 413 /* idle check failure should cause a warning */ 414 IDLE_CHK_SEVERITY_WARNING, 415 MAX_DBG_IDLE_CHK_SEVERITY_TYPES 416 }; 417 418 /* Reset register */ 419 struct dbg_reset_reg { 420 u32 data; 421 #define DBG_RESET_REG_ADDR_MASK 0xFFFFFF 422 #define DBG_RESET_REG_ADDR_SHIFT 0 423 #define DBG_RESET_REG_IS_REMOVED_MASK 0x1 424 #define DBG_RESET_REG_IS_REMOVED_SHIFT 24 425 #define DBG_RESET_REG_RESERVED_MASK 0x7F 426 #define DBG_RESET_REG_RESERVED_SHIFT 25 427 }; 428 429 /* Debug Bus block data */ 430 struct dbg_bus_block_data { 431 u8 enable_mask; 432 u8 right_shift; 433 u8 force_valid_mask; 434 u8 force_frame_mask; 435 u8 dword_mask; 436 u8 line_num; 437 u8 hw_id; 438 u8 flags; 439 #define DBG_BUS_BLOCK_DATA_IS_256B_LINE_MASK 0x1 440 #define DBG_BUS_BLOCK_DATA_IS_256B_LINE_SHIFT 0 441 #define DBG_BUS_BLOCK_DATA_RESERVED_MASK 0x7F 442 #define DBG_BUS_BLOCK_DATA_RESERVED_SHIFT 1 443 }; 444 445 enum dbg_bus_clients { 446 DBG_BUS_CLIENT_RBCN, 447 DBG_BUS_CLIENT_RBCP, 448 DBG_BUS_CLIENT_RBCR, 449 DBG_BUS_CLIENT_RBCT, 450 DBG_BUS_CLIENT_RBCU, 451 DBG_BUS_CLIENT_RBCF, 452 DBG_BUS_CLIENT_RBCX, 453 DBG_BUS_CLIENT_RBCS, 454 DBG_BUS_CLIENT_RBCH, 455 DBG_BUS_CLIENT_RBCZ, 456 DBG_BUS_CLIENT_OTHER_ENGINE, 457 DBG_BUS_CLIENT_TIMESTAMP, 458 DBG_BUS_CLIENT_CPU, 459 DBG_BUS_CLIENT_RBCY, 460 DBG_BUS_CLIENT_RBCQ, 461 DBG_BUS_CLIENT_RBCM, 462 DBG_BUS_CLIENT_RBCB, 463 DBG_BUS_CLIENT_RBCW, 464 DBG_BUS_CLIENT_RBCV, 465 MAX_DBG_BUS_CLIENTS 466 }; 467 468 /* Debug Bus constraint operation types */ 469 enum dbg_bus_constraint_ops { 470 DBG_BUS_CONSTRAINT_OP_EQ, 471 DBG_BUS_CONSTRAINT_OP_NE, 472 DBG_BUS_CONSTRAINT_OP_LT, 473 DBG_BUS_CONSTRAINT_OP_LTC, 474 DBG_BUS_CONSTRAINT_OP_LE, 475 DBG_BUS_CONSTRAINT_OP_LEC, 476 DBG_BUS_CONSTRAINT_OP_GT, 477 DBG_BUS_CONSTRAINT_OP_GTC, 478 DBG_BUS_CONSTRAINT_OP_GE, 479 DBG_BUS_CONSTRAINT_OP_GEC, 480 MAX_DBG_BUS_CONSTRAINT_OPS 481 }; 482 483 /* Debug Bus trigger state data */ 484 struct dbg_bus_trigger_state_data { 485 u8 msg_len; 486 u8 constraint_dword_mask; 487 u8 storm_id; 488 u8 reserved; 489 }; 490 491 /* Debug Bus memory address */ 492 struct dbg_bus_mem_addr { 493 u32 lo; 494 u32 hi; 495 }; 496 497 /* Debug Bus PCI buffer data */ 498 struct dbg_bus_pci_buf_data { 499 struct dbg_bus_mem_addr phys_addr; /* PCI buffer physical address */ 500 struct dbg_bus_mem_addr virt_addr; /* PCI buffer virtual address */ 501 u32 size; /* PCI buffer size in bytes */ 502 }; 503 504 /* Debug Bus Storm EID range filter params */ 505 struct dbg_bus_storm_eid_range_params { 506 u8 min; /* Minimal event ID to filter on */ 507 u8 max; /* Maximal event ID to filter on */ 508 }; 509 510 /* Debug Bus Storm EID mask filter params */ 511 struct dbg_bus_storm_eid_mask_params { 512 u8 val; /* Event ID value */ 513 u8 mask; /* Event ID mask. 1s in the mask = dont care bits. */ 514 }; 515 516 /* Debug Bus Storm EID filter params */ 517 union dbg_bus_storm_eid_params { 518 struct dbg_bus_storm_eid_range_params range; 519 struct dbg_bus_storm_eid_mask_params mask; 520 }; 521 522 /* Debug Bus Storm data */ 523 struct dbg_bus_storm_data { 524 u8 enabled; 525 u8 mode; 526 u8 hw_id; 527 u8 eid_filter_en; 528 u8 eid_range_not_mask; 529 u8 cid_filter_en; 530 union dbg_bus_storm_eid_params eid_filter_params; 531 u32 cid; 532 }; 533 534 /* Debug Bus data */ 535 struct dbg_bus_data { 536 u32 app_version; 537 u8 state; 538 u8 mode_256b_en; 539 u8 num_enabled_blocks; 540 u8 num_enabled_storms; 541 u8 target; 542 u8 one_shot_en; 543 u8 grc_input_en; 544 u8 timestamp_input_en; 545 u8 filter_en; 546 u8 adding_filter; 547 u8 filter_pre_trigger; 548 u8 filter_post_trigger; 549 u8 trigger_en; 550 u8 filter_constraint_dword_mask; 551 u8 next_trigger_state; 552 u8 next_constraint_id; 553 struct dbg_bus_trigger_state_data trigger_states[3]; 554 u8 filter_msg_len; 555 u8 rcv_from_other_engine; 556 u8 blocks_dword_mask; 557 u8 blocks_dword_overlap; 558 u32 hw_id_mask; 559 struct dbg_bus_pci_buf_data pci_buf; 560 struct dbg_bus_block_data blocks[132]; 561 struct dbg_bus_storm_data storms[6]; 562 }; 563 564 /* Debug bus states */ 565 enum dbg_bus_states { 566 DBG_BUS_STATE_IDLE, 567 DBG_BUS_STATE_READY, 568 DBG_BUS_STATE_RECORDING, 569 DBG_BUS_STATE_STOPPED, 570 MAX_DBG_BUS_STATES 571 }; 572 573 /* Debug Bus Storm modes */ 574 enum dbg_bus_storm_modes { 575 DBG_BUS_STORM_MODE_PRINTF, 576 DBG_BUS_STORM_MODE_PRAM_ADDR, 577 DBG_BUS_STORM_MODE_DRA_RW, 578 DBG_BUS_STORM_MODE_DRA_W, 579 DBG_BUS_STORM_MODE_LD_ST_ADDR, 580 DBG_BUS_STORM_MODE_DRA_FSM, 581 DBG_BUS_STORM_MODE_FAST_DBGMUX, 582 DBG_BUS_STORM_MODE_RH, 583 DBG_BUS_STORM_MODE_RH_WITH_STORE, 584 DBG_BUS_STORM_MODE_FOC, 585 DBG_BUS_STORM_MODE_EXT_STORE, 586 MAX_DBG_BUS_STORM_MODES 587 }; 588 589 /* Debug bus target IDs */ 590 enum dbg_bus_targets { 591 DBG_BUS_TARGET_ID_INT_BUF, 592 DBG_BUS_TARGET_ID_NIG, 593 DBG_BUS_TARGET_ID_PCI, 594 MAX_DBG_BUS_TARGETS 595 }; 596 597 /* GRC Dump data */ 598 struct dbg_grc_data { 599 u8 params_initialized; 600 u8 reserved1; 601 u16 reserved2; 602 u32 param_val[48]; 603 }; 604 605 /* Debug GRC params */ 606 enum dbg_grc_params { 607 DBG_GRC_PARAM_DUMP_TSTORM, 608 DBG_GRC_PARAM_DUMP_MSTORM, 609 DBG_GRC_PARAM_DUMP_USTORM, 610 DBG_GRC_PARAM_DUMP_XSTORM, 611 DBG_GRC_PARAM_DUMP_YSTORM, 612 DBG_GRC_PARAM_DUMP_PSTORM, 613 DBG_GRC_PARAM_DUMP_REGS, 614 DBG_GRC_PARAM_DUMP_RAM, 615 DBG_GRC_PARAM_DUMP_PBUF, 616 DBG_GRC_PARAM_DUMP_IOR, 617 DBG_GRC_PARAM_DUMP_VFC, 618 DBG_GRC_PARAM_DUMP_CM_CTX, 619 DBG_GRC_PARAM_DUMP_PXP, 620 DBG_GRC_PARAM_DUMP_RSS, 621 DBG_GRC_PARAM_DUMP_CAU, 622 DBG_GRC_PARAM_DUMP_QM, 623 DBG_GRC_PARAM_DUMP_MCP, 624 DBG_GRC_PARAM_DUMP_DORQ, 625 DBG_GRC_PARAM_DUMP_CFC, 626 DBG_GRC_PARAM_DUMP_IGU, 627 DBG_GRC_PARAM_DUMP_BRB, 628 DBG_GRC_PARAM_DUMP_BTB, 629 DBG_GRC_PARAM_DUMP_BMB, 630 DBG_GRC_PARAM_RESERVD1, 631 DBG_GRC_PARAM_DUMP_MULD, 632 DBG_GRC_PARAM_DUMP_PRS, 633 DBG_GRC_PARAM_DUMP_DMAE, 634 DBG_GRC_PARAM_DUMP_TM, 635 DBG_GRC_PARAM_DUMP_SDM, 636 DBG_GRC_PARAM_DUMP_DIF, 637 DBG_GRC_PARAM_DUMP_STATIC, 638 DBG_GRC_PARAM_UNSTALL, 639 DBG_GRC_PARAM_RESERVED2, 640 DBG_GRC_PARAM_MCP_TRACE_META_SIZE, 641 DBG_GRC_PARAM_EXCLUDE_ALL, 642 DBG_GRC_PARAM_CRASH, 643 DBG_GRC_PARAM_PARITY_SAFE, 644 DBG_GRC_PARAM_DUMP_CM, 645 DBG_GRC_PARAM_DUMP_PHY, 646 DBG_GRC_PARAM_NO_MCP, 647 DBG_GRC_PARAM_NO_FW_VER, 648 DBG_GRC_PARAM_RESERVED3, 649 DBG_GRC_PARAM_DUMP_MCP_HW_DUMP, 650 DBG_GRC_PARAM_DUMP_ILT_CDUC, 651 DBG_GRC_PARAM_DUMP_ILT_CDUT, 652 DBG_GRC_PARAM_DUMP_CAU_EXT, 653 MAX_DBG_GRC_PARAMS 654 }; 655 656 /* Debug status codes */ 657 enum dbg_status { 658 DBG_STATUS_OK, 659 DBG_STATUS_APP_VERSION_NOT_SET, 660 DBG_STATUS_UNSUPPORTED_APP_VERSION, 661 DBG_STATUS_DBG_BLOCK_NOT_RESET, 662 DBG_STATUS_INVALID_ARGS, 663 DBG_STATUS_OUTPUT_ALREADY_SET, 664 DBG_STATUS_INVALID_PCI_BUF_SIZE, 665 DBG_STATUS_PCI_BUF_ALLOC_FAILED, 666 DBG_STATUS_PCI_BUF_NOT_ALLOCATED, 667 DBG_STATUS_INVALID_FILTER_TRIGGER_DWORDS, 668 DBG_STATUS_NO_MATCHING_FRAMING_MODE, 669 DBG_STATUS_VFC_READ_ERROR, 670 DBG_STATUS_STORM_ALREADY_ENABLED, 671 DBG_STATUS_STORM_NOT_ENABLED, 672 DBG_STATUS_BLOCK_ALREADY_ENABLED, 673 DBG_STATUS_BLOCK_NOT_ENABLED, 674 DBG_STATUS_NO_INPUT_ENABLED, 675 DBG_STATUS_NO_FILTER_TRIGGER_256B, 676 DBG_STATUS_FILTER_ALREADY_ENABLED, 677 DBG_STATUS_TRIGGER_ALREADY_ENABLED, 678 DBG_STATUS_TRIGGER_NOT_ENABLED, 679 DBG_STATUS_CANT_ADD_CONSTRAINT, 680 DBG_STATUS_TOO_MANY_TRIGGER_STATES, 681 DBG_STATUS_TOO_MANY_CONSTRAINTS, 682 DBG_STATUS_RECORDING_NOT_STARTED, 683 DBG_STATUS_DATA_DIDNT_TRIGGER, 684 DBG_STATUS_NO_DATA_RECORDED, 685 DBG_STATUS_DUMP_BUF_TOO_SMALL, 686 DBG_STATUS_DUMP_NOT_CHUNK_ALIGNED, 687 DBG_STATUS_UNKNOWN_CHIP, 688 DBG_STATUS_VIRT_MEM_ALLOC_FAILED, 689 DBG_STATUS_BLOCK_IN_RESET, 690 DBG_STATUS_INVALID_TRACE_SIGNATURE, 691 DBG_STATUS_INVALID_NVRAM_BUNDLE, 692 DBG_STATUS_NVRAM_GET_IMAGE_FAILED, 693 DBG_STATUS_NON_ALIGNED_NVRAM_IMAGE, 694 DBG_STATUS_NVRAM_READ_FAILED, 695 DBG_STATUS_IDLE_CHK_PARSE_FAILED, 696 DBG_STATUS_MCP_TRACE_BAD_DATA, 697 DBG_STATUS_MCP_TRACE_NO_META, 698 DBG_STATUS_MCP_COULD_NOT_HALT, 699 DBG_STATUS_MCP_COULD_NOT_RESUME, 700 DBG_STATUS_RESERVED0, 701 DBG_STATUS_SEMI_FIFO_NOT_EMPTY, 702 DBG_STATUS_IGU_FIFO_BAD_DATA, 703 DBG_STATUS_MCP_COULD_NOT_MASK_PRTY, 704 DBG_STATUS_FW_ASSERTS_PARSE_FAILED, 705 DBG_STATUS_REG_FIFO_BAD_DATA, 706 DBG_STATUS_PROTECTION_OVERRIDE_BAD_DATA, 707 DBG_STATUS_DBG_ARRAY_NOT_SET, 708 DBG_STATUS_RESERVED1, 709 DBG_STATUS_NON_MATCHING_LINES, 710 DBG_STATUS_INSUFFICIENT_HW_IDS, 711 DBG_STATUS_DBG_BUS_IN_USE, 712 DBG_STATUS_INVALID_STORM_DBG_MODE, 713 DBG_STATUS_OTHER_ENGINE_BB_ONLY, 714 DBG_STATUS_FILTER_SINGLE_HW_ID, 715 DBG_STATUS_TRIGGER_SINGLE_HW_ID, 716 DBG_STATUS_MISSING_TRIGGER_STATE_STORM, 717 MAX_DBG_STATUS 718 }; 719 720 /* Debug Storms IDs */ 721 enum dbg_storms { 722 DBG_TSTORM_ID, 723 DBG_MSTORM_ID, 724 DBG_USTORM_ID, 725 DBG_XSTORM_ID, 726 DBG_YSTORM_ID, 727 DBG_PSTORM_ID, 728 MAX_DBG_STORMS 729 }; 730 731 /* Idle Check data */ 732 struct idle_chk_data { 733 u32 buf_size; 734 u8 buf_size_set; 735 u8 reserved1; 736 u16 reserved2; 737 }; 738 739 struct pretend_params { 740 u8 split_type; 741 u8 reserved; 742 u16 split_id; 743 }; 744 745 /* Debug Tools data (per HW function) 746 */ 747 struct dbg_tools_data { 748 struct dbg_grc_data grc; 749 struct dbg_bus_data bus; 750 struct idle_chk_data idle_chk; 751 u8 mode_enable[40]; 752 u8 block_in_reset[132]; 753 u8 chip_id; 754 u8 hw_type; 755 u8 num_ports; 756 u8 num_pfs_per_port; 757 u8 num_vfs; 758 u8 initialized; 759 u8 use_dmae; 760 u8 reserved; 761 struct pretend_params pretend; 762 u32 num_regs_read; 763 }; 764 765 /* ILT Clients */ 766 enum ilt_clients { 767 ILT_CLI_CDUC, 768 ILT_CLI_CDUT, 769 ILT_CLI_QM, 770 ILT_CLI_TM, 771 ILT_CLI_SRC, 772 ILT_CLI_TSDM, 773 ILT_CLI_RGFS, 774 ILT_CLI_TGFS, 775 MAX_ILT_CLIENTS 776 }; 777 778 /***************************** Public Functions *******************************/ 779 780 /** 781 * qed_dbg_set_bin_ptr(): Sets a pointer to the binary data with debug 782 * arrays. 783 * 784 * @p_hwfn: HW device data. 785 * @bin_ptr: A pointer to the binary data with debug arrays. 786 * 787 * Return: enum dbg status. 788 */ 789 enum dbg_status qed_dbg_set_bin_ptr(struct qed_hwfn *p_hwfn, 790 const u8 * const bin_ptr); 791 792 /** 793 * qed_read_regs(): Reads registers into a buffer (using GRC). 794 * 795 * @p_hwfn: HW device data. 796 * @p_ptt: Ptt window used for writing the registers. 797 * @buf: Destination buffer. 798 * @addr: Source GRC address in dwords. 799 * @len: Number of registers to read. 800 * 801 * Return: Void. 802 */ 803 void qed_read_regs(struct qed_hwfn *p_hwfn, 804 struct qed_ptt *p_ptt, u32 *buf, u32 addr, u32 len); 805 806 /** 807 * qed_read_fw_info(): Reads FW info from the chip. 808 * 809 * @p_hwfn: HW device data. 810 * @p_ptt: Ptt window used for writing the registers. 811 * @fw_info: (Out) a pointer to write the FW info into. 812 * 813 * Return: True if the FW info was read successfully from one of the Storms, 814 * or false if all Storms are in reset. 815 * 816 * The FW info contains FW-related information, such as the FW version, 817 * FW image (main/L2B/kuku), FW timestamp, etc. 818 * The FW info is read from the internal RAM of the first Storm that is not in 819 * reset. 820 */ 821 bool qed_read_fw_info(struct qed_hwfn *p_hwfn, 822 struct qed_ptt *p_ptt, struct fw_info *fw_info); 823 /** 824 * qed_dbg_grc_config(): Sets the value of a GRC parameter. 825 * 826 * @p_hwfn: HW device data. 827 * @grc_param: GRC parameter. 828 * @val: Value to set. 829 * 830 * Return: Error if one of the following holds: 831 * - The version wasn't set. 832 * - Grc_param is invalid. 833 * - Val is outside the allowed boundaries. 834 */ 835 enum dbg_status qed_dbg_grc_config(struct qed_hwfn *p_hwfn, 836 enum dbg_grc_params grc_param, u32 val); 837 838 /** 839 * qed_dbg_grc_set_params_default(): Reverts all GRC parameters to their 840 * default value. 841 * 842 * @p_hwfn: HW device data. 843 * 844 * Return: Void. 845 */ 846 void qed_dbg_grc_set_params_default(struct qed_hwfn *p_hwfn); 847 /** 848 * qed_dbg_grc_get_dump_buf_size(): Returns the required buffer size for 849 * GRC Dump. 850 * 851 * @p_hwfn: HW device data. 852 * @p_ptt: Ptt window used for writing the registers. 853 * @buf_size: (OUT) required buffer size (in dwords) for the GRC Dump 854 * data. 855 * 856 * Return: Error if one of the following holds: 857 * - The version wasn't set 858 * Otherwise, returns ok. 859 */ 860 enum dbg_status qed_dbg_grc_get_dump_buf_size(struct qed_hwfn *p_hwfn, 861 struct qed_ptt *p_ptt, 862 u32 *buf_size); 863 864 /** 865 * qed_dbg_grc_dump(): Dumps GRC data into the specified buffer. 866 * 867 * @p_hwfn: HW device data. 868 * @p_ptt: Ptt window used for writing the registers. 869 * @dump_buf: Pointer to write the collected GRC data into. 870 * @buf_size_in_dwords:Size of the specified buffer in dwords. 871 * @num_dumped_dwords: (OUT) number of dumped dwords. 872 * 873 * Return: Error if one of the following holds: 874 * - The version wasn't set. 875 * - The specified dump buffer is too small. 876 * Otherwise, returns ok. 877 */ 878 enum dbg_status qed_dbg_grc_dump(struct qed_hwfn *p_hwfn, 879 struct qed_ptt *p_ptt, 880 u32 *dump_buf, 881 u32 buf_size_in_dwords, 882 u32 *num_dumped_dwords); 883 884 /** 885 * qed_dbg_idle_chk_get_dump_buf_size(): Returns the required buffer size 886 * for idle check results. 887 * 888 * @p_hwfn: HW device data. 889 * @p_ptt: Ptt window used for writing the registers. 890 * @buf_size: (OUT) required buffer size (in dwords) for the idle check 891 * data. 892 * 893 * return: Error if one of the following holds: 894 * - The version wasn't set. 895 * Otherwise, returns ok. 896 */ 897 enum dbg_status qed_dbg_idle_chk_get_dump_buf_size(struct qed_hwfn *p_hwfn, 898 struct qed_ptt *p_ptt, 899 u32 *buf_size); 900 901 /** 902 * qed_dbg_idle_chk_dump: Performs idle check and writes the results 903 * into the specified buffer. 904 * 905 * @p_hwfn: HW device data. 906 * @p_ptt: Ptt window used for writing the registers. 907 * @dump_buf: Pointer to write the idle check data into. 908 * @buf_size_in_dwords: Size of the specified buffer in dwords. 909 * @num_dumped_dwords: (OUT) number of dumped dwords. 910 * 911 * Return: Error if one of the following holds: 912 * - The version wasn't set. 913 * - The specified buffer is too small. 914 * Otherwise, returns ok. 915 */ 916 enum dbg_status qed_dbg_idle_chk_dump(struct qed_hwfn *p_hwfn, 917 struct qed_ptt *p_ptt, 918 u32 *dump_buf, 919 u32 buf_size_in_dwords, 920 u32 *num_dumped_dwords); 921 922 /** 923 * qed_dbg_mcp_trace_get_dump_buf_size(): Returns the required buffer size 924 * for mcp trace results. 925 * 926 * @p_hwfn: HW device data. 927 * @p_ptt: Ptt window used for writing the registers. 928 * @buf_size: (OUT) Required buffer size (in dwords) for mcp trace data. 929 * 930 * Return: Error if one of the following holds: 931 * - The version wasn't set. 932 * - The trace data in MCP scratchpad contain an invalid signature. 933 * - The bundle ID in NVRAM is invalid. 934 * - The trace meta data cannot be found (in NVRAM or image file). 935 * Otherwise, returns ok. 936 */ 937 enum dbg_status qed_dbg_mcp_trace_get_dump_buf_size(struct qed_hwfn *p_hwfn, 938 struct qed_ptt *p_ptt, 939 u32 *buf_size); 940 941 /** 942 * qed_dbg_mcp_trace_dump(): Performs mcp trace and writes the results 943 * into the specified buffer. 944 * 945 * @p_hwfn: HW device data. 946 * @p_ptt: Ptt window used for writing the registers. 947 * @dump_buf: Pointer to write the mcp trace data into. 948 * @buf_size_in_dwords: Size of the specified buffer in dwords. 949 * @num_dumped_dwords: (OUT) number of dumped dwords. 950 * 951 * Return: Error if one of the following holds: 952 * - The version wasn't set. 953 * - The specified buffer is too small. 954 * - The trace data in MCP scratchpad contain an invalid signature. 955 * - The bundle ID in NVRAM is invalid. 956 * - The trace meta data cannot be found (in NVRAM or image file). 957 * - The trace meta data cannot be read (from NVRAM or image file). 958 * Otherwise, returns ok. 959 */ 960 enum dbg_status qed_dbg_mcp_trace_dump(struct qed_hwfn *p_hwfn, 961 struct qed_ptt *p_ptt, 962 u32 *dump_buf, 963 u32 buf_size_in_dwords, 964 u32 *num_dumped_dwords); 965 966 /** 967 * qed_dbg_reg_fifo_get_dump_buf_size(): Returns the required buffer size 968 * for grc trace fifo results. 969 * 970 * @p_hwfn: HW device data. 971 * @p_ptt: Ptt window used for writing the registers. 972 * @buf_size: (OUT) Required buffer size (in dwords) for reg fifo data. 973 * 974 * Return: Error if one of the following holds: 975 * - The version wasn't set 976 * Otherwise, returns ok. 977 */ 978 enum dbg_status qed_dbg_reg_fifo_get_dump_buf_size(struct qed_hwfn *p_hwfn, 979 struct qed_ptt *p_ptt, 980 u32 *buf_size); 981 982 /** 983 * qed_dbg_reg_fifo_dump(): Reads the reg fifo and writes the results into 984 * the specified buffer. 985 * 986 * @p_hwfn: HW device data. 987 * @p_ptt: Ptt window used for writing the registers. 988 * @dump_buf: Pointer to write the reg fifo data into. 989 * @buf_size_in_dwords: Size of the specified buffer in dwords. 990 * @num_dumped_dwords: (OUT) number of dumped dwords. 991 * 992 * Return: Error if one of the following holds: 993 * - The version wasn't set. 994 * - The specified buffer is too small. 995 * - DMAE transaction failed. 996 * Otherwise, returns ok. 997 */ 998 enum dbg_status qed_dbg_reg_fifo_dump(struct qed_hwfn *p_hwfn, 999 struct qed_ptt *p_ptt, 1000 u32 *dump_buf, 1001 u32 buf_size_in_dwords, 1002 u32 *num_dumped_dwords); 1003 1004 /** 1005 * qed_dbg_igu_fifo_get_dump_buf_size(): Returns the required buffer size 1006 * for the IGU fifo results. 1007 * 1008 * @p_hwfn: HW device data. 1009 * @p_ptt: Ptt window used for writing the registers. 1010 * @buf_size: (OUT) Required buffer size (in dwords) for the IGU fifo 1011 * data. 1012 * 1013 * Return: Error if one of the following holds: 1014 * - The version wasn't set. 1015 * Otherwise, returns ok. 1016 */ 1017 enum dbg_status qed_dbg_igu_fifo_get_dump_buf_size(struct qed_hwfn *p_hwfn, 1018 struct qed_ptt *p_ptt, 1019 u32 *buf_size); 1020 1021 /** 1022 * qed_dbg_igu_fifo_dump(): Reads the IGU fifo and writes the results into 1023 * the specified buffer. 1024 * 1025 * @p_hwfn: HW device data. 1026 * @p_ptt: Ptt window used for writing the registers. 1027 * @dump_buf: Pointer to write the IGU fifo data into. 1028 * @buf_size_in_dwords: Size of the specified buffer in dwords. 1029 * @num_dumped_dwords: (OUT) number of dumped dwords. 1030 * 1031 * Return: Error if one of the following holds: 1032 * - The version wasn't set 1033 * - The specified buffer is too small 1034 * - DMAE transaction failed 1035 * Otherwise, returns ok. 1036 */ 1037 enum dbg_status qed_dbg_igu_fifo_dump(struct qed_hwfn *p_hwfn, 1038 struct qed_ptt *p_ptt, 1039 u32 *dump_buf, 1040 u32 buf_size_in_dwords, 1041 u32 *num_dumped_dwords); 1042 1043 /** 1044 * qed_dbg_protection_override_get_dump_buf_size(): Returns the required 1045 * buffer size for protection override window results. 1046 * 1047 * @p_hwfn: HW device data. 1048 * @p_ptt: Ptt window used for writing the registers. 1049 * @buf_size: (OUT) Required buffer size (in dwords) for protection 1050 * override data. 1051 * 1052 * Return: Error if one of the following holds: 1053 * - The version wasn't set 1054 * Otherwise, returns ok. 1055 */ 1056 enum dbg_status 1057 qed_dbg_protection_override_get_dump_buf_size(struct qed_hwfn *p_hwfn, 1058 struct qed_ptt *p_ptt, 1059 u32 *buf_size); 1060 /** 1061 * qed_dbg_protection_override_dump(): Reads protection override window 1062 * entries and writes the results into the specified buffer. 1063 * 1064 * @p_hwfn: HW device data. 1065 * @p_ptt: Ptt window used for writing the registers. 1066 * @dump_buf: Pointer to write the protection override data into. 1067 * @buf_size_in_dwords: Size of the specified buffer in dwords. 1068 * @num_dumped_dwords: (OUT) number of dumped dwords. 1069 * 1070 * @return: Error if one of the following holds: 1071 * - The version wasn't set. 1072 * - The specified buffer is too small. 1073 * - DMAE transaction failed. 1074 * Otherwise, returns ok. 1075 */ 1076 enum dbg_status qed_dbg_protection_override_dump(struct qed_hwfn *p_hwfn, 1077 struct qed_ptt *p_ptt, 1078 u32 *dump_buf, 1079 u32 buf_size_in_dwords, 1080 u32 *num_dumped_dwords); 1081 /** 1082 * qed_dbg_fw_asserts_get_dump_buf_size(): Returns the required buffer 1083 * size for FW Asserts results. 1084 * 1085 * @p_hwfn: HW device data. 1086 * @p_ptt: Ptt window used for writing the registers. 1087 * @buf_size: (OUT) Required buffer size (in dwords) for FW Asserts data. 1088 * 1089 * Return: Error if one of the following holds: 1090 * - The version wasn't set. 1091 * Otherwise, returns ok. 1092 */ 1093 enum dbg_status qed_dbg_fw_asserts_get_dump_buf_size(struct qed_hwfn *p_hwfn, 1094 struct qed_ptt *p_ptt, 1095 u32 *buf_size); 1096 /** 1097 * qed_dbg_fw_asserts_dump(): Reads the FW Asserts and writes the results 1098 * into the specified buffer. 1099 * 1100 * @p_hwfn: HW device data. 1101 * @p_ptt: Ptt window used for writing the registers. 1102 * @dump_buf: Pointer to write the FW Asserts data into. 1103 * @buf_size_in_dwords: Size of the specified buffer in dwords. 1104 * @num_dumped_dwords: (OUT) number of dumped dwords. 1105 * 1106 * Return: Error if one of the following holds: 1107 * - The version wasn't set. 1108 * - The specified buffer is too small. 1109 * Otherwise, returns ok. 1110 */ 1111 enum dbg_status qed_dbg_fw_asserts_dump(struct qed_hwfn *p_hwfn, 1112 struct qed_ptt *p_ptt, 1113 u32 *dump_buf, 1114 u32 buf_size_in_dwords, 1115 u32 *num_dumped_dwords); 1116 1117 /** 1118 * qed_dbg_read_attn(): Reads the attention registers of the specified 1119 * block and type, and writes the results into the specified buffer. 1120 * 1121 * @p_hwfn: HW device data. 1122 * @p_ptt: Ptt window used for writing the registers. 1123 * @block: Block ID. 1124 * @attn_type: Attention type. 1125 * @clear_status: Indicates if the attention status should be cleared. 1126 * @results: (OUT) Pointer to write the read results into. 1127 * 1128 * Return: Error if one of the following holds: 1129 * - The version wasn't set 1130 * Otherwise, returns ok. 1131 */ 1132 enum dbg_status qed_dbg_read_attn(struct qed_hwfn *p_hwfn, 1133 struct qed_ptt *p_ptt, 1134 enum block_id block, 1135 enum dbg_attn_type attn_type, 1136 bool clear_status, 1137 struct dbg_attn_block_result *results); 1138 1139 /** 1140 * qed_dbg_print_attn(): Prints attention registers values in the 1141 * specified results struct. 1142 * 1143 * @p_hwfn: HW device data. 1144 * @results: Pointer to the attention read results 1145 * 1146 * Return: Error if one of the following holds: 1147 * - The version wasn't set 1148 * Otherwise, returns ok. 1149 */ 1150 enum dbg_status qed_dbg_print_attn(struct qed_hwfn *p_hwfn, 1151 struct dbg_attn_block_result *results); 1152 1153 /******************************* Data Types **********************************/ 1154 1155 struct mcp_trace_format { 1156 u32 data; 1157 #define MCP_TRACE_FORMAT_MODULE_MASK 0x0000ffff 1158 #define MCP_TRACE_FORMAT_MODULE_OFFSET 0 1159 #define MCP_TRACE_FORMAT_LEVEL_MASK 0x00030000 1160 #define MCP_TRACE_FORMAT_LEVEL_OFFSET 16 1161 #define MCP_TRACE_FORMAT_P1_SIZE_MASK 0x000c0000 1162 #define MCP_TRACE_FORMAT_P1_SIZE_OFFSET 18 1163 #define MCP_TRACE_FORMAT_P2_SIZE_MASK 0x00300000 1164 #define MCP_TRACE_FORMAT_P2_SIZE_OFFSET 20 1165 #define MCP_TRACE_FORMAT_P3_SIZE_MASK 0x00c00000 1166 #define MCP_TRACE_FORMAT_P3_SIZE_OFFSET 22 1167 #define MCP_TRACE_FORMAT_LEN_MASK 0xff000000 1168 #define MCP_TRACE_FORMAT_LEN_OFFSET 24 1169 1170 char *format_str; 1171 }; 1172 1173 /* MCP Trace Meta data structure */ 1174 struct mcp_trace_meta { 1175 u32 modules_num; 1176 char **modules; 1177 u32 formats_num; 1178 struct mcp_trace_format *formats; 1179 bool is_allocated; 1180 }; 1181 1182 /* Debug Tools user data */ 1183 struct dbg_tools_user_data { 1184 struct mcp_trace_meta mcp_trace_meta; 1185 const u32 *mcp_trace_user_meta_buf; 1186 }; 1187 1188 /******************************** Constants **********************************/ 1189 1190 #define MAX_NAME_LEN 16 1191 1192 /***************************** Public Functions *******************************/ 1193 1194 /** 1195 * qed_dbg_user_set_bin_ptr(): Sets a pointer to the binary data with 1196 * debug arrays. 1197 * 1198 * @p_hwfn: HW device data. 1199 * @bin_ptr: a pointer to the binary data with debug arrays. 1200 * 1201 * Return: dbg_status. 1202 */ 1203 enum dbg_status qed_dbg_user_set_bin_ptr(struct qed_hwfn *p_hwfn, 1204 const u8 * const bin_ptr); 1205 1206 /** 1207 * qed_dbg_alloc_user_data(): Allocates user debug data. 1208 * 1209 * @p_hwfn: HW device data. 1210 * @user_data_ptr: (OUT) a pointer to the allocated memory. 1211 * 1212 * Return: dbg_status. 1213 */ 1214 enum dbg_status qed_dbg_alloc_user_data(struct qed_hwfn *p_hwfn, 1215 void **user_data_ptr); 1216 1217 /** 1218 * qed_dbg_get_status_str(): Returns a string for the specified status. 1219 * 1220 * @status: A debug status code. 1221 * 1222 * Return: A string for the specified status. 1223 */ 1224 const char *qed_dbg_get_status_str(enum dbg_status status); 1225 1226 /** 1227 * qed_get_idle_chk_results_buf_size(): Returns the required buffer size 1228 * for idle check results (in bytes). 1229 * 1230 * @p_hwfn: HW device data. 1231 * @dump_buf: idle check dump buffer. 1232 * @num_dumped_dwords: number of dwords that were dumped. 1233 * @results_buf_size: (OUT) required buffer size (in bytes) for the parsed 1234 * results. 1235 * 1236 * Return: Error if the parsing fails, ok otherwise. 1237 */ 1238 enum dbg_status qed_get_idle_chk_results_buf_size(struct qed_hwfn *p_hwfn, 1239 u32 *dump_buf, 1240 u32 num_dumped_dwords, 1241 u32 *results_buf_size); 1242 /** 1243 * qed_print_idle_chk_results(): Prints idle check results 1244 * 1245 * @p_hwfn: HW device data. 1246 * @dump_buf: idle check dump buffer. 1247 * @num_dumped_dwords: number of dwords that were dumped. 1248 * @results_buf: buffer for printing the idle check results. 1249 * @num_errors: (OUT) number of errors found in idle check. 1250 * @num_warnings: (OUT) number of warnings found in idle check. 1251 * 1252 * Return: Error if the parsing fails, ok otherwise. 1253 */ 1254 enum dbg_status qed_print_idle_chk_results(struct qed_hwfn *p_hwfn, 1255 u32 *dump_buf, 1256 u32 num_dumped_dwords, 1257 char *results_buf, 1258 u32 *num_errors, 1259 u32 *num_warnings); 1260 1261 /** 1262 * qed_dbg_mcp_trace_set_meta_data(): Sets the MCP Trace meta data. 1263 * 1264 * @p_hwfn: HW device data. 1265 * @meta_buf: Meta buffer. 1266 * 1267 * Return: Void. 1268 * 1269 * Needed in case the MCP Trace dump doesn't contain the meta data (e.g. due to 1270 * no NVRAM access). 1271 */ 1272 void qed_dbg_mcp_trace_set_meta_data(struct qed_hwfn *p_hwfn, 1273 const u32 *meta_buf); 1274 1275 /** 1276 * qed_get_mcp_trace_results_buf_size(): Returns the required buffer size 1277 * for MCP Trace results (in bytes). 1278 * 1279 * @p_hwfn: HW device data. 1280 * @dump_buf: MCP Trace dump buffer. 1281 * @num_dumped_dwords: number of dwords that were dumped. 1282 * @results_buf_size: (OUT) required buffer size (in bytes) for the parsed 1283 * results. 1284 * 1285 * Return: Rrror if the parsing fails, ok otherwise. 1286 */ 1287 enum dbg_status qed_get_mcp_trace_results_buf_size(struct qed_hwfn *p_hwfn, 1288 u32 *dump_buf, 1289 u32 num_dumped_dwords, 1290 u32 *results_buf_size); 1291 1292 /** 1293 * qed_print_mcp_trace_results(): Prints MCP Trace results 1294 * 1295 * @p_hwfn: HW device data. 1296 * @dump_buf: MCP trace dump buffer, starting from the header. 1297 * @num_dumped_dwords: Member of dwords that were dumped. 1298 * @results_buf: Buffer for printing the mcp trace results. 1299 * 1300 * Return: Error if the parsing fails, ok otherwise. 1301 */ 1302 enum dbg_status qed_print_mcp_trace_results(struct qed_hwfn *p_hwfn, 1303 u32 *dump_buf, 1304 u32 num_dumped_dwords, 1305 char *results_buf); 1306 1307 /** 1308 * qed_print_mcp_trace_results_cont(): Prints MCP Trace results, and 1309 * keeps the MCP trace meta data allocated, to support continuous MCP Trace 1310 * parsing. After the continuous parsing ends, mcp_trace_free_meta_data should 1311 * be called to free the meta data. 1312 * 1313 * @p_hwfn: HW device data. 1314 * @dump_buf: MVP trace dump buffer, starting from the header. 1315 * @results_buf: Buffer for printing the mcp trace results. 1316 * 1317 * Return: Error if the parsing fails, ok otherwise. 1318 */ 1319 enum dbg_status qed_print_mcp_trace_results_cont(struct qed_hwfn *p_hwfn, 1320 u32 *dump_buf, 1321 char *results_buf); 1322 1323 /** 1324 * qed_print_mcp_trace_line(): Prints MCP Trace results for a single line 1325 * 1326 * @p_hwfn: HW device data. 1327 * @dump_buf: MCP trace dump buffer, starting from the header. 1328 * @num_dumped_bytes: Number of bytes that were dumped. 1329 * @results_buf: Buffer for printing the mcp trace results. 1330 * 1331 * Return: Error if the parsing fails, ok otherwise. 1332 */ 1333 enum dbg_status qed_print_mcp_trace_line(struct qed_hwfn *p_hwfn, 1334 u8 *dump_buf, 1335 u32 num_dumped_bytes, 1336 char *results_buf); 1337 1338 /** 1339 * qed_mcp_trace_free_meta_data(): Frees the MCP Trace meta data. 1340 * Should be called after continuous MCP Trace parsing. 1341 * 1342 * @p_hwfn: HW device data. 1343 * 1344 * Return: Void. 1345 */ 1346 void qed_mcp_trace_free_meta_data(struct qed_hwfn *p_hwfn); 1347 1348 /** 1349 * qed_get_reg_fifo_results_buf_size(): Returns the required buffer size 1350 * for reg_fifo results (in bytes). 1351 * 1352 * @p_hwfn: HW device data. 1353 * @dump_buf: Reg fifo dump buffer. 1354 * @num_dumped_dwords: Number of dwords that were dumped. 1355 * @results_buf_size: (OUT) required buffer size (in bytes) for the parsed 1356 * results. 1357 * 1358 * Return: Error if the parsing fails, ok otherwise. 1359 */ 1360 enum dbg_status qed_get_reg_fifo_results_buf_size(struct qed_hwfn *p_hwfn, 1361 u32 *dump_buf, 1362 u32 num_dumped_dwords, 1363 u32 *results_buf_size); 1364 1365 /** 1366 * qed_print_reg_fifo_results(): Prints reg fifo results. 1367 * 1368 * @p_hwfn: HW device data. 1369 * @dump_buf: Reg fifo dump buffer, starting from the header. 1370 * @num_dumped_dwords: Number of dwords that were dumped. 1371 * @results_buf: Buffer for printing the reg fifo results. 1372 * 1373 * Return: Error if the parsing fails, ok otherwise. 1374 */ 1375 enum dbg_status qed_print_reg_fifo_results(struct qed_hwfn *p_hwfn, 1376 u32 *dump_buf, 1377 u32 num_dumped_dwords, 1378 char *results_buf); 1379 1380 /** 1381 * qed_get_igu_fifo_results_buf_size(): Returns the required buffer size 1382 * for igu_fifo results (in bytes). 1383 * 1384 * @p_hwfn: HW device data. 1385 * @dump_buf: IGU fifo dump buffer. 1386 * @num_dumped_dwords: number of dwords that were dumped. 1387 * @results_buf_size: (OUT) required buffer size (in bytes) for the parsed 1388 * results. 1389 * 1390 * Return: Error if the parsing fails, ok otherwise. 1391 */ 1392 enum dbg_status qed_get_igu_fifo_results_buf_size(struct qed_hwfn *p_hwfn, 1393 u32 *dump_buf, 1394 u32 num_dumped_dwords, 1395 u32 *results_buf_size); 1396 1397 /** 1398 * qed_print_igu_fifo_results(): Prints IGU fifo results 1399 * 1400 * @p_hwfn: HW device data. 1401 * @dump_buf: IGU fifo dump buffer, starting from the header. 1402 * @num_dumped_dwords: Number of dwords that were dumped. 1403 * @results_buf: Buffer for printing the IGU fifo results. 1404 * 1405 * Return: Error if the parsing fails, ok otherwise. 1406 */ 1407 enum dbg_status qed_print_igu_fifo_results(struct qed_hwfn *p_hwfn, 1408 u32 *dump_buf, 1409 u32 num_dumped_dwords, 1410 char *results_buf); 1411 1412 /** 1413 * qed_get_protection_override_results_buf_size(): Returns the required 1414 * buffer size for protection override results (in bytes). 1415 * 1416 * @p_hwfn: HW device data. 1417 * @dump_buf: Protection override dump buffer. 1418 * @num_dumped_dwords: Number of dwords that were dumped. 1419 * @results_buf_size: (OUT) required buffer size (in bytes) for the parsed 1420 * results. 1421 * 1422 * Return: Error if the parsing fails, ok otherwise. 1423 */ 1424 enum dbg_status 1425 qed_get_protection_override_results_buf_size(struct qed_hwfn *p_hwfn, 1426 u32 *dump_buf, 1427 u32 num_dumped_dwords, 1428 u32 *results_buf_size); 1429 1430 /** 1431 * qed_print_protection_override_results(): Prints protection override 1432 * results. 1433 * 1434 * @p_hwfn: HW device data. 1435 * @dump_buf: Protection override dump buffer, starting from the header. 1436 * @num_dumped_dwords: Number of dwords that were dumped. 1437 * @results_buf: Buffer for printing the reg fifo results. 1438 * 1439 * Return: Error if the parsing fails, ok otherwise. 1440 */ 1441 enum dbg_status qed_print_protection_override_results(struct qed_hwfn *p_hwfn, 1442 u32 *dump_buf, 1443 u32 num_dumped_dwords, 1444 char *results_buf); 1445 1446 /** 1447 * qed_get_fw_asserts_results_buf_size(): Returns the required buffer size 1448 * for FW Asserts results (in bytes). 1449 * 1450 * @p_hwfn: HW device data. 1451 * @dump_buf: FW Asserts dump buffer. 1452 * @num_dumped_dwords: number of dwords that were dumped. 1453 * @results_buf_size: (OUT) required buffer size (in bytes) for the parsed 1454 * results. 1455 * 1456 * Return: Error if the parsing fails, ok otherwise. 1457 */ 1458 enum dbg_status qed_get_fw_asserts_results_buf_size(struct qed_hwfn *p_hwfn, 1459 u32 *dump_buf, 1460 u32 num_dumped_dwords, 1461 u32 *results_buf_size); 1462 1463 /** 1464 * qed_print_fw_asserts_results(): Prints FW Asserts results. 1465 * 1466 * @p_hwfn: HW device data. 1467 * @dump_buf: FW Asserts dump buffer, starting from the header. 1468 * @num_dumped_dwords: number of dwords that were dumped. 1469 * @results_buf: buffer for printing the FW Asserts results. 1470 * 1471 * Return: Error if the parsing fails, ok otherwise. 1472 */ 1473 enum dbg_status qed_print_fw_asserts_results(struct qed_hwfn *p_hwfn, 1474 u32 *dump_buf, 1475 u32 num_dumped_dwords, 1476 char *results_buf); 1477 1478 /** 1479 * qed_dbg_parse_attn(): Parses and prints attention registers values in 1480 * the specified results struct. 1481 * 1482 * @p_hwfn: HW device data. 1483 * @results: Pointer to the attention read results 1484 * 1485 * Return: Error if one of the following holds: 1486 * - The version wasn't set. 1487 * Otherwise, returns ok. 1488 */ 1489 enum dbg_status qed_dbg_parse_attn(struct qed_hwfn *p_hwfn, 1490 struct dbg_attn_block_result *results); 1491 #endif 1492