.. | .. |
---|
91 | 91 | { |
---|
92 | 92 | struct nvkm_subdev *subdev = &disp->base.engine.subdev; |
---|
93 | 93 | struct nvkm_device *device = subdev->device; |
---|
94 | | - u32 mthd = nvkm_rd32(device, 0x6101f0 + (chid * 12)); |
---|
| 94 | + u32 stat = nvkm_rd32(device, 0x6101f0 + (chid * 12)); |
---|
| 95 | + u32 type = (stat & 0x00007000) >> 12; |
---|
| 96 | + u32 mthd = (stat & 0x00000ffc); |
---|
95 | 97 | u32 data = nvkm_rd32(device, 0x6101f4 + (chid * 12)); |
---|
96 | | - u32 unkn = nvkm_rd32(device, 0x6101f8 + (chid * 12)); |
---|
| 98 | + u32 code = nvkm_rd32(device, 0x6101f8 + (chid * 12)); |
---|
| 99 | + const struct nvkm_enum *reason = |
---|
| 100 | + nvkm_enum_find(nv50_disp_intr_error_type, type); |
---|
97 | 101 | |
---|
98 | | - nvkm_error(subdev, "chid %d mthd %04x data %08x %08x %08x\n", |
---|
99 | | - chid, (mthd & 0x0000ffc), data, mthd, unkn); |
---|
| 102 | + nvkm_error(subdev, "chid %d stat %08x reason %d [%s] mthd %04x " |
---|
| 103 | + "data %08x code %08x\n", |
---|
| 104 | + chid, stat, type, reason ? reason->name : "", |
---|
| 105 | + mthd, data, code); |
---|
100 | 106 | |
---|
101 | 107 | if (chid < ARRAY_SIZE(disp->chan)) { |
---|
102 | | - switch (mthd & 0xffc) { |
---|
| 108 | + switch (mthd) { |
---|
103 | 109 | case 0x0080: |
---|
104 | 110 | nv50_disp_chan_mthd(disp->chan[chid], NV_DBG_ERROR); |
---|
105 | 111 | break; |
---|