+\r
+ DEBUG ((DEBUG_INFO, "InitDmar\n"));\r
+\r
+ MchBar = PciRead32 (PCI_LIB_ADDRESS(0, 0, 0, R_SA_MCHBAR)) & ~BIT0;\r
+ PciWrite32 (PCI_LIB_ADDRESS(0, 0, 0, R_SA_MCHBAR), 0xFED10000 | BIT0);\r
+ DEBUG ((DEBUG_INFO, "MchBar - %x\n", MchBar));\r
+\r
+ MmioWrite32 (MchBar + R_SA_MCHBAR_VTD2_OFFSET, (UINT32)mPlatformVTdSample.Drhd2.RegisterBaseAddress | 1);\r
+ DEBUG ((DEBUG_INFO, "VTd2 - %x\n", (MmioRead32 (MchBar + R_SA_MCHBAR_VTD2_OFFSET))));\r
+}\r
+\r
+/**\r
+ Patch Graphic UMA address in RMRR and base address.\r
+**/\r
+EFI_PEI_PPI_DESCRIPTOR *\r
+PatchDmar (\r
+ VOID\r
+ )\r
+{\r
+ UINT32 MchBar;\r
+ UINT16 IgdMode;\r
+ UINT16 GttMode;\r
+ UINT32 IgdMemSize;\r
+ UINT32 GttMemSize;\r
+ MY_VTD_INFO_PPI *PlatformVTdSample;\r
+ EFI_PEI_PPI_DESCRIPTOR *PlatformVTdInfoSampleDesc;\r
+ MY_VTD_INFO_NO_IGD_PPI *PlatformVTdNoIgdSample;\r
+ EFI_PEI_PPI_DESCRIPTOR *PlatformVTdNoIgdInfoSampleDesc;\r
+\r
+ DEBUG ((DEBUG_INFO, "PatchDmar\n"));\r
+\r
+ if (PciRead16 (PCI_LIB_ADDRESS(0, 2, 0, 0)) != 0xFFFF) {\r
+ PlatformVTdSample = AllocateCopyPool (sizeof(MY_VTD_INFO_PPI), &mPlatformVTdSample);\r
+ ASSERT(PlatformVTdSample != NULL);\r
+ PlatformVTdInfoSampleDesc = AllocateCopyPool (sizeof(EFI_PEI_PPI_DESCRIPTOR), &mPlatformVTdInfoSampleDesc);\r
+ ASSERT(PlatformVTdInfoSampleDesc != NULL);\r
+ PlatformVTdInfoSampleDesc->Ppi = PlatformVTdSample;\r
+\r
+ ///\r
+ /// Calculate IGD memsize\r
+ ///\r
+ IgdMode = ((PciRead16 (PCI_LIB_ADDRESS(0, 0, 0, R_SA_GGC)) & B_SKL_SA_GGC_GMS_MASK) >> N_SKL_SA_GGC_GMS_OFFSET) & 0xFF;\r
+ if (IgdMode < 0xF0) {\r
+ IgdMemSize = IgdMode * 32 * (1024) * (1024);\r
+ } else {\r
+ IgdMemSize = 4 * (IgdMode - 0xF0 + 1) * (1024) * (1024);\r
+ }\r
+\r
+ ///\r
+ /// Calculate GTT mem size\r
+ ///\r
+ GttMemSize = 0;\r
+ GttMode = (PciRead16 (PCI_LIB_ADDRESS(0, 0, 0, R_SA_GGC)) & B_SKL_SA_GGC_GGMS_MASK) >> N_SKL_SA_GGC_GGMS_OFFSET;\r
+ if (GttMode <= V_SKL_SA_GGC_GGMS_8MB) {\r
+ GttMemSize = (1 << GttMode) * (1024) * (1024);\r
+ }\r
+\r
+ PlatformVTdSample->Rmrr1.ReservedMemoryRegionBaseAddress = (PciRead32 (PCI_LIB_ADDRESS(0, 0, 0, R_SA_TOLUD)) & ~(0x01)) - IgdMemSize - GttMemSize;\r
+ PlatformVTdSample->Rmrr1.ReservedMemoryRegionLimitAddress = PlatformVTdSample->Rmrr1.ReservedMemoryRegionBaseAddress + IgdMemSize + GttMemSize - 1;\r
+\r
+ ///\r
+ /// Update DRHD structures of DmarTable\r
+ ///\r
+ MchBar = PciRead32 (PCI_LIB_ADDRESS(0, 0, 0, R_SA_MCHBAR)) & ~BIT0;\r
+\r
+ if ((MmioRead32 (MchBar + R_SA_MCHBAR_VTD1_OFFSET) &~1) != 0) {\r
+ PlatformVTdSample->Drhd1.RegisterBaseAddress = (MmioRead32 (MchBar + R_SA_MCHBAR_VTD1_OFFSET) &~1);\r
+ } else {\r
+ MmioWrite32 (MchBar + R_SA_MCHBAR_VTD1_OFFSET, (UINT32)PlatformVTdSample->Drhd1.RegisterBaseAddress | 1);\r
+ }\r
+ DEBUG ((DEBUG_INFO, "VTd1 - %x\n", (MmioRead32 (MchBar + R_SA_MCHBAR_VTD1_OFFSET))));\r
+\r
+ if ((MmioRead32 (MchBar + R_SA_MCHBAR_VTD2_OFFSET) &~1) != 0) {\r
+ PlatformVTdSample->Drhd2.RegisterBaseAddress = (MmioRead32 (MchBar + R_SA_MCHBAR_VTD2_OFFSET) &~1);\r
+ } else {\r
+ MmioWrite32 (MchBar + R_SA_MCHBAR_VTD2_OFFSET, (UINT32)PlatformVTdSample->Drhd2.RegisterBaseAddress | 1);\r
+ }\r
+ DEBUG ((DEBUG_INFO, "VTd2 - %x\n", (MmioRead32 (MchBar + R_SA_MCHBAR_VTD2_OFFSET))));\r
+\r
+ return PlatformVTdInfoSampleDesc;\r