| /* |
| * 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 "hdp/hdp_4_0_offset.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" |
| |
| #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 mmPWR_MISC_CNTL_STATUS 0x0183 |
| #define mmPWR_MISC_CNTL_STATUS_BASE_IDX 0 |
| #define PWR_MISC_CNTL_STATUS__PWR_GFX_RLC_CGPG_EN__SHIFT 0x0 |
| #define PWR_MISC_CNTL_STATUS__PWR_GFXOFF_STATUS__SHIFT 0x1 |
| #define PWR_MISC_CNTL_STATUS__PWR_GFX_RLC_CGPG_EN_MASK 0x00000001L |
| #define PWR_MISC_CNTL_STATUS__PWR_GFXOFF_STATUS_MASK 0x00000006L |
| |
| #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_mec2.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_mec2.bin"); |
| MODULE_FIRMWARE("amdgpu/renoir_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 |
| |
| struct ras_gfx_subblock_reg { |
| const char *name; |
| uint32_t hwip; |
| uint32_t inst; |
| uint32_t seg; |
| uint32_t reg_offset; |
| uint32_t sec_count_mask; |
| uint32_t sec_count_shift; |
| uint32_t ded_count_mask; |
| uint32_t ded_count_shift; |
| }; |
| |
| 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, 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), |
| 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), |
| }; |
| |
| static const u32 GFX_RLC_SRM_INDEX_CNTL_ADDR_OFFSETS[] = |
| { |
| mmRLC_SRM_INDEX_CNTL_ADDR_0 - mmRLC_SRM_INDEX_CNTL_ADDR_0, |
| mmRLC_SRM_INDEX_CNTL_ADDR_1 - mmRLC_SRM_INDEX_CNTL_ADDR_0, |
| mmRLC_SRM_INDEX_CNTL_ADDR_2 - mmRLC_SRM_INDEX_CNTL_ADDR_0, |
| mmRLC_SRM_INDEX_CNTL_ADDR_3 - mmRLC_SRM_INDEX_CNTL_ADDR_0, |
| mmRLC_SRM_INDEX_CNTL_ADDR_4 - mmRLC_SRM_INDEX_CNTL_ADDR_0, |
| mmRLC_SRM_INDEX_CNTL_ADDR_5 - mmRLC_SRM_INDEX_CNTL_ADDR_0, |
| mmRLC_SRM_INDEX_CNTL_ADDR_6 - mmRLC_SRM_INDEX_CNTL_ADDR_0, |
| mmRLC_SRM_INDEX_CNTL_ADDR_7 - mmRLC_SRM_INDEX_CNTL_ADDR_0, |
| }; |
| |
| static const u32 GFX_RLC_SRM_INDEX_CNTL_DATA_OFFSETS[] = |
| { |
| mmRLC_SRM_INDEX_CNTL_DATA_0 - mmRLC_SRM_INDEX_CNTL_DATA_0, |
| mmRLC_SRM_INDEX_CNTL_DATA_1 - mmRLC_SRM_INDEX_CNTL_DATA_0, |
| mmRLC_SRM_INDEX_CNTL_DATA_2 - mmRLC_SRM_INDEX_CNTL_DATA_0, |
| mmRLC_SRM_INDEX_CNTL_DATA_3 - mmRLC_SRM_INDEX_CNTL_DATA_0, |
| mmRLC_SRM_INDEX_CNTL_DATA_4 - mmRLC_SRM_INDEX_CNTL_DATA_0, |
| mmRLC_SRM_INDEX_CNTL_DATA_5 - mmRLC_SRM_INDEX_CNTL_DATA_0, |
| mmRLC_SRM_INDEX_CNTL_DATA_6 - mmRLC_SRM_INDEX_CNTL_DATA_0, |
| mmRLC_SRM_INDEX_CNTL_DATA_7 - mmRLC_SRM_INDEX_CNTL_DATA_0, |
| }; |
| |
| #define VEGA10_GB_ADDR_CONFIG_GOLDEN 0x2a114042 |
| #define VEGA12_GB_ADDR_CONFIG_GOLDEN 0x24104041 |
| #define RAVEN_GB_ADDR_CONFIG_GOLDEN 0x24000042 |
| #define RAVEN2_GB_ADDR_CONFIG_GOLDEN 0x26013041 |
| |
| static void gfx_v9_0_set_ring_funcs(struct amdgpu_device *adev); |
| static void gfx_v9_0_set_irq_funcs(struct amdgpu_device *adev); |
| static void gfx_v9_0_set_gds_init(struct amdgpu_device *adev); |
| static void gfx_v9_0_set_rlc_funcs(struct amdgpu_device *adev); |
| static int gfx_v9_0_get_cu_info(struct amdgpu_device *adev, |
| struct amdgpu_cu_info *cu_info); |
| static uint64_t gfx_v9_0_get_gpu_clock_counter(struct amdgpu_device *adev); |
| static void gfx_v9_0_select_se_sh(struct amdgpu_device *adev, u32 se_num, u32 sh_num, u32 instance); |
| 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_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->rev_id >= 8) |
| 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 */ |
| default: |
| break; |
| } |
| |
| if (adev->asic_type != CHIP_ARCTURUS) |
| 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, &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->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("Warning: check cp_fw_version and update it to realize \ |
| GRBM requires 1-cycle delay in cp firmware\n"); |
| |
| 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: |
| break; |
| } |
| } |
| |
| static void gfx_v9_0_check_if_need_gfxoff(struct amdgpu_device *adev) |
| { |
| switch (adev->asic_type) { |
| case CHIP_VEGA10: |
| case CHIP_VEGA12: |
| case CHIP_VEGA20: |
| break; |
| case CHIP_RAVEN: |
| /* Disable GFXOFF on original raven. There are combinations |
| * of sbios and platforms that are not stable. |
| */ |
| if (!(adev->rev_id >= 0x8 || adev->pdev->device == 0x15d8)) |
| adev->pm.pp_feature &= ~PP_GFXOFF_MASK; |
| else if (!(adev->rev_id >= 0x8 || adev->pdev->device == 0x15d8) |
| &&((adev->gfx.rlc_fw_version != 106 && |
| adev->gfx.rlc_fw_version < 531) || |
| (adev->gfx.rlc_fw_version == 53815) || |
| (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 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); |
| |
| |
| 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; |
| } |
| |
| 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 (adev->asic_type != CHIP_ARCTURUS && |
| adev->asic_type != CHIP_RENOIR) { |
| 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->rev_id >= 8) |
| chip_name = "raven2"; |
| else if (adev->pdev->device == 0x15d8) |
| chip_name = "picasso"; |
| else |
| chip_name = "raven"; |
| break; |
| case CHIP_ARCTURUS: |
| chip_name = "arcturus"; |
| break; |
| case CHIP_RENOIR: |
| chip_name = "renoir"; |
| break; |
| default: |
| BUG(); |
| } |
| |
| /* No CPG in Arcturus */ |
| if (adev->asic_type != CHIP_ARCTURUS) { |
| 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) |
| { |
| return 5; |
| } |
| |
| 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->asic_type == CHIP_RAVEN || adev->asic_type == CHIP_RENOIR) { |
| /* 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; |
| } |
| |
| 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; |
| |
| 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, adev->gfx.mec.hpd_eop_obj->tbo.mem.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) / 4; |
| |
| 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(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(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); |
| } |
| |
| 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, |
| .ras_error_inject = &gfx_v9_0_ras_error_inject, |
| .query_ras_error_count = &gfx_v9_0_query_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.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->rev_id >= 8) |
| gb_addr_config = RAVEN2_GB_ADDR_CONFIG_GOLDEN; |
| else |
| gb_addr_config = RAVEN_GB_ADDR_CONFIG_GOLDEN; |
| break; |
| case CHIP_ARCTURUS: |
| 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; |
| 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) |
| { |
| int r; |
| unsigned irq_type; |
| struct amdgpu_ring *ring = &adev->gfx.compute_ring[ring_id]; |
| |
| 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; |
| |
| /* type-2 packets are deprecated on MEC, use type-3 instead */ |
| r = amdgpu_ring_init(adev, ring, 1024, |
| &adev->gfx.eop_irq, irq_type); |
| if (r) |
| return r; |
| |
| |
| return 0; |
| } |
| |
| 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: |
| 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, |
| &adev->gfx.priv_reg_irq); |
| if (r) |
| return r; |
| |
| /* Privileged inst */ |
| r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_GRBM_CP, GFX_9_0__SRCID__CP_PRIV_INSTR_FAULT, |
| &adev->gfx.priv_inst_irq); |
| if (r) |
| return r; |
| |
| /* ECC error */ |
| r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_GRBM_CP, GFX_9_0__SRCID__CP_ECC_ERROR, |
| &adev->gfx.cp_ecc_error_irq); |
| if (r) |
| return r; |
| |
| /* FUE error */ |
| r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_GRBM_CP, GFX_9_0__SRCID__CP_FUE_ERROR, |
| &adev->gfx.cp_ecc_error_irq); |
| if (r) |
| return r; |
| |
| adev->gfx.gfx_current_status = AMDGPU_GFX_NORMAL_MODE; |
| |
| gfx_v9_0_scratch_init(adev); |
| |
| r = gfx_v9_0_init_microcode(adev); |
| if (r) { |
| DRM_ERROR("Failed to load gfx firmware!\n"); |
| return r; |
| } |
| |
| r = adev->gfx.rlc.funcs->init(adev); |
| if (r) { |
| DRM_ERROR("Failed to init rlc BOs!\n"); |
| return r; |
| } |
| |
| r = gfx_v9_0_mec_init(adev); |
| if (r) { |
| DRM_ERROR("Failed to init MEC BOs!\n"); |
| return r; |
| } |
| |
| /* set up the gfx ring */ |
| for (i = 0; i < adev->gfx.num_gfx_rings; i++) { |
| ring = &adev->gfx.gfx_ring[i]; |
| ring->ring_obj = NULL; |
| if (!i) |
| sprintf(ring->name, "gfx"); |
| else |
| sprintf(ring->name, "gfx_%d", i); |
| ring->use_doorbell = true; |
| ring->doorbell_index = adev->doorbell_index.gfx_ring0 << 1; |
| r = amdgpu_ring_init(adev, ring, 1024, |
| &adev->gfx.eop_irq, AMDGPU_CP_IRQ_GFX_ME0_PIPE0_EOP); |
| if (r) |
| return r; |
| } |
| |
| /* set up the compute queues - allocate horizontally across pipes */ |
| ring_id = 0; |
| for (i = 0; i < adev->gfx.mec.num_mec; ++i) { |
| for (j = 0; j < adev->gfx.mec.num_queue_per_pipe; j++) { |
| for (k = 0; k < adev->gfx.mec.num_pipe_per_mec; k++) { |
| if (!amdgpu_gfx_is_mec_queue_enabled(adev, i, k, j)) |
| continue; |
| |
| r = gfx_v9_0_compute_ring_init(adev, |
| ring_id, |
| i, k, j); |
| if (r) |
| return r; |
| |
| ring_id++; |
| } |
| } |
| } |
| |
| r = amdgpu_gfx_kiq_init(adev, GFX9_MEC_HPD_SIZE); |
| if (r) { |
| DRM_ERROR("Failed to init KIQ BOs!\n"); |
| return r; |
| } |
| |
| kiq = &adev->gfx.kiq; |
| r = amdgpu_gfx_kiq_init_ring(adev, &kiq->ring, &kiq->irq); |
| if (r) |
| return r; |
| |
| /* create MQD for all compute queues as wel as KIQ for SRIOV case */ |
| r = amdgpu_gfx_mqd_sw_init(adev, sizeof(struct v9_mqd_allocation)); |
| if (r) |
| return r; |
| |
| adev->gfx.ce_ram_size = 0x8000; |
| |
| r = gfx_v9_0_gpu_early_init(adev); |
| if (r) |
| return r; |
| |
| return 0; |
| } |
| |
| |
| static int gfx_v9_0_sw_fini(void *handle) |
| { |
| int i; |
| struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
| |
| amdgpu_gfx_ras_fini(adev); |
| |
| for (i = 0; i < adev->gfx.num_gfx_rings; i++) |
| amdgpu_ring_fini(&adev->gfx.gfx_ring[i]); |
| for (i = 0; i < adev->gfx.num_compute_rings; i++) |
| amdgpu_ring_fini(&adev->gfx.compute_ring[i]); |
| |
| amdgpu_gfx_mqd_sw_fini(adev); |
| amdgpu_gfx_kiq_free_ring(&adev->gfx.kiq.ring); |
| amdgpu_gfx_kiq_fini(adev); |
| |
| gfx_v9_0_mec_fini(adev); |
| amdgpu_bo_unref(&adev->gfx.rlc.clear_state_obj); |
| if (adev->asic_type == CHIP_RAVEN || adev->asic_type == CHIP_RENOIR) { |
| amdgpu_bo_free_kernel(&adev->gfx.rlc.cp_table_obj, |
| &adev->gfx.rlc.cp_table_gpu_addr, |
| (void **)&adev->gfx.rlc.cp_table_ptr); |
| } |
| gfx_v9_0_free_microcode(adev); |
| |
| return 0; |
| } |
| |
| |
| static void gfx_v9_0_tiling_mode_table_init(struct amdgpu_device *adev) |
| { |
| /* TODO */ |
| } |
| |
| static void gfx_v9_0_select_se_sh(struct amdgpu_device *adev, u32 se_num, u32 sh_num, u32 instance) |
| { |
| u32 data; |
| |
| if (instance == 0xffffffff) |
| data = REG_SET_FIELD(0, GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES, 1); |
| else |
| data = REG_SET_FIELD(0, GRBM_GFX_INDEX, INSTANCE_INDEX, instance); |
| |
| if (se_num == 0xffffffff) |
| data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SE_BROADCAST_WRITES, 1); |
| else |
| data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SE_INDEX, se_num); |
| |
| if (sh_num == 0xffffffff) |
| data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SH_BROADCAST_WRITES, 1); |
| else |
| data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SH_INDEX, sh_num); |
| |
| WREG32_SOC15_RLC_SHADOW(GC, 0, mmGRBM_GFX_INDEX, data); |
| } |
| |
| static u32 gfx_v9_0_get_rb_active_bitmap(struct amdgpu_device *adev) |
| { |
| u32 data, mask; |
| |
| data = RREG32_SOC15(GC, 0, mmCC_RB_BACKEND_DISABLE); |
| data |= RREG32_SOC15(GC, 0, mmGC_USER_RB_BACKEND_DISABLE); |
| |
| data &= CC_RB_BACKEND_DISABLE__BACKEND_DISABLE_MASK; |
| data >>= GC_USER_RB_BACKEND_DISABLE__BACKEND_DISABLE__SHIFT; |
| |
| mask = amdgpu_gfx_create_bitmask(adev->gfx.config.max_backends_per_se / |
| adev->gfx.config.max_sh_per_se); |
| |
| return (~data) & mask; |
| } |
| |
| static void gfx_v9_0_setup_rb(struct amdgpu_device *adev) |
| { |
| int i, j; |
| u32 data; |
| u32 active_rbs = 0; |
| u32 rb_bitmap_width_per_sh = adev->gfx.config.max_backends_per_se / |
| adev->gfx.config.max_sh_per_se; |
| |
| 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++) { |
| gfx_v9_0_select_se_sh(adev, i, j, 0xffffffff); |
| data = gfx_v9_0_get_rb_active_bitmap(adev); |
| active_rbs |= data << ((i * adev->gfx.config.max_sh_per_se + j) * |
| rb_bitmap_width_per_sh); |
| } |
| } |
| gfx_v9_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); |
| mutex_unlock(&adev->grbm_idx_mutex); |
| |
| adev->gfx.config.backend_enable_mask = active_rbs; |
| adev->gfx.config.num_rbs = hweight32(active_rbs); |
| } |
| |
| #define DEFAULT_SH_MEM_BASES (0x6000) |
| #define FIRST_COMPUTE_VMID (8) |
| #define LAST_COMPUTE_VMID (16) |
| static void gfx_v9_0_init_compute_vmid(struct amdgpu_device *adev) |
| { |
| int i; |
| uint32_t sh_mem_config; |
| uint32_t sh_mem_bases; |
| |
| /* |
| * Configure apertures: |
| * LDS: 0x60000000'00000000 - 0x60000001'00000000 (4GB) |
| * Scratch: 0x60000001'00000000 - 0x60000002'00000000 (4GB) |
| * GPUVM: 0x60010000'00000000 - 0x60020000'00000000 (1TB) |
| */ |
| sh_mem_bases = DEFAULT_SH_MEM_BASES | (DEFAULT_SH_MEM_BASES << 16); |
| |
| sh_mem_config = SH_MEM_ADDRESS_MODE_64 | |
| SH_MEM_ALIGNMENT_MODE_UNALIGNED << |
| SH_MEM_CONFIG__ALIGNMENT_MODE__SHIFT; |
| |
| mutex_lock(&adev->srbm_mutex); |
| for (i = FIRST_COMPUTE_VMID; i < LAST_COMPUTE_VMID; i++) { |
| soc15_grbm_select(adev, 0, 0, 0, i); |
| /* CP and shaders */ |
| WREG32_SOC15_RLC(GC, 0, mmSH_MEM_CONFIG, sh_mem_config); |
| WREG32_SOC15_RLC(GC, 0, mmSH_MEM_BASES, sh_mem_bases); |
| } |
| soc15_grbm_select(adev, 0, 0, 0, 0); |
| mutex_unlock(&adev->srbm_mutex); |
| |
| /* Initialize all compute VMIDs to have no GDS, GWS, or OA |
| acccess. These should be enabled by FW for target VMIDs. */ |
| for (i = FIRST_COMPUTE_VMID; i < LAST_COMPUTE_VMID; i++) { |
| WREG32_SOC15_OFFSET(GC, 0, mmGDS_VMID0_BASE, 2 * i, 0); |
| WREG32_SOC15_OFFSET(GC, 0, mmGDS_VMID0_SIZE, 2 * i, 0); |
| WREG32_SOC15_OFFSET(GC, 0, mmGDS_GWS_VMID0, i, 0); |
| WREG32_SOC15_OFFSET(GC, 0, mmGDS_OA_VMID0, i, 0); |
| } |
| } |
| |
| static void gfx_v9_0_init_gds_vmid(struct amdgpu_device *adev) |
| { |
| int vmid; |
| |
| /* |
| * Initialize all compute and user-gfx VMIDs to have no GDS, GWS, or OA |
| * access. Compute VMIDs should be enabled by FW for target VMIDs, |
| * the driver can enable them for graphics. VMID0 should maintain |
| * access so that HWS firmware can save/restore entries. |
| */ |
| for (vmid = 1; vmid < 16; vmid++) { |
| WREG32_SOC15_OFFSET(GC, 0, mmGDS_VMID0_BASE, 2 * vmid, 0); |
| WREG32_SOC15_OFFSET(GC, 0, mmGDS_VMID0_SIZE, 2 * vmid, 0); |
| WREG32_SOC15_OFFSET(GC, 0, mmGDS_GWS_VMID0, vmid, 0); |
| WREG32_SOC15_OFFSET(GC, 0, mmGDS_OA_VMID0, vmid, 0); |
| } |
| } |
| |
| static void gfx_v9_0_constants_init(struct amdgpu_device *adev) |
| { |
| u32 tmp; |
| int i; |
| |
| WREG32_FIELD15_RLC(GC, 0, GRBM_CNTL, READ_TIMEOUT, 0xff); |
| |
| gfx_v9_0_tiling_mode_table_init(adev); |
| |
| gfx_v9_0_setup_rb(adev); |
| gfx_v9_0_get_cu_info(adev, &adev->gfx.cu_info); |
| adev->gfx.config.db_debug2 = RREG32_SOC15(GC, 0, mmDB_DEBUG2); |
| |
| /* XXX SH_MEM regs */ |
| /* where to put LDS, scratch, GPUVM in FSA64 space */ |
| mutex_lock(&adev->srbm_mutex); |
| for (i = 0; i < adev->vm_manager.id_mgr[AMDGPU_GFXHUB_0].num_ids; i++) { |
| soc15_grbm_select(adev, 0, 0, 0, i); |
| /* CP and shaders */ |
| if (i == 0) { |
| tmp = REG_SET_FIELD(0, SH_MEM_CONFIG, ALIGNMENT_MODE, |
| SH_MEM_ALIGNMENT_MODE_UNALIGNED); |
| tmp = REG_SET_FIELD(tmp, SH_MEM_CONFIG, RETRY_DISABLE, |
| !!amdgpu_noretry); |
| WREG32_SOC15_RLC(GC, 0, mmSH_MEM_CONFIG, tmp); |
| WREG32_SOC15_RLC(GC, 0, mmSH_MEM_BASES, 0); |
| } else { |
| tmp = REG_SET_FIELD(0, SH_MEM_CONFIG, ALIGNMENT_MODE, |
| SH_MEM_ALIGNMENT_MODE_UNALIGNED); |
| tmp = REG_SET_FIELD(tmp, SH_MEM_CONFIG, RETRY_DISABLE, |
| !!amdgpu_noretry); |
| WREG32_SOC15_RLC(GC, 0, mmSH_MEM_CONFIG, tmp); |
| tmp = REG_SET_FIELD(0, SH_MEM_BASES, PRIVATE_BASE, |
| (adev->gmc.private_aperture_start >> 48)); |
| tmp = REG_SET_FIELD(tmp, SH_MEM_BASES, SHARED_BASE, |
| (adev->gmc.shared_aperture_start >> 48)); |
| WREG32_SOC15_RLC(GC, 0, mmSH_MEM_BASES, tmp); |
| } |
| } |
| soc15_grbm_select(adev, 0, 0, 0, 0); |
| |
| mutex_unlock(&adev->srbm_mutex); |
| |
| gfx_v9_0_init_compute_vmid(adev); |
| gfx_v9_0_init_gds_vmid(adev); |
| } |
| |
| static void gfx_v9_0_wait_for_rlc_serdes(struct amdgpu_device *adev) |
| { |
| u32 i, j, k; |
| u32 mask; |
| |
| 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; |