[VP] Put render/vebox heap in local memory only when necessary

Put render/vebox heap in local memory only when necessary.
diff --git a/media_driver/agnostic/common/hw/mhw_state_heap.c b/media_driver/agnostic/common/hw/mhw_state_heap.c
index c53a40e..c2bfd1e 100644
--- a/media_driver/agnostic/common/hw/mhw_state_heap.c
+++ b/media_driver/agnostic/common/hw/mhw_state_heap.c
@@ -1465,9 +1465,16 @@
     uint32_t                    dwNumHeaps;
     MOS_STATUS                  eStatus = MOS_STATUS_SUCCESS;
     PMHW_BLOCK_MANAGER          pBlockManager = nullptr;
+    MEDIA_FEATURE_TABLE        *skuTable = nullptr;
 
     MHW_FUNCTION_ENTER;
 
+    MHW_CHK_NULL(m_pOsInterface);
+    MHW_CHK_NULL(m_pOsInterface->pfnGetSkuTable);
+
+    skuTable = m_pOsInterface->pfnGetSkuTable(m_pOsInterface);
+    MHW_CHK_NULL(skuTable);
+
     pNewStateHeap = (PMHW_STATE_HEAP)MOS_AllocAndZeroMemory(sizeof(MHW_STATE_HEAP));
     MHW_CHK_NULL(pNewStateHeap);
 
@@ -1483,6 +1490,11 @@
     AllocParams.Format    = Format_Buffer;
     AllocParams.dwBytes   = pNewStateHeap->dwSize;
     AllocParams.pBufName  = "DynamicStateHeap";
+    if (MEDIA_IS_SKU(skuTable, FtrLimitedLMemBar))
+    {
+        AllocParams.dwMemType = MOS_MEMPOOL_SYSTEMMEMORY;
+    }
+
     MHW_CHK_STATUS(m_pOsInterface->pfnAllocateResource(
         m_pOsInterface,
         &AllocParams,
diff --git a/media_driver/agnostic/common/hw/mhw_vebox.cpp b/media_driver/agnostic/common/hw/mhw_vebox.cpp
index 10e48fa..bf68ba0 100644
--- a/media_driver/agnostic/common/hw/mhw_vebox.cpp
+++ b/media_driver/agnostic/common/hw/mhw_vebox.cpp
@@ -224,6 +224,15 @@
     uint32_t                uiOffset;
     MOS_ALLOC_GFXRES_PARAMS AllocParams;
     MOS_LOCK_PARAMS         LockFlags;
+    MEDIA_FEATURE_TABLE     *skuTable = nullptr;
+
+    MHW_FUNCTION_ENTER;
+
+    MHW_CHK_NULL(m_osInterface);
+    MHW_CHK_NULL(m_osInterface->pfnGetSkuTable);
+
+    skuTable = m_osInterface->pfnGetSkuTable(m_osInterface);
+    MHW_CHK_NULL(skuTable);
 
     eStatus         = MOS_STATUS_SUCCESS;
 
@@ -289,11 +298,23 @@
     AllocParams.pBufName = "VphalVeboxHeap";
     AllocParams.ResUsageType = MOS_HW_RESOURCE_USAGE_VP_INTERNAL_READ_WRITE_FF;
 
+    if (MEDIA_IS_SKU(skuTable, FtrLimitedLMemBar))
+    {
+        AllocParams.dwMemType = MOS_MEMPOOL_SYSTEMMEMORY;
+    }
+
     MHW_CHK_STATUS(m_osInterface->pfnAllocateResource(
         m_osInterface,
         &AllocParams,
         &m_veboxHeap->DriverResource));
 
+    if (MEDIA_IS_SKU(skuTable, FtrLimitedLMemBar))
+    {
+        // Use device memory for vebox heap kernel resource, as no cpu access on it.
+        AllocParams.dwMemType = MOS_MEMPOOL_DEVICEMEMORY;
+        AllocParams.Flags.bNotLockable = 1;
+    }
+
     MHW_CHK_STATUS(m_osInterface->pfnAllocateResource(
         m_osInterface,
         &AllocParams,