Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Linux/drivers/gpu/drm/amd/amdgpu/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 262 kB image not shown  

Quelle  gfx_v9_0.c   Sprache: C

 
/*
 * Copyright 2016 Advanced Micro Devices, Inc.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 * OTHER DEALINGS IN THE SOFTWARE.
 *
 */


#include <linux/delay.h>
#include <linux/kernel.h>
#include <linux/firmware.h>
#include <linux/module.h>
#include <linux/pci.h>

#include "amdgpu.h"
#include "amdgpu_gfx.h"
#include "soc15.h"
#include "soc15d.h"
#include "amdgpu_atomfirmware.h"
#include "amdgpu_pm.h"

#include "gc/gc_9_0_offset.h"
#include "gc/gc_9_0_sh_mask.h"

#include "vega10_enum.h"

#include "soc15_common.h"
#include "clearstate_gfx9.h"
#include "v9_structs.h"

#include "ivsrcid/gfx/irqsrcs_gfx_9_0.h"

#include "amdgpu_ras.h"

#include "amdgpu_ring_mux.h"
#include "gfx_v9_4.h"
#include "gfx_v9_0.h"
#include "gfx_v9_0_cleaner_shader.h"
#include "gfx_v9_4_2.h"

#include "asic_reg/pwr/pwr_10_0_offset.h"
#include "asic_reg/pwr/pwr_10_0_sh_mask.h"
#include "asic_reg/gc/gc_9_0_default.h"

#define GFX9_NUM_GFX_RINGS     1
#define GFX9_NUM_SW_GFX_RINGS  2
#define GFX9_MEC_HPD_SIZE 4096
#define RLCG_UCODE_LOADING_START_ADDRESS 0x00002000L
#define RLC_SAVE_RESTORE_ADDR_STARTING_OFFSET 0x00000000L

#define mmGCEA_PROBE_MAP                        0x070c
#define mmGCEA_PROBE_MAP_BASE_IDX               0

MODULE_FIRMWARE("amdgpu/vega10_ce.bin");
MODULE_FIRMWARE("amdgpu/vega10_pfp.bin");
MODULE_FIRMWARE("amdgpu/vega10_me.bin");
MODULE_FIRMWARE("amdgpu/vega10_mec.bin");
MODULE_FIRMWARE("amdgpu/vega10_mec2.bin");
MODULE_FIRMWARE("amdgpu/vega10_rlc.bin");

MODULE_FIRMWARE("amdgpu/vega12_ce.bin");
MODULE_FIRMWARE("amdgpu/vega12_pfp.bin");
MODULE_FIRMWARE("amdgpu/vega12_me.bin");
MODULE_FIRMWARE("amdgpu/vega12_mec.bin");
MODULE_FIRMWARE("amdgpu/vega12_mec2.bin");
MODULE_FIRMWARE("amdgpu/vega12_rlc.bin");

MODULE_FIRMWARE("amdgpu/vega20_ce.bin");
MODULE_FIRMWARE("amdgpu/vega20_pfp.bin");
MODULE_FIRMWARE("amdgpu/vega20_me.bin");
MODULE_FIRMWARE("amdgpu/vega20_mec.bin");
MODULE_FIRMWARE("amdgpu/vega20_mec2.bin");
MODULE_FIRMWARE("amdgpu/vega20_rlc.bin");

MODULE_FIRMWARE("amdgpu/raven_ce.bin");
MODULE_FIRMWARE("amdgpu/raven_pfp.bin");
MODULE_FIRMWARE("amdgpu/raven_me.bin");
MODULE_FIRMWARE("amdgpu/raven_mec.bin");
MODULE_FIRMWARE("amdgpu/raven_mec2.bin");
MODULE_FIRMWARE("amdgpu/raven_rlc.bin");

MODULE_FIRMWARE("amdgpu/picasso_ce.bin");
MODULE_FIRMWARE("amdgpu/picasso_pfp.bin");
MODULE_FIRMWARE("amdgpu/picasso_me.bin");
MODULE_FIRMWARE("amdgpu/picasso_mec.bin");
MODULE_FIRMWARE("amdgpu/picasso_mec2.bin");
MODULE_FIRMWARE("amdgpu/picasso_rlc.bin");
MODULE_FIRMWARE("amdgpu/picasso_rlc_am4.bin");

MODULE_FIRMWARE("amdgpu/raven2_ce.bin");
MODULE_FIRMWARE("amdgpu/raven2_pfp.bin");
MODULE_FIRMWARE("amdgpu/raven2_me.bin");
MODULE_FIRMWARE("amdgpu/raven2_mec.bin");
MODULE_FIRMWARE("amdgpu/raven2_mec2.bin");
MODULE_FIRMWARE("amdgpu/raven2_rlc.bin");
MODULE_FIRMWARE("amdgpu/raven_kicker_rlc.bin");

MODULE_FIRMWARE("amdgpu/arcturus_mec.bin");
MODULE_FIRMWARE("amdgpu/arcturus_rlc.bin");

MODULE_FIRMWARE("amdgpu/renoir_ce.bin");
MODULE_FIRMWARE("amdgpu/renoir_pfp.bin");
MODULE_FIRMWARE("amdgpu/renoir_me.bin");
MODULE_FIRMWARE("amdgpu/renoir_mec.bin");
MODULE_FIRMWARE("amdgpu/renoir_rlc.bin");

MODULE_FIRMWARE("amdgpu/green_sardine_ce.bin");
MODULE_FIRMWARE("amdgpu/green_sardine_pfp.bin");
MODULE_FIRMWARE("amdgpu/green_sardine_me.bin");
MODULE_FIRMWARE("amdgpu/green_sardine_mec.bin");
MODULE_FIRMWARE("amdgpu/green_sardine_mec2.bin");
MODULE_FIRMWARE("amdgpu/green_sardine_rlc.bin");

MODULE_FIRMWARE("amdgpu/aldebaran_mec.bin");
MODULE_FIRMWARE("amdgpu/aldebaran_mec2.bin");
MODULE_FIRMWARE("amdgpu/aldebaran_rlc.bin");
MODULE_FIRMWARE("amdgpu/aldebaran_sjt_mec.bin");
MODULE_FIRMWARE("amdgpu/aldebaran_sjt_mec2.bin");

#define mmTCP_CHAN_STEER_0_ARCT        0x0b03
#define mmTCP_CHAN_STEER_0_ARCT_BASE_IDX       0
#define mmTCP_CHAN_STEER_1_ARCT        0x0b04
#define mmTCP_CHAN_STEER_1_ARCT_BASE_IDX       0
#define mmTCP_CHAN_STEER_2_ARCT        0x0b09
#define mmTCP_CHAN_STEER_2_ARCT_BASE_IDX       0
#define mmTCP_CHAN_STEER_3_ARCT        0x0b0a
#define mmTCP_CHAN_STEER_3_ARCT_BASE_IDX       0
#define mmTCP_CHAN_STEER_4_ARCT        0x0b0b
#define mmTCP_CHAN_STEER_4_ARCT_BASE_IDX       0
#define mmTCP_CHAN_STEER_5_ARCT        0x0b0c
#define mmTCP_CHAN_STEER_5_ARCT_BASE_IDX       0

#define mmGOLDEN_TSC_COUNT_UPPER_Renoir                0x0025
#define mmGOLDEN_TSC_COUNT_UPPER_Renoir_BASE_IDX       1
#define mmGOLDEN_TSC_COUNT_LOWER_Renoir                0x0026
#define mmGOLDEN_TSC_COUNT_LOWER_Renoir_BASE_IDX       1

static const struct amdgpu_hwip_reg_entry gc_reg_list_9[] = {
 SOC15_REG_ENTRY_STR(GC, 0, mmGRBM_STATUS),
 SOC15_REG_ENTRY_STR(GC, 0, mmGRBM_STATUS2),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_STALLED_STAT1),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_STALLED_STAT2),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_CPC_STALLED_STAT1),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_CPF_STALLED_STAT1),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_BUSY_STAT),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_CPC_BUSY_STAT),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_CPF_BUSY_STAT),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_CPF_STATUS),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_GFX_ERROR),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_RB_BASE),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_RB_RPTR),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_RB_WPTR),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_RB0_BASE),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_RB0_RPTR),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_RB0_WPTR),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_RB1_BASE),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_RB1_RPTR),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_RB1_WPTR),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_RB2_BASE),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_RB2_WPTR),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_RB2_WPTR),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_CE_IB1_CMD_BUFSZ),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_CE_IB2_CMD_BUFSZ),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_IB1_CMD_BUFSZ),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_IB2_CMD_BUFSZ),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_CE_IB1_BASE_LO),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_CE_IB1_BASE_HI),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_CE_IB1_BUFSZ),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_CE_IB2_BASE_LO),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_CE_IB2_BASE_HI),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_CE_IB2_BUFSZ),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_IB1_BASE_LO),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_IB1_BASE_HI),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_IB1_BUFSZ),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_IB2_BASE_LO),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_IB2_BASE_HI),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_IB2_BUFSZ),
 SOC15_REG_ENTRY_STR(GC, 0, mmCPF_UTCL1_STATUS),
 SOC15_REG_ENTRY_STR(GC, 0, mmCPC_UTCL1_STATUS),
 SOC15_REG_ENTRY_STR(GC, 0, mmCPG_UTCL1_STATUS),
 SOC15_REG_ENTRY_STR(GC, 0, mmGDS_PROTECTION_FAULT),
 SOC15_REG_ENTRY_STR(GC, 0, mmGDS_VM_PROTECTION_FAULT),
 SOC15_REG_ENTRY_STR(GC, 0, mmIA_UTCL1_STATUS),
 SOC15_REG_ENTRY_STR(GC, 0, mmIA_UTCL1_CNTL),
 SOC15_REG_ENTRY_STR(GC, 0, mmPA_CL_CNTL_STATUS),
 SOC15_REG_ENTRY_STR(GC, 0, mmRLC_UTCL1_STATUS),
 SOC15_REG_ENTRY_STR(GC, 0, mmRMI_UTCL1_STATUS),
 SOC15_REG_ENTRY_STR(GC, 0, mmSQC_DCACHE_UTCL1_STATUS),
 SOC15_REG_ENTRY_STR(GC, 0, mmSQC_ICACHE_UTCL1_STATUS),
 SOC15_REG_ENTRY_STR(GC, 0, mmSQ_UTCL1_STATUS),
 SOC15_REG_ENTRY_STR(GC, 0, mmTCP_UTCL1_STATUS),
 SOC15_REG_ENTRY_STR(GC, 0, mmWD_UTCL1_STATUS),
 SOC15_REG_ENTRY_STR(GC, 0, mmVM_L2_PROTECTION_FAULT_CNTL),
 SOC15_REG_ENTRY_STR(GC, 0, mmVM_L2_PROTECTION_FAULT_STATUS),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_DEBUG),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_MEC_CNTL),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_CE_INSTR_PNTR),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_MEC1_INSTR_PNTR),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_MEC2_INSTR_PNTR),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_ME_INSTR_PNTR),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_PFP_INSTR_PNTR),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_CPC_STATUS),
 SOC15_REG_ENTRY_STR(GC, 0, mmRLC_STAT),
 SOC15_REG_ENTRY_STR(GC, 0, mmRLC_SMU_COMMAND),
 SOC15_REG_ENTRY_STR(GC, 0, mmRLC_SMU_MESSAGE),
 SOC15_REG_ENTRY_STR(GC, 0, mmRLC_SMU_ARGUMENT_1),
 SOC15_REG_ENTRY_STR(GC, 0, mmRLC_SMU_ARGUMENT_2),
 SOC15_REG_ENTRY_STR(GC, 0, mmSMU_RLC_RESPONSE),
 SOC15_REG_ENTRY_STR(GC, 0, mmRLC_SAFE_MODE),
 SOC15_REG_ENTRY_STR(GC, 0, mmRLC_SMU_SAFE_MODE),
 SOC15_REG_ENTRY_STR(GC, 0, mmRLC_INT_STAT),
 SOC15_REG_ENTRY_STR(GC, 0, mmRLC_GPM_GENERAL_6),
 /* SE status registers */
 SOC15_REG_ENTRY_STR(GC, 0, mmGRBM_STATUS_SE0),
 SOC15_REG_ENTRY_STR(GC, 0, mmGRBM_STATUS_SE1),
 SOC15_REG_ENTRY_STR(GC, 0, mmGRBM_STATUS_SE2),
 SOC15_REG_ENTRY_STR(GC, 0, mmGRBM_STATUS_SE3),
 /* packet headers */
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_CE_HEADER_DUMP),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_CE_HEADER_DUMP),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_CE_HEADER_DUMP),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_CE_HEADER_DUMP),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_CE_HEADER_DUMP),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_CE_HEADER_DUMP),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_CE_HEADER_DUMP),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_CE_HEADER_DUMP),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_PFP_HEADER_DUMP),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_PFP_HEADER_DUMP),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_PFP_HEADER_DUMP),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_PFP_HEADER_DUMP),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_PFP_HEADER_DUMP),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_PFP_HEADER_DUMP),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_PFP_HEADER_DUMP),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_PFP_HEADER_DUMP),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_ME_HEADER_DUMP),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_ME_HEADER_DUMP),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_ME_HEADER_DUMP),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_ME_HEADER_DUMP),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_ME_HEADER_DUMP),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_ME_HEADER_DUMP),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_ME_HEADER_DUMP),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_ME_HEADER_DUMP)
};

static const struct amdgpu_hwip_reg_entry gc_cp_reg_list_9[] = {
 /* compute queue registers */
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_HQD_VMID),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_HQD_ACTIVE),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_HQD_PERSISTENT_STATE),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_HQD_PIPE_PRIORITY),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_HQD_QUEUE_PRIORITY),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_HQD_QUANTUM),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_HQD_PQ_BASE),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_HQD_PQ_BASE_HI),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_HQD_PQ_RPTR),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_HQD_PQ_WPTR_POLL_ADDR),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_HQD_PQ_WPTR_POLL_ADDR_HI),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_HQD_PQ_DOORBELL_CONTROL),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_HQD_PQ_CONTROL),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_HQD_IB_BASE_ADDR),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_HQD_IB_BASE_ADDR_HI),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_HQD_IB_RPTR),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_HQD_IB_CONTROL),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_HQD_DEQUEUE_REQUEST),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_HQD_EOP_BASE_ADDR),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_HQD_EOP_BASE_ADDR_HI),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_HQD_EOP_CONTROL),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_HQD_EOP_RPTR),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_HQD_EOP_WPTR),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_HQD_EOP_EVENTS),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_HQD_CTX_SAVE_BASE_ADDR_LO),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_HQD_CTX_SAVE_BASE_ADDR_HI),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_HQD_CTX_SAVE_CONTROL),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_HQD_CNTL_STACK_OFFSET),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_HQD_CNTL_STACK_SIZE),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_HQD_WG_STATE_OFFSET),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_HQD_CTX_SAVE_SIZE),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_HQD_GDS_RESOURCE_STATE),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_HQD_ERROR),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_HQD_EOP_WPTR_MEM),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_HQD_PQ_WPTR_LO),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_HQD_PQ_WPTR_HI),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_HQD_GFX_STATUS),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_MEC_ME1_HEADER_DUMP),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_MEC_ME1_HEADER_DUMP),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_MEC_ME1_HEADER_DUMP),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_MEC_ME1_HEADER_DUMP),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_MEC_ME1_HEADER_DUMP),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_MEC_ME1_HEADER_DUMP),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_MEC_ME1_HEADER_DUMP),
 SOC15_REG_ENTRY_STR(GC, 0, mmCP_MEC_ME1_HEADER_DUMP)
};

enum ta_ras_gfx_subblock {
 /*CPC*/
 TA_RAS_BLOCK__GFX_CPC_INDEX_START = 0,
 TA_RAS_BLOCK__GFX_CPC_SCRATCH = TA_RAS_BLOCK__GFX_CPC_INDEX_START,
 TA_RAS_BLOCK__GFX_CPC_UCODE,
 TA_RAS_BLOCK__GFX_DC_STATE_ME1,
 TA_RAS_BLOCK__GFX_DC_CSINVOC_ME1,
 TA_RAS_BLOCK__GFX_DC_RESTORE_ME1,
 TA_RAS_BLOCK__GFX_DC_STATE_ME2,
 TA_RAS_BLOCK__GFX_DC_CSINVOC_ME2,
 TA_RAS_BLOCK__GFX_DC_RESTORE_ME2,
 TA_RAS_BLOCK__GFX_CPC_INDEX_END = TA_RAS_BLOCK__GFX_DC_RESTORE_ME2,
 /* CPF*/
 TA_RAS_BLOCK__GFX_CPF_INDEX_START,
 TA_RAS_BLOCK__GFX_CPF_ROQ_ME2 = TA_RAS_BLOCK__GFX_CPF_INDEX_START,
 TA_RAS_BLOCK__GFX_CPF_ROQ_ME1,
 TA_RAS_BLOCK__GFX_CPF_TAG,
 TA_RAS_BLOCK__GFX_CPF_INDEX_END = TA_RAS_BLOCK__GFX_CPF_TAG,
 /* CPG*/
 TA_RAS_BLOCK__GFX_CPG_INDEX_START,
 TA_RAS_BLOCK__GFX_CPG_DMA_ROQ = TA_RAS_BLOCK__GFX_CPG_INDEX_START,
 TA_RAS_BLOCK__GFX_CPG_DMA_TAG,
 TA_RAS_BLOCK__GFX_CPG_TAG,
 TA_RAS_BLOCK__GFX_CPG_INDEX_END = TA_RAS_BLOCK__GFX_CPG_TAG,
 /* GDS*/
 TA_RAS_BLOCK__GFX_GDS_INDEX_START,
 TA_RAS_BLOCK__GFX_GDS_MEM = TA_RAS_BLOCK__GFX_GDS_INDEX_START,
 TA_RAS_BLOCK__GFX_GDS_INPUT_QUEUE,
 TA_RAS_BLOCK__GFX_GDS_OA_PHY_CMD_RAM_MEM,
 TA_RAS_BLOCK__GFX_GDS_OA_PHY_DATA_RAM_MEM,
 TA_RAS_BLOCK__GFX_GDS_OA_PIPE_MEM,
 TA_RAS_BLOCK__GFX_GDS_INDEX_END = TA_RAS_BLOCK__GFX_GDS_OA_PIPE_MEM,
 /* SPI*/
 TA_RAS_BLOCK__GFX_SPI_SR_MEM,
 /* SQ*/
 TA_RAS_BLOCK__GFX_SQ_INDEX_START,
 TA_RAS_BLOCK__GFX_SQ_SGPR = TA_RAS_BLOCK__GFX_SQ_INDEX_START,
 TA_RAS_BLOCK__GFX_SQ_LDS_D,
 TA_RAS_BLOCK__GFX_SQ_LDS_I,
 TA_RAS_BLOCK__GFX_SQ_VGPR, /* VGPR = SP*/
 TA_RAS_BLOCK__GFX_SQ_INDEX_END = TA_RAS_BLOCK__GFX_SQ_VGPR,
 /* SQC (3 ranges)*/
 TA_RAS_BLOCK__GFX_SQC_INDEX_START,
 /* SQC range 0*/
 TA_RAS_BLOCK__GFX_SQC_INDEX0_START = TA_RAS_BLOCK__GFX_SQC_INDEX_START,
 TA_RAS_BLOCK__GFX_SQC_INST_UTCL1_LFIFO =
  TA_RAS_BLOCK__GFX_SQC_INDEX0_START,
 TA_RAS_BLOCK__GFX_SQC_DATA_CU0_WRITE_DATA_BUF,
 TA_RAS_BLOCK__GFX_SQC_DATA_CU0_UTCL1_LFIFO,
 TA_RAS_BLOCK__GFX_SQC_DATA_CU1_WRITE_DATA_BUF,
 TA_RAS_BLOCK__GFX_SQC_DATA_CU1_UTCL1_LFIFO,
 TA_RAS_BLOCK__GFX_SQC_DATA_CU2_WRITE_DATA_BUF,
 TA_RAS_BLOCK__GFX_SQC_DATA_CU2_UTCL1_LFIFO,
 TA_RAS_BLOCK__GFX_SQC_INDEX0_END =
  TA_RAS_BLOCK__GFX_SQC_DATA_CU2_UTCL1_LFIFO,
 /* SQC range 1*/
 TA_RAS_BLOCK__GFX_SQC_INDEX1_START,
 TA_RAS_BLOCK__GFX_SQC_INST_BANKA_TAG_RAM =
  TA_RAS_BLOCK__GFX_SQC_INDEX1_START,
 TA_RAS_BLOCK__GFX_SQC_INST_BANKA_UTCL1_MISS_FIFO,
 TA_RAS_BLOCK__GFX_SQC_INST_BANKA_MISS_FIFO,
 TA_RAS_BLOCK__GFX_SQC_INST_BANKA_BANK_RAM,
 TA_RAS_BLOCK__GFX_SQC_DATA_BANKA_TAG_RAM,
 TA_RAS_BLOCK__GFX_SQC_DATA_BANKA_HIT_FIFO,
 TA_RAS_BLOCK__GFX_SQC_DATA_BANKA_MISS_FIFO,
 TA_RAS_BLOCK__GFX_SQC_DATA_BANKA_DIRTY_BIT_RAM,
 TA_RAS_BLOCK__GFX_SQC_DATA_BANKA_BANK_RAM,
 TA_RAS_BLOCK__GFX_SQC_INDEX1_END =
  TA_RAS_BLOCK__GFX_SQC_DATA_BANKA_BANK_RAM,
 /* SQC range 2*/
 TA_RAS_BLOCK__GFX_SQC_INDEX2_START,
 TA_RAS_BLOCK__GFX_SQC_INST_BANKB_TAG_RAM =
  TA_RAS_BLOCK__GFX_SQC_INDEX2_START,
 TA_RAS_BLOCK__GFX_SQC_INST_BANKB_UTCL1_MISS_FIFO,
 TA_RAS_BLOCK__GFX_SQC_INST_BANKB_MISS_FIFO,
 TA_RAS_BLOCK__GFX_SQC_INST_BANKB_BANK_RAM,
 TA_RAS_BLOCK__GFX_SQC_DATA_BANKB_TAG_RAM,
 TA_RAS_BLOCK__GFX_SQC_DATA_BANKB_HIT_FIFO,
 TA_RAS_BLOCK__GFX_SQC_DATA_BANKB_MISS_FIFO,
 TA_RAS_BLOCK__GFX_SQC_DATA_BANKB_DIRTY_BIT_RAM,
 TA_RAS_BLOCK__GFX_SQC_DATA_BANKB_BANK_RAM,
 TA_RAS_BLOCK__GFX_SQC_INDEX2_END =
  TA_RAS_BLOCK__GFX_SQC_DATA_BANKB_BANK_RAM,
 TA_RAS_BLOCK__GFX_SQC_INDEX_END = TA_RAS_BLOCK__GFX_SQC_INDEX2_END,
 /* TA*/
 TA_RAS_BLOCK__GFX_TA_INDEX_START,
 TA_RAS_BLOCK__GFX_TA_FS_DFIFO = TA_RAS_BLOCK__GFX_TA_INDEX_START,
 TA_RAS_BLOCK__GFX_TA_FS_AFIFO,
 TA_RAS_BLOCK__GFX_TA_FL_LFIFO,
 TA_RAS_BLOCK__GFX_TA_FX_LFIFO,
 TA_RAS_BLOCK__GFX_TA_FS_CFIFO,
 TA_RAS_BLOCK__GFX_TA_INDEX_END = TA_RAS_BLOCK__GFX_TA_FS_CFIFO,
 /* TCA*/
 TA_RAS_BLOCK__GFX_TCA_INDEX_START,
 TA_RAS_BLOCK__GFX_TCA_HOLE_FIFO = TA_RAS_BLOCK__GFX_TCA_INDEX_START,
 TA_RAS_BLOCK__GFX_TCA_REQ_FIFO,
 TA_RAS_BLOCK__GFX_TCA_INDEX_END = TA_RAS_BLOCK__GFX_TCA_REQ_FIFO,
 /* TCC (5 sub-ranges)*/
 TA_RAS_BLOCK__GFX_TCC_INDEX_START,
 /* TCC range 0*/
 TA_RAS_BLOCK__GFX_TCC_INDEX0_START = TA_RAS_BLOCK__GFX_TCC_INDEX_START,
 TA_RAS_BLOCK__GFX_TCC_CACHE_DATA = TA_RAS_BLOCK__GFX_TCC_INDEX0_START,
 TA_RAS_BLOCK__GFX_TCC_CACHE_DATA_BANK_0_1,
 TA_RAS_BLOCK__GFX_TCC_CACHE_DATA_BANK_1_0,
 TA_RAS_BLOCK__GFX_TCC_CACHE_DATA_BANK_1_1,
 TA_RAS_BLOCK__GFX_TCC_CACHE_DIRTY_BANK_0,
 TA_RAS_BLOCK__GFX_TCC_CACHE_DIRTY_BANK_1,
 TA_RAS_BLOCK__GFX_TCC_HIGH_RATE_TAG,
 TA_RAS_BLOCK__GFX_TCC_LOW_RATE_TAG,
 TA_RAS_BLOCK__GFX_TCC_INDEX0_END = TA_RAS_BLOCK__GFX_TCC_LOW_RATE_TAG,
 /* TCC range 1*/
 TA_RAS_BLOCK__GFX_TCC_INDEX1_START,
 TA_RAS_BLOCK__GFX_TCC_IN_USE_DEC = TA_RAS_BLOCK__GFX_TCC_INDEX1_START,
 TA_RAS_BLOCK__GFX_TCC_IN_USE_TRANSFER,
 TA_RAS_BLOCK__GFX_TCC_INDEX1_END =
  TA_RAS_BLOCK__GFX_TCC_IN_USE_TRANSFER,
 /* TCC range 2*/
 TA_RAS_BLOCK__GFX_TCC_INDEX2_START,
 TA_RAS_BLOCK__GFX_TCC_RETURN_DATA = TA_RAS_BLOCK__GFX_TCC_INDEX2_START,
 TA_RAS_BLOCK__GFX_TCC_RETURN_CONTROL,
 TA_RAS_BLOCK__GFX_TCC_UC_ATOMIC_FIFO,
 TA_RAS_BLOCK__GFX_TCC_WRITE_RETURN,
 TA_RAS_BLOCK__GFX_TCC_WRITE_CACHE_READ,
 TA_RAS_BLOCK__GFX_TCC_SRC_FIFO,
 TA_RAS_BLOCK__GFX_TCC_SRC_FIFO_NEXT_RAM,
 TA_RAS_BLOCK__GFX_TCC_CACHE_TAG_PROBE_FIFO,
 TA_RAS_BLOCK__GFX_TCC_INDEX2_END =
  TA_RAS_BLOCK__GFX_TCC_CACHE_TAG_PROBE_FIFO,
 /* TCC range 3*/
 TA_RAS_BLOCK__GFX_TCC_INDEX3_START,
 TA_RAS_BLOCK__GFX_TCC_LATENCY_FIFO = TA_RAS_BLOCK__GFX_TCC_INDEX3_START,
 TA_RAS_BLOCK__GFX_TCC_LATENCY_FIFO_NEXT_RAM,
 TA_RAS_BLOCK__GFX_TCC_INDEX3_END =
  TA_RAS_BLOCK__GFX_TCC_LATENCY_FIFO_NEXT_RAM,
 /* TCC range 4*/
 TA_RAS_BLOCK__GFX_TCC_INDEX4_START,
 TA_RAS_BLOCK__GFX_TCC_WRRET_TAG_WRITE_RETURN =
  TA_RAS_BLOCK__GFX_TCC_INDEX4_START,
 TA_RAS_BLOCK__GFX_TCC_ATOMIC_RETURN_BUFFER,
 TA_RAS_BLOCK__GFX_TCC_INDEX4_END =
  TA_RAS_BLOCK__GFX_TCC_ATOMIC_RETURN_BUFFER,
 TA_RAS_BLOCK__GFX_TCC_INDEX_END = TA_RAS_BLOCK__GFX_TCC_INDEX4_END,
 /* TCI*/
 TA_RAS_BLOCK__GFX_TCI_WRITE_RAM,
 /* TCP*/
 TA_RAS_BLOCK__GFX_TCP_INDEX_START,
 TA_RAS_BLOCK__GFX_TCP_CACHE_RAM = TA_RAS_BLOCK__GFX_TCP_INDEX_START,
 TA_RAS_BLOCK__GFX_TCP_LFIFO_RAM,
 TA_RAS_BLOCK__GFX_TCP_CMD_FIFO,
 TA_RAS_BLOCK__GFX_TCP_VM_FIFO,
 TA_RAS_BLOCK__GFX_TCP_DB_RAM,
 TA_RAS_BLOCK__GFX_TCP_UTCL1_LFIFO0,
 TA_RAS_BLOCK__GFX_TCP_UTCL1_LFIFO1,
 TA_RAS_BLOCK__GFX_TCP_INDEX_END = TA_RAS_BLOCK__GFX_TCP_UTCL1_LFIFO1,
 /* TD*/
 TA_RAS_BLOCK__GFX_TD_INDEX_START,
 TA_RAS_BLOCK__GFX_TD_SS_FIFO_LO = TA_RAS_BLOCK__GFX_TD_INDEX_START,
 TA_RAS_BLOCK__GFX_TD_SS_FIFO_HI,
 TA_RAS_BLOCK__GFX_TD_CS_FIFO,
 TA_RAS_BLOCK__GFX_TD_INDEX_END = TA_RAS_BLOCK__GFX_TD_CS_FIFO,
 /* EA (3 sub-ranges)*/
 TA_RAS_BLOCK__GFX_EA_INDEX_START,
 /* EA range 0*/
 TA_RAS_BLOCK__GFX_EA_INDEX0_START = TA_RAS_BLOCK__GFX_EA_INDEX_START,
 TA_RAS_BLOCK__GFX_EA_DRAMRD_CMDMEM = TA_RAS_BLOCK__GFX_EA_INDEX0_START,
 TA_RAS_BLOCK__GFX_EA_DRAMWR_CMDMEM,
 TA_RAS_BLOCK__GFX_EA_DRAMWR_DATAMEM,
 TA_RAS_BLOCK__GFX_EA_RRET_TAGMEM,
 TA_RAS_BLOCK__GFX_EA_WRET_TAGMEM,
 TA_RAS_BLOCK__GFX_EA_GMIRD_CMDMEM,
 TA_RAS_BLOCK__GFX_EA_GMIWR_CMDMEM,
 TA_RAS_BLOCK__GFX_EA_GMIWR_DATAMEM,
 TA_RAS_BLOCK__GFX_EA_INDEX0_END = TA_RAS_BLOCK__GFX_EA_GMIWR_DATAMEM,
 /* EA range 1*/
 TA_RAS_BLOCK__GFX_EA_INDEX1_START,
 TA_RAS_BLOCK__GFX_EA_DRAMRD_PAGEMEM = TA_RAS_BLOCK__GFX_EA_INDEX1_START,
 TA_RAS_BLOCK__GFX_EA_DRAMWR_PAGEMEM,
 TA_RAS_BLOCK__GFX_EA_IORD_CMDMEM,
 TA_RAS_BLOCK__GFX_EA_IOWR_CMDMEM,
 TA_RAS_BLOCK__GFX_EA_IOWR_DATAMEM,
 TA_RAS_BLOCK__GFX_EA_GMIRD_PAGEMEM,
 TA_RAS_BLOCK__GFX_EA_GMIWR_PAGEMEM,
 TA_RAS_BLOCK__GFX_EA_INDEX1_END = TA_RAS_BLOCK__GFX_EA_GMIWR_PAGEMEM,
 /* EA range 2*/
 TA_RAS_BLOCK__GFX_EA_INDEX2_START,
 TA_RAS_BLOCK__GFX_EA_MAM_D0MEM = TA_RAS_BLOCK__GFX_EA_INDEX2_START,
 TA_RAS_BLOCK__GFX_EA_MAM_D1MEM,
 TA_RAS_BLOCK__GFX_EA_MAM_D2MEM,
 TA_RAS_BLOCK__GFX_EA_MAM_D3MEM,
 TA_RAS_BLOCK__GFX_EA_INDEX2_END = TA_RAS_BLOCK__GFX_EA_MAM_D3MEM,
 TA_RAS_BLOCK__GFX_EA_INDEX_END = TA_RAS_BLOCK__GFX_EA_INDEX2_END,
 /* UTC VM L2 bank*/
 TA_RAS_BLOCK__UTC_VML2_BANK_CACHE,
 /* UTC VM walker*/
 TA_RAS_BLOCK__UTC_VML2_WALKER,
 /* UTC ATC L2 2MB cache*/
 TA_RAS_BLOCK__UTC_ATCL2_CACHE_2M_BANK,
 /* UTC ATC L2 4KB cache*/
 TA_RAS_BLOCK__UTC_ATCL2_CACHE_4K_BANK,
 TA_RAS_BLOCK__GFX_MAX
};

struct ras_gfx_subblock {
 unsigned char *name;
 int ta_subblock;
 int hw_supported_error_type;
 int sw_supported_error_type;
};

#define AMDGPU_RAS_SUB_BLOCK(subblock, a, b, c, d, e, f, g, h)                             \
 [AMDGPU_RAS_BLOCK__##subblock] = {                                     \
  #subblock,                                                     \
  TA_RAS_BLOCK__##subblock,                                      \
  ((a) | ((b) << 1) | ((c) << 2) | ((d) << 3)),                  \
  (((e) << 1) | ((f) << 3) | (g) | ((h) << 2)),                  \
 }

static const struct ras_gfx_subblock ras_gfx_subblocks[] = {
 AMDGPU_RAS_SUB_BLOCK(GFX_CPC_SCRATCH, 0, 1, 1, 1, 1, 0, 0, 1),
 AMDGPU_RAS_SUB_BLOCK(GFX_CPC_UCODE, 0, 1, 1, 1, 1, 0, 0, 1),
 AMDGPU_RAS_SUB_BLOCK(GFX_DC_STATE_ME1, 1, 0, 0, 1, 0, 0, 1, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_DC_CSINVOC_ME1, 1, 0, 0, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_DC_RESTORE_ME1, 1, 0, 0, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_DC_STATE_ME2, 1, 0, 0, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_DC_CSINVOC_ME2, 1, 0, 0, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_DC_RESTORE_ME2, 1, 0, 0, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_CPF_ROQ_ME2, 1, 0, 0, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_CPF_ROQ_ME1, 1, 0, 0, 1, 0, 0, 1, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_CPF_TAG, 0, 1, 1, 1, 1, 0, 0, 1),
 AMDGPU_RAS_SUB_BLOCK(GFX_CPG_DMA_ROQ, 1, 0, 0, 1, 0, 0, 1, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_CPG_DMA_TAG, 0, 1, 1, 1, 0, 1, 0, 1),
 AMDGPU_RAS_SUB_BLOCK(GFX_CPG_TAG, 0, 1, 1, 1, 1, 1, 0, 1),
 AMDGPU_RAS_SUB_BLOCK(GFX_GDS_MEM, 0, 1, 1, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_GDS_INPUT_QUEUE, 1, 0, 0, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_GDS_OA_PHY_CMD_RAM_MEM, 0, 1, 1, 1, 0, 0, 0,
        0),
 AMDGPU_RAS_SUB_BLOCK(GFX_GDS_OA_PHY_DATA_RAM_MEM, 1, 0, 0, 1, 0, 0, 0,
        0),
 AMDGPU_RAS_SUB_BLOCK(GFX_GDS_OA_PIPE_MEM, 0, 1, 1, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_SPI_SR_MEM, 1, 0, 0, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_SQ_SGPR, 0, 1, 1, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_SQ_LDS_D, 0, 1, 1, 1, 1, 0, 0, 1),
 AMDGPU_RAS_SUB_BLOCK(GFX_SQ_LDS_I, 0, 1, 1, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_SQ_VGPR, 0, 1, 1, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_SQC_INST_UTCL1_LFIFO, 0, 1, 1, 1, 0, 0, 0, 1),
 AMDGPU_RAS_SUB_BLOCK(GFX_SQC_DATA_CU0_WRITE_DATA_BUF, 0, 1, 1, 1, 0, 0,
        0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_SQC_DATA_CU0_UTCL1_LFIFO, 0, 1, 1, 1, 0, 0, 0,
        0),
 AMDGPU_RAS_SUB_BLOCK(GFX_SQC_DATA_CU1_WRITE_DATA_BUF, 0, 1, 1, 1, 0, 0,
        0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_SQC_DATA_CU1_UTCL1_LFIFO, 0, 1, 1, 1, 1, 0, 0,
        0),
 AMDGPU_RAS_SUB_BLOCK(GFX_SQC_DATA_CU2_WRITE_DATA_BUF, 0, 1, 1, 1, 0, 0,
        0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_SQC_DATA_CU2_UTCL1_LFIFO, 0, 1, 1, 1, 0, 0, 0,
        0),
 AMDGPU_RAS_SUB_BLOCK(GFX_SQC_INST_BANKA_TAG_RAM, 0, 1, 1, 1, 1, 0, 0,
        1),
 AMDGPU_RAS_SUB_BLOCK(GFX_SQC_INST_BANKA_UTCL1_MISS_FIFO, 1, 0, 0, 1, 0,
        0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_SQC_INST_BANKA_MISS_FIFO, 1, 0, 0, 1, 0, 0, 0,
        0),
 AMDGPU_RAS_SUB_BLOCK(GFX_SQC_INST_BANKA_BANK_RAM, 0, 1, 1, 1, 0, 0, 0,
        0),
 AMDGPU_RAS_SUB_BLOCK(GFX_SQC_DATA_BANKA_TAG_RAM, 0, 1, 1, 1, 0, 0, 0,
        0),
 AMDGPU_RAS_SUB_BLOCK(GFX_SQC_DATA_BANKA_HIT_FIFO, 1, 0, 0, 1, 0, 0, 0,
        0),
 AMDGPU_RAS_SUB_BLOCK(GFX_SQC_DATA_BANKA_MISS_FIFO, 1, 0, 0, 1, 0, 0, 0,
        0),
 AMDGPU_RAS_SUB_BLOCK(GFX_SQC_DATA_BANKA_DIRTY_BIT_RAM, 1, 0, 0, 1, 0, 0,
        0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_SQC_DATA_BANKA_BANK_RAM, 0, 1, 1, 1, 0, 0, 0,
        0),
 AMDGPU_RAS_SUB_BLOCK(GFX_SQC_INST_BANKB_TAG_RAM, 0, 1, 1, 1, 1, 0, 0,
        0),
 AMDGPU_RAS_SUB_BLOCK(GFX_SQC_INST_BANKB_UTCL1_MISS_FIFO, 1, 0, 0, 1, 0,
        0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_SQC_INST_BANKB_MISS_FIFO, 1, 0, 0, 1, 0, 0, 0,
        0),
 AMDGPU_RAS_SUB_BLOCK(GFX_SQC_INST_BANKB_BANK_RAM, 0, 1, 1, 1, 0, 0, 0,
        0),
 AMDGPU_RAS_SUB_BLOCK(GFX_SQC_DATA_BANKB_TAG_RAM, 0, 1, 1, 1, 0, 0, 0,
        0),
 AMDGPU_RAS_SUB_BLOCK(GFX_SQC_DATA_BANKB_HIT_FIFO, 1, 0, 0, 1, 0, 0, 0,
        0),
 AMDGPU_RAS_SUB_BLOCK(GFX_SQC_DATA_BANKB_MISS_FIFO, 1, 0, 0, 1, 0, 0, 0,
        0),
 AMDGPU_RAS_SUB_BLOCK(GFX_SQC_DATA_BANKB_DIRTY_BIT_RAM, 1, 0, 0, 1, 0, 0,
        0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_SQC_DATA_BANKB_BANK_RAM, 0, 1, 1, 1, 0, 0, 0,
        0),
 AMDGPU_RAS_SUB_BLOCK(GFX_TA_FS_DFIFO, 0, 1, 1, 1, 1, 0, 0, 1),
 AMDGPU_RAS_SUB_BLOCK(GFX_TA_FS_AFIFO, 1, 0, 0, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_TA_FL_LFIFO, 1, 0, 0, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_TA_FX_LFIFO, 1, 0, 0, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_TA_FS_CFIFO, 1, 0, 0, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_TCA_HOLE_FIFO, 1, 0, 0, 1, 0, 1, 1, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_TCA_REQ_FIFO, 1, 0, 0, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_TCC_CACHE_DATA, 0, 1, 1, 1, 1, 0, 0, 1),
 AMDGPU_RAS_SUB_BLOCK(GFX_TCC_CACHE_DATA_BANK_0_1, 0, 1, 1, 1, 1, 0, 0,
        1),
 AMDGPU_RAS_SUB_BLOCK(GFX_TCC_CACHE_DATA_BANK_1_0, 0, 1, 1, 1, 1, 0, 0,
        1),
 AMDGPU_RAS_SUB_BLOCK(GFX_TCC_CACHE_DATA_BANK_1_1, 0, 1, 1, 1, 1, 0, 0,
        1),
 AMDGPU_RAS_SUB_BLOCK(GFX_TCC_CACHE_DIRTY_BANK_0, 0, 1, 1, 1, 0, 0, 0,
        0),
 AMDGPU_RAS_SUB_BLOCK(GFX_TCC_CACHE_DIRTY_BANK_1, 0, 1, 1, 1, 0, 0, 0,
        0),
 AMDGPU_RAS_SUB_BLOCK(GFX_TCC_HIGH_RATE_TAG, 0, 1, 1, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_TCC_LOW_RATE_TAG, 0, 1, 1, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_TCC_IN_USE_DEC, 1, 0, 0, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_TCC_IN_USE_TRANSFER, 1, 0, 0, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_TCC_RETURN_DATA, 1, 0, 0, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_TCC_RETURN_CONTROL, 1, 0, 0, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_TCC_UC_ATOMIC_FIFO, 1, 0, 0, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_TCC_WRITE_RETURN, 1, 0, 0, 1, 0, 1, 1, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_TCC_WRITE_CACHE_READ, 1, 0, 0, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_TCC_SRC_FIFO, 0, 1, 1, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_TCC_SRC_FIFO_NEXT_RAM, 1, 0, 0, 1, 0, 0, 1, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_TCC_CACHE_TAG_PROBE_FIFO, 1, 0, 0, 1, 0, 0, 0,
        0),
 AMDGPU_RAS_SUB_BLOCK(GFX_TCC_LATENCY_FIFO, 1, 0, 0, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_TCC_LATENCY_FIFO_NEXT_RAM, 1, 0, 0, 1, 0, 0, 0,
        0),
 AMDGPU_RAS_SUB_BLOCK(GFX_TCC_WRRET_TAG_WRITE_RETURN, 1, 0, 0, 1, 0, 0,
        0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_TCC_ATOMIC_RETURN_BUFFER, 1, 0, 0, 1, 0, 0, 0,
        0),
 AMDGPU_RAS_SUB_BLOCK(GFX_TCI_WRITE_RAM, 1, 0, 0, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_TCP_CACHE_RAM, 0, 1, 1, 1, 1, 0, 0, 1),
 AMDGPU_RAS_SUB_BLOCK(GFX_TCP_LFIFO_RAM, 0, 1, 1, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_TCP_CMD_FIFO, 1, 0, 0, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_TCP_VM_FIFO, 0, 1, 1, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_TCP_DB_RAM, 1, 0, 0, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_TCP_UTCL1_LFIFO0, 0, 1, 1, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_TCP_UTCL1_LFIFO1, 0, 1, 1, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_TD_SS_FIFO_LO, 0, 1, 1, 1, 1, 0, 0, 1),
 AMDGPU_RAS_SUB_BLOCK(GFX_TD_SS_FIFO_HI, 0, 1, 1, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_TD_CS_FIFO, 1, 0, 0, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_EA_DRAMRD_CMDMEM, 0, 1, 1, 1, 1, 0, 0, 1),
 AMDGPU_RAS_SUB_BLOCK(GFX_EA_DRAMWR_CMDMEM, 0, 1, 1, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_EA_DRAMWR_DATAMEM, 0, 1, 1, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_EA_RRET_TAGMEM, 0, 1, 1, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_EA_WRET_TAGMEM, 0, 1, 1, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_EA_GMIRD_CMDMEM, 0, 1, 1, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_EA_GMIWR_CMDMEM, 0, 1, 1, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_EA_GMIWR_DATAMEM, 0, 1, 1, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_EA_DRAMRD_PAGEMEM, 1, 0, 0, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_EA_DRAMWR_PAGEMEM, 1, 0, 0, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_EA_IORD_CMDMEM, 1, 0, 0, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_EA_IOWR_CMDMEM, 1, 0, 0, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_EA_IOWR_DATAMEM, 1, 0, 0, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_EA_GMIRD_PAGEMEM, 1, 0, 0, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_EA_GMIWR_PAGEMEM, 1, 0, 0, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_EA_MAM_D0MEM, 1, 0, 0, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_EA_MAM_D1MEM, 1, 0, 0, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_EA_MAM_D2MEM, 1, 0, 0, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(GFX_EA_MAM_D3MEM, 1, 0, 0, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(UTC_VML2_BANK_CACHE, 0, 1, 1, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(UTC_VML2_WALKER, 0, 1, 1, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(UTC_ATCL2_CACHE_2M_BANK, 1, 0, 0, 1, 0, 0, 0, 0),
 AMDGPU_RAS_SUB_BLOCK(UTC_ATCL2_CACHE_4K_BANK, 0, 1, 1, 1, 0, 0, 0, 0),
};

static const struct soc15_reg_golden golden_settings_gc_9_0[] =
{
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_DEBUG2, 0xf00fffff, 0x00000400),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_DEBUG3, 0x80000000, 0x80000000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_GPU_ID, 0x0000000f, 0x00000000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_BINNER_EVENT_CNTL_3, 0x00000003, 0x82400024),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_ENHANCE, 0x3fffffff, 0x00000001),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmSH_MEM_CONFIG, 0x00001000, 0x00001000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_RESOURCE_RESERVE_CU_0, 0x0007ffff, 0x00000800),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_RESOURCE_RESERVE_CU_1, 0x0007ffff, 0x00000800),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_RESOURCE_RESERVE_EN_CU_0, 0x01ffffff, 0x00ffff87),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_RESOURCE_RESERVE_EN_CU_1, 0x01ffffff, 0x00ffff8f),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmSQC_CONFIG, 0x03000000, 0x020a2000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmTA_CNTL_AUX, 0xfffffeef, 0x010b0000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_HI, 0xffffffff, 0x4a2c0e68),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_LO, 0xffffffff, 0xb5d3f197),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmVGT_CACHE_INVALIDATION, 0x3fff3af3, 0x19200000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmVGT_GS_MAX_WAVE_ID, 0x00000fff, 0x000003ff),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmCP_MEC1_F32_INT_DIS, 0x00000800, 0x00000800),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmCP_MEC2_F32_INT_DIS, 0x00000800, 0x00000800),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmCP_DEBUG, 0x00008000, 0x00008000)
};

static const struct soc15_reg_golden golden_settings_gc_9_0_vg10[] =
{
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_HW_CONTROL, 0x0000f000, 0x00012107),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_HW_CONTROL_3, 0x30000000, 0x10000000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmCPC_UTCL1_CNTL, 0x08000000, 0x08000080),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmCPF_UTCL1_CNTL, 0x08000000, 0x08000080),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmCPG_UTCL1_CNTL, 0x08000000, 0x08000080),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_ADDR_CONFIG, 0xffff77ff, 0x2a114042),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_ADDR_CONFIG_READ, 0xffff77ff, 0x2a114042),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmIA_UTCL1_CNTL, 0x08000000, 0x08000080),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_ENHANCE_1, 0x00008000, 0x00048000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_GPM_UTCL1_CNTL_0, 0x08000000, 0x08000080),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_GPM_UTCL1_CNTL_1, 0x08000000, 0x08000080),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_GPM_UTCL1_CNTL_2, 0x08000000, 0x08000080),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_PREWALKER_UTCL1_CNTL, 0x08000000, 0x08000080),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_UTCL1_CNTL, 0x08000000, 0x08000080),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmRMI_UTCL1_CNTL2, 0x00030000, 0x00020000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_CONFIG_CNTL_1, 0x0000000f, 0x01000107),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmTD_CNTL, 0x00001800, 0x00000800),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmWD_UTCL1_CNTL, 0x08000000, 0x08000080)
};

static const struct soc15_reg_golden golden_settings_gc_9_0_vg20[] =
{
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_DCC_CONFIG, 0x0f000080, 0x04000080),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_HW_CONTROL_2, 0x0f000000, 0x0a000000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_HW_CONTROL_3, 0x30000000, 0x10000000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_ADDR_CONFIG, 0xf3e777ff, 0x22014042),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_ADDR_CONFIG_READ, 0xf3e777ff, 0x22014042),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_DEBUG2, 0x00003e00, 0x00000400),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_ENHANCE_1, 0xff840000, 0x04040000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmRMI_UTCL1_CNTL2, 0x00030000, 0x00030000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_CONFIG_CNTL_1, 0xffff010f, 0x01000107),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmTA_CNTL_AUX, 0x000b0000, 0x000b0000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmTD_CNTL, 0x01000000, 0x01000000)
};

static const struct soc15_reg_golden golden_settings_gc_9_1[] =
{
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_HW_CONTROL, 0xfffdf3cf, 0x00014104),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmCPC_UTCL1_CNTL, 0x08000000, 0x08000080),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmCPF_UTCL1_CNTL, 0x08000000, 0x08000080),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmCPG_UTCL1_CNTL, 0x08000000, 0x08000080),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_DEBUG2, 0xf00fffff, 0x00000420),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_GPU_ID, 0x0000000f, 0x00000000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmIA_UTCL1_CNTL, 0x08000000, 0x08000080),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_BINNER_EVENT_CNTL_3, 0x00000003, 0x82400024),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_ENHANCE, 0x3fffffff, 0x00000001),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_GPM_UTCL1_CNTL_0, 0x08000000, 0x08000080),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_GPM_UTCL1_CNTL_1, 0x08000000, 0x08000080),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_GPM_UTCL1_CNTL_2, 0x08000000, 0x08000080),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_PREWALKER_UTCL1_CNTL, 0x08000000, 0x08000080),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_UTCL1_CNTL, 0x08000000, 0x08000080),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmTA_CNTL_AUX, 0xfffffeef, 0x010b0000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00003120),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmVGT_CACHE_INVALIDATION, 0x3fff3af3, 0x19200000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmVGT_GS_MAX_WAVE_ID, 0x00000fff, 0x000000ff),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmWD_UTCL1_CNTL, 0x08000000, 0x08000080),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmCP_MEC1_F32_INT_DIS, 0x00000800, 0x00000800),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmCP_MEC2_F32_INT_DIS, 0x00000800, 0x00000800),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmCP_DEBUG, 0x00008000, 0x00008000)
};

static const struct soc15_reg_golden golden_settings_gc_9_1_rv1[] =
{
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_HW_CONTROL_3, 0x30000000, 0x10000000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_ADDR_CONFIG, 0xffff77ff, 0x24000042),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_ADDR_CONFIG_READ, 0xffff77ff, 0x24000042),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_ENHANCE_1, 0xffffffff, 0x04048000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_MODE_CNTL_1, 0x06000000, 0x06000000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmRMI_UTCL1_CNTL2, 0x00030000, 0x00020000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmTD_CNTL, 0x01bd9f33, 0x00000800)
};

static const struct soc15_reg_golden golden_settings_gc_9_1_rv2[] =
{
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_DCC_CONFIG, 0xff7fffff, 0x04000000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_HW_CONTROL, 0xfffdf3cf, 0x00014104),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_HW_CONTROL_2, 0xff7fffff, 0x0a000000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmCPC_UTCL1_CNTL, 0x7f0fffff, 0x08000080),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmCPF_UTCL1_CNTL, 0xff8fffff, 0x08000080),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmCPG_UTCL1_CNTL, 0x7f8fffff, 0x08000080),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_ADDR_CONFIG, 0xffff77ff, 0x26013041),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_ADDR_CONFIG_READ, 0xffff77ff, 0x26013041),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmIA_UTCL1_CNTL, 0x3f8fffff, 0x08000080),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_ENHANCE_1, 0xffffffff, 0x04040000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_GPM_UTCL1_CNTL_0, 0xff0fffff, 0x08000080),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_GPM_UTCL1_CNTL_1, 0xff0fffff, 0x08000080),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_GPM_UTCL1_CNTL_2, 0xff0fffff, 0x08000080),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_PREWALKER_UTCL1_CNTL, 0xff0fffff, 0x08000080),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_UTCL1_CNTL, 0xff0fffff, 0x08000080),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00000010),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmTD_CNTL, 0x01bd9f33, 0x01000000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmWD_UTCL1_CNTL, 0x3f8fffff, 0x08000080),
};

static const struct soc15_reg_golden golden_settings_gc_9_1_rn[] =
{
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_HW_CONTROL, 0xfffdf3cf, 0x00014104),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_HW_CONTROL_2, 0xff7fffff, 0x0a000000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_DEBUG2, 0xf00fffff, 0x00000400),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_ADDR_CONFIG, 0xf3e777ff, 0x24000042),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_ADDR_CONFIG_READ, 0xf3e777ff, 0x24000042),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_ENHANCE, 0x3fffffff, 0x00000001),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_ENHANCE_1, 0xffffffff, 0x04040000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmTA_CNTL_AUX, 0xfffffeef, 0x010b0000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00003120),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmGCEA_PROBE_MAP, 0xffffffff, 0x0000cccc),
};

static const struct soc15_reg_golden golden_settings_gc_9_x_common[] =
{
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmCP_SD_CNTL, 0xffffffff, 0x000001ff),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_CAM_INDEX, 0xffffffff, 0x00000000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_CAM_DATA, 0xffffffff, 0x2544c382)
};

static const struct soc15_reg_golden golden_settings_gc_9_2_1[] =
{
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_DEBUG2, 0xf00fffff, 0x00000420),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_GPU_ID, 0x0000000f, 0x00000000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_BINNER_EVENT_CNTL_3, 0x00000003, 0x82400024),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_ENHANCE, 0x3fffffff, 0x00000001),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmSH_MEM_CONFIG, 0x00001000, 0x00001000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_RESOURCE_RESERVE_CU_0, 0x0007ffff, 0x00000800),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_RESOURCE_RESERVE_CU_1, 0x0007ffff, 0x00000800),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_RESOURCE_RESERVE_EN_CU_0, 0x01ffffff, 0x0000ff87),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_RESOURCE_RESERVE_EN_CU_1, 0x01ffffff, 0x0000ff8f),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmSQC_CONFIG, 0x03000000, 0x020a2000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmTA_CNTL_AUX, 0xfffffeef, 0x010b0000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_HI, 0xffffffff, 0x4a2c0e68),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_LO, 0xffffffff, 0xb5d3f197),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmVGT_CACHE_INVALIDATION, 0x3fff3af3, 0x19200000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmVGT_GS_MAX_WAVE_ID, 0x00000fff, 0x000003ff)
};

static const struct soc15_reg_golden golden_settings_gc_9_2_1_vg12[] =
{
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_DCC_CONFIG, 0x00000080, 0x04000080),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_HW_CONTROL, 0xfffdf3cf, 0x00014104),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_HW_CONTROL_2, 0x0f000000, 0x0a000000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_ADDR_CONFIG, 0xffff77ff, 0x24104041),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_ADDR_CONFIG_READ, 0xffff77ff, 0x24104041),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_ENHANCE_1, 0xffffffff, 0x04040000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_CONFIG_CNTL_1, 0xffff03ff, 0x01000107),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_LO, 0xffffffff, 0x76325410),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmTD_CNTL, 0x01bd9f33, 0x01000000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmCP_MEC1_F32_INT_DIS, 0x00000800, 0x00000800),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmCP_MEC2_F32_INT_DIS, 0x00000800, 0x00000800),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmCP_DEBUG, 0x00008000, 0x00008000)
};

static const struct soc15_reg_golden golden_settings_gc_9_4_1_arct[] =
{
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_ADDR_CONFIG, 0xffff77ff, 0x2a114042),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmTA_CNTL_AUX, 0xfffffeef, 0x10b0000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_0_ARCT, 0x3fffffff, 0x346f0a4e),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_1_ARCT, 0x3fffffff, 0x1c642ca),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_2_ARCT, 0x3fffffff, 0x26f45098),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_3_ARCT, 0x3fffffff, 0x2ebd9fe3),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_4_ARCT, 0x3fffffff, 0xb90f5b1),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_5_ARCT, 0x3ff, 0x135),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmSQ_CONFIG, 0xffffffff, 0x011A0000),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmSQ_FIFO_SIZES, 0xffffffff, 0x00000f00),
 SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_UTCL1_CNTL1, 0x30000000, 0x30000000)
};

static const struct soc15_reg_rlcg rlcg_access_gc_9_0[] = {
 {SOC15_REG_ENTRY(GC, 0, mmGRBM_GFX_INDEX)},
 {SOC15_REG_ENTRY(GC, 0, mmSQ_IND_INDEX)},
};

static const u32 GFX_RLC_SRM_INDEX_CNTL_ADDR_OFFSETS[] =
{
 mmRLC_SRM_INDEX_CNTL_ADDR_0 - mmRLC_SRM_INDEX_CNTL_ADDR_0,
 mmRLC_SRM_INDEX_CNTL_ADDR_1 - mmRLC_SRM_INDEX_CNTL_ADDR_0,
 mmRLC_SRM_INDEX_CNTL_ADDR_2 - mmRLC_SRM_INDEX_CNTL_ADDR_0,
 mmRLC_SRM_INDEX_CNTL_ADDR_3 - mmRLC_SRM_INDEX_CNTL_ADDR_0,
 mmRLC_SRM_INDEX_CNTL_ADDR_4 - mmRLC_SRM_INDEX_CNTL_ADDR_0,
 mmRLC_SRM_INDEX_CNTL_ADDR_5 - mmRLC_SRM_INDEX_CNTL_ADDR_0,
 mmRLC_SRM_INDEX_CNTL_ADDR_6 - mmRLC_SRM_INDEX_CNTL_ADDR_0,
 mmRLC_SRM_INDEX_CNTL_ADDR_7 - mmRLC_SRM_INDEX_CNTL_ADDR_0,
};

static const u32 GFX_RLC_SRM_INDEX_CNTL_DATA_OFFSETS[] =
{
 mmRLC_SRM_INDEX_CNTL_DATA_0 - mmRLC_SRM_INDEX_CNTL_DATA_0,
 mmRLC_SRM_INDEX_CNTL_DATA_1 - mmRLC_SRM_INDEX_CNTL_DATA_0,
 mmRLC_SRM_INDEX_CNTL_DATA_2 - mmRLC_SRM_INDEX_CNTL_DATA_0,
 mmRLC_SRM_INDEX_CNTL_DATA_3 - mmRLC_SRM_INDEX_CNTL_DATA_0,
 mmRLC_SRM_INDEX_CNTL_DATA_4 - mmRLC_SRM_INDEX_CNTL_DATA_0,
 mmRLC_SRM_INDEX_CNTL_DATA_5 - mmRLC_SRM_INDEX_CNTL_DATA_0,
 mmRLC_SRM_INDEX_CNTL_DATA_6 - mmRLC_SRM_INDEX_CNTL_DATA_0,
 mmRLC_SRM_INDEX_CNTL_DATA_7 - mmRLC_SRM_INDEX_CNTL_DATA_0,
};

#define VEGA10_GB_ADDR_CONFIG_GOLDEN 0x2a114042
#define VEGA12_GB_ADDR_CONFIG_GOLDEN 0x24104041
#define RAVEN_GB_ADDR_CONFIG_GOLDEN 0x24000042
#define RAVEN2_GB_ADDR_CONFIG_GOLDEN 0x26013041

static void gfx_v9_0_set_ring_funcs(struct amdgpu_device *adev);
static void gfx_v9_0_set_irq_funcs(struct amdgpu_device *adev);
static void gfx_v9_0_set_gds_init(struct amdgpu_device *adev);
static void gfx_v9_0_set_rlc_funcs(struct amdgpu_device *adev);
static int gfx_v9_0_get_cu_info(struct amdgpu_device *adev,
    struct amdgpu_cu_info *cu_info);
static uint64_t gfx_v9_0_get_gpu_clock_counter(struct amdgpu_device *adev);
static void gfx_v9_0_ring_emit_de_meta(struct amdgpu_ring *ring, bool resume, bool usegds);
static u64 gfx_v9_0_ring_get_rptr_compute(struct amdgpu_ring *ring);
static void gfx_v9_0_query_ras_error_count(struct amdgpu_device *adev,
       void *ras_error_status);
static int gfx_v9_0_ras_error_inject(struct amdgpu_device *adev,
         void *inject_if, uint32_t instance_mask);
static void gfx_v9_0_reset_ras_error_count(struct amdgpu_device *adev);
static void gfx_v9_0_update_spm_vmid_internal(struct amdgpu_device *adev,
           unsigned int vmid);
static void gfx_v9_0_set_safe_mode(struct amdgpu_device *adev, int xcc_id);
static void gfx_v9_0_unset_safe_mode(struct amdgpu_device *adev, int xcc_id);

static void gfx_v9_0_kiq_set_resources(struct amdgpu_ring *kiq_ring,
    uint64_t queue_mask)
{
 struct amdgpu_device *adev = kiq_ring->adev;
 u64 shader_mc_addr;

 /* Cleaner shader MC address */
 shader_mc_addr = adev->gfx.cleaner_shader_gpu_addr >> 8;

 amdgpu_ring_write(kiq_ring, PACKET3(PACKET3_SET_RESOURCES, 6));
 amdgpu_ring_write(kiq_ring,
  PACKET3_SET_RESOURCES_VMID_MASK(0) |
  /* vmid_mask:0* queue_type:0 (KIQ) */
  PACKET3_SET_RESOURCES_QUEUE_TYPE(0));
 amdgpu_ring_write(kiq_ring,
   lower_32_bits(queue_mask)); /* queue mask lo */
 amdgpu_ring_write(kiq_ring,
   upper_32_bits(queue_mask)); /* queue mask hi */
 amdgpu_ring_write(kiq_ring, lower_32_bits(shader_mc_addr)); /* cleaner shader addr lo */
 amdgpu_ring_write(kiq_ring, upper_32_bits(shader_mc_addr)); /* cleaner shader addr hi */
 amdgpu_ring_write(kiq_ring, 0); /* oac mask */
 amdgpu_ring_write(kiq_ring, 0); /* gds heap base:0, gds heap size:0 */
}

static void gfx_v9_0_kiq_map_queues(struct amdgpu_ring *kiq_ring,
     struct amdgpu_ring *ring)
{
 uint64_t mqd_addr = amdgpu_bo_gpu_offset(ring->mqd_obj);
 uint64_t wptr_addr = ring->wptr_gpu_addr;
 uint32_t eng_sel = ring->funcs->type == AMDGPU_RING_TYPE_GFX ? 4 : 0;

 amdgpu_ring_write(kiq_ring, PACKET3(PACKET3_MAP_QUEUES, 5));
 /* Q_sel:0, vmid:0, vidmem: 1, engine:0, num_Q:1*/
 amdgpu_ring_write(kiq_ring, /* Q_sel: 0, vmid: 0, engine: 0, num_Q: 1 */
    PACKET3_MAP_QUEUES_QUEUE_SEL(0) | /* Queue_Sel */
    PACKET3_MAP_QUEUES_VMID(0) | /* VMID */
    PACKET3_MAP_QUEUES_QUEUE(ring->queue) |
    PACKET3_MAP_QUEUES_PIPE(ring->pipe) |
    PACKET3_MAP_QUEUES_ME((ring->me == 1 ? 0 : 1)) |
    /*queue_type: normal compute queue */
    PACKET3_MAP_QUEUES_QUEUE_TYPE(0) |
    /* alloc format: all_on_one_pipe */
    PACKET3_MAP_QUEUES_ALLOC_FORMAT(0) |
    PACKET3_MAP_QUEUES_ENGINE_SEL(eng_sel) |
    /* num_queues: must be 1 */
    PACKET3_MAP_QUEUES_NUM_QUEUES(1));
 amdgpu_ring_write(kiq_ring,
   PACKET3_MAP_QUEUES_DOORBELL_OFFSET(ring->doorbell_index));
 amdgpu_ring_write(kiq_ring, lower_32_bits(mqd_addr));
 amdgpu_ring_write(kiq_ring, upper_32_bits(mqd_addr));
 amdgpu_ring_write(kiq_ring, lower_32_bits(wptr_addr));
 amdgpu_ring_write(kiq_ring, upper_32_bits(wptr_addr));
}

static void gfx_v9_0_kiq_unmap_queues(struct amdgpu_ring *kiq_ring,
       struct amdgpu_ring *ring,
       enum amdgpu_unmap_queues_action action,
       u64 gpu_addr, u64 seq)
{
 uint32_t eng_sel = ring->funcs->type == AMDGPU_RING_TYPE_GFX ? 4 : 0;

 amdgpu_ring_write(kiq_ring, PACKET3(PACKET3_UNMAP_QUEUES, 4));
 amdgpu_ring_write(kiq_ring, /* Q_sel: 0, vmid: 0, engine: 0, num_Q: 1 */
     PACKET3_UNMAP_QUEUES_ACTION(action) |
     PACKET3_UNMAP_QUEUES_QUEUE_SEL(0) |
     PACKET3_UNMAP_QUEUES_ENGINE_SEL(eng_sel) |
     PACKET3_UNMAP_QUEUES_NUM_QUEUES(1));
 amdgpu_ring_write(kiq_ring,
   PACKET3_UNMAP_QUEUES_DOORBELL_OFFSET0(ring->doorbell_index));

 if (action == PREEMPT_QUEUES_NO_UNMAP) {
  amdgpu_ring_write(kiq_ring, lower_32_bits(ring->wptr & ring->buf_mask));
  amdgpu_ring_write(kiq_ring, 0);
  amdgpu_ring_write(kiq_ring, 0);

 } else {
  amdgpu_ring_write(kiq_ring, 0);
  amdgpu_ring_write(kiq_ring, 0);
  amdgpu_ring_write(kiq_ring, 0);
 }
}

static void gfx_v9_0_kiq_query_status(struct amdgpu_ring *kiq_ring,
       struct amdgpu_ring *ring,
       u64 addr,
       u64 seq)
{
 uint32_t eng_sel = ring->funcs->type == AMDGPU_RING_TYPE_GFX ? 4 : 0;

 amdgpu_ring_write(kiq_ring, PACKET3(PACKET3_QUERY_STATUS, 5));
 amdgpu_ring_write(kiq_ring,
     PACKET3_QUERY_STATUS_CONTEXT_ID(0) |
     PACKET3_QUERY_STATUS_INTERRUPT_SEL(0) |
     PACKET3_QUERY_STATUS_COMMAND(2));
 /* Q_sel: 0, vmid: 0, engine: 0, num_Q: 1 */
 amdgpu_ring_write(kiq_ring,
   PACKET3_QUERY_STATUS_DOORBELL_OFFSET(ring->doorbell_index) |
   PACKET3_QUERY_STATUS_ENG_SEL(eng_sel));
 amdgpu_ring_write(kiq_ring, lower_32_bits(addr));
 amdgpu_ring_write(kiq_ring, upper_32_bits(addr));
 amdgpu_ring_write(kiq_ring, lower_32_bits(seq));
 amdgpu_ring_write(kiq_ring, upper_32_bits(seq));
}

static void gfx_v9_0_kiq_invalidate_tlbs(struct amdgpu_ring *kiq_ring,
    uint16_t pasid, uint32_t flush_type,
    bool all_hub)
{
 amdgpu_ring_write(kiq_ring, PACKET3(PACKET3_INVALIDATE_TLBS, 0));
 amdgpu_ring_write(kiq_ring,
   PACKET3_INVALIDATE_TLBS_DST_SEL(1) |
   PACKET3_INVALIDATE_TLBS_ALL_HUB(all_hub) |
   PACKET3_INVALIDATE_TLBS_PASID(pasid) |
   PACKET3_INVALIDATE_TLBS_FLUSH_TYPE(flush_type));
}


static void gfx_v9_0_kiq_reset_hw_queue(struct amdgpu_ring *kiq_ring, uint32_t queue_type,
     uint32_t me_id, uint32_t pipe_id, uint32_t queue_id,
     uint32_t xcc_id, uint32_t vmid)
{
 struct amdgpu_device *adev = kiq_ring->adev;
 unsigned i;

 /* enter save mode */
 amdgpu_gfx_rlc_enter_safe_mode(adev, xcc_id);
 mutex_lock(&adev->srbm_mutex);
 soc15_grbm_select(adev, me_id, pipe_id, queue_id, 0, 0);

 if (queue_type == AMDGPU_RING_TYPE_COMPUTE) {
  WREG32_SOC15(GC, 0, mmCP_HQD_DEQUEUE_REQUEST, 0x2);
  WREG32_SOC15(GC, 0, mmSPI_COMPUTE_QUEUE_RESET, 0x1);
  /* wait till dequeue take effects */
  for (i = 0; i < adev->usec_timeout; i++) {
   if (!(RREG32_SOC15(GC, 0, mmCP_HQD_ACTIVE) & 1))
    break;
   udelay(1);
  }
  if (i >= adev->usec_timeout)
   dev_err(adev->dev, "fail to wait on hqd deactive\n");
 } else {
  dev_err(adev->dev, "reset queue_type(%d) not supported\n", queue_type);
 }

 soc15_grbm_select(adev, 0, 0, 0, 0, 0);
 mutex_unlock(&adev->srbm_mutex);
 /* exit safe mode */
 amdgpu_gfx_rlc_exit_safe_mode(adev, xcc_id);
}

static const struct kiq_pm4_funcs gfx_v9_0_kiq_pm4_funcs = {
 .kiq_set_resources = gfx_v9_0_kiq_set_resources,
 .kiq_map_queues = gfx_v9_0_kiq_map_queues,
 .kiq_unmap_queues = gfx_v9_0_kiq_unmap_queues,
 .kiq_query_status = gfx_v9_0_kiq_query_status,
 .kiq_invalidate_tlbs = gfx_v9_0_kiq_invalidate_tlbs,
 .kiq_reset_hw_queue = gfx_v9_0_kiq_reset_hw_queue,
 .set_resources_size = 8,
 .map_queues_size = 7,
 .unmap_queues_size = 6,
 .query_status_size = 7,
 .invalidate_tlbs_size = 2,
};

static void gfx_v9_0_set_kiq_pm4_funcs(struct amdgpu_device *adev)
{
 adev->gfx.kiq[0].pmf = &gfx_v9_0_kiq_pm4_funcs;
}

static void gfx_v9_0_init_golden_registers(struct amdgpu_device *adev)
{
 switch (amdgpu_ip_version(adev, GC_HWIP, 0)) {
 case IP_VERSION(9, 0, 1):
  soc15_program_register_sequence(adev,
      golden_settings_gc_9_0,
      ARRAY_SIZE(golden_settings_gc_9_0));
  soc15_program_register_sequence(adev,
      golden_settings_gc_9_0_vg10,
      ARRAY_SIZE(golden_settings_gc_9_0_vg10));
  break;
 case IP_VERSION(9, 2, 1):
  soc15_program_register_sequence(adev,
      golden_settings_gc_9_2_1,
      ARRAY_SIZE(golden_settings_gc_9_2_1));
  soc15_program_register_sequence(adev,
      golden_settings_gc_9_2_1_vg12,
      ARRAY_SIZE(golden_settings_gc_9_2_1_vg12));
  break;
 case IP_VERSION(9, 4, 0):
  soc15_program_register_sequence(adev,
      golden_settings_gc_9_0,
      ARRAY_SIZE(golden_settings_gc_9_0));
  soc15_program_register_sequence(adev,
      golden_settings_gc_9_0_vg20,
      ARRAY_SIZE(golden_settings_gc_9_0_vg20));
  break;
 case IP_VERSION(9, 4, 1):
  soc15_program_register_sequence(adev,
      golden_settings_gc_9_4_1_arct,
      ARRAY_SIZE(golden_settings_gc_9_4_1_arct));
  break;
 case IP_VERSION(9, 2, 2):
 case IP_VERSION(9, 1, 0):
  soc15_program_register_sequence(adev, golden_settings_gc_9_1,
      ARRAY_SIZE(golden_settings_gc_9_1));
  if (adev->apu_flags & AMD_APU_IS_RAVEN2)
   soc15_program_register_sequence(adev,
       golden_settings_gc_9_1_rv2,
       ARRAY_SIZE(golden_settings_gc_9_1_rv2));
  else
   soc15_program_register_sequence(adev,
       golden_settings_gc_9_1_rv1,
       ARRAY_SIZE(golden_settings_gc_9_1_rv1));
  break;
  case IP_VERSION(9, 3, 0):
  soc15_program_register_sequence(adev,
      golden_settings_gc_9_1_rn,
      ARRAY_SIZE(golden_settings_gc_9_1_rn));
  return/* for renoir, don't need common goldensetting */
 case IP_VERSION(9, 4, 2):
  gfx_v9_4_2_init_golden_registers(adev,
       adev->smuio.funcs->get_die_id(adev));
  break;
 default:
  break;
 }

 if ((amdgpu_ip_version(adev, GC_HWIP, 0) != IP_VERSION(9, 4, 1)) &&
     (amdgpu_ip_version(adev, GC_HWIP, 0) != IP_VERSION(9, 4, 2)))
  soc15_program_register_sequence(adev, golden_settings_gc_9_x_common,
      (const u32)ARRAY_SIZE(golden_settings_gc_9_x_common));
}

static void gfx_v9_0_write_data_to_reg(struct amdgpu_ring *ring, int eng_sel,
           bool wc, uint32_t reg, uint32_t val)
{
 amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
 amdgpu_ring_write(ring, WRITE_DATA_ENGINE_SEL(eng_sel) |
    WRITE_DATA_DST_SEL(0) |
    (wc ? WR_CONFIRM : 0));
 amdgpu_ring_write(ring, reg);
 amdgpu_ring_write(ring, 0);
 amdgpu_ring_write(ring, val);
}

static void gfx_v9_0_wait_reg_mem(struct amdgpu_ring *ring, int eng_sel,
      int mem_space, int opt, uint32_t addr0,
      uint32_t addr1, uint32_t ref, uint32_t mask,
      uint32_t inv)
{
 amdgpu_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5));
 amdgpu_ring_write(ring,
     /* memory (1) or register (0) */
     (WAIT_REG_MEM_MEM_SPACE(mem_space) |
     WAIT_REG_MEM_OPERATION(opt) | /* wait */
     WAIT_REG_MEM_FUNCTION(3) |  /* equal */
     WAIT_REG_MEM_ENGINE(eng_sel)));

 if (mem_space)
  BUG_ON(addr0 & 0x3); /* Dword align */
 amdgpu_ring_write(ring, addr0);
 amdgpu_ring_write(ring, addr1);
 amdgpu_ring_write(ring, ref);
 amdgpu_ring_write(ring, mask);
 amdgpu_ring_write(ring, inv); /* poll interval */
}

static int gfx_v9_0_ring_test_ring(struct amdgpu_ring *ring)
{
 struct amdgpu_device *adev = ring->adev;
 uint32_t scratch = SOC15_REG_OFFSET(GC, 0, mmSCRATCH_REG0);
 uint32_t tmp = 0;
 unsigned i;
 int r;

 WREG32(scratch, 0xCAFEDEAD);
 r = amdgpu_ring_alloc(ring, 3);
 if (r)
  return r;

 amdgpu_ring_write(ring, PACKET3(PACKET3_SET_UCONFIG_REG, 1));
 amdgpu_ring_write(ring, scratch - PACKET3_SET_UCONFIG_REG_START);
 amdgpu_ring_write(ring, 0xDEADBEEF);
 amdgpu_ring_commit(ring);

 for (i = 0; i < adev->usec_timeout; i++) {
  tmp = RREG32(scratch);
  if (tmp == 0xDEADBEEF)
   break;
  udelay(1);
 }

 if (i >= adev->usec_timeout)
  r = -ETIMEDOUT;
 return r;
}

static int gfx_v9_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
{
 struct amdgpu_device *adev = ring->adev;
 struct amdgpu_ib ib;
 struct dma_fence *f = NULL;

 unsigned index;
 uint64_t gpu_addr;
 uint32_t tmp;
 long r;

 r = amdgpu_device_wb_get(adev, &index);
 if (r)
  return r;

 gpu_addr = adev->wb.gpu_addr + (index * 4);
 adev->wb.wb[index] = cpu_to_le32(0xCAFEDEAD);
 memset(&ib, 0, sizeof(ib));

 r = amdgpu_ib_get(adev, NULL, 20, AMDGPU_IB_POOL_DIRECT, &ib);
 if (r)
  goto err1;

 ib.ptr[0] = PACKET3(PACKET3_WRITE_DATA, 3);
 ib.ptr[1] = WRITE_DATA_DST_SEL(5) | WR_CONFIRM;
 ib.ptr[2] = lower_32_bits(gpu_addr);
 ib.ptr[3] = upper_32_bits(gpu_addr);
 ib.ptr[4] = 0xDEADBEEF;
 ib.length_dw = 5;

 r = amdgpu_ib_schedule(ring, 1, &ib, NULL, &f);
 if (r)
  goto err2;

 r = dma_fence_wait_timeout(f, false, timeout);
 if (r == 0) {
  r = -ETIMEDOUT;
  goto err2;
 } else if (r < 0) {
  goto err2;
 }

 tmp = adev->wb.wb[index];
 if (tmp == 0xDEADBEEF)
  r = 0;
 else
  r = -EINVAL;

err2:
 amdgpu_ib_free(&ib, NULL);
 dma_fence_put(f);
err1:
 amdgpu_device_wb_free(adev, index);
 return r;
}


static void gfx_v9_0_free_microcode(struct amdgpu_device *adev)
{
 amdgpu_ucode_release(&adev->gfx.pfp_fw);
 amdgpu_ucode_release(&adev->gfx.me_fw);
 amdgpu_ucode_release(&adev->gfx.ce_fw);
 amdgpu_ucode_release(&adev->gfx.rlc_fw);
 amdgpu_ucode_release(&adev->gfx.mec_fw);
 amdgpu_ucode_release(&adev->gfx.mec2_fw);

 kfree(adev->gfx.rlc.register_list_format);
}

static void gfx_v9_0_check_fw_write_wait(struct amdgpu_device *adev)
{
 adev->gfx.me_fw_write_wait = false;
 adev->gfx.mec_fw_write_wait = false;

 if ((amdgpu_ip_version(adev, GC_HWIP, 0) != IP_VERSION(9, 4, 1)) &&
     (amdgpu_ip_version(adev, GC_HWIP, 0) != IP_VERSION(9, 4, 2)) &&
     ((adev->gfx.mec_fw_version < 0x000001a5) ||
      (adev->gfx.mec_feature_version < 46) ||
      (adev->gfx.pfp_fw_version < 0x000000b7) ||
      (adev->gfx.pfp_feature_version < 46)))
  DRM_WARN_ONCE("CP firmware version too old, please update!");

 switch (amdgpu_ip_version(adev, GC_HWIP, 0)) {
 case IP_VERSION(9, 0, 1):
  if ((adev->gfx.me_fw_version >= 0x0000009c) &&
      (adev->gfx.me_feature_version >= 42) &&
      (adev->gfx.pfp_fw_version >=  0x000000b1) &&
      (adev->gfx.pfp_feature_version >= 42))
   adev->gfx.me_fw_write_wait = true;

  if ((adev->gfx.mec_fw_version >=  0x00000193) &&
      (adev->gfx.mec_feature_version >= 42))
   adev->gfx.mec_fw_write_wait = true;
  break;
 case IP_VERSION(9, 2, 1):
  if ((adev->gfx.me_fw_version >= 0x0000009c) &&
      (adev->gfx.me_feature_version >= 44) &&
      (adev->gfx.pfp_fw_version >=  0x000000b2) &&
      (adev->gfx.pfp_feature_version >= 44))
   adev->gfx.me_fw_write_wait = true;

  if ((adev->gfx.mec_fw_version >=  0x00000196) &&
      (adev->gfx.mec_feature_version >= 44))
   adev->gfx.mec_fw_write_wait = true;
  break;
 case IP_VERSION(9, 4, 0):
  if ((adev->gfx.me_fw_version >= 0x0000009c) &&
      (adev->gfx.me_feature_version >= 44) &&
      (adev->gfx.pfp_fw_version >=  0x000000b2) &&
      (adev->gfx.pfp_feature_version >= 44))
   adev->gfx.me_fw_write_wait = true;

  if ((adev->gfx.mec_fw_version >=  0x00000197) &&
      (adev->gfx.mec_feature_version >= 44))
   adev->gfx.mec_fw_write_wait = true;
  break;
 case IP_VERSION(9, 1, 0):
 case IP_VERSION(9, 2, 2):
  if ((adev->gfx.me_fw_version >= 0x0000009c) &&
      (adev->gfx.me_feature_version >= 42) &&
      (adev->gfx.pfp_fw_version >=  0x000000b1) &&
      (adev->gfx.pfp_feature_version >= 42))
   adev->gfx.me_fw_write_wait = true;

  if ((adev->gfx.mec_fw_version >=  0x00000192) &&
      (adev->gfx.mec_feature_version >= 42))
   adev->gfx.mec_fw_write_wait = true;
  break;
 default:
  adev->gfx.me_fw_write_wait = true;
  adev->gfx.mec_fw_write_wait = true;
  break;
 }
}

struct amdgpu_gfxoff_quirk {
 u16 chip_vendor;
 u16 chip_device;
 u16 subsys_vendor;
 u16 subsys_device;
 u8 revision;
};

static const struct amdgpu_gfxoff_quirk amdgpu_gfxoff_quirk_list[] = {
 /* https://bugzilla.kernel.org/show_bug.cgi?id=204689 */
 { 0x1002, 0x15dd, 0x1002, 0x15dd, 0xc8 },
 /* https://bugzilla.kernel.org/show_bug.cgi?id=207171 */
 { 0x1002, 0x15dd, 0x103c, 0x83e7, 0xd3 },
 /* GFXOFF is unstable on C6 parts with a VBIOS 113-RAVEN-114 */
 { 0x1002, 0x15dd, 0x1002, 0x15dd, 0xc6 },
 /* Apple MacBook Pro (15-inch, 2019) Radeon Pro Vega 20 4 GB */
 { 0x1002, 0x69af, 0x106b, 0x019a, 0xc0 },
 /* https://bbs.openkylin.top/t/topic/171497 */
 { 0x1002, 0x15d8, 0x19e5, 0x3e14, 0xc2 },
 /* HP 705G4 DM with R5 2400G */
 { 0x1002, 0x15dd, 0x103c, 0x8464, 0xd6 },
 { 0, 0, 0, 0, 0 },
};

static bool gfx_v9_0_should_disable_gfxoff(struct pci_dev *pdev)
{
 const struct amdgpu_gfxoff_quirk *p = amdgpu_gfxoff_quirk_list;

 while (p && p->chip_device != 0) {
  if (pdev->vendor == p->chip_vendor &&
      pdev->device == p->chip_device &&
      pdev->subsystem_vendor == p->subsys_vendor &&
      pdev->subsystem_device == p->subsys_device &&
      pdev->revision == p->revision) {
   return true;
  }
  ++p;
 }
 return false;
}

static bool is_raven_kicker(struct amdgpu_device *adev)
{
 if (adev->pm.fw_version >= 0x41e2b)
  return true;
 else
  return false;
}

static bool check_if_enlarge_doorbell_range(struct amdgpu_device *adev)
{
 if ((amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(9, 3, 0)) &&
     (adev->gfx.me_fw_version >= 0x000000a5) &&
     (adev->gfx.me_feature_version >= 52))
  return true;
 else
  return false;
}

static void gfx_v9_0_check_if_need_gfxoff(struct amdgpu_device *adev)
{
 if (gfx_v9_0_should_disable_gfxoff(adev->pdev))
  adev->pm.pp_feature &= ~PP_GFXOFF_MASK;

 switch (amdgpu_ip_version(adev, GC_HWIP, 0)) {
 case IP_VERSION(9, 0, 1):
 case IP_VERSION(9, 2, 1):
 case IP_VERSION(9, 4, 0):
  break;
 case IP_VERSION(9, 2, 2):
 case IP_VERSION(9, 1, 0):
  if (!((adev->apu_flags & AMD_APU_IS_RAVEN2) ||
        (adev->apu_flags & AMD_APU_IS_PICASSO)) &&
      ((!is_raven_kicker(adev) &&
        adev->gfx.rlc_fw_version < 531) ||
       (adev->gfx.rlc_feature_version < 1) ||
       !adev->gfx.rlc.is_rlc_v2_1))
   adev->pm.pp_feature &= ~PP_GFXOFF_MASK;

  if (adev->pm.pp_feature & PP_GFXOFF_MASK)
   adev->pg_flags |= AMD_PG_SUPPORT_GFX_PG |
    AMD_PG_SUPPORT_CP |
    AMD_PG_SUPPORT_RLC_SMU_HS;
  break;
 case IP_VERSION(9, 3, 0):
  if (adev->pm.pp_feature & PP_GFXOFF_MASK)
   adev->pg_flags |= AMD_PG_SUPPORT_GFX_PG |
    AMD_PG_SUPPORT_CP |
    AMD_PG_SUPPORT_RLC_SMU_HS;
  break;
 default:
  break;
 }
}

static int gfx_v9_0_init_cp_gfx_microcode(struct amdgpu_device *adev,
       char *chip_name)
{
 int err;

 err = amdgpu_ucode_request(adev, &adev->gfx.pfp_fw,
       AMDGPU_UCODE_REQUIRED,
       "amdgpu/%s_pfp.bin", chip_name);
 if (err)
  goto out;
 amdgpu_gfx_cp_init_microcode(adev, AMDGPU_UCODE_ID_CP_PFP);

 err = amdgpu_ucode_request(adev, &adev->gfx.me_fw,
       AMDGPU_UCODE_REQUIRED,
       "amdgpu/%s_me.bin", chip_name);
 if (err)
  goto out;
 amdgpu_gfx_cp_init_microcode(adev, AMDGPU_UCODE_ID_CP_ME);

 err = amdgpu_ucode_request(adev, &adev->gfx.ce_fw,
       AMDGPU_UCODE_REQUIRED,
       "amdgpu/%s_ce.bin", chip_name);
 if (err)
  goto out;
 amdgpu_gfx_cp_init_microcode(adev, AMDGPU_UCODE_ID_CP_CE);

out:
 if (err) {
  amdgpu_ucode_release(&adev->gfx.pfp_fw);
  amdgpu_ucode_release(&adev->gfx.me_fw);
  amdgpu_ucode_release(&adev->gfx.ce_fw);
 }
 return err;
}

static int gfx_v9_0_init_rlc_microcode(struct amdgpu_device *adev,
           char *chip_name)
{
 int err;
 const struct rlc_firmware_header_v2_0 *rlc_hdr;
 uint16_t version_major;
 uint16_t version_minor;
 uint32_t smu_version;

 /*
 * For Picasso && AM4 SOCKET board, we use picasso_rlc_am4.bin
 * instead of picasso_rlc.bin.
 * Judgment method:
 * PCO AM4: revision >= 0xC8 && revision <= 0xCF
 *          or revision >= 0xD8 && revision <= 0xDF
 * otherwise is PCO FP5
 */

 if (!strcmp(chip_name, "picasso") &&
  (((adev->pdev->revision >= 0xC8) && (adev->pdev->revision <= 0xCF)) ||
  ((adev->pdev->revision >= 0xD8) && (adev->pdev->revision <= 0xDF))))
  err = amdgpu_ucode_request(adev, &adev->gfx.rlc_fw,
        AMDGPU_UCODE_REQUIRED,
        "amdgpu/%s_rlc_am4.bin", chip_name);
 else if (!strcmp(chip_name, "raven") && (amdgpu_pm_load_smu_firmware(adev, &smu_version) == 0) &&
  (smu_version >= 0x41e2b))
  /**
*SMC is loaded by SBIOS on APU and it's able to get the SMU version directly.
*/

  err = amdgpu_ucode_request(adev, &adev->gfx.rlc_fw,
        AMDGPU_UCODE_REQUIRED,
        "amdgpu/%s_kicker_rlc.bin", chip_name);
 else
  err = amdgpu_ucode_request(adev, &adev->gfx.rlc_fw,
        AMDGPU_UCODE_REQUIRED,
        "amdgpu/%s_rlc.bin", chip_name);
 if (err)
  goto out;

 rlc_hdr = (const struct rlc_firmware_header_v2_0 *)adev->gfx.rlc_fw->data;
 version_major = le16_to_cpu(rlc_hdr->header.header_version_major);
 version_minor = le16_to_cpu(rlc_hdr->header.header_version_minor);
 err = amdgpu_gfx_rlc_init_microcode(adev, version_major, version_minor);
out:
 if (err)
  amdgpu_ucode_release(&adev->gfx.rlc_fw);

 return err;
}

static bool gfx_v9_0_load_mec2_fw_bin_support(struct amdgpu_device *adev)
{
 if (amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(9, 4, 2) ||
     amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(9, 4, 1) ||
     amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(9, 3, 0))
  return false;

 return true;
}

static int gfx_v9_0_init_cp_compute_microcode(struct amdgpu_device *adev,
           char *chip_name)
{
 int err;

 if (amdgpu_sriov_vf(adev) && (adev->asic_type == CHIP_ALDEBARAN))
  err = amdgpu_ucode_request(adev, &adev->gfx.mec_fw,
       AMDGPU_UCODE_REQUIRED,
       "amdgpu/%s_sjt_mec.bin", chip_name);
 else
  err = amdgpu_ucode_request(adev, &adev->gfx.mec_fw,
        AMDGPU_UCODE_REQUIRED,
        "amdgpu/%s_mec.bin", chip_name);
 if (err)
  goto out;

 amdgpu_gfx_cp_init_microcode(adev, AMDGPU_UCODE_ID_CP_MEC1);
 amdgpu_gfx_cp_init_microcode(adev, AMDGPU_UCODE_ID_CP_MEC1_JT);

 if (gfx_v9_0_load_mec2_fw_bin_support(adev)) {
  if (amdgpu_sriov_vf(adev) && (adev->asic_type == CHIP_ALDEBARAN))
   err = amdgpu_ucode_request(adev, &adev->gfx.mec2_fw,
         AMDGPU_UCODE_REQUIRED,
         "amdgpu/%s_sjt_mec2.bin", chip_name);
  else
   err = amdgpu_ucode_request(adev, &adev->gfx.mec2_fw,
         AMDGPU_UCODE_REQUIRED,
         "amdgpu/%s_mec2.bin", chip_name);
  if (!err) {
   amdgpu_gfx_cp_init_microcode(adev, AMDGPU_UCODE_ID_CP_MEC2);
   amdgpu_gfx_cp_init_microcode(adev, AMDGPU_UCODE_ID_CP_MEC2_JT);
  } else {
   err = 0;
   amdgpu_ucode_release(&adev->gfx.mec2_fw);
  }
 } else {
--> --------------------

--> maximum size reached

--> --------------------

Messung V0.5
C=96 H=91 G=93

¤ Dauer der Verarbeitung: 0.16 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.