diff options
-rw-r--r-- | src/i830.h | 30 | ||||
-rw-r--r-- | src/i830_crt.c | 15 | ||||
-rw-r--r-- | src/i830_display.c | 57 | ||||
-rw-r--r-- | src/i830_driver.c | 146 | ||||
-rw-r--r-- | src/i830_randr.c | 72 | ||||
-rw-r--r-- | src/i830_video.c | 9 |
6 files changed, 107 insertions, 222 deletions
@@ -86,26 +86,6 @@ typedef struct _I830OutputRec I830OutputRec, *I830OutputPtr; * Paulo César Pereira de Andrade <pcpa@conectiva.com.br>. */ -#define PIPE_CRT_ID 0 -#define PIPE_TV_ID 1 -#define PIPE_DFP_ID 2 -#define PIPE_LFP_ID 3 -#define PIPE_CRT2_ID 4 -#define PIPE_TV2_ID 5 -#define PIPE_DFP2_ID 6 -#define PIPE_LFP2_ID 7 -#define PIPE_NUM_ID 8 - -#define PIPE_NONE 0<<0 -#define PIPE_CRT 1<<0 -#define PIPE_TV 1<<1 -#define PIPE_DFP 1<<2 -#define PIPE_LFP 1<<3 -#define PIPE_CRT2 1<<4 -#define PIPE_TV2 1<<5 -#define PIPE_DFP2 1<<6 -#define PIPE_LFP2 1<<7 - typedef struct _I830Rec *I830Ptr; typedef void (*I830WriteIndexedByteFunc)(I830Ptr pI830, IOADDRESS addr, @@ -314,7 +294,9 @@ typedef struct _I830Rec { int CloneVDisplay; I830EntPtr entityPrivate; +#if 0 int pipe, origPipe; +#endif int init; unsigned int bufferOffset; /* for I830SelectBuffer */ @@ -391,9 +373,6 @@ typedef struct _I830Rec { Bool CursorIsARGB; CursorPtr pCurs; - int MonType1; - int MonType2; - DGAModePtr DGAModes; int numDGAModes; Bool DGAactive; @@ -466,7 +445,6 @@ typedef struct _I830Rec { CARD32 saveSWF4; Bool checkDevices; - int operatingDevices; /* [0] is Pipe A, [1] is Pipe B. */ int availablePipes; @@ -660,6 +638,10 @@ extern Bool I830FixOffset(ScrnInfoPtr pScrn, I830MemRange *mem); extern Bool I830I2CInit(ScrnInfoPtr pScrn, I2CBusPtr *bus_ptr, int i2c_reg, char *name); +/* i830_display.c */ +Bool +i830PipeHasType (ScrnInfoPtr pScrn, int pipe, int type); + /* i830_crt.c */ void i830_crt_init(ScrnInfoPtr pScrn); diff --git a/src/i830_crt.c b/src/i830_crt.c index 0225727b..4c6c3ca5 100644 --- a/src/i830_crt.c +++ b/src/i830_crt.c @@ -169,12 +169,19 @@ static Bool i830_crt_detect_load(ScrnInfoPtr pScrn) { I830Ptr pI830 = I830PTR(pScrn); - CARD32 adpa, pipeconf; + CARD32 adpa, pipeconf, bclrpat; CARD8 st00; int pipeconf_reg, bclrpat_reg, dpll_reg; int pipe; - pipe = pI830->pipe; + for (pipe = 0; pipe < pI830->availablePipes; pipe++) + if (!pI830->pipes[pipe].planeEnabled) + break; + + /* No available pipes for load detection */ + if (pipe == pI830->availablePipes) + return FALSE; + if (pipe == 0) { bclrpat_reg = BCLRPAT_A; pipeconf_reg = PIPEACONF; @@ -197,9 +204,10 @@ i830_crt_detect_load(ScrnInfoPtr pScrn) ((pipe == 1) ? ADPA_PIPE_B_SELECT : 0)); } - /* Set the border color to red, green. Maybe we should save/restore this + /* Set the border color to purple. Maybe we should save/restore this * reg. */ + bclrpat = INREG(bclrpat_reg); OUTREG(bclrpat_reg, 0x00500050); /* Force the border color through the active region */ @@ -210,6 +218,7 @@ i830_crt_detect_load(ScrnInfoPtr pScrn) st00 = pI830->readStandard(pI830, 0x3c2); /* Restore previous settings */ + OUTREG(bclrpat_reg, bclrpat); OUTREG(pipeconf_reg, pipeconf); OUTREG(ADPA, adpa); diff --git a/src/i830_display.c b/src/i830_display.c index 8cb66603..c9b6b4dd 100644 --- a/src/i830_display.c +++ b/src/i830_display.c @@ -61,6 +61,24 @@ i830PrintPll(char *prefix, int refclk, int m1, int m2, int n, int p1, int p2) } /** + * Returns whether any output on the specified pipe is an LVDS output + */ +Bool +i830PipeHasType (ScrnInfoPtr pScrn, int pipe, int type) +{ + I830Ptr pI830 = I830PTR(pScrn); + int i; + + for (i = 0; i < pI830->num_outputs; i++) + if (!pI830->output[i].disabled && pI830->output[i].pipe == pipe) + { + if (pI830->output[i].type == type) + return TRUE; + } + return FALSE; +} + +/** * Returns whether the given set of divisors are valid for a given refclk with * the given outputs. * @@ -68,7 +86,7 @@ i830PrintPll(char *prefix, int refclk, int m1, int m2, int n, int p1, int p2) * clk = refclk * (5 * m1 + m2) / n / (p1 * p2) */ static Bool -i830PllIsValid(ScrnInfoPtr pScrn, int outputs, int refclk, int m1, int m2, +i830PllIsValid(ScrnInfoPtr pScrn, int pipe, int refclk, int m1, int m2, int n, int p1, int p2) { I830Ptr pI830 = I830PTR(pScrn); @@ -87,7 +105,7 @@ i830PllIsValid(ScrnInfoPtr pScrn, int outputs, int refclk, int m1, int m2, max_n = 8; min_p1 = 1; max_p1 = 8; - if (outputs & PIPE_LCD_ACTIVE) { + if (i830PipeHasType (pScrn, pipe, I830_OUTPUT_LVDS)) { min_p = 7; max_p = 98; } else { @@ -153,7 +171,7 @@ i830PllIsValid(ScrnInfoPtr pScrn, int outputs, int refclk, int m1, int m2, * clk = refclk * (5 * m1 + m2) / n / (p1 * p2) */ static Bool -i830FindBestPLL(ScrnInfoPtr pScrn, int outputs, int target, int refclk, +i830FindBestPLL(ScrnInfoPtr pScrn, int pipe, int target, int refclk, int *outm1, int *outm2, int *outn, int *outp1, int *outp2) { I830Ptr pI830 = I830PTR(pScrn); @@ -170,7 +188,7 @@ i830FindBestPLL(ScrnInfoPtr pScrn, int outputs, int target, int refclk, max_n = 8; min_p1 = 1; max_p1 = 8; - if (outputs & PIPE_LCD_ACTIVE) { + if (i830PipeHasType (pScrn, pipe, I830_OUTPUT_LVDS)) { if (target < 200000) /* XXX: Is this the right cutoff? */ p2 = 14; else @@ -203,7 +221,7 @@ i830FindBestPLL(ScrnInfoPtr pScrn, int outputs, int target, int refclk, for (p1 = min_p1; p1 <= max_p1; p1++) { int clock, this_err; - if (!i830PllIsValid(pScrn, outputs, refclk, m1, m2, n, + if (!i830PllIsValid(pScrn, pipe, refclk, m1, m2, n, p1, p2)) { continue; } @@ -372,7 +390,7 @@ i830PipeSetMode(ScrnInfoPtr pScrn, DisplayModePtr pMode, int pipe) Bool ok, is_sdvo = FALSE, is_dvo = FALSE; Bool is_crt = FALSE, is_lvds = FALSE, is_tv = FALSE; int refclk, pixel_clock; - int outputs, i; + int i; int dspcntr_reg = (pipe == 0) ? DSPACNTR : DSPBCNTR; int pipeconf_reg = (pipe == 0) ? PIPEACONF : PIPEBCONF; int fp_reg = (pipe == 0) ? FPA0 : FPB0; @@ -388,11 +406,6 @@ i830PipeSetMode(ScrnInfoPtr pScrn, DisplayModePtr pMode, int pipe) int dsppos_reg = (pipe == 0) ? DSPAPOS : DSPBPOS; int pipesrc_reg = (pipe == 0) ? PIPEASRC : PIPEBSRC; - if (pipe == 0) - outputs = pI830->operatingDevices & 0xff; - else - outputs = (pI830->operatingDevices >> 8) & 0xff; - if (I830ModesEqual(&pI830Pipe->curMode, pMode)) return TRUE; @@ -497,7 +510,7 @@ i830PipeSetMode(ScrnInfoPtr pScrn, DisplayModePtr pMode, int pipe) } else { refclk = 48000; } - ok = i830FindBestPLL(pScrn, outputs, pixel_clock, refclk, &m1, &m2, &n, + ok = i830FindBestPLL(pScrn, pipe, pixel_clock, refclk, &m1, &m2, &n, &p1, &p2); if (!ok) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, @@ -701,6 +714,22 @@ i830DisableUnusedFunctions(ScrnInfoPtr pScrn) } /** + * Return whether any outputs are connected to the specified pipe + */ + +static Bool +i830PipeInUse (ScrnInfoPtr pScrn, int pipe) +{ + I830Ptr pI830 = I830PTR(pScrn); + int i; + + for (i = 0; i < pI830->num_outputs; i++) + if (!pI830->output[i].disabled && pI830->output[i].pipe == pipe) + return TRUE; + return FALSE; +} + +/** * This function configures the screens in clone mode on * all active outputs using a mode similar to the specified mode. */ @@ -720,8 +749,8 @@ i830SetMode(ScrnInfoPtr pScrn, DisplayModePtr pMode) didLock = I830DRILock(pScrn); #endif - pI830->pipes[0].planeEnabled = (pI830->operatingDevices & 0xff) != 0; - pI830->pipes[1].planeEnabled = (pI830->operatingDevices & 0xff00) != 0; + for (i = 0; i < pI830->availablePipes; i++) + pI830->pipes[i].planeEnabled = i830PipeInUse (pScrn, i); for (i = 0; i < pI830->num_outputs; i++) pI830->output[i].pre_set_mode(pScrn, &pI830->output[i], pMode); diff --git a/src/i830_driver.c b/src/i830_driver.c index 1b75649d..92c27af8 100644 --- a/src/i830_driver.c +++ b/src/i830_driver.c @@ -382,88 +382,6 @@ I830ProbeDDC(ScrnInfoPtr pScrn, int index) ConfiguredMonitor = vbeDoEDID(pVbe, NULL); } -/* - * Returns a string matching the device corresponding to the first bit set - * in "device". savedDevice is then set to device with that bit cleared. - * Subsequent calls with device == -1 will use savedDevice. - */ - -static const char *displayDevices[] = { - "CRT", - "TV", - "DFP (digital flat panel)", - "LFP (local flat panel)", - "CRT2 (second CRT)", - "TV2 (second TV)", - "DFP2 (second digital flat panel)", - "LFP2 (second local flat panel)", - NULL -}; - -static const char * -DeviceToString(int device) -{ - static int savedDevice = -1; - int bit = 0; - const char *name; - - if (device == -1) { - device = savedDevice; - bit = 0; - } - - if (device == -1) - return NULL; - - while (displayDevices[bit]) { - if (device & (1 << bit)) { - name = displayDevices[bit]; - savedDevice = device & ~(1 << bit); - bit++; - return name; - } - bit++; - } - return NULL; -} - -static void -PrintDisplayDeviceInfo(ScrnInfoPtr pScrn) -{ - I830Ptr pI830 = I830PTR(pScrn); - int pipe, n; - int displays; - - DPRINTF(PFX, "PrintDisplayDeviceInfo\n"); - - displays = pI830->operatingDevices; - if (displays == -1) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "No active display devices.\n"); - return; - } - - /* Check for active devices connected to each display pipe. */ - for (n = 0; n < pI830->availablePipes; n++) { - pipe = ((displays >> PIPE_SHIFT(n)) & PIPE_ACTIVE_MASK); - if (pipe) { - const char *name; - - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Currently active displays on Pipe %c:\n", PIPE_NAME(n)); - name = DeviceToString(pipe); - do { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "\t%s\n", name); - name = DeviceToString(-1); - } while (name); - - } else { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "No active displays on Pipe %c.\n", PIPE_NAME(n)); - } - } -} - static int I830DetectMemory(ScrnInfoPtr pScrn) { @@ -1242,9 +1160,10 @@ I830PreInit(ScrnInfoPtr pScrn, int flags) I830PreInitDDC(pScrn); - pI830->MonType1 = PIPE_NONE; - pI830->MonType2 = PIPE_NONE; - +#if 0 + /* + * This moves to generic RandR-based configuration code + */ if ((s = xf86GetOptValString(pI830->Options, OPTION_MONITOR_LAYOUT)) && I830IsPrimary(pScrn)) { char *Mon1; @@ -1329,7 +1248,6 @@ I830PreInit(ScrnInfoPtr pScrn, int flags) else pI830->pipe = 1; - pI830->operatingDevices = (pI830->MonType2 << 8) | pI830->MonType1; } else if (I830IsPrimary(pScrn)) { /* Choose a default set of outputs to use based on what we've detected. * @@ -1375,7 +1293,6 @@ I830PreInit(ScrnInfoPtr pScrn, int flags) pI830->pipe = 0; else pI830->pipe = 1; - pI830->operatingDevices = (pI830->MonType2 << 8) | pI830->MonType1; if (pI830->MonType1 != 0 && pI830->MonType2 != 0) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, @@ -1384,11 +1301,11 @@ I830PreInit(ScrnInfoPtr pScrn, int flags) } } else { I830Ptr pI8301 = I830PTR(pI830->entityPrivate->pScrn_1); - pI830->operatingDevices = pI8301->operatingDevices; pI830->pipe = !pI8301->pipe; pI830->MonType1 = pI8301->MonType1; pI830->MonType2 = pI8301->MonType2; } +#endif if (xf86ReturnOptValBool(pI830->Options, OPTION_CLONE, FALSE)) { if (pI830->availablePipes == 1) { @@ -1408,38 +1325,23 @@ I830PreInit(ScrnInfoPtr pScrn, int flags) } - /* Perform the pipe assignment of outputs. This code shouldn't exist, - * but for now we're supporting the existing MonitorLayout configuration - * scheme. + /* Perform the pipe assignment of outputs. This is a kludge until + * we have better configuration support in the generic RandR code */ for (i = 0; i < pI830->num_outputs; i++) { pI830->output[i].disabled = FALSE; switch (pI830->output[i].type) { case I830_OUTPUT_LVDS: - if (pI830->MonType1 & PIPE_LFP) - pI830->output[i].pipe = 0; - else if (pI830->MonType2 & PIPE_LFP) - pI830->output[i].pipe = 1; - else - pI830->output[i].disabled = TRUE; + /* LVDS must live on pipe B for two-pipe devices */ + pI830->output[i].pipe = pI830->availablePipes - 1; break; case I830_OUTPUT_ANALOG: - if (pI830->MonType1 & PIPE_CRT) - pI830->output[i].pipe = 0; - else if (pI830->MonType2 & PIPE_CRT) - pI830->output[i].pipe = 1; - else - pI830->output[i].disabled = TRUE; + pI830->output[i].pipe = 0; break; case I830_OUTPUT_DVO: case I830_OUTPUT_SDVO: - if (pI830->MonType1 & PIPE_DFP) - pI830->output[i].pipe = 0; - else if (pI830->MonType2 & PIPE_DFP) - pI830->output[i].pipe = 1; - else - pI830->output[i].disabled = TRUE; + pI830->output[i].pipe = 0; break; default: xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Unhandled output type\n"); @@ -1447,8 +1349,7 @@ I830PreInit(ScrnInfoPtr pScrn, int flags) } } - - +#if 0 pI830->CloneRefresh = 60; /* default to 60Hz */ if (xf86GetOptValInteger(pI830->Options, OPTION_CLONE_REFRESH, &(pI830->CloneRefresh))) { @@ -1471,6 +1372,7 @@ I830PreInit(ScrnInfoPtr pScrn, int flags) return FALSE; } } +#endif pI830->rotation = RR_Rotate_0; if ((s = xf86GetOptValString(pI830->Options, OPTION_ROTATE))) { @@ -1646,8 +1548,7 @@ I830PreInit(ScrnInfoPtr pScrn, int flags) } } - PrintDisplayDeviceInfo(pScrn); - +#if 0 if (xf86IsEntityShared(pScrn->entityList[0])) { if (!I830IsPrimary(pScrn)) { /* This could be made to work with a little more fiddling */ @@ -1663,6 +1564,7 @@ I830PreInit(ScrnInfoPtr pScrn, int flags) xf86DrvMsg(pScrn->scrnIndex, from, "Display is using Pipe %s\n", pI830->pipe ? "B" : "A"); } +#endif /* Alloc our pointers for the primary head */ if (I830IsPrimary(pScrn)) { @@ -2872,17 +2774,6 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) } #endif - if (xf86IsEntityShared(pScrn->entityList[0])) { - /* PreInit failed on the second head, so make sure we turn it off */ - if (I830IsPrimary(pScrn) && !pI830->entityPrivate->pScrn_2) { - if (pI830->pipe == 0) { - pI830->operatingDevices &= 0xFF; - } else { - pI830->operatingDevices &= 0xFF00; - } - } - } - pI830->starting = TRUE; /* Alloc our pointers for the primary head */ @@ -3269,6 +3160,7 @@ i830AdjustFrame(int scrnIndex, int x, int y, int flags) { ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; I830Ptr pI830 = I830PTR(pScrn); + int i; DPRINTF(PFX, "i830AdjustFrame: y = %d (+ %d), x = %d (+ %d)\n", x, pI830->xoffset, y, pI830->yoffset); @@ -3279,9 +3171,9 @@ i830AdjustFrame(int scrnIndex, int x, int y, int flags) pI830->AccelInfoRec->NeedToSync = FALSE; } - i830PipeSetBase(pScrn, pI830->pipe, x, y); - if (pI830->Clone) - i830PipeSetBase(pScrn, !pI830->pipe, x, y); + for (i = 0; i < pI830->availablePipes; i++) + if (pI830->pipes[i].planeEnabled) + i830PipeSetBase(pScrn, i, x, y); } static void diff --git a/src/i830_randr.c b/src/i830_randr.c index d0972830..afa18483 100644 --- a/src/i830_randr.c +++ b/src/i830_randr.c @@ -492,45 +492,31 @@ I830RandRCrtcNotify (RRCrtcPtr crtc) I830PipePtr pI830Pipe = &pI830->pipes[pipe]; int i, j; DisplayModePtr pipeMode = &pI830Pipe->curMode; - int pipe_type; x = pI830Pipe->x; y = pI830Pipe->y; rotation = RR_Rotate_0; numOutputs = 0; + mode = NULL; for (i = 0; i < pI830->num_outputs; i++) { output = &pI830->output[i]; - /* - * Valid crtcs - */ - switch (output->type) { - case I830_OUTPUT_DVO: - case I830_OUTPUT_SDVO: - pipe_type = PIPE_DFP; - break; - case I830_OUTPUT_ANALOG: - pipe_type = PIPE_CRT; - break; - case I830_OUTPUT_LVDS: - pipe_type = PIPE_LFP; - break; - case I830_OUTPUT_TVOUT: - pipe_type = PIPE_TV; - break; - default: - pipe_type = PIPE_NONE; - break; - } - if (pI830->operatingDevices & (pipe_type << (pipe << 3))) + if (!output->disabled && output->pipe == pipe) { rrout = randrp->outputs[i]; outputs[numOutputs++] = rrout; + /* + * We make copies of modes, so pointer equality + * isn't sufficient + */ for (j = 0; j < rrout->numModes; j++) { DisplayModePtr outMode = rrout->modes[j]->devPrivate; if (I830ModesEqual(pipeMode, outMode)) + { mode = rrout->modes[j]; + break; + } } } } @@ -571,14 +557,7 @@ I830RandRCrtcSet (ScreenPtr pScreen, } else { - CARD32 operatingDevices = pI830->operatingDevices; - - if (pipe == 0) - pI830->operatingDevices &= ~0xff; - else - pI830->operatingDevices &= ~0xff00; i830DisableUnusedFunctions (pScrn); - pI830->operatingDevices = operatingDevices; } randrp->modes[pipe] = display_mode; } @@ -614,7 +593,6 @@ I830RandRSetInfo12 (ScreenPtr pScreen) int p; int clone_types; int crtc_types; - int pipe_type; int pipe; int subpixel; DisplayModePtr modes, mode; @@ -644,7 +622,6 @@ I830RandRSetInfo12 (ScreenPtr pScreen) clone_types = ((1 << I830_OUTPUT_ANALOG) | (1 << I830_OUTPUT_DVO) | (1 << I830_OUTPUT_SDVO)); - pipe_type = PIPE_DFP; subpixel = SubPixelHorizontalRGB; break; case I830_OUTPUT_ANALOG: @@ -652,13 +629,11 @@ I830RandRSetInfo12 (ScreenPtr pScreen) clone_types = ((1 << I830_OUTPUT_ANALOG) | (1 << I830_OUTPUT_DVO) | (1 << I830_OUTPUT_SDVO)); - pipe_type = PIPE_CRT; subpixel = SubPixelNone; break; case I830_OUTPUT_LVDS: crtc_types = (1 << 1); clone_types = (1 << I830_OUTPUT_LVDS); - pipe_type = PIPE_LFP; subpixel = SubPixelHorizontalRGB; possibleOptions = (RROutputOptionScaleNone| RROutputOptionScaleMaxAspect | @@ -669,32 +644,27 @@ I830RandRSetInfo12 (ScreenPtr pScreen) crtc_types = ((1 << 0) | (1 << 1)); clone_types = (1 << I830_OUTPUT_TVOUT); - pipe_type = PIPE_TV; subpixel = SubPixelNone; break; default: crtc_types = 0; clone_types = 0; - pipe_type = PIPE_NONE; subpixel = SubPixelUnknown; break; } - ncrtc = 0; - pipe = -1; - crtc = NULL; - for (j = 0; j < pI830->availablePipes; j++) + if (!output->disabled) { -#if 0 - /* Can't flip outputs among crtcs yet */ - if (crtc_types & (1 << j)) - crtcs[ncrtc++] = randrp->crtcs[j]; -#endif - if (pI830->operatingDevices & (pipe_type << (j << 3))) - { - pipe = j; - crtc = randrp->crtcs[j]; - crtcs[ncrtc++] = crtc; - } + /* Can't flip outputs among crtcs yet */ + ncrtc = 1; + pipe = output->pipe; + crtc = randrp->crtcs[pipe]; + crtcs[0] = randrp->crtcs[pipe]; + } + else + { + ncrtc = 0; + pipe = -1; + crtc = NULL; } if (!RROutputSetCrtcs (randrp->outputs[i], crtcs, ncrtc)) return FALSE; diff --git a/src/i830_video.c b/src/i830_video.c index 47f4a03f..a5cd77cf 100644 --- a/src/i830_video.c +++ b/src/i830_video.c @@ -722,7 +722,7 @@ I830SetupImageVideoOverlay(ScreenPtr pScreen) pPriv->brightness = 0; pPriv->contrast = 64; pPriv->saturation = 128; - pPriv->pipe = pI830->pipe; /* default to current pipe */ + pPriv->pipe = 0; /* XXX must choose pipe wisely */ pPriv->linear = NULL; pPriv->currentBuf = 0; pPriv->gamma5 = 0xc0c0c0; @@ -3592,6 +3592,8 @@ I830VideoSwitchModeAfter(ScrnInfoPtr pScrn, DisplayModePtr mode) pPriv->overlayOK = TRUE; +#if 0 + /* XXX Must choose pipe wisely */ /* ensure pipe is updated on mode switch */ if (!pI830->Clone) { if (pPriv->pipe != pI830->pipe) { @@ -3600,6 +3602,7 @@ I830VideoSwitchModeAfter(ScrnInfoPtr pScrn, DisplayModePtr mode) pPriv->pipe = pI830->pipe; } } +#endif if (!IS_I965G(pI830)) { if (pPriv->pipe == 0) { @@ -3628,8 +3631,8 @@ I830VideoSwitchModeAfter(ScrnInfoPtr pScrn, DisplayModePtr mode) } /* Check we have an LFP connected */ - if ((pPriv->pipe == 1 && pI830->operatingDevices & (PIPE_LFP << 8)) || - (pPriv->pipe == 0 && pI830->operatingDevices & PIPE_LFP) ) { + if (i830PipeHasType (pScrn, pPriv->pipe, I830_OUTPUT_LVDS)) + { size = pPriv->pipe ? INREG(PIPEBSRC) : INREG(PIPEASRC); hsize = (size >> 16) & 0x7FF; vsize = size & 0x7FF; |