Re: DRM interaction problems on Ingenic CI20 / jz4780 with dw-hdmi and ingenic-drm

From: Paul Cercueil
Date: Sun May 03 2020 - 21:09:45 EST


Hi Nikolaus,

So I just wrote a HDMI driver for a different chip, I guess I can answer some of your questions now.


Le lun. 13 avril 2020 à 13:25, Paul Cercueil <paul@xxxxxxxxxxxxxxx> a écrit :
Hi Nikolaus,


Le sam. 11 avril 2020 à 16:14, H. Nikolaus Schaller <hns@xxxxxxxxxxxxx> a écrit :
Hi,
we (Paul Boddie and me) are working to get HDMI functional on the
Ingenic CI20 board with jz4780 SoC which uses a specialization of
the dw-hdmi driver.


So far we have identified two issues.

The first is that HPD interrupts are not properly processed.

drm_helper_hpd_irq_event() is called by HPD events but
dev->mode_config.poll_enabled is false.


This is to be used when there's no hardware interrupt. I believe you have one, right? Then call drm_kms_helper_hotplug_event() from the interrupt handler instead.

Therefore the interrupt is ignored and nothing happens.

Now I wonder about the logic behind checking for poll_enabled.
I understand that a driver can do either polling or irq or both.

Therefore handling the irq_event shouldn't be disabled by poll_enabled
being false. Otherwise we can only do: nothing, polling, polling+irq
but not irq alone.

The jz4780 hdmi subsystem (drm/bridge/dw-hdmi.c) uses

connector->polled = DRM_CONNECTOR_POLL_HPD;

but shouldn't this enable polling? Note that there seems to be
no (direct) call to drm_kms_helper_poll_init().

If we set dev->mode_config.poll_enabled = true in
drm_helper_hpd_irq_event() things start to work.

Please can you clarify what would be best practise here to
get HPD event handling working.


Remove that - this stuff is for hardware without interrupts, where everything has to be polled.

The other issue is in dw-hdmi.c:

We found out that ingenic_drm_encoder_atomic_check() fails because

info->num_bus_formats == 0

and not 1. This blocks further initialization.

The reason seems to be that dw_hdmi_bridge_attach() does not call
drm_display_info_set_bus_formats() with a proper format like
other drivers (e.g. drm/bridge/ti-tfp410.c) are doing.

We have patched to set a single bus format MEDIA_BUS_FMT_RGB888_1X24
and then DRM setup seems to work (although we still have no valid
HDMI signal but that is likely something else).

Please can you explain how setting the bus format should be fixed
in dw-hdmi.c.


I'm not sure, but that information may come from EDID data. Are you able to obtain video modes from the connected monitor?

-Paul

If these questions should be forwarded to other specialists, please
do so.

It should be sent to the DRI mailing list, you missed the most important one.

-Paul


BR and thanks,
Nikolaus Schaller