diff options
author | Alex Deucher <alexander.deucher@amd.com> | 2024-11-13 15:28:41 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2025-02-27 15:52:29 -0500 |
commit | 9bf9442051c0af835b683411d9ebc6a5036d4cbb (patch) | |
tree | 2c2b934a72edd8d19d759e7c5ae449c80fc63c38 /drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c | |
parent | bee48570cf8e312faec9b8f465762052555158d0 (diff) |
drm/amdgpu/vcn: make powergating status per instance
Store it per instance so we can track it per instance.
v2: index instances directly on vcn1.0 and 2.0 to make
it clear that they only support a single instance (Lijo)
Reviewed-by: Boyuan Zhang <Boyuan.Zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c | 60 |
1 files changed, 37 insertions, 23 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c index 4d20d58802f6..1f67e5973cf8 100644 --- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c @@ -96,8 +96,11 @@ static int amdgpu_ih_clientid_vcns[] = { static int vcn_v4_0_start_sriov(struct amdgpu_device *adev); static void vcn_v4_0_set_unified_ring_funcs(struct amdgpu_device *adev); static void vcn_v4_0_set_irq_funcs(struct amdgpu_device *adev); +static int vcn_v4_0_set_powergating_state_inst(struct amdgpu_ip_block *ip_block, + enum amd_powergating_state state, + int i); static int vcn_v4_0_set_powergating_state(struct amdgpu_ip_block *ip_block, - enum amd_powergating_state state); + enum amd_powergating_state state); static int vcn_v4_0_pause_dpg_mode(struct amdgpu_device *adev, int inst_idx, struct dpg_pause_state *new_state); static void vcn_v4_0_unified_ring_set_wptr(struct amdgpu_ring *ring); @@ -367,9 +370,9 @@ static int vcn_v4_0_hw_fini(struct amdgpu_ip_block *ip_block) if (!amdgpu_sriov_vf(adev)) { if ((adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG) || - (adev->vcn.cur_state != AMD_PG_STATE_GATE && + (adev->vcn.inst[i].cur_state != AMD_PG_STATE_GATE && RREG32_SOC15(VCN, i, regUVD_STATUS))) { - vcn_v4_0_set_powergating_state(ip_block, AMD_PG_STATE_GATE); + vcn_v4_0_set_powergating_state_inst(ip_block, AMD_PG_STATE_GATE, i); } } if (amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__VCN)) @@ -2034,41 +2037,52 @@ static int vcn_v4_0_set_clockgating_state(struct amdgpu_ip_block *ip_block, return 0; } -/** - * vcn_v4_0_set_powergating_state - set VCN block powergating state - * - * @ip_block: amdgpu_ip_block pointer - * @state: power gating state - * - * Set VCN block powergating state - */ -static int vcn_v4_0_set_powergating_state(struct amdgpu_ip_block *ip_block, - enum amd_powergating_state state) +static int vcn_v4_0_set_powergating_state_inst(struct amdgpu_ip_block *ip_block, + enum amd_powergating_state state, + int i) { struct amdgpu_device *adev = ip_block->adev; - int ret = 0, i; + int ret = 0; /* for SRIOV, guest should not control VCN Power-gating * MMSCH FW should control Power-gating and clock-gating * guest should avoid touching CGC and PG */ if (amdgpu_sriov_vf(adev)) { - adev->vcn.cur_state = AMD_PG_STATE_UNGATE; + adev->vcn.inst[i].cur_state = AMD_PG_STATE_UNGATE; return 0; } - if (state == adev->vcn.cur_state) + if (state == adev->vcn.inst[i].cur_state) return 0; - for (i = 0; i < adev->vcn.num_vcn_inst; ++i) { - if (state == AMD_PG_STATE_GATE) - ret |= vcn_v4_0_stop(adev, i); - else - ret |= vcn_v4_0_start(adev, i); - } + if (state == AMD_PG_STATE_GATE) + ret = vcn_v4_0_stop(adev, i); + else + ret = vcn_v4_0_start(adev, i); if (!ret) - adev->vcn.cur_state = state; + adev->vcn.inst[i].cur_state = state; + + return ret; +} + +/** + * vcn_v4_0_set_powergating_state - set VCN block powergating state + * + * @ip_block: amdgpu_ip_block pointer + * @state: power gating state + * + * Set VCN block powergating state + */ +static int vcn_v4_0_set_powergating_state(struct amdgpu_ip_block *ip_block, + enum amd_powergating_state state) +{ + struct amdgpu_device *adev = ip_block->adev; + int ret = 0, i; + + for (i = 0; i < adev->vcn.num_vcn_inst; ++i) + ret |= vcn_v4_0_set_powergating_state_inst(ip_block, state, i); return ret; } |