diff --git a/msm/dp/dp_debug.c b/msm/dp/dp_debug.c index 9d80480086..8675b71c22 100644 --- a/msm/dp/dp_debug.c +++ b/msm/dp/dp_debug.c @@ -212,7 +212,7 @@ static ssize_t dp_debug_write_dpcd(struct file *file, size = min_t(size_t, count, SZ_2K); - if (size <= 4) + if (size < 4) goto bail; buf = kzalloc(size, GFP_KERNEL); @@ -231,9 +231,10 @@ static ssize_t dp_debug_write_dpcd(struct file *file, DP_ERR("offset kstrtoint error\n"); goto bail; } + debug->dpcd_offset = offset; size -= 4; - if (size == 0) + if (size < char_to_nib) goto bail; dpcd_size = size / char_to_nib; @@ -277,7 +278,6 @@ static ssize_t dp_debug_write_dpcd(struct file *file, dp_sim_write_dpcd_reg(debug->sim_bridge, dpcd, dpcd_buf_index, offset); - debug->dpcd_offset = offset; debug->dpcd_size = dpcd_buf_index; bail: @@ -315,21 +315,27 @@ static ssize_t dp_debug_read_dpcd(struct file *file, /* * In simulation mode, this function returns the last written DPCD node. - * For a real monitor plug in, it always dumps the first 16 DPCD registers. + * For a real monitor plug in, it dumps the first byte at the last written DPCD address + * unless the address is 0, in which case the first 20 bytes are dumped */ if (debug->dp_debug.sim_mode) { dp_sim_read_dpcd_reg(debug->sim_bridge, dpcd, debug->dpcd_size, debug->dpcd_offset); } else { - debug->dpcd_size = sizeof(debug->panel->dpcd); - debug->dpcd_offset = 0; - memcpy(dpcd, debug->panel->dpcd, debug->dpcd_size); + if (debug->dpcd_offset) { + debug->dpcd_size = 1; + if (drm_dp_dpcd_read(debug->aux->drm_aux, debug->dpcd_offset, dpcd, + debug->dpcd_size) != 1) + goto bail; + } else { + debug->dpcd_size = sizeof(debug->panel->dpcd); + memcpy(dpcd, debug->panel->dpcd, debug->dpcd_size); + } } - len += scnprintf(buf, buf_size, "%04x: ", debug->dpcd_offset); + len += scnprintf(buf + len , buf_size - len, "%04x: ", debug->dpcd_offset); while (offset < debug->dpcd_size) - len += scnprintf(buf + len, buf_size - len, "%02x ", - dpcd[debug->dpcd_offset + offset++]); + len += scnprintf(buf + len, buf_size - len, "%02x ", dpcd[offset++]); kfree(dpcd);