diff --git a/src/i830_crt.c b/src/i830_crt.c index 82a774a..f3f0618 100644 --- a/src/i830_crt.c +++ b/src/i830_crt.c @@ -405,6 +405,26 @@ static const xf86OutputFuncsRec i830_crt_output_funcs = { .destroy = i830_crt_destroy }; +static void +i830_crt_get_config(ScrnInfoPtr pScrn, xf86OutputPtr output) +{ + xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR (pScrn); + I830Ptr pI830 = I830PTR(pScrn); + int c; + int pipe = !!(INREG(ADPA) & ADPA_PIPE_SELECT_MASK); + + for (c = 0; c < config->num_crtc; c++) + { + xf86CrtcPtr crtc = config->crtc[c]; + I830CrtcPrivatePtr intel_crtc = crtc->driver_private; + + if (intel_crtc->pipe == pipe) { + output->crtc = crtc; + break; + } + } +} + void i830_crt_init(ScrnInfoPtr pScrn) { @@ -433,6 +453,7 @@ i830_crt_init(ScrnInfoPtr pScrn) output->driver_private = i830_output; output->interlaceAllowed = FALSE; output->doubleScanAllowed = FALSE; + i830_crt_get_config(pScrn, output); /* Set up the DDC bus. */ I830I2CInit(pScrn, &i830_output->pDDCBus, GPIOA, "CRTDDC_A"); diff --git a/src/i830_display.c b/src/i830_display.c index d5c2dea..01517c8 100644 --- a/src/i830_display.c +++ b/src/i830_display.c @@ -1816,6 +1816,22 @@ static const xf86CrtcFuncsRec i830_crtc_funcs = { .destroy = NULL, /* XXX */ }; +static void +i830_crtc_get_config(ScrnInfoPtr pScrn, xf86CrtcPtr crtc) +{ + I830Ptr pI830 = I830PTR(pScrn); + I830CrtcPrivatePtr intel_crtc = crtc->driver_private; + int pipe = intel_crtc->pipe; + int pipeconf_reg = (pipe == 0) ? PIPEACONF : PIPEBCONF; + + intel_crtc->dpms_mode = DPMSModeOff; + + if (INREG(pipeconf_reg) & PIPEACONF_ENABLE) { + intel_crtc->dpms_mode = DPMSModeOn; + crtc->enabled = 1; + } +} + void i830_crtc_init(ScrnInfoPtr pScrn, int pipe) { @@ -1829,7 +1845,6 @@ i830_crtc_init(ScrnInfoPtr pScrn, int pipe) intel_crtc = xnfcalloc (sizeof (I830CrtcPrivateRec), 1); intel_crtc->pipe = pipe; - intel_crtc->dpms_mode = DPMSModeOff; intel_crtc->plane = pipe; /* Initialize the LUTs for when we turn on the CRTC. */ @@ -1839,5 +1854,7 @@ i830_crtc_init(ScrnInfoPtr pScrn, int pipe) intel_crtc->lut_b[i] = i; } crtc->driver_private = intel_crtc; + + i830_crtc_get_config(pScrn, crtc); } diff --git a/src/i830_dvo.c b/src/i830_dvo.c index 81d5601..f42be9c 100644 --- a/src/i830_dvo.c +++ b/src/i830_dvo.c @@ -395,6 +395,28 @@ i830_dvo_get_current_mode (xf86OutputPtr output) return mode; } +static void +i830_dvo_get_config(ScrnInfoPtr pScrn, xf86OutputPtr output) +{ + xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR (pScrn); + I830OutputPrivatePtr intel_output = output->driver_private; + struct _I830DVODriver *drv = intel_output->dev_priv; + I830Ptr pI830 = I830PTR(pScrn); + int c; + int pipe = !!(INREG(drv->dvo_reg) & SDVO_PIPE_B_SELECT); + + for (c = 0; c < config->num_crtc; c++) + { + xf86CrtcPtr crtc = config->crtc[c]; + I830CrtcPrivatePtr intel_crtc = crtc->driver_private; + + if (intel_crtc->pipe == pipe) { + output->crtc = crtc; + break; + } + } +} + void i830_dvo_init(ScrnInfoPtr pScrn) { @@ -517,6 +539,7 @@ i830_dvo_init(ScrnInfoPtr pScrn) drv->panel_wants_dither = TRUE; } + i830_dvo_get_config(pScrn, output); return; } xf86UnloadSubModule(drv->modhandle); diff --git a/src/i830_lvds.c b/src/i830_lvds.c index ef8fa4a..f5d047b 100644 --- a/src/i830_lvds.c +++ b/src/i830_lvds.c @@ -869,6 +869,26 @@ static const xf86OutputFuncsRec i830_lvds_output_funcs = { .destroy = i830_lvds_destroy }; +static void +i830_lvds_get_config(ScrnInfoPtr pScrn, xf86OutputPtr output) +{ + xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR (pScrn); + I830Ptr pI830 = I830PTR(pScrn); + int c; + int pipe = !!(INREG(LVDS) & LVDS_PIPEB_SELECT); + + for (c = 0; c < config->num_crtc; c++) + { + xf86CrtcPtr crtc = config->crtc[c]; + I830CrtcPrivatePtr intel_crtc = crtc->driver_private; + + if (intel_crtc->pipe == pipe) { + output->crtc = crtc; + break; + } + } +} + void i830_lvds_init(ScrnInfoPtr pScrn) { @@ -1044,6 +1064,8 @@ i830_lvds_init(ScrnInfoPtr pScrn) dev_priv->backlight_duty_cycle = dev_priv->get_backlight(output); + i830_lvds_get_config(pScrn, output); + return; disable_exit: diff --git a/src/i830_sdvo.c b/src/i830_sdvo.c index c7cbfac..f254ee6 100644 --- a/src/i830_sdvo.c +++ b/src/i830_sdvo.c @@ -1158,6 +1158,28 @@ static const xf86OutputFuncsRec i830_sdvo_output_funcs = { .destroy = i830_sdvo_destroy }; +static void +i830_sdvo_get_config(ScrnInfoPtr pScrn, xf86OutputPtr output) +{ + xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR (pScrn); + I830OutputPrivatePtr intel_output = output->driver_private; + struct i830_sdvo_priv *dev_priv = intel_output->dev_priv; + I830Ptr pI830 = I830PTR(pScrn); + int c; + int pipe = !!(INREG(dev_priv->output_device) & SDVO_PIPE_B_SELECT); + + for (c = 0; c < config->num_crtc; c++) + { + xf86CrtcPtr crtc = config->crtc[c]; + I830CrtcPrivatePtr intel_crtc = crtc->driver_private; + + if (intel_crtc->pipe == pipe) { + output->crtc = crtc; + break; + } + } +} + void i830_sdvo_init(ScrnInfoPtr pScrn, int output_device) { @@ -1319,7 +1341,8 @@ i830_sdvo_init(ScrnInfoPtr pScrn, int output_device) return; } - + i830_sdvo_get_config(pScrn, output); + /* Set the input timing to the screen. Assume always input 0. */ i830_sdvo_set_target_input(output, TRUE, FALSE); diff --git a/src/i830_tv.c b/src/i830_tv.c index 9add367..1ccdb10 100644 --- a/src/i830_tv.c +++ b/src/i830_tv.c @@ -1658,6 +1658,26 @@ static const xf86OutputFuncsRec i830_tv_output_funcs = { #endif }; +static void +i830_tv_get_config(ScrnInfoPtr pScrn, xf86OutputPtr output) +{ + xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR (pScrn); + I830Ptr pI830 = I830PTR(pScrn); + int c; + int pipe = !!(INREG(TV_CTL) & TV_ENC_PIPEB_SELECT); + + for (c = 0; c < config->num_crtc; c++) + { + xf86CrtcPtr crtc = config->crtc[c]; + I830CrtcPrivatePtr intel_crtc = crtc->driver_private; + + if (intel_crtc->pipe == pipe) { + output->crtc = crtc; + break; + } + } +} + void i830_tv_init(ScrnInfoPtr pScrn) { @@ -1737,4 +1757,5 @@ i830_tv_init(ScrnInfoPtr pScrn) output->driver_private = intel_output; output->interlaceAllowed = FALSE; output->doubleScanAllowed = FALSE; + i830_tv_get_config(pScrn, output); }