[Intel-gfx] [PATCH 1/2]i830_sdvo.c:initialize sdvo lvds output
Ma Ling
ling.ma at intel.com
Fri Mar 13 07:14:52 CET 2009
On Tue, 2009-03-10 at 11:21 +0800, Wang, Zhenyu Z wrote:
> On 2009.02.23 13:20:38 +0800, Ma Ling wrote:
> > set sdvo lvds output and fetch fixed mode for output.
> >
> > ---
> > src/i830_sdvo.c | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++---
> > 1 files changed, 88 insertions(+), 6 deletions(-)
> >
> > diff --git a/src/i830_sdvo.c b/src/i830_sdvo.c
> > index 0750166..ff5d570 100644
> > --- a/src/i830_sdvo.c
> > +++ b/src/i830_sdvo.c
> > @@ -82,6 +82,10 @@ struct i830_sdvo_priv {
> > * This is set if we treat the device as HDMI, instead of DVI.
> > */
> > Bool is_hdmi;
> > + /**
> > + * This is set if we detect output of sdvo device as LVDS.
> > + */
> > + Bool is_lvds;
> >
> > /**
> > * Returned SDTV resolutions allowed for the current format, if the
> > @@ -1749,6 +1753,75 @@ i830_sdvo_get_digital_encoding_mode(xf86OutputPtr output)
> > return TRUE;
> > }
> >
> > +/* This function will try to fetch lvds fixed mode from sdvo device*/
> > +static Bool i830_sdvo_fetch_fixed_mode(xf86OutputPtr output)
> > +{
> > + I830OutputPrivatePtr intel_output = output->driver_private;
> > + I830Ptr pI830 = I830PTR(output->scrn);
> > + DisplayModePtr modes, scan;
> > + xf86CrtcPtr crtc;
> > + uint32_t sdvox;
> > + uint32_t pipe;
> > + int output_device;
> > + Bool ret = TRUE;
>
> indent
fix
>
> > +
> > + output_device = ((struct i830_sdvo_priv *)
> > + (intel_output->dev_priv))->output_device;
> > +
> > + /* Attempt to get the fixed panel mode from DDC.
> > + * Assume that the preferred,mode is the right one.
> > + * Mode list is arranged in priority order,
> > + * so first ones are preferred.
> > + */
> > + modes = i830_ddc_get_modes(output);
> > + for (scan = modes; scan != NULL; scan = scan->next) {
> > + if (scan->type & M_T_PREFERRED) {
> > + /* Pull our chosen mode out
> > + * and make it the fixed mode.
> > + */
> > + if (modes == scan)
> > + modes = modes->next;
> > + if (scan->prev != NULL)
> > + scan->prev = scan->next;
> > + if (scan->next != NULL)
> > + scan->next = scan->prev;
> > +
> > + pI830->lvds_fixed_mode = scan;
> > + goto end;
> > + }
> > + }
> > +
> > + /* Get the LVDS fixed mode out of the BIOS. We should support LVDS with
> > + * the BIOS being unavailable or broken, but lack the configuration options
> > + * for now.
> > + */
> > + if (pI830->lvds_fixed_mode)
> > + goto end;
>
> Are you sure we can use that BIOS mode? Is that for integrated LVDS only or not?
my current device don't find bios mode, so I remove it from code.
>
> > +
> > + /* If we *still* don't have a mode, try checking if the panel is already
> > + * turned on. If so, assume that whatever is currently programmed is the
> > + * correct mode.
> > + */
> > + sdvox = INREG(output_device);
> > + pipe = (sdvox & SDVO_PIPE_B_SELECT) ? 1 : 0;
> > + crtc = XF86_CRTC_CONFIG_PTR(output->scrn)->crtc[pipe];
> > +
> > + if ((sdvox & SDVO_ENABLE) &&
> > + (pI830->lvds_fixed_mode = i830_crtc_mode_get(output->scrn, crtc))) {
> > + pI830->lvds_fixed_mode->type |= M_T_PREFERRED;
> > + goto end;
> > + }
>
> indent
fix
>
> > +
> > + /* failed to find fixed mode*/
> > + ret = FALSE;
> > +end:
> > + /* Delete the mode list we allocated */
> > + while (modes != NULL)
> > + xf86DeleteMode(&modes, modes);
> > +
> > + return ret;
> > +}
> > +
> > Bool
> > i830_sdvo_init(ScrnInfoPtr pScrn, int output_device)
> > {
> > @@ -1904,14 +1977,17 @@ i830_sdvo_init(ScrnInfoPtr pScrn, int output_device)
> > dev_priv->controlled_output = SDVO_OUTPUT_RGB1;
> > output->subpixel_order = SubPixelHorizontalRGB;
> > name_prefix="VGA";
> > - } else if (dev_priv->caps.output_flags & SDVO_OUTPUT_LVDS0) {
> > - dev_priv->controlled_output = SDVO_OUTPUT_LVDS0;
> > - output->subpixel_order = SubPixelHorizontalRGB;
> > - name_prefix="LVDS";
> > - } else if (dev_priv->caps.output_flags & SDVO_OUTPUT_LVDS1) {
> > - dev_priv->controlled_output = SDVO_OUTPUT_LVDS1;
> > + }
> > + else if (dev_priv->caps.output_flags &
> > + (SDVO_OUTPUT_LVDS0 | SDVO_OUTPUT_LVDS1)) {
> > +
> > + if (dev_priv->caps.output_flags & SDVO_OUTPUT_LVDS0)
> > + dev_priv->controlled_output = SDVO_OUTPUT_LVDS0;
> > + else
> > + dev_priv->controlled_output = SDVO_OUTPUT_LVDS1;
> > output->subpixel_order = SubPixelHorizontalRGB;
> > name_prefix="LVDS";
> > + dev_priv->is_lvds = TRUE;
> > }
>
> adding both for is_lvds will make patch more easy to look.
>
> > else
> > {
> > @@ -1935,6 +2011,12 @@ i830_sdvo_init(ScrnInfoPtr pScrn, int output_device)
> > }
> >
> > i830_sdvo_select_ddc_bus(dev_priv);
> > + /* failed to fetch lvds fixed modes for sdvo device */
> > + if (dev_priv->is_lvds == TRUE && i830_sdvo_fetch_fixed_mode(output) == FALSE) {
> > + xf86OutputDestroy (output);
> > + return FALSE;
> > + }
> > ++
>
> this should be in get_modes, and for possbile multifunction encoder this should
> be updated for current output. These patches should rebase to current master too.
re-based on master tree. but we should detect fixed mode as soon as
integrated lvds.
>
More information about the Intel-gfx
mailing list