summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Jones <ben.jones@imgtec.com>2015-11-11 16:00:21 +0000
committerBen Jones <ben.jones@imgtec.com>2015-11-25 16:23:20 +0000
commit4f43e6b499c6d194030df8d2506485db9d5165bd (patch)
treeb34d476eab90e7438f70096a6f36bbe25c251154
parente60fe11e46616f9dc03a076f839e879cf0f6289a (diff)
downloadmediatek-android-mtk-3.18.tar.gz
staging: imgtec: update PowerVR Rogue driver to version 1.6@3823360android-mtk-3.18
Signed-off-by: Ben Jones <ben.jones@imgtec.com>
-rw-r--r--drivers/staging/imgtec/config_kernel.h1
-rw-r--r--drivers/staging/imgtec/pvrversion.h6
-rw-r--r--drivers/staging/imgtec/rogue/allocmem.c36
-rw-r--r--drivers/staging/imgtec/rogue/cache_generic.c6
-rw-r--r--drivers/staging/imgtec/rogue/osfunc.h2
-rw-r--r--drivers/staging/imgtec/rogue/osfunc_arm64.c32
-rw-r--r--drivers/staging/imgtec/rogue/physmem_osmem_linux.c19
-rw-r--r--drivers/staging/imgtec/rogue/pmr_os.c14
-rw-r--r--drivers/staging/imgtec/rogue/process_stats.c218
-rw-r--r--drivers/staging/imgtec/rogue/process_stats.h3
-rw-r--r--drivers/staging/imgtec/rogue/pvr_dvfs.h4
-rw-r--r--drivers/staging/imgtec/rogue/rgxccb.c35
-rw-r--r--drivers/staging/imgtec/rogue/rgxccb.h2
-rw-r--r--drivers/staging/imgtec/rogue/rgxcompute.c2
-rwxr-xr-xdrivers/staging/imgtec/rogue/rgxdevice.h4
-rw-r--r--drivers/staging/imgtec/rogue/rgxfwutils.c23
-rw-r--r--drivers/staging/imgtec/rogue/rgxfwutils.h2
-rwxr-xr-xdrivers/staging/imgtec/rogue/rgxinit.c5
-rw-r--r--drivers/staging/imgtec/rogue/rgxkicksync.c2
-rw-r--r--drivers/staging/imgtec/rogue/rgxta3d.c4
-rw-r--r--drivers/staging/imgtec/rogue/rgxtransfer.c4
21 files changed, 317 insertions, 107 deletions
diff --git a/drivers/staging/imgtec/config_kernel.h b/drivers/staging/imgtec/config_kernel.h
index 31088a0dfa6b..cacf7283cfef 100644
--- a/drivers/staging/imgtec/config_kernel.h
+++ b/drivers/staging/imgtec/config_kernel.h
@@ -10,6 +10,7 @@
#define SUPPORT_DBGDRV_EVENT_OBJECTS
#define PDUMP_STREAMBUF_MAX_SIZE_MB 16
#define SYS_USING_INTERRUPTS
+#define SUPPORT_RANGEBASED_CACHEFLUSH
#define SUPPORT_GPUTRACE_EVENTS
#define GPUVIRT_VALIDATION_NUM_OS 8
#define PVRSRV_GPUVIRT_NUM_OSID 2
diff --git a/drivers/staging/imgtec/pvrversion.h b/drivers/staging/imgtec/pvrversion.h
index 1623092a8333..a4b1c57d457e 100644
--- a/drivers/staging/imgtec/pvrversion.h
+++ b/drivers/staging/imgtec/pvrversion.h
@@ -53,7 +53,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#define PVRVERSION_FAMILY "rogueddk"
#define PVRVERSION_BRANCHNAME "1.6"
-#define PVRVERSION_BUILD 3814013
+#define PVRVERSION_BUILD 3823360
#define PVRVERSION_BSCONTROL "Rogue_DDK_Android"
#define PVRVERSION_STRING "Rogue_DDK_Android rogueddk 1.6@" PVR_STR2(PVRVERSION_BUILD)
@@ -61,8 +61,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#define COPYRIGHT_TXT "Copyright (c) Imagination Technologies Ltd. All Rights Reserved."
-#define PVRVERSION_BUILD_HI 381
-#define PVRVERSION_BUILD_LO 4013
+#define PVRVERSION_BUILD_HI 382
+#define PVRVERSION_BUILD_LO 3360
#define PVRVERSION_STRING_NUMERIC PVR_STR2(PVRVERSION_MAJ) "." PVR_STR2(PVRVERSION_MIN) "." PVR_STR2(PVRVERSION_BUILD_HI) "." PVR_STR2(PVRVERSION_BUILD_LO)
#define PVRVERSION_PACK(MAJ,MIN) ((((MAJ)&0xFFFF) << 16) | (((MIN)&0xFFFF) << 0))
diff --git a/drivers/staging/imgtec/rogue/allocmem.c b/drivers/staging/imgtec/rogue/allocmem.c
index a6627b4981ca..10c278eacb39 100644
--- a/drivers/staging/imgtec/rogue/allocmem.c
+++ b/drivers/staging/imgtec/rogue/allocmem.c
@@ -229,7 +229,12 @@ IMG_INTERNAL void *OSAllocMem(IMG_UINT32 ui32Size)
}
if (pvRet == NULL)
{
+#if !defined(PVR_DISABLE_KMALLOC_MEMSTATS)
+ /* Allocate an additional 4 bytes to store the PID of the allocating process */
+ pvRet = kmalloc(ui32Size + sizeof(IMG_UINT32), GFP_KERNEL);
+#else
pvRet = kmalloc(ui32Size, GFP_KERNEL);
+#endif
}
if (pvRet != NULL)
@@ -238,7 +243,14 @@ IMG_INTERNAL void *OSAllocMem(IMG_UINT32 ui32Size)
if (!is_vmalloc_addr(pvRet))
{
#if !defined(PVRSRV_ENABLE_MEMORY_STATS)
+#if !defined(PVR_DISABLE_KMALLOC_MEMSTATS)
+ {
+ /* Store the PID in the final additional 4 bytes allocated */
+ IMG_UINT32 *puiTemp = (IMG_UINT32*) (((IMG_BYTE*)pvRet) + (ksize(pvRet) - sizeof(IMG_UINT32)));
+ *puiTemp = OSGetCurrentProcessID();
+ }
PVRSRVStatsIncrMemAllocStat(PVRSRV_MEM_ALLOC_TYPE_KMALLOC, ksize(pvRet));
+#endif
#else
IMG_CPU_PHYADDR sCpuPAddr;
sCpuPAddr.uiAddr = 0;
@@ -253,9 +265,11 @@ IMG_INTERNAL void *OSAllocMem(IMG_UINT32 ui32Size)
else
{
#if !defined(PVRSRV_ENABLE_MEMORY_STATS)
+#if !defined(PVR_DISABLE_KMALLOC_MEMSTATS)
PVRSRVStatsIncrMemAllocStatAndTrack(PVRSRV_MEM_ALLOC_TYPE_VMALLOC,
((ui32Size + PAGE_SIZE -1) & ~(PAGE_SIZE-1)),
(IMG_UINT64)(uintptr_t) pvRet);
+#endif
#else
IMG_CPU_PHYADDR sCpuPAddr;
sCpuPAddr.uiAddr = 0;
@@ -281,7 +295,12 @@ IMG_INTERNAL void *OSAllocZMem(IMG_UINT32 ui32Size)
}
if (pvRet == NULL)
{
+#if !defined(PVR_DISABLE_KMALLOC_MEMSTATS)
+ /* Allocate an additional 4 bytes to store the PID of the allocating process */
+ pvRet = kzalloc(ui32Size + sizeof(IMG_UINT32), GFP_KERNEL);
+#else
pvRet = kzalloc(ui32Size, GFP_KERNEL);
+#endif
}
if (pvRet != NULL)
@@ -289,8 +308,17 @@ IMG_INTERNAL void *OSAllocZMem(IMG_UINT32 ui32Size)
if (!is_vmalloc_addr(pvRet))
{
#if !defined(PVRSRV_ENABLE_MEMORY_STATS)
+#if !defined(PVR_DISABLE_KMALLOC_MEMSTATS)
+ {
+ /* Store the PID in the final additional 4 bytes allocated */
+ IMG_UINT32 *puiTemp = (IMG_UINT32*) (((IMG_BYTE*)pvRet) + (ksize(pvRet) - sizeof(IMG_UINT32)));
+ *puiTemp = OSGetCurrentProcessID();
+ }
PVRSRVStatsIncrMemAllocStat(PVRSRV_MEM_ALLOC_TYPE_KMALLOC, ksize(pvRet));
#else
+
+#endif
+#else
IMG_CPU_PHYADDR sCpuPAddr;
sCpuPAddr.uiAddr = 0;
@@ -304,9 +332,11 @@ IMG_INTERNAL void *OSAllocZMem(IMG_UINT32 ui32Size)
else
{
#if !defined(PVRSRV_ENABLE_MEMORY_STATS)
+#if !defined(PVR_DISABLE_KMALLOC_MEMSTATS)
PVRSRVStatsIncrMemAllocStatAndTrack(PVRSRV_MEM_ALLOC_TYPE_VMALLOC,
((ui32Size + PAGE_SIZE -1) & ~(PAGE_SIZE-1)),
(IMG_UINT64)(uintptr_t) pvRet);
+#endif
#else
IMG_CPU_PHYADDR sCpuPAddr;
sCpuPAddr.uiAddr = 0;
@@ -330,7 +360,9 @@ IMG_INTERNAL void OSFreeMem(void *pvMem)
if (!is_vmalloc_addr(pvMem))
{
#if !defined(PVRSRV_ENABLE_MEMORY_STATS)
- PVRSRVStatsDecrMemAllocStat(PVRSRV_MEM_ALLOC_TYPE_KMALLOC, ksize(pvMem));
+#if !defined(PVR_DISABLE_KMALLOC_MEMSTATS)
+ PVRSRVStatsDecrMemKAllocStat(ksize(pvMem), *((IMG_UINT32*) (((IMG_BYTE*)pvMem) + (ksize(pvMem) - sizeof(IMG_UINT32)))));
+#endif
#else
PVRSRVStatsRemoveMemAllocRecord(PVRSRV_MEM_ALLOC_TYPE_KMALLOC,
(IMG_UINT64)(uintptr_t) pvMem);
@@ -340,8 +372,10 @@ IMG_INTERNAL void OSFreeMem(void *pvMem)
else
{
#if !defined(PVRSRV_ENABLE_MEMORY_STATS)
+#if !defined(PVR_DISABLE_KMALLOC_MEMSTATS)
PVRSRVStatsDecrMemAllocStatAndUntrack(PVRSRV_MEM_ALLOC_TYPE_VMALLOC,
(IMG_UINT64)(uintptr_t) pvMem);
+#endif
#else
PVRSRVStatsRemoveMemAllocRecord(PVRSRV_MEM_ALLOC_TYPE_VMALLOC,
(IMG_UINT64)(uintptr_t) pvMem);
diff --git a/drivers/staging/imgtec/rogue/cache_generic.c b/drivers/staging/imgtec/rogue/cache_generic.c
index 29460d43c975..4a24f49ad494 100644
--- a/drivers/staging/imgtec/rogue/cache_generic.c
+++ b/drivers/staging/imgtec/rogue/cache_generic.c
@@ -77,8 +77,10 @@ PVRSRV_ERROR CacheOpQueue(PMR *psPMR,
/* Carry out full dcache operation if size qualifies */
if ((uiSize >> PAGE_SHIFT) >= PVR_DIRTY_PAGECOUNT_FLUSH_THRESHOLD)
{
- OSCPUOperation(uiCacheOp);
- return PVRSRV_OK;
+ if (OSCPUOperation(uiCacheOp) == PVRSRV_OK)
+ {
+ return PVRSRV_OK;
+ }
}
/* Need to track both cache-aligned and page-aligned quantities */
diff --git a/drivers/staging/imgtec/rogue/osfunc.h b/drivers/staging/imgtec/rogue/osfunc.h
index 02f269737c37..5376dccb35c2 100644
--- a/drivers/staging/imgtec/rogue/osfunc.h
+++ b/drivers/staging/imgtec/rogue/osfunc.h
@@ -193,7 +193,7 @@ void *OSMapPhysToLin(IMG_CPU_PHYADDR BasePAddr, size_t ui32Bytes, IMG_UINT32 ui3
IMG_BOOL OSUnMapPhysToLin(void *pvLinAddr, size_t ui32Bytes, IMG_UINT32 ui32Flags);
-void OSCPUOperation(PVRSRV_CACHE_OP eCacheOp);
+PVRSRV_ERROR OSCPUOperation(PVRSRV_CACHE_OP eCacheOp);
void OSFlushCPUCacheRangeKM(void *pvVirtStart,
void *pvVirtEnd,
diff --git a/drivers/staging/imgtec/rogue/osfunc_arm64.c b/drivers/staging/imgtec/rogue/osfunc_arm64.c
index 619d91bb7747..84ae2245dee4 100644
--- a/drivers/staging/imgtec/rogue/osfunc_arm64.c
+++ b/drivers/staging/imgtec/rogue/osfunc_arm64.c
@@ -57,37 +57,31 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#error "CONFIG_OUTER_CACHE not supported on arm64."
#endif
-
-static void per_cpu_cache_flush(void *arg)
+PVRSRV_ERROR OSCPUOperation(PVRSRV_CACHE_OP uiCacheOp)
{
- PVR_UNREFERENCED_PARAMETER(arg);
- flush_cache_all();
-}
+ PVRSRV_ERROR eError = PVRSRV_OK;
-void OSCPUOperation(PVRSRV_CACHE_OP uiCacheOp)
-{
switch(uiCacheOp)
{
- /* Fall-through */
case PVRSRV_CACHE_OP_CLEAN:
- /* No full (inner) cache clean op */
- on_each_cpu(per_cpu_cache_flush, NULL, 1);
- break;
-
case PVRSRV_CACHE_OP_FLUSH:
- on_each_cpu(per_cpu_cache_flush, NULL, 1);
- break;
+ case PVRSRV_CACHE_OP_INVALIDATE:
+ eError = PVRSRV_ERROR_NOT_IMPLEMENTED;
+ break;
case PVRSRV_CACHE_OP_NONE:
- break;
+ break;
default:
- PVR_DPF((PVR_DBG_ERROR,
- "%s: Invalid cache operation type %d",
+ PVR_DPF((PVR_DBG_ERROR,
+ "%s: Global cache operation type %d is invalid",
__FUNCTION__, uiCacheOp));
- PVR_ASSERT(0);
- break;
+ eError = PVRSRV_ERROR_INVALID_PARAMS;
+ PVR_ASSERT(0);
+ break;
}
+
+ return eError;
}
void OSFlushCPUCacheRangeKM(void *pvVirtStart,
diff --git a/drivers/staging/imgtec/rogue/physmem_osmem_linux.c b/drivers/staging/imgtec/rogue/physmem_osmem_linux.c
index b54fc9a50132..7db9c74760ed 100644
--- a/drivers/staging/imgtec/rogue/physmem_osmem_linux.c
+++ b/drivers/staging/imgtec/rogue/physmem_osmem_linux.c
@@ -1385,7 +1385,14 @@ _ApplyOSPagesAttribute(struct page **ppsPage,
IMG_UINT32 ui32Idx;
- if (uiNumPages < PVR_DIRTY_PAGECOUNT_FLUSH_THRESHOLD)
+ eError = PVRSRV_ERROR_RETRY;
+ if (uiNumPages >= PVR_DIRTY_PAGECOUNT_FLUSH_THRESHOLD)
+ {
+ /* May fail so fallback to range-based flush */
+ eError = OSCPUOperation(PVRSRV_CACHE_OP_FLUSH);
+ }
+
+ if (eError != PVRSRV_OK)
{
for (ui32Idx = 0; ui32Idx < uiNumPages; ++ui32Idx)
{
@@ -1415,14 +1422,12 @@ _ApplyOSPagesAttribute(struct page **ppsPage,
kunmap(ppsPage[ui32Idx]);
}
+
+ eError = PVRSRV_OK;
}
- else
- {
- OSCPUOperation(PVRSRV_CACHE_OP_FLUSH);
- }
- }
+ }
}
-
+
return eError;
}
diff --git a/drivers/staging/imgtec/rogue/pmr_os.c b/drivers/staging/imgtec/rogue/pmr_os.c
index c7e039359476..595f772e6077 100644
--- a/drivers/staging/imgtec/rogue/pmr_os.c
+++ b/drivers/staging/imgtec/rogue/pmr_os.c
@@ -120,13 +120,15 @@ static void MMapPMRClose(struct vm_area_struct *ps_vma)
#if defined(PVRSRV_ENABLE_PROCESS_STATS)
#if defined(PVRSRV_ENABLE_MEMORY_STATS)
- uintptr_t vAddr = ps_vma->vm_start;
-
- while (vAddr < ps_vma->vm_end)
{
- /* USER MAPPING */
- PVRSRVStatsRemoveMemAllocRecord(PVRSRV_MEM_ALLOC_TYPE_MAP_UMA_LMA_PAGES, (IMG_UINT64)vAddr);
- vAddr += PAGE_SIZE;
+ uintptr_t vAddr = ps_vma->vm_start;
+
+ while (vAddr < ps_vma->vm_end)
+ {
+ /* USER MAPPING */
+ PVRSRVStatsRemoveMemAllocRecord(PVRSRV_MEM_ALLOC_TYPE_MAP_UMA_LMA_PAGES, (IMG_UINT64)vAddr);
+ vAddr += PAGE_SIZE;
+ }
}
#else
PVRSRVStatsDecrMemAllocStat(PVRSRV_MEM_ALLOC_TYPE_MAP_UMA_LMA_PAGES, ps_vma->vm_end - ps_vma->vm_start);
diff --git a/drivers/staging/imgtec/rogue/process_stats.c b/drivers/staging/imgtec/rogue/process_stats.c
index bce52f60792c..4ead1c4e94c7 100644
--- a/drivers/staging/imgtec/rogue/process_stats.c
+++ b/drivers/staging/imgtec/rogue/process_stats.c
@@ -130,10 +130,14 @@ static IMG_CHAR* pszProcessStatFmt[PVRSRV_PROCESS_STAT_TYPE_COUNT] = {
"FreeListGrowRequestsByFirmware %10d\n", /* PVRSRV_PROCESS_STAT_TYPE_FREELIST_GROW_REQS_BY_FW */
"FreeListInitialPages %10d\n", /* PVRSRV_PROCESS_STAT_TYPE_FREELIST_PAGES_INIT */
"FreeListMaxPages %10d\n", /* PVRSRV_PROCESS_STAT_TYPE_FREELIST_MAX_PAGES */
- "MemoryUsageKMalloc %10d\n", /* PVRSRV_STAT_TYPE_KMALLOC */
+#if !defined(PVR_DISABLE_KMALLOC_MEMSTATS)
+ "MemoryUsageKMalloc %10d\n", /* PVRSRV_STAT_TYPE_KMALLOC */
"MemoryUsageKMallocMax %10d\n", /* PVRSRV_STAT_TYPE_MAX_KMALLOC */
"MemoryUsageVMalloc %10d\n", /* PVRSRV_STAT_TYPE_VMALLOC */
"MemoryUsageVMallocMax %10d\n", /* PVRSRV_STAT_TYPE_MAX_VMALLOC */
+#else
+ "","","","", /* Empty strings if these stats are not logged */
+#endif
"MemoryUsageAllocPTMemoryUMA %10d\n", /* PVRSRV_STAT_TYPE_ALLOC_PAGES_PT_UMA */
"MemoryUsageAllocPTMemoryUMAMax %10d\n", /* PVRSRV_STAT_TYPE_MAX_ALLOC_PAGES_PT_UMA */
"MemoryUsageVMapPTUMA %10d\n", /* PVRSRV_STAT_TYPE_VMAP_PT_UMA */
@@ -150,6 +154,14 @@ static IMG_CHAR* pszProcessStatFmt[PVRSRV_PROCESS_STAT_TYPE_COUNT] = {
"MemoryUsageMappedGPUMemUMA/LMAMax %10d\n", /* PVRSRV_STAT_TYPE_MAX_MAP_UMA_LMA_PAGES */
};
+/* structure used in hash table to track vmalloc statistic entries */
+typedef struct{
+ size_t uiSizeInBytes;
+ IMG_PID uiPid;
+}_PVR_STATS_VMALLOC_HASH_ENTRY;
+
+/* Function used internally to decrement per-process vmalloc statistic entries */
+static void _StatsDecrMemVAllocStat(_PVR_STATS_VMALLOC_HASH_ENTRY *psVmallocHashEntry);
/*
* Functions for printing the information stored...
@@ -1106,6 +1118,7 @@ static void _decrease_global_stat(PVRSRV_MEM_ALLOC_TYPE eAllocType,
switch (eAllocType)
{
+#if !defined(PVR_DISABLE_KMALLOC_MEMSTATS)
case PVRSRV_MEM_ALLOC_TYPE_KMALLOC:
DECREASE_GLOBAL_STAT_VALUE(gsGlobalStats.ui32MemoryUsageKMalloc, uiBytes);
break;
@@ -1113,7 +1126,11 @@ static void _decrease_global_stat(PVRSRV_MEM_ALLOC_TYPE eAllocType,
case PVRSRV_MEM_ALLOC_TYPE_VMALLOC:
DECREASE_GLOBAL_STAT_VALUE(gsGlobalStats.ui32MemoryUsageVMalloc, uiBytes);
break;
-
+#else
+ case PVRSRV_MEM_ALLOC_TYPE_KMALLOC:
+ case PVRSRV_MEM_ALLOC_TYPE_VMALLOC:
+ break;
+#endif
case PVRSRV_MEM_ALLOC_TYPE_ALLOC_PAGES_PT_UMA:
DECREASE_GLOBAL_STAT_VALUE(gsGlobalStats.ui32MemoryUsageAllocPTMemoryUMA, uiBytes);
break;
@@ -1160,6 +1177,7 @@ static void _increase_global_stat(PVRSRV_MEM_ALLOC_TYPE eAllocType,
switch (eAllocType)
{
+#if !defined(PVR_DISABLE_KMALLOC_MEMSTATS)
case PVRSRV_MEM_ALLOC_TYPE_KMALLOC:
INCREASE_GLOBAL_STAT_VALUE(gsGlobalStats.ui32MemoryUsageKMalloc, uiBytes);
break;
@@ -1167,7 +1185,11 @@ static void _increase_global_stat(PVRSRV_MEM_ALLOC_TYPE eAllocType,
case PVRSRV_MEM_ALLOC_TYPE_VMALLOC:
INCREASE_GLOBAL_STAT_VALUE(gsGlobalStats.ui32MemoryUsageVMalloc, uiBytes);
break;
-
+#else
+ case PVRSRV_MEM_ALLOC_TYPE_KMALLOC:
+ case PVRSRV_MEM_ALLOC_TYPE_VMALLOC:
+ break;
+#endif
case PVRSRV_MEM_ALLOC_TYPE_ALLOC_PAGES_PT_UMA:
INCREASE_GLOBAL_STAT_VALUE(gsGlobalStats.ui32MemoryUsageAllocPTMemoryUMA, uiBytes);
break;
@@ -1436,7 +1458,11 @@ _PVRSRVStatsAddMemAllocRecord(PVRSRV_MEM_ALLOC_TYPE eAllocType,
*/
/* Allocate the memory record... */
- psRecord = OSAllocMemNoStats(sizeof(PVRSRV_MEM_ALLOC_REC));
+#if defined(__linux__)
+ psRecord = (PVRSRV_MEM_ALLOC_REC*)OSAllocMemNoStats(sizeof(PVRSRV_MEM_ALLOC_REC));
+#else
+ psRecord = (PVRSRV_MEM_ALLOC_REC*)OSAllocMem(sizeof(PVRSRV_MEM_ALLOC_REC));
+#endif
if (psRecord == NULL)
{
return;
@@ -1536,7 +1562,11 @@ _PVRSRVStatsAddMemAllocRecord(PVRSRV_MEM_ALLOC_TYPE eAllocType,
psProcessStats->psRIMemoryStats = OSAllocZMemNoStats(sizeof(PVRSRV_RI_MEMORY_STATS));
if (psProcessStats->psRIMemoryStats == NULL)
{
+#if defined(__linux__)
OSFreeMemNoStats(psProcessStats->psMemoryStats);
+#else
+ OSFreeMem(psProcessStats->psMemoryStats);
+#endif
OSLockDestroyNoStats(psProcessStats->hLock);
psProcessStats->hLock = NULL;
OSLockRelease(g_psLinkedListLock);
@@ -1571,7 +1601,11 @@ _PVRSRVStatsAddMemAllocRecord(PVRSRV_MEM_ALLOC_TYPE eAllocType,
#endif
if (psRecord != NULL)
{
+#if defined(__linux__)
OSFreeMemNoStats(psRecord);
+#else
+ OSFreeMem(psRecord);
+#endif
}
return;
}
@@ -1589,6 +1623,7 @@ _PVRSRVStatsAddMemAllocRecord(PVRSRV_MEM_ALLOC_TYPE eAllocType,
/* Update the memory watermarks... */
switch (eAllocType)
{
+#if !defined(PVR_DISABLE_KMALLOC_MEMSTATS)
case PVRSRV_MEM_ALLOC_TYPE_KMALLOC:
{
if (psRecord != NULL)
@@ -1618,7 +1653,11 @@ _PVRSRVStatsAddMemAllocRecord(PVRSRV_MEM_ALLOC_TYPE eAllocType,
psProcessStats->ui32StatAllocFlags |= (IMG_UINT32)(1 << (PVRSRV_PROCESS_STAT_TYPE_VMALLOC-PVRSRV_PROCESS_STAT_TYPE_KMALLOC));
}
break;
-
+#else
+ case PVRSRV_MEM_ALLOC_TYPE_KMALLOC:
+ case PVRSRV_MEM_ALLOC_TYPE_VMALLOC:
+ break;
+#endif
case PVRSRV_MEM_ALLOC_TYPE_ALLOC_PAGES_PT_UMA:
{
if (psRecord != NULL)
@@ -1867,6 +1906,7 @@ PVRSRVStatsRemoveMemAllocRecord(PVRSRV_MEM_ALLOC_TYPE eAllocType,
switch (eAllocType)
{
+#if !defined(PVR_DISABLE_KMALLOC_MEMSTATS)
case PVRSRV_MEM_ALLOC_TYPE_KMALLOC:
{
DECREASE_STAT_VALUE(psProcessStats, PVRSRV_PROCESS_STAT_TYPE_KMALLOC, (IMG_UINT32)psRecord->uiBytes);
@@ -1886,8 +1926,12 @@ PVRSRVStatsRemoveMemAllocRecord(PVRSRV_MEM_ALLOC_TYPE eAllocType,
}
}
break;
-
- case PVRSRV_MEM_ALLOC_TYPE_ALLOC_PAGES_PT_UMA:
+#else
+ case PVRSRV_MEM_ALLOC_TYPE_KMALLOC:
+ case PVRSRV_MEM_ALLOC_TYPE_VMALLOC:
+ break;
+#endif
+ case PVRSRV_MEM_ALLOC_TYPE_ALLOC_PAGES_PT_UMA:
{
DECREASE_STAT_VALUE(psProcessStats, PVRSRV_PROCESS_STAT_TYPE_ALLOC_PAGES_PT_UMA, (IMG_UINT32)psRecord->uiBytes);
if( psProcessStats->i32StatValue[PVRSRV_MEM_ALLOC_TYPE_ALLOC_PAGES_PT_UMA] == 0 )
@@ -1985,7 +2029,11 @@ PVRSRVStatsRemoveMemAllocRecord(PVRSRV_MEM_ALLOC_TYPE eAllocType,
* Free the record outside the lock so we don't deadlock and so we
* reduce the time the lock is held.
*/
+#if defined(__linux__)
OSFreeMemNoStats(psRecord);
+#else
+ OSFreeMem(psRecord);
+#endif
}
else
{
@@ -2003,7 +2051,8 @@ PVRSRVStatsIncrMemAllocStatAndTrack(PVRSRV_MEM_ALLOC_TYPE eAllocType,
size_t uiBytes,
IMG_UINT64 uiCpuVAddr)
{
- IMG_BOOL bRes;
+ IMG_BOOL bRes = IMG_FALSE;
+ _PVR_STATS_VMALLOC_HASH_ENTRY *psNewVmallocHashEntry = NULL;
if (!bProcessStatsInitialised || (gpsVmallocSizeHashTable == NULL) )
{
@@ -2011,16 +2060,35 @@ PVRSRVStatsIncrMemAllocStatAndTrack(PVRSRV_MEM_ALLOC_TYPE eAllocType,
}
OSLockAcquire(gpsVmallocSizeHashTableLock);
- bRes = HASH_Insert(gpsVmallocSizeHashTable, uiCpuVAddr, uiBytes);
+ /* Alloc untracked memory for the new hash table entry */
+#if defined(__linux__)
+ psNewVmallocHashEntry = (_PVR_STATS_VMALLOC_HASH_ENTRY *)OSAllocMemNoStats(sizeof(*psNewVmallocHashEntry));
+#else
+ psNewVmallocHashEntry = (_PVR_STATS_VMALLOC_HASH_ENTRY *)OSAllocMem(sizeof(*psNewVmallocHashEntry));
+#endif
+ if (psNewVmallocHashEntry)
+ {
+ /* Fill-in the size of the vmalloc and PID of the allocating process */
+ psNewVmallocHashEntry->uiSizeInBytes = uiBytes;
+ psNewVmallocHashEntry->uiPid = OSGetCurrentProcessID();
+ /* Insert address of the new struct into the hash table */
+ bRes = HASH_Insert(gpsVmallocSizeHashTable, uiCpuVAddr, (uintptr_t)psNewVmallocHashEntry);
+ }
OSLockRelease(gpsVmallocSizeHashTableLock);
-
- if (bRes)
+ if (psNewVmallocHashEntry)
{
- PVRSRVStatsIncrMemAllocStat(eAllocType, uiBytes);
+ if (bRes)
+ {
+ PVRSRVStatsIncrMemAllocStat(eAllocType, uiBytes);
+ }
+ else
+ {
+ PVR_DPF((PVR_DBG_ERROR, "*** %s : @ line %d HASH_Insert() failed!!", __FUNCTION__, __LINE__));
+ }
}
else
{
- PVR_DPF((PVR_DBG_ERROR, "*** %s : @ line %d HASH_Insert() failed!!", __FUNCTION__, __LINE__));
+ PVR_DPF((PVR_DBG_ERROR, "*** %s : @ line %d Failed to alloc memory for psNewVmallocHashEntry!!", __FUNCTION__, __LINE__));
}
}
@@ -2144,6 +2212,7 @@ PVRSRVStatsIncrMemAllocStat(PVRSRV_MEM_ALLOC_TYPE eAllocType,
/* Update the memory watermarks... */
switch (eAllocType)
{
+#if !defined(PVR_DISABLE_KMALLOC_MEMSTATS)
case PVRSRV_MEM_ALLOC_TYPE_KMALLOC:
{
INCREASE_STAT_VALUE(psProcessStats, PVRSRV_PROCESS_STAT_TYPE_KMALLOC, (IMG_UINT32)uiBytes);
@@ -2157,7 +2226,11 @@ PVRSRVStatsIncrMemAllocStat(PVRSRV_MEM_ALLOC_TYPE eAllocType,
psProcessStats->ui32StatAllocFlags |= (IMG_UINT32)(1 << (PVRSRV_PROCESS_STAT_TYPE_VMALLOC-PVRSRV_PROCESS_STAT_TYPE_KMALLOC));
}
break;
-
+#else
+ case PVRSRV_MEM_ALLOC_TYPE_KMALLOC:
+ case PVRSRV_MEM_ALLOC_TYPE_VMALLOC:
+ break;
+#endif
case PVRSRV_MEM_ALLOC_TYPE_ALLOC_PAGES_PT_UMA:
{
INCREASE_STAT_VALUE(psProcessStats, PVRSRV_PROCESS_STAT_TYPE_ALLOC_PAGES_PT_UMA, (IMG_UINT32)uiBytes);
@@ -2227,10 +2300,67 @@ PVRSRVStatsIncrMemAllocStat(PVRSRV_MEM_ALLOC_TYPE eAllocType,
}
void
+PVRSRVStatsDecrMemKAllocStat(size_t uiBytes,
+ IMG_PID decrPID)
+{
+#if !defined(PVR_DISABLE_KMALLOC_MEMSTATS)
+ PVRSRV_PROCESS_STATS* psProcessStats;
+
+ /* Don't do anything if we are not initialised or we are shutting down! */
+ if (!bProcessStatsInitialised)
+ {
+ return;
+ }
+
+ _decrease_global_stat(PVRSRV_MEM_ALLOC_TYPE_KMALLOC, uiBytes);
+
+ OSLockAcquire(g_psLinkedListLock);
+
+ psProcessStats = _FindProcessStats(decrPID);
+
+ if (psProcessStats != NULL)
+ {
+ /* Decrement the kmalloc memory stat... */
+ DECREASE_STAT_VALUE(psProcessStats, PVRSRV_PROCESS_STAT_TYPE_KMALLOC, uiBytes);
+ }
+
+ OSLockRelease(g_psLinkedListLock);
+#endif
+}
+
+static void
+_StatsDecrMemVAllocStat(_PVR_STATS_VMALLOC_HASH_ENTRY *psVmallocHashEntry)
+{
+#if !defined(PVR_DISABLE_KMALLOC_MEMSTATS)
+ PVRSRV_PROCESS_STATS* psProcessStats;
+
+ /* Don't do anything if we are not initialised or we are shutting down! */
+ if (!bProcessStatsInitialised)
+ {
+ return;
+ }
+
+ _decrease_global_stat(PVRSRV_MEM_ALLOC_TYPE_VMALLOC, psVmallocHashEntry->uiSizeInBytes);
+
+ OSLockAcquire(g_psLinkedListLock);
+
+ psProcessStats = _FindProcessStats(psVmallocHashEntry->uiPid);
+
+ if (psProcessStats != NULL)
+ {
+ /* Decrement the kmalloc memory stat... */
+ DECREASE_STAT_VALUE(psProcessStats, PVRSRV_PROCESS_STAT_TYPE_VMALLOC, psVmallocHashEntry->uiSizeInBytes);
+ }
+
+ OSLockRelease(g_psLinkedListLock);
+#endif
+}
+
+void
PVRSRVStatsDecrMemAllocStatAndUntrack(PVRSRV_MEM_ALLOC_TYPE eAllocType,
IMG_UINT64 uiCpuVAddr)
{
- size_t uiBytes;
+ _PVR_STATS_VMALLOC_HASH_ENTRY *psVmallocHashEntry = NULL;
if (!bProcessStatsInitialised || (gpsVmallocSizeHashTable == NULL) )
{
@@ -2238,10 +2368,17 @@ PVRSRVStatsDecrMemAllocStatAndUntrack(PVRSRV_MEM_ALLOC_TYPE eAllocType,
}
OSLockAcquire(gpsVmallocSizeHashTableLock);
- uiBytes = HASH_Remove(gpsVmallocSizeHashTable, uiCpuVAddr);
+ psVmallocHashEntry = (_PVR_STATS_VMALLOC_HASH_ENTRY *)HASH_Remove(gpsVmallocSizeHashTable, uiCpuVAddr);
+ if (psVmallocHashEntry)
+ {
+ _StatsDecrMemVAllocStat(psVmallocHashEntry);
+#if defined(__linux__)
+ OSFreeMemNoStats(psVmallocHashEntry);
+#else
+ OSFreeMem(psVmallocHashEntry);
+#endif
+ }
OSLockRelease(gpsVmallocSizeHashTableLock);
-
- PVRSRVStatsDecrMemAllocStat(eAllocType, uiBytes);
}
void
@@ -2289,6 +2426,7 @@ PVRSRVStatsDecrMemAllocStat(PVRSRV_MEM_ALLOC_TYPE eAllocType,
/* Update the memory watermarks... */
switch (eAllocType)
{
+#if !defined(PVR_DISABLE_KMALLOC_MEMSTATS)
case PVRSRV_MEM_ALLOC_TYPE_KMALLOC:
{
DECREASE_STAT_VALUE(psProcessStats, PVRSRV_PROCESS_STAT_TYPE_KMALLOC, (IMG_UINT32)uiBytes);
@@ -2308,7 +2446,11 @@ PVRSRVStatsDecrMemAllocStat(PVRSRV_MEM_ALLOC_TYPE eAllocType,
}
}
break;
-
+#else
+ case PVRSRV_MEM_ALLOC_TYPE_KMALLOC:
+ case PVRSRV_MEM_ALLOC_TYPE_VMALLOC:
+ break;
+#endif
case PVRSRV_MEM_ALLOC_TYPE_ALLOC_PAGES_PT_UMA:
{
DECREASE_STAT_VALUE(psProcessStats, PVRSRV_PROCESS_STAT_TYPE_ALLOC_PAGES_PT_UMA, (IMG_UINT32)uiBytes);
@@ -2641,10 +2783,18 @@ MemStatsPrintElements(void *pvFile,
while (psRecord != NULL)
{
+ IMG_BOOL bPrintStat = IMG_TRUE;
+
switch (psRecord->eAllocType)
{
+#if !defined(PVR_DISABLE_KMALLOC_MEMSTATS)
case PVRSRV_MEM_ALLOC_TYPE_KMALLOC: pfnOSStatsPrintf(pvFile, "KMALLOC "); break;
case PVRSRV_MEM_ALLOC_TYPE_VMALLOC: pfnOSStatsPrintf(pvFile, "VMALLOC "); break;
+#else
+ case PVRSRV_MEM_ALLOC_TYPE_KMALLOC:
+ case PVRSRV_MEM_ALLOC_TYPE_VMALLOC:
+ bPrintStat = IMG_FALSE; break;
+#endif
case PVRSRV_MEM_ALLOC_TYPE_ALLOC_PAGES_PT_LMA: pfnOSStatsPrintf(pvFile, "ALLOC_PAGES_PT_LMA "); break;
case PVRSRV_MEM_ALLOC_TYPE_ALLOC_PAGES_PT_UMA: pfnOSStatsPrintf(pvFile, "ALLOC_PAGES_PT_UMA "); break;
case PVRSRV_MEM_ALLOC_TYPE_IOREMAP_PT_LMA: pfnOSStatsPrintf(pvFile, "IOREMAP_PT_LMA "); break;
@@ -2655,27 +2805,29 @@ MemStatsPrintElements(void *pvFile,
default: pfnOSStatsPrintf(pvFile, "INVALID "); break;
}
- for (ui32ItemNumber = 0; ui32ItemNumber < ui32VAddrFields; ui32ItemNumber++)
+ if (bPrintStat)
{
- pfnOSStatsPrintf(pvFile, "%08x", *(((IMG_UINT32*) &psRecord->pvCpuVAddr) + ui32VAddrFields - ui32ItemNumber - 1));
- }
- pfnOSStatsPrintf(pvFile, " ");
+ for (ui32ItemNumber = 0; ui32ItemNumber < ui32VAddrFields; ui32ItemNumber++)
+ {
+ pfnOSStatsPrintf(pvFile, "%08x", *(((IMG_UINT32*) &psRecord->pvCpuVAddr) + ui32VAddrFields - ui32ItemNumber - 1));
+ }
+ pfnOSStatsPrintf(pvFile, " ");
- for (ui32ItemNumber = 0; ui32ItemNumber < ui32PAddrFields; ui32ItemNumber++)
- {
- pfnOSStatsPrintf(pvFile, "%08x", *(((IMG_UINT32*) &psRecord->sCpuPAddr.uiAddr) + ui32PAddrFields - ui32ItemNumber - 1));
- }
+ for (ui32ItemNumber = 0; ui32ItemNumber < ui32PAddrFields; ui32ItemNumber++)
+ {
+ pfnOSStatsPrintf(pvFile, "%08x", *(((IMG_UINT32*) &psRecord->sCpuPAddr.uiAddr) + ui32PAddrFields - ui32ItemNumber - 1));
+ }
#if defined(PVRSRV_DEBUG_LINUX_MEMORY_STATS) && defined(DEBUG)
- pfnOSStatsPrintf(pvFile, " %u", psRecord->uiBytes);
+ pfnOSStatsPrintf(pvFile, " %u", psRecord->uiBytes);
- pfnOSStatsPrintf(pvFile, " %s", (IMG_CHAR*)psRecord->pvAllocdFromFile);
+ pfnOSStatsPrintf(pvFile, " %s", (IMG_CHAR*)psRecord->pvAllocdFromFile);
- pfnOSStatsPrintf(pvFile, " %d\n", psRecord->ui32AllocdFromLine);
+ pfnOSStatsPrintf(pvFile, " %d\n", psRecord->ui32AllocdFromLine);
#else
- pfnOSStatsPrintf(pvFile, " %u\n", psRecord->uiBytes);
+ pfnOSStatsPrintf(pvFile, " %u\n", psRecord->uiBytes);
#endif
-
+ }
/* Move to next record... */
psRecord = psRecord->psNext;
}
@@ -2818,10 +2970,12 @@ void GlobalStatsPrintElements(void *pvFile,
if (pfnOSGetStatsPrintf != NULL)
{
+#if !defined(PVR_DISABLE_KMALLOC_MEMSTATS)
pfnOSGetStatsPrintf(pvFile, "MemoryUsageKMalloc %10d\n", gsGlobalStats.ui32MemoryUsageKMalloc);
pfnOSGetStatsPrintf(pvFile, "MemoryUsageKMallocMax %10d\n", gsGlobalStats.ui32MemoryUsageKMallocMax);
pfnOSGetStatsPrintf(pvFile, "MemoryUsageVMalloc %10d\n", gsGlobalStats.ui32MemoryUsageVMalloc);
pfnOSGetStatsPrintf(pvFile, "MemoryUsageVMallocMax %10d\n", gsGlobalStats.ui32MemoryUsageVMallocMax);
+#endif
pfnOSGetStatsPrintf(pvFile, "MemoryUsageAllocPTMemoryUMA %10d\n", gsGlobalStats.ui32MemoryUsageAllocPTMemoryUMA);
pfnOSGetStatsPrintf(pvFile, "MemoryUsageAllocPTMemoryUMAMax %10d\n", gsGlobalStats.ui32MemoryUsageAllocPTMemoryUMAMax);
pfnOSGetStatsPrintf(pvFile, "MemoryUsageVMapPTUMA %10d\n", gsGlobalStats.ui32MemoryUsageVMapPTUMA);
diff --git a/drivers/staging/imgtec/rogue/process_stats.h b/drivers/staging/imgtec/rogue/process_stats.h
index 16a2a6dc8697..fce4ff2bf31f 100644
--- a/drivers/staging/imgtec/rogue/process_stats.h
+++ b/drivers/staging/imgtec/rogue/process_stats.h
@@ -122,6 +122,9 @@ void PVRSRVStatsIncrMemAllocStatAndTrack(PVRSRV_MEM_ALLOC_TYPE eAllocType,
void PVRSRVStatsDecrMemAllocStat(PVRSRV_MEM_ALLOC_TYPE eAllocType,
size_t uiBytes);
+void PVRSRVStatsDecrMemKAllocStat(size_t uiBytes,
+ IMG_PID decrPID);
+
/*
* Decrease the memory stat for eAllocType. Takes the allocation size value from the
* hash table with uiCpuVAddr as key. Pair with PVRSRVStatsIncrMemAllocStatAndTrack().
diff --git a/drivers/staging/imgtec/rogue/pvr_dvfs.h b/drivers/staging/imgtec/rogue/pvr_dvfs.h
index c286b836e1ed..a2dd2e10c495 100644
--- a/drivers/staging/imgtec/rogue/pvr_dvfs.h
+++ b/drivers/staging/imgtec/rogue/pvr_dvfs.h
@@ -156,10 +156,6 @@ typedef struct _IMG_DVFS_
IMG_DVFS_GOVERNOR sDVFSGovernor;
IMG_DVFS_DEVICE_CFG sDVFSDeviceCfg;
IMG_DVFS_GOVERNOR_CFG sDVFSGovernorCfg;
-#if defined(PVR_POWER_ACTOR)
- IMG_DVFS_PA sDVFSPA;
- IMG_DVFS_PA_CFG sDVFSPACfg;
-#endif
} PVRSRV_DVFS;
#endif/* (__linux__) */
diff --git a/drivers/staging/imgtec/rogue/rgxccb.c b/drivers/staging/imgtec/rogue/rgxccb.c
index 334f8ac9a745..b4ee50118a47 100644
--- a/drivers/staging/imgtec/rogue/rgxccb.c
+++ b/drivers/staging/imgtec/rogue/rgxccb.c
@@ -111,6 +111,26 @@ IMG_PCHAR aszCCBRequestors[][3] =
static_assert((sizeof(aszCCBRequestors)/(3*sizeof(aszCCBRequestors[0][0]))) == (REQ_TYPE_FIXED_COUNT + DPX_MAX_RAY_CONTEXTS + 1),
"Mismatch between aszCCBRequestors table and DPX_MAX_RAY_CONTEXTS");
+IMG_EXPORT PVRSRV_ERROR RGXCCBPDumpDrainCCB(RGX_CLIENT_CCB *psClientCCB,
+ IMG_BOOL bPDumpContinuous)
+{
+ IMG_UINT32 ui32PDumpFlags;
+
+ ui32PDumpFlags = bPDumpContinuous ? PDUMP_FLAGS_CONTINUOUS : 0;
+
+ PDUMPCOMMENTWITHFLAGS(ui32PDumpFlags,
+ "cCCB(%s@%p): Draining CCB rgxfw_roff == woff (%d)",
+ psClientCCB->szName,
+ psClientCCB,
+ psClientCCB->ui32LastPDumpWriteOffset);
+
+ return DevmemPDumpDevmemPol32(psClientCCB->psClientCCBCtrlMemDesc,
+ offsetof(RGXFWIF_CCCB_CTL, ui32ReadOffset),
+ psClientCCB->ui32LastPDumpWriteOffset,
+ 0xffffffff,
+ PDUMP_POLL_OPERATOR_EQUAL,
+ ui32PDumpFlags);
+}
static PVRSRV_ERROR _RGXCCBPDumpTransition(void **pvData, IMG_BOOL bInto, IMG_BOOL bContinuous)
{
@@ -151,18 +171,9 @@ static PVRSRV_ERROR _RGXCCBPDumpTransition(void **pvData, IMG_BOOL bInto, IMG_BO
thus we have no way of knowing if we can skip drain and the sync
prim dump or not.
*/
- PDUMPCOMMENTWITHFLAGS(ui32PDumpFlags,
- "cCCB(%s@%p): Draining rgxfw_roff == woff (%d)",
- psClientCCB->szName,
- psClientCCB,
- psClientCCB->ui32LastPDumpWriteOffset);
-
- eError = DevmemPDumpDevmemPol32(psClientCCB->psClientCCBCtrlMemDesc,
- offsetof(RGXFWIF_CCCB_CTL, ui32ReadOffset),
- psClientCCB->ui32LastPDumpWriteOffset,
- 0xffffffff,
- PDUMP_POLL_OPERATOR_EQUAL,
- ui32PDumpFlags);
+
+ eError = RGXCCBPDumpDrainCCB(psClientCCB, bContinuous);
+
if (eError != PVRSRV_OK)
{
PVR_DPF((PVR_DBG_WARNING, "_RGXCCBPDumpTransition: problem pdumping POL for cCCBCtl (%d)", eError));
diff --git a/drivers/staging/imgtec/rogue/rgxccb.h b/drivers/staging/imgtec/rogue/rgxccb.h
index fa5d8fd21a2b..8fdd31eafd36 100644
--- a/drivers/staging/imgtec/rogue/rgxccb.h
+++ b/drivers/staging/imgtec/rogue/rgxccb.h
@@ -111,6 +111,8 @@ typedef struct _RGX_CCB_CMD_HELPER_DATA_ {
#define PADDING_COMMAND_SIZE (sizeof(RGXFWIF_CCB_CMD_HEADER))
+PVRSRV_ERROR RGXCCBPDumpDrainCCB(RGX_CLIENT_CCB *psClientCCB,
+ IMG_UINT32 ui32PDumpContinuous);
#define RGX_CCB_REQUESTORS(TYPE) \
/* for debugging purposes */ TYPE(UNDEF) \
diff --git a/drivers/staging/imgtec/rogue/rgxcompute.c b/drivers/staging/imgtec/rogue/rgxcompute.c
index 355f4b5a3ad6..bbdef62b00a1 100644
--- a/drivers/staging/imgtec/rogue/rgxcompute.c
+++ b/drivers/staging/imgtec/rogue/rgxcompute.c
@@ -210,7 +210,7 @@ PVRSRV_ERROR PVRSRVRGXDestroyComputeContextKM(RGX_SERVER_COMPUTE_CONTEXT *psComp
/* Check if the FW has finished with this resource ... */
eError = RGXFWRequestCommonContextCleanUp(psComputeContext->psDeviceNode,
- FWCommonContextGetFWAddress(psComputeContext->psServerCommonContext),
+ psComputeContext->psServerCommonContext,
psComputeContext->psSync,
RGXFWIF_DM_CDM);
diff --git a/drivers/staging/imgtec/rogue/rgxdevice.h b/drivers/staging/imgtec/rogue/rgxdevice.h
index 96fc1cdca384..13de5278ea64 100755
--- a/drivers/staging/imgtec/rogue/rgxdevice.h
+++ b/drivers/staging/imgtec/rogue/rgxdevice.h
@@ -112,10 +112,6 @@ typedef struct _RGXFWIF_GPU_UTIL_STATS_
IMG_UINT64 ui64GpuStatBlocked; /* GPU blocked statistic */
IMG_UINT64 ui64GpuStatIdle; /* GPU idle statistic */
IMG_UINT64 ui64GpuStatCumulative; /* Sum of active/blocked/idle stats */
-
-#if defined(PVR_POWER_ACTOR) && defined (PVR_DVFS)
- IMG_UINT32 ui32GpuEnergy; /* GPU dynamic energy */
-#endif
} RGXFWIF_GPU_UTIL_STATS;
diff --git a/drivers/staging/imgtec/rogue/rgxfwutils.c b/drivers/staging/imgtec/rogue/rgxfwutils.c
index 0ead79d22e38..6c5095da72ce 100644
--- a/drivers/staging/imgtec/rogue/rgxfwutils.c
+++ b/drivers/staging/imgtec/rogue/rgxfwutils.c
@@ -3040,8 +3040,15 @@ PVRSRV_ERROR RGXScheduleCommand(PVRSRV_RGXDEV_INFO *psDevInfo,
if ((eKCCBType == RGXFWIF_DM_3D) || (eKCCBType == RGXFWIF_DM_2D) || (eKCCBType == RGXFWIF_DM_CDM))
{
/* This handles the no operation case */
- OSCPUOperation(psData->uiCacheOp);
- psData->uiCacheOp = PVRSRV_CACHE_OP_NONE;
+ if (OSCPUOperation(psData->uiCacheOp) == PVRSRV_OK)
+ {
+ psData->uiCacheOp = PVRSRV_CACHE_OP_NONE;
+ }
+ else
+ {
+ PVR_DPF((PVR_DBG_ERROR, "RGXScheduleCommand: OSCPUOperation failed"));
+ PVR_ASSERT(0);
+ }
}
#if defined (SUPPORT_VALIDATION)
@@ -3535,14 +3542,22 @@ fail_command:
RGXRequestCommonContextCleanUp
*/
PVRSRV_ERROR RGXFWRequestCommonContextCleanUp(PVRSRV_DEVICE_NODE *psDeviceNode,
- PRGXFWIF_FWCOMMONCONTEXT psFWCommonContextFWAddr,
+ RGX_SERVER_COMMON_CONTEXT *psServerCommonContext,
PVRSRV_CLIENT_SYNC_PRIM *psSyncPrim,
RGXFWIF_DM eDM)
{
RGXFWIF_KCCB_CMD sRCCleanUpCmd = {0};
PVRSRV_ERROR eError;
+ PRGXFWIF_FWCOMMONCONTEXT psFWCommonContextFWAddr;
+
+ psFWCommonContextFWAddr = FWCommonContextGetFWAddress(psServerCommonContext);
+
+ PDUMPCOMMENT("Common ctx cleanup Request DM%d [context = 0x%08x]",
+ eDM, psFWCommonContextFWAddr.ui32Addr);
+ PDUMPCOMMENT("Wait for CCB to be empty before common ctx cleanup");
+
+ RGXCCBPDumpDrainCCB(FWCommonContextGetClientCCB(psServerCommonContext), IMG_FALSE);
- PDUMPCOMMENT("Common ctx cleanup Request DM%d [context = 0x%08x]", eDM, psFWCommonContextFWAddr.ui32Addr);
/* Setup our command data, the cleanup call will fill in the rest */
sRCCleanUpCmd.uCmdData.sCleanupData.uCleanupData.psContext = psFWCommonContextFWAddr;
diff --git a/drivers/staging/imgtec/rogue/rgxfwutils.h b/drivers/staging/imgtec/rogue/rgxfwutils.h
index e9d916cb8431..7b167d3c59cb 100644
--- a/drivers/staging/imgtec/rogue/rgxfwutils.h
+++ b/drivers/staging/imgtec/rogue/rgxfwutils.h
@@ -576,7 +576,7 @@ PVRSRV_ERROR RGXWaitForFWOp(PVRSRV_RGXDEV_INFO *psDevInfo,
******************************************************************************/
PVRSRV_ERROR RGXFWRequestCommonContextCleanUp(PVRSRV_DEVICE_NODE *psDeviceNode,
- PRGXFWIF_FWCOMMONCONTEXT psFWContext,
+ RGX_SERVER_COMMON_CONTEXT *psServerCommonContext,
PVRSRV_CLIENT_SYNC_PRIM *psSyncPrim,
RGXFWIF_DM eDM);
diff --git a/drivers/staging/imgtec/rogue/rgxinit.c b/drivers/staging/imgtec/rogue/rgxinit.c
index e4e26c31b0e0..af4fef7225f7 100755
--- a/drivers/staging/imgtec/rogue/rgxinit.c
+++ b/drivers/staging/imgtec/rogue/rgxinit.c
@@ -391,11 +391,6 @@ static PVRSRV_ERROR RGXGetGpuUtilStats(PVRSRV_DEVICE_NODE *psDeviceNode,
i++;
}
-#if defined(PVR_POWER_ACTOR) && defined(PVR_DVFS)
- /* Power actor enabled */
- psReturnStats->ui32GpuEnergy = psDevInfo->psRGXFWIfTraceBuf->ui32PowMonEnergy;
-#endif
-
OSLockRelease(psDevInfo->hGPUUtilLock);
if (i == MAX_ITERATIONS)
diff --git a/drivers/staging/imgtec/rogue/rgxkicksync.c b/drivers/staging/imgtec/rogue/rgxkicksync.c
index f82b2a349bcc..f81cc9740916 100644
--- a/drivers/staging/imgtec/rogue/rgxkicksync.c
+++ b/drivers/staging/imgtec/rogue/rgxkicksync.c
@@ -145,7 +145,7 @@ PVRSRV_ERROR PVRSRVRGXDestroyKickSyncContextKM(RGX_SERVER_KICKSYNC_CONTEXT * psK
/* Check if the FW has finished with this resource ... */
eError = RGXFWRequestCommonContextCleanUp(psKickSyncContext->psDeviceNode,
- FWCommonContextGetFWAddress(psKickSyncContext->psServerCommonContext),
+ psKickSyncContext->psServerCommonContext,
psKickSyncContext->psSync,
RGXFWIF_DM_3D);
diff --git a/drivers/staging/imgtec/rogue/rgxta3d.c b/drivers/staging/imgtec/rogue/rgxta3d.c
index 064e3a5acd0b..573324189a5c 100644
--- a/drivers/staging/imgtec/rogue/rgxta3d.c
+++ b/drivers/staging/imgtec/rogue/rgxta3d.c
@@ -149,7 +149,7 @@ PVRSRV_ERROR _DestroyTAContext(RGX_SERVER_RC_TA_DATA *psTAData,
/* Check if the FW has finished with this resource ... */
eError = RGXFWRequestCommonContextCleanUp(psDeviceNode,
- FWCommonContextGetFWAddress(psTAData->psServerCommonContext),
+ psTAData->psServerCommonContext,
psCleanupSync,
RGXFWIF_DM_TA);
if (eError == PVRSRV_ERROR_RETRY)
@@ -199,7 +199,7 @@ PVRSRV_ERROR _Destroy3DContext(RGX_SERVER_RC_3D_DATA *ps3DData,
/* Check if the FW has finished with this resource ... */
eError = RGXFWRequestCommonContextCleanUp(psDeviceNode,
- FWCommonContextGetFWAddress(ps3DData->psServerCommonContext),
+ ps3DData->psServerCommonContext,
psCleanupSync,
RGXFWIF_DM_3D);
if (eError == PVRSRV_ERROR_RETRY)
diff --git a/drivers/staging/imgtec/rogue/rgxtransfer.c b/drivers/staging/imgtec/rogue/rgxtransfer.c
index cb8c1f4db6be..72a1fdf86828 100644
--- a/drivers/staging/imgtec/rogue/rgxtransfer.c
+++ b/drivers/staging/imgtec/rogue/rgxtransfer.c
@@ -203,7 +203,7 @@ static PVRSRV_ERROR _Destroy2DTransferContext(RGX_SERVER_TQ_2D_DATA *ps2DData,
/* Check if the FW has finished with this resource ... */
eError = RGXFWRequestCommonContextCleanUp(psDeviceNode,
- FWCommonContextGetFWAddress(ps2DData->psServerCommonContext),
+ ps2DData->psServerCommonContext,
psCleanupSync,
RGXFWIF_DM_2D);
if (eError == PVRSRV_ERROR_RETRY)
@@ -231,7 +231,7 @@ static PVRSRV_ERROR _Destroy3DTransferContext(RGX_SERVER_TQ_3D_DATA *ps3DData,
/* Check if the FW has finished with this resource ... */
eError = RGXFWRequestCommonContextCleanUp(psDeviceNode,
- FWCommonContextGetFWAddress(ps3DData->psServerCommonContext),
+ ps3DData->psServerCommonContext,
psCleanupSync,
RGXFWIF_DM_3D);
if (eError == PVRSRV_ERROR_RETRY)