[Intel-gfx] [PATCH] drm/i915: Wake up the device for the fbdev setup

Chris Wilson chris at chris-wilson.co.uk
Sun Sep 3 12:18:40 UTC 2017


Quoting ville.syrjala at linux.intel.com (2017-09-01 20:54:56)
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
> 
> Our fbdev setup requires the device to be awake for access
> through the GTT. If one boots without connected displays and
> later plugs one in, we won't have any runtime PM references when
> the fbdev setup runs. Explicitly grab a runtime PM reference during
> the fbdev setup to avoid the following spew:
> 
> [   62.518435] RPM wakelock ref not held during HW access
> [   62.518459] ------------[ cut here ]------------
> [   62.518546] WARNING: CPU: 3 PID: 37 at ../drivers/gpu/drm/i915/intel_drv.h:1800 i915_vma_pin_iomap+0x144/0x150 [i915]
> [   62.518585] Modules linked in: i915 i2c_algo_bit drm_kms_helper syscopyarea sysfillrect sysimgblt fb_sys_fops drm intel_gtt agpgart netconsole nls_iso8859_1 nls_cp437 vfat fat efi_pstore coretemp hwmon intel_rapl x86_pkg_temp_thermal e1000e efivars ptp pps_core video evdev ip_tables x_tables ipv6 autofs4
> [   62.518741] CPU: 3 PID: 37 Comm: kworker/3:1 Not tainted 4.13.0-rc7-skl+ #1077
> [   62.518770] Hardware name:                  /NUC7i5BNB, BIOS BNKBL357.86A.0048.2017.0704.1415 07/04/2017
> [   62.518827] Workqueue: events i915_hotplug_work_func [i915]
> [   62.518853] task: ffff88046c00dc00 task.stack: ffffc90000184000
> [   62.518896] RIP: 0010:i915_vma_pin_iomap+0x144/0x150 [i915]
> [   62.518919] RSP: 0018:ffffc90000187cc8 EFLAGS: 00010292
> [   62.518942] RAX: 000000000000002a RBX: ffff880460044000 RCX: 0000000000000006
> [   62.518969] RDX: 0000000000000006 RSI: ffffffff819c3e6f RDI: ffffffff819f1c0e
> [   62.518996] RBP: ffffc90000187cd8 R08: ffff88046c00e4f0 R09: 0000000000000000
> [   62.519022] R10: ffff8804669ca800 R11: 0000000000000000 R12: ffff880461d20000
> [   62.519049] R13: ffffc90000187d48 R14: ffff880461d20000 R15: ffff880460044000
> [   62.519076] FS:  0000000000000000(0000) GS:ffff88047ed80000(0000) knlGS:0000000000000000
> [   62.519107] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> [   62.519130] CR2: 000056478ae213f0 CR3: 0000000002c0f000 CR4: 00000000003406e0
> [   62.519156] Call Trace:
> [   62.519190]  intelfb_create+0x176/0x360 [i915]
> [   62.519216]  __drm_fb_helper_initial_config_and_unlock+0x1c7/0x3c0 [drm_kms_helper]
> [   62.519251]  drm_fb_helper_hotplug_event.part.18+0xac/0xc0 [drm_kms_helper]
> [   62.519282]  drm_fb_helper_hotplug_event+0x1a/0x20 [drm_kms_helper]
> [   62.519324]  intel_fbdev_output_poll_changed+0x1a/0x20 [i915]
> [   62.519352]  drm_kms_helper_hotplug_event+0x27/0x30 [drm_kms_helper]
> [   62.519395]  i915_hotplug_work_func+0x24e/0x2b0 [i915]
> [   62.519420]  process_one_work+0x1d3/0x6d0
> [   62.519440]  worker_thread+0x4b/0x400
> [   62.519458]  ? schedule+0x4a/0x90
> [   62.519475]  ? preempt_count_sub+0x97/0xf0
> [   62.519495]  kthread+0x114/0x150
> [   62.519511]  ? process_one_work+0x6d0/0x6d0
> [   62.519530]  ? kthread_create_on_node+0x40/0x40
> [   62.519551]  ret_from_fork+0x27/0x40
> [   62.519569] Code: c4 78 e6 e0 0f ff e9 08 ff ff ff 80 3d d5 bc 0c 00 00 0f 85 0b ff ff ff 48 c7 c7 d8 50 32 a0 c6 05 c1 bc 0c 00 01 e8 9d 78 e6 e0 <0f> ff e9 f1 fe ff ff 0f 1f 44 00 00 0f 1f 44 00 00 0f b6 87 98
> [   62.519771] ---[ end trace 5fbe271f991a58ae ]---
> 
> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>

Ah right, the current code only works because it assumes the fbcon is
active on the display (thus holding a wakeref) anytime it writes through
the fbdev's GGTT iomapping. This is one instance where we need GGTT access
before the fbcon controls the display, hence needs an explicit wakeref.

intel_fbdev_set_suspend() is also outside of the fbcon control, I
presume that (memset_io) works because we hold a wakeref whilst doing
suspend/resume.

Reviewed-by: Chris Wilson <chris at chris-wilson.co.uk>
-Chris


More information about the Intel-gfx mailing list