drm/nouveau/mc: implement support for PTOP interrupt routing
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/mc/base.c b/drivers/gpu/drm/nouveau/nvkm/subdev/mc/base.c
index 134d44a..184325c 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/mc/base.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/mc/base.c
@@ -60,9 +60,18 @@
struct nvkm_device *device = mc->subdev.device;
struct nvkm_subdev *subdev;
const struct nvkm_mc_map *map = mc->func->intr;
- u32 stat, intr;
+ u32 stat, intr = nvkm_mc_intr_mask(mc);
+ u64 subdevs;
- stat = intr = nvkm_mc_intr_mask(mc);
+ stat = nvkm_top_intr(device->top, intr, &subdevs);
+ while (subdevs) {
+ enum nvkm_devidx subidx = __ffs64(subdevs);
+ subdev = nvkm_device_subdev(device, subidx);
+ if (subdev)
+ nvkm_subdev_intr(subdev);
+ subdevs &= ~BIT_ULL(subidx);
+ }
+
while (map->stat) {
if (intr & map->stat) {
subdev = nvkm_device_subdev(device, map->unit);