+ Mark
Hi Marek andy Mark:
On 12/15/23 16:33, Andy Yan wrote:
Hi Marek:
On 12/15/23 08:59, Andy Yan wrote:
Hi Marek:
Sorry for this issue.
I also tested this series on RK3568/6 before I send them out.
But I didn't find anyahing unusal, would you please share the
linux kernel defconfig you used for this test and it would be
greatly appreciated if you can share more test detial.
I can reproduce this warning when enable CONFIG_LOCKDEP, I will try
to fix it asap.
Thanks.
On 12/14/23 20:13, Marek Szyprowski wrote:
Dear All,
On 11.12.2023 12:57, Andy Yan wrote:
From: Andy Yan <andy.yan@xxxxxxxxxxxxxx>
This reverts commit b63a553e8f5aa6574eeb535a551817a93c426d8c.
regcache_sync will try to reload the configuration in regcache to
hardware, but the registers of 4 Cluster windows and Esmart1/2/3 on
the upcoming rk3588 can not be set successfully before internal PD
power on.
Also it's better to keep the hardware register as it is before we really
enable it.
So let's revert this version, and keep the first version:
commit afa965a45e01 ("drm/rockchip: vop2: fix suspend/resume")
Signed-off-by: Andy Yan <andy.yan@xxxxxxxxxxxxxx>
Reviewed-by: Sascha Hauer <s.hauer@xxxxxxxxxxxxxx>
This patch landed in today's linux-next as commit 81a06f1d02e5 ("Revert
"drm/rockchip: vop2: Use regcache_sync() to fix suspend/resume"").
Unfortunately it triggers a following lock dep warning on my Odroid-M1
test board:
========================================================
WARNING: possible irq lock inversion dependency detected
6.7.0-rc3+ #14328 Not tainted
--------------------------------------------------------
swapper/0/0 just changed the state of lock:
ffff0001f3ae2c18
(rockchip_drm_vop2:2723:(&vop2_regmap_config)->lock){-...}-{2:2}, at:
regmap_lock_spinlock+0x18/0x2c
but this lock took another, HARDIRQ-unsafe lock in the past:
(&mt->ma_lock){+.+.}-{2:2}
and interrupts could create inverse lock ordering between them.
other info that might help us debug this:
Possible interrupt unsafe locking scenario:
CPU0 CPU1
---- ----
lock(&mt->ma_lock);
local_irq_disable();
lock(rockchip_drm_vop2:2723:(&vop2_regmap_config)->lock);
lock(&mt->ma_lock);
<Interrupt>
lock(rockchip_drm_vop2:2723:(&vop2_regmap_config)->lock);
*** DEADLOCK ***
no locks held by swapper/0/0.
the shortest dependencies between 2nd lock and 1st lock:
-> (&mt->ma_lock){+.+.}-{2:2} {
HARDIRQ-ON-W at:
lock_acquire+0x1e8/0x318
_raw_spin_lock+0x48/0x60
regcache_maple_exit+0x5c/0xc0
regcache_exit+0x48/0x74
regmap_reinit_cache+0x1c/0xc4
vop2_crtc_atomic_enable+0x86c/0xa0c [rockchipdrm]
drm_atomic_helper_commit_modeset_enables+0xb4/0x26c
drm_atomic_helper_commit_tail_rpm+0x50/0xa0
commit_tail+0xa4/0x18c
drm_atomic_helper_commit+0x19c/0x1b0
drm_atomic_commit+0xa8/0xe0
drm_client_modeset_commit_atomic+0x22c/0x298
drm_client_modeset_commit_locked+0x60/0x1c0
drm_client_modeset_commit+0x30/0x58
__drm_fb_helper_restore_fbdev_mode_unlocked+0xbc/0xfc
drm_fb_helper_set_par+0x30/0x4c
fbcon_init+0x234/0x4c0
visual_init+0xb0/0x108
do_bind_con_driver.isra.0+0x19c/0x394
do_take_over_console+0x144/0x1f0
do_fbcon_takeover+0x6c/0xe4
fbcon_fb_registered+0x1e0/0x1e8
register_framebuffer+0x19c/0x228
__drm_fb_helper_initial_config_and_unlock+0x348/0x4fc
drm_fb_helper_hotplug_event.part.0+0xf0/0x110
drm_fb_helper_hotplug_event+0x38/0x44
drm_fbdev_generic_client_hotplug+0x28/0xd4
drm_client_dev_hotplug+0xcc/0x130
output_poll_execute+0x204/0x23c
process_one_work+0x1ec/0x53c
worker_thread+0x298/0x408
kthread+0x124/0x128
ret_from_fork+0x10/0x20
SOFTIRQ-ON-W at:
lock_acquire+0x1e8/0x318
_raw_spin_lock+0x48/0x60
regcache_maple_exit+0x5c/0xc0
regcache_exit+0x48/0x74
regmap_reinit_cache+0x1c/0xc4
vop2_crtc_atomic_enable+0x86c/0xa0c [rockchipdrm]
drm_atomic_helper_commit_modeset_enables+0xb4/0x26c
drm_atomic_helper_commit_tail_rpm+0x50/0xa0
commit_tail+0xa4/0x18c
drm_atomic_helper_commit+0x19c/0x1b0
drm_atomic_commit+0xa8/0xe0
drm_client_modeset_commit_atomic+0x22c/0x298
drm_client_modeset_commit_locked+0x60/0x1c0
drm_client_modeset_commit+0x30/0x58
__drm_fb_helper_restore_fbdev_mode_unlocked+0xbc/0xfc
drm_fb_helper_set_par+0x30/0x4c
fbcon_init+0x234/0x4c0
visual_init+0xb0/0x108
do_bind_con_driver.isra.0+0x19c/0x394
do_take_over_console+0x144/0x1f0
do_fbcon_takeover+0x6c/0xe4
fbcon_fb_registered+0x1e0/0x1e8
register_framebuffer+0x19c/0x228
__drm_fb_helper_initial_config_and_unlock+0x348/0x4fc
drm_fb_helper_hotplug_event.part.0+0xf0/0x110
drm_fb_helper_hotplug_event+0x38/0x44
drm_fbdev_generic_client_hotplug+0x28/0xd4
drm_client_dev_hotplug+0xcc/0x130
output_poll_execute+0x204/0x23c
process_one_work+0x1ec/0x53c
worker_thread+0x298/0x408
kthread+0x124/0x128
ret_from_fork+0x10/0x20
INITIAL USE at:
lock_acquire+0x1e8/0x318
_raw_spin_lock+0x48/0x60
regcache_maple_exit+0x5c/0xc0
regcache_exit+0x48/0x74
regmap_reinit_cache+0x1c/0xc4
vop2_crtc_atomic_enable+0x86c/0xa0c [rockchipdrm]
drm_atomic_helper_commit_modeset_enables+0xb4/0x26c
drm_atomic_helper_commit_tail_rpm+0x50/0xa0
commit_tail+0xa4/0x18c
drm_atomic_helper_commit+0x19c/0x1b0
drm_atomic_commit+0xa8/0xe0
drm_client_modeset_commit_atomic+0x22c/0x298
drm_client_modeset_commit_locked+0x60/0x1c0
drm_client_modeset_commit+0x30/0x58
__drm_fb_helper_restore_fbdev_mode_unlocked+0xbc/0xfc
drm_fb_helper_set_par+0x30/0x4c
fbcon_init+0x234/0x4c0
visual_init+0xb0/0x108
do_bind_con_driver.isra.0+0x19c/0x394
do_take_over_console+0x144/0x1f0
do_fbcon_takeover+0x6c/0xe4
fbcon_fb_registered+0x1e0/0x1e8
register_framebuffer+0x19c/0x228
__drm_fb_helper_initial_config_and_unlock+0x348/0x4fc
drm_fb_helper_hotplug_event.part.0+0xf0/0x110
drm_fb_helper_hotplug_event+0x38/0x44
drm_fbdev_generic_client_hotplug+0x28/0xd4
drm_client_dev_hotplug+0xcc/0x130
output_poll_execute+0x204/0x23c
process_one_work+0x1ec/0x53c
worker_thread+0x298/0x408
kthread+0x124/0x128
ret_from_fork+0x10/0x20
}
... key at: [<ffff800083de53b0>] __key.0+0x0/0x10
... acquired at:
_raw_spin_lock+0x48/0x60
regcache_maple_write+0x1d8/0x31c
regcache_write+0x6c/0x84
_regmap_read+0x1b4/0x1f4
_regmap_update_bits+0xec/0x134
regmap_field_update_bits_base+0x6c/0xa0
vop2_plane_atomic_update+0x380/0x11d0 [rockchipdrm]
drm_atomic_helper_commit_planes+0xec/0x2a0
drm_atomic_helper_commit_tail_rpm+0x60/0xa0
commit_tail+0xa4/0x18c
drm_atomic_helper_commit+0x19c/0x1b0
drm_atomic_commit+0xa8/0xe0
drm_client_modeset_commit_atomic+0x22c/0x298
drm_client_modeset_commit_locked+0x60/0x1c0
drm_client_modeset_commit+0x30/0x58
__drm_fb_helper_restore_fbdev_mode_unlocked+0xbc/0xfc
drm_fb_helper_set_par+0x30/0x4c
fbcon_init+0x234/0x4c0
visual_init+0xb0/0x108
do_bind_con_driver.isra.0+0x19c/0x394
do_take_over_console+0x144/0x1f0
do_fbcon_takeover+0x6c/0xe4
fbcon_fb_registered+0x1e0/0x1e8
register_framebuffer+0x19c/0x228
__drm_fb_helper_initial_config_and_unlock+0x348/0x4fc
drm_fb_helper_hotplug_event.part.0+0xf0/0x110
drm_fb_helper_hotplug_event+0x38/0x44
drm_fbdev_generic_client_hotplug+0x28/0xd4
drm_client_dev_hotplug+0xcc/0x130
output_poll_execute+0x204/0x23c
process_one_work+0x1ec/0x53c
worker_thread+0x298/0x408
kthread+0x124/0x128
ret_from_fork+0x10/0x20
-> (rockchip_drm_vop2:2723:(&vop2_regmap_config)->lock){-...}-{2:2} {
IN-HARDIRQ-W at:
lock_acquire+0x1e8/0x318
_raw_spin_lock_irqsave+0x60/0x88
regmap_lock_spinlock+0x18/0x2c
regmap_read+0x3c/0x78
vop2_isr+0x84/0x2a4 [rockchipdrm]
__handle_irq_event_percpu+0xb0/0x2d4
handle_irq_event+0x4c/0xb8
handle_fasteoi_irq+0xa4/0x1cc
generic_handle_domain_irq+0x2c/0x44
gic_handle_irq+0x4c/0x110
call_on_irq_stack+0x24/0x4c
do_interrupt_handler+0x80/0x84
el1_interrupt+0x34/0x64
el1h_64_irq_handler+0x18/0x24
el1h_64_irq+0x64/0x68
default_idle_call+0x9c/0x150
do_idle+0x230/0x294
cpu_startup_entry+0x34/0x3c
rest_init+0x100/0x190
arch_post_acpi_subsys_init+0x0/0x8
start_kernel+0x594/0x684
__primary_switched+0xbc/0xc4
INITIAL USE at:
lock_acquire+0x1e8/0x318
_raw_spin_lock_irqsave+0x60/0x88
regmap_lock_spinlock+0x18/0x2c
regmap_write+0x3c/0x78
vop2_crtc_atomic_enable+0x894/0xa0c [rockchipdrm]
drm_atomic_helper_commit_modeset_enables+0xb4/0x26c
drm_atomic_helper_commit_tail_rpm+0x50/0xa0
commit_tail+0xa4/0x18c
drm_atomic_helper_commit+0x19c/0x1b0
drm_atomic_commit+0xa8/0xe0
drm_client_modeset_commit_atomic+0x22c/0x298
drm_client_modeset_commit_locked+0x60/0x1c0
drm_client_modeset_commit+0x30/0x58
__drm_fb_helper_restore_fbdev_mode_unlocked+0xbc/0xfc
drm_fb_helper_set_par+0x30/0x4c
fbcon_init+0x234/0x4c0
visual_init+0xb0/0x108
do_bind_con_driver.isra.0+0x19c/0x394
do_take_over_console+0x144/0x1f0
do_fbcon_takeover+0x6c/0xe4
fbcon_fb_registered+0x1e0/0x1e8
register_framebuffer+0x19c/0x228
__drm_fb_helper_initial_config_and_unlock+0x348/0x4fc
drm_fb_helper_hotplug_event.part.0+0xf0/0x110
drm_fb_helper_hotplug_event+0x38/0x44
drm_fbdev_generic_client_hotplug+0x28/0xd4
drm_client_dev_hotplug+0xcc/0x130
output_poll_execute+0x204/0x23c
process_one_work+0x1ec/0x53c
worker_thread+0x298/0x408
kthread+0x124/0x128
ret_from_fork+0x10/0x20
}
... key at: [<ffff80007c090a18>] _key.6+0x0/0xffffffffffffd5e8
[rockchipdrm]
... acquired at:
__lock_acquire+0xad8/0x20c4
lock_acquire+0x1e8/0x318
_raw_spin_lock_irqsave+0x60/0x88
regmap_lock_spinlock+0x18/0x2c
regmap_read+0x3c/0x78
vop2_isr+0x84/0x2a4 [rockchipdrm]
__handle_irq_event_percpu+0xb0/0x2d4
handle_irq_event+0x4c/0xb8
handle_fasteoi_irq+0xa4/0x1cc
generic_handle_domain_irq+0x2c/0x44
gic_handle_irq+0x4c/0x110
call_on_irq_stack+0x24/0x4c
do_interrupt_handler+0x80/0x84
el1_interrupt+0x34/0x64
el1h_64_irq_handler+0x18/0x24
el1h_64_irq+0x64/0x68
default_idle_call+0x9c/0x150
do_idle+0x230/0x294
cpu_startup_entry+0x34/0x3c
rest_init+0x100/0x190
arch_post_acpi_subsys_init+0x0/0x8
start_kernel+0x594/0x684
__primary_switched+0xbc/0xc4
stack backtrace:
CPU: 0 PID: 0 Comm: swapper/0 Not tainted 6.7.0-rc3+ #14328
Hardware name: Hardkernel ODROID-M1 (DT)
Call trace:
dump_backtrace+0x98/0xf0
show_stack+0x18/0x24
dump_stack_lvl+0x60/0xac
dump_stack+0x18/0x24
print_irq_inversion_bug.part.0+0x1ec/0x27c
mark_lock+0x634/0x950
__lock_acquire+0xad8/0x20c4
lock_acquire+0x1e8/0x318
_raw_spin_lock_irqsave+0x60/0x88
regmap_lock_spinlock+0x18/0x2c
regmap_read+0x3c/0x78
vop2_isr+0x84/0x2a4 [rockchipdrm]
__handle_irq_event_percpu+0xb0/0x2d4
handle_irq_event+0x4c/0xb8
handle_fasteoi_irq+0xa4/0x1cc
generic_handle_domain_irq+0x2c/0x44
gic_handle_irq+0x4c/0x110
call_on_irq_stack+0x24/0x4c
do_interrupt_handler+0x80/0x84
el1_interrupt+0x34/0x64
el1h_64_irq_handler+0x18/0x24
el1h_64_irq+0x64/0x68
default_idle_call+0x9c/0x150
do_idle+0x230/0x294
cpu_startup_entry+0x34/0x3c
rest_init+0x100/0x190
arch_post_acpi_subsys_init+0x0/0x8
start_kernel+0x594/0x684
__primary_switched+0xbc/0xc4
Console: switching to colour frame buffer device 240x67
rockchip-drm display-subsystem: [drm] fb0: rockchipdrmfb frame buffer device
Reverting it on top of next-20231214 and resolving a conflict
fixes/hides the above lock dep issue.
I still dig what is going on here, but I also found that if I change the regmap cache_type
back to REGCACHE_MAPLE(which means revert Mark's patch[0]), this warning is gone.
As I am not familiar with regmap and lockdep, I'm not sure if this wanring is caused by my improper
use of regmap_reinit_cache.
I will continue do more dig, any light on this would be greatly appreciated.
[0]https://patchwork.kernel.org/project/linux-arm-kernel/patch/20231001-drm-rockchip-maple-v1-1-ca396ab75be7@xxxxxxxxxx/
---
(no changes since v1)
drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index 312da5783362..57784d0a22a6 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -217,6 +217,8 @@ struct vop2 {
struct vop2_win win[];
};
+static const struct regmap_config vop2_regmap_config;
+
static struct vop2_video_port *to_vop2_video_port(struct drm_crtc *crtc)
{
return container_of(crtc, struct vop2_video_port, crtc);
@@ -883,7 +885,11 @@ static void vop2_enable(struct vop2 *vop2)
return;
}
- regcache_sync(vop2->map);
+ ret = regmap_reinit_cache(vop2->map, &vop2_regmap_config);
+ if (ret) {
+ drm_err(vop2->drm, "failed to reinit cache: %d\n", ret);
+ return;
+ }
if (vop2->data->soc_id == 3566)
vop2_writel(vop2, RK3568_OTP_WIN_EN, 1);
@@ -913,8 +919,6 @@ static void vop2_disable(struct vop2 *vop2)
pm_runtime_put_sync(vop2->dev);
- regcache_mark_dirty(vop2->map);
-
clk_disable_unprepare(vop2->aclk);
clk_disable_unprepare(vop2->hclk);
}
Best regards