aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarry Wentland <harry.wentland@amd.com>2018-04-24 10:49:20 -0400
committerAlex Deucher <alexander.deucher@amd.com>2018-05-09 16:15:59 -0400
commit018d82e5f02ef3583411bcaa4e00c69786f46f19 (patch)
treed023451e2c3006625f2c79c85ac032e4fd5fd281
parent6e65fb862064663ad3a08f964af1e8f3f2abf688 (diff)
drm/amd/display: Don't return ddc result and read_bytes in same return value
The two ranges overlap. Signed-off-by: Harry Wentland <harry.wentland@amd.com> Acked-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-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, 22 insertions, 13 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 ace9ad578ca0..4304d9e408b8 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,21 +83,22 @@ 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 ssize_t read_bytes; 86 uint32_t read_bytes = msg->size;
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 read_bytes = dal_ddc_service_read_dpcd_data( 93 res = 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 return read_bytes; 100 &read_bytes);
101 break;
101 case DP_AUX_NATIVE_WRITE: 102 case DP_AUX_NATIVE_WRITE:
102 res = dal_ddc_service_write_dpcd_data( 103 res = dal_ddc_service_write_dpcd_data(
103 TO_DM_AUX(aux)->ddc_service, 104 TO_DM_AUX(aux)->ddc_service,
@@ -108,14 +109,15 @@ static ssize_t dm_dp_aux_transfer(struct drm_dp_aux *aux,
108 msg->size); 109 msg->size);
109 break; 110 break;
110 case DP_AUX_I2C_READ: 111 case DP_AUX_I2C_READ:
111 read_bytes = dal_ddc_service_read_dpcd_data( 112 res = dal_ddc_service_read_dpcd_data(
112 TO_DM_AUX(aux)->ddc_service, 113 TO_DM_AUX(aux)->ddc_service,
113 true, 114 true,
114 mot, 115 mot,
115 msg->address, 116 msg->address,
116 msg->buffer, 117 msg->buffer,
117 msg->size); 118 msg->size,
118 return read_bytes; 119 &read_bytes);
120 break;
119 case DP_AUX_I2C_WRITE: 121 case DP_AUX_I2C_WRITE:
120 res = dal_ddc_service_write_dpcd_data( 122 res = dal_ddc_service_write_dpcd_data(
121 TO_DM_AUX(aux)->ddc_service, 123 TO_DM_AUX(aux)->ddc_service,
@@ -137,7 +139,9 @@ static ssize_t dm_dp_aux_transfer(struct drm_dp_aux *aux,
137 r == DDC_RESULT_SUCESSFULL); 139 r == DDC_RESULT_SUCESSFULL);
138#endif 140#endif
139 141
140 return msg->size; 142 if (res != DDC_RESULT_SUCESSFULL)
143 return -EIO;
144 return read_bytes;
141} 145}
142 146
143static enum drm_connector_status 147static 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 49c2face1e7a..ae48d603ebd6 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,13 +629,14 @@ bool dal_ddc_service_query_ddc_data(
629 return ret; 629 return ret;
630} 630}
631 631
632ssize_t dal_ddc_service_read_dpcd_data( 632enum ddc_result 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)
639{ 640{
640 struct aux_payload read_payload = { 641 struct aux_payload read_payload = {
641 .i2c_over_aux = i2c, 642 .i2c_over_aux = i2c,
@@ -652,6 +653,8 @@ ssize_t dal_ddc_service_read_dpcd_data(
652 .mot = mot 653 .mot = mot
653 }; 654 };
654 655
656 *read = 0;
657
655 if (len > DEFAULT_AUX_MAX_DATA_SIZE) { 658 if (len > DEFAULT_AUX_MAX_DATA_SIZE) {
656 BREAK_TO_DEBUGGER(); 659 BREAK_TO_DEBUGGER();
657 return DDC_RESULT_FAILED_INVALID_OPERATION; 660 return DDC_RESULT_FAILED_INVALID_OPERATION;
@@ -661,7 +664,8 @@ ssize_t dal_ddc_service_read_dpcd_data(
661 ddc->ctx->i2caux, 664 ddc->ctx->i2caux,
662 ddc->ddc_pin, 665 ddc->ddc_pin,
663 &command)) { 666 &command)) {
664 return (ssize_t)command.payloads->length; 667 *read = command.payloads->length;
668 return DDC_RESULT_SUCESSFULL;
665 } 669 }
666 670
667 return DDC_RESULT_FAILED_OPERATION; 671 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 090b7a8dd67b..30b3a08b91be 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,13 +102,14 @@ 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
105ssize_t dal_ddc_service_read_dpcd_data( 105enum ddc_result 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);
112 113
113enum ddc_result dal_ddc_service_write_dpcd_data( 114enum ddc_result dal_ddc_service_write_dpcd_data(
114 struct ddc_service *ddc, 115 struct ddc_service *ddc,