PVC Umembargo (#60)

diff --git a/Source/GmmLib/CachePolicy/GmmGen12dGPUCachePolicy.cpp b/Source/GmmLib/CachePolicy/GmmGen12dGPUCachePolicy.cpp
index 4b9acce..3cc9f48 100644
--- a/Source/GmmLib/CachePolicy/GmmGen12dGPUCachePolicy.cpp
+++ b/Source/GmmLib/CachePolicy/GmmGen12dGPUCachePolicy.cpp
@@ -134,6 +134,7 @@
             {
                 case IGFX_DG1:
                 case IGFX_XE_HP_SDV:
+	        case IGFX_PVC:
                     StartMocsIdx = 1; // Index 0 is reserved for Error
                     break;
                 default:
@@ -147,7 +148,7 @@
                 CPTblIdx = IsSpecialMOCSUsage((GMM_RESOURCE_USAGE_TYPE)Usage, SpecialMOCS);
             }
 
-            // Applicable upto only
+            // Applicable upto Xe_HP only
             if(pCachePolicy[Usage].HDCL1 &&
                (GFX_GET_CURRENT_PRODUCT(pGmmGlobalContext->GetPlatformInfo().Platform) <= IGFX_XE_HP_SDV))
             {
@@ -166,12 +167,18 @@
                 UsageEle.L3.SCC = (uint16_t)pCachePolicy[Usage].L3_SCC;
             }
 
+	    if(GFX_GET_CURRENT_PRODUCT(pGmmGlobalContext->GetPlatformInfo().Platform) == IGFX_PVC)
+            {
+                pCachePolicy[Usage].GlbGo    = 0;
+                pCachePolicy[Usage].UcLookup = 0;
+            }
             // Go/Lookup
             // N/A for SpecialMOCS
-            // N/A for DG1, RKL
+            // N/A for DG1, RKL, PVC
             // Applicable for IGFX_XE_HP_SDV only
             if(!SpecialMOCS &&
-               (FROMPRODUCT(XE_HP_SDV)))
+               (FROMPRODUCT(XE_HP_SDV)) &&
+               (GFX_GET_CURRENT_PRODUCT(pGmmGlobalContext->GetPlatformInfo().Platform) != IGFX_PVC))
             {
                 if(pCachePolicy[Usage].L3 == 0)
                 {
@@ -369,7 +376,20 @@
         CurrentMaxSpecialMocsIndex  = 63;
 
     }
+    else if (GFX_GET_CURRENT_PRODUCT(pGmmGlobalContext->GetPlatformInfo().Platform) == IGFX_PVC) 
+     {
+         //Default MOCS Table
+        for(int index = 0; index < GMM_MAX_NUMBER_MOCS_INDEXES; index++)
+        {     //             Index     ESC	  SCC	  L3CC    Go      LookUp    HDCL1
+             GMM_DEFINE_MOCS( index  , 0     , 0     , 3     , 0     , 0       , 0 )
+        }
+         // Fixed MOCS Table
+        //              Index     ESC	  SCC	  L3CC    Go      LookUp    HDCL1
+        GMM_DEFINE_MOCS( 1      , 0     , 0     , 1     , 0     , 0       , 0 )
+        GMM_DEFINE_MOCS( 2      , 0     , 0     , 3     , 0     , 0       , 0 )
 
+        CurrentMaxMocsIndex         = 2;
+     }
 // clang-format on
 
 
diff --git a/Source/GmmLib/GlobalInfo/GmmInfo.cpp b/Source/GmmLib/GlobalInfo/GmmInfo.cpp
index fa4cacf..456a2bd 100644
--- a/Source/GmmLib/GlobalInfo/GmmInfo.cpp
+++ b/Source/GmmLib/GlobalInfo/GmmInfo.cpp
@@ -501,6 +501,11 @@
     {
         SkuTable.FtrTileY = true;
     }
+
+    if(GFX_GET_CURRENT_PRODUCT(this->GetPlatformInfo().Platform) == IGFX_PVC)
+    {
+        SkuTable.Ftr57bGPUAddressing = true;
+    }
 }
 
 #ifdef __GMM_KMD__ /*LINK CONTEXT TO GLOBAL*/
diff --git a/Source/GmmLib/Platform/GmmGen12Platform.cpp b/Source/GmmLib/Platform/GmmGen12Platform.cpp
index 419f8b5..c649899 100644
--- a/Source/GmmLib/Platform/GmmGen12Platform.cpp
+++ b/Source/GmmLib/Platform/GmmGen12Platform.cpp
@@ -313,6 +313,11 @@
         Data.NoOfBitsSupported                = 46;
         Data.HighestAcceptablePhysicalAddress = GFX_MASK_LARGE(0, 45);
     }
+    else if(GFX_GET_CURRENT_PRODUCT(Data.Platform) == IGFX_PVC)
+    {
+        Data.NoOfBitsSupported                = 52;
+        Data.HighestAcceptablePhysicalAddress = GFX_MASK_LARGE(0, 51);
+    }
 }
 
 void GmmLib::PlatformInfoGen12::ApplyExtendedTexAlign(uint32_t CCSMode, ALIGNMENT &UnitAlign)
diff --git a/Source/GmmLib/ULT/GmmGen12dGPUCachePolicyULT.cpp b/Source/GmmLib/ULT/GmmGen12dGPUCachePolicyULT.cpp
index 9b2729b..fbafc02 100644
--- a/Source/GmmLib/ULT/GmmGen12dGPUCachePolicyULT.cpp
+++ b/Source/GmmLib/ULT/GmmGen12dGPUCachePolicyULT.cpp
@@ -176,3 +176,36 @@
         }
     }
 }
+
+void CTestXe_HP_CachePolicy::SetUpPlatformVariant(PRODUCT_FAMILY platform)
+{
+    printf("%s\n", __FUNCTION__);
+    CTestGen12dGPUCachePolicy::SetUpGen12dGPUVariant(platform);
+}
+
+void CTestXe_HP_CachePolicy::TearDownPlatformVariant()
+{
+    printf("%s\n", __FUNCTION__);
+    CTestGen12dGPUCachePolicy::TearDownGen12dGPUVariant();
+}
+
+void CTestXe_HP_CachePolicy::CheckL3CachePolicy()
+{
+    printf("%s\n", __FUNCTION__);
+    CTestGen12dGPUCachePolicy::CheckL3Gen12dGPUCachePolicy();
+}
+
+void CTestXe_HP_CachePolicy::SetUpTestCase()
+{
+}
+
+void CTestXe_HP_CachePolicy::TearDownTestCase()
+{
+}
+
+TEST_F(CTestXe_HP_CachePolicy, Test_PVC_CachePolicy)
+{
+    SetUpPlatformVariant(IGFX_PVC);
+    CheckL3CachePolicy();
+    TearDownPlatformVariant();
+}
diff --git a/Source/GmmLib/ULT/GmmGen12dGPUCachePolicyULT.h b/Source/GmmLib/ULT/GmmGen12dGPUCachePolicyULT.h
index 8d0776e..a26a195 100644
--- a/Source/GmmLib/ULT/GmmGen12dGPUCachePolicyULT.h
+++ b/Source/GmmLib/ULT/GmmGen12dGPUCachePolicyULT.h
@@ -42,4 +42,16 @@
     static void SetUpTestCase();
     static void TearDownTestCase();
 };
+
+class CTestXe_HP_CachePolicy : public CTestGen12dGPUCachePolicy
+{
+protected:
+    virtual void SetUpPlatformVariant(PRODUCT_FAMILY);
+    virtual void TearDownPlatformVariant();
+    virtual void CheckL3CachePolicy();
+
+public:
+    static void SetUpTestCase();
+    static void TearDownTestCase();
+};
 #pragma once
diff --git a/Source/GmmLib/inc/External/Common/GmmCommonExt.h b/Source/GmmLib/inc/External/Common/GmmCommonExt.h
index 6c57195..ab38a99 100644
--- a/Source/GmmLib/inc/External/Common/GmmCommonExt.h
+++ b/Source/GmmLib/inc/External/Common/GmmCommonExt.h
@@ -117,6 +117,9 @@
 #define GMM_GFX_ADDRESS_CANONIZE(a)     (((int64_t)(a) << (64 - 48)) >> (64 - 48)) // TODO(Minor): When GMM adds platform-dependent VA size caps, change from 48.
 #define GMM_GFX_ADDRESS_DECANONIZE(a)   ((uint64_t)(a) & (((uint64_t) 1 << 48) - 1)) // "
 
+#define GMM_GFX_PLATFORM_VA_SIZE(pClientContext)        (((pClientContext)->GetLibContext()->GetSkuTable().Ftr57bGPUAddressing) ? 57 : 48)
+#define VASize(pCC)                                     GMM_GFX_PLATFORM_VA_SIZE(pCC)
+
 #define GMM_BIT_RANGE(endbit, startbit)     ((endbit)-(startbit)+1)
 #define GMM_BIT(bit)                        (1)
 
diff --git a/Source/inc/common/igfxfmid.h b/Source/inc/common/igfxfmid.h
index 603e814..f283caf 100644
--- a/Source/inc/common/igfxfmid.h
+++ b/Source/inc/common/igfxfmid.h
@@ -73,6 +73,7 @@
 
     IGFX_DG1  = 1210,
     IGFX_XE_HP_SDV = 1250,
+    IGFX_PVC = 1271,
 
     IGFX_MAX_PRODUCT,
     IGFX_GENNEXT               = 0x7ffffffe,
@@ -1603,6 +1604,13 @@
 #define PCH_DEV_ID_519E         0x519E
 #define PCH_DEV_ID_519F         0x519F
 
+//PVC Device ID
+#define DEV_ID_0BD0                            0x0BD0
+#define DEV_ID_0BD5                            0x0BD5
+
+// Macro to identify PVC device ID
+#define GFX_IS_XT_CONFIG(d) (d == DEV_ID_0BD5)
+
 #define MGM_HAS     0
 
 //#define SDG_HAS      1              //Reserve place for Springdale-G HAS
diff --git a/Source/inc/common/sku_wa.h b/Source/inc/common/sku_wa.h
index c358a43..7db2935 100644
--- a/Source/inc/common/sku_wa.h
+++ b/Source/inc/common/sku_wa.h
@@ -105,7 +105,8 @@
         unsigned int   FtrDisplayXTiling                : 1;  // Fallback to Legacy TileX Display, used for Pre-SI platforms.
         unsigned int   FtrMultiTileArch                 : 1;
 	unsigned int   FtrDisplayPageTables             : 1;  // Display Page Tables: 2-Level Page walk for Displayable Frame buffers in GGTT.
-   };
+        unsigned int   Ftr57bGPUAddressing              : 1;  // 57b GPUVA support eg: PVC
+    };
 
 
     struct //_sku_3d