[PATCH] drm/meson: Enable fast_io in meson_dw_hdmi_regmap_config

Neil Armstrong narmstrong at baylibre.com
Mon Nov 26 08:49:42 UTC 2018


On 24/11/2018 20:12, Lyude Paul wrote:
> Seeing as we use this registermap in the context of our IRQ handlers, we
> need to be using spinlocks for reading/writing registers so that we can
> still read them from IRQ handlers without having to grab any mutexes and
> accidentally sleep. We don't currently do this, as pointed out by
> lockdep:
> 
> [   18.403770] BUG: sleeping function called from invalid context at kernel/locking/mutex.c:908
> [   18.406744] in_atomic(): 1, irqs_disabled(): 128, pid: 68, name: kworker/u17:0
> [   18.413864] INFO: lockdep is turned off.
> [   18.417675] irq event stamp: 12
> [   18.420778] hardirqs last  enabled at (11): [<ffff000008a4f57c>] _raw_spin_unlock_irq+0x2c/0x60
> [   18.429510] hardirqs last disabled at (12): [<ffff000008a48914>] __schedule+0xc4/0xa60
> [   18.437345] softirqs last  enabled at (0): [<ffff0000080b55e0>] copy_process.isra.4.part.5+0x4d8/0x1c50
> [   18.446684] softirqs last disabled at (0): [<0000000000000000>]           (null)
> [   18.453979] CPU: 0 PID: 68 Comm: kworker/u17:0 Tainted: G        W  O      4.20.0-rc3Lyude-Test+ #9
> [   18.469839] Hardware name: amlogic khadas-vim2/khadas-vim2, BIOS 2018.07-rc2-armbian 09/11/2018
> [   18.480037] Workqueue: hci0 hci_power_on [bluetooth]
> [   18.487138] Call trace:
> [   18.494192]  dump_backtrace+0x0/0x1b8
> [   18.501280]  show_stack+0x14/0x20
> [   18.508361]  dump_stack+0xbc/0xf4
> [   18.515427]  ___might_sleep+0x140/0x1d8
> [   18.522515]  __might_sleep+0x50/0x88
> [   18.529582]  __mutex_lock+0x60/0x870
> [   18.536621]  mutex_lock_nested+0x1c/0x28
> [   18.543660]  regmap_lock_mutex+0x10/0x18
> [   18.550696]  regmap_read+0x38/0x70
> [   18.557727]  dw_hdmi_hardirq+0x58/0x138 [dw_hdmi]
> [   18.564804]  __handle_irq_event_percpu+0xac/0x410
> [   18.571891]  handle_irq_event_percpu+0x34/0x88
> [   18.578982]  handle_irq_event+0x48/0x78
> [   18.586051]  handle_fasteoi_irq+0xac/0x160
> [   18.593061]  generic_handle_irq+0x24/0x38
> [   18.599989]  __handle_domain_irq+0x60/0xb8
> [   18.606857]  gic_handle_irq+0x50/0xa0
> [   18.613659]  el1_irq+0xb4/0x130
> [   18.620394]  debug_lockdep_rcu_enabled+0x2c/0x30
> [   18.627111]  schedule+0x38/0xa0
> [   18.633781]  schedule_timeout+0x3a8/0x510
> [   18.640389]  wait_for_common+0x15c/0x180
> [   18.646905]  wait_for_completion+0x14/0x20
> [   18.653319]  mmc_wait_for_req_done+0x28/0x168
> [   18.659693]  mmc_wait_for_req+0xa8/0xe8
> [   18.665978]  mmc_wait_for_cmd+0x64/0x98
> [   18.672180]  mmc_io_rw_direct_host+0x94/0x130
> [   18.678385]  mmc_io_rw_direct+0x10/0x18
> [   18.684516]  sdio_enable_func+0xe8/0x1d0
> [   18.690627]  btsdio_open+0x24/0xc0 [btsdio]
> [   18.696821]  hci_dev_do_open+0x64/0x598 [bluetooth]
> [   18.703025]  hci_power_on+0x50/0x270 [bluetooth]
> [   18.709163]  process_one_work+0x2a0/0x6e0
> [   18.715252]  worker_thread+0x40/0x448
> [   18.721310]  kthread+0x12c/0x130
> [   18.727326]  ret_from_fork+0x10/0x1c
> [   18.735555] ------------[ cut here ]------------
> [   18.741430] do not call blocking ops when !TASK_RUNNING; state=2 set at [<000000006265ec59>] wait_for_common+0x140/0x180
> [   18.752417] WARNING: CPU: 0 PID: 68 at kernel/sched/core.c:6096 __might_sleep+0x7c/0x88
> [   18.760553] Modules linked in: dm_mirror dm_region_hash dm_log dm_mod
> btsdio bluetooth snd_soc_hdmi_codec dw_hdmi_i2s_audio ecdh_generic
> brcmfmac brcmutil cfg80211 rfkill ir_nec_decoder meson_dw_hdmi(O)
> dw_hdmi rc_geekbox meson_rng meson_ir ao_cec rng_core rc_core cec
> leds_pwm efivars nfsd ip_tables x_tables crc32_generic f2fs uas
> meson_gxbb_wdt pwm_meson efivarfs ipv6
> [   18.799469] CPU: 0 PID: 68 Comm: kworker/u17:0 Tainted: G        W  O      4.20.0-rc3Lyude-Test+ #9
> [   18.808858] Hardware name: amlogic khadas-vim2/khadas-vim2, BIOS 2018.07-rc2-armbian 09/11/2018
> [   18.818045] Workqueue: hci0 hci_power_on [bluetooth]
> [   18.824088] pstate: 80000085 (Nzcv daIf -PAN -UAO)
> [   18.829891] pc : __might_sleep+0x7c/0x88
> [   18.835722] lr : __might_sleep+0x7c/0x88
> [   18.841256] sp : ffff000008003cb0
> [   18.846751] x29: ffff000008003cb0 x28: 0000000000000000
> [   18.852269] x27: ffff00000938e000 x26: ffff800010283000
> [   18.857726] x25: ffff800010353280 x24: ffff00000868ef50
> [   18.863166] x23: 0000000000000000 x22: 0000000000000000
> [   18.868551] x21: 0000000000000000 x20: 000000000000038c
> [   18.873850] x19: ffff000008cd08c0 x18: 0000000000000010
> [   18.879081] x17: ffff000008a68cb0 x16: 0000000000000000
> [   18.884197] x15: 0000000000aaaaaa x14: 0e200e200e200e20
> [   18.889239] x13: 0000000000000001 x12: 00000000ffffffff
> [   18.894261] x11: ffff000008adfa48 x10: 0000000000000001
> [   18.899517] x9 : ffff0000092a0158 x8 : 0000000000000000
> [   18.904674] x7 : ffff00000812136c x6 : 0000000000000000
> [   18.909895] x5 : 0000000000000000 x4 : 0000000000000001
> [   18.915080] x3 : 0000000000000007 x2 : 0000000000000007
> [   18.920269] x1 : 99ab8e9ebb6c8500 x0 : 0000000000000000
> [   18.925443] Call trace:
> [   18.929904]  __might_sleep+0x7c/0x88
> [   18.934311]  __mutex_lock+0x60/0x870
> [   18.938687]  mutex_lock_nested+0x1c/0x28
> [   18.943076]  regmap_lock_mutex+0x10/0x18
> [   18.947453]  regmap_read+0x38/0x70
> [   18.951842]  dw_hdmi_hardirq+0x58/0x138 [dw_hdmi]
> [   18.956269]  __handle_irq_event_percpu+0xac/0x410
> [   18.960712]  handle_irq_event_percpu+0x34/0x88
> [   18.965176]  handle_irq_event+0x48/0x78
> [   18.969612]  handle_fasteoi_irq+0xac/0x160
> [   18.974058]  generic_handle_irq+0x24/0x38
> [   18.978501]  __handle_domain_irq+0x60/0xb8
> [   18.982938]  gic_handle_irq+0x50/0xa0
> [   18.987351]  el1_irq+0xb4/0x130
> [   18.991734]  debug_lockdep_rcu_enabled+0x2c/0x30
> [   18.996180]  schedule+0x38/0xa0
> [   19.000609]  schedule_timeout+0x3a8/0x510
> [   19.005064]  wait_for_common+0x15c/0x180
> [   19.009513]  wait_for_completion+0x14/0x20
> [   19.013951]  mmc_wait_for_req_done+0x28/0x168
> [   19.018402]  mmc_wait_for_req+0xa8/0xe8
> [   19.022809]  mmc_wait_for_cmd+0x64/0x98
> [   19.027177]  mmc_io_rw_direct_host+0x94/0x130
> [   19.031563]  mmc_io_rw_direct+0x10/0x18
> [   19.035922]  sdio_enable_func+0xe8/0x1d0
> [   19.040294]  btsdio_open+0x24/0xc0 [btsdio]
> [   19.044742]  hci_dev_do_open+0x64/0x598 [bluetooth]
> [   19.049228]  hci_power_on+0x50/0x270 [bluetooth]
> [   19.053687]  process_one_work+0x2a0/0x6e0
> [   19.058143]  worker_thread+0x40/0x448
> [   19.062608]  kthread+0x12c/0x130
> [   19.067064]  ret_from_fork+0x10/0x1c
> [   19.071513] irq event stamp: 12
> [   19.075937] hardirqs last  enabled at (11): [<ffff000008a4f57c>] _raw_spin_unlock_irq+0x2c/0x60
> [   19.083560] hardirqs last disabled at (12): [<ffff000008a48914>] __schedule+0xc4/0xa60
> [   19.091401] softirqs last  enabled at (0): [<ffff0000080b55e0>] copy_process.isra.4.part.5+0x4d8/0x1c50
> [   19.100801] softirqs last disabled at (0): [<0000000000000000>]           (null)
> [   19.108135] ---[ end trace 38c4920787b88c75 ]---
> 
> So, fix this by enabling the fast_io option in our regmap config so that
> regmap uses spinlocks for locking instead of mutexes.
> 
> Signed-off-by: Lyude Paul <lyude at redhat.com>
> Fixes: 3f68be7d8e96 ("drm/meson: Add support for HDMI encoder and DW-HDMI bridge + PHY")
> Cc: Daniel Vetter <daniel.vetter at ffwll.ch>
> Cc: Neil Armstrong <narmstrong at baylibre.com>
> Cc: Carlo Caione <carlo at caione.org>
> Cc: Kevin Hilman <khilman at baylibre.com>
> Cc: dri-devel at lists.freedesktop.org
> Cc: linux-amlogic at lists.infradead.org
> Cc: linux-arm-kernel at lists.infradead.org
> Cc: <stable at vger.kernel.org> # v4.12+
> ---
>  drivers/gpu/drm/meson/meson_dw_hdmi.c | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/drivers/gpu/drm/meson/meson_dw_hdmi.c b/drivers/gpu/drm/meson/meson_dw_hdmi.c
> index df7247cd93f9..2cb2ad26d716 100644
> --- a/drivers/gpu/drm/meson/meson_dw_hdmi.c
> +++ b/drivers/gpu/drm/meson/meson_dw_hdmi.c
> @@ -706,6 +706,7 @@ static const struct regmap_config meson_dw_hdmi_regmap_config = {
>  	.reg_read = meson_dw_hdmi_reg_read,
>  	.reg_write = meson_dw_hdmi_reg_write,
>  	.max_register = 0x10000,
> +	.fast_io = true,
>  };
>  
>  static bool meson_hdmi_connector_is_available(struct device *dev)
> 

Acked-by: Neil Armstrong <narmstrong at baylibre.com>


Applying to drm-misc-fixes

Thanks,
Neil


More information about the dri-devel mailing list