]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
Fixes for 5.10
authorSasha Levin <sashal@kernel.org>
Sat, 16 Dec 2023 21:00:37 +0000 (16:00 -0500)
committerSasha Levin <sashal@kernel.org>
Sat, 16 Dec 2023 21:00:37 +0000 (16:00 -0500)
Signed-off-by: Sasha Levin <sashal@kernel.org>
18 files changed:
queue-5.10/asm-generic-qspinlock-fix-queued_spin_value_unlocked.patch [new file with mode: 0644]
queue-5.10/bcache-add-code-comments-for-bch_btree_node_get-and-.patch [new file with mode: 0644]
queue-5.10/bcache-avoid-null-checking-to-c-root-in-run_cache_se.patch [new file with mode: 0644]
queue-5.10/bcache-avoid-oversize-memory-allocation-by-small-str.patch [new file with mode: 0644]
queue-5.10/bcache-remove-redundant-assignment-to-variable-cur_i.patch [new file with mode: 0644]
queue-5.10/blk-throttle-fix-lockdep-warning-of-cgroup_mutex-or-.patch [new file with mode: 0644]
queue-5.10/drm-atomic-pass-the-full-state-to-crtc-atomic-begin-.patch [new file with mode: 0644]
queue-5.10/drm-mediatek-add-spinlock-for-setting-vblank-event-i.patch [new file with mode: 0644]
queue-5.10/drm-use-state-helper-instead-of-crtc-state-pointer.patch [new file with mode: 0644]
queue-5.10/hid-add-always_poll-quirk-for-apple-kb.patch [new file with mode: 0644]
queue-5.10/hid-glorious-fix-glorious-model-i-hid-report.patch [new file with mode: 0644]
queue-5.10/hid-hid-asus-add-const-to-read-only-outgoing-usb-buf.patch [new file with mode: 0644]
queue-5.10/hid-hid-asus-reset-the-backlight-brightness-level-on.patch [new file with mode: 0644]
queue-5.10/hid-multitouch-add-quirk-for-honor-glo-gxxx-touchpad.patch [new file with mode: 0644]
queue-5.10/net-usb-qmi_wwan-claim-interface-4-for-zte-mf290.patch [new file with mode: 0644]
queue-5.10/platform-x86-intel_telemetry-fix-kernel-doc-descript.patch [new file with mode: 0644]
queue-5.10/series
queue-5.10/usb-aqc111-check-packet-for-fixup-for-true-limit.patch [new file with mode: 0644]

diff --git a/queue-5.10/asm-generic-qspinlock-fix-queued_spin_value_unlocked.patch b/queue-5.10/asm-generic-qspinlock-fix-queued_spin_value_unlocked.patch
new file mode 100644 (file)
index 0000000..92a0c05
--- /dev/null
@@ -0,0 +1,51 @@
+From 53d167765768360f98a2c7fa41469456e84dc12e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 9 Nov 2023 22:22:13 -0800
+Subject: asm-generic: qspinlock: fix queued_spin_value_unlocked()
+ implementation
+
+From: Linus Torvalds <torvalds@linux-foundation.org>
+
+[ Upstream commit 125b0bb95dd6bec81b806b997a4ccb026eeecf8f ]
+
+We really don't want to do atomic_read() or anything like that, since we
+already have the value, not the lock.  The whole point of this is that
+we've loaded the lock from memory, and we want to check whether the
+value we loaded was a locked one or not.
+
+The main use of this is the lockref code, which loads both the lock and
+the reference count in one atomic operation, and then works on that
+combined value.  With the atomic_read(), the compiler would pointlessly
+spill the value to the stack, in order to then be able to read it back
+"atomically".
+
+This is the qspinlock version of commit c6f4a9002252 ("asm-generic:
+ticket-lock: Optimize arch_spin_value_unlocked()") which fixed this same
+bug for ticket locks.
+
+Cc: Guo Ren <guoren@kernel.org>
+Cc: Ingo Molnar <mingo@kernel.org>
+Cc: Waiman Long <longman@redhat.com>
+Link: https://lore.kernel.org/all/CAHk-=whNRv0v6kQiV5QO6DJhjH4KEL36vWQ6Re8Csrnh4zbRkQ@mail.gmail.com/
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/asm-generic/qspinlock.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/include/asm-generic/qspinlock.h b/include/asm-generic/qspinlock.h
+index 4fe7fd0fe834d..d1ddbcf71791d 100644
+--- a/include/asm-generic/qspinlock.h
++++ b/include/asm-generic/qspinlock.h
+@@ -41,7 +41,7 @@ static __always_inline int queued_spin_is_locked(struct qspinlock *lock)
+  */
+ static __always_inline int queued_spin_value_unlocked(struct qspinlock lock)
+ {
+-      return !atomic_read(&lock.val);
++      return !lock.val.counter;
+ }
+ /**
+-- 
+2.43.0
+
diff --git a/queue-5.10/bcache-add-code-comments-for-bch_btree_node_get-and-.patch b/queue-5.10/bcache-add-code-comments-for-bch_btree_node_get-and-.patch
new file mode 100644 (file)
index 0000000..f153d0f
--- /dev/null
@@ -0,0 +1,50 @@
+From 4faab4702f28325d96c8c99c85afbea831048c63 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 20 Nov 2023 13:25:02 +0800
+Subject: bcache: add code comments for bch_btree_node_get() and
+ __bch_btree_node_alloc()
+
+From: Coly Li <colyli@suse.de>
+
+[ Upstream commit 31f5b956a197d4ec25c8a07cb3a2ab69d0c0b82f ]
+
+This patch adds code comments to bch_btree_node_get() and
+__bch_btree_node_alloc() that NULL pointer will not be returned and it
+is unnecessary to check NULL pointer by the callers of these routines.
+
+Signed-off-by: Coly Li <colyli@suse.de>
+Link: https://lore.kernel.org/r/20231120052503.6122-10-colyli@suse.de
+Signed-off-by: Jens Axboe <axboe@kernel.dk>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/md/bcache/btree.c | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/drivers/md/bcache/btree.c b/drivers/md/bcache/btree.c
+index 3d6a7fbcbb15e..1a1a9554474ae 100644
+--- a/drivers/md/bcache/btree.c
++++ b/drivers/md/bcache/btree.c
+@@ -974,6 +974,9 @@ static struct btree *mca_alloc(struct cache_set *c, struct btree_op *op,
+  *
+  * The btree node will have either a read or a write lock held, depending on
+  * level and op->lock.
++ *
++ * Note: Only error code or btree pointer will be returned, it is unncessary
++ *       for callers to check NULL pointer.
+  */
+ struct btree *bch_btree_node_get(struct cache_set *c, struct btree_op *op,
+                                struct bkey *k, int level, bool write,
+@@ -1085,6 +1088,10 @@ static void btree_node_free(struct btree *b)
+       mutex_unlock(&b->c->bucket_lock);
+ }
++/*
++ * Only error code or btree pointer will be returned, it is unncessary for
++ * callers to check NULL pointer.
++ */
+ struct btree *__bch_btree_node_alloc(struct cache_set *c, struct btree_op *op,
+                                    int level, bool wait,
+                                    struct btree *parent)
+-- 
+2.43.0
+
diff --git a/queue-5.10/bcache-avoid-null-checking-to-c-root-in-run_cache_se.patch b/queue-5.10/bcache-avoid-null-checking-to-c-root-in-run_cache_se.patch
new file mode 100644 (file)
index 0000000..af8280b
--- /dev/null
@@ -0,0 +1,39 @@
+From 4f3e081506dd288cfa4139ec08c0ef10007cb772 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 20 Nov 2023 13:25:03 +0800
+Subject: bcache: avoid NULL checking to c->root in run_cache_set()
+
+From: Coly Li <colyli@suse.de>
+
+[ Upstream commit 3eba5e0b2422aec3c9e79822029599961fdcab97 ]
+
+In run_cache_set() after c->root returned from bch_btree_node_get(), it
+is checked by IS_ERR_OR_NULL(). Indeed it is unncessary to check NULL
+because bch_btree_node_get() will not return NULL pointer to caller.
+
+This patch replaces IS_ERR_OR_NULL() by IS_ERR() for the above reason.
+
+Signed-off-by: Coly Li <colyli@suse.de>
+Link: https://lore.kernel.org/r/20231120052503.6122-11-colyli@suse.de
+Signed-off-by: Jens Axboe <axboe@kernel.dk>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/md/bcache/super.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c
+index 9c3e1632568c3..04ddaa4bbd77f 100644
+--- a/drivers/md/bcache/super.c
++++ b/drivers/md/bcache/super.c
+@@ -2043,7 +2043,7 @@ static int run_cache_set(struct cache_set *c)
+               c->root = bch_btree_node_get(c, NULL, k,
+                                            j->btree_level,
+                                            true, NULL);
+-              if (IS_ERR_OR_NULL(c->root))
++              if (IS_ERR(c->root))
+                       goto err;
+               list_del_init(&c->root->list);
+-- 
+2.43.0
+
diff --git a/queue-5.10/bcache-avoid-oversize-memory-allocation-by-small-str.patch b/queue-5.10/bcache-avoid-oversize-memory-allocation-by-small-str.patch
new file mode 100644 (file)
index 0000000..029f385
--- /dev/null
@@ -0,0 +1,90 @@
+From 7a724f1e259cdec5c02ebb0cd1563bebb7f6f741 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 20 Nov 2023 13:24:54 +0800
+Subject: bcache: avoid oversize memory allocation by small stripe_size
+
+From: Coly Li <colyli@suse.de>
+
+[ Upstream commit baf8fb7e0e5ec54ea0839f0c534f2cdcd79bea9c ]
+
+Arraies bcache->stripe_sectors_dirty and bcache->full_dirty_stripes are
+used for dirty data writeback, their sizes are decided by backing device
+capacity and stripe size. Larger backing device capacity or smaller
+stripe size make these two arraies occupies more dynamic memory space.
+
+Currently bcache->stripe_size is directly inherited from
+queue->limits.io_opt of underlying storage device. For normal hard
+drives, its limits.io_opt is 0, and bcache sets the corresponding
+stripe_size to 1TB (1<<31 sectors), it works fine 10+ years. But for
+devices do declare value for queue->limits.io_opt, small stripe_size
+(comparing to 1TB) becomes an issue for oversize memory allocations of
+bcache->stripe_sectors_dirty and bcache->full_dirty_stripes, while the
+capacity of hard drives gets much larger in recent decade.
+
+For example a raid5 array assembled by three 20TB hardrives, the raid
+device capacity is 40TB with typical 512KB limits.io_opt. After the math
+calculation in bcache code, these two arraies will occupy 400MB dynamic
+memory. Even worse Andrea Tomassetti reports that a 4KB limits.io_opt is
+declared on a new 2TB hard drive, then these two arraies request 2GB and
+512MB dynamic memory from kzalloc(). The result is that bcache device
+always fails to initialize on his system.
+
+To avoid the oversize memory allocation, bcache->stripe_size should not
+directly inherited by queue->limits.io_opt from the underlying device.
+This patch defines BCH_MIN_STRIPE_SZ (4MB) as minimal bcache stripe size
+and set bcache device's stripe size against the declared limits.io_opt
+value from the underlying storage device,
+- If the declared limits.io_opt > BCH_MIN_STRIPE_SZ, bcache device will
+  set its stripe size directly by this limits.io_opt value.
+- If the declared limits.io_opt < BCH_MIN_STRIPE_SZ, bcache device will
+  set its stripe size by a value multiplying limits.io_opt and euqal or
+  large than BCH_MIN_STRIPE_SZ.
+
+Then the minimal stripe size of a bcache device will always be >= 4MB.
+For a 40TB raid5 device with 512KB limits.io_opt, memory occupied by
+bcache->stripe_sectors_dirty and bcache->full_dirty_stripes will be 50MB
+in total. For a 2TB hard drive with 4KB limits.io_opt, memory occupied
+by these two arraies will be 2.5MB in total.
+
+Such mount of memory allocated for bcache->stripe_sectors_dirty and
+bcache->full_dirty_stripes is reasonable for most of storage devices.
+
+Reported-by: Andrea Tomassetti <andrea.tomassetti-opensource@devo.com>
+Signed-off-by: Coly Li <colyli@suse.de>
+Reviewed-by: Eric Wheeler <bcache@lists.ewheeler.net>
+Link: https://lore.kernel.org/r/20231120052503.6122-2-colyli@suse.de
+Signed-off-by: Jens Axboe <axboe@kernel.dk>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/md/bcache/bcache.h | 1 +
+ drivers/md/bcache/super.c  | 2 ++
+ 2 files changed, 3 insertions(+)
+
+diff --git a/drivers/md/bcache/bcache.h b/drivers/md/bcache/bcache.h
+index e8bf4f752e8be..5804a8e6e215a 100644
+--- a/drivers/md/bcache/bcache.h
++++ b/drivers/md/bcache/bcache.h
+@@ -265,6 +265,7 @@ struct bcache_device {
+ #define BCACHE_DEV_WB_RUNNING         3
+ #define BCACHE_DEV_RATE_DW_RUNNING    4
+       int                     nr_stripes;
++#define BCH_MIN_STRIPE_SZ             ((4 << 20) >> SECTOR_SHIFT)
+       unsigned int            stripe_size;
+       atomic_t                *stripe_sectors_dirty;
+       unsigned long           *full_dirty_stripes;
+diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c
+index e8c8077667f9e..9c3e1632568c3 100644
+--- a/drivers/md/bcache/super.c
++++ b/drivers/md/bcache/super.c
+@@ -917,6 +917,8 @@ static int bcache_device_init(struct bcache_device *d, unsigned int block_size,
+       if (!d->stripe_size)
+               d->stripe_size = 1 << 31;
++      else if (d->stripe_size < BCH_MIN_STRIPE_SZ)
++              d->stripe_size = roundup(BCH_MIN_STRIPE_SZ, d->stripe_size);
+       n = DIV_ROUND_UP_ULL(sectors, d->stripe_size);
+       if (!n || n > max_stripes) {
+-- 
+2.43.0
+
diff --git a/queue-5.10/bcache-remove-redundant-assignment-to-variable-cur_i.patch b/queue-5.10/bcache-remove-redundant-assignment-to-variable-cur_i.patch
new file mode 100644 (file)
index 0000000..c370559
--- /dev/null
@@ -0,0 +1,42 @@
+From a82d79742913c22c434268deb78d49bcc5f16913 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 20 Nov 2023 13:24:56 +0800
+Subject: bcache: remove redundant assignment to variable cur_idx
+
+From: Colin Ian King <colin.i.king@gmail.com>
+
+[ Upstream commit be93825f0e6428c2d3f03a6e4d447dc48d33d7ff ]
+
+Variable cur_idx is being initialized with a value that is never read,
+it is being re-assigned later in a while-loop. Remove the redundant
+assignment. Cleans up clang scan build warning:
+
+drivers/md/bcache/writeback.c:916:2: warning: Value stored to 'cur_idx'
+is never read [deadcode.DeadStores]
+
+Signed-off-by: Colin Ian King <colin.i.king@gmail.com>
+Reviewed-by: Coly Li <colyli@suse.de>
+Signed-off-by: Coly Li <colyli@suse.de>
+Link: https://lore.kernel.org/r/20231120052503.6122-4-colyli@suse.de
+Signed-off-by: Jens Axboe <axboe@kernel.dk>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/md/bcache/writeback.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/md/bcache/writeback.c b/drivers/md/bcache/writeback.c
+index 94e899ce38554..8e3f5f004c397 100644
+--- a/drivers/md/bcache/writeback.c
++++ b/drivers/md/bcache/writeback.c
+@@ -857,7 +857,7 @@ static int bch_dirty_init_thread(void *arg)
+       int cur_idx, prev_idx, skip_nr;
+       k = p = NULL;
+-      cur_idx = prev_idx = 0;
++      prev_idx = 0;
+       bch_btree_iter_init(&c->root->keys, &iter, NULL);
+       k = bch_btree_iter_next_filter(&iter, &c->root->keys, bch_ptr_bad);
+-- 
+2.43.0
+
diff --git a/queue-5.10/blk-throttle-fix-lockdep-warning-of-cgroup_mutex-or-.patch b/queue-5.10/blk-throttle-fix-lockdep-warning-of-cgroup_mutex-or-.patch
new file mode 100644 (file)
index 0000000..aaeb749
--- /dev/null
@@ -0,0 +1,49 @@
+From 18d5b4908b5c3c7af76892e09038d2b560e220eb Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 17 Nov 2023 10:35:22 +0800
+Subject: blk-throttle: fix lockdep warning of "cgroup_mutex or RCU read lock
+ required!"
+
+From: Ming Lei <ming.lei@redhat.com>
+
+[ Upstream commit 27b13e209ddca5979847a1b57890e0372c1edcee ]
+
+Inside blkg_for_each_descendant_pre(), both
+css_for_each_descendant_pre() and blkg_lookup() requires RCU read lock,
+and either cgroup_assert_mutex_or_rcu_locked() or rcu_read_lock_held()
+is called.
+
+Fix the warning by adding rcu read lock.
+
+Reported-by: Changhui Zhong <czhong@redhat.com>
+Signed-off-by: Ming Lei <ming.lei@redhat.com>
+Link: https://lore.kernel.org/r/20231117023527.3188627-2-ming.lei@redhat.com
+Signed-off-by: Jens Axboe <axboe@kernel.dk>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ block/blk-throttle.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/block/blk-throttle.c b/block/blk-throttle.c
+index c526fdd0a7b90..4bf514a7bd82c 100644
+--- a/block/blk-throttle.c
++++ b/block/blk-throttle.c
+@@ -1409,6 +1409,7 @@ static void tg_conf_updated(struct throtl_grp *tg, bool global)
+                  tg_bps_limit(tg, READ), tg_bps_limit(tg, WRITE),
+                  tg_iops_limit(tg, READ), tg_iops_limit(tg, WRITE));
++      rcu_read_lock();
+       /*
+        * Update has_rules[] flags for the updated tg's subtree.  A tg is
+        * considered to have rules if either the tg itself or any of its
+@@ -1436,6 +1437,7 @@ static void tg_conf_updated(struct throtl_grp *tg, bool global)
+               this_tg->latency_target = max(this_tg->latency_target,
+                               parent_tg->latency_target);
+       }
++      rcu_read_unlock();
+       /*
+        * We're already holding queue_lock and know @tg is valid.  Let's
+-- 
+2.43.0
+
diff --git a/queue-5.10/drm-atomic-pass-the-full-state-to-crtc-atomic-begin-.patch b/queue-5.10/drm-atomic-pass-the-full-state-to-crtc-atomic-begin-.patch
new file mode 100644 (file)
index 0000000..2e0bc63
--- /dev/null
@@ -0,0 +1,1126 @@
+From bfc9ac42f8c6d5c3dee78c8daf97ed426e628449 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 28 Oct 2020 13:32:22 +0100
+Subject: drm/atomic: Pass the full state to CRTC atomic begin and flush
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Maxime Ripard <maxime@cerno.tech>
+
+[ Upstream commit f6ebe9f9c9233a6114eb922aba9a0c9ccc2d2e14 ]
+
+The current atomic helpers have either their object state being passed as
+an argument or the full atomic state.
+
+The former is the pattern that was done at first, before switching to the
+latter for new hooks or when it was needed.
+
+Let's start convert all the remaining helpers to provide a consistent
+interface, starting with the CRTC's atomic_begin and atomic_flush.
+
+The conversion was done using the coccinelle script below, built tested on
+all the drivers and actually tested on vc4.
+
+virtual report
+
+@@
+struct drm_crtc_helper_funcs *FUNCS;
+identifier old_crtc_state, old_state;
+identifier crtc;
+identifier f;
+@@
+
+ f(struct drm_crtc_state *old_crtc_state)
+ {
+       ...
+       struct drm_atomic_state *old_state = old_crtc_state->state;
+       <...
+-      FUNCS->atomic_begin(crtc, old_crtc_state);
++      FUNCS->atomic_begin(crtc, old_state);
+       ...>
+ }
+
+@@
+struct drm_crtc_helper_funcs *FUNCS;
+identifier old_crtc_state, old_state;
+identifier crtc;
+identifier f;
+@@
+
+ f(struct drm_crtc_state *old_crtc_state)
+ {
+       ...
+       struct drm_atomic_state *old_state = old_crtc_state->state;
+       <...
+-      FUNCS->atomic_flush(crtc, old_crtc_state);
++      FUNCS->atomic_flush(crtc, old_state);
+       ...>
+ }
+
+@@
+struct drm_crtc_helper_funcs *FUNCS;
+struct drm_crtc *crtc;
+struct drm_crtc_state *crtc_state;
+identifier dev, state;
+identifier f;
+@@
+
+ f(struct drm_device *dev, struct drm_atomic_state *state, ...)
+ {
+       <...
+-      FUNCS->atomic_begin(crtc, crtc_state);
++      FUNCS->atomic_begin(crtc, state);
+       ...>
+ }
+
+@@
+struct drm_crtc_helper_funcs *FUNCS;
+struct drm_crtc *crtc;
+struct drm_crtc_state *crtc_state;
+identifier dev, state;
+identifier f;
+@@
+
+ f(struct drm_device *dev, struct drm_atomic_state *state, ...)
+ {
+       <...
+-      FUNCS->atomic_flush(crtc, crtc_state);
++      FUNCS->atomic_flush(crtc, state);
+       ...>
+ }
+
+@@
+identifier crtc, old_state;
+@@
+
+ struct drm_crtc_helper_funcs {
+       ...
+-      void (*atomic_begin)(struct drm_crtc *crtc, struct drm_crtc_state *old_state);
++      void (*atomic_begin)(struct drm_crtc *crtc, struct drm_atomic_state *state);
+       ...
+-      void (*atomic_flush)(struct drm_crtc *crtc, struct drm_crtc_state *old_state);
++      void (*atomic_flush)(struct drm_crtc *crtc, struct drm_atomic_state *state);
+       ...
+}
+
+@ crtc_atomic_func @
+identifier helpers;
+identifier func;
+@@
+
+(
+static struct drm_crtc_helper_funcs helpers = {
+       ...,
+       .atomic_begin = func,
+       ...,
+};
+|
+static struct drm_crtc_helper_funcs helpers = {
+       ...,
+       .atomic_flush = func,
+       ...,
+};
+)
+
+@ ignores_old_state @
+identifier crtc_atomic_func.func;
+identifier crtc, old_state;
+@@
+
+void func(struct drm_crtc *crtc,
+               struct drm_crtc_state *old_state)
+{
+       ... when != old_state
+}
+
+@ adds_old_state depends on crtc_atomic_func && !ignores_old_state @
+identifier crtc_atomic_func.func;
+identifier crtc, old_state;
+@@
+
+void func(struct drm_crtc *crtc, struct drm_crtc_state *old_state)
+{
++      struct drm_crtc_state *old_state = drm_atomic_get_old_crtc_state(state, crtc);
+       ...
+}
+
+@ depends on crtc_atomic_func @
+identifier crtc_atomic_func.func;
+expression E;
+type T;
+@@
+
+void func(...)
+{
+       ...
+-      T state = E;
++      T crtc_state = E;
+       <+...
+-      state
++      crtc_state
+       ...+>
+
+}
+
+@ depends on crtc_atomic_func @
+identifier crtc_atomic_func.func;
+type T;
+@@
+
+void func(...)
+{
+       ...
+-      T state;
++      T crtc_state;
+       <+...
+-      state
++      crtc_state
+       ...+>
+
+}
+
+@@
+identifier old_state;
+identifier crtc;
+@@
+
+ void vc4_hvs_atomic_flush(struct drm_crtc *crtc,
+-                         struct drm_crtc_state *old_state
++                         struct drm_atomic_state *state
+                          )
+{
++      struct drm_crtc_state *old_state = drm_atomic_get_old_crtc_state(state, crtc);
+       ...
+}
+
+@@
+identifier old_state;
+identifier crtc;
+@@
+
+ void vc4_hvs_atomic_flush(struct drm_crtc *crtc,
+-                         struct drm_crtc_state *old_state
++                         struct drm_atomic_state *state
+                          );
+
+@@
+identifier old_state;
+identifier crtc;
+@@
+
+ void vmw_du_crtc_atomic_begin(struct drm_crtc *crtc,
+-                         struct drm_crtc_state *old_state
++                         struct drm_atomic_state *state
+                          )
+{
+       ...
+}
+
+@@
+identifier old_state;
+identifier crtc;
+@@
+
+ void vmw_du_crtc_atomic_begin(struct drm_crtc *crtc,
+-                         struct drm_crtc_state *old_state
++                         struct drm_atomic_state *state
+                          );
+
+@@
+identifier old_state;
+identifier crtc;
+@@
+
+ void vmw_du_crtc_atomic_flush(struct drm_crtc *crtc,
+-                         struct drm_crtc_state *old_state
++                         struct drm_atomic_state *state
+                          )
+{
+       ...
+}
+
+@@
+identifier old_state;
+identifier crtc;
+@@
+
+ void vmw_du_crtc_atomic_flush(struct drm_crtc *crtc,
+-                         struct drm_crtc_state *old_state
++                         struct drm_atomic_state *state
+                          );
+
+@ depends on crtc_atomic_func @
+identifier crtc_atomic_func.func;
+identifier old_state;
+identifier crtc;
+@@
+
+void func(struct drm_crtc *crtc,
+-             struct drm_crtc_state *old_state
++             struct drm_atomic_state *state
+              )
+               { ... }
+
+@ include depends on adds_old_state @
+@@
+
+ #include <drm/drm_atomic.h>
+
+@ no_include depends on !include && adds_old_state @
+@@
+
++ #include <drm/drm_atomic.h>
+  #include <drm/...>
+
+Signed-off-by: Maxime Ripard <maxime@cerno.tech>
+Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
+Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch>
+Acked-by: Thomas Zimmermann <tzimmermann@suse.de>
+Link: https://patchwork.freedesktop.org/patch/msgid/20201028123222.1732139-2-maxime@cerno.tech
+Stable-dep-of: fe4c5f662097 ("drm/mediatek: Add spinlock for setting vblank event in atomic_begin")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ .../gpu/drm/arm/display/komeda/komeda_crtc.c    |  4 +++-
+ drivers/gpu/drm/arm/hdlcd_crtc.c                |  2 +-
+ drivers/gpu/drm/armada/armada_crtc.c            |  4 ++--
+ drivers/gpu/drm/ast/ast_mode.c                  |  5 ++++-
+ drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c  |  4 ++--
+ drivers/gpu/drm/drm_atomic_helper.c             |  8 ++++----
+ drivers/gpu/drm/exynos/exynos_drm_crtc.c        |  4 ++--
+ drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_crtc.c      |  2 +-
+ drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c  |  4 ++--
+ drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c |  4 ++--
+ drivers/gpu/drm/imx/dcss/dcss-crtc.c            |  4 ++--
+ drivers/gpu/drm/imx/ipuv3-crtc.c                |  4 ++--
+ drivers/gpu/drm/ingenic/ingenic-drm-drv.c       | 17 +++++++++--------
+ drivers/gpu/drm/mediatek/mtk_drm_crtc.c         | 16 ++++++++--------
+ drivers/gpu/drm/meson/meson_crtc.c              |  4 ++--
+ drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c        |  4 ++--
+ drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c       |  4 ++--
+ drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c       |  4 ++--
+ drivers/gpu/drm/mxsfb/mxsfb_kms.c               |  2 +-
+ drivers/gpu/drm/omapdrm/omap_crtc.c             |  4 ++--
+ drivers/gpu/drm/qxl/qxl_display.c               |  2 +-
+ drivers/gpu/drm/rcar-du/rcar_du_crtc.c          |  4 ++--
+ drivers/gpu/drm/rockchip/rockchip_drm_vop.c     |  8 ++++++--
+ drivers/gpu/drm/sti/sti_crtc.c                  |  2 +-
+ drivers/gpu/drm/stm/ltdc.c                      |  2 +-
+ drivers/gpu/drm/sun4i/sun4i_crtc.c              |  6 ++++--
+ drivers/gpu/drm/tegra/dc.c                      | 10 +++++-----
+ drivers/gpu/drm/tidss/tidss_crtc.c              |  4 +++-
+ drivers/gpu/drm/tilcdc/tilcdc_crtc.c            |  2 +-
+ drivers/gpu/drm/vboxvideo/vbox_mode.c           |  2 +-
+ drivers/gpu/drm/vc4/vc4_drv.h                   |  3 ++-
+ drivers/gpu/drm/vc4/vc4_hvs.c                   |  4 +++-
+ drivers/gpu/drm/virtio/virtgpu_display.c        |  2 +-
+ drivers/gpu/drm/vkms/vkms_crtc.c                |  4 ++--
+ drivers/gpu/drm/vmwgfx/vmwgfx_kms.c             |  4 ++--
+ drivers/gpu/drm/vmwgfx/vmwgfx_kms.h             |  4 ++--
+ drivers/gpu/drm/xlnx/zynqmp_disp.c              |  4 ++--
+ drivers/gpu/drm/zte/zx_vou.c                    |  2 +-
+ include/drm/drm_modeset_helper_vtables.h        |  4 ++--
+ 39 files changed, 97 insertions(+), 80 deletions(-)
+
+diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c b/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
+index f33418d6e1a08..3c77eeb0a7a0c 100644
+--- a/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
++++ b/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
+@@ -379,8 +379,10 @@ komeda_crtc_atomic_disable(struct drm_crtc *crtc,
+ static void
+ komeda_crtc_atomic_flush(struct drm_crtc *crtc,
+-                       struct drm_crtc_state *old)
++                       struct drm_atomic_state *state)
+ {
++      struct drm_crtc_state *old = drm_atomic_get_old_crtc_state(state,
++                                                                 crtc);
+       /* commit with modeset will be handled in enable/disable */
+       if (drm_atomic_crtc_needs_modeset(crtc->state))
+               return;
+diff --git a/drivers/gpu/drm/arm/hdlcd_crtc.c b/drivers/gpu/drm/arm/hdlcd_crtc.c
+index af67fefed38dc..bd17646f4e133 100644
+--- a/drivers/gpu/drm/arm/hdlcd_crtc.c
++++ b/drivers/gpu/drm/arm/hdlcd_crtc.c
+@@ -205,7 +205,7 @@ static enum drm_mode_status hdlcd_crtc_mode_valid(struct drm_crtc *crtc,
+ }
+ static void hdlcd_crtc_atomic_begin(struct drm_crtc *crtc,
+-                                  struct drm_crtc_state *state)
++                                  struct drm_atomic_state *state)
+ {
+       struct drm_pending_vblank_event *event = crtc->state->event;
+diff --git a/drivers/gpu/drm/armada/armada_crtc.c b/drivers/gpu/drm/armada/armada_crtc.c
+index a887b6a5f8bd7..13c7c474fb26e 100644
+--- a/drivers/gpu/drm/armada/armada_crtc.c
++++ b/drivers/gpu/drm/armada/armada_crtc.c
+@@ -427,7 +427,7 @@ static int armada_drm_crtc_atomic_check(struct drm_crtc *crtc,
+ }
+ static void armada_drm_crtc_atomic_begin(struct drm_crtc *crtc,
+-                                       struct drm_crtc_state *old_crtc_state)
++                                       struct drm_atomic_state *state)
+ {
+       struct armada_crtc *dcrtc = drm_to_armada_crtc(crtc);
+@@ -441,7 +441,7 @@ static void armada_drm_crtc_atomic_begin(struct drm_crtc *crtc,
+ }
+ static void armada_drm_crtc_atomic_flush(struct drm_crtc *crtc,
+-                                       struct drm_crtc_state *old_crtc_state)
++                                       struct drm_atomic_state *state)
+ {
+       struct armada_crtc *dcrtc = drm_to_armada_crtc(crtc);
+diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c
+index d27f2840b9555..84c2e90d415f4 100644
+--- a/drivers/gpu/drm/ast/ast_mode.c
++++ b/drivers/gpu/drm/ast/ast_mode.c
+@@ -777,8 +777,11 @@ static int ast_crtc_helper_atomic_check(struct drm_crtc *crtc,
+ }
+ static void
+-ast_crtc_helper_atomic_flush(struct drm_crtc *crtc, struct drm_crtc_state *old_crtc_state)
++ast_crtc_helper_atomic_flush(struct drm_crtc *crtc,
++                           struct drm_atomic_state *state)
+ {
++      struct drm_crtc_state *old_crtc_state = drm_atomic_get_old_crtc_state(state,
++                                                                            crtc);
+       struct ast_private *ast = to_ast_private(crtc->dev);
+       struct ast_crtc_state *ast_crtc_state = to_ast_crtc_state(crtc->state);
+       struct ast_crtc_state *old_ast_crtc_state = to_ast_crtc_state(old_crtc_state);
+diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c
+index ce246b96330b7..e7064abfa66ef 100644
+--- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c
++++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c
+@@ -341,7 +341,7 @@ static int atmel_hlcdc_crtc_atomic_check(struct drm_crtc *c,
+ }
+ static void atmel_hlcdc_crtc_atomic_begin(struct drm_crtc *c,
+-                                        struct drm_crtc_state *old_s)
++                                        struct drm_atomic_state *state)
+ {
+       struct atmel_hlcdc_crtc *crtc = drm_crtc_to_atmel_hlcdc_crtc(c);
+@@ -356,7 +356,7 @@ static void atmel_hlcdc_crtc_atomic_begin(struct drm_crtc *c,
+ }
+ static void atmel_hlcdc_crtc_atomic_flush(struct drm_crtc *crtc,
+-                                        struct drm_crtc_state *old_s)
++                                        struct drm_atomic_state *state)
+ {
+       /* TODO: write common plane control register if available */
+ }
+diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c
+index 0fde260b7edd8..121947e570e97 100644
+--- a/drivers/gpu/drm/drm_atomic_helper.c
++++ b/drivers/gpu/drm/drm_atomic_helper.c
+@@ -2526,7 +2526,7 @@ void drm_atomic_helper_commit_planes(struct drm_device *dev,
+               if (active_only && !new_crtc_state->active)
+                       continue;
+-              funcs->atomic_begin(crtc, old_crtc_state);
++              funcs->atomic_begin(crtc, old_state);
+       }
+       for_each_oldnew_plane_in_state(old_state, plane, old_plane_state, new_plane_state, i) {
+@@ -2584,7 +2584,7 @@ void drm_atomic_helper_commit_planes(struct drm_device *dev,
+               if (active_only && !new_crtc_state->active)
+                       continue;
+-              funcs->atomic_flush(crtc, old_crtc_state);
++              funcs->atomic_flush(crtc, old_state);
+       }
+ }
+ EXPORT_SYMBOL(drm_atomic_helper_commit_planes);
+@@ -2622,7 +2622,7 @@ drm_atomic_helper_commit_planes_on_crtc(struct drm_crtc_state *old_crtc_state)
+       crtc_funcs = crtc->helper_private;
+       if (crtc_funcs && crtc_funcs->atomic_begin)
+-              crtc_funcs->atomic_begin(crtc, old_crtc_state);
++              crtc_funcs->atomic_begin(crtc, old_state);
+       drm_for_each_plane_mask(plane, crtc->dev, plane_mask) {
+               struct drm_plane_state *old_plane_state =
+@@ -2648,7 +2648,7 @@ drm_atomic_helper_commit_planes_on_crtc(struct drm_crtc_state *old_crtc_state)
+       }
+       if (crtc_funcs && crtc_funcs->atomic_flush)
+-              crtc_funcs->atomic_flush(crtc, old_crtc_state);
++              crtc_funcs->atomic_flush(crtc, old_state);
+ }
+ EXPORT_SYMBOL(drm_atomic_helper_commit_planes_on_crtc);
+diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.c b/drivers/gpu/drm/exynos/exynos_drm_crtc.c
+index de9fadccf22e5..3043f49c70f0c 100644
+--- a/drivers/gpu/drm/exynos/exynos_drm_crtc.c
++++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.c
+@@ -62,7 +62,7 @@ static int exynos_crtc_atomic_check(struct drm_crtc *crtc,
+ }
+ static void exynos_crtc_atomic_begin(struct drm_crtc *crtc,
+-                                   struct drm_crtc_state *old_crtc_state)
++                                   struct drm_atomic_state *state)
+ {
+       struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc);
+@@ -71,7 +71,7 @@ static void exynos_crtc_atomic_begin(struct drm_crtc *crtc,
+ }
+ static void exynos_crtc_atomic_flush(struct drm_crtc *crtc,
+-                                   struct drm_crtc_state *old_crtc_state)
++                                   struct drm_atomic_state *state)
+ {
+       struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc);
+diff --git a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_crtc.c b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_crtc.c
+index b9ca81a6f80fb..9cd0c5c35af96 100644
+--- a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_crtc.c
++++ b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_crtc.c
+@@ -21,7 +21,7 @@
+ #include "fsl_dcu_drm_plane.h"
+ static void fsl_dcu_drm_crtc_atomic_flush(struct drm_crtc *crtc,
+-                                        struct drm_crtc_state *old_crtc_state)
++                                        struct drm_atomic_state *state)
+ {
+       struct drm_device *dev = crtc->dev;
+       struct fsl_dcu_drm_device *fsl_dev = dev->dev_private;
+diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c
+index 4d57ec688f827..222a895a3608e 100644
+--- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c
++++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c
+@@ -393,7 +393,7 @@ static void hibmc_crtc_mode_set_nofb(struct drm_crtc *crtc)
+ }
+ static void hibmc_crtc_atomic_begin(struct drm_crtc *crtc,
+-                                  struct drm_crtc_state *old_state)
++                                  struct drm_atomic_state *state)
+ {
+       unsigned int reg;
+       struct drm_device *dev = crtc->dev;
+@@ -413,7 +413,7 @@ static void hibmc_crtc_atomic_begin(struct drm_crtc *crtc,
+ }
+ static void hibmc_crtc_atomic_flush(struct drm_crtc *crtc,
+-                                  struct drm_crtc_state *old_state)
++                                  struct drm_atomic_state *state)
+ {
+       unsigned long flags;
+diff --git a/drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c b/drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c
+index e1108c1735ad0..32d3cc89dbe93 100644
+--- a/drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c
++++ b/drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c
+@@ -485,7 +485,7 @@ static void ade_crtc_mode_set_nofb(struct drm_crtc *crtc)
+ }
+ static void ade_crtc_atomic_begin(struct drm_crtc *crtc,
+-                                struct drm_crtc_state *old_state)
++                                struct drm_atomic_state *state)
+ {
+       struct kirin_crtc *kcrtc = to_kirin_crtc(crtc);
+       struct ade_hw_ctx *ctx = kcrtc->hw_ctx;
+@@ -498,7 +498,7 @@ static void ade_crtc_atomic_begin(struct drm_crtc *crtc,
+ }
+ static void ade_crtc_atomic_flush(struct drm_crtc *crtc,
+-                                struct drm_crtc_state *old_state)
++                                struct drm_atomic_state *state)
+ {
+       struct kirin_crtc *kcrtc = to_kirin_crtc(crtc);
+diff --git a/drivers/gpu/drm/imx/dcss/dcss-crtc.c b/drivers/gpu/drm/imx/dcss/dcss-crtc.c
+index 36abff0890b28..98fb71ca06695 100644
+--- a/drivers/gpu/drm/imx/dcss/dcss-crtc.c
++++ b/drivers/gpu/drm/imx/dcss/dcss-crtc.c
+@@ -52,13 +52,13 @@ static const struct drm_crtc_funcs dcss_crtc_funcs = {
+ };
+ static void dcss_crtc_atomic_begin(struct drm_crtc *crtc,
+-                                 struct drm_crtc_state *old_crtc_state)
++                                 struct drm_atomic_state *state)
+ {
+       drm_crtc_vblank_on(crtc);
+ }
+ static void dcss_crtc_atomic_flush(struct drm_crtc *crtc,
+-                                 struct drm_crtc_state *old_crtc_state)
++                                 struct drm_atomic_state *state)
+ {
+       struct dcss_crtc *dcss_crtc = container_of(crtc, struct dcss_crtc,
+                                                  base);
+diff --git a/drivers/gpu/drm/imx/ipuv3-crtc.c b/drivers/gpu/drm/imx/ipuv3-crtc.c
+index fd9d8e51837fa..cf1e39f83401f 100644
+--- a/drivers/gpu/drm/imx/ipuv3-crtc.c
++++ b/drivers/gpu/drm/imx/ipuv3-crtc.c
+@@ -236,13 +236,13 @@ static int ipu_crtc_atomic_check(struct drm_crtc *crtc,
+ }
+ static void ipu_crtc_atomic_begin(struct drm_crtc *crtc,
+-                                struct drm_crtc_state *old_crtc_state)
++                                struct drm_atomic_state *state)
+ {
+       drm_crtc_vblank_on(crtc);
+ }
+ static void ipu_crtc_atomic_flush(struct drm_crtc *crtc,
+-                                struct drm_crtc_state *old_crtc_state)
++                                struct drm_atomic_state *state)
+ {
+       spin_lock_irq(&crtc->dev->event_lock);
+       if (crtc->state->event) {
+diff --git a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
+index 5ec9770e401e4..6d56b701118da 100644
+--- a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
++++ b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
+@@ -287,7 +287,7 @@ ingenic_drm_crtc_mode_valid(struct drm_crtc *crtc, const struct drm_display_mode
+ }
+ static void ingenic_drm_crtc_atomic_begin(struct drm_crtc *crtc,
+-                                        struct drm_crtc_state *oldstate)
++                                        struct drm_atomic_state *state)
+ {
+       struct ingenic_drm *priv = drm_crtc_get_priv(crtc);
+       u32 ctrl = 0;
+@@ -307,26 +307,27 @@ static void ingenic_drm_crtc_atomic_begin(struct drm_crtc *crtc,
+ }
+ static void ingenic_drm_crtc_atomic_flush(struct drm_crtc *crtc,
+-                                        struct drm_crtc_state *oldstate)
++                                        struct drm_atomic_state *state)
+ {
+       struct ingenic_drm *priv = drm_crtc_get_priv(crtc);
+-      struct drm_crtc_state *state = crtc->state;
+-      struct drm_pending_vblank_event *event = state->event;
++      struct drm_crtc_state *crtc_state = crtc->state;
++      struct drm_pending_vblank_event *event = crtc_state->event;
+-      if (drm_atomic_crtc_needs_modeset(state)) {
+-              ingenic_drm_crtc_update_timings(priv, &state->mode);
++      if (drm_atomic_crtc_needs_modeset(crtc_state)) {
++              ingenic_drm_crtc_update_timings(priv, &crtc_state->mode);
+               priv->update_clk_rate = true;
+       }
+       if (priv->update_clk_rate) {
+               mutex_lock(&priv->clk_mutex);
+-              clk_set_rate(priv->pix_clk, state->adjusted_mode.clock * 1000);
++              clk_set_rate(priv->pix_clk,
++                           crtc_state->adjusted_mode.clock * 1000);
+               priv->update_clk_rate = false;
+               mutex_unlock(&priv->clk_mutex);
+       }
+       if (event) {
+-              state->event = NULL;
++              crtc_state->event = NULL;
+               spin_lock_irq(&crtc->dev->event_lock);
+               if (drm_crtc_vblank_get(crtc) == 0)
+diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
+index cc3cb5b63d444..067b4dc39f4f0 100644
+--- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
++++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
+@@ -578,24 +578,24 @@ static void mtk_drm_crtc_atomic_disable(struct drm_crtc *crtc,
+ }
+ static void mtk_drm_crtc_atomic_begin(struct drm_crtc *crtc,
+-                                    struct drm_crtc_state *old_crtc_state)
++                                    struct drm_atomic_state *state)
+ {
+-      struct mtk_crtc_state *state = to_mtk_crtc_state(crtc->state);
++      struct mtk_crtc_state *crtc_state = to_mtk_crtc_state(crtc->state);
+       struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc);
+-      if (mtk_crtc->event && state->base.event)
++      if (mtk_crtc->event && crtc_state->base.event)
+               DRM_ERROR("new event while there is still a pending event\n");
+-      if (state->base.event) {
+-              state->base.event->pipe = drm_crtc_index(crtc);
++      if (crtc_state->base.event) {
++              crtc_state->base.event->pipe = drm_crtc_index(crtc);
+               WARN_ON(drm_crtc_vblank_get(crtc) != 0);
+-              mtk_crtc->event = state->base.event;
+-              state->base.event = NULL;
++              mtk_crtc->event = crtc_state->base.event;
++              crtc_state->base.event = NULL;
+       }
+ }
+ static void mtk_drm_crtc_atomic_flush(struct drm_crtc *crtc,
+-                                    struct drm_crtc_state *old_crtc_state)
++                                    struct drm_atomic_state *state)
+ {
+       struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc);
+       int i;
+diff --git a/drivers/gpu/drm/meson/meson_crtc.c b/drivers/gpu/drm/meson/meson_crtc.c
+index 2854272dc2d9b..c7f7bb160bba4 100644
+--- a/drivers/gpu/drm/meson/meson_crtc.c
++++ b/drivers/gpu/drm/meson/meson_crtc.c
+@@ -201,7 +201,7 @@ static void meson_crtc_atomic_disable(struct drm_crtc *crtc,
+ }
+ static void meson_crtc_atomic_begin(struct drm_crtc *crtc,
+-                                  struct drm_crtc_state *state)
++                                  struct drm_atomic_state *state)
+ {
+       struct meson_crtc *meson_crtc = to_meson_crtc(crtc);
+       unsigned long flags;
+@@ -217,7 +217,7 @@ static void meson_crtc_atomic_begin(struct drm_crtc *crtc,
+ }
+ static void meson_crtc_atomic_flush(struct drm_crtc *crtc,
+-                                  struct drm_crtc_state *old_crtc_state)
++                                  struct drm_atomic_state *state)
+ {
+       struct meson_crtc *meson_crtc = to_meson_crtc(crtc);
+       struct meson_drm *priv = meson_crtc->priv;
+diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
+index 4c64e2d4f6500..108911a43f92b 100644
+--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
++++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
+@@ -485,7 +485,7 @@ static void _dpu_crtc_setup_cp_blocks(struct drm_crtc *crtc)
+ }
+ static void dpu_crtc_atomic_begin(struct drm_crtc *crtc,
+-              struct drm_crtc_state *old_state)
++              struct drm_atomic_state *state)
+ {
+       struct dpu_crtc_state *cstate = to_dpu_crtc_state(crtc->state);
+       struct drm_encoder *encoder;
+@@ -526,7 +526,7 @@ static void dpu_crtc_atomic_begin(struct drm_crtc *crtc,
+ }
+ static void dpu_crtc_atomic_flush(struct drm_crtc *crtc,
+-              struct drm_crtc_state *old_crtc_state)
++              struct drm_atomic_state *state)
+ {
+       struct dpu_crtc *dpu_crtc;
+       struct drm_device *dev;
+diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c
+index a0253297bc769..69ac1eee1a227 100644
+--- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c
++++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c
+@@ -316,14 +316,14 @@ static int mdp4_crtc_atomic_check(struct drm_crtc *crtc,
+ }
+ static void mdp4_crtc_atomic_begin(struct drm_crtc *crtc,
+-                                 struct drm_crtc_state *old_crtc_state)
++                                 struct drm_atomic_state *state)
+ {
+       struct mdp4_crtc *mdp4_crtc = to_mdp4_crtc(crtc);
+       DBG("%s: begin", mdp4_crtc->name);
+ }
+ static void mdp4_crtc_atomic_flush(struct drm_crtc *crtc,
+-                                 struct drm_crtc_state *old_crtc_state)
++                                 struct drm_atomic_state *state)
+ {
+       struct mdp4_crtc *mdp4_crtc = to_mdp4_crtc(crtc);
+       struct drm_device *dev = crtc->dev;
+diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c
+index 60e7371cd0e0d..077369989a04b 100644
+--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c
++++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c
+@@ -775,13 +775,13 @@ static int mdp5_crtc_atomic_check(struct drm_crtc *crtc,
+ }
+ static void mdp5_crtc_atomic_begin(struct drm_crtc *crtc,
+-                                 struct drm_crtc_state *old_crtc_state)
++                                 struct drm_atomic_state *state)
+ {
+       DBG("%s: begin", crtc->name);
+ }
+ static void mdp5_crtc_atomic_flush(struct drm_crtc *crtc,
+-                                 struct drm_crtc_state *old_crtc_state)
++                                 struct drm_atomic_state *state)
+ {
+       struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc);
+       struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state);
+diff --git a/drivers/gpu/drm/mxsfb/mxsfb_kms.c b/drivers/gpu/drm/mxsfb/mxsfb_kms.c
+index b535621f4f78d..d0e9d0ae9951f 100644
+--- a/drivers/gpu/drm/mxsfb/mxsfb_kms.c
++++ b/drivers/gpu/drm/mxsfb/mxsfb_kms.c
+@@ -324,7 +324,7 @@ static int mxsfb_crtc_atomic_check(struct drm_crtc *crtc,
+ }
+ static void mxsfb_crtc_atomic_flush(struct drm_crtc *crtc,
+-                                  struct drm_crtc_state *old_state)
++                                  struct drm_atomic_state *state)
+ {
+       struct drm_pending_vblank_event *event;
+diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c
+index 328a4a74f534e..3bc060682dcdc 100644
+--- a/drivers/gpu/drm/omapdrm/omap_crtc.c
++++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
+@@ -598,12 +598,12 @@ static int omap_crtc_atomic_check(struct drm_crtc *crtc,
+ }
+ static void omap_crtc_atomic_begin(struct drm_crtc *crtc,
+-                                 struct drm_crtc_state *old_crtc_state)
++                                 struct drm_atomic_state *state)
+ {
+ }
+ static void omap_crtc_atomic_flush(struct drm_crtc *crtc,
+-                                 struct drm_crtc_state *old_crtc_state)
++                                 struct drm_atomic_state *state)
+ {
+       struct omap_drm_private *priv = crtc->dev->dev_private;
+       struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
+diff --git a/drivers/gpu/drm/qxl/qxl_display.c b/drivers/gpu/drm/qxl/qxl_display.c
+index f22a1b776f4ba..26294016f1e39 100644
+--- a/drivers/gpu/drm/qxl/qxl_display.c
++++ b/drivers/gpu/drm/qxl/qxl_display.c
+@@ -373,7 +373,7 @@ static void qxl_crtc_update_monitors_config(struct drm_crtc *crtc,
+ }
+ static void qxl_crtc_atomic_flush(struct drm_crtc *crtc,
+-                                struct drm_crtc_state *old_crtc_state)
++                                struct drm_atomic_state *state)
+ {
+       qxl_crtc_update_monitors_config(crtc, "flush");
+ }
+diff --git a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
+index 065604c5837de..7007a8120394e 100644
+--- a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
++++ b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
+@@ -780,7 +780,7 @@ static void rcar_du_crtc_atomic_disable(struct drm_crtc *crtc,
+ }
+ static void rcar_du_crtc_atomic_begin(struct drm_crtc *crtc,
+-                                    struct drm_crtc_state *old_crtc_state)
++                                    struct drm_atomic_state *state)
+ {
+       struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc);
+@@ -809,7 +809,7 @@ static void rcar_du_crtc_atomic_begin(struct drm_crtc *crtc,
+ }
+ static void rcar_du_crtc_atomic_flush(struct drm_crtc *crtc,
+-                                    struct drm_crtc_state *old_crtc_state)
++                                    struct drm_atomic_state *state)
+ {
+       struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc);
+       struct drm_device *dev = rcrtc->crtc.dev;
+diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
+index 682d78fab9a59..b7eeb3183aa94 100644
+--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
++++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
+@@ -1255,8 +1255,10 @@ static void vop_crtc_gamma_set(struct vop *vop, struct drm_crtc *crtc,
+ }
+ static void vop_crtc_atomic_begin(struct drm_crtc *crtc,
+-                                struct drm_crtc_state *old_crtc_state)
++                                struct drm_atomic_state *state)
+ {
++      struct drm_crtc_state *old_crtc_state = drm_atomic_get_old_crtc_state(state,
++                                                                            crtc);
+       struct vop *vop = to_vop(crtc);
+       /*
+@@ -1467,8 +1469,10 @@ static int vop_crtc_atomic_check(struct drm_crtc *crtc,
+ }
+ static void vop_crtc_atomic_flush(struct drm_crtc *crtc,
+-                                struct drm_crtc_state *old_crtc_state)
++                                struct drm_atomic_state *state)
+ {
++      struct drm_crtc_state *old_crtc_state = drm_atomic_get_old_crtc_state(state,
++                                                                            crtc);
+       struct drm_atomic_state *old_state = old_crtc_state->state;
+       struct drm_plane_state *old_plane_state, *new_plane_state;
+       struct vop *vop = to_vop(crtc);
+diff --git a/drivers/gpu/drm/sti/sti_crtc.c b/drivers/gpu/drm/sti/sti_crtc.c
+index 6f37c104c46f9..4f1e22933f48b 100644
+--- a/drivers/gpu/drm/sti/sti_crtc.c
++++ b/drivers/gpu/drm/sti/sti_crtc.c
+@@ -133,7 +133,7 @@ sti_crtc_mode_set_nofb(struct drm_crtc *crtc)
+ }
+ static void sti_crtc_atomic_flush(struct drm_crtc *crtc,
+-                                struct drm_crtc_state *old_crtc_state)
++                                struct drm_atomic_state *state)
+ {
+       struct drm_device *drm_dev = crtc->dev;
+       struct sti_mixer *mixer = to_sti_mixer(crtc);
+diff --git a/drivers/gpu/drm/stm/ltdc.c b/drivers/gpu/drm/stm/ltdc.c
+index 089c00a8e7d49..ae73b93a14612 100644
+--- a/drivers/gpu/drm/stm/ltdc.c
++++ b/drivers/gpu/drm/stm/ltdc.c
+@@ -629,7 +629,7 @@ static void ltdc_crtc_mode_set_nofb(struct drm_crtc *crtc)
+ }
+ static void ltdc_crtc_atomic_flush(struct drm_crtc *crtc,
+-                                 struct drm_crtc_state *old_crtc_state)
++                                 struct drm_atomic_state *state)
+ {
+       struct ltdc_device *ldev = crtc_to_ltdc(crtc);
+       struct drm_device *ddev = crtc->dev;
+diff --git a/drivers/gpu/drm/sun4i/sun4i_crtc.c b/drivers/gpu/drm/sun4i/sun4i_crtc.c
+index 3a153648b3698..cab86ec070843 100644
+--- a/drivers/gpu/drm/sun4i/sun4i_crtc.c
++++ b/drivers/gpu/drm/sun4i/sun4i_crtc.c
+@@ -58,8 +58,10 @@ static int sun4i_crtc_atomic_check(struct drm_crtc *crtc,
+ }
+ static void sun4i_crtc_atomic_begin(struct drm_crtc *crtc,
+-                                  struct drm_crtc_state *old_state)
++                                  struct drm_atomic_state *state)
+ {
++      struct drm_crtc_state *old_state = drm_atomic_get_old_crtc_state(state,
++                                                                       crtc);
+       struct sun4i_crtc *scrtc = drm_crtc_to_sun4i_crtc(crtc);
+       struct drm_device *dev = crtc->dev;
+       struct sunxi_engine *engine = scrtc->engine;
+@@ -79,7 +81,7 @@ static void sun4i_crtc_atomic_begin(struct drm_crtc *crtc,
+ }
+ static void sun4i_crtc_atomic_flush(struct drm_crtc *crtc,
+-                                  struct drm_crtc_state *old_state)
++                                  struct drm_atomic_state *state)
+ {
+       struct sun4i_crtc *scrtc = drm_crtc_to_sun4i_crtc(crtc);
+       struct drm_pending_vblank_event *event = crtc->state->event;
+diff --git a/drivers/gpu/drm/tegra/dc.c b/drivers/gpu/drm/tegra/dc.c
+index 958d12da902d3..f1e8951fa86c4 100644
+--- a/drivers/gpu/drm/tegra/dc.c
++++ b/drivers/gpu/drm/tegra/dc.c
+@@ -1924,7 +1924,7 @@ static void tegra_crtc_atomic_enable(struct drm_crtc *crtc,
+ }
+ static void tegra_crtc_atomic_begin(struct drm_crtc *crtc,
+-                                  struct drm_crtc_state *old_crtc_state)
++                                  struct drm_atomic_state *state)
+ {
+       unsigned long flags;
+@@ -1943,17 +1943,17 @@ static void tegra_crtc_atomic_begin(struct drm_crtc *crtc,
+ }
+ static void tegra_crtc_atomic_flush(struct drm_crtc *crtc,
+-                                  struct drm_crtc_state *old_crtc_state)
++                                  struct drm_atomic_state *state)
+ {
+-      struct tegra_dc_state *state = to_dc_state(crtc->state);
++      struct tegra_dc_state *crtc_state = to_dc_state(crtc->state);
+       struct tegra_dc *dc = to_tegra_dc(crtc);
+       u32 value;
+-      value = state->planes << 8 | GENERAL_UPDATE;
++      value = crtc_state->planes << 8 | GENERAL_UPDATE;
+       tegra_dc_writel(dc, value, DC_CMD_STATE_CONTROL);
+       value = tegra_dc_readl(dc, DC_CMD_STATE_CONTROL);
+-      value = state->planes | GENERAL_ACT_REQ;
++      value = crtc_state->planes | GENERAL_ACT_REQ;
+       tegra_dc_writel(dc, value, DC_CMD_STATE_CONTROL);
+       value = tegra_dc_readl(dc, DC_CMD_STATE_CONTROL);
+ }
+diff --git a/drivers/gpu/drm/tidss/tidss_crtc.c b/drivers/gpu/drm/tidss/tidss_crtc.c
+index 3c5744a91d4a0..7f80496173e85 100644
+--- a/drivers/gpu/drm/tidss/tidss_crtc.c
++++ b/drivers/gpu/drm/tidss/tidss_crtc.c
+@@ -161,8 +161,10 @@ static void tidss_crtc_position_planes(struct tidss_device *tidss,
+ }
+ static void tidss_crtc_atomic_flush(struct drm_crtc *crtc,
+-                                  struct drm_crtc_state *old_crtc_state)
++                                  struct drm_atomic_state *state)
+ {
++      struct drm_crtc_state *old_crtc_state = drm_atomic_get_old_crtc_state(state,
++                                                                            crtc);
+       struct tidss_crtc *tcrtc = to_tidss_crtc(crtc);
+       struct drm_device *ddev = crtc->dev;
+       struct tidss_device *tidss = to_tidss(ddev);
+diff --git a/drivers/gpu/drm/tilcdc/tilcdc_crtc.c b/drivers/gpu/drm/tilcdc/tilcdc_crtc.c
+index 0aaa4a26b5db5..bf8587c24dfe7 100644
+--- a/drivers/gpu/drm/tilcdc/tilcdc_crtc.c
++++ b/drivers/gpu/drm/tilcdc/tilcdc_crtc.c
+@@ -547,7 +547,7 @@ static void tilcdc_crtc_atomic_disable(struct drm_crtc *crtc,
+ }
+ static void tilcdc_crtc_atomic_flush(struct drm_crtc *crtc,
+-                                   struct drm_crtc_state *old_state)
++                                   struct drm_atomic_state *state)
+ {
+       if (!crtc->state->event)
+               return;
+diff --git a/drivers/gpu/drm/vboxvideo/vbox_mode.c b/drivers/gpu/drm/vboxvideo/vbox_mode.c
+index 4fcc0a542b8a6..ce173baaa84b6 100644
+--- a/drivers/gpu/drm/vboxvideo/vbox_mode.c
++++ b/drivers/gpu/drm/vboxvideo/vbox_mode.c
+@@ -223,7 +223,7 @@ static void vbox_crtc_atomic_disable(struct drm_crtc *crtc,
+ }
+ static void vbox_crtc_atomic_flush(struct drm_crtc *crtc,
+-                                 struct drm_crtc_state *old_crtc_state)
++                                 struct drm_atomic_state *state)
+ {
+ }
+diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h
+index 921463625d82e..5d1e6a8323bf2 100644
+--- a/drivers/gpu/drm/vc4/vc4_drv.h
++++ b/drivers/gpu/drm/vc4/vc4_drv.h
+@@ -919,7 +919,8 @@ int vc4_hvs_get_fifo_from_output(struct drm_device *dev, unsigned int output);
+ int vc4_hvs_atomic_check(struct drm_crtc *crtc, struct drm_crtc_state *state);
+ void vc4_hvs_atomic_enable(struct drm_crtc *crtc, struct drm_crtc_state *old_state);
+ void vc4_hvs_atomic_disable(struct drm_crtc *crtc, struct drm_crtc_state *old_state);
+-void vc4_hvs_atomic_flush(struct drm_crtc *crtc, struct drm_crtc_state *state);
++void vc4_hvs_atomic_flush(struct drm_crtc *crtc,
++                        struct drm_atomic_state *state);
+ void vc4_hvs_dump_state(struct drm_device *dev);
+ void vc4_hvs_unmask_underrun(struct drm_device *dev, int channel);
+ void vc4_hvs_mask_underrun(struct drm_device *dev, int channel);
+diff --git a/drivers/gpu/drm/vc4/vc4_hvs.c b/drivers/gpu/drm/vc4/vc4_hvs.c
+index f8f2fc3d15f73..34c342968e49e 100644
+--- a/drivers/gpu/drm/vc4/vc4_hvs.c
++++ b/drivers/gpu/drm/vc4/vc4_hvs.c
+@@ -414,8 +414,10 @@ void vc4_hvs_atomic_disable(struct drm_crtc *crtc,
+ }
+ void vc4_hvs_atomic_flush(struct drm_crtc *crtc,
+-                        struct drm_crtc_state *old_state)
++                        struct drm_atomic_state *state)
+ {
++      struct drm_crtc_state *old_state = drm_atomic_get_old_crtc_state(state,
++                                                                       crtc);
+       struct drm_device *dev = crtc->dev;
+       struct vc4_dev *vc4 = to_vc4_dev(dev);
+       struct vc4_crtc_state *vc4_state = to_vc4_crtc_state(crtc->state);
+diff --git a/drivers/gpu/drm/virtio/virtgpu_display.c b/drivers/gpu/drm/virtio/virtgpu_display.c
+index 9b2b99e853422..fcbb0a6cdb173 100644
+--- a/drivers/gpu/drm/virtio/virtgpu_display.c
++++ b/drivers/gpu/drm/virtio/virtgpu_display.c
+@@ -117,7 +117,7 @@ static int virtio_gpu_crtc_atomic_check(struct drm_crtc *crtc,
+ }
+ static void virtio_gpu_crtc_atomic_flush(struct drm_crtc *crtc,
+-                                       struct drm_crtc_state *old_state)
++                                       struct drm_atomic_state *state)
+ {
+       struct virtio_gpu_output *output = drm_crtc_to_virtio_gpu_output(crtc);
+diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c b/drivers/gpu/drm/vkms/vkms_crtc.c
+index 1ae5cd47d9546..252b7e0ba58e8 100644
+--- a/drivers/gpu/drm/vkms/vkms_crtc.c
++++ b/drivers/gpu/drm/vkms/vkms_crtc.c
+@@ -227,7 +227,7 @@ static void vkms_crtc_atomic_disable(struct drm_crtc *crtc,
+ }
+ static void vkms_crtc_atomic_begin(struct drm_crtc *crtc,
+-                                 struct drm_crtc_state *old_crtc_state)
++                                 struct drm_atomic_state *state)
+ {
+       struct vkms_output *vkms_output = drm_crtc_to_vkms_output(crtc);
+@@ -238,7 +238,7 @@ static void vkms_crtc_atomic_begin(struct drm_crtc *crtc,
+ }
+ static void vkms_crtc_atomic_flush(struct drm_crtc *crtc,
+-                                 struct drm_crtc_state *old_crtc_state)
++                                 struct drm_atomic_state *state)
+ {
+       struct vkms_output *vkms_output = drm_crtc_to_vkms_output(crtc);
+diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
+index 0e963fd7db17e..0d5da0a1b506a 100644
+--- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
++++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
+@@ -553,13 +553,13 @@ int vmw_du_crtc_atomic_check(struct drm_crtc *crtc,
+ void vmw_du_crtc_atomic_begin(struct drm_crtc *crtc,
+-                            struct drm_crtc_state *old_crtc_state)
++                            struct drm_atomic_state *state)
+ {
+ }
+ void vmw_du_crtc_atomic_flush(struct drm_crtc *crtc,
+-                            struct drm_crtc_state *old_crtc_state)
++                            struct drm_atomic_state *state)
+ {
+       struct drm_pending_vblank_event *event = crtc->state->event;
+diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h
+index 3ee03227607c6..d49b1c741b6b1 100644
+--- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h
++++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h
+@@ -475,9 +475,9 @@ void vmw_du_plane_unpin_surf(struct vmw_plane_state *vps,
+ int vmw_du_crtc_atomic_check(struct drm_crtc *crtc,
+                            struct drm_crtc_state *state);
+ void vmw_du_crtc_atomic_begin(struct drm_crtc *crtc,
+-                            struct drm_crtc_state *old_crtc_state);
++                            struct drm_atomic_state *state);
+ void vmw_du_crtc_atomic_flush(struct drm_crtc *crtc,
+-                            struct drm_crtc_state *old_crtc_state);
++                            struct drm_atomic_state *state);
+ void vmw_du_crtc_reset(struct drm_crtc *crtc);
+ struct drm_crtc_state *vmw_du_crtc_duplicate_state(struct drm_crtc *crtc);
+ void vmw_du_crtc_destroy_state(struct drm_crtc *crtc,
+diff --git a/drivers/gpu/drm/xlnx/zynqmp_disp.c b/drivers/gpu/drm/xlnx/zynqmp_disp.c
+index 205c72a249b75..227449ca017ee 100644
+--- a/drivers/gpu/drm/xlnx/zynqmp_disp.c
++++ b/drivers/gpu/drm/xlnx/zynqmp_disp.c
+@@ -1511,14 +1511,14 @@ static int zynqmp_disp_crtc_atomic_check(struct drm_crtc *crtc,
+ static void
+ zynqmp_disp_crtc_atomic_begin(struct drm_crtc *crtc,
+-                            struct drm_crtc_state *old_crtc_state)
++                            struct drm_atomic_state *state)
+ {
+       drm_crtc_vblank_on(crtc);
+ }
+ static void
+ zynqmp_disp_crtc_atomic_flush(struct drm_crtc *crtc,
+-                            struct drm_crtc_state *old_crtc_state)
++                            struct drm_atomic_state *state)
+ {
+       if (crtc->state->event) {
+               struct drm_pending_vblank_event *event;
+diff --git a/drivers/gpu/drm/zte/zx_vou.c b/drivers/gpu/drm/zte/zx_vou.c
+index 5259ff2825f94..d91563a2603a8 100644
+--- a/drivers/gpu/drm/zte/zx_vou.c
++++ b/drivers/gpu/drm/zte/zx_vou.c
+@@ -473,7 +473,7 @@ static void zx_crtc_atomic_disable(struct drm_crtc *crtc,
+ }
+ static void zx_crtc_atomic_flush(struct drm_crtc *crtc,
+-                                struct drm_crtc_state *old_state)
++                                struct drm_atomic_state *state)
+ {
+       struct drm_pending_vblank_event *event = crtc->state->event;
+diff --git a/include/drm/drm_modeset_helper_vtables.h b/include/drm/drm_modeset_helper_vtables.h
+index 4efec30f8badc..e4b645f5b04a1 100644
+--- a/include/drm/drm_modeset_helper_vtables.h
++++ b/include/drm/drm_modeset_helper_vtables.h
+@@ -374,7 +374,7 @@ struct drm_crtc_helper_funcs {
+        * transitional plane helpers, but it is optional.
+        */
+       void (*atomic_begin)(struct drm_crtc *crtc,
+-                           struct drm_crtc_state *old_crtc_state);
++                           struct drm_atomic_state *state);
+       /**
+        * @atomic_flush:
+        *
+@@ -398,7 +398,7 @@ struct drm_crtc_helper_funcs {
+        * transitional plane helpers, but it is optional.
+        */
+       void (*atomic_flush)(struct drm_crtc *crtc,
+-                           struct drm_crtc_state *old_crtc_state);
++                           struct drm_atomic_state *state);
+       /**
+        * @atomic_enable:
+-- 
+2.43.0
+
diff --git a/queue-5.10/drm-mediatek-add-spinlock-for-setting-vblank-event-i.patch b/queue-5.10/drm-mediatek-add-spinlock-for-setting-vblank-event-i.patch
new file mode 100644 (file)
index 0000000..da73b7b
--- /dev/null
@@ -0,0 +1,54 @@
+From f146663fde558696a402e78bb742a97111eb67d8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 20 Sep 2023 17:06:58 +0800
+Subject: drm/mediatek: Add spinlock for setting vblank event in atomic_begin
+
+From: Jason-JH.Lin <jason-jh.lin@mediatek.com>
+
+[ Upstream commit fe4c5f662097978b6c91c23a13c24ed92339a180 ]
+
+Add spinlock protection to avoid race condition on vblank event
+between mtk_drm_crtc_atomic_begin() and mtk_drm_finish_page_flip().
+
+Fixes: 119f5173628a ("drm/mediatek: Add DRM Driver for Mediatek SoC MT8173.")
+Signed-off-by: Jason-JH.Lin <jason-jh.lin@mediatek.com>
+Suggested-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
+Reviewed-by: Alexandre Mergnat <amergnat@baylibre.com>
+Reviewed-by: Fei Shao <fshao@chromium.org>
+Tested-by: Fei Shao <fshao@chromium.org>
+Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
+Reviewed-by: CK Hu <ck.hu@mediatek.com>
+Link: https://patchwork.kernel.org/project/dri-devel/patch/20230920090658.31181-1-jason-jh.lin@mediatek.com/
+Signed-off-by: Chun-Kuang Hu <chunkuang.hu@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/mediatek/mtk_drm_crtc.c | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
+index 380b0b52d2c7a..46ad9ce993f10 100644
+--- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
++++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
+@@ -585,6 +585,7 @@ static void mtk_drm_crtc_atomic_begin(struct drm_crtc *crtc,
+                                                                         crtc);
+       struct mtk_crtc_state *mtk_crtc_state = to_mtk_crtc_state(crtc_state);
+       struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc);
++      unsigned long flags;
+       if (mtk_crtc->event && mtk_crtc_state->base.event)
+               DRM_ERROR("new event while there is still a pending event\n");
+@@ -592,7 +593,11 @@ static void mtk_drm_crtc_atomic_begin(struct drm_crtc *crtc,
+       if (mtk_crtc_state->base.event) {
+               mtk_crtc_state->base.event->pipe = drm_crtc_index(crtc);
+               WARN_ON(drm_crtc_vblank_get(crtc) != 0);
++
++              spin_lock_irqsave(&crtc->dev->event_lock, flags);
+               mtk_crtc->event = mtk_crtc_state->base.event;
++              spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
++
+               mtk_crtc_state->base.event = NULL;
+       }
+ }
+-- 
+2.43.0
+
diff --git a/queue-5.10/drm-use-state-helper-instead-of-crtc-state-pointer.patch b/queue-5.10/drm-use-state-helper-instead-of-crtc-state-pointer.patch
new file mode 100644 (file)
index 0000000..26dc04a
--- /dev/null
@@ -0,0 +1,368 @@
+From d633b09b632a6ec4c62ba0079e34aee2001ce6a5 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 5 Nov 2020 17:45:18 +0100
+Subject: drm: Use state helper instead of CRTC state pointer
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Maxime Ripard <maxime@cerno.tech>
+
+[ Upstream commit 253f28b6237264216b052ac0848fd7fc917b5259 ]
+
+Many drivers reference the crtc->pointer in order to get the current CRTC
+state in their atomic_begin or atomic_flush hooks, which would be the new
+CRTC state in the global atomic state since _swap_state happened when those
+hooks are run.
+
+Use the drm_atomic_get_new_crtc_state helper to get that state to make it
+more obvious.
+
+This was made using the coccinelle script below:
+
+@ crtc_atomic_func @
+identifier helpers;
+identifier func;
+@@
+
+(
+static struct drm_crtc_helper_funcs helpers = {
+       ...,
+       .atomic_begin = func,
+       ...,
+};
+|
+static struct drm_crtc_helper_funcs helpers = {
+       ...,
+       .atomic_flush = func,
+       ...,
+};
+)
+
+@@
+identifier crtc_atomic_func.func;
+identifier crtc, state;
+symbol crtc_state;
+expression e;
+@@
+
+  func(struct drm_crtc *crtc, struct drm_atomic_state *state) {
+  ...
+- struct tegra_dc_state *crtc_state = e;
++ struct tegra_dc_state *dc_state = e;
+  <+...
+-       crtc_state
++      dc_state
+  ...+>
+  }
+
+@@
+identifier crtc_atomic_func.func;
+identifier crtc, state;
+symbol crtc_state;
+expression e;
+@@
+
+  func(struct drm_crtc *crtc, struct drm_atomic_state *state) {
+  ...
+- struct mtk_crtc_state *crtc_state = e;
++ struct mtk_crtc_state *mtk_crtc_state = e;
+  <+...
+-       crtc_state
++      mtk_crtc_state
+  ...+>
+  }
+
+@ replaces_new_state @
+identifier crtc_atomic_func.func;
+identifier crtc, state, crtc_state;
+@@
+
+  func(struct drm_crtc *crtc, struct drm_atomic_state *state) {
+  ...
+- struct drm_crtc_state *crtc_state = crtc->state;
++ struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
+  ...
+ }
+
+@@
+identifier crtc_atomic_func.func;
+identifier crtc, state, crtc_state;
+@@
+
+  func(struct drm_crtc *crtc, struct drm_atomic_state *state) {
+  struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
+  ...
+- crtc->state
++ crtc_state
+  ...
+ }
+
+@ adds_new_state @
+identifier crtc_atomic_func.func;
+identifier crtc, state;
+@@
+
+  func(struct drm_crtc *crtc, struct drm_atomic_state *state) {
++ struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
+  ...
+- crtc->state
++ crtc_state
+  ...
+ }
+
+@ include depends on adds_new_state || replaces_new_state @
+@@
+
+ #include <drm/drm_atomic.h>
+
+@ no_include depends on !include && (adds_new_state || replaces_new_state) @
+@@
+
++ #include <drm/drm_atomic.h>
+  #include <drm/...>
+
+Suggested-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
+Signed-off-by: Maxime Ripard <maxime@cerno.tech>
+Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
+Acked-by: Thomas Zimmermann <tzimmermann@suse.de>
+Cc: "James (Qian) Wang" <james.qian.wang@arm.com>
+Cc: Liviu Dudau <liviu.dudau@arm.com>
+Cc: Mihail Atanassov <mihail.atanassov@arm.com>
+Cc: Brian Starkey <brian.starkey@arm.com>
+Cc: Russell King <linux@armlinux.org.uk>
+Cc: Paul Cercueil <paul@crapouillou.net>
+Cc: Chun-Kuang Hu <chunkuang.hu@kernel.org>
+Cc: Philipp Zabel <p.zabel@pengutronix.de>
+Cc: Sandy Huang <hjc@rock-chips.com>
+Cc: "Heiko Stübner" <heiko@sntech.de>
+Cc: Thierry Reding <thierry.reding@gmail.com>
+Cc: Gerd Hoffmann <kraxel@redhat.com>
+Link: https://patchwork.freedesktop.org/patch/msgid/20201105164518.392891-1-maxime@cerno.tech
+Stable-dep-of: fe4c5f662097 ("drm/mediatek: Add spinlock for setting vblank event in atomic_begin")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/arm/display/komeda/komeda_crtc.c |  4 +++-
+ drivers/gpu/drm/armada/armada_crtc.c             |  8 ++++++--
+ drivers/gpu/drm/ast/ast_mode.c                   |  4 +++-
+ drivers/gpu/drm/ingenic/ingenic-drm-drv.c        |  7 +++++--
+ drivers/gpu/drm/mediatek/mtk_drm_crtc.c          | 15 +++++++++------
+ drivers/gpu/drm/rockchip/rockchip_drm_vop.c      |  6 ++++--
+ drivers/gpu/drm/tegra/dc.c                       |  8 +++++---
+ drivers/gpu/drm/virtio/virtgpu_display.c         |  4 +++-
+ 8 files changed, 38 insertions(+), 18 deletions(-)
+
+diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c b/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
+index 3c77eeb0a7a0c..db995250cbff6 100644
+--- a/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
++++ b/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
+@@ -381,10 +381,12 @@ static void
+ komeda_crtc_atomic_flush(struct drm_crtc *crtc,
+                        struct drm_atomic_state *state)
+ {
++      struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state,
++                                                                        crtc);
+       struct drm_crtc_state *old = drm_atomic_get_old_crtc_state(state,
+                                                                  crtc);
+       /* commit with modeset will be handled in enable/disable */
+-      if (drm_atomic_crtc_needs_modeset(crtc->state))
++      if (drm_atomic_crtc_needs_modeset(crtc_state))
+               return;
+       komeda_crtc_do_flush(crtc, old);
+diff --git a/drivers/gpu/drm/armada/armada_crtc.c b/drivers/gpu/drm/armada/armada_crtc.c
+index 13c7c474fb26e..8b7cc7bc81ee4 100644
+--- a/drivers/gpu/drm/armada/armada_crtc.c
++++ b/drivers/gpu/drm/armada/armada_crtc.c
+@@ -429,11 +429,13 @@ static int armada_drm_crtc_atomic_check(struct drm_crtc *crtc,
+ static void armada_drm_crtc_atomic_begin(struct drm_crtc *crtc,
+                                        struct drm_atomic_state *state)
+ {
++      struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state,
++                                                                        crtc);
+       struct armada_crtc *dcrtc = drm_to_armada_crtc(crtc);
+       DRM_DEBUG_KMS("[CRTC:%d:%s]\n", crtc->base.id, crtc->name);
+-      if (crtc->state->color_mgmt_changed)
++      if (crtc_state->color_mgmt_changed)
+               armada_drm_update_gamma(crtc);
+       dcrtc->regs_idx = 0;
+@@ -443,6 +445,8 @@ static void armada_drm_crtc_atomic_begin(struct drm_crtc *crtc,
+ static void armada_drm_crtc_atomic_flush(struct drm_crtc *crtc,
+                                        struct drm_atomic_state *state)
+ {
++      struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state,
++                                                                        crtc);
+       struct armada_crtc *dcrtc = drm_to_armada_crtc(crtc);
+       DRM_DEBUG_KMS("[CRTC:%d:%s]\n", crtc->base.id, crtc->name);
+@@ -453,7 +457,7 @@ static void armada_drm_crtc_atomic_flush(struct drm_crtc *crtc,
+        * If we aren't doing a full modeset, then we need to queue
+        * the event here.
+        */
+-      if (!drm_atomic_crtc_needs_modeset(crtc->state)) {
++      if (!drm_atomic_crtc_needs_modeset(crtc_state)) {
+               dcrtc->update_pending = true;
+               armada_drm_crtc_queue_state_event(crtc);
+               spin_lock_irq(&dcrtc->irq_lock);
+diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c
+index 84c2e90d415f4..7f3f961035872 100644
+--- a/drivers/gpu/drm/ast/ast_mode.c
++++ b/drivers/gpu/drm/ast/ast_mode.c
+@@ -780,10 +780,12 @@ static void
+ ast_crtc_helper_atomic_flush(struct drm_crtc *crtc,
+                            struct drm_atomic_state *state)
+ {
++      struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state,
++                                                                        crtc);
+       struct drm_crtc_state *old_crtc_state = drm_atomic_get_old_crtc_state(state,
+                                                                             crtc);
+       struct ast_private *ast = to_ast_private(crtc->dev);
+-      struct ast_crtc_state *ast_crtc_state = to_ast_crtc_state(crtc->state);
++      struct ast_crtc_state *ast_crtc_state = to_ast_crtc_state(crtc_state);
+       struct ast_crtc_state *old_ast_crtc_state = to_ast_crtc_state(old_crtc_state);
+       /*
+diff --git a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
+index 6d56b701118da..784a91d32bd1e 100644
+--- a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
++++ b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
+@@ -289,11 +289,13 @@ ingenic_drm_crtc_mode_valid(struct drm_crtc *crtc, const struct drm_display_mode
+ static void ingenic_drm_crtc_atomic_begin(struct drm_crtc *crtc,
+                                         struct drm_atomic_state *state)
+ {
++      struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state,
++                                                                        crtc);
+       struct ingenic_drm *priv = drm_crtc_get_priv(crtc);
+       u32 ctrl = 0;
+       if (priv->soc_info->has_osd &&
+-          drm_atomic_crtc_needs_modeset(crtc->state)) {
++          drm_atomic_crtc_needs_modeset(crtc_state)) {
+               /*
+                * If IPU plane is enabled, enable IPU as source for the F1
+                * plane; otherwise use regular DMA.
+@@ -310,7 +312,8 @@ static void ingenic_drm_crtc_atomic_flush(struct drm_crtc *crtc,
+                                         struct drm_atomic_state *state)
+ {
+       struct ingenic_drm *priv = drm_crtc_get_priv(crtc);
+-      struct drm_crtc_state *crtc_state = crtc->state;
++      struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state,
++                                                                        crtc);
+       struct drm_pending_vblank_event *event = crtc_state->event;
+       if (drm_atomic_crtc_needs_modeset(crtc_state)) {
+diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
+index 067b4dc39f4f0..380b0b52d2c7a 100644
+--- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
++++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
+@@ -11,6 +11,7 @@
+ #include <asm/barrier.h>
+ #include <soc/mediatek/smi.h>
++#include <drm/drm_atomic.h>
+ #include <drm/drm_atomic_helper.h>
+ #include <drm/drm_plane_helper.h>
+ #include <drm/drm_probe_helper.h>
+@@ -580,17 +581,19 @@ static void mtk_drm_crtc_atomic_disable(struct drm_crtc *crtc,
+ static void mtk_drm_crtc_atomic_begin(struct drm_crtc *crtc,
+                                     struct drm_atomic_state *state)
+ {
+-      struct mtk_crtc_state *crtc_state = to_mtk_crtc_state(crtc->state);
++      struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state,
++                                                                        crtc);
++      struct mtk_crtc_state *mtk_crtc_state = to_mtk_crtc_state(crtc_state);
+       struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc);
+-      if (mtk_crtc->event && crtc_state->base.event)
++      if (mtk_crtc->event && mtk_crtc_state->base.event)
+               DRM_ERROR("new event while there is still a pending event\n");
+-      if (crtc_state->base.event) {
+-              crtc_state->base.event->pipe = drm_crtc_index(crtc);
++      if (mtk_crtc_state->base.event) {
++              mtk_crtc_state->base.event->pipe = drm_crtc_index(crtc);
+               WARN_ON(drm_crtc_vblank_get(crtc) != 0);
+-              mtk_crtc->event = crtc_state->base.event;
+-              crtc_state->base.event = NULL;
++              mtk_crtc->event = mtk_crtc_state->base.event;
++              mtk_crtc_state->base.event = NULL;
+       }
+ }
+diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
+index b7eeb3183aa94..0a20fe4200b3d 100644
+--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
++++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
+@@ -1257,6 +1257,8 @@ static void vop_crtc_gamma_set(struct vop *vop, struct drm_crtc *crtc,
+ static void vop_crtc_atomic_begin(struct drm_crtc *crtc,
+                                 struct drm_atomic_state *state)
+ {
++      struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state,
++                                                                        crtc);
+       struct drm_crtc_state *old_crtc_state = drm_atomic_get_old_crtc_state(state,
+                                                                             crtc);
+       struct vop *vop = to_vop(crtc);
+@@ -1265,8 +1267,8 @@ static void vop_crtc_atomic_begin(struct drm_crtc *crtc,
+        * Only update GAMMA if the 'active' flag is not changed,
+        * otherwise it's updated by .atomic_enable.
+        */
+-      if (crtc->state->color_mgmt_changed &&
+-          !crtc->state->active_changed)
++      if (crtc_state->color_mgmt_changed &&
++          !crtc_state->active_changed)
+               vop_crtc_gamma_set(vop, crtc, old_crtc_state);
+ }
+diff --git a/drivers/gpu/drm/tegra/dc.c b/drivers/gpu/drm/tegra/dc.c
+index f1e8951fa86c4..093ac01ac3d90 100644
+--- a/drivers/gpu/drm/tegra/dc.c
++++ b/drivers/gpu/drm/tegra/dc.c
+@@ -1945,15 +1945,17 @@ static void tegra_crtc_atomic_begin(struct drm_crtc *crtc,
+ static void tegra_crtc_atomic_flush(struct drm_crtc *crtc,
+                                   struct drm_atomic_state *state)
+ {
+-      struct tegra_dc_state *crtc_state = to_dc_state(crtc->state);
++      struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state,
++                                                                        crtc);
++      struct tegra_dc_state *dc_state = to_dc_state(crtc_state);
+       struct tegra_dc *dc = to_tegra_dc(crtc);
+       u32 value;
+-      value = crtc_state->planes << 8 | GENERAL_UPDATE;
++      value = dc_state->planes << 8 | GENERAL_UPDATE;
+       tegra_dc_writel(dc, value, DC_CMD_STATE_CONTROL);
+       value = tegra_dc_readl(dc, DC_CMD_STATE_CONTROL);
+-      value = crtc_state->planes | GENERAL_ACT_REQ;
++      value = dc_state->planes | GENERAL_ACT_REQ;
+       tegra_dc_writel(dc, value, DC_CMD_STATE_CONTROL);
+       value = tegra_dc_readl(dc, DC_CMD_STATE_CONTROL);
+ }
+diff --git a/drivers/gpu/drm/virtio/virtgpu_display.c b/drivers/gpu/drm/virtio/virtgpu_display.c
+index fcbb0a6cdb173..9af912fc2426b 100644
+--- a/drivers/gpu/drm/virtio/virtgpu_display.c
++++ b/drivers/gpu/drm/virtio/virtgpu_display.c
+@@ -119,6 +119,8 @@ static int virtio_gpu_crtc_atomic_check(struct drm_crtc *crtc,
+ static void virtio_gpu_crtc_atomic_flush(struct drm_crtc *crtc,
+                                        struct drm_atomic_state *state)
+ {
++      struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state,
++                                                                        crtc);
+       struct virtio_gpu_output *output = drm_crtc_to_virtio_gpu_output(crtc);
+       /*
+@@ -127,7 +129,7 @@ static void virtio_gpu_crtc_atomic_flush(struct drm_crtc *crtc,
+        * in the plane update callback, and here we just check
+        * whenever we must force the modeset.
+        */
+-      if (drm_atomic_crtc_needs_modeset(crtc->state)) {
++      if (drm_atomic_crtc_needs_modeset(crtc_state)) {
+               output->needs_modeset = true;
+       }
+ }
+-- 
+2.43.0
+
diff --git a/queue-5.10/hid-add-always_poll-quirk-for-apple-kb.patch b/queue-5.10/hid-add-always_poll-quirk-for-apple-kb.patch
new file mode 100644 (file)
index 0000000..500e62a
--- /dev/null
@@ -0,0 +1,34 @@
+From d446faf99eb80b15296461afb1f87a6441a8073d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 14 Nov 2023 15:54:30 +0100
+Subject: HID: add ALWAYS_POLL quirk for Apple kb
+
+From: Oliver Neukum <oneukum@suse.com>
+
+[ Upstream commit c55092187d9ad7b2f8f5a8645286fa03997d442f ]
+
+These devices disconnect if suspended without remote wakeup. They can operate
+with the standard driver.
+
+Signed-off-by: Oliver Neukum <oneukum@suse.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.cz>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hid-quirks.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c
+index 787349f2de01d..1b3a83fa76168 100644
+--- a/drivers/hid/hid-quirks.c
++++ b/drivers/hid/hid-quirks.c
+@@ -33,6 +33,7 @@ static const struct hid_device_id hid_quirks[] = {
+       { HID_USB_DEVICE(USB_VENDOR_ID_AKAI, USB_DEVICE_ID_AKAI_MPKMINI2), HID_QUIRK_NO_INIT_REPORTS },
+       { HID_USB_DEVICE(USB_VENDOR_ID_ALPS, USB_DEVICE_ID_IBM_GAMEPAD), HID_QUIRK_BADPAD },
+       { HID_USB_DEVICE(USB_VENDOR_ID_AMI, USB_DEVICE_ID_AMI_VIRT_KEYBOARD_AND_MOUSE), HID_QUIRK_ALWAYS_POLL },
++      { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_REVB_ANSI), HID_QUIRK_ALWAYS_POLL },
+       { HID_USB_DEVICE(USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_2PORTKVM), HID_QUIRK_NOGET },
+       { HID_USB_DEVICE(USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVMC), HID_QUIRK_NOGET },
+       { HID_USB_DEVICE(USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVM), HID_QUIRK_NOGET },
+-- 
+2.43.0
+
diff --git a/queue-5.10/hid-glorious-fix-glorious-model-i-hid-report.patch b/queue-5.10/hid-glorious-fix-glorious-model-i-hid-report.patch
new file mode 100644 (file)
index 0000000..f5797cd
--- /dev/null
@@ -0,0 +1,135 @@
+From c025229081d07c27192c093f51a637c528e7a263 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 2 Nov 2023 18:10:38 -0700
+Subject: HID: glorious: fix Glorious Model I HID report
+
+From: Brett Raye <braye@fastmail.com>
+
+[ Upstream commit a5e913c25b6b2b6ae02acef6d9400645ac03dfdf ]
+
+The Glorious Model I mouse has a buggy HID report descriptor for its
+keyboard endpoint (used for programmable buttons). For report ID 2, there
+is a mismatch between Logical Minimum and Usage Minimum in the array that
+reports keycodes.
+
+The offending portion of the descriptor: (from hid-decode)
+
+0x95, 0x05,                    //  Report Count (5)                   30
+0x75, 0x08,                    //  Report Size (8)                    32
+0x15, 0x00,                    //  Logical Minimum (0)                34
+0x25, 0x65,                    //  Logical Maximum (101)              36
+0x05, 0x07,                    //  Usage Page (Keyboard)              38
+0x19, 0x01,                    //  Usage Minimum (1)                  40
+0x29, 0x65,                    //  Usage Maximum (101)                42
+0x81, 0x00,                    //  Input (Data,Arr,Abs)               44
+
+This bug shifts all programmed keycodes up by 1. Importantly, this causes
+"empty" array indexes of 0x00 to be interpreted as 0x01, ErrorRollOver.
+The presence of ErrorRollOver causes the system to ignore all keypresses
+from the endpoint and breaks the ability to use the programmable buttons.
+
+Setting byte 41 to 0x00 fixes this, and causes keycodes to be interpreted
+correctly.
+
+Also, USB_VENDOR_ID_GLORIOUS is changed to USB_VENDOR_ID_SINOWEALTH,
+and a new ID for Laview Technology is added. Glorious seems to be
+white-labeling controller boards or mice from these vendors. There isn't a
+single canonical vendor ID for Glorious products.
+
+Signed-off-by: Brett Raye <braye@fastmail.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.cz>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hid-glorious.c | 16 ++++++++++++++--
+ drivers/hid/hid-ids.h      | 11 +++++++----
+ 2 files changed, 21 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/hid/hid-glorious.c b/drivers/hid/hid-glorious.c
+index 558eb08c19ef9..281b3a7187cec 100644
+--- a/drivers/hid/hid-glorious.c
++++ b/drivers/hid/hid-glorious.c
+@@ -21,6 +21,10 @@ MODULE_DESCRIPTION("HID driver for Glorious PC Gaming Race mice");
+  * Glorious Model O and O- specify the const flag in the consumer input
+  * report descriptor, which leads to inputs being ignored. Fix this
+  * by patching the descriptor.
++ *
++ * Glorious Model I incorrectly specifes the Usage Minimum for its
++ * keyboard HID report, causing keycodes to be misinterpreted.
++ * Fix this by setting Usage Minimum to 0 in that report.
+  */
+ static __u8 *glorious_report_fixup(struct hid_device *hdev, __u8 *rdesc,
+               unsigned int *rsize)
+@@ -32,6 +36,10 @@ static __u8 *glorious_report_fixup(struct hid_device *hdev, __u8 *rdesc,
+               rdesc[85] = rdesc[113] = rdesc[141] = \
+                       HID_MAIN_ITEM_VARIABLE | HID_MAIN_ITEM_RELATIVE;
+       }
++      if (*rsize == 156 && rdesc[41] == 1) {
++              hid_info(hdev, "patching Glorious Model I keyboard report descriptor\n");
++              rdesc[41] = 0;
++      }
+       return rdesc;
+ }
+@@ -44,6 +52,8 @@ static void glorious_update_name(struct hid_device *hdev)
+               model = "Model O"; break;
+       case USB_DEVICE_ID_GLORIOUS_MODEL_D:
+               model = "Model D"; break;
++      case USB_DEVICE_ID_GLORIOUS_MODEL_I:
++              model = "Model I"; break;
+       }
+       snprintf(hdev->name, sizeof(hdev->name), "%s %s", "Glorious", model);
+@@ -66,10 +76,12 @@ static int glorious_probe(struct hid_device *hdev,
+ }
+ static const struct hid_device_id glorious_devices[] = {
+-      { HID_USB_DEVICE(USB_VENDOR_ID_GLORIOUS,
++      { HID_USB_DEVICE(USB_VENDOR_ID_SINOWEALTH,
+               USB_DEVICE_ID_GLORIOUS_MODEL_O) },
+-      { HID_USB_DEVICE(USB_VENDOR_ID_GLORIOUS,
++      { HID_USB_DEVICE(USB_VENDOR_ID_SINOWEALTH,
+               USB_DEVICE_ID_GLORIOUS_MODEL_D) },
++      { HID_USB_DEVICE(USB_VENDOR_ID_LAVIEW,
++              USB_DEVICE_ID_GLORIOUS_MODEL_I) },
+       { }
+ };
+ MODULE_DEVICE_TABLE(hid, glorious_devices);
+diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
+index 7c688d7f8ccff..6273ab615af89 100644
+--- a/drivers/hid/hid-ids.h
++++ b/drivers/hid/hid-ids.h
+@@ -471,10 +471,6 @@
+ #define USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PIT_010A 0x010a
+ #define USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PIT_E100 0xe100
+-#define USB_VENDOR_ID_GLORIOUS  0x258a
+-#define USB_DEVICE_ID_GLORIOUS_MODEL_D 0x0033
+-#define USB_DEVICE_ID_GLORIOUS_MODEL_O 0x0036
+-
+ #define I2C_VENDOR_ID_GOODIX          0x27c6
+ #define I2C_DEVICE_ID_GOODIX_01F0     0x01f0
+@@ -697,6 +693,9 @@
+ #define USB_VENDOR_ID_LABTEC          0x1020
+ #define USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD        0x0006
++#define USB_VENDOR_ID_LAVIEW          0x22D4
++#define USB_DEVICE_ID_GLORIOUS_MODEL_I        0x1503
++
+ #define USB_VENDOR_ID_LCPOWER         0x1241
+ #define USB_DEVICE_ID_LCPOWER_LC1000  0xf767
+@@ -1068,6 +1067,10 @@
+ #define USB_VENDOR_ID_SIGMATEL                0x066F
+ #define USB_DEVICE_ID_SIGMATEL_STMP3780       0x3780
++#define USB_VENDOR_ID_SINOWEALTH  0x258a
++#define USB_DEVICE_ID_GLORIOUS_MODEL_D 0x0033
++#define USB_DEVICE_ID_GLORIOUS_MODEL_O 0x0036
++
+ #define USB_VENDOR_ID_SIS_TOUCH               0x0457
+ #define USB_DEVICE_ID_SIS9200_TOUCH   0x9200
+ #define USB_DEVICE_ID_SIS817_TOUCH    0x0817
+-- 
+2.43.0
+
diff --git a/queue-5.10/hid-hid-asus-add-const-to-read-only-outgoing-usb-buf.patch b/queue-5.10/hid-hid-asus-add-const-to-read-only-outgoing-usb-buf.patch
new file mode 100644 (file)
index 0000000..ff08d62
--- /dev/null
@@ -0,0 +1,56 @@
+From 62ff968f79abdfb673ec93ec88fe78635ae93682 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 17 Nov 2023 14:15:55 +1300
+Subject: HID: hid-asus: add const to read-only outgoing usb buffer
+
+From: Denis Benato <benato.denis96@gmail.com>
+
+[ Upstream commit 06ae5afce8cc1f7621cc5c7751e449ce20d68af7 ]
+
+In the function asus_kbd_set_report the parameter buf is read-only
+as it gets copied in a memory portion suitable for USB transfer,
+but the parameter is not marked as const: add the missing const and mark
+const immutable buffers passed to that function.
+
+Signed-off-by: Denis Benato <benato.denis96@gmail.com>
+Signed-off-by: Luke D. Jones <luke@ljones.dev>
+Signed-off-by: Jiri Kosina <jkosina@suse.cz>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hid-asus.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/hid/hid-asus.c b/drivers/hid/hid-asus.c
+index 52b0ef99bc955..b46fb92d28e58 100644
+--- a/drivers/hid/hid-asus.c
++++ b/drivers/hid/hid-asus.c
+@@ -336,7 +336,7 @@ static int asus_raw_event(struct hid_device *hdev,
+       return 0;
+ }
+-static int asus_kbd_set_report(struct hid_device *hdev, u8 *buf, size_t buf_size)
++static int asus_kbd_set_report(struct hid_device *hdev, const u8 *buf, size_t buf_size)
+ {
+       unsigned char *dmabuf;
+       int ret;
+@@ -355,7 +355,7 @@ static int asus_kbd_set_report(struct hid_device *hdev, u8 *buf, size_t buf_size
+ static int asus_kbd_init(struct hid_device *hdev)
+ {
+-      u8 buf[] = { FEATURE_KBD_REPORT_ID, 0x41, 0x53, 0x55, 0x53, 0x20, 0x54,
++      const u8 buf[] = { FEATURE_KBD_REPORT_ID, 0x41, 0x53, 0x55, 0x53, 0x20, 0x54,
+                    0x65, 0x63, 0x68, 0x2e, 0x49, 0x6e, 0x63, 0x2e, 0x00 };
+       int ret;
+@@ -369,7 +369,7 @@ static int asus_kbd_init(struct hid_device *hdev)
+ static int asus_kbd_get_functions(struct hid_device *hdev,
+                                 unsigned char *kbd_func)
+ {
+-      u8 buf[] = { FEATURE_KBD_REPORT_ID, 0x05, 0x20, 0x31, 0x00, 0x08 };
++      const u8 buf[] = { FEATURE_KBD_REPORT_ID, 0x05, 0x20, 0x31, 0x00, 0x08 };
+       u8 *readbuf;
+       int ret;
+-- 
+2.43.0
+
diff --git a/queue-5.10/hid-hid-asus-reset-the-backlight-brightness-level-on.patch b/queue-5.10/hid-hid-asus-reset-the-backlight-brightness-level-on.patch
new file mode 100644 (file)
index 0000000..f73a53c
--- /dev/null
@@ -0,0 +1,67 @@
+From 0b22243f152dcc92cea1da27258d34515f42dab3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 17 Nov 2023 14:15:56 +1300
+Subject: HID: hid-asus: reset the backlight brightness level on resume
+
+From: Denis Benato <benato.denis96@gmail.com>
+
+[ Upstream commit 546edbd26cff7ae990e480a59150e801a06f77b1 ]
+
+Some devices managed by this driver automatically set brightness to 0
+before entering a suspended state and reset it back to a default
+brightness level after the resume:
+this has the effect of having the kernel report wrong brightness
+status after a sleep, and on some devices (like the Asus RC71L) that
+brightness is the intensity of LEDs directly facing the user.
+
+Fix the above issue by setting back brightness to the level it had
+before entering a sleep state.
+
+Signed-off-by: Denis Benato <benato.denis96@gmail.com>
+Signed-off-by: Luke D. Jones <luke@ljones.dev>
+Signed-off-by: Jiri Kosina <jkosina@suse.cz>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hid-asus.c | 19 +++++++++++++++++++
+ 1 file changed, 19 insertions(+)
+
+diff --git a/drivers/hid/hid-asus.c b/drivers/hid/hid-asus.c
+index 6865cab33cf8a..52b0ef99bc955 100644
+--- a/drivers/hid/hid-asus.c
++++ b/drivers/hid/hid-asus.c
+@@ -901,6 +901,24 @@ static int asus_start_multitouch(struct hid_device *hdev)
+       return 0;
+ }
++static int __maybe_unused asus_resume(struct hid_device *hdev) {
++      struct asus_drvdata *drvdata = hid_get_drvdata(hdev);
++      int ret = 0;
++
++      if (drvdata->kbd_backlight) {
++              const u8 buf[] = { FEATURE_KBD_REPORT_ID, 0xba, 0xc5, 0xc4,
++                              drvdata->kbd_backlight->cdev.brightness };
++              ret = asus_kbd_set_report(hdev, buf, sizeof(buf));
++              if (ret < 0) {
++                      hid_err(hdev, "Asus failed to set keyboard backlight: %d\n", ret);
++                      goto asus_resume_err;
++              }
++      }
++
++asus_resume_err:
++      return ret;
++}
++
+ static int __maybe_unused asus_reset_resume(struct hid_device *hdev)
+ {
+       struct asus_drvdata *drvdata = hid_get_drvdata(hdev);
+@@ -1177,6 +1195,7 @@ static struct hid_driver asus_driver = {
+       .input_configured       = asus_input_configured,
+ #ifdef CONFIG_PM
+       .reset_resume           = asus_reset_resume,
++      .resume                                 = asus_resume,
+ #endif
+       .event                  = asus_event,
+       .raw_event              = asus_raw_event
+-- 
+2.43.0
+
diff --git a/queue-5.10/hid-multitouch-add-quirk-for-honor-glo-gxxx-touchpad.patch b/queue-5.10/hid-multitouch-add-quirk-for-honor-glo-gxxx-touchpad.patch
new file mode 100644 (file)
index 0000000..b8c72b3
--- /dev/null
@@ -0,0 +1,46 @@
+From ee1df1e4497c2a1f685a9d9648652792495821ad Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 21 Nov 2023 20:23:11 +0800
+Subject: HID: multitouch: Add quirk for HONOR GLO-GXXX touchpad
+
+From: Aoba K <nexp_0x17@outlook.com>
+
+[ Upstream commit 9ffccb691adb854e7b7f3ee57fbbda12ff70533f ]
+
+Honor MagicBook 13 2023 has a touchpad which do not switch to the multitouch
+mode until the input mode feature is written by the host.  The touchpad do
+report the input mode at touchpad(3), while itself working under mouse mode. As
+a workaround, it is possible to call MT_QUIRE_FORCE_GET_FEATURE to force set
+feature in mt_set_input_mode for such device.
+
+The touchpad reports as BLTP7853, which cannot retrive any useful manufacture
+information on the internel by this string at present.  As the serial number of
+the laptop is GLO-G52, while DMI info reports the laptop serial number as
+GLO-GXXX, this workaround should applied to all models which has the GLO-GXXX.
+
+Signed-off-by: Aoba K <nexp_0x17@outlook.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.cz>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hid-multitouch.c | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
+index 84b12599eaf69..7d43d62df2409 100644
+--- a/drivers/hid/hid-multitouch.c
++++ b/drivers/hid/hid-multitouch.c
+@@ -1962,6 +1962,11 @@ static const struct hid_device_id mt_devices[] = {
+               MT_USB_DEVICE(USB_VENDOR_ID_HANVON_ALT,
+                       USB_DEVICE_ID_HANVON_ALT_MULTITOUCH) },
++      /* HONOR GLO-GXXX panel */
++      { .driver_data = MT_CLS_VTL,
++              HID_DEVICE(BUS_I2C, HID_GROUP_MULTITOUCH_WIN_8,
++                      0x347d, 0x7853) },
++
+       /* Ilitek dual touch panel */
+       {  .driver_data = MT_CLS_NSMU,
+               MT_USB_DEVICE(USB_VENDOR_ID_ILITEK,
+-- 
+2.43.0
+
diff --git a/queue-5.10/net-usb-qmi_wwan-claim-interface-4-for-zte-mf290.patch b/queue-5.10/net-usb-qmi_wwan-claim-interface-4-for-zte-mf290.patch
new file mode 100644 (file)
index 0000000..9510446
--- /dev/null
@@ -0,0 +1,68 @@
+From faced7c8ac754ffe01c5164478ddc91f7cffa8fb Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 18 Nov 2023 00:19:18 +0100
+Subject: net: usb: qmi_wwan: claim interface 4 for ZTE MF290
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Lech Perczak <lech.perczak@gmail.com>
+
+[ Upstream commit 99360d9620f09fb8bc15548d855011bbb198c680 ]
+
+Interface 4 is used by for QMI interface in stock firmware of MF28D, the
+router which uses MF290 modem. Rebind it to qmi_wwan after freeing it up
+from option driver.
+The proper configuration is:
+
+Interface mapping is:
+0: QCDM, 1: (unknown), 2: AT (PCUI), 2: AT (Modem), 4: QMI
+
+T:  Bus=01 Lev=02 Prnt=02 Port=00 Cnt=01 Dev#=  4 Spd=480  MxCh= 0
+D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
+P:  Vendor=19d2 ProdID=0189 Rev= 0.00
+S:  Manufacturer=ZTE, Incorporated
+S:  Product=ZTE LTE Technologies MSM
+C:* #Ifs= 5 Cfg#= 1 Atr=e0 MxPwr=500mA
+I:* If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=option
+E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
+E:  Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=4ms
+I:* If#= 1 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=option
+E:  Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
+E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=4ms
+I:* If#= 2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=option
+E:  Ad=83(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
+E:  Ad=03(O) Atr=02(Bulk) MxPS= 512 Ivl=4ms
+I:* If#= 3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=option
+E:  Ad=84(I) Atr=03(Int.) MxPS=  64 Ivl=2ms
+E:  Ad=85(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
+E:  Ad=04(O) Atr=02(Bulk) MxPS= 512 Ivl=4ms
+I:* If#= 4 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=qmi_wwan
+E:  Ad=86(I) Atr=03(Int.) MxPS=  64 Ivl=2ms
+E:  Ad=87(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
+E:  Ad=05(O) Atr=02(Bulk) MxPS= 512 Ivl=4ms
+
+Cc: Bjørn Mork <bjorn@mork.no>
+Signed-off-by: Lech Perczak <lech.perczak@gmail.com>
+Link: https://lore.kernel.org/r/20231117231918.100278-3-lech.perczak@gmail.com
+Signed-off-by: Paolo Abeni <pabeni@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/usb/qmi_wwan.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c
+index 5cf7f389bf4ef..3d342908f57a0 100644
+--- a/drivers/net/usb/qmi_wwan.c
++++ b/drivers/net/usb/qmi_wwan.c
+@@ -1225,6 +1225,7 @@ static const struct usb_device_id products[] = {
+       {QMI_FIXED_INTF(0x19d2, 0x0168, 4)},
+       {QMI_FIXED_INTF(0x19d2, 0x0176, 3)},
+       {QMI_FIXED_INTF(0x19d2, 0x0178, 3)},
++      {QMI_FIXED_INTF(0x19d2, 0x0189, 4)},    /* ZTE MF290 */
+       {QMI_FIXED_INTF(0x19d2, 0x0191, 4)},    /* ZTE EuFi890 */
+       {QMI_FIXED_INTF(0x19d2, 0x0199, 1)},    /* ZTE MF820S */
+       {QMI_FIXED_INTF(0x19d2, 0x0200, 1)},
+-- 
+2.43.0
+
diff --git a/queue-5.10/platform-x86-intel_telemetry-fix-kernel-doc-descript.patch b/queue-5.10/platform-x86-intel_telemetry-fix-kernel-doc-descript.patch
new file mode 100644 (file)
index 0000000..b69c286
--- /dev/null
@@ -0,0 +1,57 @@
+From 10e5a0eacb075b94790e5fc011c505af79ca2b12 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 20 Nov 2023 17:07:56 +0200
+Subject: platform/x86: intel_telemetry: Fix kernel doc descriptions
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
+
+[ Upstream commit a6584711e64d9d12ab79a450ec3628fd35e4f476 ]
+
+LKP found issues with a kernel doc in the driver:
+
+core.c:116: warning: Function parameter or member 'ioss_evtconfig' not described in 'telemetry_update_events'
+core.c:188: warning: Function parameter or member 'ioss_evtconfig' not described in 'telemetry_get_eventconfig'
+
+It looks like it were copy'n'paste typos when these descriptions
+had been introduced. Fix the typos.
+
+Reported-by: kernel test robot <lkp@intel.com>
+Closes: https://lore.kernel.org/oe-kbuild-all/202310070743.WALmRGSY-lkp@intel.com/
+Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
+Link: https://lore.kernel.org/r/20231120150756.1661425-1-andriy.shevchenko@linux.intel.com
+Reviewed-by: Rajneesh Bhardwaj <irenic.rajneesh@gmail.com>
+Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
+Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/platform/x86/intel_telemetry_core.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/platform/x86/intel_telemetry_core.c b/drivers/platform/x86/intel_telemetry_core.c
+index fdf55b5d69480..e4be40f73eebf 100644
+--- a/drivers/platform/x86/intel_telemetry_core.c
++++ b/drivers/platform/x86/intel_telemetry_core.c
+@@ -102,7 +102,7 @@ static const struct telemetry_core_ops telm_defpltops = {
+ /**
+  * telemetry_update_events() - Update telemetry Configuration
+  * @pss_evtconfig: PSS related config. No change if num_evts = 0.
+- * @pss_evtconfig: IOSS related config. No change if num_evts = 0.
++ * @ioss_evtconfig: IOSS related config. No change if num_evts = 0.
+  *
+  * This API updates the IOSS & PSS Telemetry configuration. Old config
+  * is overwritten. Call telemetry_reset_events when logging is over
+@@ -176,7 +176,7 @@ EXPORT_SYMBOL_GPL(telemetry_reset_events);
+ /**
+  * telemetry_get_eventconfig() - Returns the pss and ioss events enabled
+  * @pss_evtconfig: Pointer to PSS related configuration.
+- * @pss_evtconfig: Pointer to IOSS related configuration.
++ * @ioss_evtconfig: Pointer to IOSS related configuration.
+  * @pss_len:     Number of u32 elements allocated for pss_evtconfig array
+  * @ioss_len:    Number of u32 elements allocated for ioss_evtconfig array
+  *
+-- 
+2.43.0
+
index 0aa04d4a971e5ccf5cab2eaa919250ac883288b3..8cbed187d2a0c9a74829ae91ef1944bd0b2bd177 100644 (file)
@@ -31,3 +31,20 @@ net-stmmac-use-dev_err_probe-for-reporting-mdio-bus-.patch
 net-stmmac-handle-disabled-mdio-busses-from-devicetr.patch
 appletalk-fix-use-after-free-in-atalk_ioctl.patch
 net-atlantic-fix-double-free-in-ring-reinit-logic.patch
+drm-atomic-pass-the-full-state-to-crtc-atomic-begin-.patch
+drm-use-state-helper-instead-of-crtc-state-pointer.patch
+drm-mediatek-add-spinlock-for-setting-vblank-event-i.patch
+usb-aqc111-check-packet-for-fixup-for-true-limit.patch
+blk-throttle-fix-lockdep-warning-of-cgroup_mutex-or-.patch
+bcache-avoid-oversize-memory-allocation-by-small-str.patch
+bcache-remove-redundant-assignment-to-variable-cur_i.patch
+bcache-add-code-comments-for-bch_btree_node_get-and-.patch
+bcache-avoid-null-checking-to-c-root-in-run_cache_se.patch
+platform-x86-intel_telemetry-fix-kernel-doc-descript.patch
+hid-glorious-fix-glorious-model-i-hid-report.patch
+hid-add-always_poll-quirk-for-apple-kb.patch
+hid-hid-asus-reset-the-backlight-brightness-level-on.patch
+hid-multitouch-add-quirk-for-honor-glo-gxxx-touchpad.patch
+asm-generic-qspinlock-fix-queued_spin_value_unlocked.patch
+net-usb-qmi_wwan-claim-interface-4-for-zte-mf290.patch
+hid-hid-asus-add-const-to-read-only-outgoing-usb-buf.patch
diff --git a/queue-5.10/usb-aqc111-check-packet-for-fixup-for-true-limit.patch b/queue-5.10/usb-aqc111-check-packet-for-fixup-for-true-limit.patch
new file mode 100644 (file)
index 0000000..9874acd
--- /dev/null
@@ -0,0 +1,58 @@
+From 01015d5f0cbae07fac4ca0957ff52f54aa07745b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 15 Nov 2023 11:08:57 +0100
+Subject: usb: aqc111: check packet for fixup for true limit
+
+From: Oliver Neukum <oneukum@suse.com>
+
+[ Upstream commit ccab434e674ca95d483788b1895a70c21b7f016a ]
+
+If a device sends a packet that is inbetween 0
+and sizeof(u64) the value passed to skb_trim()
+as length will wrap around ending up as some very
+large value.
+
+The driver will then proceed to parse the header
+located at that position, which will either oops or
+process some random value.
+
+The fix is to check against sizeof(u64) rather than
+0, which the driver currently does. The issue exists
+since the introduction of the driver.
+
+Signed-off-by: Oliver Neukum <oneukum@suse.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/usb/aqc111.c | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/net/usb/aqc111.c b/drivers/net/usb/aqc111.c
+index c9c4095181744..4ea02116be182 100644
+--- a/drivers/net/usb/aqc111.c
++++ b/drivers/net/usb/aqc111.c
+@@ -1079,17 +1079,17 @@ static int aqc111_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
+       u16 pkt_count = 0;
+       u64 desc_hdr = 0;
+       u16 vlan_tag = 0;
+-      u32 skb_len = 0;
++      u32 skb_len;
+       if (!skb)
+               goto err;
+-      if (skb->len == 0)
++      skb_len = skb->len;
++      if (skb_len < sizeof(desc_hdr))
+               goto err;
+-      skb_len = skb->len;
+       /* RX Descriptor Header */
+-      skb_trim(skb, skb->len - sizeof(desc_hdr));
++      skb_trim(skb, skb_len - sizeof(desc_hdr));
+       desc_hdr = le64_to_cpup((u64 *)skb_tail_pointer(skb));
+       /* Check these packets */
+-- 
+2.43.0
+