diff --git a/src/i830_crt.c b/src/i830_crt.c index 82a774a..e44ca13 100644 --- a/src/i830_crt.c +++ b/src/i830_crt.c @@ -405,6 +405,29 @@ static const xf86OutputFuncsRec i830_crt_output_funcs = { .destroy = i830_crt_destroy }; +static void +i830_crt_get_config(ScrnInfoPtr pScrn, xf86OutputPtr output, Bool connected) +{ + 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) { + if (i830_crt_detect(output) == XF86OutputStatusConnected) { + output->crtc = crtc; + output->status = XF86OutputStatusConnected; + } + break; + } + } +} + void i830_crt_init(ScrnInfoPtr pScrn) { @@ -433,6 +456,7 @@ i830_crt_init(ScrnInfoPtr pScrn) output->driver_private = i830_output; output->interlaceAllowed = FALSE; output->doubleScanAllowed = FALSE; + i830_crt_get_config(pScrn, output, TRUE); /* 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 ea6d067..4bf18fd 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..e8a6009 100644 --- a/src/i830_dvo.c +++ b/src/i830_dvo.c @@ -395,6 +395,31 @@ i830_dvo_get_current_mode (xf86OutputPtr output) return mode; } +static void +i830_dvo_get_config(ScrnInfoPtr pScrn, xf86OutputPtr output, Bool connected) +{ + 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) { + if (i830_dvo_detect(output) == XF86OutputStatusConnected) { + output->crtc = crtc; + output->status = XF86OutputStatusConnected; + } + break; + } + } +} + void i830_dvo_init(ScrnInfoPtr pScrn) { @@ -517,6 +542,7 @@ i830_dvo_init(ScrnInfoPtr pScrn) drv->panel_wants_dither = TRUE; } + i830_dvo_get_config(pScrn, output, TRUE); return; } xf86UnloadSubModule(drv->modhandle); diff --git a/src/i830_lvds.c b/src/i830_lvds.c index 8359e39..724fa5d 100644 --- a/src/i830_lvds.c +++ b/src/i830_lvds.c @@ -587,6 +587,8 @@ i830_lvds_get_modes(xf86OutputPtr output) xf86MonPtr edid_mon; DisplayModePtr modes; + ErrorF("detecting lvds modes\n"); + edid_mon = xf86OutputGetEDID (output, intel_output->pDDCBus); xf86OutputSetEDID (output, edid_mon); @@ -901,6 +903,29 @@ static const xf86OutputFuncsRec i830_lvds_output_funcs = { .destroy = i830_lvds_destroy }; +static void +i830_lvds_get_config(ScrnInfoPtr pScrn, xf86OutputPtr output, Bool connected) +{ + 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) { + if (i830_lvds_detect(output) == XF86OutputStatusConnected) { + output->crtc = crtc; + output->status = XF86OutputStatusConnected; + } + break; + } + } +} + void i830_lvds_init(ScrnInfoPtr pScrn) { @@ -1076,6 +1101,8 @@ i830_lvds_init(ScrnInfoPtr pScrn) dev_priv->backlight_duty_cycle = dev_priv->get_backlight(output); + i830_lvds_get_config(pScrn, output, TRUE); + return; disable_exit: diff --git a/src/i830_sdvo.c b/src/i830_sdvo.c index c7cbfac..562488f 100644 --- a/src/i830_sdvo.c +++ b/src/i830_sdvo.c @@ -1158,6 +1158,31 @@ static const xf86OutputFuncsRec i830_sdvo_output_funcs = { .destroy = i830_sdvo_destroy }; +static void +i830_sdvo_get_config(ScrnInfoPtr pScrn, xf86OutputPtr output, Bool connected) +{ + 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) { + if (i830_sdvo_detect(output) == XF86OutputStatusConnected) { + output->crtc = crtc; + output->status = XF86OutputStatusConnected; + } + break; + } + } +} + void i830_sdvo_init(ScrnInfoPtr pScrn, int output_device) { @@ -1319,7 +1344,6 @@ i830_sdvo_init(ScrnInfoPtr pScrn, int output_device) return; } - /* Set the input timing to the screen. Assume always input 0. */ i830_sdvo_set_target_input(output, TRUE, FALSE); @@ -1340,4 +1364,5 @@ i830_sdvo_init(ScrnInfoPtr pScrn, int output_device) (dev_priv->caps.sdvo_inputs_mask & 0x2) ? 'Y' : 'N', dev_priv->caps.output_flags & (SDVO_OUTPUT_RGB0 | SDVO_OUTPUT_TMDS0) ? 'Y' : 'N', dev_priv->caps.output_flags & (SDVO_OUTPUT_RGB1 | SDVO_OUTPUT_TMDS1) ? 'Y' : 'N'); + i830_sdvo_get_config(pScrn, output, TRUE); } diff --git a/src/i830_tv.c b/src/i830_tv.c index 9add367..aae78f9 100644 --- a/src/i830_tv.c +++ b/src/i830_tv.c @@ -1658,6 +1658,29 @@ static const xf86OutputFuncsRec i830_tv_output_funcs = { #endif }; +static void +i830_tv_get_config(ScrnInfoPtr pScrn, xf86OutputPtr output, Bool connected) +{ + 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) { + if (i830_tv_detect(output) == XF86OutputStatusConnected) { + output->crtc = crtc; + output->status = XF86OutputStatusConnected; + } + break; + } + } +} + void i830_tv_init(ScrnInfoPtr pScrn) { @@ -1737,4 +1760,5 @@ i830_tv_init(ScrnInfoPtr pScrn) output->driver_private = intel_output; output->interlaceAllowed = FALSE; output->doubleScanAllowed = FALSE; + i830_tv_get_config(pScrn, output, TRUE); }