Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 66adbfb0 authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nouveau/mc: support for temporarily masking interrupts from a specific device



Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 6e09a578
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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 **);
+15 −0
Original line number Diff line number Diff line
@@ -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)
{
+2 −0
Original line number Diff line number Diff line
@@ -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;