drm/nouveau/mc: support for temporarily masking interrupts from a specific device
authorBen Skeggs <bskeggs@redhat.com>
Sun, 29 May 2016 22:39:27 +0000 (08:39 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Thu, 14 Jul 2016 01:53:25 +0000 (11:53 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/include/nvkm/subdev/mc.h
drivers/gpu/drm/nouveau/nvkm/subdev/mc/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/mc/priv.h

index c5f1235..81435d5 100644 (file)
@@ -13,6 +13,7 @@ void nvkm_mc_reset(struct nvkm_device *, enum nvkm_devidx);
 void nvkm_mc_intr(struct nvkm_device *, bool *handled);
 void nvkm_mc_intr_unarm(struct nvkm_device *);
 void nvkm_mc_intr_rearm(struct nvkm_device *);
+void nvkm_mc_intr_mask(struct nvkm_device *, enum nvkm_devidx, bool enable);
 void nvkm_mc_unk260(struct nvkm_device *, u32 data);
 
 int nv04_mc_new(struct nvkm_device *, int, struct nvkm_mc **);
index 6f10638..6b25e25 100644 (file)
@@ -34,6 +34,21 @@ nvkm_mc_unk260(struct nvkm_device *device, u32 data)
                mc->func->unk260(mc, data);
 }
 
+void
+nvkm_mc_intr_mask(struct nvkm_device *device, enum nvkm_devidx devidx, bool en)
+{
+       struct nvkm_mc *mc = device->mc;
+       const struct nvkm_mc_map *map;
+       if (likely(mc) && mc->func->intr_mask) {
+               u32 mask = nvkm_top_intr_mask(device, devidx);
+               for (map = mc->func->intr; !mask && map->stat; map++) {
+                       if (map->unit == devidx)
+                               mask = map->stat;
+               }
+               mc->func->intr_mask(mc, mask, en ? mask : 0);
+       }
+}
+
 void
 nvkm_mc_intr_unarm(struct nvkm_device *device)
 {
index 0229c7e..fb4ce6d 100644 (file)
@@ -21,6 +21,8 @@ struct nvkm_mc_func {
        void (*intr_unarm)(struct nvkm_mc *);
        /* enable reporting of interrupts to host */
        void (*intr_rearm)(struct nvkm_mc *);
+       /* (un)mask delivery of specific interrupts */
+       void (*intr_mask)(struct nvkm_mc *, u32 mask, u32 stat);
        /* retrieve pending interrupt mask (NV_PMC_INTR) */
        u32 (*intr_stat)(struct nvkm_mc *);
        const struct nvkm_mc_map *reset;