• Lyude Paul's avatar
    drm/meson: Enable fast_io in meson_dw_hdmi_regmap_config · 995b278e
    Lyude Paul authored
    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: default avatarLyude Paul <lyude@redhat.com>
    Fixes: 3f68be7d ("drm/meson: Add support for HDMI encoder and DW-HDMI bridge + PHY")
    Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
    Cc: Neil Armstrong <narmstrong@baylibre.com>
    Cc: Carlo Caione <carlo@caione.org>
    Cc: Kevin Hilman <khilman@baylibre.com>
    Cc: dri-devel@lists.freedesktop.org
    Cc: linux-amlogic@lists.infradead.org
    Cc: linux-arm-kernel@lists.infradead.org
    Cc: <stable@vger.kernel.org> # v4.12+
    Acked-by: default avatarNeil Armstrong <narmstrong@baylibre.com>
    Signed-off-by: default avatarNeil Armstrong <narmstrong@baylibre.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20181124191238.28276-1-lyude@redhat.comSigned-off-by: default avatarSean Paul <seanpaul@chromium.org>
    995b278e
meson_dw_hdmi.c 26.2 KB