aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2018-04-12 19:25:21 -0400
committerDave Airlie <airlied@redhat.com>2018-04-12 19:25:21 -0400
commita10beabba213924d876f2d10ca9351aeab93f58a (patch)
tree7f8d845244580a9e971b53a84a039903b06a44be /drivers/gpu/drm/amd
parentdece02f71dabdba9823a87a5ef702a3946e15ab7 (diff)
parent1cb19e8267a57c5174da09e0d52d1477baceccca (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.h2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c3
-rw-r--r--drivers/gpu/drm/amd/amdgpu/vega10_reg_init.c3
-rw-r--r--drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c89
-rw-r--r--drivers/gpu/drm/amd/display/dc/core/dc_link.c13
-rw-r--r--drivers/gpu/drm/amd/display/dc/dc_link.h2
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.c2
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce110/dce110_compressor.c67
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c13
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
506int psp_gpu_reset(struct amdgpu_device *adev) 506int 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
1407static 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
3655out_free: 3663out_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
4843static 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
4870static int amdgpu_dm_atomic_check(struct drm_device *dev, 4851static 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
2000bool 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
2000bool dc_link_set_psr_enable(const struct dc_link *link, bool enable, bool wait) 2013bool 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_
132bool dc_link_set_backlight_level(const struct dc_link *dc_link, uint32_t level, 132bool 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
135bool dc_link_set_abm_disable(const struct dc_link *dc_link);
136
135bool dc_link_set_psr_enable(const struct dc_link *dc_link, bool enable, bool wait); 137bool dc_link_set_psr_enable(const struct dc_link *dc_link, bool enable, bool wait);
136 138
137bool dc_link_get_psr_state(const struct dc_link *dc_link, uint32_t *psr_state); 139bool 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
105static 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
105static void wait_for_fbc_state_changed( 142static 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);