Skip to content

Commit dbcc2af

Browse files
author
Mahadevan P
committed
FROMLIST: drm/atomic-helper: tear down HPD/polling in drm_atomic_helper_shutdown()
drm_atomic_helper_shutdown() disables all CRTCs but leaves output polling and IRQ-driven hot-plug detection running. On reboot, a late DP hot-plug-detect (HPD) IRQ can fire after apps_smmu has already disabled translation for the display subsystem, causing the HPD thread to kick off a new modeset that drives DPU/DP hardware and DMA through a stale IOMMU mapping. drm_atomic_helper_shutdown() disables all CRTCs first, but a pending HPD IRQ thread wakes up afterwards, reads the DPCD, and fires an unsolicited hotplug event that triggers a second atomic commit turning the display back on -- right as the IOMMU is disabling translation: systemd-shutdown[1]: Rebooting. msm_dpu: drm_atomic_commit: committing (shutdown disabling CRTCs) arm-smmu 3da0000.iommu: disabling translation msm_dpu: drm_dp_read_dpcd_caps (late HPD IRQ thread wakes up) msm_dpu: drm_sysfs_connector_hotplug_event: DP-1 hotplug event msm_dpu: drm_client_modeset_probe: DP-1 found preferred mode msm_dpu: drm_atomic_commit: committing (unsolicited, re-enables display) dpu_crtc_commit_kickoff: crtc94 first commit arm-smmu 15200000.iommu: disabling translation drm_kms_helper_poll_fini() tears down this: it stops the output poll worker and calls each connector's &drm_connector_helper_funcs.disable_hpd, which for HPD-capable bridges masks the interrupt in hardware. Reported on Qualcomm platforms such as lemans-evk and monaco-evk during reboot stress testing. Assisted-by: Claude:claude-sonnet-5 Link: https://lore.kernel.org/all/20260717-dpshutdown-v1-1-b062c2f7dfb1@oss.qualcomm.com/ Signed-off-by: Mahadevan P <mahadevan.p@oss.qualcomm.com>
1 parent 1bc9614 commit dbcc2af

1 file changed

Lines changed: 5 additions & 0 deletions

File tree

drivers/gpu/drm/drm_atomic_helper.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
#include <drm/drm_gem_atomic_helper.h>
4242
#include <drm/drm_panic.h>
4343
#include <drm/drm_print.h>
44+
#include <drm/drm_probe_helper.h>
4445
#include <drm/drm_self_refresh_helper.h>
4546
#include <drm/drm_vblank.h>
4647
#include <drm/drm_writeback.h>
@@ -3656,6 +3657,8 @@ EXPORT_SYMBOL(drm_atomic_helper_reset_crtc);
36563657
*
36573658
* This is just a convenience wrapper around drm_atomic_helper_disable_all(),
36583659
* and it is the atomic version of drm_helper_force_disable_all().
3660+
*
3661+
* This also tears down output polling and HPD via drm_kms_helper_poll_fini().
36593662
*/
36603663
void drm_atomic_helper_shutdown(struct drm_device *dev)
36613664
{
@@ -3665,6 +3668,8 @@ void drm_atomic_helper_shutdown(struct drm_device *dev)
36653668
if (dev == NULL)
36663669
return;
36673670

3671+
drm_kms_helper_poll_fini(dev);
3672+
36683673
DRM_MODESET_LOCK_ALL_BEGIN(dev, ctx, 0, ret);
36693674

36703675
ret = drm_atomic_helper_disable_all(dev, &ctx);

0 commit comments

Comments
 (0)