#define AST_IO_AR_PORT_WRITE           (0x40)
 #define AST_IO_MISC_PORT_WRITE         (0x42)
+#define AST_IO_VGA_ENABLE_PORT         (0x43)
 #define AST_IO_SEQ_PORT                        (0x44)
-#define AST_DAC_INDEX_READ             (0x3c7)
+#define AST_IO_DAC_INDEX_READ          (0x47)
 #define AST_IO_DAC_INDEX_WRITE         (0x48)
 #define AST_IO_DAC_DATA                        (0x49)
 #define AST_IO_GR_PORT                 (0x4E)
 #define AST_IO_INPUT_STATUS1_READ      (0x5A)
 #define AST_IO_MISC_PORT_READ          (0x4C)
 
+#define AST_IO_MM_OFFSET               (0x380)
+
 #define __ast_read(x) \
 static inline u##x ast_read##x(struct ast_private *ast, u32 reg) { \
 u##x val = 0;\
 
                ret = -EIO;
                goto out_free;
        }
-       ast->ioregs = pci_iomap(dev->pdev, 2, 0);
+
+       /*
+        * If we don't have IO space at all, use MMIO now and
+        * assume the chip has MMIO enabled by default (rev 0x20
+        * and higher).
+        */
+       if (!(pci_resource_flags(dev->pdev, 2) & IORESOURCE_IO)) {
+               DRM_INFO("platform has no IO space, trying MMIO\n");
+               ast->ioregs = ast->regs + AST_IO_MM_OFFSET;
+       }
+
+       /* "map" IO regs if the above hasn't done so already */
        if (!ast->ioregs) {
-               ret = -EIO;
-               goto out_free;
+               ast->ioregs = pci_iomap(dev->pdev, 2, 0);
+               if (!ast->ioregs) {
+                       ret = -EIO;
+                       goto out_free;
+               }
        }
 
        ast_detect_chip(dev);