| /* |
| * 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 "gfx_v9_4.h" |
| #include "gfx_v9_0.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_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"); |
| |
| #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 |
| |
| 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, |
| }; |
| |
| static void gfx_v9_0_rlcg_w(struct amdgpu_device *adev, u32 offset, u32 v, u32 flag) |
| { |
| static void *scratch_reg0; |
| static void *scratch_reg1; |
| static void *scratch_reg2; |
| static void *scratch_reg3; |
| static void *spare_int; |
| static uint32_t grbm_cntl; |
| static uint32_t grbm_idx; |
| |
| scratch_reg0 = adev->rmmio + (adev->reg_offset[GC_HWIP][0][mmSCRATCH_REG0_BASE_IDX] + mmSCRATCH_REG0)*4; |
| scratch_reg1 = adev->rmmio + (adev->reg_offset[GC_HWIP][0][mmSCRATCH_REG1_BASE_IDX] + mmSCRATCH_REG1)*4; |
| scratch_reg2 = adev->rmmio + (adev->reg_offset[GC_HWIP][0][mmSCRATCH_REG1_BASE_IDX] + mmSCRATCH_REG2)*4; |
| scratch_reg3 = adev->rmmio + (adev->reg_offset[GC_HWIP][0][mmSCRATCH_REG1_BASE_IDX] + mmSCRATCH_REG3)*4; |
| spare_int = adev->rmmio + (adev->reg_offset[GC_HWIP][0][mmRLC_SPARE_INT_BASE_IDX] + mmRLC_SPARE_INT)*4; |
| |
| grbm_cntl = adev->reg_offset[GC_HWIP][0][mmGRBM_GFX_CNTL_BASE_IDX] + mmGRBM_GFX_CNTL; |
| grbm_idx = adev->reg_offset[GC_HWIP][0][mmGRBM_GFX_INDEX_BASE_IDX] + mmGRBM_GFX_INDEX; |
| |
| if (amdgpu_sriov_runtime(adev)) { |
| pr_err("shouldn't call rlcg write register during runtime\n"); |
| return; |
| } |
| |
| if (offset == grbm_cntl || offset == grbm_idx) { |
| if (offset == grbm_cntl) |
| writel(v, scratch_reg2); |
| else if (offset == grbm_idx) |
| writel(v, scratch_reg3); |
| |
| writel(v, ((void __iomem *)adev->rmmio) + (offset * 4)); |
| } else { |
| uint32_t i = 0; |
| uint32_t retries = 50000; |
| |
| writel(v, scratch_reg0); |
| writel(offset | 0x80000000, scratch_reg1); |
| writel(1, spare_int); |
| for (i = 0; i < retries; i++) { |
| u32 tmp; |
| |
| tmp = readl(scratch_reg1); |
| if (!(tmp & 0x80000000)) |
| break; |
| |
| udelay(10); |
| } |
| if (i >= retries) |
| pr_err("timeout: rlcg program reg:0x%05x failed !\n", offset); |
| } |
| |
| } |
| |
| static void gfx_v9_0_sriov_wreg(struct amdgpu_device *adev, u32 offset, |
| u32 v, u32 acc_flags, u32 hwip) |
| { |
| if ((acc_flags & AMDGPU_REGS_RLC) && |
| amdgpu_sriov_fullaccess(adev)) { |
| gfx_v9_0_rlcg_w(adev, offset, v, acc_flags); |
| |
| return; |
| } |
| |
| if (acc_flags & AMDGPU_REGS_NO_KIQ) |
| WREG32_NO_KIQ(offset, v); |
| else |
| WREG32(offset, v); |
| } |
| |
| #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); |
| static u64 gfx_v9_0_ring_get_rptr_compute(struct amdgpu_ring *ring); |
| static int 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); |
| static void gfx_v9_0_reset_ras_error_count(struct amdgpu_device *adev); |
| |
| static void gfx_v9_0_kiq_set_resources(struct amdgpu_ring *kiq_ring, |
| uint64_t queue_mask) |
| { |
| 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, 0); /* gws mask lo */ |
| amdgpu_ring_write(kiq_ring, 0); /* gws mask 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) |
| { |
| struct amdgpu_device *adev = kiq_ring->adev; |
| uint64_t mqd_addr = amdgpu_bo_gpu_offset(ring->mqd_obj); |
| uint64_t wptr_addr = adev->wb.gpu_addr + (ring->wptr_offs * 4); |
| 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(gpu_addr)); |
| amdgpu_ring_write(kiq_ring, upper_32_bits(gpu_addr)); |
| amdgpu_ring_write(kiq_ring, seq); |
| } 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 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, |
| .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.pmf = &gfx_v9_0_kiq_pm4_funcs; |
| } |
| |
| static void gfx_v9_0_init_golden_registers(struct amdgpu_device *adev) |
| { |
| switch (adev->asic_type) { |
| case CHIP_VEGA10: |
| 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 CHIP_VEGA12: |
| 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 CHIP_VEGA20: |
| 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 CHIP_ARCTURUS: |
| soc15_program_register_sequence(adev, |
| golden_settings_gc_9_4_1_arct, |
| ARRAY_SIZE(golden_settings_gc_9_4_1_arct)); |
| break; |
| case CHIP_RAVEN: |
| 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 CHIP_RENOIR: |
| 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 CHIP_ALDEBARAN: |
| gfx_v9_4_2_init_golden_registers(adev, |
| adev->smuio.funcs->get_die_id(adev)); |
| break; |
| default: |
| break; |
| } |
| |
| if ((adev->asic_type != CHIP_ARCTURUS) && |
| (adev->asic_type != CHIP_ALDEBARAN)) |
| 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_scratch_init(struct amdgpu_device *adev) |
| { |
| adev->gfx.scratch.num_reg = 8; |
| adev->gfx.scratch.reg_base = SOC15_REG_OFFSET(GC, 0, mmSCRATCH_REG0); |
| adev->gfx.scratch.free_mask = (1u << adev->gfx.scratch.num_reg) - 1; |
| } |
| |
| 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; |
| uint32_t tmp = 0; |
| unsigned i; |
| int r; |
| |
| r = amdgpu_gfx_scratch_get(adev, &scratch); |
| if (r) |
| return r; |
| |
| WREG32(scratch, 0xCAFEDEAD); |
| r = amdgpu_ring_alloc(ring, 3); |
| if (r) |
| goto error_free_scratch; |
| |
| 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; |
| |
| error_free_scratch: |
| amdgpu_gfx_scratch_free(adev, scratch); |
| 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, 16, |
| 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(adev, &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) |
| { |
| release_firmware(adev->gfx.pfp_fw); |
| adev->gfx.pfp_fw = NULL; |
| release_firmware(adev->gfx.me_fw); |
| adev->gfx.me_fw = NULL; |
| release_firmware(adev->gfx.ce_fw); |
| adev->gfx.ce_fw = NULL; |
| release_firmware(adev->gfx.rlc_fw); |
| adev->gfx.rlc_fw = NULL; |
| release_firmware(adev->gfx.mec_fw); |
| adev->gfx.mec_fw = NULL; |
| release_firmware(adev->gfx.mec2_fw); |
| adev->gfx.mec2_fw = NULL; |
| |
| kfree(adev->gfx.rlc.register_list_format); |
| } |
| |
| static void gfx_v9_0_init_rlc_ext_microcode(struct amdgpu_device *adev) |
| { |
| const struct rlc_firmware_header_v2_1 *rlc_hdr; |
| |
| rlc_hdr = (const struct rlc_firmware_header_v2_1 *)adev->gfx.rlc_fw->data; |
| adev->gfx.rlc_srlc_fw_version = le32_to_cpu(rlc_hdr->save_restore_list_cntl_ucode_ver); |
| adev->gfx.rlc_srlc_feature_version = le32_to_cpu(rlc_hdr->save_restore_list_cntl_feature_ver); |
| adev->gfx.rlc.save_restore_list_cntl_size_bytes = le32_to_cpu(rlc_hdr->save_restore_list_cntl_size_bytes); |
| adev->gfx.rlc.save_restore_list_cntl = (u8 *)rlc_hdr + le32_to_cpu(rlc_hdr->save_restore_list_cntl_offset_bytes); |
| adev->gfx.rlc_srlg_fw_version = le32_to_cpu(rlc_hdr->save_restore_list_gpm_ucode_ver); |
| adev->gfx.rlc_srlg_feature_version = le32_to_cpu(rlc_hdr->save_restore_list_gpm_feature_ver); |
| adev->gfx.rlc.save_restore_list_gpm_size_bytes = le32_to_cpu(rlc_hdr->save_restore_list_gpm_size_bytes); |
| adev->gfx.rlc.save_restore_list_gpm = (u8 *)rlc_hdr + le32_to_cpu(rlc_hdr->save_restore_list_gpm_offset_bytes); |
| adev->gfx.rlc_srls_fw_version = le32_to_cpu(rlc_hdr->save_restore_list_srm_ucode_ver); |
| adev->gfx.rlc_srls_feature_version = le32_to_cpu(rlc_hdr->save_restore_list_srm_feature_ver); |
| adev->gfx.rlc.save_restore_list_srm_size_bytes = le32_to_cpu(rlc_hdr->save_restore_list_srm_size_bytes); |
| adev->gfx.rlc.save_restore_list_srm = (u8 *)rlc_hdr + le32_to_cpu(rlc_hdr->save_restore_list_srm_offset_bytes); |
| adev->gfx.rlc.reg_list_format_direct_reg_list_length = |
| le32_to_cpu(rlc_hdr->reg_list_format_direct_reg_list_length); |
| } |
| |
| 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 ((adev->asic_type != CHIP_ARCTURUS) && |
| ((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 (adev->asic_type) { |
| case CHIP_VEGA10: |
| 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 CHIP_VEGA12: |
| 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 CHIP_VEGA20: |
| 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 CHIP_RAVEN: |
| 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 }, |
| { 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 ((adev->asic_type == CHIP_RENOIR) && |
| (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 (adev->asic_type) { |
| case CHIP_VEGA10: |
| case CHIP_VEGA12: |
| case CHIP_VEGA20: |
| break; |
| case CHIP_RAVEN: |
| 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 CHIP_RENOIR: |
| 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, |
| const char *chip_name) |
| { |
| char fw_name[30]; |
| int err; |
| struct amdgpu_firmware_info *info = NULL; |
| const struct common_firmware_header *header = NULL; |
| const struct gfx_firmware_header_v1_0 *cp_hdr; |
| |
| snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_pfp.bin", chip_name); |
| err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev); |
| if (err) |
| goto out; |
| err = amdgpu_ucode_validate(adev->gfx.pfp_fw); |
| if (err) |
| goto out; |
| cp_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.pfp_fw->data; |
| adev->gfx.pfp_fw_version = le32_to_cpu(cp_hdr->header.ucode_version); |
| adev->gfx.pfp_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version); |
| |
| snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me.bin", chip_name); |
| err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev); |
| if (err) |
| goto out; |
| err = amdgpu_ucode_validate(adev->gfx.me_fw); |
| if (err) |
| goto out; |
| cp_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.me_fw->data; |
| adev->gfx.me_fw_version = le32_to_cpu(cp_hdr->header.ucode_version); |
| adev->gfx.me_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version); |
| |
| snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce.bin", chip_name); |
| err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev); |
| if (err) |
| goto out; |
| err = amdgpu_ucode_validate(adev->gfx.ce_fw); |
| if (err) |
| goto out; |
| cp_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.ce_fw->data; |
| adev->gfx.ce_fw_version = le32_to_cpu(cp_hdr->header.ucode_version); |
| adev->gfx.ce_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version); |
| |
| if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) { |
| info = &adev->firmware.ucode[AMDGPU_UCODE_ID_CP_PFP]; |
| info->ucode_id = AMDGPU_UCODE_ID_CP_PFP; |
| info->fw = adev->gfx.pfp_fw; |
| header = (const struct common_firmware_header *)info->fw->data; |
| adev->firmware.fw_size += |
| ALIGN(le32_to_cpu(header->ucode_size_bytes), PAGE_SIZE); |
| |
| info = &adev->firmware.ucode[AMDGPU_UCODE_ID_CP_ME]; |
| info->ucode_id = AMDGPU_UCODE_ID_CP_ME; |
| info->fw = adev->gfx.me_fw; |
| header = (const struct common_firmware_header *)info->fw->data; |
| adev->firmware.fw_size += |
| ALIGN(le32_to_cpu(header->ucode_size_bytes), PAGE_SIZE); |
| |
| info = &adev->firmware.ucode[AMDGPU_UCODE_ID_CP_CE]; |
| info->ucode_id = AMDGPU_UCODE_ID_CP_CE; |
| info->fw = adev->gfx.ce_fw; |
| header = (const struct common_firmware_header *)info->fw->data; |
| adev->firmware.fw_size += |
| ALIGN(le32_to_cpu(header->ucode_size_bytes), PAGE_SIZE); |
| } |
| |
| out: |
| if (err) { |
| dev_err(adev->dev, |
| "gfx9: Failed to load firmware \"%s\"\n", |
| fw_name); |
| release_firmware(adev->gfx.pfp_fw); |
| adev->gfx.pfp_fw = NULL; |
| release_firmware(adev->gfx.me_fw); |
| adev->gfx.me_fw = NULL; |
| release_firmware(adev->gfx.ce_fw); |
| adev->gfx.ce_fw = NULL; |
| } |
| return err; |
| } |
| |
| static int gfx_v9_0_init_rlc_microcode(struct amdgpu_device *adev, |
| const char *chip_name) |
| { |
| char fw_name[30]; |
| int err; |
| struct amdgpu_firmware_info *info = NULL; |
| const struct common_firmware_header *header = NULL; |
| const struct rlc_firmware_header_v2_0 *rlc_hdr; |
| unsigned int *tmp = NULL; |
| unsigned int i = 0; |
| 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)))) |
| snprintf(fw_name, sizeof(fw_name), "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. |
| */ |
| snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_kicker_rlc.bin", chip_name); |
| else |
| snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc.bin", chip_name); |
| err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev); |
| if (err) |
| goto out; |
| err = amdgpu_ucode_validate(adev->gfx.rlc_fw); |
| 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); |
| if (version_major == 2 && version_minor == 1) |
| adev->gfx.rlc.is_rlc_v2_1 = true; |
| |
| adev->gfx.rlc_fw_version = le32_to_cpu(rlc_hdr->header.ucode_version); |
| adev->gfx.rlc_feature_version = le32_to_cpu(rlc_hdr->ucode_feature_version); |
| adev->gfx.rlc.save_and_restore_offset = |
| le32_to_cpu(rlc_hdr->save_and_restore_offset); |
| adev->gfx.rlc.clear_state_descriptor_offset = |
| le32_to_cpu(rlc_hdr->clear_state_descriptor_offset); |
| adev->gfx.rlc.avail_scratch_ram_locations = |
| le32_to_cpu(rlc_hdr->avail_scratch_ram_locations); |
| adev->gfx.rlc.reg_restore_list_size = |
| le32_to_cpu(rlc_hdr->reg_restore_list_size); |
| adev->gfx.rlc.reg_list_format_start = |
| le32_to_cpu(rlc_hdr->reg_list_format_start); |
| adev->gfx.rlc.reg_list_format_separate_start = |
| le32_to_cpu(rlc_hdr->reg_list_format_separate_start); |
| adev->gfx.rlc.starting_offsets_start = |
| le32_to_cpu(rlc_hdr->starting_offsets_start); |
| adev->gfx.rlc.reg_list_format_size_bytes = |
| le32_to_cpu(rlc_hdr->reg_list_format_size_bytes); |
| adev->gfx.rlc.reg_list_size_bytes = |
| le32_to_cpu(rlc_hdr->reg_list_size_bytes); |
| adev->gfx.rlc.register_list_format = |
| kmalloc(adev->gfx.rlc.reg_list_format_size_bytes + |
| adev->gfx.rlc.reg_list_size_bytes, GFP_KERNEL); |
| if (!adev->gfx.rlc.register_list_format) { |
| err = -ENOMEM; |
| goto out; |
| } |
| |
| tmp = (unsigned int *)((uintptr_t)rlc_hdr + |
| le32_to_cpu(rlc_hdr->reg_list_format_array_offset_bytes)); |
| for (i = 0 ; i < (adev->gfx.rlc.reg_list_format_size_bytes >> 2); i++) |
| adev->gfx.rlc.register_list_format[i] = le32_to_cpu(tmp[i]); |
| |
| adev->gfx.rlc.register_restore = adev->gfx.rlc.register_list_format + i; |
| |
| tmp = (unsigned int *)((uintptr_t)rlc_hdr + |
| le32_to_cpu(rlc_hdr->reg_list_array_offset_bytes)); |
| for (i = 0 ; i < (adev->gfx.rlc.reg_list_size_bytes >> 2); i++) |
| adev->gfx.rlc.register_restore[i] = le32_to_cpu(tmp[i]); |
| |
| if (adev->gfx.rlc.is_rlc_v2_1) |
| gfx_v9_0_init_rlc_ext_microcode(adev); |
| |
| if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) { |
| info = &adev->firmware.ucode[AMDGPU_UCODE_ID_RLC_G]; |
| info->ucode_id = AMDGPU_UCODE_ID_RLC_G; |
| info->fw = adev->gfx.rlc_fw; |
| header = (const struct common_firmware_header *)info->fw->data; |
| adev->firmware.fw_size += |
| ALIGN(le32_to_cpu(header->ucode_size_bytes), PAGE_SIZE); |
| |
| if (adev->gfx.rlc.is_rlc_v2_1 && |
| adev->gfx.rlc.save_restore_list_cntl_size_bytes && |
| adev->gfx.rlc.save_restore_list_gpm_size_bytes && |
| adev->gfx.rlc.save_restore_list_srm_size_bytes) { |
| info = &adev->firmware.ucode[AMDGPU_UCODE_ID_RLC_RESTORE_LIST_CNTL]; |
| info->ucode_id = AMDGPU_UCODE_ID_RLC_RESTORE_LIST_CNTL; |
| info->fw = adev->gfx.rlc_fw; |
| adev->firmware.fw_size += |
| ALIGN(adev->gfx.rlc.save_restore_list_cntl_size_bytes, PAGE_SIZE); |
| |
| info = &adev->firmware.ucode[AMDGPU_UCODE_ID_RLC_RESTORE_LIST_GPM_MEM]; |
| info->ucode_id = AMDGPU_UCODE_ID_RLC_RESTORE_LIST_GPM_MEM; |
| info->fw = adev->gfx.rlc_fw; |
| adev->firmware.fw_size += |
| ALIGN(adev->gfx.rlc.save_restore_list_gpm_size_bytes, PAGE_SIZE); |
| |
| info = &adev->firmware.ucode[AMDGPU_UCODE_ID_RLC_RESTORE_LIST_SRM_MEM]; |
| info->ucode_id = AMDGPU_UCODE_ID_RLC_RESTORE_LIST_SRM_MEM; |
| info->fw = adev->gfx.rlc_fw; |
| adev->firmware.fw_size += |
| ALIGN(adev->gfx.rlc.save_restore_list_srm_size_bytes, PAGE_SIZE); |
| } |
| } |
| |
| out: |
| if (err) { |
| dev_err(adev->dev, |
| "gfx9: Failed to load firmware \"%s\"\n", |
| fw_name); |
| release_firmware(adev->gfx.rlc_fw); |
| adev->gfx.rlc_fw = NULL; |
| } |
| return err; |
| } |
| |
| static bool gfx_v9_0_load_mec2_fw_bin_support(struct amdgpu_device *adev) |
| { |
| if (adev->asic_type == CHIP_ALDEBARAN || |
| adev->asic_type == CHIP_ARCTURUS || |
| adev->asic_type == CHIP_RENOIR) |
| return false; |
| |
| return true; |
| } |
| |
| static int gfx_v9_0_init_cp_compute_microcode(struct amdgpu_device *adev, |
| const char *chip_name) |
| { |
| char fw_name[30]; |
| int err; |
| struct amdgpu_firmware_info *info = NULL; |
| const struct common_firmware_header *header = NULL; |
| const struct gfx_firmware_header_v1_0 *cp_hdr; |
| |
| snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec.bin", chip_name); |
| err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev); |
| if (err) |
| goto out; |
| err = amdgpu_ucode_validate(adev->gfx.mec_fw); |
| if (err) |
| goto out; |
| cp_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec_fw->data; |
| adev->gfx.mec_fw_version = le32_to_cpu(cp_hdr->header.ucode_version); |
| adev->gfx.mec_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version); |
| |
| |
| if (gfx_v9_0_load_mec2_fw_bin_support(adev)) { |
| snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec2.bin", chip_name); |
| err = request_firmware(&adev->gfx.mec2_fw, fw_name, adev->dev); |
| if (!err) { |
| err = amdgpu_ucode_validate(adev->gfx.mec2_fw); |
| if (err) |
| goto out; |
| cp_hdr = (const struct gfx_firmware_header_v1_0 *) |
| adev->gfx.mec2_fw->data; |
| adev->gfx.mec2_fw_version = |
| le32_to_cpu(cp_hdr->header.ucode_version); |
| adev->gfx.mec2_feature_version = |
| le32_to_cpu(cp_hdr->ucode_feature_version); |
| } else { |
| err = 0; |
| adev->gfx.mec2_fw = NULL; |
| } |
| } else { |
| adev->gfx.mec2_fw_version = adev->gfx.mec_fw_version; |
| adev->gfx.mec2_feature_version = adev->gfx.mec_feature_version; |
| } |
| |
| if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) { |
| info = &adev->firmware.ucode[AMDGPU_UCODE_ID_CP_MEC1]; |
| info->ucode_id = AMDGPU_UCODE_ID_CP_MEC1; |
| info->fw = adev->gfx.mec_fw; |
| header = (const struct common_firmware_header *)info->fw->data; |
| cp_hdr = (const struct gfx_firmware_header_v1_0 *)info->fw->data; |
| adev->firmware.fw_size += |
| ALIGN(le32_to_cpu(header->ucode_size_bytes) - le32_to_cpu(cp_hdr->jt_size) * 4, PAGE_SIZE); |
| |
| info = &adev->firmware.ucode[AMDGPU_UCODE_ID_CP_MEC1_JT]; |
| info->ucode_id = AMDGPU_UCODE_ID_CP_MEC1_JT; |
| info->fw = adev->gfx.mec_fw; |
| adev->firmware.fw_size += |
| ALIGN(le32_to_cpu(cp_hdr->jt_size) * 4, PAGE_SIZE); |
| |
| if (adev->gfx.mec2_fw) { |
| info = &adev->firmware.ucode[AMDGPU_UCODE_ID_CP_MEC2]; |
| info->ucode_id = AMDGPU_UCODE_ID_CP_MEC2; |
| info->fw = adev->gfx.mec2_fw; |
| header = (const struct common_firmware_header *)info->fw->data; |
| cp_hdr = (const struct gfx_firmware_header_v1_0 *)info->fw->data; |
| adev->firmware.fw_size += |
| ALIGN(le32_to_cpu(header->ucode_size_bytes) - le32_to_cpu(cp_hdr->jt_size) * 4, PAGE_SIZE); |
| |
| /* TODO: Determine if MEC2 JT FW loading can be removed |
| for all GFX V9 asic and above */ |
| if (gfx_v9_0_load_mec2_fw_bin_support(adev)) { |
| info = &adev->firmware.ucode[AMDGPU_UCODE_ID_CP_MEC2_JT]; |
| info->ucode_id = AMDGPU_UCODE_ID_CP_MEC2_JT; |
| info->fw = adev->gfx.mec2_fw; |
| adev->firmware.fw_size += |
| ALIGN(le32_to_cpu(cp_hdr->jt_size) * 4, |
| PAGE_SIZE); |
| } |
| } |
| } |
| |
| out: |
| gfx_v9_0_check_if_need_gfxoff(adev); |
| gfx_v9_0_check_fw_write_wait(adev); |
| if (err) { |
| dev_err(adev->dev, |
| "gfx9: Failed to load firmware \"%s\"\n", |
| fw_name); |
| release_firmware(adev->gfx.mec_fw); |
| adev->gfx.mec_fw = NULL; |
| release_firmware(adev->gfx.mec2_fw); |
| adev->gfx.mec2_fw = NULL; |
| } |
| return err; |
| } |
| |
| static int gfx_v9_0_init_microcode(struct amdgpu_device *adev) |
| { |
| const char *chip_name; |
| int r; |
| |
| DRM_DEBUG("\n"); |
| |
| switch (adev->asic_type) { |
| case CHIP_VEGA10: |
| chip_name = "vega10"; |
| break; |
| case CHIP_VEGA12: |
| chip_name = "vega12"; |
| break; |
| case CHIP_VEGA20: |
| chip_name = "vega20"; |
| break; |
| case CHIP_RAVEN: |
| if (adev->apu_flags & AMD_APU_IS_RAVEN2) |
| chip_name = "raven2"; |
| else if (adev->apu_flags & AMD_APU_IS_PICASSO) |
| chip_name = "picasso"; |
| else |
| chip_name = "raven"; |
| break; |
| case CHIP_ARCTURUS: |
| chip_name = "arcturus"; |
| break; |
| case CHIP_RENOIR: |
| if (adev->apu_flags & AMD_APU_IS_RENOIR) |
| chip_name = "renoir"; |
| else |
| chip_name = "green_sardine"; |
| break; |
| case CHIP_ALDEBARAN: |
| chip_name = "aldebaran"; |
| break; |
| default: |
| BUG(); |
| } |
| |
| /* No CPG in Arcturus */ |
| if (adev->gfx.num_gfx_rings) { |
| r = gfx_v9_0_init_cp_gfx_microcode(adev, chip_name); |
| if (r) |
| return r; |
| } |
| |
| r = gfx_v9_0_init_rlc_microcode(adev, chip_name); |
| if (r) |
| return r; |
| |
| r = gfx_v9_0_init_cp_compute_microcode(adev, chip_name); |
| if (r) |
| return r; |
| |
| return r; |
| } |
| |
| static u32 gfx_v9_0_get_csb_size(struct amdgpu_device *adev) |
| { |
| u32 count = 0; |
| const struct cs_section_def *sect = NULL; |
| const struct cs_extent_def *ext = NULL; |
| |
| /* begin clear state */ |
| count += 2; |
| /* context control state */ |
| count += 3; |
| |
| for (sect = gfx9_cs_data; sect->section != NULL; ++sect) { |
| for (ext = sect->section; ext->extent != NULL; ++ext) { |
| if (sect->id == SECT_CONTEXT) |
| count += 2 + ext->reg_count; |
| else |
| return 0; |
| } |
| } |
| |
| /* end clear state */ |
| count += 2; |
| /* clear state */ |
| count += 2; |
| |
| return count; |
| } |
| |
| static void gfx_v9_0_get_csb_buffer(struct amdgpu_device *adev, |
| volatile u32 *buffer) |
| { |
| u32 count = 0, i; |
| const struct cs_section_def *sect = NULL; |
| const struct cs_extent_def *ext = NULL; |
| |
| if (adev->gfx.rlc.cs_data == NULL) |
| return; |
| if (buffer == NULL) |
| return; |
| |
| buffer[count++] = cpu_to_le32(PACKET3(PACKET3_PREAMBLE_CNTL, 0)); |
| buffer[count++] = cpu_to_le32(PACKET3_PREAMBLE_BEGIN_CLEAR_STATE); |
| |
| buffer[count++] = cpu_to_le32(PACKET3(PACKET3_CONTEXT_CONTROL, 1)); |
| buffer[count++] = cpu_to_le32(0x80000000); |
| buffer[count++] = cpu_to_le32(0x80000000); |
| |
| for (sect = adev->gfx.rlc.cs_data; sect->section != NULL; ++sect) { |
| for (ext = sect->section; ext->extent != NULL; ++ext) { |
| if (sect->id == SECT_CONTEXT) { |
| buffer[count++] = |
| cpu_to_le32(PACKET3(PACKET3_SET_CONTEXT_REG, ext->reg_count)); |
| buffer[count++] = cpu_to_le32(ext->reg_index - |
| PACKET3_SET_CONTEXT_REG_START); |
| for (i = 0; i < ext->reg_count; i++) |
| buffer[count++] = cpu_to_le32(ext->extent[i]); |
| } else { |
| return; |
| } |
| } |
| } |
| |
| buffer[count++] = cpu_to_le32(PACKET3(PACKET3_PREAMBLE_CNTL, 0)); |
| buffer[count++] = cpu_to_le32(PACKET3_PREAMBLE_END_CLEAR_STATE); |
| |
| buffer[count++] = cpu_to_le32(PACKET3(PACKET3_CLEAR_STATE, 0)); |
| buffer[count++] = cpu_to_le32(0); |
| } |
| |
| static void gfx_v9_0_init_always_on_cu_mask(struct amdgpu_device *adev) |
| { |
| struct amdgpu_cu_info *cu_info = &adev->gfx.cu_info; |
| uint32_t pg_always_on_cu_num = 2; |
| uint32_t always_on_cu_num; |
| uint32_t i, j, k; |
| uint32_t mask, cu_bitmap, counter; |
| |
| if (adev->flags & AMD_IS_APU) |
| always_on_cu_num = 4; |
| else if (adev->asic_type == CHIP_VEGA12) |
| always_on_cu_num = 8; |
| else |
| always_on_cu_num = 12; |
| |
| mutex_lock(&adev->grbm_idx_mutex); |
| for (i = 0; i < adev->gfx.config.max_shader_engines; i++) { |
| for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) { |
| mask = 1; |
| cu_bitmap = 0; |
| counter = 0; |
| gfx_v9_0_select_se_sh(adev, i, j, 0xffffffff); |
| |
| for (k = 0; k < adev->gfx.config.max_cu_per_sh; k ++) { |
| if (cu_info->bitmap[i][j] & mask) { |
| if (counter == pg_always_on_cu_num) |
| WREG32_SOC15(GC, 0, mmRLC_PG_ALWAYS_ON_CU_MASK, cu_bitmap); |
| if (counter < always_on_cu_num) |
| cu_bitmap |= mask; |
| else |
| break; |
| counter++; |
| } |
| mask <<= 1; |
| } |
| |
| WREG32_SOC15(GC, 0, mmRLC_LB_ALWAYS_ACTIVE_CU_MASK, cu_bitmap); |
| cu_info->ao_cu_bitmap[i][j] = cu_bitmap; |
| } |
| } |
| gfx_v9_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); |
| mutex_unlock(&adev->grbm_idx_mutex); |
| } |
| |
| static void gfx_v9_0_init_lbpw(struct amdgpu_device *adev) |
| { |
| uint32_t data; |
| |
| /* set mmRLC_LB_THR_CONFIG_1/2/3/4 */ |
| WREG32_SOC15(GC, 0, mmRLC_LB_THR_CONFIG_1, 0x0000007F); |
| WREG32_SOC15(GC, 0, mmRLC_LB_THR_CONFIG_2, 0x0333A5A7); |
| WREG32_SOC15(GC, 0, mmRLC_LB_THR_CONFIG_3, 0x00000077); |
| WREG32_SOC15(GC, 0, mmRLC_LB_THR_CONFIG_4, (0x30 | 0x40 << 8 | 0x02FA << 16)); |
| |
| /* set mmRLC_LB_CNTR_INIT = 0x0000_0000 */ |
| WREG32_SOC15(GC, 0, mmRLC_LB_CNTR_INIT, 0x00000000); |
| |
| /* set mmRLC_LB_CNTR_MAX = 0x0000_0500 */ |
| WREG32_SOC15(GC, 0, mmRLC_LB_CNTR_MAX, 0x00000500); |
| |
| mutex_lock(&adev->grbm_idx_mutex); |
| /* set mmRLC_LB_INIT_CU_MASK thru broadcast mode to enable all SE/SH*/ |
| gfx_v9_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); |
| WREG32_SOC15(GC, 0, mmRLC_LB_INIT_CU_MASK, 0xffffffff); |
| |
| /* set mmRLC_LB_PARAMS = 0x003F_1006 */ |
| data = REG_SET_FIELD(0, RLC_LB_PARAMS, FIFO_SAMPLES, 0x0003); |
| data |= REG_SET_FIELD(data, RLC_LB_PARAMS, PG_IDLE_SAMPLES, 0x0010); |
| data |= REG_SET_FIELD(data, RLC_LB_PARAMS, PG_IDLE_SAMPLE_INTERVAL, 0x033F); |
| WREG32_SOC15(GC, 0, mmRLC_LB_PARAMS, data); |
| |
| /* set mmRLC_GPM_GENERAL_7[31-16] = 0x00C0 */ |
| data = RREG32_SOC15(GC, 0, mmRLC_GPM_GENERAL_7); |
| data &= 0x0000FFFF; |
| data |= 0x00C00000; |
| WREG32_SOC15(GC, 0, mmRLC_GPM_GENERAL_7, data); |
| |
| /* |
| * RLC_LB_ALWAYS_ACTIVE_CU_MASK = 0xF (4 CUs AON for Raven), |
| * programmed in gfx_v9_0_init_always_on_cu_mask() |
| */ |
| |
| /* set RLC_LB_CNTL = 0x8000_0095, 31 bit is reserved, |
| * but used for RLC_LB_CNTL configuration */ |
| data = RLC_LB_CNTL__LB_CNT_SPIM_ACTIVE_MASK; |
| data |= REG_SET_FIELD(data, RLC_LB_CNTL, CU_MASK_USED_OFF_HYST, 0x09); |
| data |= REG_SET_FIELD(data, RLC_LB_CNTL, RESERVED, 0x80000); |
| WREG32_SOC15(GC, 0, mmRLC_LB_CNTL, data); |
| mutex_unlock(&adev->grbm_idx_mutex); |
| |
| gfx_v9_0_init_always_on_cu_mask(adev); |
| } |
| |
| static void gfx_v9_4_init_lbpw(struct amdgpu_device *adev) |
| { |
| uint32_t data; |
| |
| /* set mmRLC_LB_THR_CONFIG_1/2/3/4 */ |
| WREG32_SOC15(GC, 0, mmRLC_LB_THR_CONFIG_1, 0x0000007F); |
| WREG32_SOC15(GC, 0, mmRLC_LB_THR_CONFIG_2, 0x033388F8); |
| WREG32_SOC15(GC, 0, mmRLC_LB_THR_CONFIG_3, 0x00000077); |
| WREG32_SOC15(GC, 0, mmRLC_LB_THR_CONFIG_4, (0x10 | 0x27 << 8 | 0x02FA << 16)); |
| |
| /* set mmRLC_LB_CNTR_INIT = 0x0000_0000 */ |
| WREG32_SOC15(GC, 0, mmRLC_LB_CNTR_INIT, 0x00000000); |
| |
| /* set mmRLC_LB_CNTR_MAX = 0x0000_0500 */ |
| WREG32_SOC15(GC, 0, mmRLC_LB_CNTR_MAX, 0x00000800); |
| |
| mutex_lock(&adev->grbm_idx_mutex); |
| /* set mmRLC_LB_INIT_CU_MASK thru broadcast mode to enable all SE/SH*/ |
| gfx_v9_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); |
| WREG32_SOC15(GC, 0, mmRLC_LB_INIT_CU_MASK, 0xffffffff); |
| |
| /* set mmRLC_LB_PARAMS = 0x003F_1006 */ |
| data = REG_SET_FIELD(0, RLC_LB_PARAMS, FIFO_SAMPLES, 0x0003); |
| data |= REG_SET_FIELD(data, RLC_LB_PARAMS, PG_IDLE_SAMPLES, 0x0010); |
| data |= REG_SET_FIELD(data, RLC_LB_PARAMS, PG_IDLE_SAMPLE_INTERVAL, 0x033F); |
| WREG32_SOC15(GC, 0, mmRLC_LB_PARAMS, data); |
| |
| /* set mmRLC_GPM_GENERAL_7[31-16] = 0x00C0 */ |
| data = RREG32_SOC15(GC, 0, mmRLC_GPM_GENERAL_7); |
| data &= 0x0000FFFF; |
| data |= 0x00C00000; |
| WREG32_SOC15(GC, 0, mmRLC_GPM_GENERAL_7, data); |
| |
| /* |
| * RLC_LB_ALWAYS_ACTIVE_CU_MASK = 0xFFF (12 CUs AON), |
| * programmed in gfx_v9_0_init_always_on_cu_mask() |
| */ |
| |
| /* set RLC_LB_CNTL = 0x8000_0095, 31 bit is reserved, |
| * but used for RLC_LB_CNTL configuration */ |
| data = RLC_LB_CNTL__LB_CNT_SPIM_ACTIVE_MASK; |
| data |= REG_SET_FIELD(data, RLC_LB_CNTL, CU_MASK_USED_OFF_HYST, 0x09); |
| data |= REG_SET_FIELD(data, RLC_LB_CNTL, RESERVED, 0x80000); |
| WREG32_SOC15(GC, 0, mmRLC_LB_CNTL, data); |
| mutex_unlock(&adev->grbm_idx_mutex); |
| |
| gfx_v9_0_init_always_on_cu_mask(adev); |
| } |
| |
| static void gfx_v9_0_enable_lbpw(struct amdgpu_device *adev, bool enable) |
| { |
| WREG32_FIELD15(GC, 0, RLC_LB_CNTL, LOAD_BALANCE_ENABLE, enable ? 1 : 0); |
| } |
| |
| static int gfx_v9_0_cp_jump_table_num(struct amdgpu_device *adev) |
| { |
| if (gfx_v9_0_load_mec2_fw_bin_support(adev)) |
| return 5; |
| else |
| return 4; |
| } |
| |
| static int gfx_v9_0_rlc_init(struct amdgpu_device *adev) |
| { |
| const struct cs_section_def *cs_data; |
| int r; |
| |
| adev->gfx.rlc.cs_data = gfx9_cs_data; |
| |
| cs_data = adev->gfx.rlc.cs_data; |
| |
| if (cs_data) { |
| /* init clear state block */ |
| r = amdgpu_gfx_rlc_init_csb(adev); |
| if (r) |
| return r; |
| } |
| |
| if (adev->flags & AMD_IS_APU) { |
| /* TODO: double check the cp_table_size for RV */ |
| adev->gfx.rlc.cp_table_size = ALIGN(96 * 5 * 4, 2048) + (64 * 1024); /* JT + GDS */ |
| r = amdgpu_gfx_rlc_init_cpt(adev); |
| if (r) |
| return r; |
| } |
| |
| switch (adev->asic_type) { |
| case CHIP_RAVEN: |
| gfx_v9_0_init_lbpw(adev); |
| break; |
| case CHIP_VEGA20: |
| gfx_v9_4_init_lbpw(adev); |
| break; |
| default: |
| break; |
| } |
| |
| /* init spm vmid with 0xf */ |
| if (adev->gfx.rlc.funcs->update_spm_vmid) |
| adev->gfx.rlc.funcs->update_spm_vmid(adev, 0xf); |
| |
| return 0; |
| } |
| |
| static void gfx_v9_0_mec_fini(struct amdgpu_device *adev) |
| { |
| amdgpu_bo_free_kernel(&adev->gfx.mec.hpd_eop_obj, NULL, NULL); |
| amdgpu_bo_free_kernel(&adev->gfx.mec.mec_fw_obj, NULL, NULL); |
| } |
| |
| static int gfx_v9_0_mec_init(struct amdgpu_device *adev) |
| { |
| int r; |
| u32 *hpd; |
| const __le32 *fw_data; |
| unsigned fw_size; |
| u32 *fw; |
| size_t mec_hpd_size; |
| |
| const struct gfx_firmware_header_v1_0 *mec_hdr; |
| |
| bitmap_zero(adev->gfx.mec.queue_bitmap, AMDGPU_MAX_COMPUTE_QUEUES); |
| |
| /* take ownership of the relevant compute queues */ |
| amdgpu_gfx_compute_queue_acquire(adev); |
| mec_hpd_size = adev->gfx.num_compute_rings * GFX9_MEC_HPD_SIZE; |
| if (mec_hpd_size) { |
| r = amdgpu_bo_create_reserved(adev, mec_hpd_size, PAGE_SIZE, |
| AMDGPU_GEM_DOMAIN_VRAM, |
| &adev->gfx.mec.hpd_eop_obj, |
| &adev->gfx.mec.hpd_eop_gpu_addr, |
| (void **)&hpd); |
| if (r) { |
| dev_warn(adev->dev, "(%d) create HDP EOP bo failed\n", r); |
| gfx_v9_0_mec_fini(adev); |
| return r; |
| } |
| |
| memset(hpd, 0, mec_hpd_size); |
| |
| amdgpu_bo_kunmap(adev->gfx.mec.hpd_eop_obj); |
| amdgpu_bo_unreserve(adev->gfx.mec.hpd_eop_obj); |
| } |
| |
| mec_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec_fw->data; |
| |
| fw_data = (const __le32 *) |
| (adev->gfx.mec_fw->data + |
| le32_to_cpu(mec_hdr->header.ucode_array_offset_bytes)); |
| fw_size = le32_to_cpu(mec_hdr->header.ucode_size_bytes); |
| |
| r = amdgpu_bo_create_reserved(adev, mec_hdr->header.ucode_size_bytes, |
| PAGE_SIZE, AMDGPU_GEM_DOMAIN_GTT, |
| &adev->gfx.mec.mec_fw_obj, |
| &adev->gfx.mec.mec_fw_gpu_addr, |
| (void **)&fw); |
| if (r) { |
| dev_warn(adev->dev, "(%d) create mec firmware bo failed\n", r); |
| gfx_v9_0_mec_fini(adev); |
| return r; |
| } |
| |
| memcpy(fw, fw_data, fw_size); |
| |
| amdgpu_bo_kunmap(adev->gfx.mec.mec_fw_obj); |
| amdgpu_bo_unreserve(adev->gfx.mec.mec_fw_obj); |
| |
| return 0; |
| } |
| |
| static uint32_t wave_read_ind(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t address) |
| { |
| WREG32_SOC15_RLC(GC, 0, mmSQ_IND_INDEX, |
| (wave << SQ_IND_INDEX__WAVE_ID__SHIFT) | |
| (simd << SQ_IND_INDEX__SIMD_ID__SHIFT) | |
| (address << SQ_IND_INDEX__INDEX__SHIFT) | |
| (SQ_IND_INDEX__FORCE_READ_MASK)); |
| return RREG32_SOC15(GC, 0, mmSQ_IND_DATA); |
| } |
| |
| static void wave_read_regs(struct amdgpu_device *adev, uint32_t simd, |
| uint32_t wave, uint32_t thread, |
| uint32_t regno, uint32_t num, uint32_t *out) |
| { |
| WREG32_SOC15_RLC(GC, 0, mmSQ_IND_INDEX, |
| (wave << SQ_IND_INDEX__WAVE_ID__SHIFT) | |
| (simd << SQ_IND_INDEX__SIMD_ID__SHIFT) | |
| (regno << SQ_IND_INDEX__INDEX__SHIFT) | |
| (thread << SQ_IND_INDEX__THREAD_ID__SHIFT) | |
| (SQ_IND_INDEX__FORCE_READ_MASK) | |
| (SQ_IND_INDEX__AUTO_INCR_MASK)); |
| while (num--) |
| *(out++) = RREG32_SOC15(GC, 0, mmSQ_IND_DATA); |
| } |
| |
| static void gfx_v9_0_read_wave_data(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t *dst, int *no_fields) |
| { |
| /* type 1 wave data */ |
| dst[(*no_fields)++] = 1; |
| dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_STATUS); |
| dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_PC_LO); |
| dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_PC_HI); |
| dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_EXEC_LO); |
| dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_EXEC_HI); |
| dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_HW_ID); |
| dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_INST_DW0); |
| dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_INST_DW1); |
| dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_GPR_ALLOC); |
| dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_LDS_ALLOC); |
| dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_TRAPSTS); |
| dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_IB_STS); |
| dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_IB_DBG0); |
| dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_M0); |
| dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_MODE); |
| } |
| |
| static void gfx_v9_0_read_wave_sgprs(struct amdgpu_device *adev, uint32_t simd, |
| uint32_t wave, uint32_t start, |
| uint32_t size, uint32_t *dst) |
| { |
| wave_read_regs( |
| adev, simd, wave, 0, |
| start + SQIND_WAVE_SGPRS_OFFSET, size, dst); |
| } |
| |
| static void gfx_v9_0_read_wave_vgprs(struct amdgpu_device *adev, uint32_t simd, |
| uint32_t wave, uint32_t thread, |
| uint32_t start, uint32_t size, |
| uint32_t *dst) |
| { |
| wave_read_regs( |
| adev, simd, wave, thread, |
| start + SQIND_WAVE_VGPRS_OFFSET, size, dst); |
| } |
| |
| static void gfx_v9_0_select_me_pipe_q(struct amdgpu_device *adev, |
| u32 me, u32 pipe, u32 q, u32 vm) |
| { |
| soc15_grbm_select(adev, me, pipe, q, vm); |
| } |
| |
| static const struct amdgpu_gfx_funcs gfx_v9_0_gfx_funcs = { |
| .get_gpu_clock_counter = &gfx_v9_0_get_gpu_clock_counter, |
| .select_se_sh = &gfx_v9_0_select_se_sh, |
| .read_wave_data = &gfx_v9_0_read_wave_data, |
| .read_wave_sgprs = &gfx_v9_0_read_wave_sgprs, |
| .read_wave_vgprs = &gfx_v9_0_read_wave_vgprs, |
| .select_me_pipe_q = &gfx_v9_0_select_me_pipe_q, |
| }; |
| |
| static const struct amdgpu_gfx_ras_funcs gfx_v9_0_ras_funcs = { |
| .ras_late_init = amdgpu_gfx_ras_late_init, |
| .ras_fini = amdgpu_gfx_ras_fini, |
| .ras_error_inject = &gfx_v9_0_ras_error_inject, |
| .query_ras_error_count = &gfx_v9_0_query_ras_error_count, |
| .reset_ras_error_count = &gfx_v9_0_reset_ras_error_count, |
| }; |
| |
| static int gfx_v9_0_gpu_early_init(struct amdgpu_device *adev) |
| { |
| u32 gb_addr_config; |
| int err; |
| |
| adev->gfx.funcs = &gfx_v9_0_gfx_funcs; |
| |
| switch (adev->asic_type) { |
| case CHIP_VEGA10: |
| adev->gfx.config.max_hw_contexts = 8; |
| adev->gfx.config.sc_prim_fifo_size_frontend = 0x20; |
| adev->gfx.config.sc_prim_fifo_size_backend = 0x100; |
| adev->gfx.config.sc_hiz_tile_fifo_size = 0x30; |
| adev->gfx.config.sc_earlyz_tile_fifo_size = 0x4C0; |
| gb_addr_config = VEGA10_GB_ADDR_CONFIG_GOLDEN; |
| break; |
| case CHIP_VEGA12: |
| adev->gfx.config.max_hw_contexts = 8; |
| adev->gfx.config.sc_prim_fifo_size_frontend = 0x20; |
| adev->gfx.config.sc_prim_fifo_size_backend = 0x100; |
| adev->gfx.config.sc_hiz_tile_fifo_size = 0x30; |
| adev->gfx.config.sc_earlyz_tile_fifo_size = 0x4C0; |
| gb_addr_config = VEGA12_GB_ADDR_CONFIG_GOLDEN; |
| DRM_INFO("fix gfx.config for vega12\n"); |
| break; |
| case CHIP_VEGA20: |
| adev->gfx.ras_funcs = &gfx_v9_0_ras_funcs; |
| adev->gfx.config.max_hw_contexts = 8; |
| adev->gfx.config.sc_prim_fifo_size_frontend = 0x20; |
| adev->gfx.config.sc_prim_fifo_size_backend = 0x100; |
| adev->gfx.config.sc_hiz_tile_fifo_size = 0x30; |
| adev->gfx.config.sc_earlyz_tile_fifo_size = 0x4C0; |
| gb_addr_config = RREG32_SOC15(GC, 0, mmGB_ADDR_CONFIG); |
| gb_addr_config &= ~0xf3e777ff; |
| gb_addr_config |= 0x22014042; |
| /* check vbios table if gpu info is not available */ |
| err = amdgpu_atomfirmware_get_gfx_info(adev); |
| if (err) |
| return err; |
| break; |
| case CHIP_RAVEN: |
| adev->gfx.config.max_hw_contexts = 8; |
| adev->gfx.config.sc_prim_fifo_size_frontend = 0x20; |
| adev->gfx.config.sc_prim_fifo_size_backend = 0x100; |
| adev->gfx.config.sc_hiz_tile_fifo_size = 0x30; |
| adev->gfx.config.sc_earlyz_tile_fifo_size = 0x4C0; |
| if (adev->apu_flags & AMD_APU_IS_RAVEN2) |
| gb_addr_config = RAVEN2_GB_ADDR_CONFIG_GOLDEN; |
| else |
| gb_addr_config = RAVEN_GB_ADDR_CONFIG_GOLDEN; |
| break; |
| case CHIP_ARCTURUS: |
| adev->gfx.ras_funcs = &gfx_v9_4_ras_funcs; |
| adev->gfx.config.max_hw_contexts = 8; |
| adev->gfx.config.sc_prim_fifo_size_frontend = 0x20; |
| adev->gfx.config.sc_prim_fifo_size_backend = 0x100; |
| adev->gfx.config.sc_hiz_tile_fifo_size = 0x30; |
| adev->gfx.config.sc_earlyz_tile_fifo_size = 0x4C0; |
| gb_addr_config = RREG32_SOC15(GC, 0, mmGB_ADDR_CONFIG); |
| gb_addr_config &= ~0xf3e777ff; |
| gb_addr_config |= 0x22014042; |
| break; |
| case CHIP_RENOIR: |
| adev->gfx.config.max_hw_contexts = 8; |
| adev->gfx.config.sc_prim_fifo_size_frontend = 0x20; |
| adev->gfx.config.sc_prim_fifo_size_backend = 0x100; |
| adev->gfx.config.sc_hiz_tile_fifo_size = 0x80; |
| adev->gfx.config.sc_earlyz_tile_fifo_size = 0x4C0; |
| gb_addr_config = RREG32_SOC15(GC, 0, mmGB_ADDR_CONFIG); |
| gb_addr_config &= ~0xf3e777ff; |
| gb_addr_config |= 0x22010042; |
| break; |
| case CHIP_ALDEBARAN: |
| adev->gfx.ras_funcs = &gfx_v9_4_2_ras_funcs; |
| adev->gfx.config.max_hw_contexts = 8; |
| adev->gfx.config.sc_prim_fifo_size_frontend = 0x20; |
| adev->gfx.config.sc_prim_fifo_size_backend = 0x100; |
| adev->gfx.config.sc_hiz_tile_fifo_size = 0x30; |
| adev->gfx.config.sc_earlyz_tile_fifo_size = 0x4C0; |
| gb_addr_config = RREG32_SOC15(GC, 0, mmGB_ADDR_CONFIG); |
| gb_addr_config &= ~0xf3e777ff; |
| gb_addr_config |= 0x22014042; |
| /* check vbios table if gpu info is not available */ |
| err = amdgpu_atomfirmware_get_gfx_info(adev); |
| if (err) |
| return err; |
| break; |
| default: |
| BUG(); |
| break; |
| } |
| |
| adev->gfx.config.gb_addr_config = gb_addr_config; |
| |
| adev->gfx.config.gb_addr_config_fields.num_pipes = 1 << |
| REG_GET_FIELD( |
| adev->gfx.config.gb_addr_config, |
| GB_ADDR_CONFIG, |
| NUM_PIPES); |
| |
| adev->gfx.config.max_tile_pipes = |
| adev->gfx.config.gb_addr_config_fields.num_pipes; |
| |
| adev->gfx.config.gb_addr_config_fields.num_banks = 1 << |
| REG_GET_FIELD( |
| adev->gfx.config.gb_addr_config, |
| GB_ADDR_CONFIG, |
| NUM_BANKS); |
| adev->gfx.config.gb_addr_config_fields.max_compress_frags = 1 << |
| REG_GET_FIELD( |
| adev->gfx.config.gb_addr_config, |
| GB_ADDR_CONFIG, |
| MAX_COMPRESSED_FRAGS); |
| adev->gfx.config.gb_addr_config_fields.num_rb_per_se = 1 << |
| REG_GET_FIELD( |
| adev->gfx.config.gb_addr_config, |
| GB_ADDR_CONFIG, |
| NUM_RB_PER_SE); |
| adev->gfx.config.gb_addr_config_fields.num_se = 1 << |
| REG_GET_FIELD( |
| adev->gfx.config.gb_addr_config, |
| GB_ADDR_CONFIG, |
| NUM_SHADER_ENGINES); |
| adev->gfx.config.gb_addr_config_fields.pipe_interleave_size = 1 << (8 + |
| REG_GET_FIELD( |
| adev->gfx.config.gb_addr_config, |
| GB_ADDR_CONFIG, |
| PIPE_INTERLEAVE_SIZE)); |
| |
| return 0; |
| } |
| |
| static int gfx_v9_0_compute_ring_init(struct amdgpu_device *adev, int ring_id, |
| int mec, int pipe, int queue) |
| { |
| unsigned irq_type; |
| struct amdgpu_ring *ring = &adev->gfx.compute_ring[ring_id]; |
| unsigned int hw_prio; |
| |
| ring = &adev->gfx.compute_ring[ring_id]; |
| |
| /* mec0 is me1 */ |
| ring->me = mec + 1; |
| ring->pipe = pipe; |
| ring->queue = queue; |
| |
| ring->ring_obj = NULL; |
| ring->use_doorbell = true; |
| ring->doorbell_index = (adev->doorbell_index.mec_ring0 + ring_id) << 1; |
| ring->eop_gpu_addr = adev->gfx.mec.hpd_eop_gpu_addr |
| + (ring_id * GFX9_MEC_HPD_SIZE); |
| sprintf(ring->name, "comp_%d.%d.%d", ring->me, ring->pipe, ring->queue); |
| |
| irq_type = AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE0_EOP |
| + ((ring->me - 1) * adev->gfx.mec.num_pipe_per_mec) |
| + ring->pipe; |
| hw_prio = amdgpu_gfx_is_high_priority_compute_queue(adev, ring) ? |
| AMDGPU_GFX_PIPE_PRIO_HIGH : AMDGPU_GFX_PIPE_PRIO_NORMAL; |
| /* type-2 packets are deprecated on MEC, use type-3 instead */ |
| return amdgpu_ring_init(adev, ring, 1024, &adev->gfx.eop_irq, irq_type, |
| hw_prio, NULL); |
| } |
| |
| static int gfx_v9_0_sw_init(void *handle) |
| { |
| int i, j, k, r, ring_id; |
| struct amdgpu_ring *ring; |
| struct amdgpu_kiq *kiq; |
| struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
| |
| switch (adev->asic_type) { |
| case CHIP_VEGA10: |
| case CHIP_VEGA12: |
| case CHIP_VEGA20: |
| case CHIP_RAVEN: |
| case CHIP_ARCTURUS: |
| case CHIP_RENOIR: |
| case CHIP_ALDEBARAN: |
| adev->gfx.mec.num_mec = 2; |
| break; |
| default: |
| adev->gfx.mec.num_mec = 1; |
| break; |
| } |
| |
| adev->gfx.mec.num_pipe_per_mec = 4; |
| adev->gfx.mec.num_queue_per_pipe = 8; |
| |
| /* EOP Event */ |
| r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_GRBM_CP, GFX_9_0__SRCID__CP_EOP_INTERRUPT, &adev->gfx.eop_irq); |
| if (r) |
| return r; |
| |
| /* Privileged reg */ |
| r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_GRBM_CP, GFX_9_0__SRCID__CP_PRIV_REG_FAULT, |
| & |