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

Commit d4c4cc83 authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nouveau/mc: abstract interface to master intr registers



Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 0a34fb31
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -10,6 +10,9 @@ struct nvkm_mc {
	bool use_msi;
};

void nvkm_mc_intr_unarm(struct nvkm_mc *);
void nvkm_mc_intr_rearm(struct nvkm_mc *);
u32 nvkm_mc_intr_mask(struct nvkm_mc *);
void nvkm_mc_unk260(struct nvkm_mc *, u32 data);

int nv04_mc_new(struct nvkm_device *, int, struct nvkm_mc **);
+21 −11
Original line number Diff line number Diff line
@@ -32,13 +32,24 @@ nvkm_mc_unk260(struct nvkm_mc *mc, u32 data)
		mc->func->unk260(mc, data);
}

static inline u32
void
nvkm_mc_intr_unarm(struct nvkm_mc *mc)
{
	return mc->func->intr_unarm(mc);
}

void
nvkm_mc_intr_rearm(struct nvkm_mc *mc)
{
	return mc->func->intr_rearm(mc);
}

u32
nvkm_mc_intr_mask(struct nvkm_mc *mc)
{
	struct nvkm_device *device = mc->subdev.device;
	u32 intr = nvkm_rd32(device, 0x000100);
	if (intr == 0xffffffff) /* likely fallen off the bus */
		intr = 0x00000000;
	u32 intr = mc->func->intr_mask(mc);
	if (WARN_ON_ONCE(intr == 0xffffffff))
		intr = 0; /* likely fallen off the bus */
	return intr;
}

@@ -52,8 +63,7 @@ nvkm_mc_intr(int irq, void *arg)
	struct nvkm_subdev *unit;
	u32 intr;

	nvkm_wr32(device, 0x000140, 0x00000000);
	nvkm_rd32(device, 0x000140);
	nvkm_mc_intr_unarm(mc);
	intr = nvkm_mc_intr_mask(mc);
	if (mc->use_msi)
		mc->func->msi_rearm(mc);
@@ -74,14 +84,15 @@ nvkm_mc_intr(int irq, void *arg)
			nvkm_error(subdev, "unknown intr %08x\n", stat);
	}

	nvkm_wr32(device, 0x000140, 0x00000001);
	nvkm_mc_intr_rearm(mc);
	return intr ? IRQ_HANDLED : IRQ_NONE;
}

static int
nvkm_mc_fini(struct nvkm_subdev *subdev, bool suspend)
{
	nvkm_wr32(subdev->device, 0x000140, 0x00000000);
	struct nvkm_mc *mc = nvkm_mc(subdev);
	nvkm_mc_intr_unarm(mc);
	return 0;
}

@@ -96,10 +107,9 @@ static int
nvkm_mc_init(struct nvkm_subdev *subdev)
{
	struct nvkm_mc *mc = nvkm_mc(subdev);
	struct nvkm_device *device = mc->subdev.device;
	if (mc->func->init)
		mc->func->init(mc);
	nvkm_wr32(device, 0x000140, 0x00000001);
	nvkm_mc_intr_rearm(mc);
	return 0;
}

+3 −0
Original line number Diff line number Diff line
@@ -27,6 +27,9 @@ static const struct nvkm_mc_func
g94_mc = {
	.init = nv50_mc_init,
	.intr = nv50_mc_intr,
	.intr_unarm = nv04_mc_intr_unarm,
	.intr_rearm = nv04_mc_intr_rearm,
	.intr_mask = nv04_mc_intr_mask,
	.msi_rearm = nv40_mc_msi_rearm,
};

+3 −0
Original line number Diff line number Diff line
@@ -48,6 +48,9 @@ static const struct nvkm_mc_func
g98_mc = {
	.init = nv50_mc_init,
	.intr = g98_mc_intr,
	.intr_unarm = nv04_mc_intr_unarm,
	.intr_rearm = nv04_mc_intr_rearm,
	.intr_mask = nv04_mc_intr_mask,
	.msi_rearm = nv40_mc_msi_rearm,
};

+3 −0
Original line number Diff line number Diff line
@@ -64,6 +64,9 @@ static const struct nvkm_mc_func
gf100_mc = {
	.init = nv50_mc_init,
	.intr = gf100_mc_intr,
	.intr_unarm = nv04_mc_intr_unarm,
	.intr_rearm = nv04_mc_intr_rearm,
	.intr_mask = nv04_mc_intr_mask,
	.msi_rearm = gf100_mc_msi_rearm,
	.unk260 = gf100_mc_unk260,
};
Loading