[Intel-gfx] [PATCH v1] drm/i915: Skip modeset for cdclk changes if possible
Kumar, Abhay
abhay.kumar at intel.com
Wed Aug 29 00:55:06 UTC 2018
On 8/28/2018 5:39 AM, Ville Syrjälä wrote:
> On Mon, Aug 27, 2018 at 11:50:32AM -0700, Abhay Kumar wrote:
>> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
>>
>> If we have only a single active pipe and the cdclk change only requires
>> the cd2x divider to be updated bxt+ can do the update with forcing a full
>> modeset on the pipe. Try to hook that up.
>>
>> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
>> Signed-off-by: Abhay Kumar <abhay.kumar at intel.com>
>> ---
>> drivers/gpu/drm/i915/i915_drv.h | 3 +-
>> drivers/gpu/drm/i915/i915_reg.h | 3 +-
>> drivers/gpu/drm/i915/intel_cdclk.c | 105 +++++++++++++++++++++++++----------
>> drivers/gpu/drm/i915/intel_display.c | 20 ++++++-
>> drivers/gpu/drm/i915/intel_drv.h | 9 ++-
>> 5 files changed, 105 insertions(+), 35 deletions(-)
>>
> <snip>
>> @@ -12252,12 +12253,24 @@ static int intel_modeset_checks(struct drm_atomic_state *state)
>> return ret;
>> }
>>
>> +
>> /* All pipes must be switched off while we change the cdclk. */
>> - if (intel_cdclk_needs_modeset(&dev_priv->cdclk.actual,
>> - &intel_state->cdclk.actual)) {
>> + if (is_power_of_2(intel_state->active_crtcs) &&
>> + intel_cdclk_needs_cd2x_update(dev_priv,
>> + &dev_priv->cdclk.actual,
>> + &intel_state->cdclk.actual)) {
>> + ret = intel_lock_all_pipes(state);
>> + if (ret < 0)
>> + return ret;
>> +
>> + intel_state->cdclk.pipe = ilog2(intel_state->active_crtcs);
> BTW on further reflection this probably isn't quite sufficient. Let's
> say we have a commit with allow_modeset=true, but we aren't actually
> required to do a modeset based on any of the state changes. If we still
> have to change cdclk we should actually be doing the cd2x update
> atomically with the plane updates, or we should do it before or after
> the plane updates depending on whether the cdclk freq is going up or
> down.
>
> Doing the update atomically with the plane updates might be nicer in the
> end, but for that we would likely need to split the .set_cdclk() hooks
> into three parts (pre+commit+post). Whereas just doing the update before
> or after the plane updates as needed would probably be a little simpler.
Yeah. That might also get rid of cdclk mismatch warning during multiple
suspend resume cycle.
[280.600259] cdclk state doesn't match!
[280.600270] calling1-8+ @ 3110, parent: usb1, cb: usb_dev_resume
[280.600276] WARNING: CPU: 3 PID: 5224 at
/mnt/host/source/src/third_party/ker
nel/v4.14/drivers/gpu/drm/i915/intel_cdclk.c:1867 intel_set_cdclk+0xaa/0xdb
[280.600277] Modules linked in: cmac rfcomm uinput
snd_soc_sst_bxt_da7219_max9
8357a snd_soc_hdac_hdmi snd_soc_dmic lzo lzo_compress snd_soc_skl
snd_soc_skl_ip
c snd_soc_sst_ipc snd_soc_sst_dsp snd_soc_acpi snd_hda_ext_core snd_hda_core
[280.600307] callingphy0+ @ 3102, parent: 0000:00:0c.0, cb: wiphy_resume [cf
g80211]
[280.600308]zram snd_soc_max98357a acpi_als snd_soc_da7219 bridge stp llc ip
t_MASQUERADE nf_nat_masquerade_ipv4 xt_mark fuse snd_seq_dummy snd_seq
snd_seq_d
evice btusb btrtl btbcm iio_trig_sysfs btintel uvcvideo bluetooth
videobuf2_vmal
loc videobuf2_memops videobuf2_v4l2 ecdh_generic videobuf2_core
cros_ec_sensors
cros_ec_sensors_ring cros_ec_sensors_core industrialio_triggered_buffer
kfifo_bu
[280.600346] RDX: ffffffffb8258dd0 RSI: 0000000000000002 RDI:
ffffffffb8258db0
[280.600347] RBP: ffffbb9546b73aa0 R08: 0000000000000000 R09:
0000000000000000
[280.600348] R10: 0000000000000000 R11: ffffffffb86d8518 R12:
ffffa22075790000
[280.600349] R13: ffffa22075793d24 R14: 00000000ffffffff R15:
ffffa2202eec9800
00000000000
[280.600352] CS:0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[280.600353] CR2: 00007f43c04d0e50 CR3: 0000000224112000 CR4:
00000000003406e0
[280.600354] Call Trace:
[280.600361]intel_atomic_commit_tail+0x20a/0xacb
[280.600363]? intel_atomic_commit_ready+0x44/0x4c
[280.600365]intel_atomic_commit+0x227/0x238
[280.600368]glk_force_audio_cdclk+0x9f/0x119
[280.600370]i915_audio_component_get_power+0x3e/0x4d
[280.600376]snd_hdac_display_power+0x53/0x97 [snd_hda_core]
[280.600379] calling1-9+ @ 3086, parent: usb1, cb: usb_dev_resume
[280.600384]skl_resume+0x3a/0x17a [snd_soc_skl]
[280.600387]? pci_pm_suspend_noirq+0x1e9/0x1e9
[280.600391]dpm_run_callback+0x59/0xbf
[280.600394]device_resume+0x192/0x1d4
[280.600396]dpm_resume+0x145/0x1da
[280.600398]dpm_resume_end+0x11/0x1a
[280.600403]suspend_devices_and_enter+0x354/0x5c2
[280.600407]? remove_wait_queue+0x51/0x51
[280.600409]pm_suspend+0x29c/0x2e2
[280.600411]state_store+0xa2/0xcb
[280.600415]kernfs_fop_write+0x103/0x14a
[280.600420]__vfs_write+0x37/0xd0
[280.600424]? inode_security+0x19/0x20
[280.600426]? selinux_file_permission+0x78/0xad
[280.600428]vfs_write+0xb9/0xfd
[280.600430]SyS_write+0x5f/0xa3
[280.600434]do_syscall_64+0x64/0x72
[280.600438]entry_SYSCALL_64_after_hwframe+0x3d/0xa2
[280.600441] RIP: 0033:0x7f969d8af3b0
00001
[280.600443] RAX: ffffffffffffffda RBX: 00007f969ddf0000 RCX:
00007f969d8af3b0
[280.600444] RDX: 0000000000000006 RSI: 00007f969ddf0000 RDI:
0000000000000001
[280.600445] RBP: 00007ffd9e3f4880 R08: ffffffffffffffff R09:
0000000000000000
[280.600446] R10: 0000000000001000 R11: 0000000000000246 R12:
0000000000000006
[280.600447] R13: 0000000000020000 R14: 00007f969ddf0000 R15:
0000000000000001
>
>
>> + } else if (intel_cdclk_needs_modeset(&dev_priv->cdclk.actual,
>> + &intel_state->cdclk.actual)) {
>> ret = intel_modeset_all_pipes(state);
>> if (ret < 0)
>> return ret;
>> +
>> + intel_state->cdclk.pipe = INVALID_PIPE;
>> }
>>
>> DRM_DEBUG_KMS("New cdclk calculated to be logical %u kHz, actual %u kHz\n",
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/intel-gfx/attachments/20180828/c692ab9c/attachment-0001.html>
More information about the Intel-gfx
mailing list