drm/nouveau: make vbios parser runnable from an atomic context
authorBen Skeggs <bskeggs@redhat.com>
Thu, 3 Feb 2011 10:10:49 +0000 (20:10 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Thu, 24 Feb 2011 20:44:56 +0000 (06:44 +1000)
The nv50 display isr bh needs to be converted to a tasklet, which means
we can't sleep anymore.  The places we execute vbios init tables are
rare, and not in any way performance critical, so this isn't a huge
problem.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nouveau_bios.c
drivers/gpu/drm/nouveau/nouveau_bios.h

index 6bdab891c64ecdee354ad5d10ea9890ec56b96d6..7b7a18493b465acbbeb1deb28870e9799200b0c2 100644 (file)
@@ -282,7 +282,7 @@ static void still_alive(void)
 {
 #if 0
        sync();
-       msleep(2);
+       mdelay(2);
 #endif
 }
 
@@ -1904,7 +1904,7 @@ init_condition_time(struct nvbios *bios, uint16_t offset,
                        BIOSLOG(bios, "0x%04X: "
                                "Condition not met, sleeping for 20ms\n",
                                                                offset);
-                       msleep(20);
+                       mdelay(20);
                }
        }
 
@@ -1938,7 +1938,7 @@ init_ltime(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
        BIOSLOG(bios, "0x%04X: Sleeping for 0x%04X milliseconds\n",
                offset, time);
 
-       msleep(time);
+       mdelay(time);
 
        return 3;
 }
@@ -2962,7 +2962,7 @@ init_time(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
        if (time < 1000)
                udelay(time);
        else
-               msleep((time + 900) / 1000);
+               mdelay((time + 900) / 1000);
 
        return 3;
 }
@@ -3856,7 +3856,7 @@ static int call_lvds_manufacturer_script(struct drm_device *dev, struct dcb_entr
 
        if (script == LVDS_PANEL_OFF) {
                /* off-on delay in ms */
-               msleep(ROM16(bios->data[bios->fp.xlated_entry + 7]));
+               mdelay(ROM16(bios->data[bios->fp.xlated_entry + 7]));
        }
 #ifdef __powerpc__
        /* Powerbook specific quirks */
@@ -6702,11 +6702,11 @@ nouveau_bios_run_init_table(struct drm_device *dev, uint16_t table,
        struct nvbios *bios = &dev_priv->vbios;
        struct init_exec iexec = { true, false };
 
-       mutex_lock(&bios->lock);
+       spin_lock_bh(&bios->lock);
        bios->display.output = dcbent;
        parse_init_table(bios, table, &iexec);
        bios->display.output = NULL;
-       mutex_unlock(&bios->lock);
+       spin_unlock_bh(&bios->lock);
 }
 
 static bool NVInitVBIOS(struct drm_device *dev)
@@ -6715,7 +6715,7 @@ static bool NVInitVBIOS(struct drm_device *dev)
        struct nvbios *bios = &dev_priv->vbios;
 
        memset(bios, 0, sizeof(struct nvbios));
-       mutex_init(&bios->lock);
+       spin_lock_init(&bios->lock);
        bios->dev = dev;
 
        if (!NVShadowVBIOS(dev, bios->data))
index 50a648e01c499a09287b8861865cf8f32d5e196f..8a54fa7edf5c18d692ecb2bfc94dfa1696800c43 100644 (file)
@@ -251,7 +251,7 @@ struct nvbios {
        uint8_t digital_min_front_porch;
        bool fp_no_ddc;
 
-       struct mutex lock;
+       spinlock_t lock;
 
        uint8_t data[NV_PROM_SIZE];
        unsigned int length;