diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2014-02-20 23:26:18 +1000 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2014-03-26 14:00:39 +1000 |
commit | 9cf6ba20b4fd1299d376364a698f6068b99b1de5 (patch) | |
tree | 5883f085271d40edbf15d027e5b39f5d0735ee34 /drivers/gpu/drm/nouveau/core/engine/disp/nv50.c | |
parent | b62b9ec2eb7b2861db1186b701c04a08b6208553 (diff) | |
download | op-kernel-dev-9cf6ba20b4fd1299d376364a698f6068b99b1de5.zip op-kernel-dev-9cf6ba20b4fd1299d376364a698f6068b99b1de5.tar.gz |
drm/nv50-/disp: dump channel state when update method fails
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/nouveau/core/engine/disp/nv50.c')
-rw-r--r-- | drivers/gpu/drm/nouveau/core/engine/disp/nv50.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/drivers/gpu/drm/nouveau/core/engine/disp/nv50.c b/drivers/gpu/drm/nouveau/core/engine/disp/nv50.c index e94866e..9a0cab9 100644 --- a/drivers/gpu/drm/nouveau/core/engine/disp/nv50.c +++ b/drivers/gpu/drm/nouveau/core/engine/disp/nv50.c @@ -1058,6 +1058,7 @@ nv50_disp_intr_error_code[] = { static void nv50_disp_intr_error(struct nv50_disp_priv *priv, int chid) { + struct nv50_disp_impl *impl = (void *)nv_object(priv)->oclass; u32 data = nv_rd32(priv, 0x610084 + (chid * 0x08)); u32 addr = nv_rd32(priv, 0x610080 + (chid * 0x08)); u32 code = (addr & 0x00ff0000) >> 16; @@ -1078,6 +1079,37 @@ nv50_disp_intr_error(struct nv50_disp_priv *priv, int chid) et ? et->name : etunk, ec ? ec->name : ecunk, chid, mthd, data); + if (chid == 0) { + switch (mthd) { + case 0x0080: + nv50_disp_mthd_chan(priv, NV_DBG_ERROR, chid - 0, + impl->mthd.core); + break; + default: + break; + } + } else + if (chid <= 2) { + switch (mthd) { + case 0x0080: + nv50_disp_mthd_chan(priv, NV_DBG_ERROR, chid - 1, + impl->mthd.base); + break; + default: + break; + } + } else + if (chid <= 4) { + switch (mthd) { + case 0x0080: + nv50_disp_mthd_chan(priv, NV_DBG_ERROR, chid - 3, + impl->mthd.ovly); + break; + default: + break; + } + } + nv_wr32(priv, 0x610020, 0x00010000 << chid); nv_wr32(priv, 0x610080 + (chid * 0x08), 0x90000000); } |