162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * Copyright 2018 Advanced Micro Devices, Inc. 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a 562306a36Sopenharmony_ci * copy of this software and associated documentation files (the "Software"), 662306a36Sopenharmony_ci * to deal in the Software without restriction, including without limitation 762306a36Sopenharmony_ci * the rights to use, copy, modify, merge, publish, distribute, sublicense, 862306a36Sopenharmony_ci * and/or sell copies of the Software, and to permit persons to whom the 962306a36Sopenharmony_ci * Software is furnished to do so, subject to the following conditions: 1062306a36Sopenharmony_ci * 1162306a36Sopenharmony_ci * The above copyright notice and this permission notice shall be included in 1262306a36Sopenharmony_ci * all copies or substantial portions of the Software. 1362306a36Sopenharmony_ci * 1462306a36Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1562306a36Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1662306a36Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 1762306a36Sopenharmony_ci * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 1862306a36Sopenharmony_ci * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 1962306a36Sopenharmony_ci * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 2062306a36Sopenharmony_ci * OTHER DEALINGS IN THE SOFTWARE. 2162306a36Sopenharmony_ci * 2262306a36Sopenharmony_ci * 2362306a36Sopenharmony_ci */ 2462306a36Sopenharmony_ci#ifndef _AMDGPU_RAS_H 2562306a36Sopenharmony_ci#define _AMDGPU_RAS_H 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci#include <linux/debugfs.h> 2862306a36Sopenharmony_ci#include <linux/list.h> 2962306a36Sopenharmony_ci#include "ta_ras_if.h" 3062306a36Sopenharmony_ci#include "amdgpu_ras_eeprom.h" 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_cistruct amdgpu_iv_entry; 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci#define AMDGPU_RAS_FLAG_INIT_BY_VBIOS (0x1 << 0) 3562306a36Sopenharmony_ci/* position of instance value in sub_block_index of 3662306a36Sopenharmony_ci * ta_ras_trigger_error_input, the sub block uses lower 12 bits 3762306a36Sopenharmony_ci */ 3862306a36Sopenharmony_ci#define AMDGPU_RAS_INST_MASK 0xfffff000 3962306a36Sopenharmony_ci#define AMDGPU_RAS_INST_SHIFT 0xc 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_cienum amdgpu_ras_block { 4262306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__UMC = 0, 4362306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__SDMA, 4462306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX, 4562306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__MMHUB, 4662306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__ATHUB, 4762306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__PCIE_BIF, 4862306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__HDP, 4962306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__XGMI_WAFL, 5062306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__DF, 5162306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__SMN, 5262306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__SEM, 5362306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__MP0, 5462306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__MP1, 5562306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__FUSE, 5662306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__MCA, 5762306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__VCN, 5862306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__JPEG, 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__LAST 6162306a36Sopenharmony_ci}; 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_cienum amdgpu_ras_mca_block { 6462306a36Sopenharmony_ci AMDGPU_RAS_MCA_BLOCK__MP0 = 0, 6562306a36Sopenharmony_ci AMDGPU_RAS_MCA_BLOCK__MP1, 6662306a36Sopenharmony_ci AMDGPU_RAS_MCA_BLOCK__MPIO, 6762306a36Sopenharmony_ci AMDGPU_RAS_MCA_BLOCK__IOHC, 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci AMDGPU_RAS_MCA_BLOCK__LAST 7062306a36Sopenharmony_ci}; 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci#define AMDGPU_RAS_BLOCK_COUNT AMDGPU_RAS_BLOCK__LAST 7362306a36Sopenharmony_ci#define AMDGPU_RAS_MCA_BLOCK_COUNT AMDGPU_RAS_MCA_BLOCK__LAST 7462306a36Sopenharmony_ci#define AMDGPU_RAS_BLOCK_MASK ((1ULL << AMDGPU_RAS_BLOCK_COUNT) - 1) 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_cienum amdgpu_ras_gfx_subblock { 7762306a36Sopenharmony_ci /* CPC */ 7862306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_CPC_INDEX_START = 0, 7962306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_CPC_SCRATCH = 8062306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_CPC_INDEX_START, 8162306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_CPC_UCODE, 8262306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_DC_STATE_ME1, 8362306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_DC_CSINVOC_ME1, 8462306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_DC_RESTORE_ME1, 8562306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_DC_STATE_ME2, 8662306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_DC_CSINVOC_ME2, 8762306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_DC_RESTORE_ME2, 8862306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_CPC_INDEX_END = 8962306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_DC_RESTORE_ME2, 9062306a36Sopenharmony_ci /* CPF */ 9162306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_CPF_INDEX_START, 9262306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_CPF_ROQ_ME2 = 9362306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_CPF_INDEX_START, 9462306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_CPF_ROQ_ME1, 9562306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_CPF_TAG, 9662306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_CPF_INDEX_END = AMDGPU_RAS_BLOCK__GFX_CPF_TAG, 9762306a36Sopenharmony_ci /* CPG */ 9862306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_CPG_INDEX_START, 9962306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_CPG_DMA_ROQ = 10062306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_CPG_INDEX_START, 10162306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_CPG_DMA_TAG, 10262306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_CPG_TAG, 10362306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_CPG_INDEX_END = AMDGPU_RAS_BLOCK__GFX_CPG_TAG, 10462306a36Sopenharmony_ci /* GDS */ 10562306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_GDS_INDEX_START, 10662306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_GDS_MEM = AMDGPU_RAS_BLOCK__GFX_GDS_INDEX_START, 10762306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_GDS_INPUT_QUEUE, 10862306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_GDS_OA_PHY_CMD_RAM_MEM, 10962306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_GDS_OA_PHY_DATA_RAM_MEM, 11062306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_GDS_OA_PIPE_MEM, 11162306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_GDS_INDEX_END = 11262306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_GDS_OA_PIPE_MEM, 11362306a36Sopenharmony_ci /* SPI */ 11462306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SPI_SR_MEM, 11562306a36Sopenharmony_ci /* SQ */ 11662306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQ_INDEX_START, 11762306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQ_SGPR = AMDGPU_RAS_BLOCK__GFX_SQ_INDEX_START, 11862306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQ_LDS_D, 11962306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQ_LDS_I, 12062306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQ_VGPR, 12162306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQ_INDEX_END = AMDGPU_RAS_BLOCK__GFX_SQ_VGPR, 12262306a36Sopenharmony_ci /* SQC (3 ranges) */ 12362306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQC_INDEX_START, 12462306a36Sopenharmony_ci /* SQC range 0 */ 12562306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQC_INDEX0_START = 12662306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQC_INDEX_START, 12762306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQC_INST_UTCL1_LFIFO = 12862306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQC_INDEX0_START, 12962306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQC_DATA_CU0_WRITE_DATA_BUF, 13062306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQC_DATA_CU0_UTCL1_LFIFO, 13162306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQC_DATA_CU1_WRITE_DATA_BUF, 13262306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQC_DATA_CU1_UTCL1_LFIFO, 13362306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQC_DATA_CU2_WRITE_DATA_BUF, 13462306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQC_DATA_CU2_UTCL1_LFIFO, 13562306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQC_INDEX0_END = 13662306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQC_DATA_CU2_UTCL1_LFIFO, 13762306a36Sopenharmony_ci /* SQC range 1 */ 13862306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQC_INDEX1_START, 13962306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQC_INST_BANKA_TAG_RAM = 14062306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQC_INDEX1_START, 14162306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQC_INST_BANKA_UTCL1_MISS_FIFO, 14262306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQC_INST_BANKA_MISS_FIFO, 14362306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQC_INST_BANKA_BANK_RAM, 14462306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQC_DATA_BANKA_TAG_RAM, 14562306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQC_DATA_BANKA_HIT_FIFO, 14662306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQC_DATA_BANKA_MISS_FIFO, 14762306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQC_DATA_BANKA_DIRTY_BIT_RAM, 14862306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQC_DATA_BANKA_BANK_RAM, 14962306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQC_INDEX1_END = 15062306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQC_DATA_BANKA_BANK_RAM, 15162306a36Sopenharmony_ci /* SQC range 2 */ 15262306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQC_INDEX2_START, 15362306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQC_INST_BANKB_TAG_RAM = 15462306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQC_INDEX2_START, 15562306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQC_INST_BANKB_UTCL1_MISS_FIFO, 15662306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQC_INST_BANKB_MISS_FIFO, 15762306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQC_INST_BANKB_BANK_RAM, 15862306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQC_DATA_BANKB_TAG_RAM, 15962306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQC_DATA_BANKB_HIT_FIFO, 16062306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQC_DATA_BANKB_MISS_FIFO, 16162306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQC_DATA_BANKB_DIRTY_BIT_RAM, 16262306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQC_DATA_BANKB_BANK_RAM, 16362306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQC_INDEX2_END = 16462306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQC_DATA_BANKB_BANK_RAM, 16562306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQC_INDEX_END = 16662306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_SQC_INDEX2_END, 16762306a36Sopenharmony_ci /* TA */ 16862306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TA_INDEX_START, 16962306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TA_FS_DFIFO = 17062306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TA_INDEX_START, 17162306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TA_FS_AFIFO, 17262306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TA_FL_LFIFO, 17362306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TA_FX_LFIFO, 17462306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TA_FS_CFIFO, 17562306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TA_INDEX_END = AMDGPU_RAS_BLOCK__GFX_TA_FS_CFIFO, 17662306a36Sopenharmony_ci /* TCA */ 17762306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCA_INDEX_START, 17862306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCA_HOLE_FIFO = 17962306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCA_INDEX_START, 18062306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCA_REQ_FIFO, 18162306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCA_INDEX_END = 18262306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCA_REQ_FIFO, 18362306a36Sopenharmony_ci /* TCC (5 sub-ranges) */ 18462306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_INDEX_START, 18562306a36Sopenharmony_ci /* TCC range 0 */ 18662306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_INDEX0_START = 18762306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_INDEX_START, 18862306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_CACHE_DATA = 18962306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_INDEX0_START, 19062306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_CACHE_DATA_BANK_0_1, 19162306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_CACHE_DATA_BANK_1_0, 19262306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_CACHE_DATA_BANK_1_1, 19362306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_CACHE_DIRTY_BANK_0, 19462306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_CACHE_DIRTY_BANK_1, 19562306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_HIGH_RATE_TAG, 19662306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_LOW_RATE_TAG, 19762306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_INDEX0_END = 19862306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_LOW_RATE_TAG, 19962306a36Sopenharmony_ci /* TCC range 1 */ 20062306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_INDEX1_START, 20162306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_IN_USE_DEC = 20262306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_INDEX1_START, 20362306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_IN_USE_TRANSFER, 20462306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_INDEX1_END = 20562306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_IN_USE_TRANSFER, 20662306a36Sopenharmony_ci /* TCC range 2 */ 20762306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_INDEX2_START, 20862306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_RETURN_DATA = 20962306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_INDEX2_START, 21062306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_RETURN_CONTROL, 21162306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_UC_ATOMIC_FIFO, 21262306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_WRITE_RETURN, 21362306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_WRITE_CACHE_READ, 21462306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_SRC_FIFO, 21562306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_SRC_FIFO_NEXT_RAM, 21662306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_CACHE_TAG_PROBE_FIFO, 21762306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_INDEX2_END = 21862306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_CACHE_TAG_PROBE_FIFO, 21962306a36Sopenharmony_ci /* TCC range 3 */ 22062306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_INDEX3_START, 22162306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_LATENCY_FIFO = 22262306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_INDEX3_START, 22362306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_LATENCY_FIFO_NEXT_RAM, 22462306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_INDEX3_END = 22562306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_LATENCY_FIFO_NEXT_RAM, 22662306a36Sopenharmony_ci /* TCC range 4 */ 22762306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_INDEX4_START, 22862306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_WRRET_TAG_WRITE_RETURN = 22962306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_INDEX4_START, 23062306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_ATOMIC_RETURN_BUFFER, 23162306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_INDEX4_END = 23262306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_ATOMIC_RETURN_BUFFER, 23362306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_INDEX_END = 23462306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCC_INDEX4_END, 23562306a36Sopenharmony_ci /* TCI */ 23662306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCI_WRITE_RAM, 23762306a36Sopenharmony_ci /* TCP */ 23862306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCP_INDEX_START, 23962306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCP_CACHE_RAM = 24062306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCP_INDEX_START, 24162306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCP_LFIFO_RAM, 24262306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCP_CMD_FIFO, 24362306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCP_VM_FIFO, 24462306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCP_DB_RAM, 24562306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCP_UTCL1_LFIFO0, 24662306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCP_UTCL1_LFIFO1, 24762306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCP_INDEX_END = 24862306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TCP_UTCL1_LFIFO1, 24962306a36Sopenharmony_ci /* TD */ 25062306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TD_INDEX_START, 25162306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TD_SS_FIFO_LO = 25262306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TD_INDEX_START, 25362306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TD_SS_FIFO_HI, 25462306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TD_CS_FIFO, 25562306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_TD_INDEX_END = AMDGPU_RAS_BLOCK__GFX_TD_CS_FIFO, 25662306a36Sopenharmony_ci /* EA (3 sub-ranges) */ 25762306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_EA_INDEX_START, 25862306a36Sopenharmony_ci /* EA range 0 */ 25962306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_EA_INDEX0_START = 26062306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_EA_INDEX_START, 26162306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_EA_DRAMRD_CMDMEM = 26262306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_EA_INDEX0_START, 26362306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_EA_DRAMWR_CMDMEM, 26462306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_EA_DRAMWR_DATAMEM, 26562306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_EA_RRET_TAGMEM, 26662306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_EA_WRET_TAGMEM, 26762306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_EA_GMIRD_CMDMEM, 26862306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_EA_GMIWR_CMDMEM, 26962306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_EA_GMIWR_DATAMEM, 27062306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_EA_INDEX0_END = 27162306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_EA_GMIWR_DATAMEM, 27262306a36Sopenharmony_ci /* EA range 1 */ 27362306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_EA_INDEX1_START, 27462306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_EA_DRAMRD_PAGEMEM = 27562306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_EA_INDEX1_START, 27662306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_EA_DRAMWR_PAGEMEM, 27762306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_EA_IORD_CMDMEM, 27862306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_EA_IOWR_CMDMEM, 27962306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_EA_IOWR_DATAMEM, 28062306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_EA_GMIRD_PAGEMEM, 28162306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_EA_GMIWR_PAGEMEM, 28262306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_EA_INDEX1_END = 28362306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_EA_GMIWR_PAGEMEM, 28462306a36Sopenharmony_ci /* EA range 2 */ 28562306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_EA_INDEX2_START, 28662306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_EA_MAM_D0MEM = 28762306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_EA_INDEX2_START, 28862306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_EA_MAM_D1MEM, 28962306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_EA_MAM_D2MEM, 29062306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_EA_MAM_D3MEM, 29162306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_EA_INDEX2_END = 29262306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_EA_MAM_D3MEM, 29362306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_EA_INDEX_END = 29462306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_EA_INDEX2_END, 29562306a36Sopenharmony_ci /* UTC VM L2 bank */ 29662306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__UTC_VML2_BANK_CACHE, 29762306a36Sopenharmony_ci /* UTC VM walker */ 29862306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__UTC_VML2_WALKER, 29962306a36Sopenharmony_ci /* UTC ATC L2 2MB cache */ 30062306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__UTC_ATCL2_CACHE_2M_BANK, 30162306a36Sopenharmony_ci /* UTC ATC L2 4KB cache */ 30262306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__UTC_ATCL2_CACHE_4K_BANK, 30362306a36Sopenharmony_ci AMDGPU_RAS_BLOCK__GFX_MAX 30462306a36Sopenharmony_ci}; 30562306a36Sopenharmony_ci 30662306a36Sopenharmony_cienum amdgpu_ras_error_type { 30762306a36Sopenharmony_ci AMDGPU_RAS_ERROR__NONE = 0, 30862306a36Sopenharmony_ci AMDGPU_RAS_ERROR__PARITY = 1, 30962306a36Sopenharmony_ci AMDGPU_RAS_ERROR__SINGLE_CORRECTABLE = 2, 31062306a36Sopenharmony_ci AMDGPU_RAS_ERROR__MULTI_UNCORRECTABLE = 4, 31162306a36Sopenharmony_ci AMDGPU_RAS_ERROR__POISON = 8, 31262306a36Sopenharmony_ci}; 31362306a36Sopenharmony_ci 31462306a36Sopenharmony_cienum amdgpu_ras_ret { 31562306a36Sopenharmony_ci AMDGPU_RAS_SUCCESS = 0, 31662306a36Sopenharmony_ci AMDGPU_RAS_FAIL, 31762306a36Sopenharmony_ci AMDGPU_RAS_UE, 31862306a36Sopenharmony_ci AMDGPU_RAS_CE, 31962306a36Sopenharmony_ci AMDGPU_RAS_PT, 32062306a36Sopenharmony_ci}; 32162306a36Sopenharmony_ci 32262306a36Sopenharmony_ci/* ras error status reisger fields */ 32362306a36Sopenharmony_ci#define ERR_STATUS_LO__ERR_STATUS_VALID_FLAG__SHIFT 0x0 32462306a36Sopenharmony_ci#define ERR_STATUS_LO__ERR_STATUS_VALID_FLAG_MASK 0x00000001L 32562306a36Sopenharmony_ci#define ERR_STATUS_LO__MEMORY_ID__SHIFT 0x18 32662306a36Sopenharmony_ci#define ERR_STATUS_LO__MEMORY_ID_MASK 0xFF000000L 32762306a36Sopenharmony_ci#define ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT 0x2 32862306a36Sopenharmony_ci#define ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK 0x00000004L 32962306a36Sopenharmony_ci#define ERR_STATUS__ERR_CNT__SHIFT 0x17 33062306a36Sopenharmony_ci#define ERR_STATUS__ERR_CNT_MASK 0x03800000L 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_ci#define AMDGPU_RAS_REG_ENTRY(ip, inst, reg_lo, reg_hi) \ 33362306a36Sopenharmony_ci ip##_HWIP, inst, reg_lo##_BASE_IDX, reg_lo, reg_hi##_BASE_IDX, reg_hi 33462306a36Sopenharmony_ci 33562306a36Sopenharmony_ci#define AMDGPU_RAS_REG_ENTRY_OFFSET(hwip, ip_inst, segment, reg) \ 33662306a36Sopenharmony_ci (adev->reg_offset[hwip][ip_inst][segment] + (reg)) 33762306a36Sopenharmony_ci 33862306a36Sopenharmony_ci#define AMDGPU_RAS_ERR_INFO_VALID (1 << 0) 33962306a36Sopenharmony_ci#define AMDGPU_RAS_ERR_STATUS_VALID (1 << 1) 34062306a36Sopenharmony_ci#define AMDGPU_RAS_ERR_ADDRESS_VALID (1 << 2) 34162306a36Sopenharmony_ci 34262306a36Sopenharmony_ci#define AMDGPU_RAS_GPU_RESET_MODE2_RESET (0x1 << 0) 34362306a36Sopenharmony_ci#define AMDGPU_RAS_GPU_RESET_MODE1_RESET (0x1 << 1) 34462306a36Sopenharmony_ci 34562306a36Sopenharmony_cistruct amdgpu_ras_err_status_reg_entry { 34662306a36Sopenharmony_ci uint32_t hwip; 34762306a36Sopenharmony_ci uint32_t ip_inst; 34862306a36Sopenharmony_ci uint32_t seg_lo; 34962306a36Sopenharmony_ci uint32_t reg_lo; 35062306a36Sopenharmony_ci uint32_t seg_hi; 35162306a36Sopenharmony_ci uint32_t reg_hi; 35262306a36Sopenharmony_ci uint32_t reg_inst; 35362306a36Sopenharmony_ci uint32_t flags; 35462306a36Sopenharmony_ci const char *block_name; 35562306a36Sopenharmony_ci}; 35662306a36Sopenharmony_ci 35762306a36Sopenharmony_cistruct amdgpu_ras_memory_id_entry { 35862306a36Sopenharmony_ci uint32_t memory_id; 35962306a36Sopenharmony_ci const char *name; 36062306a36Sopenharmony_ci}; 36162306a36Sopenharmony_ci 36262306a36Sopenharmony_cistruct ras_common_if { 36362306a36Sopenharmony_ci enum amdgpu_ras_block block; 36462306a36Sopenharmony_ci enum amdgpu_ras_error_type type; 36562306a36Sopenharmony_ci uint32_t sub_block_index; 36662306a36Sopenharmony_ci char name[32]; 36762306a36Sopenharmony_ci}; 36862306a36Sopenharmony_ci 36962306a36Sopenharmony_ci#define MAX_UMC_CHANNEL_NUM 32 37062306a36Sopenharmony_ci 37162306a36Sopenharmony_cistruct ecc_info_per_ch { 37262306a36Sopenharmony_ci uint16_t ce_count_lo_chip; 37362306a36Sopenharmony_ci uint16_t ce_count_hi_chip; 37462306a36Sopenharmony_ci uint64_t mca_umc_status; 37562306a36Sopenharmony_ci uint64_t mca_umc_addr; 37662306a36Sopenharmony_ci uint64_t mca_ceumc_addr; 37762306a36Sopenharmony_ci}; 37862306a36Sopenharmony_ci 37962306a36Sopenharmony_cistruct umc_ecc_info { 38062306a36Sopenharmony_ci struct ecc_info_per_ch ecc[MAX_UMC_CHANNEL_NUM]; 38162306a36Sopenharmony_ci 38262306a36Sopenharmony_ci /* Determine smu ecctable whether support 38362306a36Sopenharmony_ci * record correctable error address 38462306a36Sopenharmony_ci */ 38562306a36Sopenharmony_ci int record_ce_addr_supported; 38662306a36Sopenharmony_ci}; 38762306a36Sopenharmony_ci 38862306a36Sopenharmony_cistruct amdgpu_ras { 38962306a36Sopenharmony_ci /* ras infrastructure */ 39062306a36Sopenharmony_ci /* for ras itself. */ 39162306a36Sopenharmony_ci uint32_t features; 39262306a36Sopenharmony_ci struct list_head head; 39362306a36Sopenharmony_ci /* sysfs */ 39462306a36Sopenharmony_ci struct device_attribute features_attr; 39562306a36Sopenharmony_ci struct bin_attribute badpages_attr; 39662306a36Sopenharmony_ci struct dentry *de_ras_eeprom_table; 39762306a36Sopenharmony_ci /* block array */ 39862306a36Sopenharmony_ci struct ras_manager *objs; 39962306a36Sopenharmony_ci 40062306a36Sopenharmony_ci /* gpu recovery */ 40162306a36Sopenharmony_ci struct work_struct recovery_work; 40262306a36Sopenharmony_ci atomic_t in_recovery; 40362306a36Sopenharmony_ci struct amdgpu_device *adev; 40462306a36Sopenharmony_ci /* error handler data */ 40562306a36Sopenharmony_ci struct ras_err_handler_data *eh_data; 40662306a36Sopenharmony_ci struct mutex recovery_lock; 40762306a36Sopenharmony_ci 40862306a36Sopenharmony_ci uint32_t flags; 40962306a36Sopenharmony_ci bool reboot; 41062306a36Sopenharmony_ci struct amdgpu_ras_eeprom_control eeprom_control; 41162306a36Sopenharmony_ci 41262306a36Sopenharmony_ci bool error_query_ready; 41362306a36Sopenharmony_ci 41462306a36Sopenharmony_ci /* bad page count threshold */ 41562306a36Sopenharmony_ci uint32_t bad_page_cnt_threshold; 41662306a36Sopenharmony_ci 41762306a36Sopenharmony_ci /* disable ras error count harvest in recovery */ 41862306a36Sopenharmony_ci bool disable_ras_err_cnt_harvest; 41962306a36Sopenharmony_ci 42062306a36Sopenharmony_ci /* is poison mode supported */ 42162306a36Sopenharmony_ci bool poison_supported; 42262306a36Sopenharmony_ci 42362306a36Sopenharmony_ci /* RAS count errors delayed work */ 42462306a36Sopenharmony_ci struct delayed_work ras_counte_delay_work; 42562306a36Sopenharmony_ci atomic_t ras_ue_count; 42662306a36Sopenharmony_ci atomic_t ras_ce_count; 42762306a36Sopenharmony_ci 42862306a36Sopenharmony_ci /* record umc error info queried from smu */ 42962306a36Sopenharmony_ci struct umc_ecc_info umc_ecc; 43062306a36Sopenharmony_ci 43162306a36Sopenharmony_ci /* Indicates smu whether need update bad channel info */ 43262306a36Sopenharmony_ci bool update_channel_flag; 43362306a36Sopenharmony_ci 43462306a36Sopenharmony_ci /* Record special requirements of gpu reset caller */ 43562306a36Sopenharmony_ci uint32_t gpu_reset_flags; 43662306a36Sopenharmony_ci}; 43762306a36Sopenharmony_ci 43862306a36Sopenharmony_cistruct ras_fs_data { 43962306a36Sopenharmony_ci char sysfs_name[32]; 44062306a36Sopenharmony_ci char debugfs_name[32]; 44162306a36Sopenharmony_ci}; 44262306a36Sopenharmony_ci 44362306a36Sopenharmony_cistruct ras_err_data { 44462306a36Sopenharmony_ci unsigned long ue_count; 44562306a36Sopenharmony_ci unsigned long ce_count; 44662306a36Sopenharmony_ci unsigned long err_addr_cnt; 44762306a36Sopenharmony_ci struct eeprom_table_record *err_addr; 44862306a36Sopenharmony_ci}; 44962306a36Sopenharmony_ci 45062306a36Sopenharmony_cistruct ras_err_handler_data { 45162306a36Sopenharmony_ci /* point to bad page records array */ 45262306a36Sopenharmony_ci struct eeprom_table_record *bps; 45362306a36Sopenharmony_ci /* the count of entries */ 45462306a36Sopenharmony_ci int count; 45562306a36Sopenharmony_ci /* the space can place new entries */ 45662306a36Sopenharmony_ci int space_left; 45762306a36Sopenharmony_ci}; 45862306a36Sopenharmony_ci 45962306a36Sopenharmony_citypedef int (*ras_ih_cb)(struct amdgpu_device *adev, 46062306a36Sopenharmony_ci void *err_data, 46162306a36Sopenharmony_ci struct amdgpu_iv_entry *entry); 46262306a36Sopenharmony_ci 46362306a36Sopenharmony_cistruct ras_ih_data { 46462306a36Sopenharmony_ci /* interrupt bottom half */ 46562306a36Sopenharmony_ci struct work_struct ih_work; 46662306a36Sopenharmony_ci int inuse; 46762306a36Sopenharmony_ci /* IP callback */ 46862306a36Sopenharmony_ci ras_ih_cb cb; 46962306a36Sopenharmony_ci /* full of entries */ 47062306a36Sopenharmony_ci unsigned char *ring; 47162306a36Sopenharmony_ci unsigned int ring_size; 47262306a36Sopenharmony_ci unsigned int element_size; 47362306a36Sopenharmony_ci unsigned int aligned_element_size; 47462306a36Sopenharmony_ci unsigned int rptr; 47562306a36Sopenharmony_ci unsigned int wptr; 47662306a36Sopenharmony_ci}; 47762306a36Sopenharmony_ci 47862306a36Sopenharmony_cistruct ras_manager { 47962306a36Sopenharmony_ci struct ras_common_if head; 48062306a36Sopenharmony_ci /* reference count */ 48162306a36Sopenharmony_ci int use; 48262306a36Sopenharmony_ci /* ras block link */ 48362306a36Sopenharmony_ci struct list_head node; 48462306a36Sopenharmony_ci /* the device */ 48562306a36Sopenharmony_ci struct amdgpu_device *adev; 48662306a36Sopenharmony_ci /* sysfs */ 48762306a36Sopenharmony_ci struct device_attribute sysfs_attr; 48862306a36Sopenharmony_ci int attr_inuse; 48962306a36Sopenharmony_ci 49062306a36Sopenharmony_ci /* fs node name */ 49162306a36Sopenharmony_ci struct ras_fs_data fs_data; 49262306a36Sopenharmony_ci 49362306a36Sopenharmony_ci /* IH data */ 49462306a36Sopenharmony_ci struct ras_ih_data ih_data; 49562306a36Sopenharmony_ci 49662306a36Sopenharmony_ci struct ras_err_data err_data; 49762306a36Sopenharmony_ci}; 49862306a36Sopenharmony_ci 49962306a36Sopenharmony_cistruct ras_badpage { 50062306a36Sopenharmony_ci unsigned int bp; 50162306a36Sopenharmony_ci unsigned int size; 50262306a36Sopenharmony_ci unsigned int flags; 50362306a36Sopenharmony_ci}; 50462306a36Sopenharmony_ci 50562306a36Sopenharmony_ci/* interfaces for IP */ 50662306a36Sopenharmony_cistruct ras_fs_if { 50762306a36Sopenharmony_ci struct ras_common_if head; 50862306a36Sopenharmony_ci const char* sysfs_name; 50962306a36Sopenharmony_ci char debugfs_name[32]; 51062306a36Sopenharmony_ci}; 51162306a36Sopenharmony_ci 51262306a36Sopenharmony_cistruct ras_query_if { 51362306a36Sopenharmony_ci struct ras_common_if head; 51462306a36Sopenharmony_ci unsigned long ue_count; 51562306a36Sopenharmony_ci unsigned long ce_count; 51662306a36Sopenharmony_ci}; 51762306a36Sopenharmony_ci 51862306a36Sopenharmony_cistruct ras_inject_if { 51962306a36Sopenharmony_ci struct ras_common_if head; 52062306a36Sopenharmony_ci uint64_t address; 52162306a36Sopenharmony_ci uint64_t value; 52262306a36Sopenharmony_ci uint32_t instance_mask; 52362306a36Sopenharmony_ci}; 52462306a36Sopenharmony_ci 52562306a36Sopenharmony_cistruct ras_cure_if { 52662306a36Sopenharmony_ci struct ras_common_if head; 52762306a36Sopenharmony_ci uint64_t address; 52862306a36Sopenharmony_ci}; 52962306a36Sopenharmony_ci 53062306a36Sopenharmony_cistruct ras_ih_if { 53162306a36Sopenharmony_ci struct ras_common_if head; 53262306a36Sopenharmony_ci ras_ih_cb cb; 53362306a36Sopenharmony_ci}; 53462306a36Sopenharmony_ci 53562306a36Sopenharmony_cistruct ras_dispatch_if { 53662306a36Sopenharmony_ci struct ras_common_if head; 53762306a36Sopenharmony_ci struct amdgpu_iv_entry *entry; 53862306a36Sopenharmony_ci}; 53962306a36Sopenharmony_ci 54062306a36Sopenharmony_cistruct ras_debug_if { 54162306a36Sopenharmony_ci union { 54262306a36Sopenharmony_ci struct ras_common_if head; 54362306a36Sopenharmony_ci struct ras_inject_if inject; 54462306a36Sopenharmony_ci }; 54562306a36Sopenharmony_ci int op; 54662306a36Sopenharmony_ci}; 54762306a36Sopenharmony_ci 54862306a36Sopenharmony_cistruct amdgpu_ras_block_object { 54962306a36Sopenharmony_ci struct ras_common_if ras_comm; 55062306a36Sopenharmony_ci 55162306a36Sopenharmony_ci int (*ras_block_match)(struct amdgpu_ras_block_object *block_obj, 55262306a36Sopenharmony_ci enum amdgpu_ras_block block, uint32_t sub_block_index); 55362306a36Sopenharmony_ci int (*ras_late_init)(struct amdgpu_device *adev, struct ras_common_if *ras_block); 55462306a36Sopenharmony_ci void (*ras_fini)(struct amdgpu_device *adev, struct ras_common_if *ras_block); 55562306a36Sopenharmony_ci ras_ih_cb ras_cb; 55662306a36Sopenharmony_ci const struct amdgpu_ras_block_hw_ops *hw_ops; 55762306a36Sopenharmony_ci}; 55862306a36Sopenharmony_ci 55962306a36Sopenharmony_cistruct amdgpu_ras_block_hw_ops { 56062306a36Sopenharmony_ci int (*ras_error_inject)(struct amdgpu_device *adev, 56162306a36Sopenharmony_ci void *inject_if, uint32_t instance_mask); 56262306a36Sopenharmony_ci void (*query_ras_error_count)(struct amdgpu_device *adev, void *ras_error_status); 56362306a36Sopenharmony_ci void (*query_ras_error_status)(struct amdgpu_device *adev); 56462306a36Sopenharmony_ci void (*query_ras_error_address)(struct amdgpu_device *adev, void *ras_error_status); 56562306a36Sopenharmony_ci void (*reset_ras_error_count)(struct amdgpu_device *adev); 56662306a36Sopenharmony_ci void (*reset_ras_error_status)(struct amdgpu_device *adev); 56762306a36Sopenharmony_ci bool (*query_poison_status)(struct amdgpu_device *adev); 56862306a36Sopenharmony_ci bool (*handle_poison_consumption)(struct amdgpu_device *adev); 56962306a36Sopenharmony_ci}; 57062306a36Sopenharmony_ci 57162306a36Sopenharmony_ci/* work flow 57262306a36Sopenharmony_ci * vbios 57362306a36Sopenharmony_ci * 1: ras feature enable (enabled by default) 57462306a36Sopenharmony_ci * psp 57562306a36Sopenharmony_ci * 2: ras framework init (in ip_init) 57662306a36Sopenharmony_ci * IP 57762306a36Sopenharmony_ci * 3: IH add 57862306a36Sopenharmony_ci * 4: debugfs/sysfs create 57962306a36Sopenharmony_ci * 5: query/inject 58062306a36Sopenharmony_ci * 6: debugfs/sysfs remove 58162306a36Sopenharmony_ci * 7: IH remove 58262306a36Sopenharmony_ci * 8: feature disable 58362306a36Sopenharmony_ci */ 58462306a36Sopenharmony_ci 58562306a36Sopenharmony_ci 58662306a36Sopenharmony_ciint amdgpu_ras_recovery_init(struct amdgpu_device *adev); 58762306a36Sopenharmony_ci 58862306a36Sopenharmony_civoid amdgpu_ras_resume(struct amdgpu_device *adev); 58962306a36Sopenharmony_civoid amdgpu_ras_suspend(struct amdgpu_device *adev); 59062306a36Sopenharmony_ci 59162306a36Sopenharmony_ciint amdgpu_ras_query_error_count(struct amdgpu_device *adev, 59262306a36Sopenharmony_ci unsigned long *ce_count, 59362306a36Sopenharmony_ci unsigned long *ue_count, 59462306a36Sopenharmony_ci struct ras_query_if *query_info); 59562306a36Sopenharmony_ci 59662306a36Sopenharmony_ci/* error handling functions */ 59762306a36Sopenharmony_ciint amdgpu_ras_add_bad_pages(struct amdgpu_device *adev, 59862306a36Sopenharmony_ci struct eeprom_table_record *bps, int pages); 59962306a36Sopenharmony_ci 60062306a36Sopenharmony_ciint amdgpu_ras_save_bad_pages(struct amdgpu_device *adev, 60162306a36Sopenharmony_ci unsigned long *new_cnt); 60262306a36Sopenharmony_ci 60362306a36Sopenharmony_cistatic inline enum ta_ras_block 60462306a36Sopenharmony_ciamdgpu_ras_block_to_ta(enum amdgpu_ras_block block) { 60562306a36Sopenharmony_ci switch (block) { 60662306a36Sopenharmony_ci case AMDGPU_RAS_BLOCK__UMC: 60762306a36Sopenharmony_ci return TA_RAS_BLOCK__UMC; 60862306a36Sopenharmony_ci case AMDGPU_RAS_BLOCK__SDMA: 60962306a36Sopenharmony_ci return TA_RAS_BLOCK__SDMA; 61062306a36Sopenharmony_ci case AMDGPU_RAS_BLOCK__GFX: 61162306a36Sopenharmony_ci return TA_RAS_BLOCK__GFX; 61262306a36Sopenharmony_ci case AMDGPU_RAS_BLOCK__MMHUB: 61362306a36Sopenharmony_ci return TA_RAS_BLOCK__MMHUB; 61462306a36Sopenharmony_ci case AMDGPU_RAS_BLOCK__ATHUB: 61562306a36Sopenharmony_ci return TA_RAS_BLOCK__ATHUB; 61662306a36Sopenharmony_ci case AMDGPU_RAS_BLOCK__PCIE_BIF: 61762306a36Sopenharmony_ci return TA_RAS_BLOCK__PCIE_BIF; 61862306a36Sopenharmony_ci case AMDGPU_RAS_BLOCK__HDP: 61962306a36Sopenharmony_ci return TA_RAS_BLOCK__HDP; 62062306a36Sopenharmony_ci case AMDGPU_RAS_BLOCK__XGMI_WAFL: 62162306a36Sopenharmony_ci return TA_RAS_BLOCK__XGMI_WAFL; 62262306a36Sopenharmony_ci case AMDGPU_RAS_BLOCK__DF: 62362306a36Sopenharmony_ci return TA_RAS_BLOCK__DF; 62462306a36Sopenharmony_ci case AMDGPU_RAS_BLOCK__SMN: 62562306a36Sopenharmony_ci return TA_RAS_BLOCK__SMN; 62662306a36Sopenharmony_ci case AMDGPU_RAS_BLOCK__SEM: 62762306a36Sopenharmony_ci return TA_RAS_BLOCK__SEM; 62862306a36Sopenharmony_ci case AMDGPU_RAS_BLOCK__MP0: 62962306a36Sopenharmony_ci return TA_RAS_BLOCK__MP0; 63062306a36Sopenharmony_ci case AMDGPU_RAS_BLOCK__MP1: 63162306a36Sopenharmony_ci return TA_RAS_BLOCK__MP1; 63262306a36Sopenharmony_ci case AMDGPU_RAS_BLOCK__FUSE: 63362306a36Sopenharmony_ci return TA_RAS_BLOCK__FUSE; 63462306a36Sopenharmony_ci case AMDGPU_RAS_BLOCK__MCA: 63562306a36Sopenharmony_ci return TA_RAS_BLOCK__MCA; 63662306a36Sopenharmony_ci case AMDGPU_RAS_BLOCK__VCN: 63762306a36Sopenharmony_ci return TA_RAS_BLOCK__VCN; 63862306a36Sopenharmony_ci case AMDGPU_RAS_BLOCK__JPEG: 63962306a36Sopenharmony_ci return TA_RAS_BLOCK__JPEG; 64062306a36Sopenharmony_ci default: 64162306a36Sopenharmony_ci WARN_ONCE(1, "RAS ERROR: unexpected block id %d\n", block); 64262306a36Sopenharmony_ci return TA_RAS_BLOCK__UMC; 64362306a36Sopenharmony_ci } 64462306a36Sopenharmony_ci} 64562306a36Sopenharmony_ci 64662306a36Sopenharmony_cistatic inline enum ta_ras_error_type 64762306a36Sopenharmony_ciamdgpu_ras_error_to_ta(enum amdgpu_ras_error_type error) { 64862306a36Sopenharmony_ci switch (error) { 64962306a36Sopenharmony_ci case AMDGPU_RAS_ERROR__NONE: 65062306a36Sopenharmony_ci return TA_RAS_ERROR__NONE; 65162306a36Sopenharmony_ci case AMDGPU_RAS_ERROR__PARITY: 65262306a36Sopenharmony_ci return TA_RAS_ERROR__PARITY; 65362306a36Sopenharmony_ci case AMDGPU_RAS_ERROR__SINGLE_CORRECTABLE: 65462306a36Sopenharmony_ci return TA_RAS_ERROR__SINGLE_CORRECTABLE; 65562306a36Sopenharmony_ci case AMDGPU_RAS_ERROR__MULTI_UNCORRECTABLE: 65662306a36Sopenharmony_ci return TA_RAS_ERROR__MULTI_UNCORRECTABLE; 65762306a36Sopenharmony_ci case AMDGPU_RAS_ERROR__POISON: 65862306a36Sopenharmony_ci return TA_RAS_ERROR__POISON; 65962306a36Sopenharmony_ci default: 66062306a36Sopenharmony_ci WARN_ONCE(1, "RAS ERROR: unexpected error type %d\n", error); 66162306a36Sopenharmony_ci return TA_RAS_ERROR__NONE; 66262306a36Sopenharmony_ci } 66362306a36Sopenharmony_ci} 66462306a36Sopenharmony_ci 66562306a36Sopenharmony_ci/* called in ip_init and ip_fini */ 66662306a36Sopenharmony_ciint amdgpu_ras_init(struct amdgpu_device *adev); 66762306a36Sopenharmony_ciint amdgpu_ras_late_init(struct amdgpu_device *adev); 66862306a36Sopenharmony_ciint amdgpu_ras_fini(struct amdgpu_device *adev); 66962306a36Sopenharmony_ciint amdgpu_ras_pre_fini(struct amdgpu_device *adev); 67062306a36Sopenharmony_ci 67162306a36Sopenharmony_ciint amdgpu_ras_block_late_init(struct amdgpu_device *adev, 67262306a36Sopenharmony_ci struct ras_common_if *ras_block); 67362306a36Sopenharmony_ci 67462306a36Sopenharmony_civoid amdgpu_ras_block_late_fini(struct amdgpu_device *adev, 67562306a36Sopenharmony_ci struct ras_common_if *ras_block); 67662306a36Sopenharmony_ci 67762306a36Sopenharmony_ciint amdgpu_ras_feature_enable(struct amdgpu_device *adev, 67862306a36Sopenharmony_ci struct ras_common_if *head, bool enable); 67962306a36Sopenharmony_ci 68062306a36Sopenharmony_ciint amdgpu_ras_feature_enable_on_boot(struct amdgpu_device *adev, 68162306a36Sopenharmony_ci struct ras_common_if *head, bool enable); 68262306a36Sopenharmony_ci 68362306a36Sopenharmony_ciint amdgpu_ras_sysfs_create(struct amdgpu_device *adev, 68462306a36Sopenharmony_ci struct ras_common_if *head); 68562306a36Sopenharmony_ci 68662306a36Sopenharmony_ciint amdgpu_ras_sysfs_remove(struct amdgpu_device *adev, 68762306a36Sopenharmony_ci struct ras_common_if *head); 68862306a36Sopenharmony_ci 68962306a36Sopenharmony_civoid amdgpu_ras_debugfs_create_all(struct amdgpu_device *adev); 69062306a36Sopenharmony_ci 69162306a36Sopenharmony_ciint amdgpu_ras_query_error_status(struct amdgpu_device *adev, 69262306a36Sopenharmony_ci struct ras_query_if *info); 69362306a36Sopenharmony_ci 69462306a36Sopenharmony_ciint amdgpu_ras_reset_error_status(struct amdgpu_device *adev, 69562306a36Sopenharmony_ci enum amdgpu_ras_block block); 69662306a36Sopenharmony_ci 69762306a36Sopenharmony_ciint amdgpu_ras_error_inject(struct amdgpu_device *adev, 69862306a36Sopenharmony_ci struct ras_inject_if *info); 69962306a36Sopenharmony_ci 70062306a36Sopenharmony_ciint amdgpu_ras_interrupt_add_handler(struct amdgpu_device *adev, 70162306a36Sopenharmony_ci struct ras_common_if *head); 70262306a36Sopenharmony_ci 70362306a36Sopenharmony_ciint amdgpu_ras_interrupt_remove_handler(struct amdgpu_device *adev, 70462306a36Sopenharmony_ci struct ras_common_if *head); 70562306a36Sopenharmony_ci 70662306a36Sopenharmony_ciint amdgpu_ras_interrupt_dispatch(struct amdgpu_device *adev, 70762306a36Sopenharmony_ci struct ras_dispatch_if *info); 70862306a36Sopenharmony_ci 70962306a36Sopenharmony_cistruct ras_manager *amdgpu_ras_find_obj(struct amdgpu_device *adev, 71062306a36Sopenharmony_ci struct ras_common_if *head); 71162306a36Sopenharmony_ci 71262306a36Sopenharmony_ciextern atomic_t amdgpu_ras_in_intr; 71362306a36Sopenharmony_ci 71462306a36Sopenharmony_cistatic inline bool amdgpu_ras_intr_triggered(void) 71562306a36Sopenharmony_ci{ 71662306a36Sopenharmony_ci return !!atomic_read(&amdgpu_ras_in_intr); 71762306a36Sopenharmony_ci} 71862306a36Sopenharmony_ci 71962306a36Sopenharmony_cistatic inline void amdgpu_ras_intr_cleared(void) 72062306a36Sopenharmony_ci{ 72162306a36Sopenharmony_ci atomic_set(&amdgpu_ras_in_intr, 0); 72262306a36Sopenharmony_ci} 72362306a36Sopenharmony_ci 72462306a36Sopenharmony_civoid amdgpu_ras_global_ras_isr(struct amdgpu_device *adev); 72562306a36Sopenharmony_ci 72662306a36Sopenharmony_civoid amdgpu_ras_set_error_query_ready(struct amdgpu_device *adev, bool ready); 72762306a36Sopenharmony_ci 72862306a36Sopenharmony_cibool amdgpu_ras_need_emergency_restart(struct amdgpu_device *adev); 72962306a36Sopenharmony_ci 73062306a36Sopenharmony_civoid amdgpu_release_ras_context(struct amdgpu_device *adev); 73162306a36Sopenharmony_ci 73262306a36Sopenharmony_ciint amdgpu_persistent_edc_harvesting_supported(struct amdgpu_device *adev); 73362306a36Sopenharmony_ci 73462306a36Sopenharmony_ciconst char *get_ras_block_str(struct ras_common_if *ras_block); 73562306a36Sopenharmony_ci 73662306a36Sopenharmony_cibool amdgpu_ras_is_poison_mode_supported(struct amdgpu_device *adev); 73762306a36Sopenharmony_ci 73862306a36Sopenharmony_ciint amdgpu_ras_is_supported(struct amdgpu_device *adev, unsigned int block); 73962306a36Sopenharmony_ci 74062306a36Sopenharmony_ciint amdgpu_ras_reset_gpu(struct amdgpu_device *adev); 74162306a36Sopenharmony_ci 74262306a36Sopenharmony_cistruct amdgpu_ras* amdgpu_ras_get_context(struct amdgpu_device *adev); 74362306a36Sopenharmony_ci 74462306a36Sopenharmony_ciint amdgpu_ras_set_context(struct amdgpu_device *adev, struct amdgpu_ras *ras_con); 74562306a36Sopenharmony_ci 74662306a36Sopenharmony_ciint amdgpu_ras_register_ras_block(struct amdgpu_device *adev, 74762306a36Sopenharmony_ci struct amdgpu_ras_block_object *ras_block_obj); 74862306a36Sopenharmony_civoid amdgpu_ras_interrupt_fatal_error_handler(struct amdgpu_device *adev); 74962306a36Sopenharmony_civoid amdgpu_ras_get_error_type_name(uint32_t err_type, char *err_type_name); 75062306a36Sopenharmony_cibool amdgpu_ras_inst_get_memory_id_field(struct amdgpu_device *adev, 75162306a36Sopenharmony_ci const struct amdgpu_ras_err_status_reg_entry *reg_entry, 75262306a36Sopenharmony_ci uint32_t instance, 75362306a36Sopenharmony_ci uint32_t *memory_id); 75462306a36Sopenharmony_cibool amdgpu_ras_inst_get_err_cnt_field(struct amdgpu_device *adev, 75562306a36Sopenharmony_ci const struct amdgpu_ras_err_status_reg_entry *reg_entry, 75662306a36Sopenharmony_ci uint32_t instance, 75762306a36Sopenharmony_ci unsigned long *err_cnt); 75862306a36Sopenharmony_civoid amdgpu_ras_inst_query_ras_error_count(struct amdgpu_device *adev, 75962306a36Sopenharmony_ci const struct amdgpu_ras_err_status_reg_entry *reg_list, 76062306a36Sopenharmony_ci uint32_t reg_list_size, 76162306a36Sopenharmony_ci const struct amdgpu_ras_memory_id_entry *mem_list, 76262306a36Sopenharmony_ci uint32_t mem_list_size, 76362306a36Sopenharmony_ci uint32_t instance, 76462306a36Sopenharmony_ci uint32_t err_type, 76562306a36Sopenharmony_ci unsigned long *err_count); 76662306a36Sopenharmony_civoid amdgpu_ras_inst_reset_ras_error_count(struct amdgpu_device *adev, 76762306a36Sopenharmony_ci const struct amdgpu_ras_err_status_reg_entry *reg_list, 76862306a36Sopenharmony_ci uint32_t reg_list_size, 76962306a36Sopenharmony_ci uint32_t instance); 77062306a36Sopenharmony_ci#endif 771