drm/amdgpu: switch to v9_4_3 gfx_funcs callbacks for GC 9.4.3
add gfx_funcs callbacks implemenation based on gc_v9_4_3 ip headers Signed-off-by: Hawking Zhang <Hawking.Zhang@amd.com> Reviewed-by: Le Ma <le.ma@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
ca9beb8aac
commit
de7511aef7
@ -26,6 +26,7 @@
|
|||||||
#include "amdgpu_gfx.h"
|
#include "amdgpu_gfx.h"
|
||||||
#include "soc15.h"
|
#include "soc15.h"
|
||||||
#include "soc15_common.h"
|
#include "soc15_common.h"
|
||||||
|
#include "vega10_enum.h"
|
||||||
|
|
||||||
#include "gc/gc_9_4_3_offset.h"
|
#include "gc/gc_9_4_3_offset.h"
|
||||||
#include "gc/gc_9_4_3_sh_mask.h"
|
#include "gc/gc_9_4_3_sh_mask.h"
|
||||||
@ -34,6 +35,121 @@
|
|||||||
|
|
||||||
#define RLCG_UCODE_LOADING_START_ADDRESS 0x00002000L
|
#define RLCG_UCODE_LOADING_START_ADDRESS 0x00002000L
|
||||||
|
|
||||||
|
static uint64_t gfx_v9_4_3_get_gpu_clock_counter(struct amdgpu_device *adev)
|
||||||
|
{
|
||||||
|
uint64_t clock;
|
||||||
|
|
||||||
|
amdgpu_gfx_off_ctrl(adev, false);
|
||||||
|
mutex_lock(&adev->gfx.gpu_clock_mutex);
|
||||||
|
WREG32_SOC15(GC, 0, regRLC_CAPTURE_GPU_CLOCK_COUNT, 1);
|
||||||
|
clock = (uint64_t)RREG32_SOC15(GC, 0, regRLC_GPU_CLOCK_COUNT_LSB) |
|
||||||
|
((uint64_t)RREG32_SOC15(GC, 0, regRLC_GPU_CLOCK_COUNT_MSB) << 32ULL);
|
||||||
|
mutex_unlock(&adev->gfx.gpu_clock_mutex);
|
||||||
|
amdgpu_gfx_off_ctrl(adev, true);
|
||||||
|
|
||||||
|
return clock;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void gfx_v9_4_3_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_EX(reg, GC, 0, regGRBM_GFX_INDEX, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint32_t wave_read_ind(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t address)
|
||||||
|
{
|
||||||
|
WREG32_SOC15_RLC(GC, 0, regSQ_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, regSQ_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, regSQ_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, regSQ_IND_DATA);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void gfx_v9_4_3_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_4_3_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_4_3_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_4_3_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 bool gfx_v9_4_3_is_rlc_enabled(struct amdgpu_device *adev)
|
static bool gfx_v9_4_3_is_rlc_enabled(struct amdgpu_device *adev)
|
||||||
{
|
{
|
||||||
uint32_t rlc_setting;
|
uint32_t rlc_setting;
|
||||||
@ -80,35 +196,6 @@ static int gfx_v9_4_3_rlc_init(struct amdgpu_device *adev)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gfx_v9_4_3_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_EX(reg, GC, 0, regGRBM_GFX_INDEX, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void gfx_v9_4_3_wait_for_rlc_serdes(struct amdgpu_device *adev)
|
static void gfx_v9_4_3_wait_for_rlc_serdes(struct amdgpu_device *adev)
|
||||||
{
|
{
|
||||||
u32 i, j, k;
|
u32 i, j, k;
|
||||||
@ -320,6 +407,15 @@ static bool gfx_v9_4_3_is_rlcg_access_range(struct amdgpu_device *adev, u32 offs
|
|||||||
ARRAY_SIZE(rlcg_access_gc_9_4_3));
|
ARRAY_SIZE(rlcg_access_gc_9_4_3));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const struct amdgpu_gfx_funcs gfx_v9_4_3_gfx_funcs = {
|
||||||
|
.get_gpu_clock_counter = &gfx_v9_4_3_get_gpu_clock_counter,
|
||||||
|
.select_se_sh = &gfx_v9_4_3_select_se_sh,
|
||||||
|
.read_wave_data = &gfx_v9_4_3_read_wave_data,
|
||||||
|
.read_wave_sgprs = &gfx_v9_4_3_read_wave_sgprs,
|
||||||
|
.read_wave_vgprs = &gfx_v9_4_3_read_wave_vgprs,
|
||||||
|
.select_me_pipe_q = &gfx_v9_4_3_select_me_pipe_q,
|
||||||
|
};
|
||||||
|
|
||||||
const struct amdgpu_rlc_funcs gfx_v9_4_3_rlc_funcs = {
|
const struct amdgpu_rlc_funcs gfx_v9_4_3_rlc_funcs = {
|
||||||
.is_rlc_enabled = gfx_v9_4_3_is_rlc_enabled,
|
.is_rlc_enabled = gfx_v9_4_3_is_rlc_enabled,
|
||||||
.set_safe_mode = gfx_v9_4_3_set_safe_mode,
|
.set_safe_mode = gfx_v9_4_3_set_safe_mode,
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
#ifndef __GFX_V9_4_3_H__
|
#ifndef __GFX_V9_4_3_H__
|
||||||
#define __GFX_V9_4_3_H__
|
#define __GFX_V9_4_3_H__
|
||||||
|
|
||||||
|
extern const struct amdgpu_gfx_funcs gfx_v9_4_3_gfx_funcs;
|
||||||
extern const struct amdgpu_rlc_funcs gfx_v9_4_3_rlc_funcs;
|
extern const struct amdgpu_rlc_funcs gfx_v9_4_3_rlc_funcs;
|
||||||
|
|
||||||
#endif /* __GFX_V9_4_3_H__ */
|
#endif /* __GFX_V9_4_3_H__ */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user