diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2015-08-20 14:54:22 +1000 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2015-08-28 12:40:48 +1000 |
commit | d4c4cc8373806d0f822f8847f8bcda64f36cb73f (patch) | |
tree | 283b2cbc65a372d737ea0b2bc181e8d0a46cb2d1 /drivers/gpu/drm/nouveau/nvkm/subdev/mc/base.c | |
parent | 0a34fb3149c3001f9c1b2bd0f98f94d63e74cb85 (diff) | |
download | op-kernel-dev-d4c4cc8373806d0f822f8847f8bcda64f36cb73f.zip op-kernel-dev-d4c4cc8373806d0f822f8847f8bcda64f36cb73f.tar.gz |
drm/nouveau/mc: abstract interface to master intr registers
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/nouveau/nvkm/subdev/mc/base.c')
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/subdev/mc/base.c | 32 |
1 files changed, 21 insertions, 11 deletions
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/mc/base.c b/drivers/gpu/drm/nouveau/nvkm/subdev/mc/base.c index 8d0f5ac..6a8d56c 100644 --- a/drivers/gpu/drm/nouveau/nvkm/subdev/mc/base.c +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/mc/base.c @@ -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; } |