|
@@ -3765,7 +3765,6 @@ nouveau_bios_run_display_table(struct drm_device *dev, struct dcb_entry *dcbent,
|
|
|
*/
|
|
|
|
|
|
struct drm_nouveau_private *dev_priv = dev->dev_private;
|
|
|
- struct init_exec iexec = {true, false};
|
|
|
struct nvbios *bios = &dev_priv->VBIOS;
|
|
|
uint8_t *table = &bios->data[bios->display.script_table_ptr];
|
|
|
uint8_t *otable = NULL;
|
|
@@ -3845,8 +3844,6 @@ nouveau_bios_run_display_table(struct drm_device *dev, struct dcb_entry *dcbent,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- bios->display.output = dcbent;
|
|
|
-
|
|
|
if (pxclk == 0) {
|
|
|
script = ROM16(otable[6]);
|
|
|
if (!script) {
|
|
@@ -3855,7 +3852,7 @@ nouveau_bios_run_display_table(struct drm_device *dev, struct dcb_entry *dcbent,
|
|
|
}
|
|
|
|
|
|
NV_TRACE(dev, "0x%04X: parsing output script 0\n", script);
|
|
|
- parse_init_table(bios, script, &iexec);
|
|
|
+ nouveau_bios_run_init_table(dev, script, dcbent);
|
|
|
} else
|
|
|
if (pxclk == -1) {
|
|
|
script = ROM16(otable[8]);
|
|
@@ -3865,7 +3862,7 @@ nouveau_bios_run_display_table(struct drm_device *dev, struct dcb_entry *dcbent,
|
|
|
}
|
|
|
|
|
|
NV_TRACE(dev, "0x%04X: parsing output script 1\n", script);
|
|
|
- parse_init_table(bios, script, &iexec);
|
|
|
+ nouveau_bios_run_init_table(dev, script, dcbent);
|
|
|
} else
|
|
|
if (pxclk == -2) {
|
|
|
if (table[4] >= 12)
|
|
@@ -3878,7 +3875,7 @@ nouveau_bios_run_display_table(struct drm_device *dev, struct dcb_entry *dcbent,
|
|
|
}
|
|
|
|
|
|
NV_TRACE(dev, "0x%04X: parsing output script 2\n", script);
|
|
|
- parse_init_table(bios, script, &iexec);
|
|
|
+ nouveau_bios_run_init_table(dev, script, dcbent);
|
|
|
} else
|
|
|
if (pxclk > 0) {
|
|
|
script = ROM16(otable[table[4] + i*6 + 2]);
|
|
@@ -3890,7 +3887,7 @@ nouveau_bios_run_display_table(struct drm_device *dev, struct dcb_entry *dcbent,
|
|
|
}
|
|
|
|
|
|
NV_TRACE(dev, "0x%04X: parsing clock script 0\n", script);
|
|
|
- parse_init_table(bios, script, &iexec);
|
|
|
+ nouveau_bios_run_init_table(dev, script, dcbent);
|
|
|
} else
|
|
|
if (pxclk < 0) {
|
|
|
script = ROM16(otable[table[4] + i*6 + 4]);
|
|
@@ -3902,7 +3899,7 @@ nouveau_bios_run_display_table(struct drm_device *dev, struct dcb_entry *dcbent,
|
|
|
}
|
|
|
|
|
|
NV_TRACE(dev, "0x%04X: parsing clock script 1\n", script);
|
|
|
- parse_init_table(bios, script, &iexec);
|
|
|
+ nouveau_bios_run_init_table(dev, script, dcbent);
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
@@ -5864,10 +5861,13 @@ nouveau_bios_run_init_table(struct drm_device *dev, uint16_t table,
|
|
|
struct drm_nouveau_private *dev_priv = dev->dev_private;
|
|
|
struct nvbios *bios = &dev_priv->VBIOS;
|
|
|
struct init_exec iexec = { true, false };
|
|
|
+ unsigned long flags;
|
|
|
|
|
|
+ spin_lock_irqsave(&bios->lock, flags);
|
|
|
bios->display.output = dcbent;
|
|
|
parse_init_table(bios, table, &iexec);
|
|
|
bios->display.output = NULL;
|
|
|
+ spin_unlock_irqrestore(&bios->lock, flags);
|
|
|
}
|
|
|
|
|
|
static bool NVInitVBIOS(struct drm_device *dev)
|
|
@@ -5876,6 +5876,7 @@ static bool NVInitVBIOS(struct drm_device *dev)
|
|
|
struct nvbios *bios = &dev_priv->VBIOS;
|
|
|
|
|
|
memset(bios, 0, sizeof(struct nvbios));
|
|
|
+ spin_lock_init(&bios->lock);
|
|
|
bios->dev = dev;
|
|
|
|
|
|
if (!NVShadowVBIOS(dev, bios->data))
|