[Intel-gfx] [PATCH 16/20] drm/i915: Ensure that while(INREG()) are bounded (v2)
Carlos R. Mafra
crmafra2 at gmail.com
Wed Sep 22 10:32:55 CEST 2010
On Di 21.Sep'10 at 8:55:44 -0700, Jesse Barnes wrote:
> On Tue, 21 Sep 2010 15:35:27 +0100
> Chris Wilson <chris at chris-wilson.co.uk> wrote:
>
> > On Tue, 21 Sep 2010 16:22:00 +0200, "Carlos R. Mafra" <crmafra2 at gmail.com> wrote:
> > > [ 0.954724] ACPI: Battery Slot [BAT0] (battery present)
> > > [ 2.266008] [drm:intel_lvds_set_power] *ERROR* timed out waiting to enable LVDS pipeConsole: switching to colour frame buffer device 160x50
> > > [ 2.274860] fb0: inteldrmfb frame buffer device
> > >
> > > But I have this 1+ sec gap in there for as long as I remember.
> > >
> > > Full dmesg is here:
> > > http://www.aei.mpg.de/~crmafra/dmesg-2.6.36-rc5.txt
> > >
> > > Is there anything else I can provide to help this?
> > > I would love to get rid of the 1 sec delay there :-)
> >
> > Sure. Try
> >
> > git://git.kernel.org/pub/scm/linux/kernel/git/ickle/drm-intel.git
> > drm-intel-next
I pulled that branch and tested it. The delay is gone but my external
monitor is not recognized.
[ 0.951319] [drm] Initialized drm 1.1.0 20060810
[ 0.951387] i915 0000:00:02.0: PCI INT A -> GSI 16 (level, low) -> IRQ 16
[ 0.951439] i915 0000:00:02.0: setting latency timer to 64
[ 0.959334] ACPI: Battery Slot [BAT0] (battery present)
[ 1.006415] [drm] initialized overlay support
[ 1.369450] Console: switching to colour frame buffer device 106x30
[ 1.370675] fb0: inteldrmfb frame buffer device
[ 1.370699] drm: registered panic notifier
> Panel power status affects whether other registers (timing, pipe
> control, port) can be written, so not waiting for a power sequence to
> complete can cause problems, so these patches make me a bit nervous.
>
> I wonder why Carlos's power sequence is timing out after a second.
> Maybe we're failing to program a required source bit before starting
> his panel's power on sequence? I ran into this when debugging some eDP
> problems, it turned out we needed some unrelated clocks running just to
> start the panel power sequence. We can either program those clocks
> around the panel power sequence, or possibly write the unlock value
> before trying to turn on the panel.
>
> Carlos, can you try adding
>
> I915_WRITE(ctl_reg, I915_READ(ctl_reg) | PANEL_UNLOCK_REGS);
> POSTING_READ(ctl_reg);
>
> Above the actual write of the POWER_TARGET_ON value? I wonder if it
> will prevent the timeouts you've been seeing.
No, it didn't help. With the diff below on top of 2.6.36-rc5 I get this
[ 0.951730] [drm] Initialized drm 1.1.0 20060810
[ 0.951795] i915 0000:00:02.0: PCI INT A -> GSI 16 (level, low) -> IRQ 16
[ 0.951847] i915 0000:00:02.0: setting latency timer to 64
[ 0.955464] ACPI: Battery Slot [BAT0] (battery present)
[ 1.004349] [drm] set up 7M of stolen space
[ 1.009944] [drm] initialized overlay support
[ 2.765007] [drm:intel_lvds_set_power] *ERROR* timed out waiting to enable LVDS pipeConsole: switching to colour frame buffer device 160x50
[ 2.773828] fb0: inteldrmfb frame buffer device
[ 2.773830] drm: registered panic notifier
Actual diff below, just to check if I got Jesse's suggestion right.
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
index 6ec39a8..56b4c0b 100644
--- a/drivers/gpu/drm/i915/intel_lvds.c
+++ b/drivers/gpu/drm/i915/intel_lvds.c
@@ -111,6 +111,8 @@ static void intel_lvds_set_power(struct drm_device *dev, bool on)
if (on) {
I915_WRITE(lvds_reg, I915_READ(lvds_reg) | LVDS_PORT_EN);
POSTING_READ(lvds_reg);
+ I915_WRITE(ctl_reg, I915_READ(ctl_reg) | PANEL_UNLOCK_REGS);
+ POSTING_READ(ctl_reg);
I915_WRITE(ctl_reg, I915_READ(ctl_reg) |
POWER_TARGET_ON);
More information about the Intel-gfx
mailing list