diff options
| author | Alex Deucher <alexdeucher@gmail.com> | 2008-12-01 18:50:40 -0500 |
|---|---|---|
| committer | Alex Deucher <alexdeucher@gmail.com> | 2008-12-01 18:50:40 -0500 |
| commit | 6e0c48958c6a50a639368e369ce72d813256aee4 (patch) | |
| tree | 9a242ec162c41c0c9b6627c6fb0221457d6fedc3 | |
| parent | da021c36bbdf3bca31ee50ebe01cdb9495c09b36 (diff) | |
Add quirk for r200 card with the primary dac wired to both ports
refactor load detection setup as a byproduct
should fix bug 18719
| -rw-r--r-- | src/radeon_atombios.c | 4 | ||||
| -rw-r--r-- | src/radeon_bios.c | 19 | ||||
| -rw-r--r-- | src/radeon_output.c | 34 | ||||
| -rw-r--r-- | src/radeon_probe.h | 1 |
4 files changed, 44 insertions, 14 deletions
diff --git a/src/radeon_atombios.c b/src/radeon_atombios.c index 3dfca178..169e31bb 100644 --- a/src/radeon_atombios.c +++ b/src/radeon_atombios.c @@ -1946,6 +1946,7 @@ RADEONGetATOMConnectorInfoFromBIOSConnectorTable (ScrnInfoPtr pScrn) #endif info->BiosConnector[i].valid = TRUE; + info->BiosConnector[i].load_detection = TRUE; info->BiosConnector[i].shared_ddc = FALSE; info->BiosConnector[i].output_id = ci.sucI2cId.sbfAccess.bfI2C_LineMux; info->BiosConnector[i].devices = (1 << i); @@ -2018,9 +2019,8 @@ RADEONGetATOMConnectorInfoFromBIOSConnectorTable (ScrnInfoPtr pScrn) info->BiosConnector[i].hpd_mask = 0; break; } - } else { + } else info->BiosConnector[i].hpd_mask = 0; - } RADEONApplyATOMQuirks(pScrn, i); diff --git a/src/radeon_bios.c b/src/radeon_bios.c index 3e3613a4..37954d35 100644 --- a/src/radeon_bios.c +++ b/src/radeon_bios.c @@ -507,6 +507,16 @@ static void RADEONApplyLegacyQuirks(ScrnInfoPtr pScrn, int index) } } + /* r200 card with primary dac routed to both VGA and DVI - disable load detection + * otherwise you end up detecing load if either port is attached + */ + if (info->Chipset == PCI_CHIP_R200_QL && + PCI_SUB_VENDOR_ID(info->PciInfo) == 0x1569 && + PCI_SUB_DEVICE_ID(info->PciInfo) == 0x514c && + info->BiosConnector[index].DACType == DAC_PRIMARY) { + info->BiosConnector[index].load_detection = FALSE; + } + } static Bool RADEONGetLegacyConnectorInfoFromBIOS (ScrnInfoPtr pScrn) @@ -586,6 +596,11 @@ static Bool RADEONGetLegacyConnectorInfoFromBIOS (ScrnInfoPtr pScrn) else info->BiosConnector[i].TMDSType = TMDS_INT; + if (info->BiosConnector[i].DACType == DAC_TVDAC) + info->BiosConnector[i].load_detection = FALSE; + else + info->BiosConnector[i].load_detection = TRUE; + RADEONApplyLegacyQuirks(pScrn, i); } @@ -668,9 +683,8 @@ static Bool RADEONGetLegacyConnectorInfoFromBIOS (ScrnInfoPtr pScrn) xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "LCD DDC Info Table found!\n"); } } - } else { + } else info->BiosConnector[4].ddc_i2c.valid = FALSE; - } } } @@ -683,6 +697,7 @@ static Bool RADEONGetLegacyConnectorInfoFromBIOS (ScrnInfoPtr pScrn) /* assume s-video for now */ info->BiosConnector[5].ConnectorType = CONNECTOR_STV; info->BiosConnector[5].DACType = DAC_TVDAC; + info->BiosConnector[5].load_detection = FALSE; info->BiosConnector[5].TMDSType = TMDS_NONE; info->BiosConnector[5].ddc_i2c.valid = FALSE; } diff --git a/src/radeon_output.c b/src/radeon_output.c index 035f2b82..41cbd6de 100644 --- a/src/radeon_output.c +++ b/src/radeon_output.c @@ -2174,17 +2174,9 @@ void RADEONInitConnector(xf86OutputPtr output) RADEONInfoPtr info = RADEONPTR(pScrn); RADEONOutputPrivatePtr radeon_output = output->driver_private; - if (info->IsAtomBios && - ((radeon_output->DACType == DAC_PRIMARY) || - (radeon_output->DACType == DAC_TVDAC))) + if ((radeon_output->DACType == DAC_TVDAC) && + xf86ReturnOptValBool(info->Options, OPTION_TVDAC_LOAD_DETECT, FALSE)) radeon_output->load_detection = 1; - else if (radeon_output->DACType == DAC_PRIMARY) - radeon_output->load_detection = 1; /* primary dac, only drives vga */ - else if ((radeon_output->DACType == DAC_TVDAC) && - (xf86ReturnOptValBool(info->Options, OPTION_TVDAC_LOAD_DETECT, FALSE))) - radeon_output->load_detection = 1; /* shared tvdac between vga/dvi/tv */ - else - radeon_output->load_detection = 0; if (radeon_output->type == OUTPUT_LVDS) { radeon_output->rmx_type = RMX_FULL; @@ -2247,12 +2239,14 @@ static Bool RADEONSetupAppleConnectors(ScrnInfoPtr pScrn) info->BiosConnector[1].ddc_i2c = legacy_setup_i2c_bus(RADEON_GPIO_VGA_DDC); info->BiosConnector[1].DACType = DAC_TVDAC; + info->BiosConnector[1].load_detection = FALSE; info->BiosConnector[1].TMDSType = TMDS_NONE; info->BiosConnector[1].ConnectorType = CONNECTOR_VGA; info->BiosConnector[1].valid = TRUE; info->BiosConnector[2].ConnectorType = CONNECTOR_STV; info->BiosConnector[2].DACType = DAC_TVDAC; + info->BiosConnector[2].load_detection = FALSE; info->BiosConnector[2].TMDSType = TMDS_NONE; info->BiosConnector[2].ddc_i2c.valid = FALSE; info->BiosConnector[2].valid = TRUE; @@ -2272,6 +2266,7 @@ static Bool RADEONSetupAppleConnectors(ScrnInfoPtr pScrn) info->BiosConnector[2].ConnectorType = CONNECTOR_STV; info->BiosConnector[2].DACType = DAC_TVDAC; + info->BiosConnector[2].load_detection = FALSE; info->BiosConnector[2].TMDSType = TMDS_NONE; info->BiosConnector[2].ddc_i2c.valid = FALSE; info->BiosConnector[2].valid = TRUE; @@ -2292,6 +2287,7 @@ static Bool RADEONSetupAppleConnectors(ScrnInfoPtr pScrn) info->BiosConnector[2].ConnectorType = CONNECTOR_STV; info->BiosConnector[2].DACType = DAC_TVDAC; + info->BiosConnector[2].load_detection = FALSE; info->BiosConnector[2].TMDSType = TMDS_NONE; info->BiosConnector[2].ddc_i2c.valid = FALSE; info->BiosConnector[2].valid = TRUE; @@ -2311,6 +2307,7 @@ static Bool RADEONSetupAppleConnectors(ScrnInfoPtr pScrn) info->BiosConnector[2].ConnectorType = CONNECTOR_STV; info->BiosConnector[2].DACType = DAC_TVDAC; + info->BiosConnector[2].load_detection = FALSE; info->BiosConnector[2].TMDSType = TMDS_NONE; info->BiosConnector[2].ddc_i2c.valid = FALSE; info->BiosConnector[2].valid = TRUE; @@ -2318,12 +2315,14 @@ static Bool RADEONSetupAppleConnectors(ScrnInfoPtr pScrn) case RADEON_MAC_MINI_EXTERNAL: info->BiosConnector[0].ddc_i2c = legacy_setup_i2c_bus(RADEON_GPIO_CRT2_DDC); info->BiosConnector[0].DACType = DAC_TVDAC; + info->BiosConnector[0].load_detection = FALSE; info->BiosConnector[0].TMDSType = TMDS_EXT; info->BiosConnector[0].ConnectorType = CONNECTOR_DVI_I; info->BiosConnector[0].valid = TRUE; info->BiosConnector[1].ConnectorType = CONNECTOR_STV; info->BiosConnector[1].DACType = DAC_TVDAC; + info->BiosConnector[1].load_detection = FALSE; info->BiosConnector[1].TMDSType = TMDS_NONE; info->BiosConnector[1].ddc_i2c.valid = FALSE; info->BiosConnector[1].valid = TRUE; @@ -2331,12 +2330,14 @@ static Bool RADEONSetupAppleConnectors(ScrnInfoPtr pScrn) case RADEON_MAC_MINI_INTERNAL: info->BiosConnector[0].ddc_i2c = legacy_setup_i2c_bus(RADEON_GPIO_CRT2_DDC); info->BiosConnector[0].DACType = DAC_TVDAC; + info->BiosConnector[0].load_detection = FALSE; info->BiosConnector[0].TMDSType = TMDS_INT; info->BiosConnector[0].ConnectorType = CONNECTOR_DVI_I; info->BiosConnector[0].valid = TRUE; info->BiosConnector[1].ConnectorType = CONNECTOR_STV; info->BiosConnector[1].DACType = DAC_TVDAC; + info->BiosConnector[1].load_detection = FALSE; info->BiosConnector[1].TMDSType = TMDS_NONE; info->BiosConnector[1].ddc_i2c.valid = FALSE; info->BiosConnector[1].valid = TRUE; @@ -2350,12 +2351,14 @@ static Bool RADEONSetupAppleConnectors(ScrnInfoPtr pScrn) info->BiosConnector[1].ddc_i2c = legacy_setup_i2c_bus(RADEON_GPIO_DVI_DDC); info->BiosConnector[1].DACType = DAC_TVDAC; + info->BiosConnector[1].load_detection = FALSE; info->BiosConnector[1].TMDSType = TMDS_NONE; info->BiosConnector[1].ConnectorType = CONNECTOR_VGA; info->BiosConnector[1].valid = TRUE; info->BiosConnector[2].ConnectorType = CONNECTOR_STV; info->BiosConnector[2].DACType = DAC_TVDAC; + info->BiosConnector[2].load_detection = FALSE; info->BiosConnector[2].TMDSType = TMDS_NONE; info->BiosConnector[2].ddc_i2c.valid = FALSE; info->BiosConnector[2].valid = TRUE; @@ -2436,6 +2439,7 @@ static void RADEONSetupGenericConnectors(ScrnInfoPtr pScrn) else info->BiosConnector[1].ddc_i2c = legacy_setup_i2c_bus(RADEON_GPIO_VGA_DDC); info->BiosConnector[1].DACType = DAC_TVDAC; + info->BiosConnector[1].load_detection = FALSE; info->BiosConnector[1].TMDSType = TMDS_NONE; info->BiosConnector[1].ConnectorType = CONNECTOR_VGA; info->BiosConnector[1].valid = TRUE; @@ -2465,6 +2469,7 @@ static void RADEONSetupGenericConnectors(ScrnInfoPtr pScrn) else info->BiosConnector[0].ddc_i2c = legacy_setup_i2c_bus(RADEON_GPIO_VGA_DDC); info->BiosConnector[0].DACType = DAC_TVDAC; + info->BiosConnector[0].load_detection = FALSE; info->BiosConnector[0].TMDSType = TMDS_NONE; info->BiosConnector[0].ConnectorType = CONNECTOR_VGA; info->BiosConnector[0].valid = TRUE; @@ -2480,6 +2485,7 @@ static void RADEONSetupGenericConnectors(ScrnInfoPtr pScrn) } else { info->BiosConnector[0].ddc_i2c = legacy_setup_i2c_bus(RADEON_GPIO_DVI_DDC); info->BiosConnector[0].DACType = DAC_TVDAC; + info->BiosConnector[0].load_detection = FALSE; info->BiosConnector[0].TMDSType = TMDS_INT; info->BiosConnector[0].ConnectorType = CONNECTOR_DVI_I; info->BiosConnector[0].valid = TRUE; @@ -2503,6 +2509,7 @@ static void RADEONSetupGenericConnectors(ScrnInfoPtr pScrn) if (info->InternalTVOut) { info->BiosConnector[2].ConnectorType = CONNECTOR_STV; info->BiosConnector[2].DACType = DAC_TVDAC; + info->BiosConnector[2].load_detection = FALSE; info->BiosConnector[2].TMDSType = TMDS_NONE; info->BiosConnector[2].ddc_i2c.valid = FALSE; info->BiosConnector[2].valid = TRUE; @@ -2689,6 +2696,7 @@ Bool RADEONSetupConnectors(ScrnInfoPtr pScrn) */ for (i = 0; i < RADEON_MAX_BIOS_CONNECTOR; i++) { info->BiosConnector[i].valid = FALSE; + info->BiosConnector[i].load_detection = TRUE; info->BiosConnector[i].shared_ddc = FALSE; info->BiosConnector[i].ddc_i2c.valid = FALSE; info->BiosConnector[i].DACType = DAC_NONE; @@ -2765,6 +2773,11 @@ Bool RADEONSetupConnectors(ScrnInfoPtr pScrn) return FALSE; } + if (info->BiosConnector[0].DACType == DAC_TVDAC) + info->BiosConnector[0].load_detection = FALSE; + if (info->BiosConnector[1].DACType == DAC_TVDAC) + info->BiosConnector[1].load_detection = FALSE; + info->BiosConnector[0].ddc_i2c = legacy_setup_i2c_bus(ddc_line[0]); info->BiosConnector[1].ddc_i2c = legacy_setup_i2c_bus(ddc_line[1]); } @@ -2814,6 +2827,7 @@ Bool RADEONSetupConnectors(ScrnInfoPtr pScrn) radeon_output->ddc_i2c = info->BiosConnector[i].ddc_i2c; radeon_output->igp_lane_info = info->BiosConnector[i].igp_lane_info; radeon_output->shared_ddc = info->BiosConnector[i].shared_ddc; + radeon_output->load_detection = info->BiosConnector[i].load_detection; if (radeon_output->ConnectorType == CONNECTOR_DVI_D) radeon_output->DACType = DAC_NONE; diff --git a/src/radeon_probe.h b/src/radeon_probe.h index a971a312..8c6845f7 100644 --- a/src/radeon_probe.h +++ b/src/radeon_probe.h @@ -210,6 +210,7 @@ typedef struct { int igp_lane_info; Bool shared_ddc; int i2c_line_mux; + Bool load_detection; } RADEONBIOSConnector; typedef struct _RADEONOutputPrivateRec { |
