{
        u8 gdrst;
        pci_read_config_byte(dev->pdev, I965_GDRST, &gdrst);
-       return (gdrst & GRDOM_RESET_ENABLE) == 0;
+       return (gdrst & GRDOM_RESET_STATUS) == 0;
 }
 
 static int i965_do_reset(struct drm_device *dev)
 {
-       int ret;
-
-       /* FIXME: i965g/gm need a display save/restore for gpu reset. */
-       return -ENODEV;
-
-       /*
-        * Set the domains we want to reset (GRDOM/bits 2 and 3) as
-        * well as the reset bit (GR/bit 0).  Setting the GR bit
-        * triggers the reset; when done, the hardware will clear it.
-        */
-       pci_write_config_byte(dev->pdev, I965_GDRST,
-                             GRDOM_RENDER | GRDOM_RESET_ENABLE);
-       ret =  wait_for(i965_reset_complete(dev), 500);
-       if (ret)
-               return ret;
-
-       pci_write_config_byte(dev->pdev, I965_GDRST,
-                             GRDOM_MEDIA | GRDOM_RESET_ENABLE);
-
-       ret =  wait_for(i965_reset_complete(dev), 500);
-       if (ret)
-               return ret;
-
+       /* assert reset for at least 20 usec */
+       pci_write_config_byte(dev->pdev, I965_GDRST, GRDOM_RESET_ENABLE);
+       udelay(20);
        pci_write_config_byte(dev->pdev, I965_GDRST, 0);
 
-       return 0;
+       return wait_for(i965_reset_complete(dev), 500);
+}
+
+static int g4x_reset_complete(struct drm_device *dev)
+{
+       u8 gdrst;
+       pci_read_config_byte(dev->pdev, I965_GDRST, &gdrst);
+       return (gdrst & GRDOM_RESET_ENABLE) == 0;
 }
 
 static int g4x_do_reset(struct drm_device *dev)
 
        pci_write_config_byte(dev->pdev, I965_GDRST,
                              GRDOM_RENDER | GRDOM_RESET_ENABLE);
-       ret =  wait_for(i965_reset_complete(dev), 500);
+       ret =  wait_for(g4x_reset_complete(dev), 500);
        if (ret)
                return ret;
 
 
        pci_write_config_byte(dev->pdev, I965_GDRST,
                              GRDOM_MEDIA | GRDOM_RESET_ENABLE);
-       ret =  wait_for(i965_reset_complete(dev), 500);
+       ret =  wait_for(g4x_reset_complete(dev), 500);
        if (ret)
                return ret;