[Intel-gfx] Fwd: [PATCH 2/3] Get the LVDS panel limit and check whether the given modeline is valid
yakui_zhao
yakui.zhao at intel.com
Fri May 22 07:29:42 CEST 2009
On Thu, 2009-05-21 at 15:31 +0800, Alexander E. Patrakov wrote:
> Oops, forgot the list.
>
> ---------- Forwarded message ----------
> From: Alexander E. Patrakov <patrakov at gmail.com>
> Date: 2009/5/21
> Subject: Re: [Intel-gfx] [PATCH 2/3] Get the LVDS panel limit and
> check whether the given modeline is valid
> To: yakui_zhao <yakui.zhao at intel.com>
>
>
> 2009/5/21 yakui_zhao <yakui.zhao at intel.com>:
> >
> > When the connector type is LVDS, it will traverse the mode list returned by KMS kernel to
> > get the LVDS panel limit.
> > Then it will use the panel limit to check whether the given modeline is valid.
> > If the given modeline exceeds the LVDS panel limit, it will be invalid.
> >
> > Signed-off-by: Zhao Yakui <yakui.zhao at intel.com>
>
> Untested, but I don't think this will work right for my laptop
> (Fujitsu Siemens LIFEBOOK S6410). With linux-2.6.30-rc4, KMS and
> xf86-video-intel-2.7.0 and xorg-server-1.6.1, I get (note the
> completely bogus 1360x768 mode for the panel - where did it come
> from?):
>
> aep at aep:~$ xrandr --verbose
> Screen 0: minimum 320 x 200, current 1280 x 1024, maximum 8192 x 8192
> VGA1 connected 1280x1024+0+0 (0x3e) normal (normal left inverted right
> x axis y axis) 376mm x 301mm
> Identifier: 0x3b
> Timestamp: 48521
> Subpixel: unknown
> Clones: DVI1
> CRTC: 0
> CRTCs: 0 1
> Transform: 1.000000 0.000000 0.000000
> 0.000000 1.000000 0.000000
> 0.000000 0.000000 1.000000
> filter:
> EDID_DATA:
> 00ffffffffffff0038a3626601010101
> 071201030e261e78eacb05a3584c9b25
> 135054bfef80714f8140818001010101
> 010101010101302a009851002a403070
> 1300782d1100001e000000fd00384b1f
> 510e000a202020202020000000fc004c
> 4344313937304e580a202020000000ff
> 00383242353234303259420a2020000d
> 1280x1024 (0x3e) 108.0MHz +HSync +VSync *current +preferred
> h: width 1280 start 1328 end 1440 total 1688 skew 0 clock 64.0KHz
> v: height 1024 start 1025 end 1028 total 1066 clock 60.0Hz
> 1280x1024 (0x3f) 135.0MHz +HSync +VSync
> h: width 1280 start 1296 end 1440 total 1688 skew 0 clock 80.0KHz
> v: height 1024 start 1025 end 1028 total 1066 clock 75.0Hz
> 1152x864 (0x40) 108.0MHz +HSync +VSync
> h: width 1152 start 1216 end 1344 total 1600 skew 0 clock 67.5KHz
> v: height 864 start 865 end 868 total 900 clock 75.0Hz
> 1024x768 (0x41) 78.8MHz +HSync +VSync
> h: width 1024 start 1040 end 1136 total 1312 skew 0 clock 60.1KHz
> v: height 768 start 769 end 772 total 800 clock 75.1Hz
> 1024x768 (0x42) 75.0MHz -HSync -VSync
> h: width 1024 start 1048 end 1184 total 1328 skew 0 clock 56.5KHz
> v: height 768 start 771 end 777 total 806 clock 70.1Hz
> 1024x768 (0x43) 65.0MHz -HSync -VSync
> h: width 1024 start 1048 end 1184 total 1344 skew 0 clock 48.4KHz
> v: height 768 start 771 end 777 total 806 clock 60.0Hz
> 832x624 (0x44) 57.3MHz -HSync -VSync
> h: width 832 start 864 end 928 total 1152 skew 0 clock 49.7KHz
> v: height 624 start 625 end 628 total 667 clock 74.6Hz
> 800x600 (0x45) 50.0MHz +HSync +VSync
> h: width 800 start 856 end 976 total 1040 skew 0 clock 48.1KHz
> v: height 600 start 637 end 643 total 666 clock 72.2Hz
> 800x600 (0x46) 49.5MHz +HSync +VSync
> h: width 800 start 816 end 896 total 1056 skew 0 clock 46.9KHz
> v: height 600 start 601 end 604 total 625 clock 75.0Hz
> 800x600 (0x47) 40.0MHz +HSync +VSync
> h: width 800 start 840 end 968 total 1056 skew 0 clock 37.9KHz
> v: height 600 start 601 end 605 total 628 clock 60.3Hz
> 800x600 (0x48) 36.0MHz +HSync +VSync
> h: width 800 start 824 end 896 total 1024 skew 0 clock 35.2KHz
> v: height 600 start 601 end 603 total 625 clock 56.2Hz
> 640x480 (0x49) 31.5MHz -HSync -VSync
> h: width 640 start 664 end 704 total 832 skew 0 clock 37.9KHz
> v: height 480 start 489 end 491 total 520 clock 72.8Hz
> 640x480 (0x4a) 31.5MHz -HSync -VSync
> h: width 640 start 656 end 720 total 840 skew 0 clock 37.5KHz
> v: height 480 start 481 end 484 total 500 clock 75.0Hz
> 640x480 (0x4b) 30.2MHz -HSync -VSync
> h: width 640 start 704 end 768 total 864 skew 0 clock 35.0KHz
> v: height 480 start 483 end 486 total 525 clock 66.7Hz
> 640x480 (0x4c) 25.2MHz -HSync -VSync
> h: width 640 start 656 end 752 total 800 skew 0 clock 31.5KHz
> v: height 480 start 490 end 492 total 525 clock 60.0Hz
> 720x400 (0x4d) 28.3MHz -HSync +VSync
> h: width 720 start 738 end 846 total 900 skew 0 clock 31.5KHz
> v: height 400 start 412 end 414 total 449 clock 70.1Hz
> LVDS1 connected (normal left inverted right x axis y axis)
> Identifier: 0x3c
> Timestamp: 48521
> Subpixel: unknown
> Clones:
> CRTCs: 1
> Transform: 1.000000 0.000000 0.000000
> 0.000000 1.000000 0.000000
> 0.000000 0.000000 1.000000
> filter:
> 1280x800 (0x4e) 83.8MHz +preferred
> h: width 1280 start 1352 end 1480 total 1680 skew 0 clock 49.9KHz
> v: height 800 start 803 end 809 total 831 clock 60.0Hz
> 1360x768 (0x4f) 84.8MHz -HSync +VSync
> h: width 1360 start 1432 end 1568 total 1776 skew 0 clock 47.7KHz
> v: height 768 start 771 end 781 total 798 clock 59.8Hz
> 1024x768 (0x43) 65.0MHz -HSync -VSync
> h: width 1024 start 1048 end 1184 total 1344 skew 0 clock 48.4KHz
> v: height 768 start 771 end 777 total 806 clock 60.0Hz
> 800x600 (0x47) 40.0MHz +HSync +VSync
> h: width 800 start 840 end 968 total 1056 skew 0 clock 37.9KHz
> v: height 600 start 601 end 605 total 628 clock 60.3Hz
> 640x480 (0x50) 25.2MHz -HSync -VSync
> h: width 640 start 656 end 752 total 800 skew 0 clock 31.5KHz
> v: height 480 start 490 end 492 total 525 clock 59.9Hz
HI, Alexander
Thanks for the info.
After checking the log info it seems that there is no EDID for LVDS. In
such case the KMS kernel will return only fixed mode for
LVDS.(1280x800). It will be regarded as the LVDS panel limit.
And the mode of 1360x768 is added by user space.
If this patch is applied, the 1360x768 is beyond the panel limit and
will be removed.
Thanks.
> DVI1 disconnected (normal left inverted right x axis y axis)
> Identifier: 0x3d
> Timestamp: 48521
> Subpixel: unknown
> Clones: VGA1
> CRTCs: 0 1
> Transform: 1.000000 0.000000 0.000000
> 0.000000 1.000000 0.000000
> 0.000000 0.000000 1.000000
> filter:
>
> > ---
> > src/drmmode_display.c | 38 ++++++++++++++++++++++++++++++++++++++
> > 1 file changed, 38 insertions(+)
> >
> > Index: xf86_video_intel/src/drmmode_display.c
> > ===================================================================
> > --- xf86_video_intel.orig/src/drmmode_display.c 2009-05-21 11:39:38.000000000 +0800
> > +++ xf86_video_intel/src/drmmode_display.c 2009-05-21 11:39:45.000000000 +0800
> > @@ -471,6 +471,21 @@
> > static Bool
> > drmmode_output_mode_valid(xf86OutputPtr output, DisplayModePtr pModes)
> > {
> > + drmmode_output_private_ptr drmmode_output = output->driver_private;
> > + drmModeConnectorPtr koutput = drmmode_output->mode_output;
> > + struct fixed_panel_lvds *p_lvds = drmmode_output->private_data;
> > +
> > + /*
> > + * If the connector type is LVDS, we will use the panel limit to
> > + * verfiy whether the mode is valid.
> > + */
> > + if ((koutput->connector_type == DRM_MODE_CONNECTOR_LVDS) && p_lvds) {
> > + if (pModes->HDisplay > p_lvds->hdisplay ||
> > + pModes->VDisplay > p_lvds->vdisplay)
> > + return MODE_PANEL;
> > + else
> > + return MODE_OK;
> > + }
> > return MODE_OK;
> > }
> >
> > @@ -483,6 +498,8 @@
> > int i;
> > DisplayModePtr Modes = NULL, Mode;
> > drmModePropertyPtr props;
> > + struct fixed_panel_lvds *p_lvds;
> > + drmModeModeInfo *mode_ptr;
> >
> > /* look for an EDID property */
> > for (i = 0; i < koutput->count_props; i++) {
> > @@ -518,6 +535,27 @@
> > Modes = xf86ModesAdd(Modes, Mode);
> >
> > }
> > + p_lvds = drmmode_output->private_data;
> > + /*
> > + * If the connector type is LVDS, we will traverse the kernel mode to
> > + * get the panel limit.
> > + * If it is incorrect, please fix me.
> > + */
> > + if ((koutput->connector_type == DRM_MODE_CONNECTOR_LVDS) && p_lvds) {
> > + p_lvds->hdisplay = 0;
> > + p_lvds->vdisplay = 0;
> > + for (i = 0; i < koutput->count_modes; i++) {
> > + mode_ptr = &koutput->modes[i];
> > + if ((mode_ptr->hdisplay >= p_lvds->hdisplay) &&
> > + (mode_ptr->vdisplay >= p_lvds->vdisplay)) {
> > + p_lvds->hdisplay = mode_ptr->hdisplay;
> > + p_lvds->vdisplay = mode_ptr->vdisplay;
>
> So here, if I read the code correctly, it (depending on the mode
> order) may think that my panel is either 1280x800 (right) or 1360x768.
>
> > + }
> > + }
> > + if (!p_lvds->hdisplay || !p_lvds->vdisplay)
> > + xf86DrvMsg(output->scrn->scrnIndex, X_ERROR,
> > + "Incorrect KMS mode.\n");
> > + }
> > return Modes;
> > }
>
>
More information about the Intel-gfx
mailing list