diff options
| author | Alex Deucher <alexdeucher@gmail.com> | 2011-05-20 04:34:22 -0400 |
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2011-05-20 06:02:29 -0400 |
| commit | eac4dff6d3edc0aea1941db16c03ae19aa628a3c (patch) | |
| tree | 64298dcef86d900624abb1490e79cdf43bd94036 /drivers/gpu | |
| parent | 834b2904bbfde3d85b5e984688777d56e9c7bf80 (diff) | |
drm/radeon/kms: handle DP bridges
Fusion hardware often has DP to VGA/LVDS/TMDS bridges to
handle non-DP encoders. Internally we treat them mostly
like DP.
Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu')
| -rw-r--r-- | drivers/gpu/drm/radeon/atombios_crtc.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_connectors.c | 433 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_encoders.c | 5 |
3 files changed, 263 insertions, 181 deletions
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c index 9770afff4d4c..dab06fb17cb2 100644 --- a/drivers/gpu/drm/radeon/atombios_crtc.c +++ b/drivers/gpu/drm/radeon/atombios_crtc.c | |||
| @@ -557,7 +557,8 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc, | |||
| 557 | if (connector) | 557 | if (connector) |
| 558 | bpc = connector->display_info.bpc; | 558 | bpc = connector->display_info.bpc; |
| 559 | encoder_mode = atombios_get_encoder_mode(encoder); | 559 | encoder_mode = atombios_get_encoder_mode(encoder); |
| 560 | if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT | ATOM_DEVICE_DFP_SUPPORT)) { | 560 | if ((radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT | ATOM_DEVICE_DFP_SUPPORT)) || |
| 561 | radeon_encoder_is_dp_bridge(encoder)) { | ||
| 561 | if (connector) { | 562 | if (connector) { |
| 562 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); | 563 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
| 563 | struct radeon_connector_atom_dig *dig_connector = | 564 | struct radeon_connector_atom_dig *dig_connector = |
| @@ -637,7 +638,8 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc, | |||
| 637 | if (ss_enabled && ss->percentage) | 638 | if (ss_enabled && ss->percentage) |
| 638 | args.v3.sInput.ucDispPllConfig |= | 639 | args.v3.sInput.ucDispPllConfig |= |
| 639 | DISPPLL_CONFIG_SS_ENABLE; | 640 | DISPPLL_CONFIG_SS_ENABLE; |
| 640 | if (radeon_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) { | 641 | if (radeon_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT) || |
| 642 | radeon_encoder_is_dp_bridge(encoder)) { | ||
| 641 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; | 643 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; |
| 642 | if (encoder_mode == ATOM_ENCODER_MODE_DP) { | 644 | if (encoder_mode == ATOM_ENCODER_MODE_DP) { |
| 643 | args.v3.sInput.ucDispPllConfig |= | 645 | args.v3.sInput.ucDispPllConfig |= |
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c index ac3165aeff36..356feea41444 100644 --- a/drivers/gpu/drm/radeon/radeon_connectors.c +++ b/drivers/gpu/drm/radeon/radeon_connectors.c | |||
| @@ -1230,8 +1230,11 @@ radeon_add_atom_connector(struct drm_device *dev, | |||
| 1230 | struct drm_connector *connector; | 1230 | struct drm_connector *connector; |
| 1231 | struct radeon_connector *radeon_connector; | 1231 | struct radeon_connector *radeon_connector; |
| 1232 | struct radeon_connector_atom_dig *radeon_dig_connector; | 1232 | struct radeon_connector_atom_dig *radeon_dig_connector; |
| 1233 | struct drm_encoder *encoder; | ||
| 1234 | struct radeon_encoder *radeon_encoder; | ||
| 1233 | uint32_t subpixel_order = SubPixelNone; | 1235 | uint32_t subpixel_order = SubPixelNone; |
| 1234 | bool shared_ddc = false; | 1236 | bool shared_ddc = false; |
| 1237 | bool is_dp_bridge = false; | ||
| 1235 | 1238 | ||
| 1236 | if (connector_type == DRM_MODE_CONNECTOR_Unknown) | 1239 | if (connector_type == DRM_MODE_CONNECTOR_Unknown) |
| 1237 | return; | 1240 | return; |
| @@ -1263,6 +1266,21 @@ radeon_add_atom_connector(struct drm_device *dev, | |||
| 1263 | } | 1266 | } |
| 1264 | } | 1267 | } |
| 1265 | 1268 | ||
| 1269 | /* check if it's a dp bridge */ | ||
| 1270 | list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { | ||
| 1271 | radeon_encoder = to_radeon_encoder(encoder); | ||
| 1272 | if (radeon_encoder->devices & supported_device) { | ||
| 1273 | switch (radeon_encoder->encoder_id) { | ||
| 1274 | case ENCODER_OBJECT_ID_TRAVIS: | ||
| 1275 | case ENCODER_OBJECT_ID_NUTMEG: | ||
| 1276 | is_dp_bridge = true; | ||
| 1277 | break; | ||
| 1278 | default: | ||
| 1279 | break; | ||
| 1280 | } | ||
| 1281 | } | ||
| 1282 | } | ||
| 1283 | |||
| 1266 | radeon_connector = kzalloc(sizeof(struct radeon_connector), GFP_KERNEL); | 1284 | radeon_connector = kzalloc(sizeof(struct radeon_connector), GFP_KERNEL); |
| 1267 | if (!radeon_connector) | 1285 | if (!radeon_connector) |
| 1268 | return; | 1286 | return; |
| @@ -1280,61 +1298,39 @@ radeon_add_atom_connector(struct drm_device *dev, | |||
| 1280 | if (!radeon_connector->router_bus) | 1298 | if (!radeon_connector->router_bus) |
| 1281 | DRM_ERROR("Failed to assign router i2c bus! Check dmesg for i2c errors.\n"); | 1299 | DRM_ERROR("Failed to assign router i2c bus! Check dmesg for i2c errors.\n"); |
| 1282 | } | 1300 | } |
| 1283 | switch (connector_type) { | 1301 | |
| 1284 | case DRM_MODE_CONNECTOR_VGA: | 1302 | if (is_dp_bridge) { |
| 1285 | drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type); | ||
| 1286 | drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs); | ||
| 1287 | if (i2c_bus->valid) { | ||
| 1288 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); | ||
| 1289 | if (!radeon_connector->ddc_bus) | ||
| 1290 | DRM_ERROR("VGA: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); | ||
| 1291 | } | ||
| 1292 | radeon_connector->dac_load_detect = true; | ||
| 1293 | drm_connector_attach_property(&radeon_connector->base, | ||
| 1294 | rdev->mode_info.load_detect_property, | ||
| 1295 | 1); | ||
| 1296 | /* no HPD on analog connectors */ | ||
| 1297 | radeon_connector->hpd.hpd = RADEON_HPD_NONE; | ||
| 1298 | connector->polled = DRM_CONNECTOR_POLL_CONNECT; | ||
| 1299 | connector->interlace_allowed = true; | ||
| 1300 | connector->doublescan_allowed = true; | ||
| 1301 | break; | ||
| 1302 | case DRM_MODE_CONNECTOR_DVIA: | ||
| 1303 | drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type); | ||
| 1304 | drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs); | ||
| 1305 | if (i2c_bus->valid) { | ||
| 1306 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); | ||
| 1307 | if (!radeon_connector->ddc_bus) | ||
| 1308 | DRM_ERROR("DVIA: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); | ||
| 1309 | } | ||
| 1310 | radeon_connector->dac_load_detect = true; | ||
| 1311 | drm_connector_attach_property(&radeon_connector->base, | ||
| 1312 | rdev->mode_info.load_detect_property, | ||
| 1313 | 1); | ||
| 1314 | /* no HPD on analog connectors */ | ||
| 1315 | radeon_connector->hpd.hpd = RADEON_HPD_NONE; | ||
| 1316 | connector->interlace_allowed = true; | ||
| 1317 | connector->doublescan_allowed = true; | ||
| 1318 | break; | ||
| 1319 | case DRM_MODE_CONNECTOR_DVII: | ||
| 1320 | case DRM_MODE_CONNECTOR_DVID: | ||
| 1321 | radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL); | 1303 | radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL); |
| 1322 | if (!radeon_dig_connector) | 1304 | if (!radeon_dig_connector) |
| 1323 | goto failed; | 1305 | goto failed; |
| 1324 | radeon_dig_connector->igp_lane_info = igp_lane_info; | 1306 | radeon_dig_connector->igp_lane_info = igp_lane_info; |
| 1325 | radeon_connector->con_priv = radeon_dig_connector; | 1307 | radeon_connector->con_priv = radeon_dig_connector; |
| 1326 | drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type); | 1308 | drm_connector_init(dev, &radeon_connector->base, &radeon_dp_connector_funcs, connector_type); |
| 1327 | drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs); | 1309 | drm_connector_helper_add(&radeon_connector->base, &radeon_dp_connector_helper_funcs); |
| 1328 | if (i2c_bus->valid) { | 1310 | if (i2c_bus->valid) { |
| 1311 | /* add DP i2c bus */ | ||
| 1312 | if (connector_type == DRM_MODE_CONNECTOR_eDP) | ||
| 1313 | radeon_dig_connector->dp_i2c_bus = radeon_i2c_create_dp(dev, i2c_bus, "eDP-auxch"); | ||
| 1314 | else | ||
| 1315 | radeon_dig_connector->dp_i2c_bus = radeon_i2c_create_dp(dev, i2c_bus, "DP-auxch"); | ||
| 1316 | if (!radeon_dig_connector->dp_i2c_bus) | ||
| 1317 | DRM_ERROR("DP: Failed to assign dp ddc bus! Check dmesg for i2c errors.\n"); | ||
| 1329 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); | 1318 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); |
| 1330 | if (!radeon_connector->ddc_bus) | 1319 | if (!radeon_connector->ddc_bus) |
| 1331 | DRM_ERROR("DVI: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); | 1320 | DRM_ERROR("DP: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); |
| 1332 | } | 1321 | } |
| 1333 | subpixel_order = SubPixelHorizontalRGB; | 1322 | switch (connector_type) { |
| 1334 | drm_connector_attach_property(&radeon_connector->base, | 1323 | case DRM_MODE_CONNECTOR_VGA: |
| 1335 | rdev->mode_info.coherent_mode_property, | 1324 | case DRM_MODE_CONNECTOR_DVIA: |
| 1336 | 1); | 1325 | default: |
| 1337 | if (ASIC_IS_AVIVO(rdev)) { | 1326 | connector->interlace_allowed = true; |
| 1327 | connector->doublescan_allowed = true; | ||
| 1328 | break; | ||
| 1329 | case DRM_MODE_CONNECTOR_DVII: | ||
| 1330 | case DRM_MODE_CONNECTOR_DVID: | ||
| 1331 | case DRM_MODE_CONNECTOR_HDMIA: | ||
| 1332 | case DRM_MODE_CONNECTOR_HDMIB: | ||
| 1333 | case DRM_MODE_CONNECTOR_DisplayPort: | ||
| 1338 | drm_connector_attach_property(&radeon_connector->base, | 1334 | drm_connector_attach_property(&radeon_connector->base, |
| 1339 | rdev->mode_info.underscan_property, | 1335 | rdev->mode_info.underscan_property, |
| 1340 | UNDERSCAN_OFF); | 1336 | UNDERSCAN_OFF); |
| @@ -1344,151 +1340,234 @@ radeon_add_atom_connector(struct drm_device *dev, | |||
| 1344 | drm_connector_attach_property(&radeon_connector->base, | 1340 | drm_connector_attach_property(&radeon_connector->base, |
| 1345 | rdev->mode_info.underscan_vborder_property, | 1341 | rdev->mode_info.underscan_vborder_property, |
| 1346 | 0); | 1342 | 0); |
| 1343 | subpixel_order = SubPixelHorizontalRGB; | ||
| 1344 | connector->interlace_allowed = true; | ||
| 1345 | if (connector_type == DRM_MODE_CONNECTOR_HDMIB) | ||
| 1346 | connector->doublescan_allowed = true; | ||
| 1347 | else | ||
| 1348 | connector->doublescan_allowed = false; | ||
| 1349 | break; | ||
| 1350 | case DRM_MODE_CONNECTOR_LVDS: | ||
| 1351 | case DRM_MODE_CONNECTOR_eDP: | ||
| 1352 | drm_connector_attach_property(&radeon_connector->base, | ||
| 1353 | dev->mode_config.scaling_mode_property, | ||
| 1354 | DRM_MODE_SCALE_FULLSCREEN); | ||
| 1355 | subpixel_order = SubPixelHorizontalRGB; | ||
| 1356 | connector->interlace_allowed = false; | ||
| 1357 | connector->doublescan_allowed = false; | ||
| 1358 | break; | ||
| 1347 | } | 1359 | } |
| 1348 | if (connector_type == DRM_MODE_CONNECTOR_DVII) { | 1360 | } else { |
| 1361 | switch (connector_type) { | ||
| 1362 | case DRM_MODE_CONNECTOR_VGA: | ||
| 1363 | drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type); | ||
| 1364 | drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs); | ||
| 1365 | if (i2c_bus->valid) { | ||
| 1366 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); | ||
| 1367 | if (!radeon_connector->ddc_bus) | ||
| 1368 | DRM_ERROR("VGA: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); | ||
| 1369 | } | ||
| 1349 | radeon_connector->dac_load_detect = true; | 1370 | radeon_connector->dac_load_detect = true; |
| 1350 | drm_connector_attach_property(&radeon_connector->base, | 1371 | drm_connector_attach_property(&radeon_connector->base, |
| 1351 | rdev->mode_info.load_detect_property, | 1372 | rdev->mode_info.load_detect_property, |
| 1352 | 1); | 1373 | 1); |
| 1353 | } | 1374 | /* no HPD on analog connectors */ |
| 1354 | connector->interlace_allowed = true; | 1375 | radeon_connector->hpd.hpd = RADEON_HPD_NONE; |
| 1355 | if (connector_type == DRM_MODE_CONNECTOR_DVII) | 1376 | connector->polled = DRM_CONNECTOR_POLL_CONNECT; |
| 1377 | connector->interlace_allowed = true; | ||
| 1356 | connector->doublescan_allowed = true; | 1378 | connector->doublescan_allowed = true; |
| 1357 | else | 1379 | break; |
| 1358 | connector->doublescan_allowed = false; | 1380 | case DRM_MODE_CONNECTOR_DVIA: |
| 1359 | break; | 1381 | drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type); |
| 1360 | case DRM_MODE_CONNECTOR_HDMIA: | 1382 | drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs); |
| 1361 | case DRM_MODE_CONNECTOR_HDMIB: | 1383 | if (i2c_bus->valid) { |
| 1362 | radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL); | 1384 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); |
| 1363 | if (!radeon_dig_connector) | 1385 | if (!radeon_connector->ddc_bus) |
| 1364 | goto failed; | 1386 | DRM_ERROR("DVIA: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); |
| 1365 | radeon_dig_connector->igp_lane_info = igp_lane_info; | 1387 | } |
| 1366 | radeon_connector->con_priv = radeon_dig_connector; | 1388 | radeon_connector->dac_load_detect = true; |
| 1367 | drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type); | ||
| 1368 | drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs); | ||
| 1369 | if (i2c_bus->valid) { | ||
| 1370 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); | ||
| 1371 | if (!radeon_connector->ddc_bus) | ||
| 1372 | DRM_ERROR("HDMI: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); | ||
| 1373 | } | ||
| 1374 | drm_connector_attach_property(&radeon_connector->base, | ||
| 1375 | rdev->mode_info.coherent_mode_property, | ||
| 1376 | 1); | ||
| 1377 | if (ASIC_IS_AVIVO(rdev)) { | ||
| 1378 | drm_connector_attach_property(&radeon_connector->base, | 1389 | drm_connector_attach_property(&radeon_connector->base, |
| 1379 | rdev->mode_info.underscan_property, | 1390 | rdev->mode_info.load_detect_property, |
| 1380 | UNDERSCAN_OFF); | 1391 | 1); |
| 1392 | /* no HPD on analog connectors */ | ||
| 1393 | radeon_connector->hpd.hpd = RADEON_HPD_NONE; | ||
| 1394 | connector->interlace_allowed = true; | ||
| 1395 | connector->doublescan_allowed = true; | ||
| 1396 | break; | ||
| 1397 | case DRM_MODE_CONNECTOR_DVII: | ||
| 1398 | case DRM_MODE_CONNECTOR_DVID: | ||
| 1399 | radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL); | ||
| 1400 | if (!radeon_dig_connector) | ||
| 1401 | goto failed; | ||
| 1402 | radeon_dig_connector->igp_lane_info = igp_lane_info; | ||
| 1403 | radeon_connector->con_priv = radeon_dig_connector; | ||
| 1404 | drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type); | ||
| 1405 | drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs); | ||
| 1406 | if (i2c_bus->valid) { | ||
| 1407 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); | ||
| 1408 | if (!radeon_connector->ddc_bus) | ||
| 1409 | DRM_ERROR("DVI: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); | ||
| 1410 | } | ||
| 1411 | subpixel_order = SubPixelHorizontalRGB; | ||
| 1381 | drm_connector_attach_property(&radeon_connector->base, | 1412 | drm_connector_attach_property(&radeon_connector->base, |
| 1382 | rdev->mode_info.underscan_hborder_property, | 1413 | rdev->mode_info.coherent_mode_property, |
| 1383 | 0); | 1414 | 1); |
| 1415 | if (ASIC_IS_AVIVO(rdev)) { | ||
| 1416 | drm_connector_attach_property(&radeon_connector->base, | ||
| 1417 | rdev->mode_info.underscan_property, | ||
| 1418 | UNDERSCAN_OFF); | ||
| 1419 | drm_connector_attach_property(&radeon_connector->base, | ||
| 1420 | rdev->mode_info.underscan_hborder_property, | ||
| 1421 | 0); | ||
| 1422 | drm_connector_attach_property(&radeon_connector->base, | ||
| 1423 | rdev->mode_info.underscan_vborder_property, | ||
| 1424 | 0); | ||
| 1425 | } | ||
| 1426 | if (connector_type == DRM_MODE_CONNECTOR_DVII) { | ||
| 1427 | radeon_connector->dac_load_detect = true; | ||
| 1428 | drm_connector_attach_property(&radeon_connector->base, | ||
| 1429 | rdev->mode_info.load_detect_property, | ||
| 1430 | 1); | ||
| 1431 | } | ||
| 1432 | connector->interlace_allowed = true; | ||
| 1433 | if (connector_type == DRM_MODE_CONNECTOR_DVII) | ||
| 1434 | connector->doublescan_allowed = true; | ||
| 1435 | else | ||
| 1436 | connector->doublescan_allowed = false; | ||
| 1437 | break; | ||
| 1438 | case DRM_MODE_CONNECTOR_HDMIA: | ||
| 1439 | case DRM_MODE_CONNECTOR_HDMIB: | ||
| 1440 | radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL); | ||
| 1441 | if (!radeon_dig_connector) | ||
| 1442 | goto failed; | ||
| 1443 | radeon_dig_connector->igp_lane_info = igp_lane_info; | ||
| 1444 | radeon_connector->con_priv = radeon_dig_connector; | ||
| 1445 | drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type); | ||
| 1446 | drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs); | ||
| 1447 | if (i2c_bus->valid) { | ||
| 1448 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); | ||
| 1449 | if (!radeon_connector->ddc_bus) | ||
| 1450 | DRM_ERROR("HDMI: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); | ||
| 1451 | } | ||
| 1384 | drm_connector_attach_property(&radeon_connector->base, | 1452 | drm_connector_attach_property(&radeon_connector->base, |
| 1385 | rdev->mode_info.underscan_vborder_property, | 1453 | rdev->mode_info.coherent_mode_property, |
| 1386 | 0); | 1454 | 1); |
| 1387 | } | 1455 | if (ASIC_IS_AVIVO(rdev)) { |
| 1388 | subpixel_order = SubPixelHorizontalRGB; | 1456 | drm_connector_attach_property(&radeon_connector->base, |
| 1389 | connector->interlace_allowed = true; | 1457 | rdev->mode_info.underscan_property, |
| 1390 | if (connector_type == DRM_MODE_CONNECTOR_HDMIB) | 1458 | UNDERSCAN_OFF); |
| 1391 | connector->doublescan_allowed = true; | 1459 | drm_connector_attach_property(&radeon_connector->base, |
| 1392 | else | 1460 | rdev->mode_info.underscan_hborder_property, |
| 1461 | 0); | ||
| 1462 | drm_connector_attach_property(&radeon_connector->base, | ||
| 1463 | rdev->mode_info.underscan_vborder_property, | ||
| 1464 | 0); | ||
| 1465 | } | ||
| 1466 | subpixel_order = SubPixelHorizontalRGB; | ||
| 1467 | connector->interlace_allowed = true; | ||
| 1468 | if (connector_type == DRM_MODE_CONNECTOR_HDMIB) | ||
| 1469 | connector->doublescan_allowed = true; | ||
| 1470 | else | ||
| 1471 | connector->doublescan_allowed = false; | ||
| 1472 | break; | ||
| 1473 | case DRM_MODE_CONNECTOR_DisplayPort: | ||
| 1474 | radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL); | ||
| 1475 | if (!radeon_dig_connector) | ||
| 1476 | goto failed; | ||
| 1477 | radeon_dig_connector->igp_lane_info = igp_lane_info; | ||
| 1478 | radeon_connector->con_priv = radeon_dig_connector; | ||
| 1479 | drm_connector_init(dev, &radeon_connector->base, &radeon_dp_connector_funcs, connector_type); | ||
| 1480 | drm_connector_helper_add(&radeon_connector->base, &radeon_dp_connector_helper_funcs); | ||
| 1481 | if (i2c_bus->valid) { | ||
| 1482 | /* add DP i2c bus */ | ||
| 1483 | radeon_dig_connector->dp_i2c_bus = radeon_i2c_create_dp(dev, i2c_bus, "DP-auxch"); | ||
| 1484 | if (!radeon_dig_connector->dp_i2c_bus) | ||
| 1485 | DRM_ERROR("DP: Failed to assign dp ddc bus! Check dmesg for i2c errors.\n"); | ||
| 1486 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); | ||
| 1487 | if (!radeon_connector->ddc_bus) | ||
| 1488 | DRM_ERROR("DP: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); | ||
| 1489 | } | ||
| 1490 | subpixel_order = SubPixelHorizontalRGB; | ||
| 1491 | drm_connector_attach_property(&radeon_connector->base, | ||
| 1492 | rdev->mode_info.coherent_mode_property, | ||
| 1493 | 1); | ||
| 1494 | if (ASIC_IS_AVIVO(rdev)) { | ||
| 1495 | drm_connector_attach_property(&radeon_connector->base, | ||
| 1496 | rdev->mode_info.underscan_property, | ||
| 1497 | UNDERSCAN_OFF); | ||
| 1498 | drm_connector_attach_property(&radeon_connector->base, | ||
| 1499 | rdev->mode_info.underscan_hborder_property, | ||
| 1500 | 0); | ||
| 1501 | drm_connector_attach_property(&radeon_connector->base, | ||
| 1502 | rdev->mode_info.underscan_vborder_property, | ||
| 1503 | 0); | ||
| 1504 | } | ||
| 1505 | connector->interlace_allowed = true; | ||
| 1506 | /* in theory with a DP to VGA converter... */ | ||
| 1393 | connector->doublescan_allowed = false; | 1507 | connector->doublescan_allowed = false; |
| 1394 | break; | 1508 | break; |
| 1395 | case DRM_MODE_CONNECTOR_DisplayPort: | 1509 | case DRM_MODE_CONNECTOR_eDP: |
| 1396 | radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL); | 1510 | radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL); |
| 1397 | if (!radeon_dig_connector) | 1511 | if (!radeon_dig_connector) |
| 1398 | goto failed; | 1512 | goto failed; |
| 1399 | radeon_dig_connector->igp_lane_info = igp_lane_info; | 1513 | radeon_dig_connector->igp_lane_info = igp_lane_info; |
| 1400 | radeon_connector->con_priv = radeon_dig_connector; | 1514 | radeon_connector->con_priv = radeon_dig_connector; |
| 1401 | drm_connector_init(dev, &radeon_connector->base, &radeon_dp_connector_funcs, connector_type); | 1515 | drm_connector_init(dev, &radeon_connector->base, &radeon_dp_connector_funcs, connector_type); |
| 1402 | drm_connector_helper_add(&radeon_connector->base, &radeon_dp_connector_helper_funcs); | 1516 | drm_connector_helper_add(&radeon_connector->base, &radeon_dp_connector_helper_funcs); |
| 1403 | if (i2c_bus->valid) { | 1517 | if (i2c_bus->valid) { |
| 1404 | /* add DP i2c bus */ | 1518 | /* add DP i2c bus */ |
| 1405 | radeon_dig_connector->dp_i2c_bus = radeon_i2c_create_dp(dev, i2c_bus, "DP-auxch"); | 1519 | radeon_dig_connector->dp_i2c_bus = radeon_i2c_create_dp(dev, i2c_bus, "eDP-auxch"); |
| 1406 | if (!radeon_dig_connector->dp_i2c_bus) | 1520 | if (!radeon_dig_connector->dp_i2c_bus) |
| 1407 | DRM_ERROR("DP: Failed to assign dp ddc bus! Check dmesg for i2c errors.\n"); | 1521 | DRM_ERROR("DP: Failed to assign dp ddc bus! Check dmesg for i2c errors.\n"); |
| 1408 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); | 1522 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); |
| 1409 | if (!radeon_connector->ddc_bus) | 1523 | if (!radeon_connector->ddc_bus) |
| 1410 | DRM_ERROR("DP: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); | 1524 | DRM_ERROR("DP: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); |
| 1411 | } | 1525 | } |
| 1412 | subpixel_order = SubPixelHorizontalRGB; | ||
| 1413 | drm_connector_attach_property(&radeon_connector->base, | ||
| 1414 | rdev->mode_info.coherent_mode_property, | ||
| 1415 | 1); | ||
| 1416 | if (ASIC_IS_AVIVO(rdev)) { | ||
| 1417 | drm_connector_attach_property(&radeon_connector->base, | 1526 | drm_connector_attach_property(&radeon_connector->base, |
| 1418 | rdev->mode_info.underscan_property, | 1527 | dev->mode_config.scaling_mode_property, |
| 1419 | UNDERSCAN_OFF); | 1528 | DRM_MODE_SCALE_FULLSCREEN); |
| 1529 | subpixel_order = SubPixelHorizontalRGB; | ||
| 1530 | connector->interlace_allowed = false; | ||
| 1531 | connector->doublescan_allowed = false; | ||
| 1532 | break; | ||
| 1533 | case DRM_MODE_CONNECTOR_SVIDEO: | ||
| 1534 | case DRM_MODE_CONNECTOR_Composite: | ||
| 1535 | case DRM_MODE_CONNECTOR_9PinDIN: | ||
| 1536 | drm_connector_init(dev, &radeon_connector->base, &radeon_tv_connector_funcs, connector_type); | ||
| 1537 | drm_connector_helper_add(&radeon_connector->base, &radeon_tv_connector_helper_funcs); | ||
| 1538 | radeon_connector->dac_load_detect = true; | ||
| 1420 | drm_connector_attach_property(&radeon_connector->base, | 1539 | drm_connector_attach_property(&radeon_connector->base, |
| 1421 | rdev->mode_info.underscan_hborder_property, | 1540 | rdev->mode_info.load_detect_property, |
| 1422 | 0); | 1541 | 1); |
| 1423 | drm_connector_attach_property(&radeon_connector->base, | 1542 | drm_connector_attach_property(&radeon_connector->base, |
| 1424 | rdev->mode_info.underscan_vborder_property, | 1543 | rdev->mode_info.tv_std_property, |
| 1425 | 0); | 1544 | radeon_atombios_get_tv_info(rdev)); |
| 1426 | } | 1545 | /* no HPD on analog connectors */ |
| 1427 | connector->interlace_allowed = true; | 1546 | radeon_connector->hpd.hpd = RADEON_HPD_NONE; |
| 1428 | /* in theory with a DP to VGA converter... */ | 1547 | connector->interlace_allowed = false; |
| 1429 | connector->doublescan_allowed = false; | 1548 | connector->doublescan_allowed = false; |
| 1430 | break; | 1549 | break; |
| 1431 | case DRM_MODE_CONNECTOR_eDP: | 1550 | case DRM_MODE_CONNECTOR_LVDS: |
| 1432 | radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL); | 1551 | radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL); |
| 1433 | if (!radeon_dig_connector) | 1552 | if (!radeon_dig_connector) |
| 1434 | goto failed; | 1553 | goto failed; |
| 1435 | radeon_dig_connector->igp_lane_info = igp_lane_info; | 1554 | radeon_dig_connector->igp_lane_info = igp_lane_info; |
| 1436 | radeon_connector->con_priv = radeon_dig_connector; | 1555 | radeon_connector->con_priv = radeon_dig_connector; |
| 1437 | drm_connector_init(dev, &radeon_connector->base, &radeon_dp_connector_funcs, connector_type); | 1556 | drm_connector_init(dev, &radeon_connector->base, &radeon_lvds_connector_funcs, connector_type); |
| 1438 | drm_connector_helper_add(&radeon_connector->base, &radeon_dp_connector_helper_funcs); | 1557 | drm_connector_helper_add(&radeon_connector->base, &radeon_lvds_connector_helper_funcs); |
| 1439 | if (i2c_bus->valid) { | 1558 | if (i2c_bus->valid) { |
| 1440 | /* add DP i2c bus */ | 1559 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); |
| 1441 | radeon_dig_connector->dp_i2c_bus = radeon_i2c_create_dp(dev, i2c_bus, "eDP-auxch"); | 1560 | if (!radeon_connector->ddc_bus) |
| 1442 | if (!radeon_dig_connector->dp_i2c_bus) | 1561 | DRM_ERROR("LVDS: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); |
| 1443 | DRM_ERROR("DP: Failed to assign dp ddc bus! Check dmesg for i2c errors.\n"); | 1562 | } |
| 1444 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); | 1563 | drm_connector_attach_property(&radeon_connector->base, |
| 1445 | if (!radeon_connector->ddc_bus) | 1564 | dev->mode_config.scaling_mode_property, |
| 1446 | DRM_ERROR("DP: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); | 1565 | DRM_MODE_SCALE_FULLSCREEN); |
| 1447 | } | 1566 | subpixel_order = SubPixelHorizontalRGB; |
| 1448 | drm_connector_attach_property(&radeon_connector->base, | 1567 | connector->interlace_allowed = false; |
| 1449 | dev->mode_config.scaling_mode_property, | 1568 | connector->doublescan_allowed = false; |
| 1450 | DRM_MODE_SCALE_FULLSCREEN); | 1569 | break; |
| 1451 | subpixel_order = SubPixelHorizontalRGB; | ||
| 1452 | connector->interlace_allowed = false; | ||
| 1453 | connector->doublescan_allowed = false; | ||
| 1454 | break; | ||
| 1455 | case DRM_MODE_CONNECTOR_SVIDEO: | ||
| 1456 | case DRM_MODE_CONNECTOR_Composite: | ||
| 1457 | case DRM_MODE_CONNECTOR_9PinDIN: | ||
| 1458 | drm_connector_init(dev, &radeon_connector->base, &radeon_tv_connector_funcs, connector_type); | ||
| 1459 | drm_connector_helper_add(&radeon_connector->base, &radeon_tv_connector_helper_funcs); | ||
| 1460 | radeon_connector->dac_load_detect = true; | ||
| 1461 | drm_connector_attach_property(&radeon_connector->base, | ||
| 1462 | rdev->mode_info.load_detect_property, | ||
| 1463 | 1); | ||
| 1464 | drm_connector_attach_property(&radeon_connector->base, | ||
| 1465 | rdev->mode_info.tv_std_property, | ||
| 1466 | radeon_atombios_get_tv_info(rdev)); | ||
| 1467 | /* no HPD on analog connectors */ | ||
| 1468 | radeon_connector->hpd.hpd = RADEON_HPD_NONE; | ||
| 1469 | connector->interlace_allowed = false; | ||
| 1470 | connector->doublescan_allowed = false; | ||
| 1471 | break; | ||
| 1472 | case DRM_MODE_CONNECTOR_LVDS: | ||
| 1473 | radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL); | ||
| 1474 | if (!radeon_dig_connector) | ||
| 1475 | goto failed; | ||
| 1476 | radeon_dig_connector->igp_lane_info = igp_lane_info; | ||
| 1477 | radeon_connector->con_priv = radeon_dig_connector; | ||
| 1478 | drm_connector_init(dev, &radeon_connector->base, &radeon_lvds_connector_funcs, connector_type); | ||
| 1479 | drm_connector_helper_add(&radeon_connector->base, &radeon_lvds_connector_helper_funcs); | ||
| 1480 | if (i2c_bus->valid) { | ||
| 1481 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); | ||
| 1482 | if (!radeon_connector->ddc_bus) | ||
| 1483 | DRM_ERROR("LVDS: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); | ||
| 1484 | } | 1570 | } |
| 1485 | drm_connector_attach_property(&radeon_connector->base, | ||
| 1486 | dev->mode_config.scaling_mode_property, | ||
| 1487 | DRM_MODE_SCALE_FULLSCREEN); | ||
| 1488 | subpixel_order = SubPixelHorizontalRGB; | ||
| 1489 | connector->interlace_allowed = false; | ||
| 1490 | connector->doublescan_allowed = false; | ||
| 1491 | break; | ||
| 1492 | } | 1571 | } |
| 1493 | 1572 | ||
| 1494 | if (radeon_connector->hpd.hpd == RADEON_HPD_NONE) { | 1573 | if (radeon_connector->hpd.hpd == RADEON_HPD_NONE) { |
diff --git a/drivers/gpu/drm/radeon/radeon_encoders.c b/drivers/gpu/drm/radeon/radeon_encoders.c index 1c064e78f21a..43c001b28ecc 100644 --- a/drivers/gpu/drm/radeon/radeon_encoders.c +++ b/drivers/gpu/drm/radeon/radeon_encoders.c | |||
| @@ -1949,8 +1949,9 @@ static void radeon_atom_encoder_prepare(struct drm_encoder *encoder) | |||
| 1949 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 1949 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
| 1950 | struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); | 1950 | struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); |
| 1951 | 1951 | ||
| 1952 | if (radeon_encoder->active_device & | 1952 | if ((radeon_encoder->active_device & |
| 1953 | (ATOM_DEVICE_DFP_SUPPORT | ATOM_DEVICE_LCD_SUPPORT)) { | 1953 | (ATOM_DEVICE_DFP_SUPPORT | ATOM_DEVICE_LCD_SUPPORT)) || |
| 1954 | radeon_encoder_is_dp_bridge(encoder)) { | ||
| 1954 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; | 1955 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; |
| 1955 | if (dig) | 1956 | if (dig) |
| 1956 | dig->dig_encoder = radeon_atom_pick_dig_encoder(encoder); | 1957 | dig->dig_encoder = radeon_atom_pick_dig_encoder(encoder); |
