|
31 | 31 | #include "nvc0_graph.h" |
32 | 32 |
|
33 | 33 | static void nvc0_graph_isr(struct drm_device *); |
| 34 | +static void nvc0_runk140_isr(struct drm_device *); |
34 | 35 | static int nvc0_graph_unload_context_to(struct drm_device *dev, u64 chan); |
35 | 36 |
|
36 | 37 | void |
@@ -281,6 +282,7 @@ nvc0_graph_destroy(struct drm_device *dev) |
281 | 282 | return; |
282 | 283 |
|
283 | 284 | nouveau_irq_unregister(dev, 12); |
| 285 | + nouveau_irq_unregister(dev, 25); |
284 | 286 |
|
285 | 287 | nouveau_gpuobj_ref(NULL, &priv->unk4188b8); |
286 | 288 | nouveau_gpuobj_ref(NULL, &priv->unk4188b4); |
@@ -390,6 +392,7 @@ nvc0_graph_create(struct drm_device *dev) |
390 | 392 | } |
391 | 393 |
|
392 | 394 | nouveau_irq_register(dev, 12, nvc0_graph_isr); |
| 395 | + nouveau_irq_register(dev, 25, nvc0_runk140_isr); |
393 | 396 | NVOBJ_CLASS(dev, 0x902d, GR); /* 2D */ |
394 | 397 | NVOBJ_CLASS(dev, 0x9039, GR); /* M2MF */ |
395 | 398 | NVOBJ_CLASS(dev, 0x9097, GR); /* 3D */ |
@@ -777,3 +780,19 @@ nvc0_graph_isr(struct drm_device *dev) |
777 | 780 |
|
778 | 781 | nv_wr32(dev, 0x400500, 0x00010001); |
779 | 782 | } |
| 783 | + |
| 784 | +static void |
| 785 | +nvc0_runk140_isr(struct drm_device *dev) |
| 786 | +{ |
| 787 | + u32 units = nv_rd32(dev, 0x00017c) & 0x1f; |
| 788 | + |
| 789 | + while (units) { |
| 790 | + u32 unit = ffs(units) - 1; |
| 791 | + u32 reg = 0x140000 + unit * 0x2000; |
| 792 | + u32 st0 = nv_mask(dev, reg + 0x1020, 0, 0); |
| 793 | + u32 st1 = nv_mask(dev, reg + 0x1420, 0, 0); |
| 794 | + |
| 795 | + NV_INFO(dev, "PRUNK140: %d 0x%08x 0x%08x\n", unit, st0, st1); |
| 796 | + units &= ~(1 << unit); |
| 797 | + } |
| 798 | +} |
0 commit comments