| From 007ea8e473ce205c6197fdfc7a64accaf3808315 Mon Sep 17 00:00:00 2001 |
| From: Paulo Zanoni <paulo.r.zanoni@intel.com> |
| Date: Tue, 17 Sep 2013 11:14:10 -0300 |
| Subject: drm/i915: WARN is the DP aux read or write is too big |
| |
| So far we control everything and nothing exceeds the current limits, |
| but (i) we never think about these limits when reviewing patches, (ii) |
| not all the callers check the return values and (iii) if we ever hit |
| any of these messages, we'll have to fix the code that added the bad |
| message. |
| |
| The current limit for these messages is 20 since we only have 5 data |
| registers on all the current gens. |
| |
| The checks inside intel_dp_aux_native_{write,read} are to prevent |
| buffer overflows. The check inside intel_dp_aux_ch is to prevent |
| writing past our 5 data registers. |
| |
| Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com> |
| Reviewed-by: Jani Nikula <jani.nikula@intel.com> |
| Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> |
| (cherry picked from commit 46a5ae9f82719aa6e3c9c0d344772f475a335161) |
| Signed-off-by: Darren Hart <dvhart@linux.intel.com> |
| --- |
| drivers/gpu/drm/i915/intel_dp.c | 14 ++++++++++++-- |
| 1 file changed, 12 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c |
| index cbbd36913109..60d2006fe15d 100644 |
| --- a/drivers/gpu/drm/i915/intel_dp.c |
| +++ b/drivers/gpu/drm/i915/intel_dp.c |
| @@ -436,6 +436,12 @@ intel_dp_aux_ch(struct intel_dp *intel_dp, |
| goto out; |
| } |
| |
| + /* Only 5 data registers! */ |
| + if (WARN_ON(send_bytes > 20 || recv_size > 20)) { |
| + ret = -E2BIG; |
| + goto out; |
| + } |
| + |
| while ((aux_clock_divider = get_aux_clock_divider(intel_dp, clock++))) { |
| /* Must try at least 3 times according to DP spec */ |
| for (try = 0; try < 5; try++) { |
| @@ -526,9 +532,10 @@ intel_dp_aux_native_write(struct intel_dp *intel_dp, |
| int msg_bytes; |
| uint8_t ack; |
| |
| + if (WARN_ON(send_bytes > 16)) |
| + return -E2BIG; |
| + |
| intel_dp_check_edp(intel_dp); |
| - if (send_bytes > 16) |
| - return -1; |
| msg[0] = AUX_NATIVE_WRITE << 4; |
| msg[1] = address >> 8; |
| msg[2] = address & 0xff; |
| @@ -569,6 +576,9 @@ intel_dp_aux_native_read(struct intel_dp *intel_dp, |
| uint8_t ack; |
| int ret; |
| |
| + if (WARN_ON(recv_bytes > 19)) |
| + return -E2BIG; |
| + |
| intel_dp_check_edp(intel_dp); |
| msg[0] = AUX_NATIVE_READ << 4; |
| msg[1] = address >> 8; |
| -- |
| 1.8.5.rc3 |
| |