Fabio, Igor, thanks for the suggestions. I have carefully rebuilt the DTS from scratch based on the imx6qdl-sabresd files and I'm pretty sure that it is not the problem. The kernel boots like before and most features of the board work fine, like Ethernet, SATA, USB. I can see in dmesg that the HDMI TX gets configured and the IPUs are found and get configured. The Problem lies somewhere deeper. I suspect it has to do with IRQs but I don't know exactly what to look for. Rarely, the HDMI display gets a hint of a signal and then immediately turns off again without any graphics visible.
When DRM tries to set up IPU&HDMI, I get this in the log every 10 seconds:
[ 127.831760] [drm:drm_atomic_helper_commit_cleanup_done] *ERROR* [CRTC:27:crtc-0] flip_done timed out
[ 138.711740] [drm:drm_atomic_helper_commit_cleanup_done] *ERROR* [CRTC:27:crtc-0] flip_done timed out
[ 148.951738] [drm:drm_atomic_helper_commit_cleanup_done] *ERROR* [CRTC:27:crtc-0] flip_done timed out
This comes from gpu/drm/drm_atomic_helper.c:
/* We must wait for the vblank event to signal our completion
* before releasing our reference, since the vblank work does
* not hold a reference of its own. */
ret = wait_for_completion_interruptible_timeout(&stall_commit->flip_done, 10*HZ);
So the kernel/DRM is waiting for vblank events that never arrive.
In gpu/drm/imx/ipuv3-crtc.c there is a function ipu_irq_handler(int irq, void *dev_id). Putting a printk statement there reveals that this is never called. This IRQ is setup during ipu_crtc_init:
ipu_crtc->irq = ipu_plane_irq(ipu_crtc->plane[0]);
Which is internally:
return ipu_idmac_channel_irq(ipu_plane->ipu, ipu_plane->ipu_ch, IPU_IRQ_EOF);
This comes from gpu/ipu-v3/ipu-common.c:
return ipu_map_irq(ipu, irq_type + channel->num);
Which then calls irq_linear_revmap(ipu->domain, irq) or irq_create_mapping(ipu->domain, irq).
Do you have any idea what could cause this IRQ (IPU_IRQ_EOF) to not fire?
Best Regards and thanks,
Lukas