drm/nouveau/i2c/anx9805: add debugging to aux transactions
authorBen Skeggs <bskeggs@redhat.com>
Wed, 11 Jun 2014 00:28:18 +0000 (10:28 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Wed, 11 Jun 2014 06:10:35 +0000 (16:10 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/core/subdev/i2c/anx9805.c
drivers/gpu/drm/nouveau/core/subdev/i2c/port.h [new file with mode: 0644]

index 477f5a0..2c2731a 100644 (file)
@@ -22,7 +22,7 @@
  * Authors: Ben Skeggs <bskeggs@redhat.com>
  */
 
-#include "priv.h"
+#include "port.h"
 
 struct anx9805_i2c_port {
        struct nouveau_i2c_port base;
@@ -37,6 +37,8 @@ anx9805_train(struct nouveau_i2c_port *port, int link_nr, int link_bw, bool enh)
        struct nouveau_i2c_port *mast = (void *)nv_object(chan)->parent;
        u8 tmp, i;
 
+       DBG("ANX9805 train %d 0x%02x %d\n", link_nr, link_bw, enh);
+
        nv_wri2cr(mast, chan->addr, 0xa0, link_bw);
        nv_wri2cr(mast, chan->addr, 0xa1, link_nr | (enh ? 0x80 : 0x00));
        nv_wri2cr(mast, chan->addr, 0xa2, 0x01);
@@ -66,16 +68,23 @@ anx9805_aux(struct nouveau_i2c_port *port, bool retry,
        struct anx9805_i2c_port *chan = (void *)port;
        struct nouveau_i2c_port *mast = (void *)nv_object(chan)->parent;
        int i, ret = -ETIMEDOUT;
+       u8 buf[16] = {};
        u8 tmp;
 
+       DBG("%02x %05x %d\n", type, addr, size);
+
        tmp = nv_rdi2cr(mast, chan->ctrl, 0x07) & ~0x04;
        nv_wri2cr(mast, chan->ctrl, 0x07, tmp | 0x04);
        nv_wri2cr(mast, chan->ctrl, 0x07, tmp);
        nv_wri2cr(mast, chan->ctrl, 0xf7, 0x01);
 
        nv_wri2cr(mast, chan->addr, 0xe4, 0x80);
-       for (i = 0; !(type & 1) && i < size; i++)
-               nv_wri2cr(mast, chan->addr, 0xf0 + i, data[i]);
+       if (!(type & 1)) {
+               memcpy(buf, data, size);
+               DBG("%16ph", buf);
+               for (i = 0; i < size; i++)
+                       nv_wri2cr(mast, chan->addr, 0xf0 + i, buf[i]);
+       }
        nv_wri2cr(mast, chan->addr, 0xe5, ((size - 1) << 4) | type);
        nv_wri2cr(mast, chan->addr, 0xe6, (addr & 0x000ff) >>  0);
        nv_wri2cr(mast, chan->addr, 0xe7, (addr & 0x0ff00) >>  8);
@@ -94,8 +103,13 @@ anx9805_aux(struct nouveau_i2c_port *port, bool retry,
                goto done;
        }
 
-       for (i = 0; (type & 1) && i < size; i++)
-               data[i] = nv_rdi2cr(mast, chan->addr, 0xf0 + i);
+       if (type & 1) {
+               for (i = 0; i < size; i++)
+                       buf[i] = nv_rdi2cr(mast, chan->addr, 0xf0 + i);
+               DBG("%16ph", buf);
+               memcpy(data, buf, size);
+       }
+
        ret = 0;
 done:
        nv_wri2cr(mast, chan->ctrl, 0xf7, 0x01);
diff --git a/drivers/gpu/drm/nouveau/core/subdev/i2c/port.h b/drivers/gpu/drm/nouveau/core/subdev/i2c/port.h
new file mode 100644 (file)
index 0000000..a8ff6e0
--- /dev/null
@@ -0,0 +1,15 @@
+#ifndef __NVKM_I2C_PORT_H__
+#define __NVKM_I2C_PORT_H__
+
+#include "priv.h"
+
+#ifndef MSG
+#define MSG(l,f,a...) do {                                                     \
+       struct nouveau_i2c_port *_port = (void *)port;                         \
+       nv_##l(nv_object(_port)->engine, "PORT:%02x: "f, _port->index, ##a);   \
+} while(0)
+#define DBG(f,a...) MSG(debug, f, ##a)
+#define ERR(f,a...) MSG(error, f, ##a)
+#endif
+
+#endif