diff options
| -rw-r--r-- | drivers/gpu/drm/radeon/atombios_dp.c | 12 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/evergreen.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_connectors.c | 29 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_device.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_encoders.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_mode.h | 1 |
6 files changed, 41 insertions, 10 deletions
diff --git a/drivers/gpu/drm/radeon/atombios_dp.c b/drivers/gpu/drm/radeon/atombios_dp.c index 645b84b3d203..7ad43c6b1db7 100644 --- a/drivers/gpu/drm/radeon/atombios_dp.c +++ b/drivers/gpu/drm/radeon/atombios_dp.c | |||
| @@ -613,6 +613,18 @@ static bool radeon_dp_get_link_status(struct radeon_connector *radeon_connector, | |||
| 613 | return true; | 613 | return true; |
| 614 | } | 614 | } |
| 615 | 615 | ||
| 616 | bool radeon_dp_needs_link_train(struct radeon_connector *radeon_connector) | ||
| 617 | { | ||
| 618 | u8 link_status[DP_LINK_STATUS_SIZE]; | ||
| 619 | struct radeon_connector_atom_dig *dig = radeon_connector->con_priv; | ||
| 620 | |||
| 621 | if (!radeon_dp_get_link_status(radeon_connector, link_status)) | ||
| 622 | return false; | ||
| 623 | if (dp_channel_eq_ok(link_status, dig->dp_lane_count)) | ||
| 624 | return false; | ||
| 625 | return true; | ||
| 626 | } | ||
| 627 | |||
| 616 | struct radeon_dp_link_train_info { | 628 | struct radeon_dp_link_train_info { |
| 617 | struct radeon_device *rdev; | 629 | struct radeon_device *rdev; |
| 618 | struct drm_encoder *encoder; | 630 | struct drm_encoder *encoder; |
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index 14dce9f22172..fb5fa0898868 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c | |||
| @@ -743,7 +743,7 @@ static void evergreen_program_watermarks(struct radeon_device *rdev, | |||
| 743 | !evergreen_average_bandwidth_vs_available_bandwidth(&wm) || | 743 | !evergreen_average_bandwidth_vs_available_bandwidth(&wm) || |
| 744 | !evergreen_check_latency_hiding(&wm) || | 744 | !evergreen_check_latency_hiding(&wm) || |
| 745 | (rdev->disp_priority == 2)) { | 745 | (rdev->disp_priority == 2)) { |
| 746 | DRM_INFO("force priority to high\n"); | 746 | DRM_DEBUG_KMS("force priority to high\n"); |
| 747 | priority_a_cnt |= PRIORITY_ALWAYS_ON; | 747 | priority_a_cnt |= PRIORITY_ALWAYS_ON; |
| 748 | priority_b_cnt |= PRIORITY_ALWAYS_ON; | 748 | priority_b_cnt |= PRIORITY_ALWAYS_ON; |
| 749 | } | 749 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c index 6d6b5f16bc09..7f65940f918f 100644 --- a/drivers/gpu/drm/radeon/radeon_connectors.c +++ b/drivers/gpu/drm/radeon/radeon_connectors.c | |||
| @@ -60,18 +60,20 @@ void radeon_connector_hotplug(struct drm_connector *connector) | |||
| 60 | 60 | ||
| 61 | radeon_hpd_set_polarity(rdev, radeon_connector->hpd.hpd); | 61 | radeon_hpd_set_polarity(rdev, radeon_connector->hpd.hpd); |
| 62 | 62 | ||
| 63 | /* powering up/down the eDP panel generates hpd events which | 63 | /* if the connector is already off, don't turn it back on */ |
| 64 | * can interfere with modesetting. | 64 | if (connector->dpms != DRM_MODE_DPMS_ON) |
| 65 | */ | ||
| 66 | if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) | ||
| 67 | return; | 65 | return; |
| 68 | 66 | ||
| 69 | /* pre-r600 did not always have the hpd pins mapped accurately to connectors */ | 67 | /* just deal with DP (not eDP) here. */ |
| 70 | if (rdev->family >= CHIP_R600) { | 68 | if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) { |
| 71 | if (radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) | 69 | int saved_dpms = connector->dpms; |
| 70 | |||
| 71 | if (radeon_hpd_sense(rdev, radeon_connector->hpd.hpd) && | ||
| 72 | radeon_dp_needs_link_train(radeon_connector)) | ||
| 72 | drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON); | 73 | drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON); |
| 73 | else | 74 | else |
| 74 | drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF); | 75 | drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF); |
| 76 | connector->dpms = saved_dpms; | ||
| 75 | } | 77 | } |
| 76 | } | 78 | } |
| 77 | 79 | ||
| @@ -474,11 +476,19 @@ static void radeon_fixup_lvds_native_mode(struct drm_encoder *encoder, | |||
| 474 | { | 476 | { |
| 475 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 477 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
| 476 | struct drm_display_mode *native_mode = &radeon_encoder->native_mode; | 478 | struct drm_display_mode *native_mode = &radeon_encoder->native_mode; |
| 479 | struct drm_display_mode *t, *mode; | ||
| 480 | |||
| 481 | /* If the EDID preferred mode doesn't match the native mode, use it */ | ||
| 482 | list_for_each_entry_safe(mode, t, &connector->probed_modes, head) { | ||
| 483 | if (mode->type & DRM_MODE_TYPE_PREFERRED) { | ||
| 484 | if (mode->hdisplay != native_mode->hdisplay || | ||
| 485 | mode->vdisplay != native_mode->vdisplay) | ||
| 486 | memcpy(native_mode, mode, sizeof(*mode)); | ||
| 487 | } | ||
| 488 | } | ||
| 477 | 489 | ||
| 478 | /* Try to get native mode details from EDID if necessary */ | 490 | /* Try to get native mode details from EDID if necessary */ |
| 479 | if (!native_mode->clock) { | 491 | if (!native_mode->clock) { |
| 480 | struct drm_display_mode *t, *mode; | ||
| 481 | |||
| 482 | list_for_each_entry_safe(mode, t, &connector->probed_modes, head) { | 492 | list_for_each_entry_safe(mode, t, &connector->probed_modes, head) { |
| 483 | if (mode->hdisplay == native_mode->hdisplay && | 493 | if (mode->hdisplay == native_mode->hdisplay && |
| 484 | mode->vdisplay == native_mode->vdisplay) { | 494 | mode->vdisplay == native_mode->vdisplay) { |
| @@ -489,6 +499,7 @@ static void radeon_fixup_lvds_native_mode(struct drm_encoder *encoder, | |||
| 489 | } | 499 | } |
| 490 | } | 500 | } |
| 491 | } | 501 | } |
| 502 | |||
| 492 | if (!native_mode->clock) { | 503 | if (!native_mode->clock) { |
| 493 | DRM_DEBUG_KMS("No LVDS native mode details, disabling RMX\n"); | 504 | DRM_DEBUG_KMS("No LVDS native mode details, disabling RMX\n"); |
| 494 | radeon_encoder->rmx_type = RMX_OFF; | 505 | radeon_encoder->rmx_type = RMX_OFF; |
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index 440e6ecccc40..a3b011b49465 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
| @@ -32,6 +32,7 @@ | |||
| 32 | #include <drm/radeon_drm.h> | 32 | #include <drm/radeon_drm.h> |
| 33 | #include <linux/vgaarb.h> | 33 | #include <linux/vgaarb.h> |
| 34 | #include <linux/vga_switcheroo.h> | 34 | #include <linux/vga_switcheroo.h> |
| 35 | #include <linux/efi.h> | ||
| 35 | #include "radeon_reg.h" | 36 | #include "radeon_reg.h" |
| 36 | #include "radeon.h" | 37 | #include "radeon.h" |
| 37 | #include "atom.h" | 38 | #include "atom.h" |
| @@ -348,6 +349,9 @@ bool radeon_card_posted(struct radeon_device *rdev) | |||
| 348 | { | 349 | { |
| 349 | uint32_t reg; | 350 | uint32_t reg; |
| 350 | 351 | ||
| 352 | if (efi_enabled && rdev->pdev->subsystem_vendor == PCI_VENDOR_ID_APPLE) | ||
| 353 | return false; | ||
| 354 | |||
| 351 | /* first check CRTCs */ | 355 | /* first check CRTCs */ |
| 352 | if (ASIC_IS_DCE41(rdev)) { | 356 | if (ASIC_IS_DCE41(rdev)) { |
| 353 | reg = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET) | | 357 | reg = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET) | |
diff --git a/drivers/gpu/drm/radeon/radeon_encoders.c b/drivers/gpu/drm/radeon/radeon_encoders.c index b293487e5aa3..319d85d7e759 100644 --- a/drivers/gpu/drm/radeon/radeon_encoders.c +++ b/drivers/gpu/drm/radeon/radeon_encoders.c | |||
| @@ -2323,6 +2323,9 @@ radeon_add_atom_encoder(struct drm_device *dev, | |||
| 2323 | default: | 2323 | default: |
| 2324 | encoder->possible_crtcs = 0x3; | 2324 | encoder->possible_crtcs = 0x3; |
| 2325 | break; | 2325 | break; |
| 2326 | case 4: | ||
| 2327 | encoder->possible_crtcs = 0xf; | ||
| 2328 | break; | ||
| 2326 | case 6: | 2329 | case 6: |
| 2327 | encoder->possible_crtcs = 0x3f; | 2330 | encoder->possible_crtcs = 0x3f; |
| 2328 | break; | 2331 | break; |
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h index d09031c03e26..68820f5f6303 100644 --- a/drivers/gpu/drm/radeon/radeon_mode.h +++ b/drivers/gpu/drm/radeon/radeon_mode.h | |||
| @@ -479,6 +479,7 @@ extern void radeon_dp_set_link_config(struct drm_connector *connector, | |||
| 479 | struct drm_display_mode *mode); | 479 | struct drm_display_mode *mode); |
| 480 | extern void radeon_dp_link_train(struct drm_encoder *encoder, | 480 | extern void radeon_dp_link_train(struct drm_encoder *encoder, |
| 481 | struct drm_connector *connector); | 481 | struct drm_connector *connector); |
| 482 | extern bool radeon_dp_needs_link_train(struct radeon_connector *radeon_connector); | ||
| 482 | extern u8 radeon_dp_getsinktype(struct radeon_connector *radeon_connector); | 483 | extern u8 radeon_dp_getsinktype(struct radeon_connector *radeon_connector); |
| 483 | extern bool radeon_dp_getdpcd(struct radeon_connector *radeon_connector); | 484 | extern bool radeon_dp_getdpcd(struct radeon_connector *radeon_connector); |
| 484 | extern void atombios_dig_encoder_setup(struct drm_encoder *encoder, int action, int panel_mode); | 485 | extern void atombios_dig_encoder_setup(struct drm_encoder *encoder, int action, int panel_mode); |
