]> git.neil.brown.name Git - history.git/commitdiff
Merge with DRI CVS tree
authorLinus Torvalds <torvalds@home.transmeta.com>
Sat, 12 Oct 2002 02:59:02 +0000 (19:59 -0700)
committerLinus Torvalds <torvalds@home.transmeta.com>
Sat, 12 Oct 2002 02:59:02 +0000 (19:59 -0700)
drivers/char/drm/drm_ioctl.h
drivers/char/drm/drm_os_linux.h
drivers/char/drm/mga_dma.c

index 0d8a1259a6c5a7af69ac693d5c6468340bdb0d9e..01604e75086c6414e08690f920c400f114e19e05 100644 (file)
@@ -32,6 +32,7 @@
 #define __NO_VERSION__
 #include "drmP.h"
 
+
 int DRM(irq_busid)(struct inode *inode, struct file *filp,
                   unsigned int cmd, unsigned long arg)
 {
@@ -41,8 +42,20 @@ int DRM(irq_busid)(struct inode *inode, struct file *filp,
        if (copy_from_user(&p, (drm_irq_busid_t *)arg, sizeof(p)))
                return -EFAULT;
        dev = pci_find_slot(p.busnum, PCI_DEVFN(p.devnum, p.funcnum));
-       if (dev) p.irq = dev->irq;
-       else     p.irq = 0;
+       if (!dev) {
+               DRM_ERROR("pci_find_slot failed for %d:%d:%d\n",
+                         p.busnum, p.devnum, p.funcnum);
+               p.irq = 0;
+               goto out;
+       }                       
+       if (pci_enable_device(dev) != 0) {
+               DRM_ERROR("pci_enable_device failed for %d:%d:%d\n",
+                         p.busnum, p.devnum, p.funcnum);
+               p.irq = 0;
+               goto out;
+       }               
+       p.irq = dev->irq;
+ out:
        DRM_DEBUG("%d:%d:%d => IRQ %d\n",
                  p.busnum, p.devnum, p.funcnum, p.irq);
        if (copy_to_user((drm_irq_busid_t *)arg, &p, sizeof(p)))
index cf0031378b45b3396bb57a9892e442743691c366..e9b243562cc456a937bf0c3c36c779a24901cfa1 100644 (file)
@@ -74,7 +74,7 @@ do {                                                  \
                        ret = -EBUSY;                   \
                        break;                          \
                }                                       \
-               schedule_timeout(max(HZ/100,1));        \
+               schedule_timeout((HZ/100 > 1) ? HZ/100 : 1);    \
                if (signal_pending(current)) {          \
                        ret = -EINTR;                   \
                        break;                          \
index a0ad70e9dc4065272f51000e192dbbaa6b77969c..3c84de63a7f9c6a774d671787d37c15851d1cf6f 100644 (file)
@@ -157,9 +157,18 @@ void mga_do_dma_flush( drm_mga_private_t *dev_priv )
 {
        drm_mga_primary_buffer_t *primary = &dev_priv->prim;
        u32 head, tail;
-       DMA_LOCALS;
+       u32 status = 0;
+       int i;
+       DMA_LOCALS;
        DRM_DEBUG( "\n" );
 
+        /* We need to wait so that we can do an safe flush */
+       for ( i = 0 ; i < dev_priv->usec_timeout ; i++ ) {
+               status = MGA_READ( MGA_STATUS ) & MGA_ENGINE_IDLE_MASK;
+               if ( status == MGA_ENDPRDMASTS ) break;
+               udelay( 1 );
+       }
+
        if ( primary->tail == primary->last_flush ) {
                DRM_DEBUG( "   bailing out...\n" );
                return;