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

Commit 6dcee40a authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nouveau/mc: have single entry and exit points to the interrupt handler



Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent cfc2f263
Loading
Loading
Loading
Loading
+19 −18
Original line number Diff line number Diff line
@@ -31,29 +31,30 @@ nouveau_mc_intr(int irq, void *arg)
	struct nouveau_mc *pmc = arg;
	const struct nouveau_mc_intr *map = pmc->intr_map;
	struct nouveau_subdev *unit;
	u32 stat, intr;
	u32 intr, stat;

	intr = stat = nv_rd32(pmc, 0x000100);
	if (intr == 0xffffffff)
		return IRQ_NONE;
	while (stat && map->stat) {
		if (stat & map->stat) {
	intr = nv_rd32(pmc, 0x000100);
	if (intr == 0xffffffff) /* likely fallen off the bus */
		intr = 0x00000000;

	if ((stat = intr) != 0) {
		while (map->stat) {
			if (intr & map->stat) {
				unit = nouveau_subdev(pmc, map->unit);
				if (unit && unit->intr)
					unit->intr(unit);
			intr &= ~map->stat;
				stat &= ~map->stat;
			}
			map++;
		}

		if (pmc->use_msi)
			nv_wr08(pmc, 0x088068, 0xff);

	if (intr) {
		if (stat)
			nv_error(pmc, "unknown intr 0x%08x\n", stat);
	}

	return stat ? IRQ_HANDLED : IRQ_NONE;
	return intr ? IRQ_HANDLED : IRQ_NONE;
}

int