diff options
| author | Dave Airlie <airlied@redhat.com> | 2014-06-18 20:25:49 -0400 |
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2014-06-18 20:25:49 -0400 |
| commit | 937a0c79870ccd7034640f72560653b269cc11c5 (patch) | |
| tree | 0aedda35e7ad5c9a92dacb8a6ed8a1a2062428de | |
| parent | 571366284b50c93ba4ba5f13fad3f2430024c613 (diff) | |
| parent | 46889d9568b90ae9032a4e84a7b404bb5f96f9a3 (diff) | |
Merge branch 'drm-fixes-3.16' of git://people.freedesktop.org/~agd5f/linux into drm-next
mode validation, deep color and pageflipping fixes.
* 'drm-fixes-3.16' of git://people.freedesktop.org/~agd5f/linux:
drm/radeon: Fix radeon_irq_kms_pflip_irq_get/put() imbalance
Revert "drm/radeon: remove drm_vblank_get|put from pflip handling"
drm/radeon: improve dvi_mode_valid
drm/radeon: update mode_valid testing for DP
drm/radeon: Use dce5/6 hdmi deep color clock setup also on dce8+
| -rw-r--r-- | drivers/gpu/drm/radeon/atombios_crtc.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_connectors.c | 35 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_display.c | 19 |
3 files changed, 41 insertions, 15 deletions
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c index 9758f9170fce..a03c73411a56 100644 --- a/drivers/gpu/drm/radeon/atombios_crtc.c +++ b/drivers/gpu/drm/radeon/atombios_crtc.c | |||
| @@ -1052,7 +1052,7 @@ static void atombios_crtc_set_pll(struct drm_crtc *crtc, struct drm_display_mode | |||
| 1052 | int encoder_mode = atombios_get_encoder_mode(radeon_crtc->encoder); | 1052 | int encoder_mode = atombios_get_encoder_mode(radeon_crtc->encoder); |
| 1053 | 1053 | ||
| 1054 | /* pass the actual clock to atombios_crtc_program_pll for DCE5,6 for HDMI */ | 1054 | /* pass the actual clock to atombios_crtc_program_pll for DCE5,6 for HDMI */ |
| 1055 | if (ASIC_IS_DCE5(rdev) && !ASIC_IS_DCE8(rdev) && | 1055 | if (ASIC_IS_DCE5(rdev) && |
| 1056 | (encoder_mode == ATOM_ENCODER_MODE_HDMI) && | 1056 | (encoder_mode == ATOM_ENCODER_MODE_HDMI) && |
| 1057 | (radeon_crtc->bpc > 8)) | 1057 | (radeon_crtc->bpc > 8)) |
| 1058 | clock = radeon_crtc->adjusted_clock; | 1058 | clock = radeon_crtc->adjusted_clock; |
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c index 933c5c39654d..1b9177ed181f 100644 --- a/drivers/gpu/drm/radeon/radeon_connectors.c +++ b/drivers/gpu/drm/radeon/radeon_connectors.c | |||
| @@ -1288,17 +1288,15 @@ static int radeon_dvi_mode_valid(struct drm_connector *connector, | |||
| 1288 | (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D) || | 1288 | (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D) || |
| 1289 | (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_B)) | 1289 | (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_B)) |
| 1290 | return MODE_OK; | 1290 | return MODE_OK; |
| 1291 | else if (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_A) { | 1291 | else if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector->edid)) { |
| 1292 | if (ASIC_IS_DCE6(rdev)) { | 1292 | /* HDMI 1.3+ supports max clock of 340 Mhz */ |
| 1293 | /* HDMI 1.3+ supports max clock of 340 Mhz */ | 1293 | if (mode->clock > 340000) |
| 1294 | if (mode->clock > 340000) | ||
| 1295 | return MODE_CLOCK_HIGH; | ||
| 1296 | else | ||
| 1297 | return MODE_OK; | ||
| 1298 | } else | ||
| 1299 | return MODE_CLOCK_HIGH; | 1294 | return MODE_CLOCK_HIGH; |
| 1300 | } else | 1295 | else |
| 1296 | return MODE_OK; | ||
| 1297 | } else { | ||
| 1301 | return MODE_CLOCK_HIGH; | 1298 | return MODE_CLOCK_HIGH; |
| 1299 | } | ||
| 1302 | } | 1300 | } |
| 1303 | 1301 | ||
| 1304 | /* check against the max pixel clock */ | 1302 | /* check against the max pixel clock */ |
| @@ -1549,6 +1547,8 @@ out: | |||
| 1549 | static int radeon_dp_mode_valid(struct drm_connector *connector, | 1547 | static int radeon_dp_mode_valid(struct drm_connector *connector, |
| 1550 | struct drm_display_mode *mode) | 1548 | struct drm_display_mode *mode) |
| 1551 | { | 1549 | { |
| 1550 | struct drm_device *dev = connector->dev; | ||
| 1551 | struct radeon_device *rdev = dev->dev_private; | ||
| 1552 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); | 1552 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
| 1553 | struct radeon_connector_atom_dig *radeon_dig_connector = radeon_connector->con_priv; | 1553 | struct radeon_connector_atom_dig *radeon_dig_connector = radeon_connector->con_priv; |
| 1554 | 1554 | ||
| @@ -1579,14 +1579,23 @@ static int radeon_dp_mode_valid(struct drm_connector *connector, | |||
| 1579 | return MODE_PANEL; | 1579 | return MODE_PANEL; |
| 1580 | } | 1580 | } |
| 1581 | } | 1581 | } |
| 1582 | return MODE_OK; | ||
| 1583 | } else { | 1582 | } else { |
| 1584 | if ((radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) || | 1583 | if ((radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) || |
| 1585 | (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) | 1584 | (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) { |
| 1586 | return radeon_dp_mode_valid_helper(connector, mode); | 1585 | return radeon_dp_mode_valid_helper(connector, mode); |
| 1587 | else | 1586 | } else { |
| 1588 | return MODE_OK; | 1587 | if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector->edid)) { |
| 1588 | /* HDMI 1.3+ supports max clock of 340 Mhz */ | ||
| 1589 | if (mode->clock > 340000) | ||
| 1590 | return MODE_CLOCK_HIGH; | ||
| 1591 | } else { | ||
| 1592 | if (mode->clock > 165000) | ||
| 1593 | return MODE_CLOCK_HIGH; | ||
| 1594 | } | ||
| 1595 | } | ||
| 1589 | } | 1596 | } |
| 1597 | |||
| 1598 | return MODE_OK; | ||
| 1590 | } | 1599 | } |
| 1591 | 1600 | ||
| 1592 | static const struct drm_connector_helper_funcs radeon_dp_connector_helper_funcs = { | 1601 | static const struct drm_connector_helper_funcs radeon_dp_connector_helper_funcs = { |
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c index 4db26420f38a..8fc362aa6a1a 100644 --- a/drivers/gpu/drm/radeon/radeon_display.c +++ b/drivers/gpu/drm/radeon/radeon_display.c | |||
| @@ -358,8 +358,9 @@ void radeon_crtc_handle_flip(struct radeon_device *rdev, int crtc_id) | |||
| 358 | 358 | ||
| 359 | spin_unlock_irqrestore(&rdev->ddev->event_lock, flags); | 359 | spin_unlock_irqrestore(&rdev->ddev->event_lock, flags); |
| 360 | 360 | ||
| 361 | drm_vblank_put(rdev->ddev, radeon_crtc->crtc_id); | ||
| 361 | radeon_fence_unref(&work->fence); | 362 | radeon_fence_unref(&work->fence); |
| 362 | radeon_irq_kms_pflip_irq_get(rdev, work->crtc_id); | 363 | radeon_irq_kms_pflip_irq_put(rdev, work->crtc_id); |
| 363 | queue_work(radeon_crtc->flip_queue, &work->unpin_work); | 364 | queue_work(radeon_crtc->flip_queue, &work->unpin_work); |
| 364 | } | 365 | } |
| 365 | 366 | ||
| @@ -460,6 +461,12 @@ static void radeon_flip_work_func(struct work_struct *__work) | |||
| 460 | base &= ~7; | 461 | base &= ~7; |
| 461 | } | 462 | } |
| 462 | 463 | ||
| 464 | r = drm_vblank_get(crtc->dev, radeon_crtc->crtc_id); | ||
| 465 | if (r) { | ||
| 466 | DRM_ERROR("failed to get vblank before flip\n"); | ||
| 467 | goto pflip_cleanup; | ||
| 468 | } | ||
| 469 | |||
| 463 | /* We borrow the event spin lock for protecting flip_work */ | 470 | /* We borrow the event spin lock for protecting flip_work */ |
| 464 | spin_lock_irqsave(&crtc->dev->event_lock, flags); | 471 | spin_lock_irqsave(&crtc->dev->event_lock, flags); |
| 465 | 472 | ||
| @@ -474,6 +481,16 @@ static void radeon_flip_work_func(struct work_struct *__work) | |||
| 474 | 481 | ||
| 475 | return; | 482 | return; |
| 476 | 483 | ||
| 484 | pflip_cleanup: | ||
| 485 | if (unlikely(radeon_bo_reserve(work->new_rbo, false) != 0)) { | ||
| 486 | DRM_ERROR("failed to reserve new rbo in error path\n"); | ||
| 487 | goto cleanup; | ||
| 488 | } | ||
| 489 | if (unlikely(radeon_bo_unpin(work->new_rbo) != 0)) { | ||
| 490 | DRM_ERROR("failed to unpin new rbo in error path\n"); | ||
| 491 | } | ||
| 492 | radeon_bo_unreserve(work->new_rbo); | ||
| 493 | |||
| 477 | cleanup: | 494 | cleanup: |
| 478 | drm_gem_object_unreference_unlocked(&work->old_rbo->gem_base); | 495 | drm_gem_object_unreference_unlocked(&work->old_rbo->gem_base); |
| 479 | radeon_fence_unref(&work->fence); | 496 | radeon_fence_unref(&work->fence); |
