<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Jul 20, 2015 at 1:49 AM, Thierry Reding <span dir="ltr"><<a href="mailto:thierry.reding@gmail.com" target="_blank">thierry.reding@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">From: Thierry Reding <<a href="mailto:treding@nvidia.com">treding@nvidia.com</a>><br>
<br>
The DPAUX read/write FIFO registers aren't sequential in the register<br>
space, causing transfers larger than 4 bytes to cause accesses to non-<br>
existing FIFO registers.<br>
<br>
Fixes: 6b6b604215c6 ("drm/tegra: Add eDP support")<br>
Signed-off-by: Thierry Reding <<a href="mailto:treding@nvidia.com">treding@nvidia.com</a>><br>
---<br>
 drivers/gpu/drm/tegra/dpaux.c | 18 ++++++++----------<br>
 1 file changed, 8 insertions(+), 10 deletions(-)<br>
<br>
diff --git a/drivers/gpu/drm/tegra/dpaux.c b/drivers/gpu/drm/tegra/dpaux.c<br>
index d6b55e3e3716..a43a836e6f88 100644<br>
--- a/drivers/gpu/drm/tegra/dpaux.c<br>
+++ b/drivers/gpu/drm/tegra/dpaux.c<br>
@@ -72,34 +72,32 @@ static inline void tegra_dpaux_writel(struct tegra_dpaux *dpaux,<br>
 static void tegra_dpaux_write_fifo(struct tegra_dpaux *dpaux, const u8 *buffer,<br>
                                   size_t size)<br>
 {<br>
-       unsigned long offset = DPAUX_DP_AUXDATA_WRITE(0);<br>
        size_t i, j;<br>
<br>
-       for (i = 0; i < size; i += 4) {<br>
-               size_t num = min_t(size_t, size - i, 4);<br>
+       for (i = 0; i < DIV_ROUND_UP(size, 4); i++) {<br>
+               size_t num = min_t(size_t, size - i * 4, 4);<br>
                unsigned long value = 0;<br>
<br>
                for (j = 0; j < num; j++)<br>
-                       value |= buffer[i + j] << (j * 8);<br>
+                       value |= buffer[i * 4 + j] << (j * 8);<br>
<br>
-               tegra_dpaux_writel(dpaux, value, offset++);<br>
+               tegra_dpaux_writel(dpaux, value, DPAUX_DP_AUXDATA_WRITE(i));<br>
        }<br>
 }<br>
<br>
 static void tegra_dpaux_read_fifo(struct tegra_dpaux *dpaux, u8 *buffer,<br>
                                  size_t size)<br>
 {<br>
-       unsigned long offset = DPAUX_DP_AUXDATA_READ(0);<br>
        size_t i, j;<br>
<br>
-       for (i = 0; i < size; i += 4) {<br>
-               size_t num = min_t(size_t, size - i, 4);<br>
+       for (i = 0; i < DIV_ROUND_UP(size, 4); i++) {<br>
+               size_t num = min_t(size_t, size - i * 4, 4);<br>
                unsigned long value;<br>
<br>
-               value = tegra_dpaux_readl(dpaux, offset++);<br>
+               value = tegra_dpaux_readl(dpaux, DPAUX_DP_AUXDATA_READ(i));<br>
<br>
                for (j = 0; j < num; j++)<br>
-                       buffer[i + j] = value >> (j * 8);<br>
+                       buffer[i * 4 + j] = value >> (j * 8);<br>
        }<br>
 }<br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
2.4.5<br>
<br>
</font></span></blockquote></div><br></div><div class="gmail_extra"><br></div><div class="gmail_extra">This fixes the issue that I reported earlier, so feel free to add my</div><div class="gmail_extra"><br></div><div class="gmail_extra">Tested-by: Steev Klimaszewski <<a href="mailto:steev@gentoo.org">steev@gentoo.org</a>></div></div>