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_v5_0_1.c | |
| parent | bee48570cf8e312faec9b8f465762052555158d0 (diff) | |
| download | linux-next-9bf9442051c0af835b683411d9ebc6a5036d4cbb.tar.gz linux-next-9bf9442051c0af835b683411d9ebc6a5036d4cbb.zip | |
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_v5_0_1.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/vcn_v5_0_1.c | 40 |
1 files changed, 27 insertions, 13 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_1.c b/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_1.c index 512e5f6ae7b3..83e873767a86 100644 --- a/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_1.c +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_1.c @@ -40,8 +40,11 @@ static void vcn_v5_0_1_set_unified_ring_funcs(struct amdgpu_device *adev); static void vcn_v5_0_1_set_irq_funcs(struct amdgpu_device *adev); +static int vcn_v5_0_1_set_powergating_state_inst(struct amdgpu_ip_block *ip_block, + enum amd_powergating_state state, + int i); static int vcn_v5_0_1_set_powergating_state(struct amdgpu_ip_block *ip_block, - enum amd_powergating_state state); + enum amd_powergating_state state); static void vcn_v5_0_1_unified_ring_set_wptr(struct amdgpu_ring *ring); /** @@ -988,6 +991,27 @@ static int vcn_v5_0_1_set_clockgating_state(struct amdgpu_ip_block *ip_block, return 0; } +static int vcn_v5_0_1_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; + + if (state == adev->vcn.inst[i].cur_state) + return 0; + + if (state == AMD_PG_STATE_GATE) + ret = vcn_v5_0_1_stop(adev, i); + else + ret = vcn_v5_0_1_start(adev, i); + + if (!ret) + adev->vcn.inst[i].cur_state = state; + + return ret; +} + /** * vcn_v5_0_1_set_powergating_state - set VCN block powergating state * @@ -1002,18 +1026,8 @@ static int vcn_v5_0_1_set_powergating_state(struct amdgpu_ip_block *ip_block, struct amdgpu_device *adev = ip_block->adev; int ret = 0, i; - if (state == adev->vcn.cur_state) - return 0; - - for (i = 0; i < adev->vcn.num_vcn_inst; ++i) { - if (state == AMD_PG_STATE_GATE) - ret = vcn_v5_0_1_stop(adev, i); - else - ret = vcn_v5_0_1_start(adev, i); - } - - if (!ret) - adev->vcn.cur_state = state; + for (i = 0; i < adev->vcn.num_vcn_inst; ++i) + vcn_v5_0_1_set_powergating_state_inst(ip_block, state, i); return ret; } |
