Correctly pick cache flags for cache-coherent memory
The MT8167 doesn't support cache snooping in the GPU, so use
DevmemCPUCacheMode to check whether cached memory requests need to be
downgraded to uncached.
Change-Id: I0ea06c2d0d924c372d014db5ff3e8f8f8e678a0c
diff --git a/services/server/env/fuchsia/physmem_osmem_fuchsia.cc b/services/server/env/fuchsia/physmem_osmem_fuchsia.cc
index a5bfe0c..ee16293 100644
--- a/services/server/env/fuchsia/physmem_osmem_fuchsia.cc
+++ b/services/server/env/fuchsia/physmem_osmem_fuchsia.cc
@@ -211,20 +211,34 @@
pmr->psDevNode = psDevNode;
pmr->buffer = magma::PlatformBuffer::Create(uiSize, pszAnnotation);
- if (PVRSRV_CHECK_CPU_UNCACHED(uiFlags))
+ uint32_t cpu_cache_flags;
+ PVRSRV_ERROR eError;
+ eError = DevmemCPUCacheMode(psDevNode, uiFlags, &cpu_cache_flags);
+ if (eError != PVRSRV_OK)
+ {
+ return DRET(eError);
+ }
+ if (PVRSRV_CHECK_CPU_UNCACHED(cpu_cache_flags))
{
if (!pmr->buffer->SetCachePolicy(MAGMA_CACHE_POLICY_UNCACHED))
{
return DRET(PVRSRV_ERROR_OUT_OF_MEMORY);
}
}
- if (PVRSRV_CHECK_CPU_WRITE_COMBINE(uiFlags))
+ else if (PVRSRV_CHECK_CPU_WRITE_COMBINE(cpu_cache_flags))
{
if (!pmr->buffer->SetCachePolicy(MAGMA_CACHE_POLICY_WRITE_COMBINING))
{
return DRET(PVRSRV_ERROR_OUT_OF_MEMORY);
}
}
+ else if (PVRSRV_CHECK_CPU_CACHE_CLEAN(uiFlags))
+ {
+ if (!pmr->buffer->CleanCache(0u, pmr->buffer->size(), true))
+ {
+ return DRET(PVRSRV_ERROR_OUT_OF_MEMORY);
+ }
+ }
PHYS_HEAP *psPhysHeap = psDevNode->apsPhysHeap[PVRSRV_DEVICE_PHYS_HEAP_CPU_LOCAL];
return PMRCreatePMR(psDevNode,