aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2018-07-10 13:56:45 -0400
committerAlex Deucher <alexander.deucher@amd.com>2018-07-10 15:35:46 -0400
commit5292221d6ddfed75e5b46cd42237a677094b99f3 (patch)
tree09eb77a24092553119592facad325dec9171e205 /drivers/gpu
parentdc81aab1be9fac2e11f31fe7538a50705eba08cf (diff)
Revert "drm/amd/display: Don't return ddc result and read_bytes in same return value"
This reverts commit 018d82e5f02ef3583411bcaa4e00c69786f46f19. This breaks DDC in certain cases. Revert for 4.18 and previous kernels. For 4.19, this is fixed with the following more extensive patches: drm/amd/display: Serialize is_dp_sink_present drm/amd/display: Break out function to simply read aux reply drm/amd/display: Return aux replies directly to DRM drm/amd/display: Right shift AUX reply value sooner than later drm/amd/display: Read AUX channel even if only status byte is returned Link: https://lists.freedesktop.org/archives/amd-gfx/2018-July/023788.html Acked-by: Harry Wentland <harry.wentland@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com> Cc: stable@vger.kernel.org
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c20
-rw-r--r--drivers/gpu/drm/amd/display/dc/core/dc_link_ddc.c10
-rw-r--r--drivers/gpu/drm/amd/display/dc/inc/dc_link_ddc.h5
3 files changed, 13 insertions, 22 deletions
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
index 4304d9e408b8..ace9ad578ca0 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
@@ -83,22 +83,21 @@ static ssize_t dm_dp_aux_transfer(struct drm_dp_aux *aux,
83 enum i2c_mot_mode mot = (msg->request & DP_AUX_I2C_MOT) ? 83 enum i2c_mot_mode mot = (msg->request & DP_AUX_I2C_MOT) ?
84 I2C_MOT_TRUE : I2C_MOT_FALSE; 84 I2C_MOT_TRUE : I2C_MOT_FALSE;
85 enum ddc_result res; 85 enum ddc_result res;
86 uint32_t read_bytes = msg->size; 86 ssize_t read_bytes;
87 87
88 if (WARN_ON(msg->size > 16)) 88 if (WARN_ON(msg->size > 16))
89 return -E2BIG; 89 return -E2BIG;
90 90
91 switch (msg->request & ~DP_AUX_I2C_MOT) { 91 switch (msg->request & ~DP_AUX_I2C_MOT) {
92 case DP_AUX_NATIVE_READ: 92 case DP_AUX_NATIVE_READ:
93 res = dal_ddc_service_read_dpcd_data( 93 read_bytes = dal_ddc_service_read_dpcd_data(
94 TO_DM_AUX(aux)->ddc_service, 94 TO_DM_AUX(aux)->ddc_service,
95 false, 95 false,
96 I2C_MOT_UNDEF, 96 I2C_MOT_UNDEF,
97 msg->address, 97 msg->address,
98 msg->buffer, 98 msg->buffer,
99 msg->size, 99 msg->size);
100 &read_bytes); 100 return read_bytes;
101 break;
102 case DP_AUX_NATIVE_WRITE: 101 case DP_AUX_NATIVE_WRITE:
103 res = dal_ddc_service_write_dpcd_data( 102 res = dal_ddc_service_write_dpcd_data(
104 TO_DM_AUX(aux)->ddc_service, 103 TO_DM_AUX(aux)->ddc_service,
@@ -109,15 +108,14 @@ static ssize_t dm_dp_aux_transfer(struct drm_dp_aux *aux,
109 msg->size); 108 msg->size);
110 break; 109 break;
111 case DP_AUX_I2C_READ: 110 case DP_AUX_I2C_READ:
112 res = dal_ddc_service_read_dpcd_data( 111 read_bytes = dal_ddc_service_read_dpcd_data(
113 TO_DM_AUX(aux)->ddc_service, 112 TO_DM_AUX(aux)->ddc_service,
114 true, 113 true,
115 mot, 114 mot,
116 msg->address, 115 msg->address,
117 msg->buffer, 116 msg->buffer,
118 msg->size, 117 msg->size);
119 &read_bytes); 118 return read_bytes;
120 break;
121 case DP_AUX_I2C_WRITE: 119 case DP_AUX_I2C_WRITE:
122 res = dal_ddc_service_write_dpcd_data( 120 res = dal_ddc_service_write_dpcd_data(
123 TO_DM_AUX(aux)->ddc_service, 121 TO_DM_AUX(aux)->ddc_service,
@@ -139,9 +137,7 @@ static ssize_t dm_dp_aux_transfer(struct drm_dp_aux *aux,
139 r == DDC_RESULT_SUCESSFULL); 137 r == DDC_RESULT_SUCESSFULL);
140#endif 138#endif
141 139
142 if (res != DDC_RESULT_SUCESSFULL) 140 return msg->size;
143 return -EIO;
144 return read_bytes;
145} 141}
146 142
147static enum drm_connector_status 143static enum drm_connector_status
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link_ddc.c b/drivers/gpu/drm/amd/display/dc/core/dc_link_ddc.c
index ae48d603ebd6..49c2face1e7a 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_link_ddc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_link_ddc.c
@@ -629,14 +629,13 @@ bool dal_ddc_service_query_ddc_data(
629 return ret; 629 return ret;
630} 630}
631 631
632enum ddc_result dal_ddc_service_read_dpcd_data( 632ssize_t dal_ddc_service_read_dpcd_data(
633 struct ddc_service *ddc, 633 struct ddc_service *ddc,
634 bool i2c, 634 bool i2c,
635 enum i2c_mot_mode mot, 635 enum i2c_mot_mode mot,
636 uint32_t address, 636 uint32_t address,
637 uint8_t *data, 637 uint8_t *data,
638 uint32_t len, 638 uint32_t len)
639 uint32_t *read)
640{ 639{
641 struct aux_payload read_payload = { 640 struct aux_payload read_payload = {
642 .i2c_over_aux = i2c, 641 .i2c_over_aux = i2c,
@@ -653,8 +652,6 @@ enum ddc_result dal_ddc_service_read_dpcd_data(
653 .mot = mot 652 .mot = mot
654 }; 653 };
655 654
656 *read = 0;
657
658 if (len > DEFAULT_AUX_MAX_DATA_SIZE) { 655 if (len > DEFAULT_AUX_MAX_DATA_SIZE) {
659 BREAK_TO_DEBUGGER(); 656 BREAK_TO_DEBUGGER();
660 return DDC_RESULT_FAILED_INVALID_OPERATION; 657 return DDC_RESULT_FAILED_INVALID_OPERATION;
@@ -664,8 +661,7 @@ enum ddc_result dal_ddc_service_read_dpcd_data(
664 ddc->ctx->i2caux, 661 ddc->ctx->i2caux,
665 ddc->ddc_pin, 662 ddc->ddc_pin,
666 &command)) { 663 &command)) {
667 *read = command.payloads->length; 664 return (ssize_t)command.payloads->length;
668 return DDC_RESULT_SUCESSFULL;
669 } 665 }
670 666
671 return DDC_RESULT_FAILED_OPERATION; 667 return DDC_RESULT_FAILED_OPERATION;
diff --git a/drivers/gpu/drm/amd/display/dc/inc/dc_link_ddc.h b/drivers/gpu/drm/amd/display/dc/inc/dc_link_ddc.h
index 30b3a08b91be..090b7a8dd67b 100644
--- a/drivers/gpu/drm/amd/display/dc/inc/dc_link_ddc.h
+++ b/drivers/gpu/drm/amd/display/dc/inc/dc_link_ddc.h
@@ -102,14 +102,13 @@ bool dal_ddc_service_query_ddc_data(
102 uint8_t *read_buf, 102 uint8_t *read_buf,
103 uint32_t read_size); 103 uint32_t read_size);
104 104
105enum ddc_result dal_ddc_service_read_dpcd_data( 105ssize_t dal_ddc_service_read_dpcd_data(
106 struct ddc_service *ddc, 106 struct ddc_service *ddc,
107 bool i2c, 107 bool i2c,
108 enum i2c_mot_mode mot, 108 enum i2c_mot_mode mot,
109 uint32_t address, 109 uint32_t address,
110 uint8_t *data, 110 uint8_t *data,
111 uint32_t len, 111 uint32_t len);
112 uint32_t *read);
113 112
114enum ddc_result dal_ddc_service_write_dpcd_data( 113enum ddc_result dal_ddc_service_write_dpcd_data(
115 struct ddc_service *ddc, 114 struct ddc_service *ddc,