From 88000c5041ec31c835d9d25d573c0333ac75d7d2 Mon Sep 17 00:00:00 2001 From: Sasha Levin Date: Wed, 17 Apr 2024 13:16:39 -0400 Subject: [PATCH] Fixes for 6.8 Signed-off-by: Sasha Levin --- ...ix-voltage_level-programming-edge-ca.patch | 127 ++++++++++++++++++ ...cqring_wait-not-restoring-sigmask-on.patch | 73 ++++++++++ queue-6.8/series | 2 + 3 files changed, 202 insertions(+) create mode 100644 queue-6.8/drm-i915-cdclk-fix-voltage_level-programming-edge-ca.patch create mode 100644 queue-6.8/io_uring-fix-io_cqring_wait-not-restoring-sigmask-on.patch create mode 100644 queue-6.8/series diff --git a/queue-6.8/drm-i915-cdclk-fix-voltage_level-programming-edge-ca.patch b/queue-6.8/drm-i915-cdclk-fix-voltage_level-programming-edge-ca.patch new file mode 100644 index 00000000000..1c97d43da1a --- /dev/null +++ b/queue-6.8/drm-i915-cdclk-fix-voltage_level-programming-edge-ca.patch @@ -0,0 +1,127 @@ +From 773f71bd7681c63fd60e7d7da39284ebff27c813 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 2 Apr 2024 18:50:04 +0300 +Subject: drm/i915/cdclk: Fix voltage_level programming edge case +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Ville Syrjälä + +[ Upstream commit 6154cc9177ccea00c89ce0bf93352e474b819ff2 ] + +Currently we only consider the relationship of the +old and new CDCLK frequencies when determining whether +to do the repgramming from intel_set_cdclk_pre_plane_update() +or intel_set_cdclk_post_plane_update(). + +It is technically possible to have a situation where the +CDCLK frequency is decreasing, but the voltage_level is +increasing due a DDI port. In this case we should bump +the voltage level already in intel_set_cdclk_pre_plane_update() +(so that the voltage_level will have been increased by the +time the port gets enabled), while leaving the CDCLK frequency +unchanged (as active planes/etc. may still depend on it). +We can then reduce the CDCLK frequency to its final value +from intel_set_cdclk_post_plane_update(). + +In order to handle that correctly we shall construct a +suitable amalgam of the old and new cdclk states in +intel_set_cdclk_pre_plane_update(). + +And we can simply call intel_set_cdclk() unconditionally +in both places as it will not do anything if nothing actually +changes vs. the current hw state. + +v2: Handle cdclk_state->disable_pipes +v3: Only synchronize the cd2x update against the pipe's vblank + when the cdclk frequency is changing during the current + commit phase (Gustavo) + +Cc: stable@vger.kernel.org +Cc: Gustavo Sousa +Reviewed-by: Uma Shankar +Signed-off-by: Ville Syrjälä +Link: https://patchwork.freedesktop.org/patch/msgid/20240402155016.13733-3-ville.syrjala@linux.intel.com +(cherry picked from commit 34d127e2bdef73a923aa0dcd95cbc3257ad5af52) +Signed-off-by: Rodrigo Vivi +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/i915/display/intel_cdclk.c | 37 ++++++++++++++++------ + 1 file changed, 27 insertions(+), 10 deletions(-) + +diff --git a/drivers/gpu/drm/i915/display/intel_cdclk.c b/drivers/gpu/drm/i915/display/intel_cdclk.c +index 6e36a15284537..7ba30d26f620c 100644 +--- a/drivers/gpu/drm/i915/display/intel_cdclk.c ++++ b/drivers/gpu/drm/i915/display/intel_cdclk.c +@@ -2512,7 +2512,8 @@ intel_set_cdclk_pre_plane_update(struct intel_atomic_state *state) + intel_atomic_get_old_cdclk_state(state); + const struct intel_cdclk_state *new_cdclk_state = + intel_atomic_get_new_cdclk_state(state); +- enum pipe pipe = new_cdclk_state->pipe; ++ struct intel_cdclk_config cdclk_config; ++ enum pipe pipe; + + if (!intel_cdclk_changed(&old_cdclk_state->actual, + &new_cdclk_state->actual)) +@@ -2521,12 +2522,25 @@ intel_set_cdclk_pre_plane_update(struct intel_atomic_state *state) + if (IS_DG2(i915)) + intel_cdclk_pcode_pre_notify(state); + +- if (new_cdclk_state->disable_pipes || +- old_cdclk_state->actual.cdclk <= new_cdclk_state->actual.cdclk) { +- drm_WARN_ON(&i915->drm, !new_cdclk_state->base.changed); ++ if (new_cdclk_state->disable_pipes) { ++ cdclk_config = new_cdclk_state->actual; ++ pipe = INVALID_PIPE; ++ } else { ++ if (new_cdclk_state->actual.cdclk >= old_cdclk_state->actual.cdclk) { ++ cdclk_config = new_cdclk_state->actual; ++ pipe = new_cdclk_state->pipe; ++ } else { ++ cdclk_config = old_cdclk_state->actual; ++ pipe = INVALID_PIPE; ++ } + +- intel_set_cdclk(i915, &new_cdclk_state->actual, pipe); ++ cdclk_config.voltage_level = max(new_cdclk_state->actual.voltage_level, ++ old_cdclk_state->actual.voltage_level); + } ++ ++ drm_WARN_ON(&i915->drm, !new_cdclk_state->base.changed); ++ ++ intel_set_cdclk(i915, &cdclk_config, pipe); + } + + /** +@@ -2544,7 +2558,7 @@ intel_set_cdclk_post_plane_update(struct intel_atomic_state *state) + intel_atomic_get_old_cdclk_state(state); + const struct intel_cdclk_state *new_cdclk_state = + intel_atomic_get_new_cdclk_state(state); +- enum pipe pipe = new_cdclk_state->pipe; ++ enum pipe pipe; + + if (!intel_cdclk_changed(&old_cdclk_state->actual, + &new_cdclk_state->actual)) +@@ -2554,11 +2568,14 @@ intel_set_cdclk_post_plane_update(struct intel_atomic_state *state) + intel_cdclk_pcode_post_notify(state); + + if (!new_cdclk_state->disable_pipes && +- old_cdclk_state->actual.cdclk > new_cdclk_state->actual.cdclk) { +- drm_WARN_ON(&i915->drm, !new_cdclk_state->base.changed); ++ new_cdclk_state->actual.cdclk < old_cdclk_state->actual.cdclk) ++ pipe = new_cdclk_state->pipe; ++ else ++ pipe = INVALID_PIPE; + +- intel_set_cdclk(i915, &new_cdclk_state->actual, pipe); +- } ++ drm_WARN_ON(&i915->drm, !new_cdclk_state->base.changed); ++ ++ intel_set_cdclk(i915, &new_cdclk_state->actual, pipe); + } + + static int intel_pixel_rate_to_cdclk(const struct intel_crtc_state *crtc_state) +-- +2.43.0 + diff --git a/queue-6.8/io_uring-fix-io_cqring_wait-not-restoring-sigmask-on.patch b/queue-6.8/io_uring-fix-io_cqring_wait-not-restoring-sigmask-on.patch new file mode 100644 index 00000000000..0dafcbb1383 --- /dev/null +++ b/queue-6.8/io_uring-fix-io_cqring_wait-not-restoring-sigmask-on.patch @@ -0,0 +1,73 @@ +From 80eb4b220963a07c2d5f7a5f96a722e906c933e2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 5 Apr 2024 15:55:51 +0300 +Subject: io_uring: Fix io_cqring_wait() not restoring sigmask on + get_timespec64() failure + +From: Alexey Izbyshev + +[ Upstream commit 978e5c19dfefc271e5550efba92fcef0d3f62864 ] + +This bug was introduced in commit 950e79dd7313 ("io_uring: minor +io_cqring_wait() optimization"), which was made in preparation for +adc8682ec690 ("io_uring: Add support for napi_busy_poll"). The latter +got reverted in cb3182167325 ("Revert "io_uring: Add support for +napi_busy_poll""), so simply undo the former as well. + +Cc: stable@vger.kernel.org +Fixes: 950e79dd7313 ("io_uring: minor io_cqring_wait() optimization") +Signed-off-by: Alexey Izbyshev +Link: https://lore.kernel.org/r/20240405125551.237142-1-izbyshev@ispras.ru +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + io_uring/io_uring.c | 26 +++++++++++++------------- + 1 file changed, 13 insertions(+), 13 deletions(-) + +diff --git a/io_uring/io_uring.c b/io_uring/io_uring.c +index 3fc792dfc6ae7..dc0235ff472d3 100644 +--- a/io_uring/io_uring.c ++++ b/io_uring/io_uring.c +@@ -2610,19 +2610,6 @@ static int io_cqring_wait(struct io_ring_ctx *ctx, int min_events, + if (__io_cqring_events_user(ctx) >= min_events) + return 0; + +- if (sig) { +-#ifdef CONFIG_COMPAT +- if (in_compat_syscall()) +- ret = set_compat_user_sigmask((const compat_sigset_t __user *)sig, +- sigsz); +- else +-#endif +- ret = set_user_sigmask(sig, sigsz); +- +- if (ret) +- return ret; +- } +- + init_waitqueue_func_entry(&iowq.wq, io_wake_function); + iowq.wq.private = current; + INIT_LIST_HEAD(&iowq.wq.entry); +@@ -2639,6 +2626,19 @@ static int io_cqring_wait(struct io_ring_ctx *ctx, int min_events, + iowq.timeout = ktime_add_ns(timespec64_to_ktime(ts), ktime_get_ns()); + } + ++ if (sig) { ++#ifdef CONFIG_COMPAT ++ if (in_compat_syscall()) ++ ret = set_compat_user_sigmask((const compat_sigset_t __user *)sig, ++ sigsz); ++ else ++#endif ++ ret = set_user_sigmask(sig, sigsz); ++ ++ if (ret) ++ return ret; ++ } ++ + trace_io_uring_cqring_wait(ctx, min_events); + do { + int nr_wait = (int) iowq.cq_tail - READ_ONCE(ctx->rings->cq.tail); +-- +2.43.0 + diff --git a/queue-6.8/series b/queue-6.8/series new file mode 100644 index 00000000000..c76a125ec81 --- /dev/null +++ b/queue-6.8/series @@ -0,0 +1,2 @@ +io_uring-fix-io_cqring_wait-not-restoring-sigmask-on.patch +drm-i915-cdclk-fix-voltage_level-programming-edge-ca.patch -- 2.47.2