Index: /trunk/src/VBox/Devices/EFI/Firmware2/VBoxPkg/VBoxIdeBusDxe/Ide.c
===================================================================
--- /trunk/src/VBox/Devices/EFI/Firmware2/VBoxPkg/VBoxIdeBusDxe/Ide.c	(revision 33025)
+++ /trunk/src/VBox/Devices/EFI/Firmware2/VBoxPkg/VBoxIdeBusDxe/Ide.c	(revision 33026)
@@ -285,4 +285,6 @@
   EFI_STATUS  Status;
   PCI_TYPE00  PciData;
+  UINT8       PciClass;
+  UINT8       PciSubClass;
 
   Status = PciIo->Pci.Read (
@@ -297,8 +299,40 @@
     return Status;
   }
-
+  Status = PciIo->Pci.Read (
+                        PciIo,
+                        EfiPciIoWidthUint8,
+                        PCI_CLASSCODE_OFFSET + 2,
+                        1,
+                        &PciClass
+                        );
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+
+  Status = PciIo->Pci.Read (
+                        PciIo,
+                        EfiPciIoWidthUint8,
+                        PCI_CLASSCODE_OFFSET + 1,
+                        1,
+                        &PciSubClass
+                        );
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+  DEBUG((DEBUG_INFO, "class code: %x\n", PciData.Hdr.ClassCode[0] & IDE_PRIMARY_OPERATING_MODE));
   if ((PciData.Hdr.ClassCode[0] & IDE_PRIMARY_OPERATING_MODE) == 0) {
-    IdeRegsBaseAddr[IdePrimary].CommandBlockBaseAddr  = 0x1f0;
-    IdeRegsBaseAddr[IdePrimary].ControlBlockBaseAddr  = 0x3f6;
+    switch (PciSubClass)
+    {
+       case PCI_CLASS_MASS_STORAGE_IDE:
+          IdeRegsBaseAddr[IdePrimary].CommandBlockBaseAddr  = 0x1f0;
+          IdeRegsBaseAddr[IdePrimary].ControlBlockBaseAddr  = 0x3f6;
+          break;
+       case 0x6:
+          IdeRegsBaseAddr[IdePrimary].CommandBlockBaseAddr  = 0x1e8;
+          IdeRegsBaseAddr[IdePrimary].ControlBlockBaseAddr  = 0x3e6;
+          break;
+        default:
+	  ASSERT_EFI_ERROR((EFI_UNSUPPORTED)); 
+    }
     IdeRegsBaseAddr[IdePrimary].BusMasterBaseAddr     =
     (UINT16)((PciData.Device.Bar[4] & 0x0000fff0));
@@ -309,11 +343,23 @@
     if ((PciData.Device.Bar[0] & BIT0) == 0 ||
         (PciData.Device.Bar[1] & BIT0) == 0) {
+      DEBUG((DEBUG_INFO, "%a:%d\n", __FILE__, __LINE__));
       return EFI_UNSUPPORTED;
     }
 
-    IdeRegsBaseAddr[IdePrimary].CommandBlockBaseAddr  =
-    (UINT16) (PciData.Device.Bar[0] & 0x0000fff8);
-    IdeRegsBaseAddr[IdePrimary].ControlBlockBaseAddr  =
-    (UINT16) ((PciData.Device.Bar[1] & 0x0000fffc) + 2);
+    switch (PciSubClass)
+    {
+       case PCI_CLASS_MASS_STORAGE_IDE:
+          IdeRegsBaseAddr[IdePrimary].CommandBlockBaseAddr  =
+          (UINT16) (PciData.Device.Bar[0] & 0x0000fff8);
+          IdeRegsBaseAddr[IdePrimary].ControlBlockBaseAddr  =
+          (UINT16) ((PciData.Device.Bar[1] & 0x0000fffc) + 2);
+	  break;
+       case 0x6:
+          IdeRegsBaseAddr[IdePrimary].CommandBlockBaseAddr  = 0x1e8;
+          IdeRegsBaseAddr[IdePrimary].ControlBlockBaseAddr  = 0x3e6;
+          break;
+        default:
+	  ASSERT_EFI_ERROR((EFI_UNSUPPORTED)); 
+    }
     IdeRegsBaseAddr[IdePrimary].BusMasterBaseAddr     =
     (UINT16) ((PciData.Device.Bar[4] & 0x0000fff0));
@@ -321,6 +367,17 @@
 
   if ((PciData.Hdr.ClassCode[0] & IDE_SECONDARY_OPERATING_MODE) == 0) {
-    IdeRegsBaseAddr[IdeSecondary].CommandBlockBaseAddr  = 0x170;
-    IdeRegsBaseAddr[IdeSecondary].ControlBlockBaseAddr  = 0x376;
+    switch (PciSubClass)
+    {
+       case PCI_CLASS_MASS_STORAGE_IDE:
+          IdeRegsBaseAddr[IdeSecondary].CommandBlockBaseAddr  = 0x170;
+          IdeRegsBaseAddr[IdeSecondary].ControlBlockBaseAddr  = 0x376;
+	  break;
+       case 0x6:
+          IdeRegsBaseAddr[IdeSecondary].CommandBlockBaseAddr  = 0x168;
+          IdeRegsBaseAddr[IdeSecondary].ControlBlockBaseAddr  = 0x366;
+          break;
+        default:
+	  ASSERT_EFI_ERROR((EFI_UNSUPPORTED)); 
+    }
     IdeRegsBaseAddr[IdeSecondary].BusMasterBaseAddr     =
     (UINT16) ((PciData.Device.Bar[4] & 0x0000fff0));
@@ -331,4 +388,5 @@
     if ((PciData.Device.Bar[2] & BIT0) == 0 ||
         (PciData.Device.Bar[3] & BIT0) == 0) {
+      DEBUG((DEBUG_INFO, "%a:%d\n", __FILE__, __LINE__));
       return EFI_UNSUPPORTED;
     }
@@ -342,4 +400,16 @@
   }
 
+  DEBUG((DEBUG_INFO, "%a:%d CommandBlockBaseAddr:%x, "
+		     "ControlBlockBaseAddr:%x, "
+		     "BusMasterBaseAddr:%x\n", __FILE__, __LINE__,
+		     IdeRegsBaseAddr[IdePrimary].CommandBlockBaseAddr,
+		     IdeRegsBaseAddr[IdePrimary].ControlBlockBaseAddr,
+		     IdeRegsBaseAddr[IdePrimary].BusMasterBaseAddr));
+  DEBUG((DEBUG_INFO, "%a:%d CommandBlockBaseAddr:%x, "
+		     "ControlBlockBaseAddr:%x, "
+		     "BusMasterBaseAddr:%x\n", __FILE__, __LINE__,
+		     IdeRegsBaseAddr[IdeSecondary].CommandBlockBaseAddr,
+		     IdeRegsBaseAddr[IdeSecondary].ControlBlockBaseAddr,
+		     IdeRegsBaseAddr[IdeSecondary].BusMasterBaseAddr));
   return EFI_SUCCESS;
 }
Index: /trunk/src/VBox/Devices/EFI/Firmware2/VBoxPkg/VBoxIdeBusDxe/VBoxIdeBusDxe.inf
===================================================================
--- /trunk/src/VBox/Devices/EFI/Firmware2/VBoxPkg/VBoxIdeBusDxe/VBoxIdeBusDxe.inf	(revision 33025)
+++ /trunk/src/VBox/Devices/EFI/Firmware2/VBoxPkg/VBoxIdeBusDxe/VBoxIdeBusDxe.inf	(revision 33026)
@@ -19,5 +19,5 @@
   INF_VERSION                    = 0x00010005
   BASE_NAME                      = IdeBusDxe
-  FILE_GUID                      = 69FD8E47-A161-4550-B01A-5594CEB2B2B2
+  FILE_GUID                      = 2f709c46-d2e7-11df-ad38-080027a4ca0d
   MODULE_TYPE                    = UEFI_DRIVER
   VERSION_STRING                 = 1.0
@@ -53,4 +53,5 @@
 [Packages]
   MdePkg/MdePkg.dec
+  VBoxPkg/VBoxPkg.dec
   IntelFrameworkPkg/IntelFrameworkPkg.dec
   IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec  
