diff options
author | Dave Airlie <airlied@redhat.com> | 2018-04-12 19:25:21 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2018-04-12 19:25:21 -0400 |
commit | a10beabba213924d876f2d10ca9351aeab93f58a (patch) | |
tree | 7f8d845244580a9e971b53a84a039903b06a44be /drivers/gpu/drm/amd | |
parent | dece02f71dabdba9823a87a5ef702a3946e15ab7 (diff) | |
parent | 1cb19e8267a57c5174da09e0d52d1477baceccca (diff) |
Merge branch 'drm-next-4.17' of git://people.freedesktop.org/~agd5f/linux into drm-next
- Add a PX quirk for radeon
- Fix flickering and stability issues with DC on some platforms
- Fix HDMI audio regression
- Few other misc DC and base driver fixes
* 'drm-next-4.17' of git://people.freedesktop.org/~agd5f/linux:
Revert "drm/amd/display: disable CRTCs with NULL FB on their primary plane (V2)"
Revert "drm/amd/display: fix dereferencing possible ERR_PTR()"
drm/amd/display: Fix regamma not affecting full-intensity color values
drm/amd/display: Fix FBC text console corruption
drm/amd/display: Only register backlight device if embedded panel connected
drm/amd/display: fix brightness level after resume from suspend
drm/amd/display: HDMI has no sound after Panel power off/on
drm/amdgpu: add MP1 and THM hw ip base reg offset
drm/amdgpu: fix null pointer panic with direct fw loading on gpu reset
drm/radeon: add PX quirk for Asus K73TK
Diffstat (limited to 'drivers/gpu/drm/amd')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/vega10_reg_init.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 89 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/display/dc/core/dc_link.c | 13 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/display/dc/dc_link.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/display/dc/dce110/dce110_compressor.c | 67 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c | 13 |
9 files changed, 120 insertions, 74 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index 0193f6ced00b..c8b605f3dc05 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h | |||
@@ -1379,6 +1379,7 @@ enum amd_hw_ip_block_type { | |||
1379 | ATHUB_HWIP, | 1379 | ATHUB_HWIP, |
1380 | NBIO_HWIP, | 1380 | NBIO_HWIP, |
1381 | MP0_HWIP, | 1381 | MP0_HWIP, |
1382 | MP1_HWIP, | ||
1382 | UVD_HWIP, | 1383 | UVD_HWIP, |
1383 | VCN_HWIP = UVD_HWIP, | 1384 | VCN_HWIP = UVD_HWIP, |
1384 | VCE_HWIP, | 1385 | VCE_HWIP, |
@@ -1388,6 +1389,7 @@ enum amd_hw_ip_block_type { | |||
1388 | SMUIO_HWIP, | 1389 | SMUIO_HWIP, |
1389 | PWR_HWIP, | 1390 | PWR_HWIP, |
1390 | NBIF_HWIP, | 1391 | NBIF_HWIP, |
1392 | THM_HWIP, | ||
1391 | MAX_HWIP | 1393 | MAX_HWIP |
1392 | }; | 1394 | }; |
1393 | 1395 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c index 19e71f4a8ac2..c7d43e064fc7 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c | |||
@@ -505,6 +505,9 @@ failed: | |||
505 | 505 | ||
506 | int psp_gpu_reset(struct amdgpu_device *adev) | 506 | int psp_gpu_reset(struct amdgpu_device *adev) |
507 | { | 507 | { |
508 | if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP) | ||
509 | return 0; | ||
510 | |||
508 | return psp_mode1_reset(&adev->psp); | 511 | return psp_mode1_reset(&adev->psp); |
509 | } | 512 | } |
510 | 513 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/vega10_reg_init.c b/drivers/gpu/drm/amd/amdgpu/vega10_reg_init.c index 4c45db7f1157..45aafca7f315 100644 --- a/drivers/gpu/drm/amd/amdgpu/vega10_reg_init.c +++ b/drivers/gpu/drm/amd/amdgpu/vega10_reg_init.c | |||
@@ -38,6 +38,7 @@ int vega10_reg_base_init(struct amdgpu_device *adev) | |||
38 | adev->reg_offset[ATHUB_HWIP][i] = (uint32_t *)(&(ATHUB_BASE.instance[i])); | 38 | adev->reg_offset[ATHUB_HWIP][i] = (uint32_t *)(&(ATHUB_BASE.instance[i])); |
39 | adev->reg_offset[NBIO_HWIP][i] = (uint32_t *)(&(NBIO_BASE.instance[i])); | 39 | adev->reg_offset[NBIO_HWIP][i] = (uint32_t *)(&(NBIO_BASE.instance[i])); |
40 | adev->reg_offset[MP0_HWIP][i] = (uint32_t *)(&(MP0_BASE.instance[i])); | 40 | adev->reg_offset[MP0_HWIP][i] = (uint32_t *)(&(MP0_BASE.instance[i])); |
41 | adev->reg_offset[MP1_HWIP][i] = (uint32_t *)(&(MP1_BASE.instance[i])); | ||
41 | adev->reg_offset[UVD_HWIP][i] = (uint32_t *)(&(UVD_BASE.instance[i])); | 42 | adev->reg_offset[UVD_HWIP][i] = (uint32_t *)(&(UVD_BASE.instance[i])); |
42 | adev->reg_offset[VCE_HWIP][i] = (uint32_t *)(&(VCE_BASE.instance[i])); | 43 | adev->reg_offset[VCE_HWIP][i] = (uint32_t *)(&(VCE_BASE.instance[i])); |
43 | adev->reg_offset[VCN_HWIP][i] = (uint32_t *)(&(VCN_BASE.instance[i])); | 44 | adev->reg_offset[VCN_HWIP][i] = (uint32_t *)(&(VCN_BASE.instance[i])); |
@@ -49,7 +50,7 @@ int vega10_reg_base_init(struct amdgpu_device *adev) | |||
49 | adev->reg_offset[SMUIO_HWIP][i] = (uint32_t *)(&(SMUIO_BASE.instance[i])); | 50 | adev->reg_offset[SMUIO_HWIP][i] = (uint32_t *)(&(SMUIO_BASE.instance[i])); |
50 | adev->reg_offset[PWR_HWIP][i] = (uint32_t *)(&(PWR_BASE.instance[i])); | 51 | adev->reg_offset[PWR_HWIP][i] = (uint32_t *)(&(PWR_BASE.instance[i])); |
51 | adev->reg_offset[NBIF_HWIP][i] = (uint32_t *)(&(NBIF_BASE.instance[i])); | 52 | adev->reg_offset[NBIF_HWIP][i] = (uint32_t *)(&(NBIF_BASE.instance[i])); |
52 | 53 | adev->reg_offset[THM_HWIP][i] = (uint32_t *)(&(THM_BASE.instance[i])); | |
53 | } | 54 | } |
54 | return 0; | 55 | return 0; |
55 | } | 56 | } |
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c index e42a28e3adc5..4e2f379ce217 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | |||
@@ -1403,6 +1403,28 @@ static int initialize_plane(struct amdgpu_display_manager *dm, | |||
1403 | return ret; | 1403 | return ret; |
1404 | } | 1404 | } |
1405 | 1405 | ||
1406 | |||
1407 | static void register_backlight_device(struct amdgpu_display_manager *dm, | ||
1408 | struct dc_link *link) | ||
1409 | { | ||
1410 | #if defined(CONFIG_BACKLIGHT_CLASS_DEVICE) ||\ | ||
1411 | defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE) | ||
1412 | |||
1413 | if ((link->connector_signal & (SIGNAL_TYPE_EDP | SIGNAL_TYPE_LVDS)) && | ||
1414 | link->type != dc_connection_none) { | ||
1415 | /* Event if registration failed, we should continue with | ||
1416 | * DM initialization because not having a backlight control | ||
1417 | * is better then a black screen. | ||
1418 | */ | ||
1419 | amdgpu_dm_register_backlight_device(dm); | ||
1420 | |||
1421 | if (dm->backlight_dev) | ||
1422 | dm->backlight_link = link; | ||
1423 | } | ||
1424 | #endif | ||
1425 | } | ||
1426 | |||
1427 | |||
1406 | /* In this architecture, the association | 1428 | /* In this architecture, the association |
1407 | * connector -> encoder -> crtc | 1429 | * connector -> encoder -> crtc |
1408 | * id not really requried. The crtc and connector will hold the | 1430 | * id not really requried. The crtc and connector will hold the |
@@ -1456,6 +1478,7 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev) | |||
1456 | 1478 | ||
1457 | /* loops over all connectors on the board */ | 1479 | /* loops over all connectors on the board */ |
1458 | for (i = 0; i < link_cnt; i++) { | 1480 | for (i = 0; i < link_cnt; i++) { |
1481 | struct dc_link *link = NULL; | ||
1459 | 1482 | ||
1460 | if (i > AMDGPU_DM_MAX_DISPLAY_INDEX) { | 1483 | if (i > AMDGPU_DM_MAX_DISPLAY_INDEX) { |
1461 | DRM_ERROR( | 1484 | DRM_ERROR( |
@@ -1482,9 +1505,14 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev) | |||
1482 | goto fail; | 1505 | goto fail; |
1483 | } | 1506 | } |
1484 | 1507 | ||
1485 | if (dc_link_detect(dc_get_link_at_index(dm->dc, i), | 1508 | link = dc_get_link_at_index(dm->dc, i); |
1486 | DETECT_REASON_BOOT)) | 1509 | |
1510 | if (dc_link_detect(link, DETECT_REASON_BOOT)) { | ||
1487 | amdgpu_dm_update_connector_after_detect(aconnector); | 1511 | amdgpu_dm_update_connector_after_detect(aconnector); |
1512 | register_backlight_device(dm, link); | ||
1513 | } | ||
1514 | |||
1515 | |||
1488 | } | 1516 | } |
1489 | 1517 | ||
1490 | /* Software is initialized. Now we can register interrupt handlers. */ | 1518 | /* Software is initialized. Now we can register interrupt handlers. */ |
@@ -2685,7 +2713,8 @@ static void amdgpu_dm_connector_destroy(struct drm_connector *connector) | |||
2685 | #if defined(CONFIG_BACKLIGHT_CLASS_DEVICE) ||\ | 2713 | #if defined(CONFIG_BACKLIGHT_CLASS_DEVICE) ||\ |
2686 | defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE) | 2714 | defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE) |
2687 | 2715 | ||
2688 | if (link->connector_signal & (SIGNAL_TYPE_EDP | SIGNAL_TYPE_LVDS)) { | 2716 | if ((link->connector_signal & (SIGNAL_TYPE_EDP | SIGNAL_TYPE_LVDS)) && |
2717 | link->type != dc_connection_none) { | ||
2689 | amdgpu_dm_register_backlight_device(dm); | 2718 | amdgpu_dm_register_backlight_device(dm); |
2690 | 2719 | ||
2691 | if (dm->backlight_dev) { | 2720 | if (dm->backlight_dev) { |
@@ -3561,6 +3590,7 @@ create_i2c(struct ddc_service *ddc_service, | |||
3561 | return i2c; | 3590 | return i2c; |
3562 | } | 3591 | } |
3563 | 3592 | ||
3593 | |||
3564 | /* Note: this function assumes that dc_link_detect() was called for the | 3594 | /* Note: this function assumes that dc_link_detect() was called for the |
3565 | * dc_link which will be represented by this aconnector. | 3595 | * dc_link which will be represented by this aconnector. |
3566 | */ | 3596 | */ |
@@ -3630,28 +3660,6 @@ static int amdgpu_dm_connector_init(struct amdgpu_display_manager *dm, | |||
3630 | || connector_type == DRM_MODE_CONNECTOR_eDP) | 3660 | || connector_type == DRM_MODE_CONNECTOR_eDP) |
3631 | amdgpu_dm_initialize_dp_connector(dm, aconnector); | 3661 | amdgpu_dm_initialize_dp_connector(dm, aconnector); |
3632 | 3662 | ||
3633 | #if defined(CONFIG_BACKLIGHT_CLASS_DEVICE) ||\ | ||
3634 | defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE) | ||
3635 | |||
3636 | /* NOTE: this currently will create backlight device even if a panel | ||
3637 | * is not connected to the eDP/LVDS connector. | ||
3638 | * | ||
3639 | * This is less than ideal but we don't have sink information at this | ||
3640 | * stage since detection happens after. We can't do detection earlier | ||
3641 | * since MST detection needs connectors to be created first. | ||
3642 | */ | ||
3643 | if (link->connector_signal & (SIGNAL_TYPE_EDP | SIGNAL_TYPE_LVDS)) { | ||
3644 | /* Event if registration failed, we should continue with | ||
3645 | * DM initialization because not having a backlight control | ||
3646 | * is better then a black screen. | ||
3647 | */ | ||
3648 | amdgpu_dm_register_backlight_device(dm); | ||
3649 | |||
3650 | if (dm->backlight_dev) | ||
3651 | dm->backlight_link = link; | ||
3652 | } | ||
3653 | #endif | ||
3654 | |||
3655 | out_free: | 3663 | out_free: |
3656 | if (res) { | 3664 | if (res) { |
3657 | kfree(i2c); | 3665 | kfree(i2c); |
@@ -4840,33 +4848,6 @@ static int dm_update_planes_state(struct dc *dc, | |||
4840 | return ret; | 4848 | return ret; |
4841 | } | 4849 | } |
4842 | 4850 | ||
4843 | static int dm_atomic_check_plane_state_fb(struct drm_atomic_state *state, | ||
4844 | struct drm_crtc *crtc) | ||
4845 | { | ||
4846 | struct drm_plane *plane; | ||
4847 | struct drm_crtc_state *crtc_state; | ||
4848 | |||
4849 | WARN_ON(!drm_atomic_get_new_crtc_state(state, crtc)); | ||
4850 | |||
4851 | drm_for_each_plane_mask(plane, state->dev, crtc->state->plane_mask) { | ||
4852 | struct drm_plane_state *plane_state = | ||
4853 | drm_atomic_get_plane_state(state, plane); | ||
4854 | |||
4855 | if (IS_ERR(plane_state)) | ||
4856 | return -EDEADLK; | ||
4857 | |||
4858 | crtc_state = drm_atomic_get_crtc_state(plane_state->state, crtc); | ||
4859 | if (IS_ERR(crtc_state)) | ||
4860 | return PTR_ERR(crtc_state); | ||
4861 | |||
4862 | if (crtc->primary == plane && crtc_state->active) { | ||
4863 | if (!plane_state->fb) | ||
4864 | return -EINVAL; | ||
4865 | } | ||
4866 | } | ||
4867 | return 0; | ||
4868 | } | ||
4869 | |||
4870 | static int amdgpu_dm_atomic_check(struct drm_device *dev, | 4851 | static int amdgpu_dm_atomic_check(struct drm_device *dev, |
4871 | struct drm_atomic_state *state) | 4852 | struct drm_atomic_state *state) |
4872 | { | 4853 | { |
@@ -4890,10 +4871,6 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev, | |||
4890 | goto fail; | 4871 | goto fail; |
4891 | 4872 | ||
4892 | for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) { | 4873 | for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) { |
4893 | ret = dm_atomic_check_plane_state_fb(state, crtc); | ||
4894 | if (ret) | ||
4895 | goto fail; | ||
4896 | |||
4897 | if (!drm_atomic_crtc_needs_modeset(new_crtc_state) && | 4874 | if (!drm_atomic_crtc_needs_modeset(new_crtc_state) && |
4898 | !new_crtc_state->color_mgmt_changed) | 4875 | !new_crtc_state->color_mgmt_changed) |
4899 | continue; | 4876 | continue; |
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c b/drivers/gpu/drm/amd/display/dc/core/dc_link.c index eeb04471b2f5..6d1c4981a185 100644 --- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c +++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c | |||
@@ -1997,6 +1997,19 @@ bool dc_link_set_backlight_level(const struct dc_link *link, uint32_t level, | |||
1997 | return true; | 1997 | return true; |
1998 | } | 1998 | } |
1999 | 1999 | ||
2000 | bool dc_link_set_abm_disable(const struct dc_link *link) | ||
2001 | { | ||
2002 | struct dc *core_dc = link->ctx->dc; | ||
2003 | struct abm *abm = core_dc->res_pool->abm; | ||
2004 | |||
2005 | if ((abm == NULL) || (abm->funcs->set_backlight_level == NULL)) | ||
2006 | return false; | ||
2007 | |||
2008 | abm->funcs->set_abm_immediate_disable(abm); | ||
2009 | |||
2010 | return true; | ||
2011 | } | ||
2012 | |||
2000 | bool dc_link_set_psr_enable(const struct dc_link *link, bool enable, bool wait) | 2013 | bool dc_link_set_psr_enable(const struct dc_link *link, bool enable, bool wait) |
2001 | { | 2014 | { |
2002 | struct dc *core_dc = link->ctx->dc; | 2015 | struct dc *core_dc = link->ctx->dc; |
diff --git a/drivers/gpu/drm/amd/display/dc/dc_link.h b/drivers/gpu/drm/amd/display/dc/dc_link.h index fb4d9eafdc6e..dc34515ef01f 100644 --- a/drivers/gpu/drm/amd/display/dc/dc_link.h +++ b/drivers/gpu/drm/amd/display/dc/dc_link.h | |||
@@ -132,6 +132,8 @@ static inline struct dc_link *dc_get_link_at_index(struct dc *dc, uint32_t link_ | |||
132 | bool dc_link_set_backlight_level(const struct dc_link *dc_link, uint32_t level, | 132 | bool dc_link_set_backlight_level(const struct dc_link *dc_link, uint32_t level, |
133 | uint32_t frame_ramp, const struct dc_stream_state *stream); | 133 | uint32_t frame_ramp, const struct dc_stream_state *stream); |
134 | 134 | ||
135 | bool dc_link_set_abm_disable(const struct dc_link *dc_link); | ||
136 | |||
135 | bool dc_link_set_psr_enable(const struct dc_link *dc_link, bool enable, bool wait); | 137 | bool dc_link_set_psr_enable(const struct dc_link *dc_link, bool enable, bool wait); |
136 | 138 | ||
137 | bool dc_link_get_psr_state(const struct dc_link *dc_link, uint32_t *psr_state); | 139 | bool dc_link_get_psr_state(const struct dc_link *dc_link, uint32_t *psr_state); |
diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.c b/drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.c index 444558ca6533..162f6a6c4208 100644 --- a/drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.c +++ b/drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.c | |||
@@ -735,6 +735,8 @@ static void dce110_stream_encoder_update_hdmi_info_packets( | |||
735 | if (info_frame->avi.valid) { | 735 | if (info_frame->avi.valid) { |
736 | const uint32_t *content = | 736 | const uint32_t *content = |
737 | (const uint32_t *) &info_frame->avi.sb[0]; | 737 | (const uint32_t *) &info_frame->avi.sb[0]; |
738 | /*we need turn on clock before programming AFMT block*/ | ||
739 | REG_UPDATE(AFMT_CNTL, AFMT_AUDIO_CLOCK_EN, 1); | ||
738 | 740 | ||
739 | REG_WRITE(AFMT_AVI_INFO0, content[0]); | 741 | REG_WRITE(AFMT_AVI_INFO0, content[0]); |
740 | 742 | ||
diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_compressor.c b/drivers/gpu/drm/amd/display/dc/dce110/dce110_compressor.c index 775d3bf0bd39..9150d2694450 100644 --- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_compressor.c +++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_compressor.c | |||
@@ -102,6 +102,43 @@ static uint32_t align_to_chunks_number_per_line(uint32_t pixels) | |||
102 | return 256 * ((pixels + 255) / 256); | 102 | return 256 * ((pixels + 255) / 256); |
103 | } | 103 | } |
104 | 104 | ||
105 | static void reset_lb_on_vblank(struct dc_context *ctx) | ||
106 | { | ||
107 | uint32_t value, frame_count; | ||
108 | uint32_t retry = 0; | ||
109 | uint32_t status_pos = | ||
110 | dm_read_reg(ctx, mmCRTC_STATUS_POSITION); | ||
111 | |||
112 | |||
113 | /* Only if CRTC is enabled and counter is moving we wait for one frame. */ | ||
114 | if (status_pos != dm_read_reg(ctx, mmCRTC_STATUS_POSITION)) { | ||
115 | /* Resetting LB on VBlank */ | ||
116 | value = dm_read_reg(ctx, mmLB_SYNC_RESET_SEL); | ||
117 | set_reg_field_value(value, 3, LB_SYNC_RESET_SEL, LB_SYNC_RESET_SEL); | ||
118 | set_reg_field_value(value, 1, LB_SYNC_RESET_SEL, LB_SYNC_RESET_SEL2); | ||
119 | dm_write_reg(ctx, mmLB_SYNC_RESET_SEL, value); | ||
120 | |||
121 | frame_count = dm_read_reg(ctx, mmCRTC_STATUS_FRAME_COUNT); | ||
122 | |||
123 | |||
124 | for (retry = 100; retry > 0; retry--) { | ||
125 | if (frame_count != dm_read_reg(ctx, mmCRTC_STATUS_FRAME_COUNT)) | ||
126 | break; | ||
127 | msleep(1); | ||
128 | } | ||
129 | if (!retry) | ||
130 | dm_error("Frame count did not increase for 100ms.\n"); | ||
131 | |||
132 | /* Resetting LB on VBlank */ | ||
133 | value = dm_read_reg(ctx, mmLB_SYNC_RESET_SEL); | ||
134 | set_reg_field_value(value, 2, LB_SYNC_RESET_SEL, LB_SYNC_RESET_SEL); | ||
135 | set_reg_field_value(value, 0, LB_SYNC_RESET_SEL, LB_SYNC_RESET_SEL2); | ||
136 | dm_write_reg(ctx, mmLB_SYNC_RESET_SEL, value); | ||
137 | |||
138 | } | ||
139 | |||
140 | } | ||
141 | |||
105 | static void wait_for_fbc_state_changed( | 142 | static void wait_for_fbc_state_changed( |
106 | struct dce110_compressor *cp110, | 143 | struct dce110_compressor *cp110, |
107 | bool enabled) | 144 | bool enabled) |
@@ -232,19 +269,23 @@ void dce110_compressor_disable_fbc(struct compressor *compressor) | |||
232 | { | 269 | { |
233 | struct dce110_compressor *cp110 = TO_DCE110_COMPRESSOR(compressor); | 270 | struct dce110_compressor *cp110 = TO_DCE110_COMPRESSOR(compressor); |
234 | 271 | ||
235 | if (compressor->options.bits.FBC_SUPPORT && | 272 | if (compressor->options.bits.FBC_SUPPORT) { |
236 | dce110_compressor_is_fbc_enabled_in_hw(compressor, NULL)) { | 273 | if (dce110_compressor_is_fbc_enabled_in_hw(compressor, NULL)) { |
237 | uint32_t reg_data; | 274 | uint32_t reg_data; |
238 | /* Turn off compression */ | 275 | /* Turn off compression */ |
239 | reg_data = dm_read_reg(compressor->ctx, mmFBC_CNTL); | 276 | reg_data = dm_read_reg(compressor->ctx, mmFBC_CNTL); |
240 | set_reg_field_value(reg_data, 0, FBC_CNTL, FBC_GRPH_COMP_EN); | 277 | set_reg_field_value(reg_data, 0, FBC_CNTL, FBC_GRPH_COMP_EN); |
241 | dm_write_reg(compressor->ctx, mmFBC_CNTL, reg_data); | 278 | dm_write_reg(compressor->ctx, mmFBC_CNTL, reg_data); |
242 | 279 | ||
243 | /* Reset enum controller_id to undefined */ | 280 | /* Reset enum controller_id to undefined */ |
244 | compressor->attached_inst = 0; | 281 | compressor->attached_inst = 0; |
245 | compressor->is_enabled = false; | 282 | compressor->is_enabled = false; |
246 | 283 | ||
247 | wait_for_fbc_state_changed(cp110, false); | 284 | wait_for_fbc_state_changed(cp110, false); |
285 | } | ||
286 | |||
287 | /* Sync line buffer - dce100/110 only*/ | ||
288 | reset_lb_on_vblank(compressor->ctx); | ||
248 | } | 289 | } |
249 | } | 290 | } |
250 | 291 | ||
diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c index 30dd62f0f5fa..d0575999f172 100644 --- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c +++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c | |||
@@ -453,10 +453,13 @@ dce110_translate_regamma_to_hw_format(const struct dc_transfer_func *output_tf, | |||
453 | 453 | ||
454 | } else { | 454 | } else { |
455 | /* 10 segments | 455 | /* 10 segments |
456 | * segment is from 2^-10 to 2^0 | 456 | * segment is from 2^-10 to 2^1 |
457 | * We include an extra segment for range [2^0, 2^1). This is to | ||
458 | * ensure that colors with normalized values of 1 don't miss the | ||
459 | * LUT. | ||
457 | */ | 460 | */ |
458 | region_start = -10; | 461 | region_start = -10; |
459 | region_end = 0; | 462 | region_end = 1; |
460 | 463 | ||
461 | seg_distr[0] = 4; | 464 | seg_distr[0] = 4; |
462 | seg_distr[1] = 4; | 465 | seg_distr[1] = 4; |
@@ -468,7 +471,7 @@ dce110_translate_regamma_to_hw_format(const struct dc_transfer_func *output_tf, | |||
468 | seg_distr[7] = 4; | 471 | seg_distr[7] = 4; |
469 | seg_distr[8] = 4; | 472 | seg_distr[8] = 4; |
470 | seg_distr[9] = 4; | 473 | seg_distr[9] = 4; |
471 | seg_distr[10] = -1; | 474 | seg_distr[10] = 0; |
472 | seg_distr[11] = -1; | 475 | seg_distr[11] = -1; |
473 | seg_distr[12] = -1; | 476 | seg_distr[12] = -1; |
474 | seg_distr[13] = -1; | 477 | seg_distr[13] = -1; |
@@ -1016,8 +1019,10 @@ void dce110_blank_stream(struct pipe_ctx *pipe_ctx) | |||
1016 | struct dc_stream_state *stream = pipe_ctx->stream; | 1019 | struct dc_stream_state *stream = pipe_ctx->stream; |
1017 | struct dc_link *link = stream->sink->link; | 1020 | struct dc_link *link = stream->sink->link; |
1018 | 1021 | ||
1019 | if (link->local_sink && link->local_sink->sink_signal == SIGNAL_TYPE_EDP) | 1022 | if (link->local_sink && link->local_sink->sink_signal == SIGNAL_TYPE_EDP) { |
1020 | link->dc->hwss.edp_backlight_control(link, false); | 1023 | link->dc->hwss.edp_backlight_control(link, false); |
1024 | dc_link_set_abm_disable(link); | ||
1025 | } | ||
1021 | 1026 | ||
1022 | if (dc_is_dp_signal(pipe_ctx->stream->signal)) | 1027 | if (dc_is_dp_signal(pipe_ctx->stream->signal)) |
1023 | pipe_ctx->stream_res.stream_enc->funcs->dp_blank(pipe_ctx->stream_res.stream_enc); | 1028 | pipe_ctx->stream_res.stream_enc->funcs->dp_blank(pipe_ctx->stream_res.stream_enc); |