<html>
<head>
<base href="https://bugs.freedesktop.org/">
</head>
<body>
<p>
<div>
<b><a class="bz_bug_link
bz_status_NEW "
title="NEW - [CI][DRMTIP] igt@pm_rpm@* - dmesg-warn - *ERROR* DBus power enable timeout!"
href="https://bugs.freedesktop.org/show_bug.cgi?id=108654#c5">Comment # 5</a>
on <a class="bz_bug_link
bz_status_NEW "
title="NEW - [CI][DRMTIP] igt@pm_rpm@* - dmesg-warn - *ERROR* DBus power enable timeout!"
href="https://bugs.freedesktop.org/show_bug.cgi?id=108654">bug 108654</a>
from <span class="vcard"><a class="email" href="mailto:imre.deak@intel.com" title="Imre Deak <imre.deak@intel.com>"> <span class="fn">Imre Deak</span></a>
</span></b>
<pre>I was wondering how this can happen since we have all outputs disabled and
runtime suspended. Then by now icl_dbuf_disable() should have zeroed
dev_priv->wm.skl_hw.ddb.enabled_slices and skl_compute_ddb() copied this
0 to intel_state->wm_results.ddb.enabled_slices during the compute phase
of the problematic commit (since no crtcs are active this 0 should've
been kept as-is). Then here both hw_enabled_slices and required_slices
should be 0, but it's obviously not the case.
What could happen I think is that the store in icl_dbuf_disable() /
icl_dbuf_enable() can race with the load in skl_compute_ddb(). So perhaps
skl_compute_ddb() copied from dev_priv enabled_slices as 1 or 2 (the only
values we compute during a commit), then icl_dbuf_disable() zeroed in a racy
way enabled_slices in dev_priv and we get here required_slices being 1 or 2 and
hw_enabled_slices being 0.
To fix the above I think we would need to do the following:
1. Do not update enabled_slices in icl_dbuf_enable() / icl_dbuf_disable()
We instead depend on the DDB HW readout to set the correct initial value
after module loading/resume and any following commit to update it if
needed (based on new resolution etc.).
After this we could still end up with stale values in
wm.skl_hw.ddb.enabled_slices, for instance if it's 2 b/c of two pipes
being enabled we wouldn't set it to 1 atm when disabling both pipes
in the same atomic commit. So we'd also need the following 2 changes.
2. Force-enable only a single slice in icl_dbuf_enable() (as the spec
requires) keeping the 2nd slice enabled only if BIOS has enabled it
(DDB HW readout will set the correct enabled_slices afterwards).
3. Make sure we always compute the proper enabled_slices in the atomic
state, by moving the calculation from intel_get_ddb_size() to
earlier, performing it even if all crtcs are disabled.
Ville also noticed a related problem where we don't recalculate the slice count
during a non-modeset commit, where a plane configuration change would require
this (due to the changed pixel bandwidth).</pre>
</div>
</p>
<hr>
<span>You are receiving this mail because:</span>
<ul>
<li>You are the QA Contact for the bug.</li>
<li>You are on the CC list for the bug.</li>
</ul>
</body>
</html>