Commit 71338cb4 authored by Bhawanpreet Lakha's avatar Bhawanpreet Lakha Committed by Alex Deucher
Browse files

drm/amd/display: enable idle optimizations for linux (MALL stutter)



[Why]
We can only use this feature when the display is idle. When active vblank
irq count is 0 we know all the displays are idle.

[How]
-Add a active vblank irq counter
-Update the counter when we enable/disable vblank irq
-if vblank irq count is 0 we can consider mall stutter

Signed-off-by: default avatarBhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
Acked-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Reviewed-by: default avatarNick Kazlauskas <Nicholas.Kazlauskas@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent e74c8a46
Loading
Loading
Loading
Loading
+20 −1
Original line number Diff line number Diff line
@@ -5413,6 +5413,7 @@ static inline int dm_set_vblank(struct drm_crtc *crtc, bool enable)
	struct amdgpu_crtc *acrtc = to_amdgpu_crtc(crtc);
	struct amdgpu_device *adev = drm_to_adev(crtc->dev);
	struct dm_crtc_state *acrtc_state = to_dm_crtc_state(crtc->state);
	struct amdgpu_display_manager *dm = &adev->dm;
	int rc = 0;

	if (enable) {
@@ -5428,7 +5429,25 @@ static inline int dm_set_vblank(struct drm_crtc *crtc, bool enable)
		return rc;

	irq_source = IRQ_TYPE_VBLANK + acrtc->otg_inst;
	return dc_interrupt_set(adev->dm.dc, irq_source, enable) ? 0 : -EBUSY;

	if (!dc_interrupt_set(adev->dm.dc, irq_source, enable))
		return -EBUSY;

	mutex_lock(&dm->dc_lock);

	if (enable)
		dm->active_vblank_irq_count++;
	else
		dm->active_vblank_irq_count--;

	dc_allow_idle_optimizations(
		adev->dm.dc, dm->active_vblank_irq_count == 0 ? true : false);

	DRM_DEBUG_DRIVER("Allow idle optimizations (MALL): %d\n", dm->active_vblank_irq_count == 0);

	mutex_unlock(&dm->dc_lock);

	return 0;
}

static int dm_enable_vblank(struct drm_crtc *crtc)
+7 −0
Original line number Diff line number Diff line
@@ -336,6 +336,13 @@ struct amdgpu_display_manager {
	 */
	const struct gpu_info_soc_bounding_box_v1_0 *soc_bounding_box;

	/**
	 * @active_vblank_irq_count
	 *
	 * number of currently active vblank irqs
	 */
	uint32_t active_vblank_irq_count;

#ifdef CONFIG_DEBUG_FS
	/**
	 * @crc_win_x_start_property: