mirror of https://gitee.com/openkylin/linux.git
drm/nouveau: make vbios parser runnable from an atomic context
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>
This commit is contained in:
parent
8348f36d89
commit
c7ca4d1b6b
|
@ -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))
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue