1*771fe6b9SJerome Glisse /* 2*771fe6b9SJerome Glisse * Copyright 2004 ATI Technologies Inc., Markham, Ontario 3*771fe6b9SJerome Glisse * Copyright 2007-8 Advanced Micro Devices, Inc. 4*771fe6b9SJerome Glisse * Copyright 2008 Red Hat Inc. 5*771fe6b9SJerome Glisse * 6*771fe6b9SJerome Glisse * Permission is hereby granted, free of charge, to any person obtaining a 7*771fe6b9SJerome Glisse * copy of this software and associated documentation files (the "Software"), 8*771fe6b9SJerome Glisse * to deal in the Software without restriction, including without limitation 9*771fe6b9SJerome Glisse * the rights to use, copy, modify, merge, publish, distribute, sublicense, 10*771fe6b9SJerome Glisse * and/or sell copies of the Software, and to permit persons to whom the 11*771fe6b9SJerome Glisse * Software is furnished to do so, subject to the following conditions: 12*771fe6b9SJerome Glisse * 13*771fe6b9SJerome Glisse * The above copyright notice and this permission notice shall be included in 14*771fe6b9SJerome Glisse * all copies or substantial portions of the Software. 15*771fe6b9SJerome Glisse * 16*771fe6b9SJerome Glisse * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17*771fe6b9SJerome Glisse * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18*771fe6b9SJerome Glisse * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19*771fe6b9SJerome Glisse * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 20*771fe6b9SJerome Glisse * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21*771fe6b9SJerome Glisse * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22*771fe6b9SJerome Glisse * OTHER DEALINGS IN THE SOFTWARE. 23*771fe6b9SJerome Glisse * 24*771fe6b9SJerome Glisse * Authors: Dave Airlie 25*771fe6b9SJerome Glisse * Alex Deucher 26*771fe6b9SJerome Glisse */ 27*771fe6b9SJerome Glisse #include "drmP.h" 28*771fe6b9SJerome Glisse #include "radeon_drm.h" 29*771fe6b9SJerome Glisse #include "radeon.h" 30*771fe6b9SJerome Glisse #include "atom.h" 31*771fe6b9SJerome Glisse 32*771fe6b9SJerome Glisse #ifdef CONFIG_PPC_PMAC 33*771fe6b9SJerome Glisse /* not sure which of these are needed */ 34*771fe6b9SJerome Glisse #include <asm/machdep.h> 35*771fe6b9SJerome Glisse #include <asm/pmac_feature.h> 36*771fe6b9SJerome Glisse #include <asm/prom.h> 37*771fe6b9SJerome Glisse #include <asm/pci-bridge.h> 38*771fe6b9SJerome Glisse #endif /* CONFIG_PPC_PMAC */ 39*771fe6b9SJerome Glisse 40*771fe6b9SJerome Glisse /* from radeon_encoder.c */ 41*771fe6b9SJerome Glisse extern uint32_t 42*771fe6b9SJerome Glisse radeon_get_encoder_id(struct drm_device *dev, uint32_t supported_device, 43*771fe6b9SJerome Glisse uint8_t dac); 44*771fe6b9SJerome Glisse extern void radeon_link_encoder_connector(struct drm_device *dev); 45*771fe6b9SJerome Glisse 46*771fe6b9SJerome Glisse /* from radeon_connector.c */ 47*771fe6b9SJerome Glisse extern void 48*771fe6b9SJerome Glisse radeon_add_legacy_connector(struct drm_device *dev, 49*771fe6b9SJerome Glisse uint32_t connector_id, 50*771fe6b9SJerome Glisse uint32_t supported_device, 51*771fe6b9SJerome Glisse int connector_type, 52*771fe6b9SJerome Glisse struct radeon_i2c_bus_rec *i2c_bus); 53*771fe6b9SJerome Glisse 54*771fe6b9SJerome Glisse /* from radeon_legacy_encoder.c */ 55*771fe6b9SJerome Glisse extern void 56*771fe6b9SJerome Glisse radeon_add_legacy_encoder(struct drm_device *dev, uint32_t encoder_id, 57*771fe6b9SJerome Glisse uint32_t supported_device); 58*771fe6b9SJerome Glisse 59*771fe6b9SJerome Glisse /* old legacy ATI BIOS routines */ 60*771fe6b9SJerome Glisse 61*771fe6b9SJerome Glisse /* COMBIOS table offsets */ 62*771fe6b9SJerome Glisse enum radeon_combios_table_offset { 63*771fe6b9SJerome Glisse /* absolute offset tables */ 64*771fe6b9SJerome Glisse COMBIOS_ASIC_INIT_1_TABLE, 65*771fe6b9SJerome Glisse COMBIOS_BIOS_SUPPORT_TABLE, 66*771fe6b9SJerome Glisse COMBIOS_DAC_PROGRAMMING_TABLE, 67*771fe6b9SJerome Glisse COMBIOS_MAX_COLOR_DEPTH_TABLE, 68*771fe6b9SJerome Glisse COMBIOS_CRTC_INFO_TABLE, 69*771fe6b9SJerome Glisse COMBIOS_PLL_INFO_TABLE, 70*771fe6b9SJerome Glisse COMBIOS_TV_INFO_TABLE, 71*771fe6b9SJerome Glisse COMBIOS_DFP_INFO_TABLE, 72*771fe6b9SJerome Glisse COMBIOS_HW_CONFIG_INFO_TABLE, 73*771fe6b9SJerome Glisse COMBIOS_MULTIMEDIA_INFO_TABLE, 74*771fe6b9SJerome Glisse COMBIOS_TV_STD_PATCH_TABLE, 75*771fe6b9SJerome Glisse COMBIOS_LCD_INFO_TABLE, 76*771fe6b9SJerome Glisse COMBIOS_MOBILE_INFO_TABLE, 77*771fe6b9SJerome Glisse COMBIOS_PLL_INIT_TABLE, 78*771fe6b9SJerome Glisse COMBIOS_MEM_CONFIG_TABLE, 79*771fe6b9SJerome Glisse COMBIOS_SAVE_MASK_TABLE, 80*771fe6b9SJerome Glisse COMBIOS_HARDCODED_EDID_TABLE, 81*771fe6b9SJerome Glisse COMBIOS_ASIC_INIT_2_TABLE, 82*771fe6b9SJerome Glisse COMBIOS_CONNECTOR_INFO_TABLE, 83*771fe6b9SJerome Glisse COMBIOS_DYN_CLK_1_TABLE, 84*771fe6b9SJerome Glisse COMBIOS_RESERVED_MEM_TABLE, 85*771fe6b9SJerome Glisse COMBIOS_EXT_TMDS_INFO_TABLE, 86*771fe6b9SJerome Glisse COMBIOS_MEM_CLK_INFO_TABLE, 87*771fe6b9SJerome Glisse COMBIOS_EXT_DAC_INFO_TABLE, 88*771fe6b9SJerome Glisse COMBIOS_MISC_INFO_TABLE, 89*771fe6b9SJerome Glisse COMBIOS_CRT_INFO_TABLE, 90*771fe6b9SJerome Glisse COMBIOS_INTEGRATED_SYSTEM_INFO_TABLE, 91*771fe6b9SJerome Glisse COMBIOS_COMPONENT_VIDEO_INFO_TABLE, 92*771fe6b9SJerome Glisse COMBIOS_FAN_SPEED_INFO_TABLE, 93*771fe6b9SJerome Glisse COMBIOS_OVERDRIVE_INFO_TABLE, 94*771fe6b9SJerome Glisse COMBIOS_OEM_INFO_TABLE, 95*771fe6b9SJerome Glisse COMBIOS_DYN_CLK_2_TABLE, 96*771fe6b9SJerome Glisse COMBIOS_POWER_CONNECTOR_INFO_TABLE, 97*771fe6b9SJerome Glisse COMBIOS_I2C_INFO_TABLE, 98*771fe6b9SJerome Glisse /* relative offset tables */ 99*771fe6b9SJerome Glisse COMBIOS_ASIC_INIT_3_TABLE, /* offset from misc info */ 100*771fe6b9SJerome Glisse COMBIOS_ASIC_INIT_4_TABLE, /* offset from misc info */ 101*771fe6b9SJerome Glisse COMBIOS_DETECTED_MEM_TABLE, /* offset from misc info */ 102*771fe6b9SJerome Glisse COMBIOS_ASIC_INIT_5_TABLE, /* offset from misc info */ 103*771fe6b9SJerome Glisse COMBIOS_RAM_RESET_TABLE, /* offset from mem config */ 104*771fe6b9SJerome Glisse COMBIOS_POWERPLAY_INFO_TABLE, /* offset from mobile info */ 105*771fe6b9SJerome Glisse COMBIOS_GPIO_INFO_TABLE, /* offset from mobile info */ 106*771fe6b9SJerome Glisse COMBIOS_LCD_DDC_INFO_TABLE, /* offset from mobile info */ 107*771fe6b9SJerome Glisse COMBIOS_TMDS_POWER_TABLE, /* offset from mobile info */ 108*771fe6b9SJerome Glisse COMBIOS_TMDS_POWER_ON_TABLE, /* offset from tmds power */ 109*771fe6b9SJerome Glisse COMBIOS_TMDS_POWER_OFF_TABLE, /* offset from tmds power */ 110*771fe6b9SJerome Glisse }; 111*771fe6b9SJerome Glisse 112*771fe6b9SJerome Glisse enum radeon_combios_ddc { 113*771fe6b9SJerome Glisse DDC_NONE_DETECTED, 114*771fe6b9SJerome Glisse DDC_MONID, 115*771fe6b9SJerome Glisse DDC_DVI, 116*771fe6b9SJerome Glisse DDC_VGA, 117*771fe6b9SJerome Glisse DDC_CRT2, 118*771fe6b9SJerome Glisse DDC_LCD, 119*771fe6b9SJerome Glisse DDC_GPIO, 120*771fe6b9SJerome Glisse }; 121*771fe6b9SJerome Glisse 122*771fe6b9SJerome Glisse enum radeon_combios_connector { 123*771fe6b9SJerome Glisse CONNECTOR_NONE_LEGACY, 124*771fe6b9SJerome Glisse CONNECTOR_PROPRIETARY_LEGACY, 125*771fe6b9SJerome Glisse CONNECTOR_CRT_LEGACY, 126*771fe6b9SJerome Glisse CONNECTOR_DVI_I_LEGACY, 127*771fe6b9SJerome Glisse CONNECTOR_DVI_D_LEGACY, 128*771fe6b9SJerome Glisse CONNECTOR_CTV_LEGACY, 129*771fe6b9SJerome Glisse CONNECTOR_STV_LEGACY, 130*771fe6b9SJerome Glisse CONNECTOR_UNSUPPORTED_LEGACY 131*771fe6b9SJerome Glisse }; 132*771fe6b9SJerome Glisse 133*771fe6b9SJerome Glisse const int legacy_connector_convert[] = { 134*771fe6b9SJerome Glisse DRM_MODE_CONNECTOR_Unknown, 135*771fe6b9SJerome Glisse DRM_MODE_CONNECTOR_DVID, 136*771fe6b9SJerome Glisse DRM_MODE_CONNECTOR_VGA, 137*771fe6b9SJerome Glisse DRM_MODE_CONNECTOR_DVII, 138*771fe6b9SJerome Glisse DRM_MODE_CONNECTOR_DVID, 139*771fe6b9SJerome Glisse DRM_MODE_CONNECTOR_Composite, 140*771fe6b9SJerome Glisse DRM_MODE_CONNECTOR_SVIDEO, 141*771fe6b9SJerome Glisse DRM_MODE_CONNECTOR_Unknown, 142*771fe6b9SJerome Glisse }; 143*771fe6b9SJerome Glisse 144*771fe6b9SJerome Glisse static uint16_t combios_get_table_offset(struct drm_device *dev, 145*771fe6b9SJerome Glisse enum radeon_combios_table_offset table) 146*771fe6b9SJerome Glisse { 147*771fe6b9SJerome Glisse struct radeon_device *rdev = dev->dev_private; 148*771fe6b9SJerome Glisse int rev; 149*771fe6b9SJerome Glisse uint16_t offset = 0, check_offset; 150*771fe6b9SJerome Glisse 151*771fe6b9SJerome Glisse switch (table) { 152*771fe6b9SJerome Glisse /* absolute offset tables */ 153*771fe6b9SJerome Glisse case COMBIOS_ASIC_INIT_1_TABLE: 154*771fe6b9SJerome Glisse check_offset = RBIOS16(rdev->bios_header_start + 0xc); 155*771fe6b9SJerome Glisse if (check_offset) 156*771fe6b9SJerome Glisse offset = check_offset; 157*771fe6b9SJerome Glisse break; 158*771fe6b9SJerome Glisse case COMBIOS_BIOS_SUPPORT_TABLE: 159*771fe6b9SJerome Glisse check_offset = RBIOS16(rdev->bios_header_start + 0x14); 160*771fe6b9SJerome Glisse if (check_offset) 161*771fe6b9SJerome Glisse offset = check_offset; 162*771fe6b9SJerome Glisse break; 163*771fe6b9SJerome Glisse case COMBIOS_DAC_PROGRAMMING_TABLE: 164*771fe6b9SJerome Glisse check_offset = RBIOS16(rdev->bios_header_start + 0x2a); 165*771fe6b9SJerome Glisse if (check_offset) 166*771fe6b9SJerome Glisse offset = check_offset; 167*771fe6b9SJerome Glisse break; 168*771fe6b9SJerome Glisse case COMBIOS_MAX_COLOR_DEPTH_TABLE: 169*771fe6b9SJerome Glisse check_offset = RBIOS16(rdev->bios_header_start + 0x2c); 170*771fe6b9SJerome Glisse if (check_offset) 171*771fe6b9SJerome Glisse offset = check_offset; 172*771fe6b9SJerome Glisse break; 173*771fe6b9SJerome Glisse case COMBIOS_CRTC_INFO_TABLE: 174*771fe6b9SJerome Glisse check_offset = RBIOS16(rdev->bios_header_start + 0x2e); 175*771fe6b9SJerome Glisse if (check_offset) 176*771fe6b9SJerome Glisse offset = check_offset; 177*771fe6b9SJerome Glisse break; 178*771fe6b9SJerome Glisse case COMBIOS_PLL_INFO_TABLE: 179*771fe6b9SJerome Glisse check_offset = RBIOS16(rdev->bios_header_start + 0x30); 180*771fe6b9SJerome Glisse if (check_offset) 181*771fe6b9SJerome Glisse offset = check_offset; 182*771fe6b9SJerome Glisse break; 183*771fe6b9SJerome Glisse case COMBIOS_TV_INFO_TABLE: 184*771fe6b9SJerome Glisse check_offset = RBIOS16(rdev->bios_header_start + 0x32); 185*771fe6b9SJerome Glisse if (check_offset) 186*771fe6b9SJerome Glisse offset = check_offset; 187*771fe6b9SJerome Glisse break; 188*771fe6b9SJerome Glisse case COMBIOS_DFP_INFO_TABLE: 189*771fe6b9SJerome Glisse check_offset = RBIOS16(rdev->bios_header_start + 0x34); 190*771fe6b9SJerome Glisse if (check_offset) 191*771fe6b9SJerome Glisse offset = check_offset; 192*771fe6b9SJerome Glisse break; 193*771fe6b9SJerome Glisse case COMBIOS_HW_CONFIG_INFO_TABLE: 194*771fe6b9SJerome Glisse check_offset = RBIOS16(rdev->bios_header_start + 0x36); 195*771fe6b9SJerome Glisse if (check_offset) 196*771fe6b9SJerome Glisse offset = check_offset; 197*771fe6b9SJerome Glisse break; 198*771fe6b9SJerome Glisse case COMBIOS_MULTIMEDIA_INFO_TABLE: 199*771fe6b9SJerome Glisse check_offset = RBIOS16(rdev->bios_header_start + 0x38); 200*771fe6b9SJerome Glisse if (check_offset) 201*771fe6b9SJerome Glisse offset = check_offset; 202*771fe6b9SJerome Glisse break; 203*771fe6b9SJerome Glisse case COMBIOS_TV_STD_PATCH_TABLE: 204*771fe6b9SJerome Glisse check_offset = RBIOS16(rdev->bios_header_start + 0x3e); 205*771fe6b9SJerome Glisse if (check_offset) 206*771fe6b9SJerome Glisse offset = check_offset; 207*771fe6b9SJerome Glisse break; 208*771fe6b9SJerome Glisse case COMBIOS_LCD_INFO_TABLE: 209*771fe6b9SJerome Glisse check_offset = RBIOS16(rdev->bios_header_start + 0x40); 210*771fe6b9SJerome Glisse if (check_offset) 211*771fe6b9SJerome Glisse offset = check_offset; 212*771fe6b9SJerome Glisse break; 213*771fe6b9SJerome Glisse case COMBIOS_MOBILE_INFO_TABLE: 214*771fe6b9SJerome Glisse check_offset = RBIOS16(rdev->bios_header_start + 0x42); 215*771fe6b9SJerome Glisse if (check_offset) 216*771fe6b9SJerome Glisse offset = check_offset; 217*771fe6b9SJerome Glisse break; 218*771fe6b9SJerome Glisse case COMBIOS_PLL_INIT_TABLE: 219*771fe6b9SJerome Glisse check_offset = RBIOS16(rdev->bios_header_start + 0x46); 220*771fe6b9SJerome Glisse if (check_offset) 221*771fe6b9SJerome Glisse offset = check_offset; 222*771fe6b9SJerome Glisse break; 223*771fe6b9SJerome Glisse case COMBIOS_MEM_CONFIG_TABLE: 224*771fe6b9SJerome Glisse check_offset = RBIOS16(rdev->bios_header_start + 0x48); 225*771fe6b9SJerome Glisse if (check_offset) 226*771fe6b9SJerome Glisse offset = check_offset; 227*771fe6b9SJerome Glisse break; 228*771fe6b9SJerome Glisse case COMBIOS_SAVE_MASK_TABLE: 229*771fe6b9SJerome Glisse check_offset = RBIOS16(rdev->bios_header_start + 0x4a); 230*771fe6b9SJerome Glisse if (check_offset) 231*771fe6b9SJerome Glisse offset = check_offset; 232*771fe6b9SJerome Glisse break; 233*771fe6b9SJerome Glisse case COMBIOS_HARDCODED_EDID_TABLE: 234*771fe6b9SJerome Glisse check_offset = RBIOS16(rdev->bios_header_start + 0x4c); 235*771fe6b9SJerome Glisse if (check_offset) 236*771fe6b9SJerome Glisse offset = check_offset; 237*771fe6b9SJerome Glisse break; 238*771fe6b9SJerome Glisse case COMBIOS_ASIC_INIT_2_TABLE: 239*771fe6b9SJerome Glisse check_offset = RBIOS16(rdev->bios_header_start + 0x4e); 240*771fe6b9SJerome Glisse if (check_offset) 241*771fe6b9SJerome Glisse offset = check_offset; 242*771fe6b9SJerome Glisse break; 243*771fe6b9SJerome Glisse case COMBIOS_CONNECTOR_INFO_TABLE: 244*771fe6b9SJerome Glisse check_offset = RBIOS16(rdev->bios_header_start + 0x50); 245*771fe6b9SJerome Glisse if (check_offset) 246*771fe6b9SJerome Glisse offset = check_offset; 247*771fe6b9SJerome Glisse break; 248*771fe6b9SJerome Glisse case COMBIOS_DYN_CLK_1_TABLE: 249*771fe6b9SJerome Glisse check_offset = RBIOS16(rdev->bios_header_start + 0x52); 250*771fe6b9SJerome Glisse if (check_offset) 251*771fe6b9SJerome Glisse offset = check_offset; 252*771fe6b9SJerome Glisse break; 253*771fe6b9SJerome Glisse case COMBIOS_RESERVED_MEM_TABLE: 254*771fe6b9SJerome Glisse check_offset = RBIOS16(rdev->bios_header_start + 0x54); 255*771fe6b9SJerome Glisse if (check_offset) 256*771fe6b9SJerome Glisse offset = check_offset; 257*771fe6b9SJerome Glisse break; 258*771fe6b9SJerome Glisse case COMBIOS_EXT_TMDS_INFO_TABLE: 259*771fe6b9SJerome Glisse check_offset = RBIOS16(rdev->bios_header_start + 0x58); 260*771fe6b9SJerome Glisse if (check_offset) 261*771fe6b9SJerome Glisse offset = check_offset; 262*771fe6b9SJerome Glisse break; 263*771fe6b9SJerome Glisse case COMBIOS_MEM_CLK_INFO_TABLE: 264*771fe6b9SJerome Glisse check_offset = RBIOS16(rdev->bios_header_start + 0x5a); 265*771fe6b9SJerome Glisse if (check_offset) 266*771fe6b9SJerome Glisse offset = check_offset; 267*771fe6b9SJerome Glisse break; 268*771fe6b9SJerome Glisse case COMBIOS_EXT_DAC_INFO_TABLE: 269*771fe6b9SJerome Glisse check_offset = RBIOS16(rdev->bios_header_start + 0x5c); 270*771fe6b9SJerome Glisse if (check_offset) 271*771fe6b9SJerome Glisse offset = check_offset; 272*771fe6b9SJerome Glisse break; 273*771fe6b9SJerome Glisse case COMBIOS_MISC_INFO_TABLE: 274*771fe6b9SJerome Glisse check_offset = RBIOS16(rdev->bios_header_start + 0x5e); 275*771fe6b9SJerome Glisse if (check_offset) 276*771fe6b9SJerome Glisse offset = check_offset; 277*771fe6b9SJerome Glisse break; 278*771fe6b9SJerome Glisse case COMBIOS_CRT_INFO_TABLE: 279*771fe6b9SJerome Glisse check_offset = RBIOS16(rdev->bios_header_start + 0x60); 280*771fe6b9SJerome Glisse if (check_offset) 281*771fe6b9SJerome Glisse offset = check_offset; 282*771fe6b9SJerome Glisse break; 283*771fe6b9SJerome Glisse case COMBIOS_INTEGRATED_SYSTEM_INFO_TABLE: 284*771fe6b9SJerome Glisse check_offset = RBIOS16(rdev->bios_header_start + 0x62); 285*771fe6b9SJerome Glisse if (check_offset) 286*771fe6b9SJerome Glisse offset = check_offset; 287*771fe6b9SJerome Glisse break; 288*771fe6b9SJerome Glisse case COMBIOS_COMPONENT_VIDEO_INFO_TABLE: 289*771fe6b9SJerome Glisse check_offset = RBIOS16(rdev->bios_header_start + 0x64); 290*771fe6b9SJerome Glisse if (check_offset) 291*771fe6b9SJerome Glisse offset = check_offset; 292*771fe6b9SJerome Glisse break; 293*771fe6b9SJerome Glisse case COMBIOS_FAN_SPEED_INFO_TABLE: 294*771fe6b9SJerome Glisse check_offset = RBIOS16(rdev->bios_header_start + 0x66); 295*771fe6b9SJerome Glisse if (check_offset) 296*771fe6b9SJerome Glisse offset = check_offset; 297*771fe6b9SJerome Glisse break; 298*771fe6b9SJerome Glisse case COMBIOS_OVERDRIVE_INFO_TABLE: 299*771fe6b9SJerome Glisse check_offset = RBIOS16(rdev->bios_header_start + 0x68); 300*771fe6b9SJerome Glisse if (check_offset) 301*771fe6b9SJerome Glisse offset = check_offset; 302*771fe6b9SJerome Glisse break; 303*771fe6b9SJerome Glisse case COMBIOS_OEM_INFO_TABLE: 304*771fe6b9SJerome Glisse check_offset = RBIOS16(rdev->bios_header_start + 0x6a); 305*771fe6b9SJerome Glisse if (check_offset) 306*771fe6b9SJerome Glisse offset = check_offset; 307*771fe6b9SJerome Glisse break; 308*771fe6b9SJerome Glisse case COMBIOS_DYN_CLK_2_TABLE: 309*771fe6b9SJerome Glisse check_offset = RBIOS16(rdev->bios_header_start + 0x6c); 310*771fe6b9SJerome Glisse if (check_offset) 311*771fe6b9SJerome Glisse offset = check_offset; 312*771fe6b9SJerome Glisse break; 313*771fe6b9SJerome Glisse case COMBIOS_POWER_CONNECTOR_INFO_TABLE: 314*771fe6b9SJerome Glisse check_offset = RBIOS16(rdev->bios_header_start + 0x6e); 315*771fe6b9SJerome Glisse if (check_offset) 316*771fe6b9SJerome Glisse offset = check_offset; 317*771fe6b9SJerome Glisse break; 318*771fe6b9SJerome Glisse case COMBIOS_I2C_INFO_TABLE: 319*771fe6b9SJerome Glisse check_offset = RBIOS16(rdev->bios_header_start + 0x70); 320*771fe6b9SJerome Glisse if (check_offset) 321*771fe6b9SJerome Glisse offset = check_offset; 322*771fe6b9SJerome Glisse break; 323*771fe6b9SJerome Glisse /* relative offset tables */ 324*771fe6b9SJerome Glisse case COMBIOS_ASIC_INIT_3_TABLE: /* offset from misc info */ 325*771fe6b9SJerome Glisse check_offset = 326*771fe6b9SJerome Glisse combios_get_table_offset(dev, COMBIOS_MISC_INFO_TABLE); 327*771fe6b9SJerome Glisse if (check_offset) { 328*771fe6b9SJerome Glisse rev = RBIOS8(check_offset); 329*771fe6b9SJerome Glisse if (rev > 0) { 330*771fe6b9SJerome Glisse check_offset = RBIOS16(check_offset + 0x3); 331*771fe6b9SJerome Glisse if (check_offset) 332*771fe6b9SJerome Glisse offset = check_offset; 333*771fe6b9SJerome Glisse } 334*771fe6b9SJerome Glisse } 335*771fe6b9SJerome Glisse break; 336*771fe6b9SJerome Glisse case COMBIOS_ASIC_INIT_4_TABLE: /* offset from misc info */ 337*771fe6b9SJerome Glisse check_offset = 338*771fe6b9SJerome Glisse combios_get_table_offset(dev, COMBIOS_MISC_INFO_TABLE); 339*771fe6b9SJerome Glisse if (check_offset) { 340*771fe6b9SJerome Glisse rev = RBIOS8(check_offset); 341*771fe6b9SJerome Glisse if (rev > 0) { 342*771fe6b9SJerome Glisse check_offset = RBIOS16(check_offset + 0x5); 343*771fe6b9SJerome Glisse if (check_offset) 344*771fe6b9SJerome Glisse offset = check_offset; 345*771fe6b9SJerome Glisse } 346*771fe6b9SJerome Glisse } 347*771fe6b9SJerome Glisse break; 348*771fe6b9SJerome Glisse case COMBIOS_DETECTED_MEM_TABLE: /* offset from misc info */ 349*771fe6b9SJerome Glisse check_offset = 350*771fe6b9SJerome Glisse combios_get_table_offset(dev, COMBIOS_MISC_INFO_TABLE); 351*771fe6b9SJerome Glisse if (check_offset) { 352*771fe6b9SJerome Glisse rev = RBIOS8(check_offset); 353*771fe6b9SJerome Glisse if (rev > 0) { 354*771fe6b9SJerome Glisse check_offset = RBIOS16(check_offset + 0x7); 355*771fe6b9SJerome Glisse if (check_offset) 356*771fe6b9SJerome Glisse offset = check_offset; 357*771fe6b9SJerome Glisse } 358*771fe6b9SJerome Glisse } 359*771fe6b9SJerome Glisse break; 360*771fe6b9SJerome Glisse case COMBIOS_ASIC_INIT_5_TABLE: /* offset from misc info */ 361*771fe6b9SJerome Glisse check_offset = 362*771fe6b9SJerome Glisse combios_get_table_offset(dev, COMBIOS_MISC_INFO_TABLE); 363*771fe6b9SJerome Glisse if (check_offset) { 364*771fe6b9SJerome Glisse rev = RBIOS8(check_offset); 365*771fe6b9SJerome Glisse if (rev == 2) { 366*771fe6b9SJerome Glisse check_offset = RBIOS16(check_offset + 0x9); 367*771fe6b9SJerome Glisse if (check_offset) 368*771fe6b9SJerome Glisse offset = check_offset; 369*771fe6b9SJerome Glisse } 370*771fe6b9SJerome Glisse } 371*771fe6b9SJerome Glisse break; 372*771fe6b9SJerome Glisse case COMBIOS_RAM_RESET_TABLE: /* offset from mem config */ 373*771fe6b9SJerome Glisse check_offset = 374*771fe6b9SJerome Glisse combios_get_table_offset(dev, COMBIOS_MEM_CONFIG_TABLE); 375*771fe6b9SJerome Glisse if (check_offset) { 376*771fe6b9SJerome Glisse while (RBIOS8(check_offset++)); 377*771fe6b9SJerome Glisse check_offset += 2; 378*771fe6b9SJerome Glisse if (check_offset) 379*771fe6b9SJerome Glisse offset = check_offset; 380*771fe6b9SJerome Glisse } 381*771fe6b9SJerome Glisse break; 382*771fe6b9SJerome Glisse case COMBIOS_POWERPLAY_INFO_TABLE: /* offset from mobile info */ 383*771fe6b9SJerome Glisse check_offset = 384*771fe6b9SJerome Glisse combios_get_table_offset(dev, COMBIOS_MOBILE_INFO_TABLE); 385*771fe6b9SJerome Glisse if (check_offset) { 386*771fe6b9SJerome Glisse check_offset = RBIOS16(check_offset + 0x11); 387*771fe6b9SJerome Glisse if (check_offset) 388*771fe6b9SJerome Glisse offset = check_offset; 389*771fe6b9SJerome Glisse } 390*771fe6b9SJerome Glisse break; 391*771fe6b9SJerome Glisse case COMBIOS_GPIO_INFO_TABLE: /* offset from mobile info */ 392*771fe6b9SJerome Glisse check_offset = 393*771fe6b9SJerome Glisse combios_get_table_offset(dev, COMBIOS_MOBILE_INFO_TABLE); 394*771fe6b9SJerome Glisse if (check_offset) { 395*771fe6b9SJerome Glisse check_offset = RBIOS16(check_offset + 0x13); 396*771fe6b9SJerome Glisse if (check_offset) 397*771fe6b9SJerome Glisse offset = check_offset; 398*771fe6b9SJerome Glisse } 399*771fe6b9SJerome Glisse break; 400*771fe6b9SJerome Glisse case COMBIOS_LCD_DDC_INFO_TABLE: /* offset from mobile info */ 401*771fe6b9SJerome Glisse check_offset = 402*771fe6b9SJerome Glisse combios_get_table_offset(dev, COMBIOS_MOBILE_INFO_TABLE); 403*771fe6b9SJerome Glisse if (check_offset) { 404*771fe6b9SJerome Glisse check_offset = RBIOS16(check_offset + 0x15); 405*771fe6b9SJerome Glisse if (check_offset) 406*771fe6b9SJerome Glisse offset = check_offset; 407*771fe6b9SJerome Glisse } 408*771fe6b9SJerome Glisse break; 409*771fe6b9SJerome Glisse case COMBIOS_TMDS_POWER_TABLE: /* offset from mobile info */ 410*771fe6b9SJerome Glisse check_offset = 411*771fe6b9SJerome Glisse combios_get_table_offset(dev, COMBIOS_MOBILE_INFO_TABLE); 412*771fe6b9SJerome Glisse if (check_offset) { 413*771fe6b9SJerome Glisse check_offset = RBIOS16(check_offset + 0x17); 414*771fe6b9SJerome Glisse if (check_offset) 415*771fe6b9SJerome Glisse offset = check_offset; 416*771fe6b9SJerome Glisse } 417*771fe6b9SJerome Glisse break; 418*771fe6b9SJerome Glisse case COMBIOS_TMDS_POWER_ON_TABLE: /* offset from tmds power */ 419*771fe6b9SJerome Glisse check_offset = 420*771fe6b9SJerome Glisse combios_get_table_offset(dev, COMBIOS_TMDS_POWER_TABLE); 421*771fe6b9SJerome Glisse if (check_offset) { 422*771fe6b9SJerome Glisse check_offset = RBIOS16(check_offset + 0x2); 423*771fe6b9SJerome Glisse if (check_offset) 424*771fe6b9SJerome Glisse offset = check_offset; 425*771fe6b9SJerome Glisse } 426*771fe6b9SJerome Glisse break; 427*771fe6b9SJerome Glisse case COMBIOS_TMDS_POWER_OFF_TABLE: /* offset from tmds power */ 428*771fe6b9SJerome Glisse check_offset = 429*771fe6b9SJerome Glisse combios_get_table_offset(dev, COMBIOS_TMDS_POWER_TABLE); 430*771fe6b9SJerome Glisse if (check_offset) { 431*771fe6b9SJerome Glisse check_offset = RBIOS16(check_offset + 0x4); 432*771fe6b9SJerome Glisse if (check_offset) 433*771fe6b9SJerome Glisse offset = check_offset; 434*771fe6b9SJerome Glisse } 435*771fe6b9SJerome Glisse break; 436*771fe6b9SJerome Glisse default: 437*771fe6b9SJerome Glisse break; 438*771fe6b9SJerome Glisse } 439*771fe6b9SJerome Glisse 440*771fe6b9SJerome Glisse return offset; 441*771fe6b9SJerome Glisse 442*771fe6b9SJerome Glisse } 443*771fe6b9SJerome Glisse 444*771fe6b9SJerome Glisse struct radeon_i2c_bus_rec combios_setup_i2c_bus(int ddc_line) 445*771fe6b9SJerome Glisse { 446*771fe6b9SJerome Glisse struct radeon_i2c_bus_rec i2c; 447*771fe6b9SJerome Glisse 448*771fe6b9SJerome Glisse i2c.mask_clk_mask = RADEON_GPIO_EN_1; 449*771fe6b9SJerome Glisse i2c.mask_data_mask = RADEON_GPIO_EN_0; 450*771fe6b9SJerome Glisse i2c.a_clk_mask = RADEON_GPIO_A_1; 451*771fe6b9SJerome Glisse i2c.a_data_mask = RADEON_GPIO_A_0; 452*771fe6b9SJerome Glisse i2c.put_clk_mask = RADEON_GPIO_EN_1; 453*771fe6b9SJerome Glisse i2c.put_data_mask = RADEON_GPIO_EN_0; 454*771fe6b9SJerome Glisse i2c.get_clk_mask = RADEON_GPIO_Y_1; 455*771fe6b9SJerome Glisse i2c.get_data_mask = RADEON_GPIO_Y_0; 456*771fe6b9SJerome Glisse if ((ddc_line == RADEON_LCD_GPIO_MASK) || 457*771fe6b9SJerome Glisse (ddc_line == RADEON_MDGPIO_EN_REG)) { 458*771fe6b9SJerome Glisse i2c.mask_clk_reg = ddc_line; 459*771fe6b9SJerome Glisse i2c.mask_data_reg = ddc_line; 460*771fe6b9SJerome Glisse i2c.a_clk_reg = ddc_line; 461*771fe6b9SJerome Glisse i2c.a_data_reg = ddc_line; 462*771fe6b9SJerome Glisse i2c.put_clk_reg = ddc_line; 463*771fe6b9SJerome Glisse i2c.put_data_reg = ddc_line; 464*771fe6b9SJerome Glisse i2c.get_clk_reg = ddc_line + 4; 465*771fe6b9SJerome Glisse i2c.get_data_reg = ddc_line + 4; 466*771fe6b9SJerome Glisse } else { 467*771fe6b9SJerome Glisse i2c.mask_clk_reg = ddc_line; 468*771fe6b9SJerome Glisse i2c.mask_data_reg = ddc_line; 469*771fe6b9SJerome Glisse i2c.a_clk_reg = ddc_line; 470*771fe6b9SJerome Glisse i2c.a_data_reg = ddc_line; 471*771fe6b9SJerome Glisse i2c.put_clk_reg = ddc_line; 472*771fe6b9SJerome Glisse i2c.put_data_reg = ddc_line; 473*771fe6b9SJerome Glisse i2c.get_clk_reg = ddc_line; 474*771fe6b9SJerome Glisse i2c.get_data_reg = ddc_line; 475*771fe6b9SJerome Glisse } 476*771fe6b9SJerome Glisse 477*771fe6b9SJerome Glisse if (ddc_line) 478*771fe6b9SJerome Glisse i2c.valid = true; 479*771fe6b9SJerome Glisse else 480*771fe6b9SJerome Glisse i2c.valid = false; 481*771fe6b9SJerome Glisse 482*771fe6b9SJerome Glisse return i2c; 483*771fe6b9SJerome Glisse } 484*771fe6b9SJerome Glisse 485*771fe6b9SJerome Glisse bool radeon_combios_get_clock_info(struct drm_device *dev) 486*771fe6b9SJerome Glisse { 487*771fe6b9SJerome Glisse struct radeon_device *rdev = dev->dev_private; 488*771fe6b9SJerome Glisse uint16_t pll_info; 489*771fe6b9SJerome Glisse struct radeon_pll *p1pll = &rdev->clock.p1pll; 490*771fe6b9SJerome Glisse struct radeon_pll *p2pll = &rdev->clock.p2pll; 491*771fe6b9SJerome Glisse struct radeon_pll *spll = &rdev->clock.spll; 492*771fe6b9SJerome Glisse struct radeon_pll *mpll = &rdev->clock.mpll; 493*771fe6b9SJerome Glisse int8_t rev; 494*771fe6b9SJerome Glisse uint16_t sclk, mclk; 495*771fe6b9SJerome Glisse 496*771fe6b9SJerome Glisse if (rdev->bios == NULL) 497*771fe6b9SJerome Glisse return NULL; 498*771fe6b9SJerome Glisse 499*771fe6b9SJerome Glisse pll_info = combios_get_table_offset(dev, COMBIOS_PLL_INFO_TABLE); 500*771fe6b9SJerome Glisse if (pll_info) { 501*771fe6b9SJerome Glisse rev = RBIOS8(pll_info); 502*771fe6b9SJerome Glisse 503*771fe6b9SJerome Glisse /* pixel clocks */ 504*771fe6b9SJerome Glisse p1pll->reference_freq = RBIOS16(pll_info + 0xe); 505*771fe6b9SJerome Glisse p1pll->reference_div = RBIOS16(pll_info + 0x10); 506*771fe6b9SJerome Glisse p1pll->pll_out_min = RBIOS32(pll_info + 0x12); 507*771fe6b9SJerome Glisse p1pll->pll_out_max = RBIOS32(pll_info + 0x16); 508*771fe6b9SJerome Glisse 509*771fe6b9SJerome Glisse if (rev > 9) { 510*771fe6b9SJerome Glisse p1pll->pll_in_min = RBIOS32(pll_info + 0x36); 511*771fe6b9SJerome Glisse p1pll->pll_in_max = RBIOS32(pll_info + 0x3a); 512*771fe6b9SJerome Glisse } else { 513*771fe6b9SJerome Glisse p1pll->pll_in_min = 40; 514*771fe6b9SJerome Glisse p1pll->pll_in_max = 500; 515*771fe6b9SJerome Glisse } 516*771fe6b9SJerome Glisse *p2pll = *p1pll; 517*771fe6b9SJerome Glisse 518*771fe6b9SJerome Glisse /* system clock */ 519*771fe6b9SJerome Glisse spll->reference_freq = RBIOS16(pll_info + 0x1a); 520*771fe6b9SJerome Glisse spll->reference_div = RBIOS16(pll_info + 0x1c); 521*771fe6b9SJerome Glisse spll->pll_out_min = RBIOS32(pll_info + 0x1e); 522*771fe6b9SJerome Glisse spll->pll_out_max = RBIOS32(pll_info + 0x22); 523*771fe6b9SJerome Glisse 524*771fe6b9SJerome Glisse if (rev > 10) { 525*771fe6b9SJerome Glisse spll->pll_in_min = RBIOS32(pll_info + 0x48); 526*771fe6b9SJerome Glisse spll->pll_in_max = RBIOS32(pll_info + 0x4c); 527*771fe6b9SJerome Glisse } else { 528*771fe6b9SJerome Glisse /* ??? */ 529*771fe6b9SJerome Glisse spll->pll_in_min = 40; 530*771fe6b9SJerome Glisse spll->pll_in_max = 500; 531*771fe6b9SJerome Glisse } 532*771fe6b9SJerome Glisse 533*771fe6b9SJerome Glisse /* memory clock */ 534*771fe6b9SJerome Glisse mpll->reference_freq = RBIOS16(pll_info + 0x26); 535*771fe6b9SJerome Glisse mpll->reference_div = RBIOS16(pll_info + 0x28); 536*771fe6b9SJerome Glisse mpll->pll_out_min = RBIOS32(pll_info + 0x2a); 537*771fe6b9SJerome Glisse mpll->pll_out_max = RBIOS32(pll_info + 0x2e); 538*771fe6b9SJerome Glisse 539*771fe6b9SJerome Glisse if (rev > 10) { 540*771fe6b9SJerome Glisse mpll->pll_in_min = RBIOS32(pll_info + 0x5a); 541*771fe6b9SJerome Glisse mpll->pll_in_max = RBIOS32(pll_info + 0x5e); 542*771fe6b9SJerome Glisse } else { 543*771fe6b9SJerome Glisse /* ??? */ 544*771fe6b9SJerome Glisse mpll->pll_in_min = 40; 545*771fe6b9SJerome Glisse mpll->pll_in_max = 500; 546*771fe6b9SJerome Glisse } 547*771fe6b9SJerome Glisse 548*771fe6b9SJerome Glisse /* default sclk/mclk */ 549*771fe6b9SJerome Glisse sclk = RBIOS16(pll_info + 0xa); 550*771fe6b9SJerome Glisse mclk = RBIOS16(pll_info + 0x8); 551*771fe6b9SJerome Glisse if (sclk == 0) 552*771fe6b9SJerome Glisse sclk = 200 * 100; 553*771fe6b9SJerome Glisse if (mclk == 0) 554*771fe6b9SJerome Glisse mclk = 200 * 100; 555*771fe6b9SJerome Glisse 556*771fe6b9SJerome Glisse rdev->clock.default_sclk = sclk; 557*771fe6b9SJerome Glisse rdev->clock.default_mclk = mclk; 558*771fe6b9SJerome Glisse 559*771fe6b9SJerome Glisse return true; 560*771fe6b9SJerome Glisse } 561*771fe6b9SJerome Glisse return false; 562*771fe6b9SJerome Glisse } 563*771fe6b9SJerome Glisse 564*771fe6b9SJerome Glisse struct radeon_encoder_primary_dac *radeon_combios_get_primary_dac_info(struct 565*771fe6b9SJerome Glisse radeon_encoder 566*771fe6b9SJerome Glisse *encoder) 567*771fe6b9SJerome Glisse { 568*771fe6b9SJerome Glisse struct drm_device *dev = encoder->base.dev; 569*771fe6b9SJerome Glisse struct radeon_device *rdev = dev->dev_private; 570*771fe6b9SJerome Glisse uint16_t dac_info; 571*771fe6b9SJerome Glisse uint8_t rev, bg, dac; 572*771fe6b9SJerome Glisse struct radeon_encoder_primary_dac *p_dac = NULL; 573*771fe6b9SJerome Glisse 574*771fe6b9SJerome Glisse if (rdev->bios == NULL) 575*771fe6b9SJerome Glisse return NULL; 576*771fe6b9SJerome Glisse 577*771fe6b9SJerome Glisse /* check CRT table */ 578*771fe6b9SJerome Glisse dac_info = combios_get_table_offset(dev, COMBIOS_CRT_INFO_TABLE); 579*771fe6b9SJerome Glisse if (dac_info) { 580*771fe6b9SJerome Glisse p_dac = 581*771fe6b9SJerome Glisse kzalloc(sizeof(struct radeon_encoder_primary_dac), 582*771fe6b9SJerome Glisse GFP_KERNEL); 583*771fe6b9SJerome Glisse 584*771fe6b9SJerome Glisse if (!p_dac) 585*771fe6b9SJerome Glisse return NULL; 586*771fe6b9SJerome Glisse 587*771fe6b9SJerome Glisse rev = RBIOS8(dac_info) & 0x3; 588*771fe6b9SJerome Glisse if (rev < 2) { 589*771fe6b9SJerome Glisse bg = RBIOS8(dac_info + 0x2) & 0xf; 590*771fe6b9SJerome Glisse dac = (RBIOS8(dac_info + 0x2) >> 4) & 0xf; 591*771fe6b9SJerome Glisse p_dac->ps2_pdac_adj = (bg << 8) | (dac); 592*771fe6b9SJerome Glisse } else { 593*771fe6b9SJerome Glisse bg = RBIOS8(dac_info + 0x2) & 0xf; 594*771fe6b9SJerome Glisse dac = RBIOS8(dac_info + 0x3) & 0xf; 595*771fe6b9SJerome Glisse p_dac->ps2_pdac_adj = (bg << 8) | (dac); 596*771fe6b9SJerome Glisse } 597*771fe6b9SJerome Glisse 598*771fe6b9SJerome Glisse } 599*771fe6b9SJerome Glisse 600*771fe6b9SJerome Glisse return p_dac; 601*771fe6b9SJerome Glisse } 602*771fe6b9SJerome Glisse 603*771fe6b9SJerome Glisse static enum radeon_tv_std 604*771fe6b9SJerome Glisse radeon_combios_get_tv_info(struct radeon_encoder *encoder) 605*771fe6b9SJerome Glisse { 606*771fe6b9SJerome Glisse struct drm_device *dev = encoder->base.dev; 607*771fe6b9SJerome Glisse struct radeon_device *rdev = dev->dev_private; 608*771fe6b9SJerome Glisse uint16_t tv_info; 609*771fe6b9SJerome Glisse enum radeon_tv_std tv_std = TV_STD_NTSC; 610*771fe6b9SJerome Glisse 611*771fe6b9SJerome Glisse tv_info = combios_get_table_offset(dev, COMBIOS_TV_INFO_TABLE); 612*771fe6b9SJerome Glisse if (tv_info) { 613*771fe6b9SJerome Glisse if (RBIOS8(tv_info + 6) == 'T') { 614*771fe6b9SJerome Glisse switch (RBIOS8(tv_info + 7) & 0xf) { 615*771fe6b9SJerome Glisse case 1: 616*771fe6b9SJerome Glisse tv_std = TV_STD_NTSC; 617*771fe6b9SJerome Glisse DRM_INFO("Default TV standard: NTSC\n"); 618*771fe6b9SJerome Glisse break; 619*771fe6b9SJerome Glisse case 2: 620*771fe6b9SJerome Glisse tv_std = TV_STD_PAL; 621*771fe6b9SJerome Glisse DRM_INFO("Default TV standard: PAL\n"); 622*771fe6b9SJerome Glisse break; 623*771fe6b9SJerome Glisse case 3: 624*771fe6b9SJerome Glisse tv_std = TV_STD_PAL_M; 625*771fe6b9SJerome Glisse DRM_INFO("Default TV standard: PAL-M\n"); 626*771fe6b9SJerome Glisse break; 627*771fe6b9SJerome Glisse case 4: 628*771fe6b9SJerome Glisse tv_std = TV_STD_PAL_60; 629*771fe6b9SJerome Glisse DRM_INFO("Default TV standard: PAL-60\n"); 630*771fe6b9SJerome Glisse break; 631*771fe6b9SJerome Glisse case 5: 632*771fe6b9SJerome Glisse tv_std = TV_STD_NTSC_J; 633*771fe6b9SJerome Glisse DRM_INFO("Default TV standard: NTSC-J\n"); 634*771fe6b9SJerome Glisse break; 635*771fe6b9SJerome Glisse case 6: 636*771fe6b9SJerome Glisse tv_std = TV_STD_SCART_PAL; 637*771fe6b9SJerome Glisse DRM_INFO("Default TV standard: SCART-PAL\n"); 638*771fe6b9SJerome Glisse break; 639*771fe6b9SJerome Glisse default: 640*771fe6b9SJerome Glisse tv_std = TV_STD_NTSC; 641*771fe6b9SJerome Glisse DRM_INFO 642*771fe6b9SJerome Glisse ("Unknown TV standard; defaulting to NTSC\n"); 643*771fe6b9SJerome Glisse break; 644*771fe6b9SJerome Glisse } 645*771fe6b9SJerome Glisse 646*771fe6b9SJerome Glisse switch ((RBIOS8(tv_info + 9) >> 2) & 0x3) { 647*771fe6b9SJerome Glisse case 0: 648*771fe6b9SJerome Glisse DRM_INFO("29.498928713 MHz TV ref clk\n"); 649*771fe6b9SJerome Glisse break; 650*771fe6b9SJerome Glisse case 1: 651*771fe6b9SJerome Glisse DRM_INFO("28.636360000 MHz TV ref clk\n"); 652*771fe6b9SJerome Glisse break; 653*771fe6b9SJerome Glisse case 2: 654*771fe6b9SJerome Glisse DRM_INFO("14.318180000 MHz TV ref clk\n"); 655*771fe6b9SJerome Glisse break; 656*771fe6b9SJerome Glisse case 3: 657*771fe6b9SJerome Glisse DRM_INFO("27.000000000 MHz TV ref clk\n"); 658*771fe6b9SJerome Glisse break; 659*771fe6b9SJerome Glisse default: 660*771fe6b9SJerome Glisse break; 661*771fe6b9SJerome Glisse } 662*771fe6b9SJerome Glisse } 663*771fe6b9SJerome Glisse } 664*771fe6b9SJerome Glisse return tv_std; 665*771fe6b9SJerome Glisse } 666*771fe6b9SJerome Glisse 667*771fe6b9SJerome Glisse static const uint32_t default_tvdac_adj[CHIP_LAST] = { 668*771fe6b9SJerome Glisse 0x00000000, /* r100 */ 669*771fe6b9SJerome Glisse 0x00280000, /* rv100 */ 670*771fe6b9SJerome Glisse 0x00000000, /* rs100 */ 671*771fe6b9SJerome Glisse 0x00880000, /* rv200 */ 672*771fe6b9SJerome Glisse 0x00000000, /* rs200 */ 673*771fe6b9SJerome Glisse 0x00000000, /* r200 */ 674*771fe6b9SJerome Glisse 0x00770000, /* rv250 */ 675*771fe6b9SJerome Glisse 0x00290000, /* rs300 */ 676*771fe6b9SJerome Glisse 0x00560000, /* rv280 */ 677*771fe6b9SJerome Glisse 0x00780000, /* r300 */ 678*771fe6b9SJerome Glisse 0x00770000, /* r350 */ 679*771fe6b9SJerome Glisse 0x00780000, /* rv350 */ 680*771fe6b9SJerome Glisse 0x00780000, /* rv380 */ 681*771fe6b9SJerome Glisse 0x01080000, /* r420 */ 682*771fe6b9SJerome Glisse 0x01080000, /* r423 */ 683*771fe6b9SJerome Glisse 0x01080000, /* rv410 */ 684*771fe6b9SJerome Glisse 0x00780000, /* rs400 */ 685*771fe6b9SJerome Glisse 0x00780000, /* rs480 */ 686*771fe6b9SJerome Glisse }; 687*771fe6b9SJerome Glisse 688*771fe6b9SJerome Glisse static struct radeon_encoder_tv_dac 689*771fe6b9SJerome Glisse *radeon_legacy_get_tv_dac_info_from_table(struct radeon_device *rdev) 690*771fe6b9SJerome Glisse { 691*771fe6b9SJerome Glisse struct radeon_encoder_tv_dac *tv_dac = NULL; 692*771fe6b9SJerome Glisse 693*771fe6b9SJerome Glisse tv_dac = kzalloc(sizeof(struct radeon_encoder_tv_dac), GFP_KERNEL); 694*771fe6b9SJerome Glisse 695*771fe6b9SJerome Glisse if (!tv_dac) 696*771fe6b9SJerome Glisse return NULL; 697*771fe6b9SJerome Glisse 698*771fe6b9SJerome Glisse tv_dac->ps2_tvdac_adj = default_tvdac_adj[rdev->family]; 699*771fe6b9SJerome Glisse if ((rdev->flags & RADEON_IS_MOBILITY) && (rdev->family == CHIP_RV250)) 700*771fe6b9SJerome Glisse tv_dac->ps2_tvdac_adj = 0x00880000; 701*771fe6b9SJerome Glisse tv_dac->pal_tvdac_adj = tv_dac->ps2_tvdac_adj; 702*771fe6b9SJerome Glisse tv_dac->ntsc_tvdac_adj = tv_dac->ps2_tvdac_adj; 703*771fe6b9SJerome Glisse 704*771fe6b9SJerome Glisse return tv_dac; 705*771fe6b9SJerome Glisse } 706*771fe6b9SJerome Glisse 707*771fe6b9SJerome Glisse struct radeon_encoder_tv_dac *radeon_combios_get_tv_dac_info(struct 708*771fe6b9SJerome Glisse radeon_encoder 709*771fe6b9SJerome Glisse *encoder) 710*771fe6b9SJerome Glisse { 711*771fe6b9SJerome Glisse struct drm_device *dev = encoder->base.dev; 712*771fe6b9SJerome Glisse struct radeon_device *rdev = dev->dev_private; 713*771fe6b9SJerome Glisse uint16_t dac_info; 714*771fe6b9SJerome Glisse uint8_t rev, bg, dac; 715*771fe6b9SJerome Glisse struct radeon_encoder_tv_dac *tv_dac = NULL; 716*771fe6b9SJerome Glisse 717*771fe6b9SJerome Glisse if (rdev->bios == NULL) 718*771fe6b9SJerome Glisse return radeon_legacy_get_tv_dac_info_from_table(rdev); 719*771fe6b9SJerome Glisse 720*771fe6b9SJerome Glisse /* first check TV table */ 721*771fe6b9SJerome Glisse dac_info = combios_get_table_offset(dev, COMBIOS_TV_INFO_TABLE); 722*771fe6b9SJerome Glisse if (dac_info) { 723*771fe6b9SJerome Glisse tv_dac = 724*771fe6b9SJerome Glisse kzalloc(sizeof(struct radeon_encoder_tv_dac), GFP_KERNEL); 725*771fe6b9SJerome Glisse 726*771fe6b9SJerome Glisse if (!tv_dac) 727*771fe6b9SJerome Glisse return NULL; 728*771fe6b9SJerome Glisse 729*771fe6b9SJerome Glisse rev = RBIOS8(dac_info + 0x3); 730*771fe6b9SJerome Glisse if (rev > 4) { 731*771fe6b9SJerome Glisse bg = RBIOS8(dac_info + 0xc) & 0xf; 732*771fe6b9SJerome Glisse dac = RBIOS8(dac_info + 0xd) & 0xf; 733*771fe6b9SJerome Glisse tv_dac->ps2_tvdac_adj = (bg << 16) | (dac << 20); 734*771fe6b9SJerome Glisse 735*771fe6b9SJerome Glisse bg = RBIOS8(dac_info + 0xe) & 0xf; 736*771fe6b9SJerome Glisse dac = RBIOS8(dac_info + 0xf) & 0xf; 737*771fe6b9SJerome Glisse tv_dac->pal_tvdac_adj = (bg << 16) | (dac << 20); 738*771fe6b9SJerome Glisse 739*771fe6b9SJerome Glisse bg = RBIOS8(dac_info + 0x10) & 0xf; 740*771fe6b9SJerome Glisse dac = RBIOS8(dac_info + 0x11) & 0xf; 741*771fe6b9SJerome Glisse tv_dac->ntsc_tvdac_adj = (bg << 16) | (dac << 20); 742*771fe6b9SJerome Glisse } else if (rev > 1) { 743*771fe6b9SJerome Glisse bg = RBIOS8(dac_info + 0xc) & 0xf; 744*771fe6b9SJerome Glisse dac = (RBIOS8(dac_info + 0xc) >> 4) & 0xf; 745*771fe6b9SJerome Glisse tv_dac->ps2_tvdac_adj = (bg << 16) | (dac << 20); 746*771fe6b9SJerome Glisse 747*771fe6b9SJerome Glisse bg = RBIOS8(dac_info + 0xd) & 0xf; 748*771fe6b9SJerome Glisse dac = (RBIOS8(dac_info + 0xd) >> 4) & 0xf; 749*771fe6b9SJerome Glisse tv_dac->pal_tvdac_adj = (bg << 16) | (dac << 20); 750*771fe6b9SJerome Glisse 751*771fe6b9SJerome Glisse bg = RBIOS8(dac_info + 0xe) & 0xf; 752*771fe6b9SJerome Glisse dac = (RBIOS8(dac_info + 0xe) >> 4) & 0xf; 753*771fe6b9SJerome Glisse tv_dac->ntsc_tvdac_adj = (bg << 16) | (dac << 20); 754*771fe6b9SJerome Glisse } 755*771fe6b9SJerome Glisse 756*771fe6b9SJerome Glisse tv_dac->tv_std = radeon_combios_get_tv_info(encoder); 757*771fe6b9SJerome Glisse 758*771fe6b9SJerome Glisse } else { 759*771fe6b9SJerome Glisse /* then check CRT table */ 760*771fe6b9SJerome Glisse dac_info = 761*771fe6b9SJerome Glisse combios_get_table_offset(dev, COMBIOS_CRT_INFO_TABLE); 762*771fe6b9SJerome Glisse if (dac_info) { 763*771fe6b9SJerome Glisse tv_dac = 764*771fe6b9SJerome Glisse kzalloc(sizeof(struct radeon_encoder_tv_dac), 765*771fe6b9SJerome Glisse GFP_KERNEL); 766*771fe6b9SJerome Glisse 767*771fe6b9SJerome Glisse if (!tv_dac) 768*771fe6b9SJerome Glisse return NULL; 769*771fe6b9SJerome Glisse 770*771fe6b9SJerome Glisse rev = RBIOS8(dac_info) & 0x3; 771*771fe6b9SJerome Glisse if (rev < 2) { 772*771fe6b9SJerome Glisse bg = RBIOS8(dac_info + 0x3) & 0xf; 773*771fe6b9SJerome Glisse dac = (RBIOS8(dac_info + 0x3) >> 4) & 0xf; 774*771fe6b9SJerome Glisse tv_dac->ps2_tvdac_adj = 775*771fe6b9SJerome Glisse (bg << 16) | (dac << 20); 776*771fe6b9SJerome Glisse tv_dac->pal_tvdac_adj = tv_dac->ps2_tvdac_adj; 777*771fe6b9SJerome Glisse tv_dac->ntsc_tvdac_adj = tv_dac->ps2_tvdac_adj; 778*771fe6b9SJerome Glisse } else { 779*771fe6b9SJerome Glisse bg = RBIOS8(dac_info + 0x4) & 0xf; 780*771fe6b9SJerome Glisse dac = RBIOS8(dac_info + 0x5) & 0xf; 781*771fe6b9SJerome Glisse tv_dac->ps2_tvdac_adj = 782*771fe6b9SJerome Glisse (bg << 16) | (dac << 20); 783*771fe6b9SJerome Glisse tv_dac->pal_tvdac_adj = tv_dac->ps2_tvdac_adj; 784*771fe6b9SJerome Glisse tv_dac->ntsc_tvdac_adj = tv_dac->ps2_tvdac_adj; 785*771fe6b9SJerome Glisse } 786*771fe6b9SJerome Glisse } 787*771fe6b9SJerome Glisse } 788*771fe6b9SJerome Glisse 789*771fe6b9SJerome Glisse return tv_dac; 790*771fe6b9SJerome Glisse } 791*771fe6b9SJerome Glisse 792*771fe6b9SJerome Glisse static struct radeon_encoder_lvds *radeon_legacy_get_lvds_info_from_regs(struct 793*771fe6b9SJerome Glisse radeon_device 794*771fe6b9SJerome Glisse *rdev) 795*771fe6b9SJerome Glisse { 796*771fe6b9SJerome Glisse struct radeon_encoder_lvds *lvds = NULL; 797*771fe6b9SJerome Glisse uint32_t fp_vert_stretch, fp_horz_stretch; 798*771fe6b9SJerome Glisse uint32_t ppll_div_sel, ppll_val; 799*771fe6b9SJerome Glisse 800*771fe6b9SJerome Glisse lvds = kzalloc(sizeof(struct radeon_encoder_lvds), GFP_KERNEL); 801*771fe6b9SJerome Glisse 802*771fe6b9SJerome Glisse if (!lvds) 803*771fe6b9SJerome Glisse return NULL; 804*771fe6b9SJerome Glisse 805*771fe6b9SJerome Glisse fp_vert_stretch = RREG32(RADEON_FP_VERT_STRETCH); 806*771fe6b9SJerome Glisse fp_horz_stretch = RREG32(RADEON_FP_HORZ_STRETCH); 807*771fe6b9SJerome Glisse 808*771fe6b9SJerome Glisse if (fp_vert_stretch & RADEON_VERT_STRETCH_ENABLE) 809*771fe6b9SJerome Glisse lvds->native_mode.panel_yres = 810*771fe6b9SJerome Glisse ((fp_vert_stretch & RADEON_VERT_PANEL_SIZE) >> 811*771fe6b9SJerome Glisse RADEON_VERT_PANEL_SHIFT) + 1; 812*771fe6b9SJerome Glisse else 813*771fe6b9SJerome Glisse lvds->native_mode.panel_yres = 814*771fe6b9SJerome Glisse (RREG32(RADEON_CRTC_V_TOTAL_DISP) >> 16) + 1; 815*771fe6b9SJerome Glisse 816*771fe6b9SJerome Glisse if (fp_horz_stretch & RADEON_HORZ_STRETCH_ENABLE) 817*771fe6b9SJerome Glisse lvds->native_mode.panel_xres = 818*771fe6b9SJerome Glisse (((fp_horz_stretch & RADEON_HORZ_PANEL_SIZE) >> 819*771fe6b9SJerome Glisse RADEON_HORZ_PANEL_SHIFT) + 1) * 8; 820*771fe6b9SJerome Glisse else 821*771fe6b9SJerome Glisse lvds->native_mode.panel_xres = 822*771fe6b9SJerome Glisse ((RREG32(RADEON_CRTC_H_TOTAL_DISP) >> 16) + 1) * 8; 823*771fe6b9SJerome Glisse 824*771fe6b9SJerome Glisse if ((lvds->native_mode.panel_xres < 640) || 825*771fe6b9SJerome Glisse (lvds->native_mode.panel_yres < 480)) { 826*771fe6b9SJerome Glisse lvds->native_mode.panel_xres = 640; 827*771fe6b9SJerome Glisse lvds->native_mode.panel_yres = 480; 828*771fe6b9SJerome Glisse } 829*771fe6b9SJerome Glisse 830*771fe6b9SJerome Glisse ppll_div_sel = RREG8(RADEON_CLOCK_CNTL_INDEX + 1) & 0x3; 831*771fe6b9SJerome Glisse ppll_val = RREG32_PLL(RADEON_PPLL_DIV_0 + ppll_div_sel); 832*771fe6b9SJerome Glisse if ((ppll_val & 0x000707ff) == 0x1bb) 833*771fe6b9SJerome Glisse lvds->use_bios_dividers = false; 834*771fe6b9SJerome Glisse else { 835*771fe6b9SJerome Glisse lvds->panel_ref_divider = 836*771fe6b9SJerome Glisse RREG32_PLL(RADEON_PPLL_REF_DIV) & 0x3ff; 837*771fe6b9SJerome Glisse lvds->panel_post_divider = (ppll_val >> 16) & 0x7; 838*771fe6b9SJerome Glisse lvds->panel_fb_divider = ppll_val & 0x7ff; 839*771fe6b9SJerome Glisse 840*771fe6b9SJerome Glisse if ((lvds->panel_ref_divider != 0) && 841*771fe6b9SJerome Glisse (lvds->panel_fb_divider > 3)) 842*771fe6b9SJerome Glisse lvds->use_bios_dividers = true; 843*771fe6b9SJerome Glisse } 844*771fe6b9SJerome Glisse lvds->panel_vcc_delay = 200; 845*771fe6b9SJerome Glisse 846*771fe6b9SJerome Glisse DRM_INFO("Panel info derived from registers\n"); 847*771fe6b9SJerome Glisse DRM_INFO("Panel Size %dx%d\n", lvds->native_mode.panel_xres, 848*771fe6b9SJerome Glisse lvds->native_mode.panel_yres); 849*771fe6b9SJerome Glisse 850*771fe6b9SJerome Glisse return lvds; 851*771fe6b9SJerome Glisse } 852*771fe6b9SJerome Glisse 853*771fe6b9SJerome Glisse struct radeon_encoder_lvds *radeon_combios_get_lvds_info(struct radeon_encoder 854*771fe6b9SJerome Glisse *encoder) 855*771fe6b9SJerome Glisse { 856*771fe6b9SJerome Glisse struct drm_device *dev = encoder->base.dev; 857*771fe6b9SJerome Glisse struct radeon_device *rdev = dev->dev_private; 858*771fe6b9SJerome Glisse uint16_t lcd_info; 859*771fe6b9SJerome Glisse uint32_t panel_setup; 860*771fe6b9SJerome Glisse char stmp[30]; 861*771fe6b9SJerome Glisse int tmp, i; 862*771fe6b9SJerome Glisse struct radeon_encoder_lvds *lvds = NULL; 863*771fe6b9SJerome Glisse 864*771fe6b9SJerome Glisse if (rdev->bios == NULL) 865*771fe6b9SJerome Glisse return radeon_legacy_get_lvds_info_from_regs(rdev); 866*771fe6b9SJerome Glisse 867*771fe6b9SJerome Glisse lcd_info = combios_get_table_offset(dev, COMBIOS_LCD_INFO_TABLE); 868*771fe6b9SJerome Glisse 869*771fe6b9SJerome Glisse if (lcd_info) { 870*771fe6b9SJerome Glisse lvds = kzalloc(sizeof(struct radeon_encoder_lvds), GFP_KERNEL); 871*771fe6b9SJerome Glisse 872*771fe6b9SJerome Glisse if (!lvds) 873*771fe6b9SJerome Glisse return NULL; 874*771fe6b9SJerome Glisse 875*771fe6b9SJerome Glisse for (i = 0; i < 24; i++) 876*771fe6b9SJerome Glisse stmp[i] = RBIOS8(lcd_info + i + 1); 877*771fe6b9SJerome Glisse stmp[24] = 0; 878*771fe6b9SJerome Glisse 879*771fe6b9SJerome Glisse DRM_INFO("Panel ID String: %s\n", stmp); 880*771fe6b9SJerome Glisse 881*771fe6b9SJerome Glisse lvds->native_mode.panel_xres = RBIOS16(lcd_info + 0x19); 882*771fe6b9SJerome Glisse lvds->native_mode.panel_yres = RBIOS16(lcd_info + 0x1b); 883*771fe6b9SJerome Glisse 884*771fe6b9SJerome Glisse DRM_INFO("Panel Size %dx%d\n", lvds->native_mode.panel_xres, 885*771fe6b9SJerome Glisse lvds->native_mode.panel_yres); 886*771fe6b9SJerome Glisse 887*771fe6b9SJerome Glisse lvds->panel_vcc_delay = RBIOS16(lcd_info + 0x2c); 888*771fe6b9SJerome Glisse if (lvds->panel_vcc_delay > 2000 || lvds->panel_vcc_delay < 0) 889*771fe6b9SJerome Glisse lvds->panel_vcc_delay = 2000; 890*771fe6b9SJerome Glisse 891*771fe6b9SJerome Glisse lvds->panel_pwr_delay = RBIOS8(lcd_info + 0x24); 892*771fe6b9SJerome Glisse lvds->panel_digon_delay = RBIOS16(lcd_info + 0x38) & 0xf; 893*771fe6b9SJerome Glisse lvds->panel_blon_delay = (RBIOS16(lcd_info + 0x38) >> 4) & 0xf; 894*771fe6b9SJerome Glisse 895*771fe6b9SJerome Glisse lvds->panel_ref_divider = RBIOS16(lcd_info + 0x2e); 896*771fe6b9SJerome Glisse lvds->panel_post_divider = RBIOS8(lcd_info + 0x30); 897*771fe6b9SJerome Glisse lvds->panel_fb_divider = RBIOS16(lcd_info + 0x31); 898*771fe6b9SJerome Glisse if ((lvds->panel_ref_divider != 0) && 899*771fe6b9SJerome Glisse (lvds->panel_fb_divider > 3)) 900*771fe6b9SJerome Glisse lvds->use_bios_dividers = true; 901*771fe6b9SJerome Glisse 902*771fe6b9SJerome Glisse panel_setup = RBIOS32(lcd_info + 0x39); 903*771fe6b9SJerome Glisse lvds->lvds_gen_cntl = 0xff00; 904*771fe6b9SJerome Glisse if (panel_setup & 0x1) 905*771fe6b9SJerome Glisse lvds->lvds_gen_cntl |= RADEON_LVDS_PANEL_FORMAT; 906*771fe6b9SJerome Glisse 907*771fe6b9SJerome Glisse if ((panel_setup >> 4) & 0x1) 908*771fe6b9SJerome Glisse lvds->lvds_gen_cntl |= RADEON_LVDS_PANEL_TYPE; 909*771fe6b9SJerome Glisse 910*771fe6b9SJerome Glisse switch ((panel_setup >> 8) & 0x7) { 911*771fe6b9SJerome Glisse case 0: 912*771fe6b9SJerome Glisse lvds->lvds_gen_cntl |= RADEON_LVDS_NO_FM; 913*771fe6b9SJerome Glisse break; 914*771fe6b9SJerome Glisse case 1: 915*771fe6b9SJerome Glisse lvds->lvds_gen_cntl |= RADEON_LVDS_2_GREY; 916*771fe6b9SJerome Glisse break; 917*771fe6b9SJerome Glisse case 2: 918*771fe6b9SJerome Glisse lvds->lvds_gen_cntl |= RADEON_LVDS_4_GREY; 919*771fe6b9SJerome Glisse break; 920*771fe6b9SJerome Glisse default: 921*771fe6b9SJerome Glisse break; 922*771fe6b9SJerome Glisse } 923*771fe6b9SJerome Glisse 924*771fe6b9SJerome Glisse if ((panel_setup >> 16) & 0x1) 925*771fe6b9SJerome Glisse lvds->lvds_gen_cntl |= RADEON_LVDS_FP_POL_LOW; 926*771fe6b9SJerome Glisse 927*771fe6b9SJerome Glisse if ((panel_setup >> 17) & 0x1) 928*771fe6b9SJerome Glisse lvds->lvds_gen_cntl |= RADEON_LVDS_LP_POL_LOW; 929*771fe6b9SJerome Glisse 930*771fe6b9SJerome Glisse if ((panel_setup >> 18) & 0x1) 931*771fe6b9SJerome Glisse lvds->lvds_gen_cntl |= RADEON_LVDS_DTM_POL_LOW; 932*771fe6b9SJerome Glisse 933*771fe6b9SJerome Glisse if ((panel_setup >> 23) & 0x1) 934*771fe6b9SJerome Glisse lvds->lvds_gen_cntl |= RADEON_LVDS_BL_CLK_SEL; 935*771fe6b9SJerome Glisse 936*771fe6b9SJerome Glisse lvds->lvds_gen_cntl |= (panel_setup & 0xf0000000); 937*771fe6b9SJerome Glisse 938*771fe6b9SJerome Glisse for (i = 0; i < 32; i++) { 939*771fe6b9SJerome Glisse tmp = RBIOS16(lcd_info + 64 + i * 2); 940*771fe6b9SJerome Glisse if (tmp == 0) 941*771fe6b9SJerome Glisse break; 942*771fe6b9SJerome Glisse 943*771fe6b9SJerome Glisse if ((RBIOS16(tmp) == lvds->native_mode.panel_xres) && 944*771fe6b9SJerome Glisse (RBIOS16(tmp + 2) == 945*771fe6b9SJerome Glisse lvds->native_mode.panel_yres)) { 946*771fe6b9SJerome Glisse lvds->native_mode.hblank = 947*771fe6b9SJerome Glisse (RBIOS16(tmp + 17) - RBIOS16(tmp + 19)) * 8; 948*771fe6b9SJerome Glisse lvds->native_mode.hoverplus = 949*771fe6b9SJerome Glisse (RBIOS16(tmp + 21) - RBIOS16(tmp + 19) - 950*771fe6b9SJerome Glisse 1) * 8; 951*771fe6b9SJerome Glisse lvds->native_mode.hsync_width = 952*771fe6b9SJerome Glisse RBIOS8(tmp + 23) * 8; 953*771fe6b9SJerome Glisse 954*771fe6b9SJerome Glisse lvds->native_mode.vblank = (RBIOS16(tmp + 24) - 955*771fe6b9SJerome Glisse RBIOS16(tmp + 26)); 956*771fe6b9SJerome Glisse lvds->native_mode.voverplus = 957*771fe6b9SJerome Glisse ((RBIOS16(tmp + 28) & 0x7ff) - 958*771fe6b9SJerome Glisse RBIOS16(tmp + 26)); 959*771fe6b9SJerome Glisse lvds->native_mode.vsync_width = 960*771fe6b9SJerome Glisse ((RBIOS16(tmp + 28) & 0xf800) >> 11); 961*771fe6b9SJerome Glisse lvds->native_mode.dotclock = 962*771fe6b9SJerome Glisse RBIOS16(tmp + 9) * 10; 963*771fe6b9SJerome Glisse lvds->native_mode.flags = 0; 964*771fe6b9SJerome Glisse } 965*771fe6b9SJerome Glisse } 966*771fe6b9SJerome Glisse encoder->native_mode = lvds->native_mode; 967*771fe6b9SJerome Glisse } else 968*771fe6b9SJerome Glisse DRM_INFO("No panel info found in BIOS\n"); 969*771fe6b9SJerome Glisse return lvds; 970*771fe6b9SJerome Glisse } 971*771fe6b9SJerome Glisse 972*771fe6b9SJerome Glisse static const struct radeon_tmds_pll default_tmds_pll[CHIP_LAST][4] = { 973*771fe6b9SJerome Glisse {{12000, 0xa1b}, {0xffffffff, 0xa3f}, {0, 0}, {0, 0}}, /* CHIP_R100 */ 974*771fe6b9SJerome Glisse {{12000, 0xa1b}, {0xffffffff, 0xa3f}, {0, 0}, {0, 0}}, /* CHIP_RV100 */ 975*771fe6b9SJerome Glisse {{0, 0}, {0, 0}, {0, 0}, {0, 0}}, /* CHIP_RS100 */ 976*771fe6b9SJerome Glisse {{15000, 0xa1b}, {0xffffffff, 0xa3f}, {0, 0}, {0, 0}}, /* CHIP_RV200 */ 977*771fe6b9SJerome Glisse {{12000, 0xa1b}, {0xffffffff, 0xa3f}, {0, 0}, {0, 0}}, /* CHIP_RS200 */ 978*771fe6b9SJerome Glisse {{15000, 0xa1b}, {0xffffffff, 0xa3f}, {0, 0}, {0, 0}}, /* CHIP_R200 */ 979*771fe6b9SJerome Glisse {{15500, 0x81b}, {0xffffffff, 0x83f}, {0, 0}, {0, 0}}, /* CHIP_RV250 */ 980*771fe6b9SJerome Glisse {{0, 0}, {0, 0}, {0, 0}, {0, 0}}, /* CHIP_RS300 */ 981*771fe6b9SJerome Glisse {{13000, 0x400f4}, {15000, 0x400f7}, {0xffffffff, 0x40111}, {0, 0}}, /* CHIP_RV280 */ 982*771fe6b9SJerome Glisse {{0xffffffff, 0xb01cb}, {0, 0}, {0, 0}, {0, 0}}, /* CHIP_R300 */ 983*771fe6b9SJerome Glisse {{0xffffffff, 0xb01cb}, {0, 0}, {0, 0}, {0, 0}}, /* CHIP_R350 */ 984*771fe6b9SJerome Glisse {{15000, 0xb0155}, {0xffffffff, 0xb01cb}, {0, 0}, {0, 0}}, /* CHIP_RV350 */ 985*771fe6b9SJerome Glisse {{15000, 0xb0155}, {0xffffffff, 0xb01cb}, {0, 0}, {0, 0}}, /* CHIP_RV380 */ 986*771fe6b9SJerome Glisse {{0xffffffff, 0xb01cb}, {0, 0}, {0, 0}, {0, 0}}, /* CHIP_R420 */ 987*771fe6b9SJerome Glisse {{0xffffffff, 0xb01cb}, {0, 0}, {0, 0}, {0, 0}}, /* CHIP_R423 */ 988*771fe6b9SJerome Glisse {{0xffffffff, 0xb01cb}, {0, 0}, {0, 0}, {0, 0}}, /* CHIP_RV410 */ 989*771fe6b9SJerome Glisse {{15000, 0xb0155}, {0xffffffff, 0xb01cb}, {0, 0}, {0, 0}}, /* CHIP_RS400 */ 990*771fe6b9SJerome Glisse {{15000, 0xb0155}, {0xffffffff, 0xb01cb}, {0, 0}, {0, 0}}, /* CHIP_RS480 */ 991*771fe6b9SJerome Glisse }; 992*771fe6b9SJerome Glisse 993*771fe6b9SJerome Glisse static struct radeon_encoder_int_tmds 994*771fe6b9SJerome Glisse *radeon_legacy_get_tmds_info_from_table(struct radeon_device *rdev) 995*771fe6b9SJerome Glisse { 996*771fe6b9SJerome Glisse int i; 997*771fe6b9SJerome Glisse struct radeon_encoder_int_tmds *tmds = NULL; 998*771fe6b9SJerome Glisse 999*771fe6b9SJerome Glisse tmds = kzalloc(sizeof(struct radeon_encoder_int_tmds), GFP_KERNEL); 1000*771fe6b9SJerome Glisse 1001*771fe6b9SJerome Glisse if (!tmds) 1002*771fe6b9SJerome Glisse return NULL; 1003*771fe6b9SJerome Glisse 1004*771fe6b9SJerome Glisse for (i = 0; i < 4; i++) { 1005*771fe6b9SJerome Glisse tmds->tmds_pll[i].value = 1006*771fe6b9SJerome Glisse default_tmds_pll[rdev->family][i].value; 1007*771fe6b9SJerome Glisse tmds->tmds_pll[i].freq = default_tmds_pll[rdev->family][i].freq; 1008*771fe6b9SJerome Glisse } 1009*771fe6b9SJerome Glisse 1010*771fe6b9SJerome Glisse return tmds; 1011*771fe6b9SJerome Glisse } 1012*771fe6b9SJerome Glisse 1013*771fe6b9SJerome Glisse struct radeon_encoder_int_tmds *radeon_combios_get_tmds_info(struct 1014*771fe6b9SJerome Glisse radeon_encoder 1015*771fe6b9SJerome Glisse *encoder) 1016*771fe6b9SJerome Glisse { 1017*771fe6b9SJerome Glisse struct drm_device *dev = encoder->base.dev; 1018*771fe6b9SJerome Glisse struct radeon_device *rdev = dev->dev_private; 1019*771fe6b9SJerome Glisse uint16_t tmds_info; 1020*771fe6b9SJerome Glisse int i, n; 1021*771fe6b9SJerome Glisse uint8_t ver; 1022*771fe6b9SJerome Glisse struct radeon_encoder_int_tmds *tmds = NULL; 1023*771fe6b9SJerome Glisse 1024*771fe6b9SJerome Glisse if (rdev->bios == NULL) 1025*771fe6b9SJerome Glisse return radeon_legacy_get_tmds_info_from_table(rdev); 1026*771fe6b9SJerome Glisse 1027*771fe6b9SJerome Glisse tmds_info = combios_get_table_offset(dev, COMBIOS_DFP_INFO_TABLE); 1028*771fe6b9SJerome Glisse 1029*771fe6b9SJerome Glisse if (tmds_info) { 1030*771fe6b9SJerome Glisse tmds = 1031*771fe6b9SJerome Glisse kzalloc(sizeof(struct radeon_encoder_int_tmds), GFP_KERNEL); 1032*771fe6b9SJerome Glisse 1033*771fe6b9SJerome Glisse if (!tmds) 1034*771fe6b9SJerome Glisse return NULL; 1035*771fe6b9SJerome Glisse 1036*771fe6b9SJerome Glisse ver = RBIOS8(tmds_info); 1037*771fe6b9SJerome Glisse DRM_INFO("DFP table revision: %d\n", ver); 1038*771fe6b9SJerome Glisse if (ver == 3) { 1039*771fe6b9SJerome Glisse n = RBIOS8(tmds_info + 5) + 1; 1040*771fe6b9SJerome Glisse if (n > 4) 1041*771fe6b9SJerome Glisse n = 4; 1042*771fe6b9SJerome Glisse for (i = 0; i < n; i++) { 1043*771fe6b9SJerome Glisse tmds->tmds_pll[i].value = 1044*771fe6b9SJerome Glisse RBIOS32(tmds_info + i * 10 + 0x08); 1045*771fe6b9SJerome Glisse tmds->tmds_pll[i].freq = 1046*771fe6b9SJerome Glisse RBIOS16(tmds_info + i * 10 + 0x10); 1047*771fe6b9SJerome Glisse DRM_DEBUG("TMDS PLL From COMBIOS %u %x\n", 1048*771fe6b9SJerome Glisse tmds->tmds_pll[i].freq, 1049*771fe6b9SJerome Glisse tmds->tmds_pll[i].value); 1050*771fe6b9SJerome Glisse } 1051*771fe6b9SJerome Glisse } else if (ver == 4) { 1052*771fe6b9SJerome Glisse int stride = 0; 1053*771fe6b9SJerome Glisse n = RBIOS8(tmds_info + 5) + 1; 1054*771fe6b9SJerome Glisse if (n > 4) 1055*771fe6b9SJerome Glisse n = 4; 1056*771fe6b9SJerome Glisse for (i = 0; i < n; i++) { 1057*771fe6b9SJerome Glisse tmds->tmds_pll[i].value = 1058*771fe6b9SJerome Glisse RBIOS32(tmds_info + stride + 0x08); 1059*771fe6b9SJerome Glisse tmds->tmds_pll[i].freq = 1060*771fe6b9SJerome Glisse RBIOS16(tmds_info + stride + 0x10); 1061*771fe6b9SJerome Glisse if (i == 0) 1062*771fe6b9SJerome Glisse stride += 10; 1063*771fe6b9SJerome Glisse else 1064*771fe6b9SJerome Glisse stride += 6; 1065*771fe6b9SJerome Glisse DRM_DEBUG("TMDS PLL From COMBIOS %u %x\n", 1066*771fe6b9SJerome Glisse tmds->tmds_pll[i].freq, 1067*771fe6b9SJerome Glisse tmds->tmds_pll[i].value); 1068*771fe6b9SJerome Glisse } 1069*771fe6b9SJerome Glisse } 1070*771fe6b9SJerome Glisse } else 1071*771fe6b9SJerome Glisse DRM_INFO("No TMDS info found in BIOS\n"); 1072*771fe6b9SJerome Glisse return tmds; 1073*771fe6b9SJerome Glisse } 1074*771fe6b9SJerome Glisse 1075*771fe6b9SJerome Glisse void radeon_combios_get_ext_tmds_info(struct radeon_encoder *encoder) 1076*771fe6b9SJerome Glisse { 1077*771fe6b9SJerome Glisse struct drm_device *dev = encoder->base.dev; 1078*771fe6b9SJerome Glisse struct radeon_device *rdev = dev->dev_private; 1079*771fe6b9SJerome Glisse uint16_t ext_tmds_info; 1080*771fe6b9SJerome Glisse uint8_t ver; 1081*771fe6b9SJerome Glisse 1082*771fe6b9SJerome Glisse if (rdev->bios == NULL) 1083*771fe6b9SJerome Glisse return; 1084*771fe6b9SJerome Glisse 1085*771fe6b9SJerome Glisse ext_tmds_info = 1086*771fe6b9SJerome Glisse combios_get_table_offset(dev, COMBIOS_EXT_TMDS_INFO_TABLE); 1087*771fe6b9SJerome Glisse if (ext_tmds_info) { 1088*771fe6b9SJerome Glisse ver = RBIOS8(ext_tmds_info); 1089*771fe6b9SJerome Glisse DRM_INFO("External TMDS Table revision: %d\n", ver); 1090*771fe6b9SJerome Glisse // TODO 1091*771fe6b9SJerome Glisse } 1092*771fe6b9SJerome Glisse } 1093*771fe6b9SJerome Glisse 1094*771fe6b9SJerome Glisse bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) 1095*771fe6b9SJerome Glisse { 1096*771fe6b9SJerome Glisse struct radeon_device *rdev = dev->dev_private; 1097*771fe6b9SJerome Glisse struct radeon_i2c_bus_rec ddc_i2c; 1098*771fe6b9SJerome Glisse 1099*771fe6b9SJerome Glisse rdev->mode_info.connector_table = radeon_connector_table; 1100*771fe6b9SJerome Glisse if (rdev->mode_info.connector_table == CT_NONE) { 1101*771fe6b9SJerome Glisse #ifdef CONFIG_PPC_PMAC 1102*771fe6b9SJerome Glisse if (machine_is_compatible("PowerBook3,3")) { 1103*771fe6b9SJerome Glisse /* powerbook with VGA */ 1104*771fe6b9SJerome Glisse rdev->mode_info.connector_table = CT_POWERBOOK_VGA; 1105*771fe6b9SJerome Glisse } else if (machine_is_compatible("PowerBook3,4") || 1106*771fe6b9SJerome Glisse machine_is_compatible("PowerBook3,5")) { 1107*771fe6b9SJerome Glisse /* powerbook with internal tmds */ 1108*771fe6b9SJerome Glisse rdev->mode_info.connector_table = CT_POWERBOOK_INTERNAL; 1109*771fe6b9SJerome Glisse } else if (machine_is_compatible("PowerBook5,1") || 1110*771fe6b9SJerome Glisse machine_is_compatible("PowerBook5,2") || 1111*771fe6b9SJerome Glisse machine_is_compatible("PowerBook5,3") || 1112*771fe6b9SJerome Glisse machine_is_compatible("PowerBook5,4") || 1113*771fe6b9SJerome Glisse machine_is_compatible("PowerBook5,5")) { 1114*771fe6b9SJerome Glisse /* powerbook with external single link tmds (sil164) */ 1115*771fe6b9SJerome Glisse rdev->mode_info.connector_table = CT_POWERBOOK_EXTERNAL; 1116*771fe6b9SJerome Glisse } else if (machine_is_compatible("PowerBook5,6")) { 1117*771fe6b9SJerome Glisse /* powerbook with external dual or single link tmds */ 1118*771fe6b9SJerome Glisse rdev->mode_info.connector_table = CT_POWERBOOK_EXTERNAL; 1119*771fe6b9SJerome Glisse } else if (machine_is_compatible("PowerBook5,7") || 1120*771fe6b9SJerome Glisse machine_is_compatible("PowerBook5,8") || 1121*771fe6b9SJerome Glisse machine_is_compatible("PowerBook5,9")) { 1122*771fe6b9SJerome Glisse /* PowerBook6,2 ? */ 1123*771fe6b9SJerome Glisse /* powerbook with external dual link tmds (sil1178?) */ 1124*771fe6b9SJerome Glisse rdev->mode_info.connector_table = CT_POWERBOOK_EXTERNAL; 1125*771fe6b9SJerome Glisse } else if (machine_is_compatible("PowerBook4,1") || 1126*771fe6b9SJerome Glisse machine_is_compatible("PowerBook4,2") || 1127*771fe6b9SJerome Glisse machine_is_compatible("PowerBook4,3") || 1128*771fe6b9SJerome Glisse machine_is_compatible("PowerBook6,3") || 1129*771fe6b9SJerome Glisse machine_is_compatible("PowerBook6,5") || 1130*771fe6b9SJerome Glisse machine_is_compatible("PowerBook6,7")) { 1131*771fe6b9SJerome Glisse /* ibook */ 1132*771fe6b9SJerome Glisse rdev->mode_info.connector_table = CT_IBOOK; 1133*771fe6b9SJerome Glisse } else if (machine_is_compatible("PowerMac4,4")) { 1134*771fe6b9SJerome Glisse /* emac */ 1135*771fe6b9SJerome Glisse rdev->mode_info.connector_table = CT_EMAC; 1136*771fe6b9SJerome Glisse } else if (machine_is_compatible("PowerMac10,1")) { 1137*771fe6b9SJerome Glisse /* mini with internal tmds */ 1138*771fe6b9SJerome Glisse rdev->mode_info.connector_table = CT_MINI_INTERNAL; 1139*771fe6b9SJerome Glisse } else if (machine_is_compatible("PowerMac10,2")) { 1140*771fe6b9SJerome Glisse /* mini with external tmds */ 1141*771fe6b9SJerome Glisse rdev->mode_info.connector_table = CT_MINI_EXTERNAL; 1142*771fe6b9SJerome Glisse } else if (machine_is_compatible("PowerMac12,1")) { 1143*771fe6b9SJerome Glisse /* PowerMac8,1 ? */ 1144*771fe6b9SJerome Glisse /* imac g5 isight */ 1145*771fe6b9SJerome Glisse rdev->mode_info.connector_table = CT_IMAC_G5_ISIGHT; 1146*771fe6b9SJerome Glisse } else 1147*771fe6b9SJerome Glisse #endif /* CONFIG_PPC_PMAC */ 1148*771fe6b9SJerome Glisse rdev->mode_info.connector_table = CT_GENERIC; 1149*771fe6b9SJerome Glisse } 1150*771fe6b9SJerome Glisse 1151*771fe6b9SJerome Glisse switch (rdev->mode_info.connector_table) { 1152*771fe6b9SJerome Glisse case CT_GENERIC: 1153*771fe6b9SJerome Glisse DRM_INFO("Connector Table: %d (generic)\n", 1154*771fe6b9SJerome Glisse rdev->mode_info.connector_table); 1155*771fe6b9SJerome Glisse /* these are the most common settings */ 1156*771fe6b9SJerome Glisse if (rdev->flags & RADEON_SINGLE_CRTC) { 1157*771fe6b9SJerome Glisse /* VGA - primary dac */ 1158*771fe6b9SJerome Glisse ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_VGA_DDC); 1159*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1160*771fe6b9SJerome Glisse radeon_get_encoder_id(dev, 1161*771fe6b9SJerome Glisse ATOM_DEVICE_CRT1_SUPPORT, 1162*771fe6b9SJerome Glisse 1), 1163*771fe6b9SJerome Glisse ATOM_DEVICE_CRT1_SUPPORT); 1164*771fe6b9SJerome Glisse radeon_add_legacy_connector(dev, 0, 1165*771fe6b9SJerome Glisse ATOM_DEVICE_CRT1_SUPPORT, 1166*771fe6b9SJerome Glisse DRM_MODE_CONNECTOR_VGA, 1167*771fe6b9SJerome Glisse &ddc_i2c); 1168*771fe6b9SJerome Glisse } else if (rdev->flags & RADEON_IS_MOBILITY) { 1169*771fe6b9SJerome Glisse /* LVDS */ 1170*771fe6b9SJerome Glisse ddc_i2c = combios_setup_i2c_bus(RADEON_LCD_GPIO_MASK); 1171*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1172*771fe6b9SJerome Glisse radeon_get_encoder_id(dev, 1173*771fe6b9SJerome Glisse ATOM_DEVICE_LCD1_SUPPORT, 1174*771fe6b9SJerome Glisse 0), 1175*771fe6b9SJerome Glisse ATOM_DEVICE_LCD1_SUPPORT); 1176*771fe6b9SJerome Glisse radeon_add_legacy_connector(dev, 0, 1177*771fe6b9SJerome Glisse ATOM_DEVICE_LCD1_SUPPORT, 1178*771fe6b9SJerome Glisse DRM_MODE_CONNECTOR_LVDS, 1179*771fe6b9SJerome Glisse &ddc_i2c); 1180*771fe6b9SJerome Glisse 1181*771fe6b9SJerome Glisse /* VGA - primary dac */ 1182*771fe6b9SJerome Glisse ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_VGA_DDC); 1183*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1184*771fe6b9SJerome Glisse radeon_get_encoder_id(dev, 1185*771fe6b9SJerome Glisse ATOM_DEVICE_CRT1_SUPPORT, 1186*771fe6b9SJerome Glisse 1), 1187*771fe6b9SJerome Glisse ATOM_DEVICE_CRT1_SUPPORT); 1188*771fe6b9SJerome Glisse radeon_add_legacy_connector(dev, 1, 1189*771fe6b9SJerome Glisse ATOM_DEVICE_CRT1_SUPPORT, 1190*771fe6b9SJerome Glisse DRM_MODE_CONNECTOR_VGA, 1191*771fe6b9SJerome Glisse &ddc_i2c); 1192*771fe6b9SJerome Glisse } else { 1193*771fe6b9SJerome Glisse /* DVI-I - tv dac, int tmds */ 1194*771fe6b9SJerome Glisse ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_DVI_DDC); 1195*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1196*771fe6b9SJerome Glisse radeon_get_encoder_id(dev, 1197*771fe6b9SJerome Glisse ATOM_DEVICE_DFP1_SUPPORT, 1198*771fe6b9SJerome Glisse 0), 1199*771fe6b9SJerome Glisse ATOM_DEVICE_DFP1_SUPPORT); 1200*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1201*771fe6b9SJerome Glisse radeon_get_encoder_id(dev, 1202*771fe6b9SJerome Glisse ATOM_DEVICE_CRT2_SUPPORT, 1203*771fe6b9SJerome Glisse 2), 1204*771fe6b9SJerome Glisse ATOM_DEVICE_CRT2_SUPPORT); 1205*771fe6b9SJerome Glisse radeon_add_legacy_connector(dev, 0, 1206*771fe6b9SJerome Glisse ATOM_DEVICE_DFP1_SUPPORT | 1207*771fe6b9SJerome Glisse ATOM_DEVICE_CRT2_SUPPORT, 1208*771fe6b9SJerome Glisse DRM_MODE_CONNECTOR_DVII, 1209*771fe6b9SJerome Glisse &ddc_i2c); 1210*771fe6b9SJerome Glisse 1211*771fe6b9SJerome Glisse /* VGA - primary dac */ 1212*771fe6b9SJerome Glisse ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_VGA_DDC); 1213*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1214*771fe6b9SJerome Glisse radeon_get_encoder_id(dev, 1215*771fe6b9SJerome Glisse ATOM_DEVICE_CRT1_SUPPORT, 1216*771fe6b9SJerome Glisse 1), 1217*771fe6b9SJerome Glisse ATOM_DEVICE_CRT1_SUPPORT); 1218*771fe6b9SJerome Glisse radeon_add_legacy_connector(dev, 1, 1219*771fe6b9SJerome Glisse ATOM_DEVICE_CRT1_SUPPORT, 1220*771fe6b9SJerome Glisse DRM_MODE_CONNECTOR_VGA, 1221*771fe6b9SJerome Glisse &ddc_i2c); 1222*771fe6b9SJerome Glisse } 1223*771fe6b9SJerome Glisse 1224*771fe6b9SJerome Glisse if (rdev->family != CHIP_R100 && rdev->family != CHIP_R200) { 1225*771fe6b9SJerome Glisse /* TV - tv dac */ 1226*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1227*771fe6b9SJerome Glisse radeon_get_encoder_id(dev, 1228*771fe6b9SJerome Glisse ATOM_DEVICE_TV1_SUPPORT, 1229*771fe6b9SJerome Glisse 2), 1230*771fe6b9SJerome Glisse ATOM_DEVICE_TV1_SUPPORT); 1231*771fe6b9SJerome Glisse radeon_add_legacy_connector(dev, 2, 1232*771fe6b9SJerome Glisse ATOM_DEVICE_TV1_SUPPORT, 1233*771fe6b9SJerome Glisse DRM_MODE_CONNECTOR_SVIDEO, 1234*771fe6b9SJerome Glisse &ddc_i2c); 1235*771fe6b9SJerome Glisse } 1236*771fe6b9SJerome Glisse break; 1237*771fe6b9SJerome Glisse case CT_IBOOK: 1238*771fe6b9SJerome Glisse DRM_INFO("Connector Table: %d (ibook)\n", 1239*771fe6b9SJerome Glisse rdev->mode_info.connector_table); 1240*771fe6b9SJerome Glisse /* LVDS */ 1241*771fe6b9SJerome Glisse ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_DVI_DDC); 1242*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1243*771fe6b9SJerome Glisse radeon_get_encoder_id(dev, 1244*771fe6b9SJerome Glisse ATOM_DEVICE_LCD1_SUPPORT, 1245*771fe6b9SJerome Glisse 0), 1246*771fe6b9SJerome Glisse ATOM_DEVICE_LCD1_SUPPORT); 1247*771fe6b9SJerome Glisse radeon_add_legacy_connector(dev, 0, ATOM_DEVICE_LCD1_SUPPORT, 1248*771fe6b9SJerome Glisse DRM_MODE_CONNECTOR_LVDS, &ddc_i2c); 1249*771fe6b9SJerome Glisse /* VGA - TV DAC */ 1250*771fe6b9SJerome Glisse ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_VGA_DDC); 1251*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1252*771fe6b9SJerome Glisse radeon_get_encoder_id(dev, 1253*771fe6b9SJerome Glisse ATOM_DEVICE_CRT2_SUPPORT, 1254*771fe6b9SJerome Glisse 2), 1255*771fe6b9SJerome Glisse ATOM_DEVICE_CRT2_SUPPORT); 1256*771fe6b9SJerome Glisse radeon_add_legacy_connector(dev, 1, ATOM_DEVICE_CRT2_SUPPORT, 1257*771fe6b9SJerome Glisse DRM_MODE_CONNECTOR_VGA, &ddc_i2c); 1258*771fe6b9SJerome Glisse /* TV - TV DAC */ 1259*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1260*771fe6b9SJerome Glisse radeon_get_encoder_id(dev, 1261*771fe6b9SJerome Glisse ATOM_DEVICE_TV1_SUPPORT, 1262*771fe6b9SJerome Glisse 2), 1263*771fe6b9SJerome Glisse ATOM_DEVICE_TV1_SUPPORT); 1264*771fe6b9SJerome Glisse radeon_add_legacy_connector(dev, 2, ATOM_DEVICE_TV1_SUPPORT, 1265*771fe6b9SJerome Glisse DRM_MODE_CONNECTOR_SVIDEO, 1266*771fe6b9SJerome Glisse &ddc_i2c); 1267*771fe6b9SJerome Glisse break; 1268*771fe6b9SJerome Glisse case CT_POWERBOOK_EXTERNAL: 1269*771fe6b9SJerome Glisse DRM_INFO("Connector Table: %d (powerbook external tmds)\n", 1270*771fe6b9SJerome Glisse rdev->mode_info.connector_table); 1271*771fe6b9SJerome Glisse /* LVDS */ 1272*771fe6b9SJerome Glisse ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_DVI_DDC); 1273*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1274*771fe6b9SJerome Glisse radeon_get_encoder_id(dev, 1275*771fe6b9SJerome Glisse ATOM_DEVICE_LCD1_SUPPORT, 1276*771fe6b9SJerome Glisse 0), 1277*771fe6b9SJerome Glisse ATOM_DEVICE_LCD1_SUPPORT); 1278*771fe6b9SJerome Glisse radeon_add_legacy_connector(dev, 0, ATOM_DEVICE_LCD1_SUPPORT, 1279*771fe6b9SJerome Glisse DRM_MODE_CONNECTOR_LVDS, &ddc_i2c); 1280*771fe6b9SJerome Glisse /* DVI-I - primary dac, ext tmds */ 1281*771fe6b9SJerome Glisse ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_VGA_DDC); 1282*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1283*771fe6b9SJerome Glisse radeon_get_encoder_id(dev, 1284*771fe6b9SJerome Glisse ATOM_DEVICE_DFP2_SUPPORT, 1285*771fe6b9SJerome Glisse 0), 1286*771fe6b9SJerome Glisse ATOM_DEVICE_DFP2_SUPPORT); 1287*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1288*771fe6b9SJerome Glisse radeon_get_encoder_id(dev, 1289*771fe6b9SJerome Glisse ATOM_DEVICE_CRT1_SUPPORT, 1290*771fe6b9SJerome Glisse 1), 1291*771fe6b9SJerome Glisse ATOM_DEVICE_CRT1_SUPPORT); 1292*771fe6b9SJerome Glisse radeon_add_legacy_connector(dev, 1, 1293*771fe6b9SJerome Glisse ATOM_DEVICE_DFP2_SUPPORT | 1294*771fe6b9SJerome Glisse ATOM_DEVICE_CRT1_SUPPORT, 1295*771fe6b9SJerome Glisse DRM_MODE_CONNECTOR_DVII, &ddc_i2c); 1296*771fe6b9SJerome Glisse /* TV - TV DAC */ 1297*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1298*771fe6b9SJerome Glisse radeon_get_encoder_id(dev, 1299*771fe6b9SJerome Glisse ATOM_DEVICE_TV1_SUPPORT, 1300*771fe6b9SJerome Glisse 2), 1301*771fe6b9SJerome Glisse ATOM_DEVICE_TV1_SUPPORT); 1302*771fe6b9SJerome Glisse radeon_add_legacy_connector(dev, 2, ATOM_DEVICE_TV1_SUPPORT, 1303*771fe6b9SJerome Glisse DRM_MODE_CONNECTOR_SVIDEO, 1304*771fe6b9SJerome Glisse &ddc_i2c); 1305*771fe6b9SJerome Glisse break; 1306*771fe6b9SJerome Glisse case CT_POWERBOOK_INTERNAL: 1307*771fe6b9SJerome Glisse DRM_INFO("Connector Table: %d (powerbook internal tmds)\n", 1308*771fe6b9SJerome Glisse rdev->mode_info.connector_table); 1309*771fe6b9SJerome Glisse /* LVDS */ 1310*771fe6b9SJerome Glisse ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_DVI_DDC); 1311*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1312*771fe6b9SJerome Glisse radeon_get_encoder_id(dev, 1313*771fe6b9SJerome Glisse ATOM_DEVICE_LCD1_SUPPORT, 1314*771fe6b9SJerome Glisse 0), 1315*771fe6b9SJerome Glisse ATOM_DEVICE_LCD1_SUPPORT); 1316*771fe6b9SJerome Glisse radeon_add_legacy_connector(dev, 0, ATOM_DEVICE_LCD1_SUPPORT, 1317*771fe6b9SJerome Glisse DRM_MODE_CONNECTOR_LVDS, &ddc_i2c); 1318*771fe6b9SJerome Glisse /* DVI-I - primary dac, int tmds */ 1319*771fe6b9SJerome Glisse ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_VGA_DDC); 1320*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1321*771fe6b9SJerome Glisse radeon_get_encoder_id(dev, 1322*771fe6b9SJerome Glisse ATOM_DEVICE_DFP1_SUPPORT, 1323*771fe6b9SJerome Glisse 0), 1324*771fe6b9SJerome Glisse ATOM_DEVICE_DFP1_SUPPORT); 1325*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1326*771fe6b9SJerome Glisse radeon_get_encoder_id(dev, 1327*771fe6b9SJerome Glisse ATOM_DEVICE_CRT1_SUPPORT, 1328*771fe6b9SJerome Glisse 1), 1329*771fe6b9SJerome Glisse ATOM_DEVICE_CRT1_SUPPORT); 1330*771fe6b9SJerome Glisse radeon_add_legacy_connector(dev, 1, 1331*771fe6b9SJerome Glisse ATOM_DEVICE_DFP1_SUPPORT | 1332*771fe6b9SJerome Glisse ATOM_DEVICE_CRT1_SUPPORT, 1333*771fe6b9SJerome Glisse DRM_MODE_CONNECTOR_DVII, &ddc_i2c); 1334*771fe6b9SJerome Glisse /* TV - TV DAC */ 1335*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1336*771fe6b9SJerome Glisse radeon_get_encoder_id(dev, 1337*771fe6b9SJerome Glisse ATOM_DEVICE_TV1_SUPPORT, 1338*771fe6b9SJerome Glisse 2), 1339*771fe6b9SJerome Glisse ATOM_DEVICE_TV1_SUPPORT); 1340*771fe6b9SJerome Glisse radeon_add_legacy_connector(dev, 2, ATOM_DEVICE_TV1_SUPPORT, 1341*771fe6b9SJerome Glisse DRM_MODE_CONNECTOR_SVIDEO, 1342*771fe6b9SJerome Glisse &ddc_i2c); 1343*771fe6b9SJerome Glisse break; 1344*771fe6b9SJerome Glisse case CT_POWERBOOK_VGA: 1345*771fe6b9SJerome Glisse DRM_INFO("Connector Table: %d (powerbook vga)\n", 1346*771fe6b9SJerome Glisse rdev->mode_info.connector_table); 1347*771fe6b9SJerome Glisse /* LVDS */ 1348*771fe6b9SJerome Glisse ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_DVI_DDC); 1349*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1350*771fe6b9SJerome Glisse radeon_get_encoder_id(dev, 1351*771fe6b9SJerome Glisse ATOM_DEVICE_LCD1_SUPPORT, 1352*771fe6b9SJerome Glisse 0), 1353*771fe6b9SJerome Glisse ATOM_DEVICE_LCD1_SUPPORT); 1354*771fe6b9SJerome Glisse radeon_add_legacy_connector(dev, 0, ATOM_DEVICE_LCD1_SUPPORT, 1355*771fe6b9SJerome Glisse DRM_MODE_CONNECTOR_LVDS, &ddc_i2c); 1356*771fe6b9SJerome Glisse /* VGA - primary dac */ 1357*771fe6b9SJerome Glisse ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_VGA_DDC); 1358*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1359*771fe6b9SJerome Glisse radeon_get_encoder_id(dev, 1360*771fe6b9SJerome Glisse ATOM_DEVICE_CRT1_SUPPORT, 1361*771fe6b9SJerome Glisse 1), 1362*771fe6b9SJerome Glisse ATOM_DEVICE_CRT1_SUPPORT); 1363*771fe6b9SJerome Glisse radeon_add_legacy_connector(dev, 1, ATOM_DEVICE_CRT1_SUPPORT, 1364*771fe6b9SJerome Glisse DRM_MODE_CONNECTOR_VGA, &ddc_i2c); 1365*771fe6b9SJerome Glisse /* TV - TV DAC */ 1366*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1367*771fe6b9SJerome Glisse radeon_get_encoder_id(dev, 1368*771fe6b9SJerome Glisse ATOM_DEVICE_TV1_SUPPORT, 1369*771fe6b9SJerome Glisse 2), 1370*771fe6b9SJerome Glisse ATOM_DEVICE_TV1_SUPPORT); 1371*771fe6b9SJerome Glisse radeon_add_legacy_connector(dev, 2, ATOM_DEVICE_TV1_SUPPORT, 1372*771fe6b9SJerome Glisse DRM_MODE_CONNECTOR_SVIDEO, 1373*771fe6b9SJerome Glisse &ddc_i2c); 1374*771fe6b9SJerome Glisse break; 1375*771fe6b9SJerome Glisse case CT_MINI_EXTERNAL: 1376*771fe6b9SJerome Glisse DRM_INFO("Connector Table: %d (mini external tmds)\n", 1377*771fe6b9SJerome Glisse rdev->mode_info.connector_table); 1378*771fe6b9SJerome Glisse /* DVI-I - tv dac, ext tmds */ 1379*771fe6b9SJerome Glisse ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_CRT2_DDC); 1380*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1381*771fe6b9SJerome Glisse radeon_get_encoder_id(dev, 1382*771fe6b9SJerome Glisse ATOM_DEVICE_DFP2_SUPPORT, 1383*771fe6b9SJerome Glisse 0), 1384*771fe6b9SJerome Glisse ATOM_DEVICE_DFP2_SUPPORT); 1385*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1386*771fe6b9SJerome Glisse radeon_get_encoder_id(dev, 1387*771fe6b9SJerome Glisse ATOM_DEVICE_CRT2_SUPPORT, 1388*771fe6b9SJerome Glisse 2), 1389*771fe6b9SJerome Glisse ATOM_DEVICE_CRT2_SUPPORT); 1390*771fe6b9SJerome Glisse radeon_add_legacy_connector(dev, 0, 1391*771fe6b9SJerome Glisse ATOM_DEVICE_DFP2_SUPPORT | 1392*771fe6b9SJerome Glisse ATOM_DEVICE_CRT2_SUPPORT, 1393*771fe6b9SJerome Glisse DRM_MODE_CONNECTOR_DVII, &ddc_i2c); 1394*771fe6b9SJerome Glisse /* TV - TV DAC */ 1395*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1396*771fe6b9SJerome Glisse radeon_get_encoder_id(dev, 1397*771fe6b9SJerome Glisse ATOM_DEVICE_TV1_SUPPORT, 1398*771fe6b9SJerome Glisse 2), 1399*771fe6b9SJerome Glisse ATOM_DEVICE_TV1_SUPPORT); 1400*771fe6b9SJerome Glisse radeon_add_legacy_connector(dev, 1, ATOM_DEVICE_TV1_SUPPORT, 1401*771fe6b9SJerome Glisse DRM_MODE_CONNECTOR_SVIDEO, 1402*771fe6b9SJerome Glisse &ddc_i2c); 1403*771fe6b9SJerome Glisse break; 1404*771fe6b9SJerome Glisse case CT_MINI_INTERNAL: 1405*771fe6b9SJerome Glisse DRM_INFO("Connector Table: %d (mini internal tmds)\n", 1406*771fe6b9SJerome Glisse rdev->mode_info.connector_table); 1407*771fe6b9SJerome Glisse /* DVI-I - tv dac, int tmds */ 1408*771fe6b9SJerome Glisse ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_CRT2_DDC); 1409*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1410*771fe6b9SJerome Glisse radeon_get_encoder_id(dev, 1411*771fe6b9SJerome Glisse ATOM_DEVICE_DFP1_SUPPORT, 1412*771fe6b9SJerome Glisse 0), 1413*771fe6b9SJerome Glisse ATOM_DEVICE_DFP1_SUPPORT); 1414*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1415*771fe6b9SJerome Glisse radeon_get_encoder_id(dev, 1416*771fe6b9SJerome Glisse ATOM_DEVICE_CRT2_SUPPORT, 1417*771fe6b9SJerome Glisse 2), 1418*771fe6b9SJerome Glisse ATOM_DEVICE_CRT2_SUPPORT); 1419*771fe6b9SJerome Glisse radeon_add_legacy_connector(dev, 0, 1420*771fe6b9SJerome Glisse ATOM_DEVICE_DFP1_SUPPORT | 1421*771fe6b9SJerome Glisse ATOM_DEVICE_CRT2_SUPPORT, 1422*771fe6b9SJerome Glisse DRM_MODE_CONNECTOR_DVII, &ddc_i2c); 1423*771fe6b9SJerome Glisse /* TV - TV DAC */ 1424*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1425*771fe6b9SJerome Glisse radeon_get_encoder_id(dev, 1426*771fe6b9SJerome Glisse ATOM_DEVICE_TV1_SUPPORT, 1427*771fe6b9SJerome Glisse 2), 1428*771fe6b9SJerome Glisse ATOM_DEVICE_TV1_SUPPORT); 1429*771fe6b9SJerome Glisse radeon_add_legacy_connector(dev, 1, ATOM_DEVICE_TV1_SUPPORT, 1430*771fe6b9SJerome Glisse DRM_MODE_CONNECTOR_SVIDEO, 1431*771fe6b9SJerome Glisse &ddc_i2c); 1432*771fe6b9SJerome Glisse break; 1433*771fe6b9SJerome Glisse case CT_IMAC_G5_ISIGHT: 1434*771fe6b9SJerome Glisse DRM_INFO("Connector Table: %d (imac g5 isight)\n", 1435*771fe6b9SJerome Glisse rdev->mode_info.connector_table); 1436*771fe6b9SJerome Glisse /* DVI-D - int tmds */ 1437*771fe6b9SJerome Glisse ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_MONID); 1438*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1439*771fe6b9SJerome Glisse radeon_get_encoder_id(dev, 1440*771fe6b9SJerome Glisse ATOM_DEVICE_DFP1_SUPPORT, 1441*771fe6b9SJerome Glisse 0), 1442*771fe6b9SJerome Glisse ATOM_DEVICE_DFP1_SUPPORT); 1443*771fe6b9SJerome Glisse radeon_add_legacy_connector(dev, 0, ATOM_DEVICE_DFP1_SUPPORT, 1444*771fe6b9SJerome Glisse DRM_MODE_CONNECTOR_DVID, &ddc_i2c); 1445*771fe6b9SJerome Glisse /* VGA - tv dac */ 1446*771fe6b9SJerome Glisse ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_DVI_DDC); 1447*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1448*771fe6b9SJerome Glisse radeon_get_encoder_id(dev, 1449*771fe6b9SJerome Glisse ATOM_DEVICE_CRT2_SUPPORT, 1450*771fe6b9SJerome Glisse 2), 1451*771fe6b9SJerome Glisse ATOM_DEVICE_CRT2_SUPPORT); 1452*771fe6b9SJerome Glisse radeon_add_legacy_connector(dev, 1, ATOM_DEVICE_CRT2_SUPPORT, 1453*771fe6b9SJerome Glisse DRM_MODE_CONNECTOR_VGA, &ddc_i2c); 1454*771fe6b9SJerome Glisse /* TV - TV DAC */ 1455*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1456*771fe6b9SJerome Glisse radeon_get_encoder_id(dev, 1457*771fe6b9SJerome Glisse ATOM_DEVICE_TV1_SUPPORT, 1458*771fe6b9SJerome Glisse 2), 1459*771fe6b9SJerome Glisse ATOM_DEVICE_TV1_SUPPORT); 1460*771fe6b9SJerome Glisse radeon_add_legacy_connector(dev, 2, ATOM_DEVICE_TV1_SUPPORT, 1461*771fe6b9SJerome Glisse DRM_MODE_CONNECTOR_SVIDEO, 1462*771fe6b9SJerome Glisse &ddc_i2c); 1463*771fe6b9SJerome Glisse break; 1464*771fe6b9SJerome Glisse case CT_EMAC: 1465*771fe6b9SJerome Glisse DRM_INFO("Connector Table: %d (emac)\n", 1466*771fe6b9SJerome Glisse rdev->mode_info.connector_table); 1467*771fe6b9SJerome Glisse /* VGA - primary dac */ 1468*771fe6b9SJerome Glisse ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_VGA_DDC); 1469*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1470*771fe6b9SJerome Glisse radeon_get_encoder_id(dev, 1471*771fe6b9SJerome Glisse ATOM_DEVICE_CRT1_SUPPORT, 1472*771fe6b9SJerome Glisse 1), 1473*771fe6b9SJerome Glisse ATOM_DEVICE_CRT1_SUPPORT); 1474*771fe6b9SJerome Glisse radeon_add_legacy_connector(dev, 0, ATOM_DEVICE_CRT1_SUPPORT, 1475*771fe6b9SJerome Glisse DRM_MODE_CONNECTOR_VGA, &ddc_i2c); 1476*771fe6b9SJerome Glisse /* VGA - tv dac */ 1477*771fe6b9SJerome Glisse ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_CRT2_DDC); 1478*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1479*771fe6b9SJerome Glisse radeon_get_encoder_id(dev, 1480*771fe6b9SJerome Glisse ATOM_DEVICE_CRT2_SUPPORT, 1481*771fe6b9SJerome Glisse 2), 1482*771fe6b9SJerome Glisse ATOM_DEVICE_CRT2_SUPPORT); 1483*771fe6b9SJerome Glisse radeon_add_legacy_connector(dev, 1, ATOM_DEVICE_CRT2_SUPPORT, 1484*771fe6b9SJerome Glisse DRM_MODE_CONNECTOR_VGA, &ddc_i2c); 1485*771fe6b9SJerome Glisse /* TV - TV DAC */ 1486*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1487*771fe6b9SJerome Glisse radeon_get_encoder_id(dev, 1488*771fe6b9SJerome Glisse ATOM_DEVICE_TV1_SUPPORT, 1489*771fe6b9SJerome Glisse 2), 1490*771fe6b9SJerome Glisse ATOM_DEVICE_TV1_SUPPORT); 1491*771fe6b9SJerome Glisse radeon_add_legacy_connector(dev, 2, ATOM_DEVICE_TV1_SUPPORT, 1492*771fe6b9SJerome Glisse DRM_MODE_CONNECTOR_SVIDEO, 1493*771fe6b9SJerome Glisse &ddc_i2c); 1494*771fe6b9SJerome Glisse break; 1495*771fe6b9SJerome Glisse default: 1496*771fe6b9SJerome Glisse DRM_INFO("Connector table: %d (invalid)\n", 1497*771fe6b9SJerome Glisse rdev->mode_info.connector_table); 1498*771fe6b9SJerome Glisse return false; 1499*771fe6b9SJerome Glisse } 1500*771fe6b9SJerome Glisse 1501*771fe6b9SJerome Glisse radeon_link_encoder_connector(dev); 1502*771fe6b9SJerome Glisse 1503*771fe6b9SJerome Glisse return true; 1504*771fe6b9SJerome Glisse } 1505*771fe6b9SJerome Glisse 1506*771fe6b9SJerome Glisse static bool radeon_apply_legacy_quirks(struct drm_device *dev, 1507*771fe6b9SJerome Glisse int bios_index, 1508*771fe6b9SJerome Glisse enum radeon_combios_connector 1509*771fe6b9SJerome Glisse *legacy_connector, 1510*771fe6b9SJerome Glisse struct radeon_i2c_bus_rec *ddc_i2c) 1511*771fe6b9SJerome Glisse { 1512*771fe6b9SJerome Glisse struct radeon_device *rdev = dev->dev_private; 1513*771fe6b9SJerome Glisse 1514*771fe6b9SJerome Glisse /* XPRESS DDC quirks */ 1515*771fe6b9SJerome Glisse if ((rdev->family == CHIP_RS400 || 1516*771fe6b9SJerome Glisse rdev->family == CHIP_RS480) && 1517*771fe6b9SJerome Glisse ddc_i2c->mask_clk_reg == RADEON_GPIO_CRT2_DDC) 1518*771fe6b9SJerome Glisse *ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_MONID); 1519*771fe6b9SJerome Glisse else if ((rdev->family == CHIP_RS400 || 1520*771fe6b9SJerome Glisse rdev->family == CHIP_RS480) && 1521*771fe6b9SJerome Glisse ddc_i2c->mask_clk_reg == RADEON_GPIO_MONID) { 1522*771fe6b9SJerome Glisse ddc_i2c->valid = true; 1523*771fe6b9SJerome Glisse ddc_i2c->mask_clk_mask = (0x20 << 8); 1524*771fe6b9SJerome Glisse ddc_i2c->mask_data_mask = 0x80; 1525*771fe6b9SJerome Glisse ddc_i2c->a_clk_mask = (0x20 << 8); 1526*771fe6b9SJerome Glisse ddc_i2c->a_data_mask = 0x80; 1527*771fe6b9SJerome Glisse ddc_i2c->put_clk_mask = (0x20 << 8); 1528*771fe6b9SJerome Glisse ddc_i2c->put_data_mask = 0x80; 1529*771fe6b9SJerome Glisse ddc_i2c->get_clk_mask = (0x20 << 8); 1530*771fe6b9SJerome Glisse ddc_i2c->get_data_mask = 0x80; 1531*771fe6b9SJerome Glisse ddc_i2c->mask_clk_reg = RADEON_GPIOPAD_MASK; 1532*771fe6b9SJerome Glisse ddc_i2c->mask_data_reg = RADEON_GPIOPAD_MASK; 1533*771fe6b9SJerome Glisse ddc_i2c->a_clk_reg = RADEON_GPIOPAD_A; 1534*771fe6b9SJerome Glisse ddc_i2c->a_data_reg = RADEON_GPIOPAD_A; 1535*771fe6b9SJerome Glisse ddc_i2c->put_clk_reg = RADEON_GPIOPAD_EN; 1536*771fe6b9SJerome Glisse ddc_i2c->put_data_reg = RADEON_GPIOPAD_EN; 1537*771fe6b9SJerome Glisse ddc_i2c->get_clk_reg = RADEON_LCD_GPIO_Y_REG; 1538*771fe6b9SJerome Glisse ddc_i2c->get_data_reg = RADEON_LCD_GPIO_Y_REG; 1539*771fe6b9SJerome Glisse } 1540*771fe6b9SJerome Glisse 1541*771fe6b9SJerome Glisse /* Certain IBM chipset RN50s have a BIOS reporting two VGAs, 1542*771fe6b9SJerome Glisse one with VGA DDC and one with CRT2 DDC. - kill the CRT2 DDC one */ 1543*771fe6b9SJerome Glisse if (dev->pdev->device == 0x515e && 1544*771fe6b9SJerome Glisse dev->pdev->subsystem_vendor == 0x1014) { 1545*771fe6b9SJerome Glisse if (*legacy_connector == CONNECTOR_CRT_LEGACY && 1546*771fe6b9SJerome Glisse ddc_i2c->mask_clk_reg == RADEON_GPIO_CRT2_DDC) 1547*771fe6b9SJerome Glisse return false; 1548*771fe6b9SJerome Glisse } 1549*771fe6b9SJerome Glisse 1550*771fe6b9SJerome Glisse /* Some RV100 cards with 2 VGA ports show up with DVI+VGA */ 1551*771fe6b9SJerome Glisse if (dev->pdev->device == 0x5159 && 1552*771fe6b9SJerome Glisse dev->pdev->subsystem_vendor == 0x1002 && 1553*771fe6b9SJerome Glisse dev->pdev->subsystem_device == 0x013a) { 1554*771fe6b9SJerome Glisse if (*legacy_connector == CONNECTOR_DVI_I_LEGACY) 1555*771fe6b9SJerome Glisse *legacy_connector = CONNECTOR_CRT_LEGACY; 1556*771fe6b9SJerome Glisse 1557*771fe6b9SJerome Glisse } 1558*771fe6b9SJerome Glisse 1559*771fe6b9SJerome Glisse /* X300 card with extra non-existent DVI port */ 1560*771fe6b9SJerome Glisse if (dev->pdev->device == 0x5B60 && 1561*771fe6b9SJerome Glisse dev->pdev->subsystem_vendor == 0x17af && 1562*771fe6b9SJerome Glisse dev->pdev->subsystem_device == 0x201e && bios_index == 2) { 1563*771fe6b9SJerome Glisse if (*legacy_connector == CONNECTOR_DVI_I_LEGACY) 1564*771fe6b9SJerome Glisse return false; 1565*771fe6b9SJerome Glisse } 1566*771fe6b9SJerome Glisse 1567*771fe6b9SJerome Glisse return true; 1568*771fe6b9SJerome Glisse } 1569*771fe6b9SJerome Glisse 1570*771fe6b9SJerome Glisse bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev) 1571*771fe6b9SJerome Glisse { 1572*771fe6b9SJerome Glisse struct radeon_device *rdev = dev->dev_private; 1573*771fe6b9SJerome Glisse uint32_t conn_info, entry, devices; 1574*771fe6b9SJerome Glisse uint16_t tmp; 1575*771fe6b9SJerome Glisse enum radeon_combios_ddc ddc_type; 1576*771fe6b9SJerome Glisse enum radeon_combios_connector connector; 1577*771fe6b9SJerome Glisse int i = 0; 1578*771fe6b9SJerome Glisse struct radeon_i2c_bus_rec ddc_i2c; 1579*771fe6b9SJerome Glisse 1580*771fe6b9SJerome Glisse if (rdev->bios == NULL) 1581*771fe6b9SJerome Glisse return false; 1582*771fe6b9SJerome Glisse 1583*771fe6b9SJerome Glisse conn_info = combios_get_table_offset(dev, COMBIOS_CONNECTOR_INFO_TABLE); 1584*771fe6b9SJerome Glisse if (conn_info) { 1585*771fe6b9SJerome Glisse for (i = 0; i < 4; i++) { 1586*771fe6b9SJerome Glisse entry = conn_info + 2 + i * 2; 1587*771fe6b9SJerome Glisse 1588*771fe6b9SJerome Glisse if (!RBIOS16(entry)) 1589*771fe6b9SJerome Glisse break; 1590*771fe6b9SJerome Glisse 1591*771fe6b9SJerome Glisse tmp = RBIOS16(entry); 1592*771fe6b9SJerome Glisse 1593*771fe6b9SJerome Glisse connector = (tmp >> 12) & 0xf; 1594*771fe6b9SJerome Glisse 1595*771fe6b9SJerome Glisse ddc_type = (tmp >> 8) & 0xf; 1596*771fe6b9SJerome Glisse switch (ddc_type) { 1597*771fe6b9SJerome Glisse case DDC_MONID: 1598*771fe6b9SJerome Glisse ddc_i2c = 1599*771fe6b9SJerome Glisse combios_setup_i2c_bus(RADEON_GPIO_MONID); 1600*771fe6b9SJerome Glisse break; 1601*771fe6b9SJerome Glisse case DDC_DVI: 1602*771fe6b9SJerome Glisse ddc_i2c = 1603*771fe6b9SJerome Glisse combios_setup_i2c_bus(RADEON_GPIO_DVI_DDC); 1604*771fe6b9SJerome Glisse break; 1605*771fe6b9SJerome Glisse case DDC_VGA: 1606*771fe6b9SJerome Glisse ddc_i2c = 1607*771fe6b9SJerome Glisse combios_setup_i2c_bus(RADEON_GPIO_VGA_DDC); 1608*771fe6b9SJerome Glisse break; 1609*771fe6b9SJerome Glisse case DDC_CRT2: 1610*771fe6b9SJerome Glisse ddc_i2c = 1611*771fe6b9SJerome Glisse combios_setup_i2c_bus(RADEON_GPIO_CRT2_DDC); 1612*771fe6b9SJerome Glisse break; 1613*771fe6b9SJerome Glisse default: 1614*771fe6b9SJerome Glisse break; 1615*771fe6b9SJerome Glisse } 1616*771fe6b9SJerome Glisse 1617*771fe6b9SJerome Glisse radeon_apply_legacy_quirks(dev, i, &connector, 1618*771fe6b9SJerome Glisse &ddc_i2c); 1619*771fe6b9SJerome Glisse 1620*771fe6b9SJerome Glisse switch (connector) { 1621*771fe6b9SJerome Glisse case CONNECTOR_PROPRIETARY_LEGACY: 1622*771fe6b9SJerome Glisse if ((tmp >> 4) & 0x1) 1623*771fe6b9SJerome Glisse devices = ATOM_DEVICE_DFP2_SUPPORT; 1624*771fe6b9SJerome Glisse else 1625*771fe6b9SJerome Glisse devices = ATOM_DEVICE_DFP1_SUPPORT; 1626*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1627*771fe6b9SJerome Glisse radeon_get_encoder_id 1628*771fe6b9SJerome Glisse (dev, devices, 0), 1629*771fe6b9SJerome Glisse devices); 1630*771fe6b9SJerome Glisse radeon_add_legacy_connector(dev, i, devices, 1631*771fe6b9SJerome Glisse legacy_connector_convert 1632*771fe6b9SJerome Glisse [connector], 1633*771fe6b9SJerome Glisse &ddc_i2c); 1634*771fe6b9SJerome Glisse break; 1635*771fe6b9SJerome Glisse case CONNECTOR_CRT_LEGACY: 1636*771fe6b9SJerome Glisse if (tmp & 0x1) { 1637*771fe6b9SJerome Glisse devices = ATOM_DEVICE_CRT2_SUPPORT; 1638*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1639*771fe6b9SJerome Glisse radeon_get_encoder_id 1640*771fe6b9SJerome Glisse (dev, 1641*771fe6b9SJerome Glisse ATOM_DEVICE_CRT2_SUPPORT, 1642*771fe6b9SJerome Glisse 2), 1643*771fe6b9SJerome Glisse ATOM_DEVICE_CRT2_SUPPORT); 1644*771fe6b9SJerome Glisse } else { 1645*771fe6b9SJerome Glisse devices = ATOM_DEVICE_CRT1_SUPPORT; 1646*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1647*771fe6b9SJerome Glisse radeon_get_encoder_id 1648*771fe6b9SJerome Glisse (dev, 1649*771fe6b9SJerome Glisse ATOM_DEVICE_CRT1_SUPPORT, 1650*771fe6b9SJerome Glisse 1), 1651*771fe6b9SJerome Glisse ATOM_DEVICE_CRT1_SUPPORT); 1652*771fe6b9SJerome Glisse } 1653*771fe6b9SJerome Glisse radeon_add_legacy_connector(dev, 1654*771fe6b9SJerome Glisse i, 1655*771fe6b9SJerome Glisse devices, 1656*771fe6b9SJerome Glisse legacy_connector_convert 1657*771fe6b9SJerome Glisse [connector], 1658*771fe6b9SJerome Glisse &ddc_i2c); 1659*771fe6b9SJerome Glisse break; 1660*771fe6b9SJerome Glisse case CONNECTOR_DVI_I_LEGACY: 1661*771fe6b9SJerome Glisse devices = 0; 1662*771fe6b9SJerome Glisse if (tmp & 0x1) { 1663*771fe6b9SJerome Glisse devices |= ATOM_DEVICE_CRT2_SUPPORT; 1664*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1665*771fe6b9SJerome Glisse radeon_get_encoder_id 1666*771fe6b9SJerome Glisse (dev, 1667*771fe6b9SJerome Glisse ATOM_DEVICE_CRT2_SUPPORT, 1668*771fe6b9SJerome Glisse 2), 1669*771fe6b9SJerome Glisse ATOM_DEVICE_CRT2_SUPPORT); 1670*771fe6b9SJerome Glisse } else { 1671*771fe6b9SJerome Glisse devices |= ATOM_DEVICE_CRT1_SUPPORT; 1672*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1673*771fe6b9SJerome Glisse radeon_get_encoder_id 1674*771fe6b9SJerome Glisse (dev, 1675*771fe6b9SJerome Glisse ATOM_DEVICE_CRT1_SUPPORT, 1676*771fe6b9SJerome Glisse 1), 1677*771fe6b9SJerome Glisse ATOM_DEVICE_CRT1_SUPPORT); 1678*771fe6b9SJerome Glisse } 1679*771fe6b9SJerome Glisse if ((tmp >> 4) & 0x1) { 1680*771fe6b9SJerome Glisse devices |= ATOM_DEVICE_DFP2_SUPPORT; 1681*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1682*771fe6b9SJerome Glisse radeon_get_encoder_id 1683*771fe6b9SJerome Glisse (dev, 1684*771fe6b9SJerome Glisse ATOM_DEVICE_DFP2_SUPPORT, 1685*771fe6b9SJerome Glisse 0), 1686*771fe6b9SJerome Glisse ATOM_DEVICE_DFP2_SUPPORT); 1687*771fe6b9SJerome Glisse } else { 1688*771fe6b9SJerome Glisse devices |= ATOM_DEVICE_DFP1_SUPPORT; 1689*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1690*771fe6b9SJerome Glisse radeon_get_encoder_id 1691*771fe6b9SJerome Glisse (dev, 1692*771fe6b9SJerome Glisse ATOM_DEVICE_DFP1_SUPPORT, 1693*771fe6b9SJerome Glisse 0), 1694*771fe6b9SJerome Glisse ATOM_DEVICE_DFP1_SUPPORT); 1695*771fe6b9SJerome Glisse } 1696*771fe6b9SJerome Glisse radeon_add_legacy_connector(dev, 1697*771fe6b9SJerome Glisse i, 1698*771fe6b9SJerome Glisse devices, 1699*771fe6b9SJerome Glisse legacy_connector_convert 1700*771fe6b9SJerome Glisse [connector], 1701*771fe6b9SJerome Glisse &ddc_i2c); 1702*771fe6b9SJerome Glisse break; 1703*771fe6b9SJerome Glisse case CONNECTOR_DVI_D_LEGACY: 1704*771fe6b9SJerome Glisse if ((tmp >> 4) & 0x1) 1705*771fe6b9SJerome Glisse devices = ATOM_DEVICE_DFP2_SUPPORT; 1706*771fe6b9SJerome Glisse else 1707*771fe6b9SJerome Glisse devices = ATOM_DEVICE_DFP1_SUPPORT; 1708*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1709*771fe6b9SJerome Glisse radeon_get_encoder_id 1710*771fe6b9SJerome Glisse (dev, devices, 0), 1711*771fe6b9SJerome Glisse devices); 1712*771fe6b9SJerome Glisse radeon_add_legacy_connector(dev, i, devices, 1713*771fe6b9SJerome Glisse legacy_connector_convert 1714*771fe6b9SJerome Glisse [connector], 1715*771fe6b9SJerome Glisse &ddc_i2c); 1716*771fe6b9SJerome Glisse break; 1717*771fe6b9SJerome Glisse case CONNECTOR_CTV_LEGACY: 1718*771fe6b9SJerome Glisse case CONNECTOR_STV_LEGACY: 1719*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1720*771fe6b9SJerome Glisse radeon_get_encoder_id 1721*771fe6b9SJerome Glisse (dev, 1722*771fe6b9SJerome Glisse ATOM_DEVICE_TV1_SUPPORT, 1723*771fe6b9SJerome Glisse 2), 1724*771fe6b9SJerome Glisse ATOM_DEVICE_TV1_SUPPORT); 1725*771fe6b9SJerome Glisse radeon_add_legacy_connector(dev, i, 1726*771fe6b9SJerome Glisse ATOM_DEVICE_TV1_SUPPORT, 1727*771fe6b9SJerome Glisse legacy_connector_convert 1728*771fe6b9SJerome Glisse [connector], 1729*771fe6b9SJerome Glisse &ddc_i2c); 1730*771fe6b9SJerome Glisse break; 1731*771fe6b9SJerome Glisse default: 1732*771fe6b9SJerome Glisse DRM_ERROR("Unknown connector type: %d\n", 1733*771fe6b9SJerome Glisse connector); 1734*771fe6b9SJerome Glisse continue; 1735*771fe6b9SJerome Glisse } 1736*771fe6b9SJerome Glisse 1737*771fe6b9SJerome Glisse } 1738*771fe6b9SJerome Glisse } else { 1739*771fe6b9SJerome Glisse uint16_t tmds_info = 1740*771fe6b9SJerome Glisse combios_get_table_offset(dev, COMBIOS_DFP_INFO_TABLE); 1741*771fe6b9SJerome Glisse if (tmds_info) { 1742*771fe6b9SJerome Glisse DRM_DEBUG("Found DFP table, assuming DVI connector\n"); 1743*771fe6b9SJerome Glisse 1744*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1745*771fe6b9SJerome Glisse radeon_get_encoder_id(dev, 1746*771fe6b9SJerome Glisse ATOM_DEVICE_CRT1_SUPPORT, 1747*771fe6b9SJerome Glisse 1), 1748*771fe6b9SJerome Glisse ATOM_DEVICE_CRT1_SUPPORT); 1749*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1750*771fe6b9SJerome Glisse radeon_get_encoder_id(dev, 1751*771fe6b9SJerome Glisse ATOM_DEVICE_DFP1_SUPPORT, 1752*771fe6b9SJerome Glisse 0), 1753*771fe6b9SJerome Glisse ATOM_DEVICE_DFP1_SUPPORT); 1754*771fe6b9SJerome Glisse 1755*771fe6b9SJerome Glisse ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_DVI_DDC); 1756*771fe6b9SJerome Glisse radeon_add_legacy_connector(dev, 1757*771fe6b9SJerome Glisse 0, 1758*771fe6b9SJerome Glisse ATOM_DEVICE_CRT1_SUPPORT | 1759*771fe6b9SJerome Glisse ATOM_DEVICE_DFP1_SUPPORT, 1760*771fe6b9SJerome Glisse DRM_MODE_CONNECTOR_DVII, 1761*771fe6b9SJerome Glisse &ddc_i2c); 1762*771fe6b9SJerome Glisse } else { 1763*771fe6b9SJerome Glisse DRM_DEBUG("No connector info found\n"); 1764*771fe6b9SJerome Glisse return false; 1765*771fe6b9SJerome Glisse } 1766*771fe6b9SJerome Glisse } 1767*771fe6b9SJerome Glisse 1768*771fe6b9SJerome Glisse if (rdev->flags & RADEON_IS_MOBILITY || rdev->flags & RADEON_IS_IGP) { 1769*771fe6b9SJerome Glisse uint16_t lcd_info = 1770*771fe6b9SJerome Glisse combios_get_table_offset(dev, COMBIOS_LCD_INFO_TABLE); 1771*771fe6b9SJerome Glisse if (lcd_info) { 1772*771fe6b9SJerome Glisse uint16_t lcd_ddc_info = 1773*771fe6b9SJerome Glisse combios_get_table_offset(dev, 1774*771fe6b9SJerome Glisse COMBIOS_LCD_DDC_INFO_TABLE); 1775*771fe6b9SJerome Glisse 1776*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1777*771fe6b9SJerome Glisse radeon_get_encoder_id(dev, 1778*771fe6b9SJerome Glisse ATOM_DEVICE_LCD1_SUPPORT, 1779*771fe6b9SJerome Glisse 0), 1780*771fe6b9SJerome Glisse ATOM_DEVICE_LCD1_SUPPORT); 1781*771fe6b9SJerome Glisse 1782*771fe6b9SJerome Glisse if (lcd_ddc_info) { 1783*771fe6b9SJerome Glisse ddc_type = RBIOS8(lcd_ddc_info + 2); 1784*771fe6b9SJerome Glisse switch (ddc_type) { 1785*771fe6b9SJerome Glisse case DDC_MONID: 1786*771fe6b9SJerome Glisse ddc_i2c = 1787*771fe6b9SJerome Glisse combios_setup_i2c_bus 1788*771fe6b9SJerome Glisse (RADEON_GPIO_MONID); 1789*771fe6b9SJerome Glisse break; 1790*771fe6b9SJerome Glisse case DDC_DVI: 1791*771fe6b9SJerome Glisse ddc_i2c = 1792*771fe6b9SJerome Glisse combios_setup_i2c_bus 1793*771fe6b9SJerome Glisse (RADEON_GPIO_DVI_DDC); 1794*771fe6b9SJerome Glisse break; 1795*771fe6b9SJerome Glisse case DDC_VGA: 1796*771fe6b9SJerome Glisse ddc_i2c = 1797*771fe6b9SJerome Glisse combios_setup_i2c_bus 1798*771fe6b9SJerome Glisse (RADEON_GPIO_VGA_DDC); 1799*771fe6b9SJerome Glisse break; 1800*771fe6b9SJerome Glisse case DDC_CRT2: 1801*771fe6b9SJerome Glisse ddc_i2c = 1802*771fe6b9SJerome Glisse combios_setup_i2c_bus 1803*771fe6b9SJerome Glisse (RADEON_GPIO_CRT2_DDC); 1804*771fe6b9SJerome Glisse break; 1805*771fe6b9SJerome Glisse case DDC_LCD: 1806*771fe6b9SJerome Glisse ddc_i2c = 1807*771fe6b9SJerome Glisse combios_setup_i2c_bus 1808*771fe6b9SJerome Glisse (RADEON_LCD_GPIO_MASK); 1809*771fe6b9SJerome Glisse ddc_i2c.mask_clk_mask = 1810*771fe6b9SJerome Glisse RBIOS32(lcd_ddc_info + 3); 1811*771fe6b9SJerome Glisse ddc_i2c.mask_data_mask = 1812*771fe6b9SJerome Glisse RBIOS32(lcd_ddc_info + 7); 1813*771fe6b9SJerome Glisse ddc_i2c.a_clk_mask = 1814*771fe6b9SJerome Glisse RBIOS32(lcd_ddc_info + 3); 1815*771fe6b9SJerome Glisse ddc_i2c.a_data_mask = 1816*771fe6b9SJerome Glisse RBIOS32(lcd_ddc_info + 7); 1817*771fe6b9SJerome Glisse ddc_i2c.put_clk_mask = 1818*771fe6b9SJerome Glisse RBIOS32(lcd_ddc_info + 3); 1819*771fe6b9SJerome Glisse ddc_i2c.put_data_mask = 1820*771fe6b9SJerome Glisse RBIOS32(lcd_ddc_info + 7); 1821*771fe6b9SJerome Glisse ddc_i2c.get_clk_mask = 1822*771fe6b9SJerome Glisse RBIOS32(lcd_ddc_info + 3); 1823*771fe6b9SJerome Glisse ddc_i2c.get_data_mask = 1824*771fe6b9SJerome Glisse RBIOS32(lcd_ddc_info + 7); 1825*771fe6b9SJerome Glisse break; 1826*771fe6b9SJerome Glisse case DDC_GPIO: 1827*771fe6b9SJerome Glisse ddc_i2c = 1828*771fe6b9SJerome Glisse combios_setup_i2c_bus 1829*771fe6b9SJerome Glisse (RADEON_MDGPIO_EN_REG); 1830*771fe6b9SJerome Glisse ddc_i2c.mask_clk_mask = 1831*771fe6b9SJerome Glisse RBIOS32(lcd_ddc_info + 3); 1832*771fe6b9SJerome Glisse ddc_i2c.mask_data_mask = 1833*771fe6b9SJerome Glisse RBIOS32(lcd_ddc_info + 7); 1834*771fe6b9SJerome Glisse ddc_i2c.a_clk_mask = 1835*771fe6b9SJerome Glisse RBIOS32(lcd_ddc_info + 3); 1836*771fe6b9SJerome Glisse ddc_i2c.a_data_mask = 1837*771fe6b9SJerome Glisse RBIOS32(lcd_ddc_info + 7); 1838*771fe6b9SJerome Glisse ddc_i2c.put_clk_mask = 1839*771fe6b9SJerome Glisse RBIOS32(lcd_ddc_info + 3); 1840*771fe6b9SJerome Glisse ddc_i2c.put_data_mask = 1841*771fe6b9SJerome Glisse RBIOS32(lcd_ddc_info + 7); 1842*771fe6b9SJerome Glisse ddc_i2c.get_clk_mask = 1843*771fe6b9SJerome Glisse RBIOS32(lcd_ddc_info + 3); 1844*771fe6b9SJerome Glisse ddc_i2c.get_data_mask = 1845*771fe6b9SJerome Glisse RBIOS32(lcd_ddc_info + 7); 1846*771fe6b9SJerome Glisse break; 1847*771fe6b9SJerome Glisse default: 1848*771fe6b9SJerome Glisse ddc_i2c.valid = false; 1849*771fe6b9SJerome Glisse break; 1850*771fe6b9SJerome Glisse } 1851*771fe6b9SJerome Glisse DRM_DEBUG("LCD DDC Info Table found!\n"); 1852*771fe6b9SJerome Glisse } else 1853*771fe6b9SJerome Glisse ddc_i2c.valid = false; 1854*771fe6b9SJerome Glisse 1855*771fe6b9SJerome Glisse radeon_add_legacy_connector(dev, 1856*771fe6b9SJerome Glisse 5, 1857*771fe6b9SJerome Glisse ATOM_DEVICE_LCD1_SUPPORT, 1858*771fe6b9SJerome Glisse DRM_MODE_CONNECTOR_LVDS, 1859*771fe6b9SJerome Glisse &ddc_i2c); 1860*771fe6b9SJerome Glisse } 1861*771fe6b9SJerome Glisse } 1862*771fe6b9SJerome Glisse 1863*771fe6b9SJerome Glisse /* check TV table */ 1864*771fe6b9SJerome Glisse if (rdev->family != CHIP_R100 && rdev->family != CHIP_R200) { 1865*771fe6b9SJerome Glisse uint32_t tv_info = 1866*771fe6b9SJerome Glisse combios_get_table_offset(dev, COMBIOS_TV_INFO_TABLE); 1867*771fe6b9SJerome Glisse if (tv_info) { 1868*771fe6b9SJerome Glisse if (RBIOS8(tv_info + 6) == 'T') { 1869*771fe6b9SJerome Glisse radeon_add_legacy_encoder(dev, 1870*771fe6b9SJerome Glisse radeon_get_encoder_id 1871*771fe6b9SJerome Glisse (dev, 1872*771fe6b9SJerome Glisse ATOM_DEVICE_TV1_SUPPORT, 1873*771fe6b9SJerome Glisse 2), 1874*771fe6b9SJerome Glisse ATOM_DEVICE_TV1_SUPPORT); 1875*771fe6b9SJerome Glisse radeon_add_legacy_connector(dev, 6, 1876*771fe6b9SJerome Glisse ATOM_DEVICE_TV1_SUPPORT, 1877*771fe6b9SJerome Glisse DRM_MODE_CONNECTOR_SVIDEO, 1878*771fe6b9SJerome Glisse &ddc_i2c); 1879*771fe6b9SJerome Glisse } 1880*771fe6b9SJerome Glisse } 1881*771fe6b9SJerome Glisse } 1882*771fe6b9SJerome Glisse 1883*771fe6b9SJerome Glisse radeon_link_encoder_connector(dev); 1884*771fe6b9SJerome Glisse 1885*771fe6b9SJerome Glisse return true; 1886*771fe6b9SJerome Glisse } 1887*771fe6b9SJerome Glisse 1888*771fe6b9SJerome Glisse static void combios_parse_mmio_table(struct drm_device *dev, uint16_t offset) 1889*771fe6b9SJerome Glisse { 1890*771fe6b9SJerome Glisse struct radeon_device *rdev = dev->dev_private; 1891*771fe6b9SJerome Glisse 1892*771fe6b9SJerome Glisse if (offset) { 1893*771fe6b9SJerome Glisse while (RBIOS16(offset)) { 1894*771fe6b9SJerome Glisse uint16_t cmd = ((RBIOS16(offset) & 0xe000) >> 13); 1895*771fe6b9SJerome Glisse uint32_t addr = (RBIOS16(offset) & 0x1fff); 1896*771fe6b9SJerome Glisse uint32_t val, and_mask, or_mask; 1897*771fe6b9SJerome Glisse uint32_t tmp; 1898*771fe6b9SJerome Glisse 1899*771fe6b9SJerome Glisse offset += 2; 1900*771fe6b9SJerome Glisse switch (cmd) { 1901*771fe6b9SJerome Glisse case 0: 1902*771fe6b9SJerome Glisse val = RBIOS32(offset); 1903*771fe6b9SJerome Glisse offset += 4; 1904*771fe6b9SJerome Glisse WREG32(addr, val); 1905*771fe6b9SJerome Glisse break; 1906*771fe6b9SJerome Glisse case 1: 1907*771fe6b9SJerome Glisse val = RBIOS32(offset); 1908*771fe6b9SJerome Glisse offset += 4; 1909*771fe6b9SJerome Glisse WREG32(addr, val); 1910*771fe6b9SJerome Glisse break; 1911*771fe6b9SJerome Glisse case 2: 1912*771fe6b9SJerome Glisse and_mask = RBIOS32(offset); 1913*771fe6b9SJerome Glisse offset += 4; 1914*771fe6b9SJerome Glisse or_mask = RBIOS32(offset); 1915*771fe6b9SJerome Glisse offset += 4; 1916*771fe6b9SJerome Glisse tmp = RREG32(addr); 1917*771fe6b9SJerome Glisse tmp &= and_mask; 1918*771fe6b9SJerome Glisse tmp |= or_mask; 1919*771fe6b9SJerome Glisse WREG32(addr, tmp); 1920*771fe6b9SJerome Glisse break; 1921*771fe6b9SJerome Glisse case 3: 1922*771fe6b9SJerome Glisse and_mask = RBIOS32(offset); 1923*771fe6b9SJerome Glisse offset += 4; 1924*771fe6b9SJerome Glisse or_mask = RBIOS32(offset); 1925*771fe6b9SJerome Glisse offset += 4; 1926*771fe6b9SJerome Glisse tmp = RREG32(addr); 1927*771fe6b9SJerome Glisse tmp &= and_mask; 1928*771fe6b9SJerome Glisse tmp |= or_mask; 1929*771fe6b9SJerome Glisse WREG32(addr, tmp); 1930*771fe6b9SJerome Glisse break; 1931*771fe6b9SJerome Glisse case 4: 1932*771fe6b9SJerome Glisse val = RBIOS16(offset); 1933*771fe6b9SJerome Glisse offset += 2; 1934*771fe6b9SJerome Glisse udelay(val); 1935*771fe6b9SJerome Glisse break; 1936*771fe6b9SJerome Glisse case 5: 1937*771fe6b9SJerome Glisse val = RBIOS16(offset); 1938*771fe6b9SJerome Glisse offset += 2; 1939*771fe6b9SJerome Glisse switch (addr) { 1940*771fe6b9SJerome Glisse case 8: 1941*771fe6b9SJerome Glisse while (val--) { 1942*771fe6b9SJerome Glisse if (! 1943*771fe6b9SJerome Glisse (RREG32_PLL 1944*771fe6b9SJerome Glisse (RADEON_CLK_PWRMGT_CNTL) & 1945*771fe6b9SJerome Glisse RADEON_MC_BUSY)) 1946*771fe6b9SJerome Glisse break; 1947*771fe6b9SJerome Glisse } 1948*771fe6b9SJerome Glisse break; 1949*771fe6b9SJerome Glisse case 9: 1950*771fe6b9SJerome Glisse while (val--) { 1951*771fe6b9SJerome Glisse if ((RREG32(RADEON_MC_STATUS) & 1952*771fe6b9SJerome Glisse RADEON_MC_IDLE)) 1953*771fe6b9SJerome Glisse break; 1954*771fe6b9SJerome Glisse } 1955*771fe6b9SJerome Glisse break; 1956*771fe6b9SJerome Glisse default: 1957*771fe6b9SJerome Glisse break; 1958*771fe6b9SJerome Glisse } 1959*771fe6b9SJerome Glisse break; 1960*771fe6b9SJerome Glisse default: 1961*771fe6b9SJerome Glisse break; 1962*771fe6b9SJerome Glisse } 1963*771fe6b9SJerome Glisse } 1964*771fe6b9SJerome Glisse } 1965*771fe6b9SJerome Glisse } 1966*771fe6b9SJerome Glisse 1967*771fe6b9SJerome Glisse static void combios_parse_pll_table(struct drm_device *dev, uint16_t offset) 1968*771fe6b9SJerome Glisse { 1969*771fe6b9SJerome Glisse struct radeon_device *rdev = dev->dev_private; 1970*771fe6b9SJerome Glisse 1971*771fe6b9SJerome Glisse if (offset) { 1972*771fe6b9SJerome Glisse while (RBIOS8(offset)) { 1973*771fe6b9SJerome Glisse uint8_t cmd = ((RBIOS8(offset) & 0xc0) >> 6); 1974*771fe6b9SJerome Glisse uint8_t addr = (RBIOS8(offset) & 0x3f); 1975*771fe6b9SJerome Glisse uint32_t val, shift, tmp; 1976*771fe6b9SJerome Glisse uint32_t and_mask, or_mask; 1977*771fe6b9SJerome Glisse 1978*771fe6b9SJerome Glisse offset++; 1979*771fe6b9SJerome Glisse switch (cmd) { 1980*771fe6b9SJerome Glisse case 0: 1981*771fe6b9SJerome Glisse val = RBIOS32(offset); 1982*771fe6b9SJerome Glisse offset += 4; 1983*771fe6b9SJerome Glisse WREG32_PLL(addr, val); 1984*771fe6b9SJerome Glisse break; 1985*771fe6b9SJerome Glisse case 1: 1986*771fe6b9SJerome Glisse shift = RBIOS8(offset) * 8; 1987*771fe6b9SJerome Glisse offset++; 1988*771fe6b9SJerome Glisse and_mask = RBIOS8(offset) << shift; 1989*771fe6b9SJerome Glisse and_mask |= ~(0xff << shift); 1990*771fe6b9SJerome Glisse offset++; 1991*771fe6b9SJerome Glisse or_mask = RBIOS8(offset) << shift; 1992*771fe6b9SJerome Glisse offset++; 1993*771fe6b9SJerome Glisse tmp = RREG32_PLL(addr); 1994*771fe6b9SJerome Glisse tmp &= and_mask; 1995*771fe6b9SJerome Glisse tmp |= or_mask; 1996*771fe6b9SJerome Glisse WREG32_PLL(addr, tmp); 1997*771fe6b9SJerome Glisse break; 1998*771fe6b9SJerome Glisse case 2: 1999*771fe6b9SJerome Glisse case 3: 2000*771fe6b9SJerome Glisse tmp = 1000; 2001*771fe6b9SJerome Glisse switch (addr) { 2002*771fe6b9SJerome Glisse case 1: 2003*771fe6b9SJerome Glisse udelay(150); 2004*771fe6b9SJerome Glisse break; 2005*771fe6b9SJerome Glisse case 2: 2006*771fe6b9SJerome Glisse udelay(1000); 2007*771fe6b9SJerome Glisse break; 2008*771fe6b9SJerome Glisse case 3: 2009*771fe6b9SJerome Glisse while (tmp--) { 2010*771fe6b9SJerome Glisse if (! 2011*771fe6b9SJerome Glisse (RREG32_PLL 2012*771fe6b9SJerome Glisse (RADEON_CLK_PWRMGT_CNTL) & 2013*771fe6b9SJerome Glisse RADEON_MC_BUSY)) 2014*771fe6b9SJerome Glisse break; 2015*771fe6b9SJerome Glisse } 2016*771fe6b9SJerome Glisse break; 2017*771fe6b9SJerome Glisse case 4: 2018*771fe6b9SJerome Glisse while (tmp--) { 2019*771fe6b9SJerome Glisse if (RREG32_PLL 2020*771fe6b9SJerome Glisse (RADEON_CLK_PWRMGT_CNTL) & 2021*771fe6b9SJerome Glisse RADEON_DLL_READY) 2022*771fe6b9SJerome Glisse break; 2023*771fe6b9SJerome Glisse } 2024*771fe6b9SJerome Glisse break; 2025*771fe6b9SJerome Glisse case 5: 2026*771fe6b9SJerome Glisse tmp = 2027*771fe6b9SJerome Glisse RREG32_PLL(RADEON_CLK_PWRMGT_CNTL); 2028*771fe6b9SJerome Glisse if (tmp & RADEON_CG_NO1_DEBUG_0) { 2029*771fe6b9SJerome Glisse #if 0 2030*771fe6b9SJerome Glisse uint32_t mclk_cntl = 2031*771fe6b9SJerome Glisse RREG32_PLL 2032*771fe6b9SJerome Glisse (RADEON_MCLK_CNTL); 2033*771fe6b9SJerome Glisse mclk_cntl &= 0xffff0000; 2034*771fe6b9SJerome Glisse /*mclk_cntl |= 0x00001111;*//* ??? */ 2035*771fe6b9SJerome Glisse WREG32_PLL(RADEON_MCLK_CNTL, 2036*771fe6b9SJerome Glisse mclk_cntl); 2037*771fe6b9SJerome Glisse udelay(10000); 2038*771fe6b9SJerome Glisse #endif 2039*771fe6b9SJerome Glisse WREG32_PLL 2040*771fe6b9SJerome Glisse (RADEON_CLK_PWRMGT_CNTL, 2041*771fe6b9SJerome Glisse tmp & 2042*771fe6b9SJerome Glisse ~RADEON_CG_NO1_DEBUG_0); 2043*771fe6b9SJerome Glisse udelay(10000); 2044*771fe6b9SJerome Glisse } 2045*771fe6b9SJerome Glisse break; 2046*771fe6b9SJerome Glisse default: 2047*771fe6b9SJerome Glisse break; 2048*771fe6b9SJerome Glisse } 2049*771fe6b9SJerome Glisse break; 2050*771fe6b9SJerome Glisse default: 2051*771fe6b9SJerome Glisse break; 2052*771fe6b9SJerome Glisse } 2053*771fe6b9SJerome Glisse } 2054*771fe6b9SJerome Glisse } 2055*771fe6b9SJerome Glisse } 2056*771fe6b9SJerome Glisse 2057*771fe6b9SJerome Glisse static void combios_parse_ram_reset_table(struct drm_device *dev, 2058*771fe6b9SJerome Glisse uint16_t offset) 2059*771fe6b9SJerome Glisse { 2060*771fe6b9SJerome Glisse struct radeon_device *rdev = dev->dev_private; 2061*771fe6b9SJerome Glisse uint32_t tmp; 2062*771fe6b9SJerome Glisse 2063*771fe6b9SJerome Glisse if (offset) { 2064*771fe6b9SJerome Glisse uint8_t val = RBIOS8(offset); 2065*771fe6b9SJerome Glisse while (val != 0xff) { 2066*771fe6b9SJerome Glisse offset++; 2067*771fe6b9SJerome Glisse 2068*771fe6b9SJerome Glisse if (val == 0x0f) { 2069*771fe6b9SJerome Glisse uint32_t channel_complete_mask; 2070*771fe6b9SJerome Glisse 2071*771fe6b9SJerome Glisse if (ASIC_IS_R300(rdev)) 2072*771fe6b9SJerome Glisse channel_complete_mask = 2073*771fe6b9SJerome Glisse R300_MEM_PWRUP_COMPLETE; 2074*771fe6b9SJerome Glisse else 2075*771fe6b9SJerome Glisse channel_complete_mask = 2076*771fe6b9SJerome Glisse RADEON_MEM_PWRUP_COMPLETE; 2077*771fe6b9SJerome Glisse tmp = 20000; 2078*771fe6b9SJerome Glisse while (tmp--) { 2079*771fe6b9SJerome Glisse if ((RREG32(RADEON_MEM_STR_CNTL) & 2080*771fe6b9SJerome Glisse channel_complete_mask) == 2081*771fe6b9SJerome Glisse channel_complete_mask) 2082*771fe6b9SJerome Glisse break; 2083*771fe6b9SJerome Glisse } 2084*771fe6b9SJerome Glisse } else { 2085*771fe6b9SJerome Glisse uint32_t or_mask = RBIOS16(offset); 2086*771fe6b9SJerome Glisse offset += 2; 2087*771fe6b9SJerome Glisse 2088*771fe6b9SJerome Glisse tmp = RREG32(RADEON_MEM_SDRAM_MODE_REG); 2089*771fe6b9SJerome Glisse tmp &= RADEON_SDRAM_MODE_MASK; 2090*771fe6b9SJerome Glisse tmp |= or_mask; 2091*771fe6b9SJerome Glisse WREG32(RADEON_MEM_SDRAM_MODE_REG, tmp); 2092*771fe6b9SJerome Glisse 2093*771fe6b9SJerome Glisse or_mask = val << 24; 2094*771fe6b9SJerome Glisse tmp = RREG32(RADEON_MEM_SDRAM_MODE_REG); 2095*771fe6b9SJerome Glisse tmp &= RADEON_B3MEM_RESET_MASK; 2096*771fe6b9SJerome Glisse tmp |= or_mask; 2097*771fe6b9SJerome Glisse WREG32(RADEON_MEM_SDRAM_MODE_REG, tmp); 2098*771fe6b9SJerome Glisse } 2099*771fe6b9SJerome Glisse val = RBIOS8(offset); 2100*771fe6b9SJerome Glisse } 2101*771fe6b9SJerome Glisse } 2102*771fe6b9SJerome Glisse } 2103*771fe6b9SJerome Glisse 2104*771fe6b9SJerome Glisse static uint32_t combios_detect_ram(struct drm_device *dev, int ram, 2105*771fe6b9SJerome Glisse int mem_addr_mapping) 2106*771fe6b9SJerome Glisse { 2107*771fe6b9SJerome Glisse struct radeon_device *rdev = dev->dev_private; 2108*771fe6b9SJerome Glisse uint32_t mem_cntl; 2109*771fe6b9SJerome Glisse uint32_t mem_size; 2110*771fe6b9SJerome Glisse uint32_t addr = 0; 2111*771fe6b9SJerome Glisse 2112*771fe6b9SJerome Glisse mem_cntl = RREG32(RADEON_MEM_CNTL); 2113*771fe6b9SJerome Glisse if (mem_cntl & RV100_HALF_MODE) 2114*771fe6b9SJerome Glisse ram /= 2; 2115*771fe6b9SJerome Glisse mem_size = ram; 2116*771fe6b9SJerome Glisse mem_cntl &= ~(0xff << 8); 2117*771fe6b9SJerome Glisse mem_cntl |= (mem_addr_mapping & 0xff) << 8; 2118*771fe6b9SJerome Glisse WREG32(RADEON_MEM_CNTL, mem_cntl); 2119*771fe6b9SJerome Glisse RREG32(RADEON_MEM_CNTL); 2120*771fe6b9SJerome Glisse 2121*771fe6b9SJerome Glisse /* sdram reset ? */ 2122*771fe6b9SJerome Glisse 2123*771fe6b9SJerome Glisse /* something like this???? */ 2124*771fe6b9SJerome Glisse while (ram--) { 2125*771fe6b9SJerome Glisse addr = ram * 1024 * 1024; 2126*771fe6b9SJerome Glisse /* write to each page */ 2127*771fe6b9SJerome Glisse WREG32(RADEON_MM_INDEX, (addr) | RADEON_MM_APER); 2128*771fe6b9SJerome Glisse WREG32(RADEON_MM_DATA, 0xdeadbeef); 2129*771fe6b9SJerome Glisse /* read back and verify */ 2130*771fe6b9SJerome Glisse WREG32(RADEON_MM_INDEX, (addr) | RADEON_MM_APER); 2131*771fe6b9SJerome Glisse if (RREG32(RADEON_MM_DATA) != 0xdeadbeef) 2132*771fe6b9SJerome Glisse return 0; 2133*771fe6b9SJerome Glisse } 2134*771fe6b9SJerome Glisse 2135*771fe6b9SJerome Glisse return mem_size; 2136*771fe6b9SJerome Glisse } 2137*771fe6b9SJerome Glisse 2138*771fe6b9SJerome Glisse static void combios_write_ram_size(struct drm_device *dev) 2139*771fe6b9SJerome Glisse { 2140*771fe6b9SJerome Glisse struct radeon_device *rdev = dev->dev_private; 2141*771fe6b9SJerome Glisse uint8_t rev; 2142*771fe6b9SJerome Glisse uint16_t offset; 2143*771fe6b9SJerome Glisse uint32_t mem_size = 0; 2144*771fe6b9SJerome Glisse uint32_t mem_cntl = 0; 2145*771fe6b9SJerome Glisse 2146*771fe6b9SJerome Glisse /* should do something smarter here I guess... */ 2147*771fe6b9SJerome Glisse if (rdev->flags & RADEON_IS_IGP) 2148*771fe6b9SJerome Glisse return; 2149*771fe6b9SJerome Glisse 2150*771fe6b9SJerome Glisse /* first check detected mem table */ 2151*771fe6b9SJerome Glisse offset = combios_get_table_offset(dev, COMBIOS_DETECTED_MEM_TABLE); 2152*771fe6b9SJerome Glisse if (offset) { 2153*771fe6b9SJerome Glisse rev = RBIOS8(offset); 2154*771fe6b9SJerome Glisse if (rev < 3) { 2155*771fe6b9SJerome Glisse mem_cntl = RBIOS32(offset + 1); 2156*771fe6b9SJerome Glisse mem_size = RBIOS16(offset + 5); 2157*771fe6b9SJerome Glisse if (((rdev->flags & RADEON_FAMILY_MASK) < CHIP_R200) && 2158*771fe6b9SJerome Glisse ((dev->pdev->device != 0x515e) 2159*771fe6b9SJerome Glisse && (dev->pdev->device != 0x5969))) 2160*771fe6b9SJerome Glisse WREG32(RADEON_MEM_CNTL, mem_cntl); 2161*771fe6b9SJerome Glisse } 2162*771fe6b9SJerome Glisse } 2163*771fe6b9SJerome Glisse 2164*771fe6b9SJerome Glisse if (!mem_size) { 2165*771fe6b9SJerome Glisse offset = 2166*771fe6b9SJerome Glisse combios_get_table_offset(dev, COMBIOS_MEM_CONFIG_TABLE); 2167*771fe6b9SJerome Glisse if (offset) { 2168*771fe6b9SJerome Glisse rev = RBIOS8(offset - 1); 2169*771fe6b9SJerome Glisse if (rev < 1) { 2170*771fe6b9SJerome Glisse if (((rdev->flags & RADEON_FAMILY_MASK) < 2171*771fe6b9SJerome Glisse CHIP_R200) 2172*771fe6b9SJerome Glisse && ((dev->pdev->device != 0x515e) 2173*771fe6b9SJerome Glisse && (dev->pdev->device != 0x5969))) { 2174*771fe6b9SJerome Glisse int ram = 0; 2175*771fe6b9SJerome Glisse int mem_addr_mapping = 0; 2176*771fe6b9SJerome Glisse 2177*771fe6b9SJerome Glisse while (RBIOS8(offset)) { 2178*771fe6b9SJerome Glisse ram = RBIOS8(offset); 2179*771fe6b9SJerome Glisse mem_addr_mapping = 2180*771fe6b9SJerome Glisse RBIOS8(offset + 1); 2181*771fe6b9SJerome Glisse if (mem_addr_mapping != 0x25) 2182*771fe6b9SJerome Glisse ram *= 2; 2183*771fe6b9SJerome Glisse mem_size = 2184*771fe6b9SJerome Glisse combios_detect_ram(dev, ram, 2185*771fe6b9SJerome Glisse mem_addr_mapping); 2186*771fe6b9SJerome Glisse if (mem_size) 2187*771fe6b9SJerome Glisse break; 2188*771fe6b9SJerome Glisse offset += 2; 2189*771fe6b9SJerome Glisse } 2190*771fe6b9SJerome Glisse } else 2191*771fe6b9SJerome Glisse mem_size = RBIOS8(offset); 2192*771fe6b9SJerome Glisse } else { 2193*771fe6b9SJerome Glisse mem_size = RBIOS8(offset); 2194*771fe6b9SJerome Glisse mem_size *= 2; /* convert to MB */ 2195*771fe6b9SJerome Glisse } 2196*771fe6b9SJerome Glisse } 2197*771fe6b9SJerome Glisse } 2198*771fe6b9SJerome Glisse 2199*771fe6b9SJerome Glisse mem_size *= (1024 * 1024); /* convert to bytes */ 2200*771fe6b9SJerome Glisse WREG32(RADEON_CONFIG_MEMSIZE, mem_size); 2201*771fe6b9SJerome Glisse } 2202*771fe6b9SJerome Glisse 2203*771fe6b9SJerome Glisse void radeon_combios_dyn_clk_setup(struct drm_device *dev, int enable) 2204*771fe6b9SJerome Glisse { 2205*771fe6b9SJerome Glisse uint16_t dyn_clk_info = 2206*771fe6b9SJerome Glisse combios_get_table_offset(dev, COMBIOS_DYN_CLK_1_TABLE); 2207*771fe6b9SJerome Glisse 2208*771fe6b9SJerome Glisse if (dyn_clk_info) 2209*771fe6b9SJerome Glisse combios_parse_pll_table(dev, dyn_clk_info); 2210*771fe6b9SJerome Glisse } 2211*771fe6b9SJerome Glisse 2212*771fe6b9SJerome Glisse void radeon_combios_asic_init(struct drm_device *dev) 2213*771fe6b9SJerome Glisse { 2214*771fe6b9SJerome Glisse struct radeon_device *rdev = dev->dev_private; 2215*771fe6b9SJerome Glisse uint16_t table; 2216*771fe6b9SJerome Glisse 2217*771fe6b9SJerome Glisse /* port hardcoded mac stuff from radeonfb */ 2218*771fe6b9SJerome Glisse if (rdev->bios == NULL) 2219*771fe6b9SJerome Glisse return; 2220*771fe6b9SJerome Glisse 2221*771fe6b9SJerome Glisse /* ASIC INIT 1 */ 2222*771fe6b9SJerome Glisse table = combios_get_table_offset(dev, COMBIOS_ASIC_INIT_1_TABLE); 2223*771fe6b9SJerome Glisse if (table) 2224*771fe6b9SJerome Glisse combios_parse_mmio_table(dev, table); 2225*771fe6b9SJerome Glisse 2226*771fe6b9SJerome Glisse /* PLL INIT */ 2227*771fe6b9SJerome Glisse table = combios_get_table_offset(dev, COMBIOS_PLL_INIT_TABLE); 2228*771fe6b9SJerome Glisse if (table) 2229*771fe6b9SJerome Glisse combios_parse_pll_table(dev, table); 2230*771fe6b9SJerome Glisse 2231*771fe6b9SJerome Glisse /* ASIC INIT 2 */ 2232*771fe6b9SJerome Glisse table = combios_get_table_offset(dev, COMBIOS_ASIC_INIT_2_TABLE); 2233*771fe6b9SJerome Glisse if (table) 2234*771fe6b9SJerome Glisse combios_parse_mmio_table(dev, table); 2235*771fe6b9SJerome Glisse 2236*771fe6b9SJerome Glisse if (!(rdev->flags & RADEON_IS_IGP)) { 2237*771fe6b9SJerome Glisse /* ASIC INIT 4 */ 2238*771fe6b9SJerome Glisse table = 2239*771fe6b9SJerome Glisse combios_get_table_offset(dev, COMBIOS_ASIC_INIT_4_TABLE); 2240*771fe6b9SJerome Glisse if (table) 2241*771fe6b9SJerome Glisse combios_parse_mmio_table(dev, table); 2242*771fe6b9SJerome Glisse 2243*771fe6b9SJerome Glisse /* RAM RESET */ 2244*771fe6b9SJerome Glisse table = combios_get_table_offset(dev, COMBIOS_RAM_RESET_TABLE); 2245*771fe6b9SJerome Glisse if (table) 2246*771fe6b9SJerome Glisse combios_parse_ram_reset_table(dev, table); 2247*771fe6b9SJerome Glisse 2248*771fe6b9SJerome Glisse /* ASIC INIT 3 */ 2249*771fe6b9SJerome Glisse table = 2250*771fe6b9SJerome Glisse combios_get_table_offset(dev, COMBIOS_ASIC_INIT_3_TABLE); 2251*771fe6b9SJerome Glisse if (table) 2252*771fe6b9SJerome Glisse combios_parse_mmio_table(dev, table); 2253*771fe6b9SJerome Glisse 2254*771fe6b9SJerome Glisse /* write CONFIG_MEMSIZE */ 2255*771fe6b9SJerome Glisse combios_write_ram_size(dev); 2256*771fe6b9SJerome Glisse } 2257*771fe6b9SJerome Glisse 2258*771fe6b9SJerome Glisse /* DYN CLK 1 */ 2259*771fe6b9SJerome Glisse table = combios_get_table_offset(dev, COMBIOS_DYN_CLK_1_TABLE); 2260*771fe6b9SJerome Glisse if (table) 2261*771fe6b9SJerome Glisse combios_parse_pll_table(dev, table); 2262*771fe6b9SJerome Glisse 2263*771fe6b9SJerome Glisse } 2264*771fe6b9SJerome Glisse 2265*771fe6b9SJerome Glisse void radeon_combios_initialize_bios_scratch_regs(struct drm_device *dev) 2266*771fe6b9SJerome Glisse { 2267*771fe6b9SJerome Glisse struct radeon_device *rdev = dev->dev_private; 2268*771fe6b9SJerome Glisse uint32_t bios_0_scratch, bios_6_scratch, bios_7_scratch; 2269*771fe6b9SJerome Glisse 2270*771fe6b9SJerome Glisse bios_0_scratch = RREG32(RADEON_BIOS_0_SCRATCH); 2271*771fe6b9SJerome Glisse bios_6_scratch = RREG32(RADEON_BIOS_6_SCRATCH); 2272*771fe6b9SJerome Glisse bios_7_scratch = RREG32(RADEON_BIOS_7_SCRATCH); 2273*771fe6b9SJerome Glisse 2274*771fe6b9SJerome Glisse /* let the bios control the backlight */ 2275*771fe6b9SJerome Glisse bios_0_scratch &= ~RADEON_DRIVER_BRIGHTNESS_EN; 2276*771fe6b9SJerome Glisse 2277*771fe6b9SJerome Glisse /* tell the bios not to handle mode switching */ 2278*771fe6b9SJerome Glisse bios_6_scratch |= (RADEON_DISPLAY_SWITCHING_DIS | 2279*771fe6b9SJerome Glisse RADEON_ACC_MODE_CHANGE); 2280*771fe6b9SJerome Glisse 2281*771fe6b9SJerome Glisse /* tell the bios a driver is loaded */ 2282*771fe6b9SJerome Glisse bios_7_scratch |= RADEON_DRV_LOADED; 2283*771fe6b9SJerome Glisse 2284*771fe6b9SJerome Glisse WREG32(RADEON_BIOS_0_SCRATCH, bios_0_scratch); 2285*771fe6b9SJerome Glisse WREG32(RADEON_BIOS_6_SCRATCH, bios_6_scratch); 2286*771fe6b9SJerome Glisse WREG32(RADEON_BIOS_7_SCRATCH, bios_7_scratch); 2287*771fe6b9SJerome Glisse } 2288*771fe6b9SJerome Glisse 2289*771fe6b9SJerome Glisse void radeon_combios_output_lock(struct drm_encoder *encoder, bool lock) 2290*771fe6b9SJerome Glisse { 2291*771fe6b9SJerome Glisse struct drm_device *dev = encoder->dev; 2292*771fe6b9SJerome Glisse struct radeon_device *rdev = dev->dev_private; 2293*771fe6b9SJerome Glisse uint32_t bios_6_scratch; 2294*771fe6b9SJerome Glisse 2295*771fe6b9SJerome Glisse bios_6_scratch = RREG32(RADEON_BIOS_6_SCRATCH); 2296*771fe6b9SJerome Glisse 2297*771fe6b9SJerome Glisse if (lock) 2298*771fe6b9SJerome Glisse bios_6_scratch |= RADEON_DRIVER_CRITICAL; 2299*771fe6b9SJerome Glisse else 2300*771fe6b9SJerome Glisse bios_6_scratch &= ~RADEON_DRIVER_CRITICAL; 2301*771fe6b9SJerome Glisse 2302*771fe6b9SJerome Glisse WREG32(RADEON_BIOS_6_SCRATCH, bios_6_scratch); 2303*771fe6b9SJerome Glisse } 2304*771fe6b9SJerome Glisse 2305*771fe6b9SJerome Glisse void 2306*771fe6b9SJerome Glisse radeon_combios_connected_scratch_regs(struct drm_connector *connector, 2307*771fe6b9SJerome Glisse struct drm_encoder *encoder, 2308*771fe6b9SJerome Glisse bool connected) 2309*771fe6b9SJerome Glisse { 2310*771fe6b9SJerome Glisse struct drm_device *dev = connector->dev; 2311*771fe6b9SJerome Glisse struct radeon_device *rdev = dev->dev_private; 2312*771fe6b9SJerome Glisse struct radeon_connector *radeon_connector = 2313*771fe6b9SJerome Glisse to_radeon_connector(connector); 2314*771fe6b9SJerome Glisse struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 2315*771fe6b9SJerome Glisse uint32_t bios_4_scratch = RREG32(RADEON_BIOS_4_SCRATCH); 2316*771fe6b9SJerome Glisse uint32_t bios_5_scratch = RREG32(RADEON_BIOS_5_SCRATCH); 2317*771fe6b9SJerome Glisse 2318*771fe6b9SJerome Glisse if ((radeon_encoder->devices & ATOM_DEVICE_TV1_SUPPORT) && 2319*771fe6b9SJerome Glisse (radeon_connector->devices & ATOM_DEVICE_TV1_SUPPORT)) { 2320*771fe6b9SJerome Glisse if (connected) { 2321*771fe6b9SJerome Glisse DRM_DEBUG("TV1 connected\n"); 2322*771fe6b9SJerome Glisse /* fix me */ 2323*771fe6b9SJerome Glisse bios_4_scratch |= RADEON_TV1_ATTACHED_SVIDEO; 2324*771fe6b9SJerome Glisse /*save->bios_4_scratch |= RADEON_TV1_ATTACHED_COMP; */ 2325*771fe6b9SJerome Glisse bios_5_scratch |= RADEON_TV1_ON; 2326*771fe6b9SJerome Glisse bios_5_scratch |= RADEON_ACC_REQ_TV1; 2327*771fe6b9SJerome Glisse } else { 2328*771fe6b9SJerome Glisse DRM_DEBUG("TV1 disconnected\n"); 2329*771fe6b9SJerome Glisse bios_4_scratch &= ~RADEON_TV1_ATTACHED_MASK; 2330*771fe6b9SJerome Glisse bios_5_scratch &= ~RADEON_TV1_ON; 2331*771fe6b9SJerome Glisse bios_5_scratch &= ~RADEON_ACC_REQ_TV1; 2332*771fe6b9SJerome Glisse } 2333*771fe6b9SJerome Glisse } 2334*771fe6b9SJerome Glisse if ((radeon_encoder->devices & ATOM_DEVICE_LCD1_SUPPORT) && 2335*771fe6b9SJerome Glisse (radeon_connector->devices & ATOM_DEVICE_LCD1_SUPPORT)) { 2336*771fe6b9SJerome Glisse if (connected) { 2337*771fe6b9SJerome Glisse DRM_DEBUG("LCD1 connected\n"); 2338*771fe6b9SJerome Glisse bios_4_scratch |= RADEON_LCD1_ATTACHED; 2339*771fe6b9SJerome Glisse bios_5_scratch |= RADEON_LCD1_ON; 2340*771fe6b9SJerome Glisse bios_5_scratch |= RADEON_ACC_REQ_LCD1; 2341*771fe6b9SJerome Glisse } else { 2342*771fe6b9SJerome Glisse DRM_DEBUG("LCD1 disconnected\n"); 2343*771fe6b9SJerome Glisse bios_4_scratch &= ~RADEON_LCD1_ATTACHED; 2344*771fe6b9SJerome Glisse bios_5_scratch &= ~RADEON_LCD1_ON; 2345*771fe6b9SJerome Glisse bios_5_scratch &= ~RADEON_ACC_REQ_LCD1; 2346*771fe6b9SJerome Glisse } 2347*771fe6b9SJerome Glisse } 2348*771fe6b9SJerome Glisse if ((radeon_encoder->devices & ATOM_DEVICE_CRT1_SUPPORT) && 2349*771fe6b9SJerome Glisse (radeon_connector->devices & ATOM_DEVICE_CRT1_SUPPORT)) { 2350*771fe6b9SJerome Glisse if (connected) { 2351*771fe6b9SJerome Glisse DRM_DEBUG("CRT1 connected\n"); 2352*771fe6b9SJerome Glisse bios_4_scratch |= RADEON_CRT1_ATTACHED_COLOR; 2353*771fe6b9SJerome Glisse bios_5_scratch |= RADEON_CRT1_ON; 2354*771fe6b9SJerome Glisse bios_5_scratch |= RADEON_ACC_REQ_CRT1; 2355*771fe6b9SJerome Glisse } else { 2356*771fe6b9SJerome Glisse DRM_DEBUG("CRT1 disconnected\n"); 2357*771fe6b9SJerome Glisse bios_4_scratch &= ~RADEON_CRT1_ATTACHED_MASK; 2358*771fe6b9SJerome Glisse bios_5_scratch &= ~RADEON_CRT1_ON; 2359*771fe6b9SJerome Glisse bios_5_scratch &= ~RADEON_ACC_REQ_CRT1; 2360*771fe6b9SJerome Glisse } 2361*771fe6b9SJerome Glisse } 2362*771fe6b9SJerome Glisse if ((radeon_encoder->devices & ATOM_DEVICE_CRT2_SUPPORT) && 2363*771fe6b9SJerome Glisse (radeon_connector->devices & ATOM_DEVICE_CRT2_SUPPORT)) { 2364*771fe6b9SJerome Glisse if (connected) { 2365*771fe6b9SJerome Glisse DRM_DEBUG("CRT2 connected\n"); 2366*771fe6b9SJerome Glisse bios_4_scratch |= RADEON_CRT2_ATTACHED_COLOR; 2367*771fe6b9SJerome Glisse bios_5_scratch |= RADEON_CRT2_ON; 2368*771fe6b9SJerome Glisse bios_5_scratch |= RADEON_ACC_REQ_CRT2; 2369*771fe6b9SJerome Glisse } else { 2370*771fe6b9SJerome Glisse DRM_DEBUG("CRT2 disconnected\n"); 2371*771fe6b9SJerome Glisse bios_4_scratch &= ~RADEON_CRT2_ATTACHED_MASK; 2372*771fe6b9SJerome Glisse bios_5_scratch &= ~RADEON_CRT2_ON; 2373*771fe6b9SJerome Glisse bios_5_scratch &= ~RADEON_ACC_REQ_CRT2; 2374*771fe6b9SJerome Glisse } 2375*771fe6b9SJerome Glisse } 2376*771fe6b9SJerome Glisse if ((radeon_encoder->devices & ATOM_DEVICE_DFP1_SUPPORT) && 2377*771fe6b9SJerome Glisse (radeon_connector->devices & ATOM_DEVICE_DFP1_SUPPORT)) { 2378*771fe6b9SJerome Glisse if (connected) { 2379*771fe6b9SJerome Glisse DRM_DEBUG("DFP1 connected\n"); 2380*771fe6b9SJerome Glisse bios_4_scratch |= RADEON_DFP1_ATTACHED; 2381*771fe6b9SJerome Glisse bios_5_scratch |= RADEON_DFP1_ON; 2382*771fe6b9SJerome Glisse bios_5_scratch |= RADEON_ACC_REQ_DFP1; 2383*771fe6b9SJerome Glisse } else { 2384*771fe6b9SJerome Glisse DRM_DEBUG("DFP1 disconnected\n"); 2385*771fe6b9SJerome Glisse bios_4_scratch &= ~RADEON_DFP1_ATTACHED; 2386*771fe6b9SJerome Glisse bios_5_scratch &= ~RADEON_DFP1_ON; 2387*771fe6b9SJerome Glisse bios_5_scratch &= ~RADEON_ACC_REQ_DFP1; 2388*771fe6b9SJerome Glisse } 2389*771fe6b9SJerome Glisse } 2390*771fe6b9SJerome Glisse if ((radeon_encoder->devices & ATOM_DEVICE_DFP2_SUPPORT) && 2391*771fe6b9SJerome Glisse (radeon_connector->devices & ATOM_DEVICE_DFP2_SUPPORT)) { 2392*771fe6b9SJerome Glisse if (connected) { 2393*771fe6b9SJerome Glisse DRM_DEBUG("DFP2 connected\n"); 2394*771fe6b9SJerome Glisse bios_4_scratch |= RADEON_DFP2_ATTACHED; 2395*771fe6b9SJerome Glisse bios_5_scratch |= RADEON_DFP2_ON; 2396*771fe6b9SJerome Glisse bios_5_scratch |= RADEON_ACC_REQ_DFP2; 2397*771fe6b9SJerome Glisse } else { 2398*771fe6b9SJerome Glisse DRM_DEBUG("DFP2 disconnected\n"); 2399*771fe6b9SJerome Glisse bios_4_scratch &= ~RADEON_DFP2_ATTACHED; 2400*771fe6b9SJerome Glisse bios_5_scratch &= ~RADEON_DFP2_ON; 2401*771fe6b9SJerome Glisse bios_5_scratch &= ~RADEON_ACC_REQ_DFP2; 2402*771fe6b9SJerome Glisse } 2403*771fe6b9SJerome Glisse } 2404*771fe6b9SJerome Glisse WREG32(RADEON_BIOS_4_SCRATCH, bios_4_scratch); 2405*771fe6b9SJerome Glisse WREG32(RADEON_BIOS_5_SCRATCH, bios_5_scratch); 2406*771fe6b9SJerome Glisse } 2407*771fe6b9SJerome Glisse 2408*771fe6b9SJerome Glisse void 2409*771fe6b9SJerome Glisse radeon_combios_encoder_crtc_scratch_regs(struct drm_encoder *encoder, int crtc) 2410*771fe6b9SJerome Glisse { 2411*771fe6b9SJerome Glisse struct drm_device *dev = encoder->dev; 2412*771fe6b9SJerome Glisse struct radeon_device *rdev = dev->dev_private; 2413*771fe6b9SJerome Glisse struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 2414*771fe6b9SJerome Glisse uint32_t bios_5_scratch = RREG32(RADEON_BIOS_5_SCRATCH); 2415*771fe6b9SJerome Glisse 2416*771fe6b9SJerome Glisse if (radeon_encoder->devices & ATOM_DEVICE_TV1_SUPPORT) { 2417*771fe6b9SJerome Glisse bios_5_scratch &= ~RADEON_TV1_CRTC_MASK; 2418*771fe6b9SJerome Glisse bios_5_scratch |= (crtc << RADEON_TV1_CRTC_SHIFT); 2419*771fe6b9SJerome Glisse } 2420*771fe6b9SJerome Glisse if (radeon_encoder->devices & ATOM_DEVICE_CRT1_SUPPORT) { 2421*771fe6b9SJerome Glisse bios_5_scratch &= ~RADEON_CRT1_CRTC_MASK; 2422*771fe6b9SJerome Glisse bios_5_scratch |= (crtc << RADEON_CRT1_CRTC_SHIFT); 2423*771fe6b9SJerome Glisse } 2424*771fe6b9SJerome Glisse if (radeon_encoder->devices & ATOM_DEVICE_CRT2_SUPPORT) { 2425*771fe6b9SJerome Glisse bios_5_scratch &= ~RADEON_CRT2_CRTC_MASK; 2426*771fe6b9SJerome Glisse bios_5_scratch |= (crtc << RADEON_CRT2_CRTC_SHIFT); 2427*771fe6b9SJerome Glisse } 2428*771fe6b9SJerome Glisse if (radeon_encoder->devices & ATOM_DEVICE_LCD1_SUPPORT) { 2429*771fe6b9SJerome Glisse bios_5_scratch &= ~RADEON_LCD1_CRTC_MASK; 2430*771fe6b9SJerome Glisse bios_5_scratch |= (crtc << RADEON_LCD1_CRTC_SHIFT); 2431*771fe6b9SJerome Glisse } 2432*771fe6b9SJerome Glisse if (radeon_encoder->devices & ATOM_DEVICE_DFP1_SUPPORT) { 2433*771fe6b9SJerome Glisse bios_5_scratch &= ~RADEON_DFP1_CRTC_MASK; 2434*771fe6b9SJerome Glisse bios_5_scratch |= (crtc << RADEON_DFP1_CRTC_SHIFT); 2435*771fe6b9SJerome Glisse } 2436*771fe6b9SJerome Glisse if (radeon_encoder->devices & ATOM_DEVICE_DFP2_SUPPORT) { 2437*771fe6b9SJerome Glisse bios_5_scratch &= ~RADEON_DFP2_CRTC_MASK; 2438*771fe6b9SJerome Glisse bios_5_scratch |= (crtc << RADEON_DFP2_CRTC_SHIFT); 2439*771fe6b9SJerome Glisse } 2440*771fe6b9SJerome Glisse WREG32(RADEON_BIOS_5_SCRATCH, bios_5_scratch); 2441*771fe6b9SJerome Glisse } 2442*771fe6b9SJerome Glisse 2443*771fe6b9SJerome Glisse void 2444*771fe6b9SJerome Glisse radeon_combios_encoder_dpms_scratch_regs(struct drm_encoder *encoder, bool on) 2445*771fe6b9SJerome Glisse { 2446*771fe6b9SJerome Glisse struct drm_device *dev = encoder->dev; 2447*771fe6b9SJerome Glisse struct radeon_device *rdev = dev->dev_private; 2448*771fe6b9SJerome Glisse struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 2449*771fe6b9SJerome Glisse uint32_t bios_6_scratch = RREG32(RADEON_BIOS_6_SCRATCH); 2450*771fe6b9SJerome Glisse 2451*771fe6b9SJerome Glisse if (radeon_encoder->devices & (ATOM_DEVICE_TV_SUPPORT)) { 2452*771fe6b9SJerome Glisse if (on) 2453*771fe6b9SJerome Glisse bios_6_scratch |= RADEON_TV_DPMS_ON; 2454*771fe6b9SJerome Glisse else 2455*771fe6b9SJerome Glisse bios_6_scratch &= ~RADEON_TV_DPMS_ON; 2456*771fe6b9SJerome Glisse } 2457*771fe6b9SJerome Glisse if (radeon_encoder->devices & (ATOM_DEVICE_CRT_SUPPORT)) { 2458*771fe6b9SJerome Glisse if (on) 2459*771fe6b9SJerome Glisse bios_6_scratch |= RADEON_CRT_DPMS_ON; 2460*771fe6b9SJerome Glisse else 2461*771fe6b9SJerome Glisse bios_6_scratch &= ~RADEON_CRT_DPMS_ON; 2462*771fe6b9SJerome Glisse } 2463*771fe6b9SJerome Glisse if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) { 2464*771fe6b9SJerome Glisse if (on) 2465*771fe6b9SJerome Glisse bios_6_scratch |= RADEON_LCD_DPMS_ON; 2466*771fe6b9SJerome Glisse else 2467*771fe6b9SJerome Glisse bios_6_scratch &= ~RADEON_LCD_DPMS_ON; 2468*771fe6b9SJerome Glisse } 2469*771fe6b9SJerome Glisse if (radeon_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) { 2470*771fe6b9SJerome Glisse if (on) 2471*771fe6b9SJerome Glisse bios_6_scratch |= RADEON_DFP_DPMS_ON; 2472*771fe6b9SJerome Glisse else 2473*771fe6b9SJerome Glisse bios_6_scratch &= ~RADEON_DFP_DPMS_ON; 2474*771fe6b9SJerome Glisse } 2475*771fe6b9SJerome Glisse WREG32(RADEON_BIOS_6_SCRATCH, bios_6_scratch); 2476*771fe6b9SJerome Glisse } 2477