From 0685f8c869eb973b2b2943f176fc273fc094b21a Mon Sep 17 00:00:00 2001 From: Sasha Levin Date: Sat, 16 Dec 2023 16:00:37 -0500 Subject: [PATCH] Fixes for 5.10 Signed-off-by: Sasha Levin --- ...nlock-fix-queued_spin_value_unlocked.patch | 51 + ...comments-for-bch_btree_node_get-and-.patch | 50 + ...l-checking-to-c-root-in-run_cache_se.patch | 39 + ...rsize-memory-allocation-by-small-str.patch | 90 ++ ...dundant-assignment-to-variable-cur_i.patch | 42 + ...-lockdep-warning-of-cgroup_mutex-or-.patch | 49 + ...the-full-state-to-crtc-atomic-begin-.patch | 1126 +++++++++++++++++ ...-spinlock-for-setting-vblank-event-i.patch | 54 + ...helper-instead-of-crtc-state-pointer.patch | 368 ++++++ ...d-add-always_poll-quirk-for-apple-kb.patch | 34 + ...ious-fix-glorious-model-i-hid-report.patch | 135 ++ ...-const-to-read-only-outgoing-usb-buf.patch | 56 + ...et-the-backlight-brightness-level-on.patch | 67 + ...dd-quirk-for-honor-glo-gxxx-touchpad.patch | 46 + ...wwan-claim-interface-4-for-zte-mf290.patch | 68 + ...el_telemetry-fix-kernel-doc-descript.patch | 57 + queue-5.10/series | 17 + ...heck-packet-for-fixup-for-true-limit.patch | 58 + 18 files changed, 2407 insertions(+) create mode 100644 queue-5.10/asm-generic-qspinlock-fix-queued_spin_value_unlocked.patch create mode 100644 queue-5.10/bcache-add-code-comments-for-bch_btree_node_get-and-.patch create mode 100644 queue-5.10/bcache-avoid-null-checking-to-c-root-in-run_cache_se.patch create mode 100644 queue-5.10/bcache-avoid-oversize-memory-allocation-by-small-str.patch create mode 100644 queue-5.10/bcache-remove-redundant-assignment-to-variable-cur_i.patch create mode 100644 queue-5.10/blk-throttle-fix-lockdep-warning-of-cgroup_mutex-or-.patch create mode 100644 queue-5.10/drm-atomic-pass-the-full-state-to-crtc-atomic-begin-.patch create mode 100644 queue-5.10/drm-mediatek-add-spinlock-for-setting-vblank-event-i.patch create mode 100644 queue-5.10/drm-use-state-helper-instead-of-crtc-state-pointer.patch create mode 100644 queue-5.10/hid-add-always_poll-quirk-for-apple-kb.patch create mode 100644 queue-5.10/hid-glorious-fix-glorious-model-i-hid-report.patch create mode 100644 queue-5.10/hid-hid-asus-add-const-to-read-only-outgoing-usb-buf.patch create mode 100644 queue-5.10/hid-hid-asus-reset-the-backlight-brightness-level-on.patch create mode 100644 queue-5.10/hid-multitouch-add-quirk-for-honor-glo-gxxx-touchpad.patch create mode 100644 queue-5.10/net-usb-qmi_wwan-claim-interface-4-for-zte-mf290.patch create mode 100644 queue-5.10/platform-x86-intel_telemetry-fix-kernel-doc-descript.patch create mode 100644 queue-5.10/usb-aqc111-check-packet-for-fixup-for-true-limit.patch 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 index 00000000000..92a0c05938c --- /dev/null +++ b/queue-5.10/asm-generic-qspinlock-fix-queued_spin_value_unlocked.patch @@ -0,0 +1,51 @@ +From 53d167765768360f98a2c7fa41469456e84dc12e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 9 Nov 2023 22:22:13 -0800 +Subject: asm-generic: qspinlock: fix queued_spin_value_unlocked() + implementation + +From: Linus Torvalds + +[ 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 +Cc: Ingo Molnar +Cc: Waiman Long +Link: https://lore.kernel.org/all/CAHk-=whNRv0v6kQiV5QO6DJhjH4KEL36vWQ6Re8Csrnh4zbRkQ@mail.gmail.com/ +Signed-off-by: Linus Torvalds +Signed-off-by: Sasha Levin +--- + 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 index 00000000000..f153d0ff988 --- /dev/null +++ b/queue-5.10/bcache-add-code-comments-for-bch_btree_node_get-and-.patch @@ -0,0 +1,50 @@ +From 4faab4702f28325d96c8c99c85afbea831048c63 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Link: https://lore.kernel.org/r/20231120052503.6122-10-colyli@suse.de +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + 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 index 00000000000..af8280b9d36 --- /dev/null +++ b/queue-5.10/bcache-avoid-null-checking-to-c-root-in-run_cache_se.patch @@ -0,0 +1,39 @@ +From 4f3e081506dd288cfa4139ec08c0ef10007cb772 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 20 Nov 2023 13:25:03 +0800 +Subject: bcache: avoid NULL checking to c->root in run_cache_set() + +From: Coly Li + +[ 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 +Link: https://lore.kernel.org/r/20231120052503.6122-11-colyli@suse.de +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + 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 index 00000000000..029f385afaf --- /dev/null +++ b/queue-5.10/bcache-avoid-oversize-memory-allocation-by-small-str.patch @@ -0,0 +1,90 @@ +From 7a724f1e259cdec5c02ebb0cd1563bebb7f6f741 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 20 Nov 2023 13:24:54 +0800 +Subject: bcache: avoid oversize memory allocation by small stripe_size + +From: Coly Li + +[ 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 +Signed-off-by: Coly Li +Reviewed-by: Eric Wheeler +Link: https://lore.kernel.org/r/20231120052503.6122-2-colyli@suse.de +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + 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 index 00000000000..c370559a9b9 --- /dev/null +++ b/queue-5.10/bcache-remove-redundant-assignment-to-variable-cur_i.patch @@ -0,0 +1,42 @@ +From a82d79742913c22c434268deb78d49bcc5f16913 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 20 Nov 2023 13:24:56 +0800 +Subject: bcache: remove redundant assignment to variable cur_idx + +From: Colin Ian King + +[ 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 +Reviewed-by: Coly Li +Signed-off-by: Coly Li +Link: https://lore.kernel.org/r/20231120052503.6122-4-colyli@suse.de +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + 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 index 00000000000..aaeb7499fba --- /dev/null +++ b/queue-5.10/blk-throttle-fix-lockdep-warning-of-cgroup_mutex-or-.patch @@ -0,0 +1,49 @@ +From 18d5b4908b5c3c7af76892e09038d2b560e220eb Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Ming Lei +Link: https://lore.kernel.org/r/20231117023527.3188627-2-ming.lei@redhat.com +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + 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 index 00000000000..2e0bc6302db --- /dev/null +++ b/queue-5.10/drm-atomic-pass-the-full-state-to-crtc-atomic-begin-.patch @@ -0,0 +1,1126 @@ +From bfc9ac42f8c6d5c3dee78c8daf97ed426e628449 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 + +@ no_include depends on !include && adds_old_state @ +@@ + ++ #include + #include + +Signed-off-by: Maxime Ripard +Reviewed-by: Ville Syrjälä +Acked-by: Daniel Vetter +Acked-by: Thomas Zimmermann +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 +--- + .../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 index 00000000000..da73b7bd859 --- /dev/null +++ b/queue-5.10/drm-mediatek-add-spinlock-for-setting-vblank-event-i.patch @@ -0,0 +1,54 @@ +From f146663fde558696a402e78bb742a97111eb67d8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Suggested-by: AngeloGioacchino Del Regno +Reviewed-by: Alexandre Mergnat +Reviewed-by: Fei Shao +Tested-by: Fei Shao +Reviewed-by: AngeloGioacchino Del Regno +Reviewed-by: CK Hu +Link: https://patchwork.kernel.org/project/dri-devel/patch/20230920090658.31181-1-jason-jh.lin@mediatek.com/ +Signed-off-by: Chun-Kuang Hu +Signed-off-by: Sasha Levin +--- + 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 index 00000000000..26dc04a3d91 --- /dev/null +++ b/queue-5.10/drm-use-state-helper-instead-of-crtc-state-pointer.patch @@ -0,0 +1,368 @@ +From d633b09b632a6ec4c62ba0079e34aee2001ce6a5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 + +@ no_include depends on !include && (adds_new_state || replaces_new_state) @ +@@ + ++ #include + #include + +Suggested-by: Ville Syrjälä +Signed-off-by: Maxime Ripard +Reviewed-by: Ville Syrjälä +Acked-by: Thomas Zimmermann +Cc: "James (Qian) Wang" +Cc: Liviu Dudau +Cc: Mihail Atanassov +Cc: Brian Starkey +Cc: Russell King +Cc: Paul Cercueil +Cc: Chun-Kuang Hu +Cc: Philipp Zabel +Cc: Sandy Huang +Cc: "Heiko Stübner" +Cc: Thierry Reding +Cc: Gerd Hoffmann +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 +--- + 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 + #include + ++#include + #include + #include + #include +@@ -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 index 00000000000..500e62a3d13 --- /dev/null +++ b/queue-5.10/hid-add-always_poll-quirk-for-apple-kb.patch @@ -0,0 +1,34 @@ +From d446faf99eb80b15296461afb1f87a6441a8073d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 14 Nov 2023 15:54:30 +0100 +Subject: HID: add ALWAYS_POLL quirk for Apple kb + +From: Oliver Neukum + +[ Upstream commit c55092187d9ad7b2f8f5a8645286fa03997d442f ] + +These devices disconnect if suspended without remote wakeup. They can operate +with the standard driver. + +Signed-off-by: Oliver Neukum +Signed-off-by: Jiri Kosina +Signed-off-by: Sasha Levin +--- + 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 index 00000000000..f5797cd2eec --- /dev/null +++ b/queue-5.10/hid-glorious-fix-glorious-model-i-hid-report.patch @@ -0,0 +1,135 @@ +From c025229081d07c27192c093f51a637c528e7a263 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 2 Nov 2023 18:10:38 -0700 +Subject: HID: glorious: fix Glorious Model I HID report + +From: Brett Raye + +[ 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 +Signed-off-by: Jiri Kosina +Signed-off-by: Sasha Levin +--- + 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 index 00000000000..ff08d6279ce --- /dev/null +++ b/queue-5.10/hid-hid-asus-add-const-to-read-only-outgoing-usb-buf.patch @@ -0,0 +1,56 @@ +From 62ff968f79abdfb673ec93ec88fe78635ae93682 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 17 Nov 2023 14:15:55 +1300 +Subject: HID: hid-asus: add const to read-only outgoing usb buffer + +From: Denis Benato + +[ 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 +Signed-off-by: Luke D. Jones +Signed-off-by: Jiri Kosina +Signed-off-by: Sasha Levin +--- + 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 index 00000000000..f73a53c1300 --- /dev/null +++ b/queue-5.10/hid-hid-asus-reset-the-backlight-brightness-level-on.patch @@ -0,0 +1,67 @@ +From 0b22243f152dcc92cea1da27258d34515f42dab3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 17 Nov 2023 14:15:56 +1300 +Subject: HID: hid-asus: reset the backlight brightness level on resume + +From: Denis Benato + +[ 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 +Signed-off-by: Luke D. Jones +Signed-off-by: Jiri Kosina +Signed-off-by: Sasha Levin +--- + 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 index 00000000000..b8c72b397ed --- /dev/null +++ b/queue-5.10/hid-multitouch-add-quirk-for-honor-glo-gxxx-touchpad.patch @@ -0,0 +1,46 @@ +From ee1df1e4497c2a1f685a9d9648652792495821ad Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 21 Nov 2023 20:23:11 +0800 +Subject: HID: multitouch: Add quirk for HONOR GLO-GXXX touchpad + +From: Aoba K + +[ 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 +Signed-off-by: Jiri Kosina +Signed-off-by: Sasha Levin +--- + 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 index 00000000000..9510446393a --- /dev/null +++ b/queue-5.10/net-usb-qmi_wwan-claim-interface-4-for-zte-mf290.patch @@ -0,0 +1,68 @@ +From faced7c8ac754ffe01c5164478ddc91f7cffa8fb Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Lech Perczak +Link: https://lore.kernel.org/r/20231117231918.100278-3-lech.perczak@gmail.com +Signed-off-by: Paolo Abeni +Signed-off-by: Sasha Levin +--- + 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 index 00000000000..b69c28648a7 --- /dev/null +++ b/queue-5.10/platform-x86-intel_telemetry-fix-kernel-doc-descript.patch @@ -0,0 +1,57 @@ +From 10e5a0eacb075b94790e5fc011c505af79ca2b12 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Closes: https://lore.kernel.org/oe-kbuild-all/202310070743.WALmRGSY-lkp@intel.com/ +Signed-off-by: Andy Shevchenko +Link: https://lore.kernel.org/r/20231120150756.1661425-1-andriy.shevchenko@linux.intel.com +Reviewed-by: Rajneesh Bhardwaj +Reviewed-by: Ilpo Järvinen +Signed-off-by: Ilpo Järvinen +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-5.10/series b/queue-5.10/series index 0aa04d4a971..8cbed187d2a 100644 --- a/queue-5.10/series +++ b/queue-5.10/series @@ -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 index 00000000000..9874acd9c06 --- /dev/null +++ b/queue-5.10/usb-aqc111-check-packet-for-fixup-for-true-limit.patch @@ -0,0 +1,58 @@ +From 01015d5f0cbae07fac4ca0957ff52f54aa07745b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 15 Nov 2023 11:08:57 +0100 +Subject: usb: aqc111: check packet for fixup for true limit + +From: Oliver Neukum + +[ 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 +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + 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 + -- 2.47.3