[linux-sunxi] Re: HDMI/DVI spurious failure
Priit Laes
plaes at plaes.org
Mon Jan 21 15:07:28 UTC 2019
On Mon, Jan 21, 2019 at 02:25:17PM +0100, Maxime Ripard wrote:
> On Fri, Jan 18, 2019 at 02:51:26PM +0000, Priit Laes wrote:
> > On Fri, Jan 18, 2019 at 03:04:18PM +0100, Maxime Ripard wrote:
> > > On Fri, Jan 18, 2019 at 10:10:53AM +0000, Priit Laes wrote:
> > > > > > > > > It doesn't look related to the clock rate itself, since it doesn't
> > > > > > > > > change between the two cases. However, in one case the DDC clock is
> > > > > > > > > enabled and in the other it's disabled.
> > > > > > > > >
> > > > > > > > > Was it taken at the same time? Maybe you can try with that patch?
> > > > > > > > > http://code.bulix.org/z7jmkm-555344?raw
> > > > > > > >
> > > > > > > > Thanks, after doing ~50+ boots I haven't seen a single failure.
> > > > > > > >
> > > > > > > > Previously I had following failure cases which are now both fixed:
> > > > > > > >
> > > > > > > > a) Linux without u-boot HDMI, where one in every 6-7 boots failed.
> > > > > > > > b) u--boot with hdmi enabled switching to simplefb and then switching
> > > > > > > > to kms, where previously all boots ended up with garbled screen.
> > > > > > >
> > > > > > > So it's not really a fix, but it really looks like the clock is not
> > > > > > > enabled when it should.
> > > > > > >
> > > > > > > Can you describe your test scenario a bit more? What are you doing
> > > > > > > exactly, just booting? When do you start using the display? When did
> > > > > > > you capture the debugfs output that you pasted?
> > > > > >
> > > > > > Display is already connected via HDMI to the board. I don't really
> > > > > > remove it, I just boot the device and let it start Xorg.
> > > > > > Meanwhile I just ssh into the device and capture debugfs output.
> > > > > > See my 3 testing scenarios below.
> > > > > >
> > > > > > Kernel also includes one extra patch to fall back to DDC, in case HPD
> > > > > > fails. Mostly the same I already submitted last November [1].
> > > > >
> > > > > Do you have the same issue without that patch?
> > > >
> > > > Can't really test this display without this patch and I do not have other
> > > > HDMI/DVI screens. And this issue does not happen with other HDMI displays
> > > > that I have here.
> > >
> > > Can't you just force the monitor to be reported as present? It's not
> > > great and we don't want to merge it, but that would allow you to test
> > > that setup without too many interferences.
> >
> > Baseline is clean u-boot / linux. U-boot does not detect/enable display.
> >
> > 1) Booting Linux with drm.debug=0xe
> >
> > * Linux does not detect/enable display
> >
> > 2) Booting with drm.debug=0xe video=HDMI-A-1:640x480 at 60e
> >
> > * Linux detects display, but display is garbled, and proper edid data is detected:
> >
> > [snip]
> > pll-video1 0 0 0 327000000 0 0 50000
> > pll-video1-2x 0 0 0 654000000 0 0 50000
> > hdmi-tmds 0 0 0 25153846 0 0 50000
> > hdmi-ddc 0 0 0 89835 0 0 50000
> > [/snip]
> >
> > 3) Booting with drm.debug=0xe video=HDMI-A-1:640x480 at 60e
> > And also one extra patch for Linux where HDMI DDC clock marked as critical
> >
> > Linux detects and initializes display properly:
> > [snip]
> > pll-video1 1 1 0 327000000 0 0 50000
> > pll-video1-2x 1 1 0 654000000 0 0 50000
> > hdmi-tmds 1 1 0 25153846 0 0 50000
> > hdmi-ddc 1 1 0 89835 0 0 50000
> > [/snip]
>
> I guess you'll need to track down when the hdmi-tmds and hdmi-ddc are
> enabled and disabled, and if it makes sense :/
OK, figured out the cause.
Apparently, for each ddc poll we enable ddc clock which is a child of TMDS
clock. After transfer is done, we disable the clock and this also tears down
the parent because its only user has gone missing.. :(
So basically, patch below also works, but I guess we should override
the sun4i_tmds_ops.disable to properly account for tmds clock use.
---
@@ -225,7 +235,7 @@ int sun4i_tmds_create(struct sun4i_hdmi *hdmi)
init.ops = &sun4i_tmds_ops;
init.parent_names = parents;
init.num_parents = 2;
- init.flags = CLK_SET_RATE_PARENT;
+ init.flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL;
tmds->hdmi = hdmi;
tmds->hw.init = &init;
> Maxime
>
> --
> Maxime Ripard, Bootlin
> Embedded Linux and Kernel engineering
> https://bootlin.com
More information about the dri-devel
mailing list