diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/0015-drm-amdgpu-Add-amdgpu_gfx_off_ctrl-function.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.19.8/0015-drm-amdgpu-Add-amdgpu_gfx_off_ctrl-function.patch | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/0015-drm-amdgpu-Add-amdgpu_gfx_off_ctrl-function.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/0015-drm-amdgpu-Add-amdgpu_gfx_off_ctrl-function.patch new file mode 100644 index 00000000..efc3ab2a --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/0015-drm-amdgpu-Add-amdgpu_gfx_off_ctrl-function.patch @@ -0,0 +1,114 @@ +From 6c60ff572e597d92dd0008ee7d910c787fe7c825 Mon Sep 17 00:00:00 2001 +From: Rex Zhu <Rex.Zhu@amd.com> +Date: Mon, 30 Jul 2018 16:59:09 +0800 +Subject: [PATCH 0015/2940] drm/amdgpu: Add amdgpu_gfx_off_ctrl function + +v2: + 1. drop the special handling for the hw IP + suggested by hawking and Christian. + 2. refine the variable name suggested by Flora. + +This funciton as the entry of gfx off feature. +we arbitrat gfx off feature enable/disable in this +function. + +Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com> +Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com> +Signed-off-by: Rex Zhu <Rex.Zhu@amd.com> +Signed-off-by: Alex Deucher <alexander.deucher@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu.h | 5 +++ + drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 2 ++ + drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c | 36 ++++++++++++++++++++++ + 3 files changed, 43 insertions(+) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h +index 447c4c7a36d6..47fbe8f54036 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h +@@ -950,6 +950,10 @@ struct amdgpu_gfx { + /* NGG */ + struct amdgpu_ngg ngg; + ++ /* gfx off */ ++ bool gfx_off_state; /* true: enabled, false: disabled */ ++ struct mutex gfx_off_mutex; ++ uint32_t gfx_off_req_count; /* default 1, enable gfx off: dec 1, disable gfx off: add 1 */ + /* pipe reservation */ + struct mutex pipe_reserve_mutex; + DECLARE_BITMAP (pipe_reserve_bitmap, AMDGPU_MAX_COMPUTE_QUEUES); +@@ -1774,6 +1778,7 @@ void amdgpu_device_program_register_sequence(struct amdgpu_device *adev, + const u32 array_size); + + bool amdgpu_device_is_px(struct drm_device *dev); ++void amdgpu_gfx_off_ctrl(struct amdgpu_device *adev, bool enable); + /* atpx handler */ + #if defined(CONFIG_VGA_SWITCHEROO) + void amdgpu_register_atpx_handler(void); +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +index ca31ab43715a..4e4eecfe71bd 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +@@ -2367,6 +2367,7 @@ int amdgpu_device_init(struct amdgpu_device *adev, + mutex_init(&adev->gfx.gpu_clock_mutex); + mutex_init(&adev->srbm_mutex); + mutex_init(&adev->gfx.pipe_reserve_mutex); ++ mutex_init(&adev->gfx.gfx_off_mutex); + mutex_init(&adev->grbm_idx_mutex); + mutex_init(&adev->mn_lock); + mutex_init(&adev->virt.vf_errors.lock); +@@ -2394,6 +2395,7 @@ int amdgpu_device_init(struct amdgpu_device *adev, + INIT_DELAYED_WORK(&adev->late_init_work, + amdgpu_device_ip_late_init_func_handler); + ++ adev->gfx.gfx_off_req_count = 1; + adev->pm.ac_power = power_supply_is_system_supplied() > 0 ? true : false; + + /* Registers mapping */ +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c +index 239bf2a4b3c6..1cdb26471a03 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c +@@ -340,3 +340,39 @@ void amdgpu_gfx_compute_mqd_sw_fini(struct amdgpu_device *adev) + &ring->mqd_gpu_addr, + &ring->mqd_ptr); + } ++ ++/* amdgpu_gfx_off_ctrl - Handle gfx off feature enable/disable ++ * ++ * @adev: amdgpu_device pointer ++ * @bool enable true: enable gfx off feature, false: disable gfx off feature ++ * ++ * 1. gfx off feature will be enabled by gfx ip after gfx cg gp enabled. ++ * 2. other client can send request to disable gfx off feature, the request should be honored. ++ * 3. other client can cancel their request of disable gfx off feature ++ * 4. other client should not send request to enable gfx off feature before disable gfx off feature. ++ */ ++ ++void amdgpu_gfx_off_ctrl(struct amdgpu_device *adev, bool enable) ++{ ++ if (!(adev->powerplay.pp_feature & PP_GFXOFF_MASK)) ++ return; ++ ++ if (!adev->powerplay.pp_funcs->set_powergating_by_smu) ++ return; ++ ++ mutex_lock(&adev->gfx.gfx_off_mutex); ++ ++ if (!enable) ++ adev->gfx.gfx_off_req_count++; ++ else if (adev->gfx.gfx_off_req_count > 0) ++ adev->gfx.gfx_off_req_count--; ++ ++ if (enable && !adev->gfx.gfx_off_state && !adev->gfx.gfx_off_req_count) { ++ if (!amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_GFX, true)) ++ adev->gfx.gfx_off_state = true; ++ } else if (!enable && adev->gfx.gfx_off_state) { ++ if (!amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_GFX, false)) ++ adev->gfx.gfx_off_state = false; ++ } ++ mutex_unlock(&adev->gfx.gfx_off_mutex); ++} +-- +2.17.1 + |