Index: /trunk/src/VBox/Main/include/BusAssignmentManager.h
===================================================================
--- /trunk/src/VBox/Main/include/BusAssignmentManager.h	(revision 87241)
+++ /trunk/src/VBox/Main/include/BusAssignmentManager.h	(revision 87242)
@@ -47,5 +47,5 @@
     };
 
-    static BusAssignmentManager *createInstance(ChipsetType_T chipsetType, bool fIommu);
+    static BusAssignmentManager *createInstance(ChipsetType_T chipsetType, IommuType_T iommuType);
     virtual void AddRef();
     virtual void Release();
Index: /trunk/src/VBox/Main/src-client/BusAssignmentManager.cpp
===================================================================
--- /trunk/src/VBox/Main/src-client/BusAssignmentManager.cpp	(revision 87241)
+++ /trunk/src/VBox/Main/src-client/BusAssignmentManager.cpp	(revision 87242)
@@ -310,5 +310,5 @@
     ChipsetType_T    mChipsetType;
     const char *     mpszBridgeName;
-    bool             mfIommu;
+    IommuType_T      mIommuType;
     PCIMap           mPCIMap;
     ReversePCIMap    mReversePCIMap;
@@ -320,5 +320,5 @@
     {}
 
-    HRESULT init(ChipsetType_T chipsetType, bool fIommu);
+    HRESULT init(ChipsetType_T chipsetType, IommuType_T iommuType);
 
     HRESULT record(const char *pszName, PCIBusAddress& GuestAddress, PCIBusAddress HostAddress);
@@ -332,8 +332,11 @@
 };
 
-HRESULT BusAssignmentManager::State::init(ChipsetType_T chipsetType, bool fIommu)
-{
+HRESULT BusAssignmentManager::State::init(ChipsetType_T chipsetType, IommuType_T iommuType)
+{
+    /* Currently we only support AMD IOMMU. */
+    Assert(iommuType == IommuType_None || iommuType == IommuType_AMD);
+
     mChipsetType = chipsetType;
-    mfIommu = fIommu;
+    mIommuType   = iommuType;
     switch (chipsetType)
     {
@@ -401,5 +404,5 @@
             aArrays[1] = g_aIch9Rules;
 #ifdef VBOX_WITH_IOMMU_AMD
-            if (mfIommu)
+            if (mIommuType == IommuType_AMD)
                 aArrays[2] = g_aIch9IommuLsiRules;
             else
@@ -510,8 +513,8 @@
 }
 
-BusAssignmentManager *BusAssignmentManager::createInstance(ChipsetType_T chipsetType, bool fIommu)
+BusAssignmentManager *BusAssignmentManager::createInstance(ChipsetType_T chipsetType, IommuType_T iommuType)
 {
     BusAssignmentManager *pInstance = new BusAssignmentManager();
-    pInstance->pState->init(chipsetType, fIommu);
+    pInstance->pState->init(chipsetType, iommuType);
     Assert(pInstance);
     return pInstance;
Index: /trunk/src/VBox/Main/src-client/ConsoleImpl2.cpp
===================================================================
--- /trunk/src/VBox/Main/src-client/ConsoleImpl2.cpp	(revision 87241)
+++ /trunk/src/VBox/Main/src-client/ConsoleImpl2.cpp	(revision 87242)
@@ -802,10 +802,37 @@
 
 #ifdef VBOX_WITH_IOMMU_AMD
-    /** @todo Get IOMMU from pMachine and pass info to createInstance() below. */
-    bool const fIommu = RT_BOOL(chipsetType == ChipsetType_ICH9);
+    IommuType_T iommuType;
+    hrc = pMachine->COMGETTER(IommuType)(&iommuType);                                       H();
+
+    /* Resolve 'automatic' type to an Intel or AMD IOMMU based on the host CPU. */
+    if (iommuType == IommuType_Automatic)
+    {
+        if (ASMIsAmdCpu())
+            iommuType = IommuType_AMD;
+        else if (ASMIsIntelCpu())
+        {
+            iommuType = IommuType_None;
+            LogRel(("WARNING! Intel IOMMU implemention is not yet supported. Disabled IOMMU.\n"));
+        }
+        else
+        {
+            /** @todo Should we handle other CPUs like Shanghai, VIA etc. here? */
+            LogRel(("WARNING! Unrecognized CPU type. Disabled IOMMU.\n"));
+            iommuType = IommuType_None;
+        }
+    }
+
+    /* Handle AMD IOMMU specifics. */
+    if (   iommuType == IommuType_AMD
+        && chipsetType != ChipsetType_ICH9)
+        return VMR3SetError(pUVM, VERR_INVALID_PARAMETER, RT_SRC_POS,
+                            N_("AMD IOMMU uses MSIs which requires the ICH9 chipset implementation."));
+
+    /** @todo Handle Intel IOMMU specifics. */
 #else
-    bool const fIommu = false;
+    IommuType_T const iommuType = IommuType_None;
 #endif
-    BusAssignmentManager *pBusMgr = mBusMgr = BusAssignmentManager::createInstance(chipsetType, fIommu);
+    Assert(iommuType != IommuType_Automatic);
+    BusAssignmentManager *pBusMgr = mBusMgr = BusAssignmentManager::createInstance(chipsetType, iommuType);
 
     ULONG cCpus = 1;
@@ -1506,5 +1533,5 @@
 
 #ifdef VBOX_WITH_IOMMU_AMD
-            if (fIommu)
+            if (iommuType == IommuType_AMD)
             {
                 /* AMD IOMMU. */
@@ -3267,5 +3294,5 @@
             }
 #ifdef VBOX_WITH_IOMMU_AMD
-            if (fIommu)
+            if (iommuType == IommuType_AMD)
             {
                 PCIBusAddress Address;
