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 | |
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')
-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); |