diff options
author | Owain Ainsworth <oga@cvs.openbsd.org> | 2008-11-23 20:46:49 +0000 |
---|---|---|
committer | Owain Ainsworth <oga@cvs.openbsd.org> | 2008-11-23 20:46:49 +0000 |
commit | 17ac785bb3a684774ebdad9381363f2883fec44a (patch) | |
tree | 9e83e26cc13cf40543586011dc619d4106e18c9a | |
parent | 00a60f9fe7c7c1784b2561115217114954996d0e (diff) |
Move vblank data allocation to happening at attach, not at irq enable.
just put a vblank_pipes argument to the driver structure which tells us
how many to set up
this means that intel doesn't lose all vblank count on vtswitch (it
disables the interrupt there), i've heard of a few uvm_faults where this
happens as well as things just going wrong.
This was suggested by Keith Packard who provided a different diff for
drm.git.
-rw-r--r-- | sys/dev/pci/drm/drmP.h | 1 | ||||
-rw-r--r-- | sys/dev/pci/drm/drm_drv.c | 11 | ||||
-rw-r--r-- | sys/dev/pci/drm/drm_irq.c | 4 | ||||
-rw-r--r-- | sys/dev/pci/drm/i915_drv.c | 1 | ||||
-rw-r--r-- | sys/dev/pci/drm/i915_irq.c | 5 | ||||
-rw-r--r-- | sys/dev/pci/drm/mach64_drv.c | 3 | ||||
-rw-r--r-- | sys/dev/pci/drm/mach64_drv.h | 1 | ||||
-rw-r--r-- | sys/dev/pci/drm/mach64_irq.c | 5 | ||||
-rw-r--r-- | sys/dev/pci/drm/mga_drv.c | 1 | ||||
-rw-r--r-- | sys/dev/pci/drm/mga_irq.c | 5 | ||||
-rw-r--r-- | sys/dev/pci/drm/r128_drv.c | 2 | ||||
-rw-r--r-- | sys/dev/pci/drm/r128_drv.h | 1 | ||||
-rw-r--r-- | sys/dev/pci/drm/r128_irq.c | 5 | ||||
-rw-r--r-- | sys/dev/pci/drm/radeon_drv.c | 1 | ||||
-rw-r--r-- | sys/dev/pci/drm/radeon_irq.c | 5 |
15 files changed, 18 insertions, 33 deletions
diff --git a/sys/dev/pci/drm/drmP.h b/sys/dev/pci/drm/drmP.h index bb7237561ae..603b59e6965 100644 --- a/sys/dev/pci/drm/drmP.h +++ b/sys/dev/pci/drm/drmP.h @@ -453,6 +453,7 @@ struct drm_driver_info { int (*irq_postinstall)(struct drm_device *); void (*irq_uninstall)(struct drm_device *); irqreturn_t (*irq_handler)(DRM_IRQ_ARGS); + int vblank_pipes; u_int32_t (*get_vblank_counter)(struct drm_device *, int); int (*enable_vblank)(struct drm_device *, int); void (*disable_vblank)(struct drm_device *, int); diff --git a/sys/dev/pci/drm/drm_drv.c b/sys/dev/pci/drm/drm_drv.c index 3c798cefa30..da2a780f033 100644 --- a/sys/dev/pci/drm/drm_drv.c +++ b/sys/dev/pci/drm/drm_drv.c @@ -125,6 +125,12 @@ drm_attach(struct device *parent, struct device *self, void *aux) drm_mem_init(); TAILQ_INIT(&dev->files); + if (dev->driver->vblank_pipes != 0 && drm_vblank_init(dev, + dev->driver->vblank_pipes)) { + printf(": failed to allocate vblank data\n"); + goto error; + } + /* * the dma buffers api is just weird. offset 1Gb to ensure we don't * conflict with it. @@ -167,10 +173,14 @@ drm_detach(struct device *self, int flags) { struct drm_device *dev = (struct drm_device *)self; + drm_lastclose(dev); + drm_ctxbitmap_cleanup(dev); extent_destroy(dev->handle_ext); + drm_vblank_cleanup(dev); + if (dev->agp && dev->agp->mtrr) { int retcode; @@ -179,7 +189,6 @@ drm_detach(struct device *self, int flags) DRM_DEBUG("mtrr_del = %d", retcode); } - drm_lastclose(dev); if (dev->agp != NULL) { drm_free(dev->agp, sizeof(*dev->agp), DRM_MEM_AGPLISTS); diff --git a/sys/dev/pci/drm/drm_irq.c b/sys/dev/pci/drm/drm_irq.c index bb03f79a2b3..ede6c66baf4 100644 --- a/sys/dev/pci/drm/drm_irq.c +++ b/sys/dev/pci/drm/drm_irq.c @@ -111,7 +111,8 @@ drm_irq_install(struct drm_device *dev) DRM_DEBUG("%s: interrupting at %s\n", dev->device.dv_xname, istr); /* After installing handler */ - dev->driver->irq_postinstall(dev); + if (dev->driver->irq_postinstall != NULL) + dev->driver->irq_postinstall(dev); return 0; err: @@ -141,7 +142,6 @@ drm_irq_uninstall(struct drm_device *dev) pci_intr_disestablish(dev->pa.pa_pc, dev->irqh); - drm_vblank_cleanup(dev); DRM_SPINUNINIT(&dev->irq_lock); return 0; diff --git a/sys/dev/pci/drm/i915_drv.c b/sys/dev/pci/drm/i915_drv.c index 2e128acff15..6425c36f823 100644 --- a/sys/dev/pci/drm/i915_drv.c +++ b/sys/dev/pci/drm/i915_drv.c @@ -95,6 +95,7 @@ static const struct drm_driver_info inteldrm_driver = { .preclose = i915_driver_preclose, .lastclose = i915_driver_lastclose, .device_is_agp = i915_driver_device_is_agp, + .vblank_pipes = 2, .get_vblank_counter = i915_get_vblank_counter, .enable_vblank = i915_enable_vblank, .disable_vblank = i915_disable_vblank, diff --git a/sys/dev/pci/drm/i915_irq.c b/sys/dev/pci/drm/i915_irq.c index 1d6777507ba..567ee14b093 100644 --- a/sys/dev/pci/drm/i915_irq.c +++ b/sys/dev/pci/drm/i915_irq.c @@ -415,11 +415,6 @@ void i915_driver_irq_preinstall(struct drm_device * dev) int i915_driver_irq_postinstall(struct drm_device * dev) { drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; - int ret, num_pipes = 2; - - ret = drm_vblank_init(dev, num_pipes); - if (ret) - return ret; dev->max_vblank_count = 0xffffff; /* only 24 bits of frame count */ diff --git a/sys/dev/pci/drm/mach64_drv.c b/sys/dev/pci/drm/mach64_drv.c index c61231a9afb..9e7446c9ba5 100644 --- a/sys/dev/pci/drm/mach64_drv.c +++ b/sys/dev/pci/drm/mach64_drv.c @@ -71,11 +71,11 @@ static const struct drm_driver_info machdrm_driver = { .buf_priv_size = 1, /* No dev_priv */ .ioctl = machdrm_ioctl, .lastclose = mach64_driver_lastclose, + .vblank_pipes = 1, .get_vblank_counter = mach64_get_vblank_counter, .enable_vblank = mach64_enable_vblank, .disable_vblank = mach64_disable_vblank, .irq_preinstall = mach64_driver_irq_preinstall, - .irq_postinstall = mach64_driver_irq_postinstall, .irq_uninstall = mach64_driver_irq_uninstall, .irq_handler = mach64_driver_irq_handler, .dma_ioctl = mach64_dma_buffers, @@ -90,7 +90,6 @@ static const struct drm_driver_info machdrm_driver = { .flags = DRIVER_AGP | DRIVER_MTRR | DRIVER_PCI_DMA | DRIVER_DMA | DRIVER_SG | DRIVER_IRQ, }; - int machdrm_probe(struct device *parent, void *match, void *aux) { diff --git a/sys/dev/pci/drm/mach64_drv.h b/sys/dev/pci/drm/mach64_drv.h index fb1c4567bb4..7d95fbc0b55 100644 --- a/sys/dev/pci/drm/mach64_drv.h +++ b/sys/dev/pci/drm/mach64_drv.h @@ -168,7 +168,6 @@ extern int mach64_enable_vblank(struct drm_device *dev, int crtc); extern void mach64_disable_vblank(struct drm_device *dev, int crtc); extern irqreturn_t mach64_driver_irq_handler(DRM_IRQ_ARGS); extern void mach64_driver_irq_preinstall(struct drm_device *dev); -extern int mach64_driver_irq_postinstall(struct drm_device *dev); extern void mach64_driver_irq_uninstall(struct drm_device *dev); /* ================================================================ diff --git a/sys/dev/pci/drm/mach64_irq.c b/sys/dev/pci/drm/mach64_irq.c index 0b350b2ffe2..55c2cb14c57 100644 --- a/sys/dev/pci/drm/mach64_irq.c +++ b/sys/dev/pci/drm/mach64_irq.c @@ -141,11 +141,6 @@ void mach64_driver_irq_preinstall(struct drm_device * dev) mach64_disable_vblank_local(dev, 0); } -int mach64_driver_irq_postinstall(struct drm_device * dev) -{ - return drm_vblank_init(dev, 1); -} - void mach64_driver_irq_uninstall(struct drm_device * dev) { drm_mach64_private_t *dev_priv = dev->dev_private; diff --git a/sys/dev/pci/drm/mga_drv.c b/sys/dev/pci/drm/mga_drv.c index dad674091fd..776a0d5e7ba 100644 --- a/sys/dev/pci/drm/mga_drv.c +++ b/sys/dev/pci/drm/mga_drv.c @@ -106,6 +106,7 @@ static const struct drm_driver_info mga_driver = { .buf_priv_size = sizeof(drm_mga_buf_priv_t), .ioctl = mgadrm_ioctl, .lastclose = mga_driver_lastclose, + .vblank_pipes = 1, .enable_vblank = mga_enable_vblank, .disable_vblank = mga_disable_vblank, .get_vblank_counter = mga_get_vblank_counter, diff --git a/sys/dev/pci/drm/mga_irq.c b/sys/dev/pci/drm/mga_irq.c index 4783e65eb29..a4ed2b18546 100644 --- a/sys/dev/pci/drm/mga_irq.c +++ b/sys/dev/pci/drm/mga_irq.c @@ -154,11 +154,6 @@ void mga_driver_irq_preinstall(struct drm_device * dev) int mga_driver_irq_postinstall(struct drm_device * dev) { drm_mga_private_t *dev_priv = (drm_mga_private_t *) dev->dev_private; - int ret; - - ret = drm_vblank_init(dev, 1); - if (ret) - return ret; /* Turn on soft trap interrupt. Vertical blank interrupts are enabled * in mga_enable_vblank. diff --git a/sys/dev/pci/drm/r128_drv.c b/sys/dev/pci/drm/r128_drv.c index e04c7fee4a3..d864567a97e 100644 --- a/sys/dev/pci/drm/r128_drv.c +++ b/sys/dev/pci/drm/r128_drv.c @@ -87,11 +87,11 @@ static const struct drm_driver_info ragedrm_driver = { .ioctl = ragedrm_ioctl, .preclose = r128_driver_preclose, .lastclose = r128_driver_lastclose, + .vblank_pipes = 1, .get_vblank_counter = r128_get_vblank_counter, .enable_vblank = r128_enable_vblank, .disable_vblank = r128_disable_vblank, .irq_preinstall = r128_driver_irq_preinstall, - .irq_postinstall = r128_driver_irq_postinstall, .irq_uninstall = r128_driver_irq_uninstall, .irq_handler = r128_driver_irq_handler, .dma_ioctl = r128_cce_buffers, diff --git a/sys/dev/pci/drm/r128_drv.h b/sys/dev/pci/drm/r128_drv.h index 08df6195960..37d697e2930 100644 --- a/sys/dev/pci/drm/r128_drv.h +++ b/sys/dev/pci/drm/r128_drv.h @@ -166,7 +166,6 @@ extern void r128_disable_vblank(struct drm_device *dev, int crtc); extern u32 r128_get_vblank_counter(struct drm_device *dev, int crtc); extern irqreturn_t r128_driver_irq_handler(DRM_IRQ_ARGS); extern void r128_driver_irq_preinstall(struct drm_device * dev); -extern int r128_driver_irq_postinstall(struct drm_device * dev); extern void r128_driver_irq_uninstall(struct drm_device * dev); extern void r128_driver_lastclose(struct drm_device * dev); extern void r128_driver_preclose(struct drm_device * dev, diff --git a/sys/dev/pci/drm/r128_irq.c b/sys/dev/pci/drm/r128_irq.c index 5b95bd898f9..50f1f08920d 100644 --- a/sys/dev/pci/drm/r128_irq.c +++ b/sys/dev/pci/drm/r128_irq.c @@ -100,11 +100,6 @@ void r128_driver_irq_preinstall(struct drm_device * dev) R128_WRITE(R128_GEN_INT_STATUS, R128_CRTC_VBLANK_INT_AK); } -int r128_driver_irq_postinstall(struct drm_device * dev) -{ - return drm_vblank_init(dev, 1); -} - void r128_driver_irq_uninstall(struct drm_device * dev) { drm_r128_private_t *dev_priv = (drm_r128_private_t *) dev->dev_private; diff --git a/sys/dev/pci/drm/radeon_drv.c b/sys/dev/pci/drm/radeon_drv.c index e8407f94f93..337101a30a4 100644 --- a/sys/dev/pci/drm/radeon_drv.c +++ b/sys/dev/pci/drm/radeon_drv.c @@ -484,6 +484,7 @@ static const struct drm_driver_info radeondrm_driver = { .preclose = radeon_driver_preclose, .postclose = radeon_driver_postclose, .lastclose = radeon_driver_lastclose, + .vblank_pipes = 2, .get_vblank_counter = radeon_get_vblank_counter, .enable_vblank = radeon_enable_vblank, .disable_vblank = radeon_disable_vblank, diff --git a/sys/dev/pci/drm/radeon_irq.c b/sys/dev/pci/drm/radeon_irq.c index 956d4a37438..f0255e28017 100644 --- a/sys/dev/pci/drm/radeon_irq.c +++ b/sys/dev/pci/drm/radeon_irq.c @@ -339,14 +339,9 @@ int radeon_driver_irq_postinstall(struct drm_device * dev) { drm_radeon_private_t *dev_priv = (drm_radeon_private_t *) dev->dev_private; - int ret; atomic_set(&dev_priv->swi_emitted, 0); - ret = drm_vblank_init(dev, 2); - if (ret) - return ret; - dev->max_vblank_count = 0x001fffff; radeon_irq_set_state(dev, RADEON_SW_INT_ENABLE, 1); |