aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.19.8/1161-drm-amdgpu-Bring-back-support-for-non-upstream-FreeS.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/1161-drm-amdgpu-Bring-back-support-for-non-upstream-FreeS.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.19.8/1161-drm-amdgpu-Bring-back-support-for-non-upstream-FreeS.patch200
1 files changed, 200 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/1161-drm-amdgpu-Bring-back-support-for-non-upstream-FreeS.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/1161-drm-amdgpu-Bring-back-support-for-non-upstream-FreeS.patch
new file mode 100644
index 00000000..e39d73ff
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/1161-drm-amdgpu-Bring-back-support-for-non-upstream-FreeS.patch
@@ -0,0 +1,200 @@
+From aca5dae94a32e79af27b1a793e4037ee05f6ba3e Mon Sep 17 00:00:00 2001
+From: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
+Date: Fri, 14 Dec 2018 13:21:51 -0500
+Subject: [PATCH 1161/2940] drm/amdgpu: Bring back support for non-upstream
+ FreeSync
+
+[Why]
+We still have userspace components that depend on the non-upstream
+interface consisting of the notify_freesync driver IOCTL and the
+freesync_capable and freesync_enable properties.
+
+In order to support the new upstream VRR interface these patches were
+reverted, but we would still like to maintain backwards compatibility.
+
+[How]
+The DRM_IOCTL_AMDGPU_FREESYNC is back. The notify_freesync callback is
+also back.
+
+Map freesync_capable to vrr_capable. While freesync_capable was
+technically mutable before the behavior wasn't well defined. It's now
+treated as being essentially immutable.
+
+The freesync_enable property acted as the user preference for whether
+to enable VRR or not - it's used to conditionally control whether the
+vrr_enable CRTC property is set in the driver IOCTL, emulating old
+behavior.
+
+Change-Id: Ib825a6fdc3a7d1d5e5f75972f932fc85731b2fa0
+Signed-off-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
+Reviewed-by: Harry Wentland <harry.wentland@amd.com>
+Signed-off-by: Chaudhary Amit Kumar <Chaudharyamit.Kumar@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu.h | 3 +
+ drivers/gpu/drm/amd/amdgpu/amdgpu_display.c | 10 +++
+ .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 86 +++++++++++++++++++
+ 3 files changed, 99 insertions(+)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+index d81909f682ea..e1a4804fed84 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+@@ -575,6 +575,9 @@ int amdgpu_display_freesync_ioctl(struct drm_device *dev, void *data,
+ int amdgpu_gem_dgma_ioctl(struct drm_device *dev, void *data,
+ struct drm_file *filp);
+
++int amdgpu_display_freesync_ioctl(struct drm_device *dev, void *data,
++ struct drm_file *filp);
++
+ /* VRAM scratch page for HDP bug, default vram page */
+ struct amdgpu_vram_scratch {
+ struct amdgpu_bo *robj;
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
+index 335568f192dd..36da6372607b 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
+@@ -660,6 +660,16 @@ int amdgpu_display_modeset_create_props(struct amdgpu_device *adev)
+ "abm level", 0, 4);
+ if (!adev->mode_info.abm_level_property)
+ return -ENOMEM;
++ adev->mode_info.freesync_property =
++ drm_property_create_bool(adev->ddev, 0, "freesync");
++ if (!adev->mode_info.freesync_property)
++ return -ENOMEM;
++ adev->mode_info.freesync_capable_property =
++ drm_property_create_bool(adev->ddev,
++ 0,
++ "freesync_capable");
++ if (!adev->mode_info.freesync_capable_property)
++ return -ENOMEM;
+ }
+
+ return 0;
+diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+index 5a88fa132e61..f3ca446eb66d 100644
+--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+@@ -2065,6 +2065,78 @@ static void dm_bandwidth_update(struct amdgpu_device *adev)
+ /* TODO: implement later */
+ }
+
++static int amdgpu_notify_freesync(struct drm_device *dev, void *data,
++ struct drm_file *filp)
++{
++ struct drm_amdgpu_freesync *args = data;
++ struct drm_atomic_state *state;
++ struct drm_modeset_acquire_ctx ctx;
++ struct drm_crtc *crtc;
++ struct drm_connector *connector;
++ struct drm_connector_state *old_con_state, *new_con_state;
++ int ret = 0;
++ uint8_t i;
++ bool enable = false;
++
++ if (args->op == AMDGPU_FREESYNC_FULLSCREEN_ENTER)
++ enable = true;
++
++ drm_modeset_acquire_init(&ctx, 0);
++
++ state = drm_atomic_state_alloc(dev);
++ if (!state) {
++ ret = -ENOMEM;
++ goto out;
++ }
++ state->acquire_ctx = &ctx;
++
++retry:
++ drm_for_each_crtc(crtc, dev) {
++ ret = drm_atomic_add_affected_connectors(state, crtc);
++ if (ret)
++ goto fail;
++
++ /* TODO rework amdgpu_dm_commit_planes so we don't need this */
++ ret = drm_atomic_add_affected_planes(state, crtc);
++ if (ret)
++ goto fail;
++ }
++
++ for_each_oldnew_connector_in_state(state, connector, old_con_state, new_con_state, i) {
++ struct dm_connector_state *dm_new_con_state = to_dm_connector_state(new_con_state);
++ struct drm_crtc_state *new_crtc_state;
++ struct amdgpu_crtc *acrtc = to_amdgpu_crtc(dm_new_con_state->base.crtc);
++ struct dm_crtc_state *dm_new_crtc_state;
++
++ if (!acrtc) {
++ ASSERT(0);
++ continue;
++ }
++
++ new_crtc_state = drm_atomic_get_new_crtc_state(state, &acrtc->base);
++ dm_new_crtc_state = to_dm_crtc_state(new_crtc_state);
++
++ dm_new_crtc_state->base.vrr_enabled =
++ dm_new_con_state->freesync_enable && enable;
++ }
++
++ ret = drm_atomic_commit(state);
++
++fail:
++ if (ret == -EDEADLK) {
++ drm_atomic_state_clear(state);
++ drm_modeset_backoff(&ctx);
++ goto retry;
++ }
++
++ drm_atomic_state_put(state);
++
++out:
++ drm_modeset_drop_locks(&ctx);
++ drm_modeset_acquire_fini(&ctx);
++ return ret;
++}
++
+ static const struct amdgpu_display_funcs dm_display_funcs = {
+ .bandwidth_update = dm_bandwidth_update, /* called unconditionally */
+ .vblank_get_counter = dm_vblank_get_counter,/* called unconditionally */
+@@ -2077,6 +2149,7 @@ static const struct amdgpu_display_funcs dm_display_funcs = {
+ dm_crtc_get_scanoutpos,/* called unconditionally */
+ .add_encoder = NULL, /* VBIOS parsing. DAL does it. */
+ .add_connector = NULL, /* VBIOS parsing. DAL does it. */
++ .notify_freesync = amdgpu_notify_freesync,
+ };
+
+ #if defined(CONFIG_DEBUG_KERNEL_DC)
+@@ -3255,6 +3328,12 @@ int amdgpu_dm_connector_atomic_set_property(struct drm_connector *connector,
+ } else if (property == adev->mode_info.abm_level_property) {
+ dm_new_state->abm_level = val;
+ ret = 0;
++ } else if (property == adev->mode_info.freesync_property) {
++ dm_new_state->freesync_enable = val;
++ ret = 0;
++ } else if (property == adev->mode_info.freesync_capable_property) {
++ dm_new_state->freesync_capable = val;
++ ret = 0;
+ }
+
+ return ret;
+@@ -3309,6 +3388,12 @@ int amdgpu_dm_connector_atomic_get_property(struct drm_connector *connector,
+ } else if (property == adev->mode_info.abm_level_property) {
+ *val = dm_state->abm_level;
+ ret = 0;
++ } else if (property == adev->mode_info.freesync_property) {
++ *val = dm_state->freesync_enable;
++ ret = 0;
++ } else if (property == adev->mode_info.freesync_capable_property) {
++ *val = dm_state->freesync_capable;
++ ret = 0;
+ }
+
+ return ret;
+@@ -3374,6 +3459,7 @@ amdgpu_dm_connector_atomic_duplicate_state(struct drm_connector *connector)
+
+ __drm_atomic_helper_connector_duplicate_state(connector, &new_state->base);
+
++ new_state->freesync_enable = state->freesync_enable;
+ new_state->freesync_capable = state->freesync_capable;
+ new_state->abm_level = state->abm_level;
+ new_state->scaling = state->scaling;
+--
+2.17.1
+