Re: [REGRESSION] i915: No HDMI output with 4.4

From: Ville Syrjälä
Date: Fri Feb 12 2016 - 18:23:38 EST


On Fri, Feb 12, 2016 at 09:52:03AM +0200, Oleksandr Natalenko wrote:
> Ville,
>
> I've applied patch you've provided and did couple of replugging with
> intel_reg in between. Here are the results.
>
> I used additional VGA cable to see what actually I type in console :).
>

My life would have been a bit easier if you had included
the reg dumps in the mail. Copy paste manually this time.

> Both HDMI and VGA cables plugged: [1]
(0x000c4000): 0x00080000
(0x000c4004): 0xf1b5ffff
(0x000c4008): 0x00000000
(0x000c400c): 0xffffffff
(0x000c4030): 0x00101010
> Both HDMI and VGA cables unplugged: [2]
(0x000c4000): 0x00000000
(0x000c4004): 0xf1b5ffff
(0x000c4008): 0x00000000
(0x000c400c): 0xffffffff
(0x000c4030): 0x00101010
> Only HDMI cable plugged: [3]
(0x000c4000): 0x00000000
(0x000c4004): 0xf1b5ffff
(0x000c4008): 0x00000000
(0x000c400c): 0xffffffff
(0x000c4030): 0x00101010
> Only VGA cable plugged: [4]
(0x000c4000): 0x00080000
(0x000c4004): 0xf1b4ffff
(0x000c4008): 0x00000000
(0x000c400c): 0xffffffff
(0x000c4030): 0x00101010

What these show is that the live status for the digital ports never
goes to 1, which is rather wtf. VGA gets reported correctly. Everything
else looks normal to me.

> And here goes dmesg with all the stuff logged: [5]

ÐÑÑ 12 09:37:01 pfactum.lanet kernel: port C live status
__________________________________________________
__________________________________________________
__________________________________________________
__________________________________________________
__________________________________________________

Same deal here. The live status never indicates anything being
present during the 250ms that we poll it.

Few other ideas:
- Was the monitor sleeping when you tried this? Can you maybe push
some button on it and then immediately run the intel_reg read command
again?
- Do you have another monitor to try?
- Do you have another cable to try?
- Maybe the pullup/down on the hpd line is misconfigured or something.
Any chance of updating the BIOS on the machine?
- What does 'intel_reg read 0xc2000 0xc2004 0xc2020' say?
- The spec claims the TMDS vs. SDVO select has something to do with
hpd generation. I can't see any difference on my IVB though, so not
sure it's really true.

What does 'intel_reg read 0xe1140 0xe1150 0xe1160' tell us?

Let's try these anyway (with the cable plugged in):

intel_reg write 0xe1140 0x0
intel_reg write 0xe1150 0x0
intel_reg write 0xe1160 0x0
sleep 1
intel_reg read 0xc4000

intel_reg write 0xe1140 0x800
intel_reg write 0xe1150 0x800
intel_reg write 0xe1160 0x800
sleep 1
intel_reg read 0xc4000

intel_reg write 0xe1140 0x800800
intel_reg write 0xe1150 0x800800
intel_reg write 0xe1160 0x800800
sleep 1
intel_reg read 0xc4000

intel_reg write 0xe1140 0x800000
intel_reg write 0xe1150 0x800000
intel_reg write 0xe1160 0x800000
sleep 1
intel_reg read 0xc4000

>
> Hope this helps.
>
> [1] https://gist.github.com/58a0eb50dcf84e104555
> [2] https://gist.github.com/7e8749a3e2cc58ea8aac
> [3] https://gist.github.com/9d76930da7380634b845
> [4] https://gist.github.com/c0d2e2f64242ad4f01f2
> [5] https://gist.github.com/fda3b9fed3ca4d31cd20
>
> 11.02.2016 16:01, Ville SyrjÃlà wrote:
> > OK, so the hpd interrupt does happen, and yet the live status
> > supposedly
> > claims that nothing is there. Port C live status definitely works here
> > on my IVB, so not sure what the deal is.
> >
> > Can you grab intel-gpu-tools and run
> > intel_reg read 0xc4000 0xc4004 0xc4008 0xc400c 0xc4030
> > a couple of times after plugging the monitor in, and also run it when
> > nothing is plugged in.
> >
> > Also you could try something like the following patch so we might
> > observe the live status with a bit more detail. Though the fact that it
> > doesn't seem to work for you even when the monitor was already plugged
> > in is somewhat troubling:
> >
> > --- a/drivers/gpu/drm/i915/intel_hdmi.c
> > +++ b/drivers/gpu/drm/i915/intel_hdmi.c
> > @@ -1392,12 +1392,17 @@ intel_hdmi_detect(struct drm_connector
> > *connector, bool force)
> >
> > intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS);
> >
> > - for (try = 0; !live_status && try < 9; try++) {
> > - if (try)
> > - msleep(10);
> > - live_status = intel_digital_port_connected(dev_priv,
> > + printk("port %c live status\n ",
> > port_name(hdmi_to_dig_port(intel_hdmi)->port));
> > + for (try = 0; try < 250; try++) {
> > + bool status = intel_digital_port_connected(dev_priv,
> > hdmi_to_dig_port(intel_hdmi));
> > + live_status |= status;
> > + printk("%c", status ? '#' : '_');
> > + if (try % 50 == 49)
> > + printk("\n ");
> > + usleep_range(1000, 1000);
> > }
> > + printk("\n");
> >
> > if (!live_status)
> > DRM_DEBUG_KMS("Live status not up!");
> > --
> > 2.4.10
> >
> > Oh, and if you have another cable you can try, might be a good idea to
> > see if it behaves any better.
> >

--
Ville SyrjÃlÃ
Intel OTC