Commit f20ce962 authored by Ben Skeggs's avatar Ben Skeggs

drm/nvd0/disp: do modeset irq handling from tasklet

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 3b6d83d1
...@@ -44,9 +44,12 @@ struct nvd0_display { ...@@ -44,9 +44,12 @@ struct nvd0_display {
dma_addr_t handle; dma_addr_t handle;
u32 *ptr; u32 *ptr;
} evo[1]; } evo[1];
struct tasklet_struct tasklet;
struct { struct {
struct dcb_entry *dis; struct dcb_entry *dis;
struct dcb_entry *ena; struct dcb_entry *ena;
u32 modeset;
int crtc; int crtc;
int pclk; int pclk;
u16 cfg; u16 cfg;
...@@ -1114,9 +1117,24 @@ nvd0_display_unk4_handler(struct drm_device *dev) ...@@ -1114,9 +1117,24 @@ nvd0_display_unk4_handler(struct drm_device *dev)
nv_wr32(dev, 0x6101d0, 0x80000000); nv_wr32(dev, 0x6101d0, 0x80000000);
} }
static void
nvd0_display_bh(unsigned long data)
{
struct drm_device *dev = (struct drm_device *)data;
struct nvd0_display *disp = nvd0_display(dev);
if (disp->irq.modeset & 0x00000001)
nvd0_display_unk1_handler(dev);
if (disp->irq.modeset & 0x00000002)
nvd0_display_unk2_handler(dev);
if (disp->irq.modeset & 0x00000004)
nvd0_display_unk4_handler(dev);
}
static void static void
nvd0_display_intr(struct drm_device *dev) nvd0_display_intr(struct drm_device *dev)
{ {
struct nvd0_display *disp = nvd0_display(dev);
u32 intr = nv_rd32(dev, 0x610088); u32 intr = nv_rd32(dev, 0x610088);
if (intr & 0x00000002) { if (intr & 0x00000002) {
...@@ -1141,14 +1159,10 @@ nvd0_display_intr(struct drm_device *dev) ...@@ -1141,14 +1159,10 @@ nvd0_display_intr(struct drm_device *dev)
u32 stat = nv_rd32(dev, 0x6100ac); u32 stat = nv_rd32(dev, 0x6100ac);
if (stat & 0x00000007) { if (stat & 0x00000007) {
nv_wr32(dev, 0x6100ac, (stat & 0x00000007)); disp->irq.modeset = stat;
tasklet_schedule(&disp->tasklet);
if (stat & 0x00000001) nv_wr32(dev, 0x6100ac, (stat & 0x00000007));
nvd0_display_unk1_handler(dev);
if (stat & 0x00000002)
nvd0_display_unk2_handler(dev);
if (stat & 0x00000004)
nvd0_display_unk4_handler(dev);
stat &= ~0x00000007; stat &= ~0x00000007;
} }
...@@ -1371,6 +1385,7 @@ nvd0_display_create(struct drm_device *dev) ...@@ -1371,6 +1385,7 @@ nvd0_display_create(struct drm_device *dev)
} }
/* setup interrupt handling */ /* setup interrupt handling */
tasklet_init(&disp->tasklet, nvd0_display_bh, (unsigned long)dev);
nouveau_irq_register(dev, 26, nvd0_display_intr); nouveau_irq_register(dev, 26, nvd0_display_intr);
/* hash table and dma objects for the memory areas we care about */ /* hash table and dma objects for the memory areas we care about */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment