diff --git a/services/server/common/physmem.c b/services/server/common/physmem.c index 277f804..4a8124f 100644 --- a/services/server/common/physmem.c +++ b/services/server/common/physmem.c @@ -448,6 +448,23 @@ static PVRSRV_ERROR _DevPhysHeapFromFlags(PVRSRV_MEMALLOCFLAGS_T uiFlags, return PVRSRV_OK; } +static INLINE void _PromoteToCpuCached(PVRSRV_MEMALLOCFLAGS_T *puiFlags) +{ + if ((*puiFlags & (PVRSRV_MEMALLOCFLAG_CPU_READABLE | + PVRSRV_MEMALLOCFLAG_CPU_WRITEABLE | + PVRSRV_MEMALLOCFLAG_KERNEL_CPU_MAPPABLE)) == 0) + { + /* We don't need to upgrade if we don't map into the CPU */ + return; + } + + /* Clear the existing CPU cache flags */ + *puiFlags &= ~(PVRSRV_MEMALLOCFLAG_CPU_CACHE_MODE_MASK); + + /* Add CPU cached flags */ + *puiFlags |= PVRSRV_MEMALLOCFLAG_CPU_CACHE_INCOHERENT; +} + PVRSRV_ERROR PhysmemNewRamBackedPMR_direct(CONNECTION_DATA *psConnection, PVRSRV_DEVICE_NODE *psDevNode, @@ -471,6 +488,12 @@ PhysmemNewRamBackedPMR_direct(CONNECTION_DATA *psConnection, PVR_UNREFERENCED_PARAMETER(uiAnnotationLength); + if (PVRSRVSystemSnoopingOfCPUCache(psDevNode->psDevConfig) && + psDevNode->pfnGetDeviceSnoopMode(psDevNode) == PVRSRV_DEVICE_SNOOP_CPU_ONLY) + { + _PromoteToCpuCached(&uiFlags); + } + eError = _ValidateParams(ui32NumPhysChunks, ui32NumVirtChunks, uiFlags, diff --git a/services/server/devices/rogue/rgxinit.c b/services/server/devices/rogue/rgxinit.c index 5357ab8..0e9f7a3 100644 --- a/services/server/devices/rogue/rgxinit.c +++ b/services/server/devices/rogue/rgxinit.c @@ -1227,6 +1227,26 @@ static MMU_DEVICEATTRIBS *RGXDevMMUAttributes(PVRSRV_DEVICE_NODE *psDeviceNode, return psMMUDevAttrs; } +/* + RGXDevSnoopMode +*/ +static PVRSRV_DEVICE_SNOOP_MODE RGXDevSnoopMode(PVRSRV_DEVICE_NODE *psDeviceNode) +{ + PVRSRV_RGXDEV_INFO *psDevInfo; + + PVR_ASSERT(psDeviceNode != NULL); + PVR_ASSERT(psDeviceNode->pvDevice != NULL); + + psDevInfo = (PVRSRV_RGXDEV_INFO *) psDeviceNode->pvDevice; + + if (RGX_IS_FEATURE_SUPPORTED(psDevInfo, AXI_ACELITE)) + { + return PVRSRV_DEVICE_SNOOP_CPU_ONLY; + } + + return PVRSRV_DEVICE_SNOOP_NONE; +} + /* * RGXInitDevPart2 */ @@ -4516,6 +4536,7 @@ PVRSRV_ERROR RGXRegisterDevice(PVRSRV_DEVICE_NODE *psDeviceNode) psDeviceNode->pfnValidateOrTweakPhysAddrs = NULL; + psDeviceNode->pfnGetDeviceSnoopMode = RGXDevSnoopMode; psDeviceNode->pfnMMUCacheInvalidate = RGXMMUCacheInvalidate; psDeviceNode->pfnMMUCacheInvalidateKick = RGXMMUCacheInvalidateKick; diff --git a/services/server/devices/volcanic/rgxinit.c b/services/server/devices/volcanic/rgxinit.c index d8172a0..ab7eae6 100644 --- a/services/server/devices/volcanic/rgxinit.c +++ b/services/server/devices/volcanic/rgxinit.c @@ -1124,6 +1124,17 @@ static MMU_DEVICEATTRIBS *RGXDevMMUAttributes(PVRSRV_DEVICE_NODE *psDeviceNode, return psMMUDevAttrs; } + +/* + RGXDevSnoopMode +*/ +static PVRSRV_DEVICE_SNOOP_MODE RGXDevSnoopMode(PVRSRV_DEVICE_NODE *psDeviceNode) +{ + PVR_UNREFERENCED_PARAMETER(psDeviceNode); + + return PVRSRV_DEVICE_SNOOP_NONE; +} + /* * RGXInitDevPart2 */ @@ -4090,6 +4101,7 @@ PVRSRV_ERROR RGXRegisterDevice (PVRSRV_DEVICE_NODE *psDeviceNode) psDeviceNode->pfnValidateOrTweakPhysAddrs = NULL; + psDeviceNode->pfnGetDeviceSnoopMode = RGXDevSnoopMode; psDeviceNode->pfnMMUCacheInvalidate = RGXMMUCacheInvalidate; psDeviceNode->pfnMMUCacheInvalidateKick = RGXMMUCacheInvalidateKick; diff --git a/services/server/include/device.h b/services/server/include/device.h index 1a92688..badc2ea 100644 --- a/services/server/include/device.h +++ b/services/server/include/device.h @@ -337,6 +337,8 @@ typedef struct _PVRSRV_DEVICE_NODE_ MMU_DEVICEATTRIBS* (*pfnGetMMUDeviceAttributes)(struct _PVRSRV_DEVICE_NODE_ *psDevNode, IMG_BOOL bKernelMemoryCtx); + PVRSRV_DEVICE_SNOOP_MODE (*pfnGetDeviceSnoopMode)(struct _PVRSRV_DEVICE_NODE_ *psDevNode); + PVRSRV_DEVICE_CONFIG *psDevConfig; /* device post-finalise compatibility check */