[PATCH v2 1/4] drm/amdgpu: Add amdgpu_gfx_off_ctrl function
Felix Kuehling
felix.kuehling at amd.com
Mon Jul 30 19:25:26 UTC 2018
[+Oded]
KFD on amd-staging-drm-next doesn't support Raven yet. It's coming soon
via Oded's branch.
To prepare for that, all MMIO access in amdgpu_amdkfd_gfx_v9.c should be
protected by disabling GFXOFF. Since enabling GFXOFF is delayed in your
latest patch series, it shouldn't cause performance issues. It's not
going to do anything on Vega10, which doesn't have the GFXOFF feature.
But it will take effect as soon as Raven support is enabled for KFD.
Regards,
Felix
On 2018-07-30 05:23 AM, Rex Zhu wrote:
> 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 ctrl feature.
> we arbitrat gfx off feature enable/disable in this
> function.
>
> Signed-off-by: Rex Zhu <Rex.Zhu at 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 5b7bb58..188bc53 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> @@ -988,6 +988,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);
> @@ -1815,6 +1819,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 745f760..122653f 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 239bf2a..1cdb264 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);
> +}
More information about the amd-gfx
mailing list