drm/nv40/pm: execute memory reset script from vbios
authorBen Skeggs <bskeggs@redhat.com>
Fri, 12 Aug 2011 00:05:43 +0000 (10:05 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Tue, 20 Sep 2011 06:11:51 +0000 (16:11 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nouveau_bios.c
drivers/gpu/drm/nouveau/nouveau_drv.h
drivers/gpu/drm/nouveau/nv40_pm.c

index 58b2535e3b6bfac639b34b93bc4bbcc7735381d2..032a820981363c3d4422fba06ab93d7c8c0f1621 100644 (file)
@@ -6776,6 +6776,16 @@ nouveau_bios_run_init_table(struct drm_device *dev, uint16_t table,
        spin_unlock_bh(&bios->lock);
 }
 
+void
+nouveau_bios_init_exec(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 };
+
+       parse_init_table(bios, table, &iexec);
+}
+
 static bool NVInitVBIOS(struct drm_device *dev)
 {
        struct drm_nouveau_private *dev_priv = dev->dev_private;
index ecaa4ffbeab9906b3c816d212cedeec5f6facc03..29837da1098b3a85a50bbc9ee4ccc2b0a4901dab 100644 (file)
@@ -1071,6 +1071,7 @@ extern void nouveau_bios_takedown(struct drm_device *dev);
 extern int nouveau_run_vbios_init(struct drm_device *);
 extern void nouveau_bios_run_init_table(struct drm_device *, uint16_t table,
                                        struct dcb_entry *, int crtc);
+extern void nouveau_bios_init_exec(struct drm_device *, uint16_t table);
 extern struct dcb_gpio_entry *nouveau_bios_gpio_entry(struct drm_device *,
                                                      enum dcb_gpio_tag);
 extern struct dcb_connector_table_entry *
index 491688676df4799ba80da619a46fd81ec91970dd..bbc0b9c7e1f7f53ba099c57a8c408024feb32fca 100644 (file)
@@ -221,6 +221,7 @@ nv40_pm_clocks_set(struct drm_device *dev, void *pre_state)
        struct drm_nouveau_private *dev_priv = dev->dev_private;
        struct nv40_pm_state *info = pre_state;
        unsigned long flags;
+       struct bit_entry M;
        u32 crtc_mask = 0;
        u8 sr1[2];
        int i;
@@ -310,6 +311,10 @@ nv40_pm_clocks_set(struct drm_device *dev, void *pre_state)
        nv_mask(dev, 0x100210, 0x80000000, 0x80000000);
        udelay(100);
 
+       /* execute memory reset script from vbios */
+       if (!bit_table(dev, 'M', &M))
+               nouveau_bios_init_exec(dev, ROM16(M.data[0]));
+
        /* make sure we're in vblank (hopefully the same one as before), and
         * then re-enable crtc memory access
         */