From: Hitesh K. Patel <[email protected]>

Support the EGL Resource Profileing feature.  This
source contains kernel portion of the source.

Signed-off-by: Yun Tu(Mark Tu) <[email protected]>
Signed-off-by: Hitesh K. Patel <[email protected]>
---
 drivers/staging/mrst/medfield/Makefile             |   17 ++
 drivers/staging/mrst/moorestown/Makefile           |   17 ++
 drivers/staging/mrst/pvr/include4/sgxapi_km.h      |   20 ++
 .../mrst/pvr/services4/include/servicesint.h       |    4 +
 .../srvkm/bridged/sgx/bridged_sgx_bridge.c         |   24 ++-
 .../mrst/pvr/services4/srvkm/common/devicemem.c    |   51 ++++-
 .../mrst/pvr/services4/srvkm/common/lists.c        |    6 +
 .../mrst/pvr/services4/srvkm/common/perproc.c      |   26 ++-
 .../mrst/pvr/services4/srvkm/common/resman.c       |   74 ++++++
 .../pvr/services4/srvkm/devices/sgx/sgxinfokm.h    |    8 +
 .../mrst/pvr/services4/srvkm/devices/sgx/sgxinit.c |  247 +++++++++++++++++++-
 .../mrst/pvr/services4/srvkm/env/linux/osfunc.c    |   11 +
 .../mrst/pvr/services4/srvkm/include/device.h      |    5 +-
 .../mrst/pvr/services4/srvkm/include/lists.h       |    6 +
 .../mrst/pvr/services4/srvkm/include/osfunc.h      |    8 +
 .../mrst/pvr/services4/srvkm/include/perproc.h     |    8 +
 .../mrst/pvr/services4/srvkm/include/resman.h      |   13 +
 17 files changed, 527 insertions(+), 18 deletions(-)

diff --git a/drivers/staging/mrst/medfield/Makefile 
b/drivers/staging/mrst/medfield/Makefile
index ddb4865..2658c22 100644
--- a/drivers/staging/mrst/medfield/Makefile
+++ b/drivers/staging/mrst/medfield/Makefile
@@ -55,6 +55,23 @@ ccflags-y += \
        -DDISABLE_PM \
        -DSUPPORT_SGX_NEW_STATUS_VALS
 
+SUPPORT_EGL_EXTENSIONS ?=1
+ifeq ($(SUPPORT_EGL_EXTENSIONS),1)
+       PVRSRV_RESOURCE_PROFILING = y
+       PERPROC_LIST = y
+       RES_MAN_EXTEND = y
+       PVRSRV_OS_MEM_INFO = y
+else
+       PVRSRV_RESOURCE_PROFILING =
+        PERPROC_LIST =
+        RES_MAN_EXTEND =
+        PVRSRV_OS_MEM_INFO =
+endif
+ccflags-$(PVRSRV_RESOURCE_PROFILING) += -DPVRSRV_RESOURCE_PROFILING
+ccflags-$(PERPROC_LIST) += -DPERPROC_LIST
+ccflags-$(RES_MAN_EXTEND) += -DRES_MAN_EXTEND
+ccflags-$(PVRSRV_OS_MEM_INFO) += -DPVRSRV_OS_MEM_INFO
+
 ccflags-$(CONFIG_DRM_MID_RELEASE) += -DBUILD="\"release\"" 
-DPVR_BUILD_TYPE="\"release\"" -DRELEASE
 ccflags-$(CONFIG_DRM_MID_DEBUG) += -DBUILD="\"debug\"" 
-DPVR_BUILD_TYPE="\"debug\"" -DDEBUG
 ccflags-$(CONFIG_PCI_MSI) += -DCONFIG_PCI_MSI
diff --git a/drivers/staging/mrst/moorestown/Makefile 
b/drivers/staging/mrst/moorestown/Makefile
index d5a2c92..6c748d0 100644
--- a/drivers/staging/mrst/moorestown/Makefile
+++ b/drivers/staging/mrst/moorestown/Makefile
@@ -55,6 +55,23 @@ ccflags-y += \
        -DDISABLE_PM \
        -DSUPPORT_SGX_NEW_STATUS_VALS
 
+SUPPORT_EGL_EXTENSIONS ?=1
+ifeq ($(SUPPORT_EGL_EXTENSIONS),1)
+        PVRSRV_RESOURCE_PROFILING = y
+        PERPROC_LIST = y
+        RES_MAN_EXTEND = y
+        PVRSRV_OS_MEM_INFO = y
+else
+        PVRSRV_RESOURCE_PROFILING =
+        PERPROC_LIST =
+        RES_MAN_EXTEND =
+        PVRSRV_OS_MEM_INFO =
+endif
+ccflags-$(PVRSRV_RESOURCE_PROFILING) += -DPVRSRV_RESOURCE_PROFILING
+ccflags-$(PERPROC_LIST) += -DPERPROC_LIST
+ccflags-$(RES_MAN_EXTEND) += -DRES_MAN_EXTEND
+ccflags-$(PVRSRV_OS_MEM_INFO) += -DPVRSRV_OS_MEM_INFO
+
 ccflags-$(CONFIG_DRM_MID_RELEASE) += -DBUILD="\"release\"" 
-DPVR_BUILD_TYPE="\"release\"" -DRELEASE
 ccflags-$(CONFIG_DRM_MID_DEBUG) += -DBUILD="\"debug\"" 
-DPVR_BUILD_TYPE="\"debug\"" -DDEBUG
 ccflags-$(CONFIG_PCI_MSI) += -DCONFIG_PCI_MSI
diff --git a/drivers/staging/mrst/pvr/include4/sgxapi_km.h 
b/drivers/staging/mrst/pvr/include4/sgxapi_km.h
index db376b6..c3d5181 100644
--- a/drivers/staging/mrst/pvr/include4/sgxapi_km.h
+++ b/drivers/staging/mrst/pvr/include4/sgxapi_km.h
@@ -175,6 +175,11 @@ typedef enum _SGX_MISC_INFO_REQUEST_
        SGX_MISC_INFO_REQUEST_SPM,
        SGX_MISC_INFO_REQUEST_ACTIVEPOWER,
        SGX_MISC_INFO_REQUEST_LOCKUPS,
+#if defined(PVRSRV_RESOURCE_PROFILING)
+       SGX_MISC_INFO_RESOURCEPROF_SIMPLE,
+       SGX_MISC_INFO_RESOURCEPROF_GLOBAL,
+       SGX_MISC_INFO_RESOURCEPROF_MEM_INFO,
+#endif
        SGX_MISC_INFO_REQUEST_FORCE_I16                                 =  
0x7fff
 } SGX_MISC_INFO_REQUEST;
 
@@ -265,6 +270,17 @@ typedef struct _PVRSRV_SGX_MISCINFO_SET_HWPERF_STATUS
        #endif 
 } PVRSRV_SGX_MISCINFO_SET_HWPERF_STATUS;
 
+#if defined(PVRSRV_RESOURCE_PROFILING)
+#define MAX_PROC 80
+typedef struct _PVRSRV_SGX_RESOURCE_INFO
+{
+       IMG_UINT32  ui32TotalMem;
+       IMG_UINT32  ui32UsedMem;
+       IMG_UINT32  aui32ProcMem[MAX_PROC][3];
+       IMG_UINT32  ui32ProcCnt;
+} PVRSRV_SGX_RESOURCE_INFO;
+#endif
+
 
 typedef struct _SGX_MISC_INFO_
 {
@@ -286,6 +302,10 @@ typedef struct _SGX_MISC_INFO_
                SGX_BREAKPOINT_INFO                                             
                        sSGXBreakpointInfo;
 #endif
                PVRSRV_SGX_MISCINFO_SET_HWPERF_STATUS                           
sSetHWPerfStatus;
+#if defined(PVRSRV_RESOURCE_PROFILING)
+               PVRSRV_SGX_RESOURCE_INFO                sSGXResourceInfo;
+               PVRSRV_CLIENT_MEM_INFO                  sSGXResProfMemInfo;
+#endif
        } uData;
 } SGX_MISC_INFO;
 
diff --git a/drivers/staging/mrst/pvr/services4/include/servicesint.h 
b/drivers/staging/mrst/pvr/services4/include/servicesint.h
index 44328e1..225be0c 100644
--- a/drivers/staging/mrst/pvr/services4/include/servicesint.h
+++ b/drivers/staging/mrst/pvr/services4/include/servicesint.h
@@ -47,6 +47,7 @@ extern "C" {
 #define MIN(a,b)                                       min(a,b)
 #endif
 
+
 typedef enum _PVRSRV_MEMTYPE_
 {
        PVRSRV_MEMTYPE_UNKNOWN          = 0,
@@ -274,6 +275,9 @@ PVRSRVMapMemInfoMem(const PVRSRV_CONNECTION *psConnection,
                     IMG_HANDLE hKernelMemInfo,
                     PVRSRV_CLIENT_MEM_INFO **ppsClientMemInfo);
 
+#if defined(PVRSRV_RESOURCE_PROFILING)
+PVRSRV_KERNEL_MEM_INFO* PVRSRVGetMapMemInfo(IMG_VOID *psMap);
+#endif
 
 #if defined (__cplusplus)
 }
diff --git 
a/drivers/staging/mrst/pvr/services4/srvkm/bridged/sgx/bridged_sgx_bridge.c 
b/drivers/staging/mrst/pvr/services4/srvkm/bridged/sgx/bridged_sgx_bridge.c
index e1b7320..f4e1870 100644
--- a/drivers/staging/mrst/pvr/services4/srvkm/bridged/sgx/bridged_sgx_bridge.c
+++ b/drivers/staging/mrst/pvr/services4/srvkm/bridged/sgx/bridged_sgx_bridge.c
@@ -740,7 +740,29 @@ SGXGetMiscInfoBW(IMG_UINT32 ui32BridgeID,
                }
        }
 
-       
+#if defined(PVRSRV_RESOURCE_PROFILING)
+       if (psSGXGetMiscInfoIN->psMiscInfo->eRequest == 
SGX_MISC_INFO_RESOURCEPROF_MEM_INFO)
+       {
+               NEW_HANDLE_BATCH_OR_ERROR(psRetOUT->eError, psPerProc, 1);
+               if (psRetOUT->eError != PVRSRV_OK)
+               {       /*PVR_LOG(("RESOURCE_PROFILING: batch handle 
fail\n"));*/
+                       return -EFAULT;
+               }
+               PVRSRVAllocHandleNR(psPerProc->psHandleBase,
+                                                 
&sMiscInfo.uData.sSGXResProfMemInfo.hKernelMemInfo,
+                                                 psDevInfo->psResProfMemInfo,
+                                                 
PVRSRV_HANDLE_TYPE_SHARED_SYS_MEM_INFO,
+                                                 
PVRSRV_HANDLE_ALLOC_FLAG_SHARED);
+
+               COMMIT_HANDLE_BATCH_OR_ERROR(psRetOUT->eError, psPerProc);
+               if (psRetOUT->eError != PVRSRV_OK)
+               {
+                       /*PVR_LOG(("RESOURCE_PROFILING: batch commit 
fail\n"));*/
+                       return -EFAULT;
+               }
+       }
+#endif
+
        psRetOUT->eError = CopyToUserWrapper(psPerProc,
                                             ui32BridgeID,
                                             psSGXGetMiscInfoIN->psMiscInfo,
diff --git a/drivers/staging/mrst/pvr/services4/srvkm/common/devicemem.c 
b/drivers/staging/mrst/pvr/services4/srvkm/common/devicemem.c
index aeba0de..f0a7908 100644
--- a/drivers/staging/mrst/pvr/services4/srvkm/common/devicemem.c
+++ b/drivers/staging/mrst/pvr/services4/srvkm/common/devicemem.c
@@ -377,7 +377,6 @@ static PVRSRV_ERROR FreeDeviceMem2(PVRSRV_KERNEL_MEM_INFO 
*psMemInfo, IMG_BOOL b
 
        hBuffer = psMemInfo->sMemBlk.hBuffer;
 
-       
        if (bFromAllocator)
                BM_Free(hBuffer, psMemInfo->ui32Flags);
        else
@@ -393,7 +392,6 @@ static PVRSRV_ERROR FreeDeviceMem2(PVRSRV_KERNEL_MEM_INFO 
*psMemInfo, IMG_BOOL b
 
        if (psMemInfo->ui32RefCount == 0)
                OSFreeMem(PVRSRV_PAGEABLE_SELECT, 
sizeof(PVRSRV_KERNEL_MEM_INFO), psMemInfo, IMG_NULL);
-       
 
        return(PVRSRV_OK);
 }
@@ -408,7 +406,6 @@ static PVRSRV_ERROR FreeDeviceMem(PVRSRV_KERNEL_MEM_INFO 
*psMemInfo)
        }
 
        hBuffer = psMemInfo->sMemBlk.hBuffer;
-
        
        BM_Free(hBuffer, psMemInfo->ui32Flags);
 
@@ -551,6 +548,10 @@ static PVRSRV_ERROR 
FreeMemCallBackCommon(PVRSRV_KERNEL_MEM_INFO *psMemInfo,
                                                                                
  IMG_BOOL      bFromAllocator)
 {
        PVRSRV_ERROR eError = PVRSRV_OK;
+#if defined(PVRSRV_RESOURCE_PROFILING)
+       PVRSRV_DEVICE_NODE *psDeviceNode;
+       IMG_SIZE_T ui32Size;
+#endif
 
        PVR_UNREFERENCED_PARAMETER(ui32Param);
 
@@ -593,15 +594,32 @@ static PVRSRV_ERROR 
FreeMemCallBackCommon(PVRSRV_KERNEL_MEM_INFO *psMemInfo,
                        case PVRSRV_MEMTYPE_WRAPPED:
                                freeWrapped(psMemInfo);
                        case PVRSRV_MEMTYPE_DEVICE:
+#if defined(PVRSRV_RESOURCE_PROFILING)
+                               psDeviceNode = ((BM_BUF 
*)psMemInfo->sMemBlk.hBuffer)->pMapping->pBMHeap->pBMContext->psDeviceNode;
+                               if (psDeviceNode->pfnResProfCB)
+                               {
+                                       
psDeviceNode->pfnResProfCB((IMG_PVOID)psDeviceNode, psMemInfo->ui32AllocSize, 
IMG_FALSE);
+                               }
+#endif
                                if (psMemInfo->psKernelSyncInfo)
                                {
                                        
psMemInfo->psKernelSyncInfo->ui32RefCount--;
 
                                        if 
(psMemInfo->psKernelSyncInfo->ui32RefCount == 0)
                                        {
+#if defined(PVRSRV_RESOURCE_PROFILING)
+                                               ui32Size = 
psMemInfo->psKernelSyncInfo->psSyncDataMemInfoKM->ui32AllocSize;
+#endif
                                                eError = 
PVRSRVFreeSyncInfoKM(psMemInfo->psKernelSyncInfo);
+#if defined(PVRSRV_RESOURCE_PROFILING)
+                                               if (eError == PVRSRV_OK && 
psDeviceNode->pfnResProfCB)
+                                               {
+                                                       
psDeviceNode->pfnResProfCB((IMG_PVOID)psDeviceNode, ui32Size, IMG_FALSE);
+                                               }
+#endif
                                        }
                                }
+
                        case PVRSRV_MEMTYPE_DEVICECLASS:
                                break;
                        default:
@@ -621,7 +639,6 @@ static PVRSRV_ERROR FreeDeviceMemCallBack(IMG_PVOID         
pvParam,
                                                                                
  IMG_UINT32    ui32Param)
 {
        PVRSRV_KERNEL_MEM_INFO  *psMemInfo = (PVRSRV_KERNEL_MEM_INFO *)pvParam;
-
        return FreeMemCallBackCommon(psMemInfo, ui32Param, IMG_TRUE);
 }
 
@@ -696,6 +713,12 @@ PVRSRV_ERROR IMG_CALLCONV 
_PVRSRVAllocDeviceMemKM(IMG_HANDLE                                       
hDevCookie,
                return eError;
        }
 
+#if defined(PVRSRV_RESOURCE_PROFILING)
+       psBMHeap = (BM_HEAP*)hDevMemHeap;
+       if (psBMHeap->pBMContext->psDeviceNode->pfnResProfCB)
+               psBMHeap->pBMContext->psDeviceNode->pfnResProfCB(hDevCookie, 
psMemInfo->ui32AllocSize, IMG_TRUE);
+#endif
+
        if (ui32Flags & PVRSRV_MEM_NO_SYNCOBJ)
        {
                psMemInfo->psKernelSyncInfo = IMG_NULL;
@@ -715,6 +738,11 @@ PVRSRV_ERROR IMG_CALLCONV 
_PVRSRVAllocDeviceMemKM(IMG_HANDLE                                       
hDevCookie,
                        goto free_mainalloc;
                }
                psMemInfo->psKernelSyncInfo->ui32RefCount++;
+#if defined(PVRSRV_RESOURCE_PROFILING)
+               if (psBMHeap->pBMContext->psDeviceNode->pfnResProfCB)
+                       
psBMHeap->pBMContext->psDeviceNode->pfnResProfCB(hDevCookie,
+                                               
psMemInfo->psKernelSyncInfo->psSyncDataMemInfoKM->ui32AllocSize, IMG_TRUE);
+#endif
        }
 
        
@@ -749,6 +777,11 @@ PVRSRV_ERROR IMG_CALLCONV 
_PVRSRVAllocDeviceMemKM(IMG_HANDLE                                       
hDevCookie,
        return (PVRSRV_OK);
 
 free_mainalloc:
+#if defined(PVRSRV_RESOURCE_PROFILING)
+       if (psBMHeap->pBMContext->psDeviceNode->pfnResProfCB)
+               psBMHeap->pBMContext->psDeviceNode->pfnResProfCB(hDevCookie,
+                                       
psMemInfo->psKernelSyncInfo->psSyncDataMemInfoKM->ui32AllocSize, IMG_FALSE);
+#endif
        FreeDeviceMem(psMemInfo);
 
        return eError;
@@ -1562,3 +1595,13 @@ ErrorExitPhase1:
        return eError;
 }
 
+#if defined(PVRSRV_RESOURCE_PROFILING)
+PVRSRV_KERNEL_MEM_INFO* PVRSRVGetMapMemInfo(IMG_VOID *psMap)
+{
+       RESMAN_MAP_DEVICE_MEM_DATA      *psMapData = psMap;
+       if (psMapData)
+               return psMapData->psMemInfo;
+       else
+               return IMG_NULL;
+}
+#endif
diff --git a/drivers/staging/mrst/pvr/services4/srvkm/common/lists.c 
b/drivers/staging/mrst/pvr/services4/srvkm/common/lists.c
index cb54071..a4ba7c1 100644
--- a/drivers/staging/mrst/pvr/services4/srvkm/common/lists.c
+++ b/drivers/staging/mrst/pvr/services4/srvkm/common/lists.c
@@ -54,6 +54,12 @@ IMPLEMENT_LIST_ANY_VA_2(PVRSRV_POWER_DEV, PVRSRV_ERROR, 
PVRSRV_OK)
 IMPLEMENT_LIST_INSERT(PVRSRV_POWER_DEV)
 IMPLEMENT_LIST_REMOVE(PVRSRV_POWER_DEV)
 
+#if defined(PERPROC_LIST)
+IMPLEMENT_LIST_FOR_EACH_VA(PVRSRV_PER_PROCESS_DATA);
+IMPLEMENT_LIST_INSERT(PVRSRV_PER_PROCESS_DATA);
+IMPLEMENT_LIST_REMOVE(PVRSRV_PER_PROCESS_DATA);
+#endif
+
 
 IMG_VOID* MatchDeviceKM_AnyVaCb(PVRSRV_DEVICE_NODE* psDeviceNode, va_list va)
 {
diff --git a/drivers/staging/mrst/pvr/services4/srvkm/common/perproc.c 
b/drivers/staging/mrst/pvr/services4/srvkm/common/perproc.c
index d7f9524..3e7a31b 100644
--- a/drivers/staging/mrst/pvr/services4/srvkm/common/perproc.c
+++ b/drivers/staging/mrst/pvr/services4/srvkm/common/perproc.c
@@ -29,11 +29,15 @@
 #include "handle.h"
 #include "perproc.h"
 #include "osperproc.h"
-
+#if defined(PERPROC_LIST)
+#include "lists.h"
+#endif
 #define        HASH_TAB_INIT_SIZE 32
 
 static HASH_TABLE *psHashTab = IMG_NULL;
-
+#if defined(PERPROC_LIST)
+static PVRSRV_PER_PROCESS_DATA *psPerProcList = IMG_NULL;
+#endif
 static PVRSRV_ERROR FreePerProcessData(PVRSRV_PER_PROCESS_DATA *psPerProc)
 {
        PVRSRV_ERROR eError;
@@ -59,7 +63,10 @@ static PVRSRV_ERROR 
FreePerProcessData(PVRSRV_PER_PROCESS_DATA *psPerProc)
                PVR_ASSERT((PVRSRV_PER_PROCESS_DATA *)uiPerProc == psPerProc);
                PVR_ASSERT(((PVRSRV_PER_PROCESS_DATA *)uiPerProc)->ui32PID == 
psPerProc->ui32PID);
        }
-
+#if defined(PERPROC_LIST)
+       List_PVRSRV_PER_PROCESS_DATA_Remove(psPerProc);
+       /*PVR_LOG(("MarkTu free perproce %d\n", psPerProc->ui32PID));*/
+#endif
 
        if (psPerProc->psHandleBase != IMG_NULL)
        {
@@ -151,10 +158,14 @@ PVRSRV_ERROR PVRSRVPerProcessDataConnect(IMG_UINT32       
ui32PID, IMG_UINT32 ui32Flag
                        eError = PVRSRV_ERROR_INSERT_HASH_TABLE_DATA_FAILED;
                        goto failure;
                }
-
                psPerProc->ui32PID = ui32PID;
                psPerProc->ui32RefCount = 0;
 
+#if defined(PERPROC_LIST)
+               List_PVRSRV_PER_PROCESS_DATA_Insert(&psPerProcList, psPerProc);
+               /*PVR_LOG(("MarkTupsperproc %d\n", ui32PID));*/
+#endif
+
 #if defined(SUPPORT_PDUMP_MULTI_PROCESS)
                if (ui32Flags == SRV_FLAGS_PDUMP_ACTIVE)
                {
@@ -290,3 +301,10 @@ PVRSRV_ERROR PVRSRVPerProcessDataDeInit(IMG_VOID)
        return PVRSRV_OK;
 }
 
+#if defined(PERPROC_LIST)
+/*only used by PVRSRV_RESOURCE_PROFILING now*/
+PVRSRV_PER_PROCESS_DATA* PVRSRVPerProcessList(IMG_VOID)
+{
+       return  psPerProcList;
+}
+#endif
diff --git a/drivers/staging/mrst/pvr/services4/srvkm/common/resman.c 
b/drivers/staging/mrst/pvr/services4/srvkm/common/resman.c
index 5d865a7..dd7b6c5 100644
--- a/drivers/staging/mrst/pvr/services4/srvkm/common/resman.c
+++ b/drivers/staging/mrst/pvr/services4/srvkm/common/resman.c
@@ -733,4 +733,78 @@ static IMG_VOID ValidateResList(PRESMAN_LIST psResList)
 }
 #endif 
 
+#ifdef RES_MAN_EXTEND
 
+IMG_PVOID PVRSRVGetResData(PRESMAN_ITEM psResItem)
+{
+       if (psResItem)
+               return psResItem->pvParam;
+       else
+               return IMG_NULL;
+}
+
+static IMG_VOID* PickResourceByCriteria_AnyVaCb(RESMAN_ITEM *psCurItem, 
va_list va)
+{
+       IMG_UINT32 ui32SearchCriteria;
+       IMG_UINT32 ui32ResType;
+       IMG_PVOID pvParam;
+       IMG_UINT32 ui32Param;
+
+       ui32SearchCriteria = va_arg(va, IMG_UINT32);
+       ui32ResType = va_arg(va, IMG_UINT32);
+       pvParam = va_arg(va, IMG_PVOID);
+       ui32Param = va_arg(va, IMG_UINT32);
+
+
+       if(
+
+               (((ui32SearchCriteria & RESMAN_CRITERIA_RESTYPE) == 0UL) ||
+               (psCurItem->ui32ResType == ui32ResType))
+       &&
+
+               (((ui32SearchCriteria & RESMAN_CRITERIA_PVOID_PARAM) == 0UL) ||
+                        (psCurItem->pvParam == pvParam))
+       &&
+
+               (((ui32SearchCriteria & RESMAN_CRITERIA_UI32_PARAM) == 0UL) ||
+                        (psCurItem->ui32Param == ui32Param))
+               )
+       {
+               return psCurItem;
+       }
+       else
+       {
+               return IMG_NULL;
+       }
+}
+
+PVRSRV_ERROR PVRSRVResManAnyByCriteria(PRESMAN_CONTEXT psResManContext,
+                                       IMG_UINT32 ui32SearchCriteria,
+                                       IMG_UINT32              ui32ResType,
+                                       IMG_PVOID               pvParam,
+                                       IMG_UINT32              ui32Param,
+                                       PVRSRV_ERROR(*pfnCallBack)(PRESMAN_ITEM 
psRes, va_list va), ...)
+{
+       PRESMAN_ITEM    psCurItem;
+       PVRSRV_ERROR    eError = PVRSRV_OK;
+       va_list ap;
+
+       psCurItem = psResManContext->psResItemList;
+       while((psCurItem = (PRESMAN_ITEM)
+                               List_RESMAN_ITEM_Any_va(psCurItem,
+                                                       
&PickResourceByCriteria_AnyVaCb,
+                                                       ui32SearchCriteria,
+                                                       ui32ResType,
+                                                       pvParam,
+                                                       ui32Param)) != IMG_NULL
+                       && eError == PVRSRV_OK)
+       {
+               va_start(ap, pfnCallBack);
+               eError = pfnCallBack(psCurItem, ap);
+               va_end(ap);
+               psCurItem = psCurItem->psNext;
+       }
+
+       return eError;
+}
+#endif
diff --git a/drivers/staging/mrst/pvr/services4/srvkm/devices/sgx/sgxinfokm.h 
b/drivers/staging/mrst/pvr/services4/srvkm/devices/sgx/sgxinfokm.h
index 056db35..e662df0 100644
--- a/drivers/staging/mrst/pvr/services4/srvkm/devices/sgx/sgxinfokm.h
+++ b/drivers/staging/mrst/pvr/services4/srvkm/devices/sgx/sgxinfokm.h
@@ -228,6 +228,11 @@ typedef struct _PVRSRV_SGXDEV_INFO_
 #endif
        IMG_UINT32                              asSGXDevData[SGX_MAX_DEV_DATA];
 
+#if defined(PVRSRV_RESOURCE_PROFILING)
+       PVRSRV_KERNEL_MEM_INFO*                  psResProfMemInfo;
+       IMG_UINT32*                              pui32UsedMem;
+
+#endif
 } PVRSRV_SGXDEV_INFO;
 
 
@@ -274,6 +279,9 @@ typedef struct _SGX_DEVICE_MAP_
        
        SGX_TIMING_INFORMATION  sTimingInfo;
 #endif
+#if defined(PVRSRV_RESOURCE_PROFILING)
+       IMG_UINT32              ui32MemThreshold;
+#endif
 #if defined(PDUMP)
        
        IMG_CHAR                                *pszPDumpDevName;
diff --git a/drivers/staging/mrst/pvr/services4/srvkm/devices/sgx/sgxinit.c 
b/drivers/staging/mrst/pvr/services4/srvkm/devices/sgx/sgxinit.c
index f822eb8..ac21785 100644
--- a/drivers/staging/mrst/pvr/services4/srvkm/devices/sgx/sgxinit.c
+++ b/drivers/staging/mrst/pvr/services4/srvkm/devices/sgx/sgxinit.c
@@ -105,7 +105,6 @@ static IMG_UINT32 DeinitDevInfo(PVRSRV_SGXDEV_INFO 
*psDevInfo)
 
                OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_SGX_CCB_INFO), 
psDevInfo->psKernelCCBInfo, IMG_NULL);
        }
-
        return PVRSRV_OK;
 }
 
@@ -166,6 +165,7 @@ static PVRSRV_ERROR InitDevInfo(PVRSRV_PER_PROCESS_DATA 
*psPerProc,
        
        psDevInfo->sSGXStructSizes = psInitInfo->sSGXStructSizes;
 
+
        
 
        eError = OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
@@ -548,7 +548,37 @@ static PVRSRV_ERROR DevInitSGXPart1 (IMG_VOID 
*pvDeviceNode)
                PVR_DPF((PVR_DBG_ERROR,"DevInitSGX : Failed to alloc memory for 
BIF reset"));
                return eError;
        }
-
+#if defined(PVRSRV_RESOURCE_PROFILING)
+       if(OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
+                                 sizeof(PVRSRV_KERNEL_MEM_INFO),
+                                 (IMG_VOID **)&psDevInfo->psResProfMemInfo, 
IMG_NULL,
+                                 "Res Memory Info") != PVRSRV_OK)
+       {
+               PVR_DPF((PVR_DBG_ERROR,"InitDevInfo: Failed to alloc memory for 
meminfo"));
+               return PVRSRV_ERROR_OUT_OF_MEMORY;
+       }
+       OSMemSet(psDevInfo->psResProfMemInfo, 0, 
sizeof(*psDevInfo->psResProfMemInfo));
+       psDevInfo->psResProfMemInfo->ui32Flags |= PVRSRV_HAP_MULTI_PROCESS | 
PVRSRV_HAP_UNCACHED;
+       psDevInfo->psResProfMemInfo->ui32AllocSize = sizeof(IMG_UINT32);
+       if(OSAllocPages(psDevInfo->psResProfMemInfo->ui32Flags,
+                               psDevInfo->psResProfMemInfo->ui32AllocSize,
+                               HOST_PAGESIZE(),
+                               &psDevInfo->psResProfMemInfo->pvLinAddrKM,
+                               
&psDevInfo->psResProfMemInfo->sMemBlk.hOSMemHandle)
+                               != PVRSRV_OK)
+       {
+               PVR_DPF((PVR_DBG_ERROR, "InitDevInfo: Failed to alloc memory 
for block"));
+               OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
+                                 sizeof(PVRSRV_KERNEL_MEM_INFO),
+                                 psDevInfo->psResProfMemInfo,
+                                 0);
+               return PVRSRV_ERROR_OUT_OF_MEMORY;
+       }
+       psDevInfo->pui32UsedMem = psDevInfo->psResProfMemInfo->pvLinAddrKM;
+       if(psDevInfo->pui32UsedMem == IMG_NULL)
+               PVR_LOG(("InitDevInfo:res kernel mem info has no kernel 
address"));
+       *psDevInfo->pui32UsedMem = 0;
+#endif
        return PVRSRV_OK;
 }
 
@@ -592,8 +622,6 @@ PVRSRV_ERROR DevInitSGXPart2KM (PVRSRV_PER_PROCESS_DATA 
*psPerProc,
        psDeviceNode = (PVRSRV_DEVICE_NODE *)hDevHandle;
        psDevInfo = (PVRSRV_SGXDEV_INFO *)psDeviceNode->pvDevice;
 
-       
-
        eError = InitDevInfo(psPerProc, psDeviceNode, psInitInfo);
        if (eError != PVRSRV_OK)
        {
@@ -763,6 +791,16 @@ static PVRSRV_ERROR DevDeInitSGX (IMG_VOID *pvDeviceNode)
 
        DeinitDevInfo(psDevInfo);
 
+#if defined(PVRSRV_RESOURCE_PROFILING)
+               if (psDevInfo->psResProfMemInfo != IMG_NULL)
+               {
+                       OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
+                                         sizeof(PVRSRV_KERNEL_MEM_INFO),
+                                         psDevInfo->psResProfMemInfo,
+                                         0);
+               }
+               psDevInfo->pui32UsedMem = IMG_NULL;
+#endif
        
        psDeviceMemoryHeap = (DEVICE_MEMORY_HEAP_INFO 
*)psDevInfo->pvDeviceMemoryHeap;
        for(ui32Heap=0; ui32Heap<psDeviceNode->sDevMemoryInfo.ui32HeapCount; 
ui32Heap++)
@@ -1371,7 +1409,186 @@ PVRSRV_ERROR SGX_FreeMemTilingRange(PVRSRV_DEVICE_NODE 
*psDeviceNode,
 }
 #endif
 
+#if defined(PVRSRV_RESOURCE_PROFILING)
+static
+PVRSRV_ERROR SGXAccumlateMapRes(PRESMAN_ITEM psRes, va_list va)
+{
+       PVRSRV_DEVICE_NODE *psDeviceNode = IMG_NULL;
+       IMG_UINT32 *pui32UsedPrivateMem = IMG_NULL, *pui32UsedSharedMem = 
IMG_NULL;
+       PVRSRV_KERNEL_MEM_INFO  *psMemInfo;
+       BM_BUF  *psBuf;
+       psDeviceNode = va_arg(va, PVRSRV_DEVICE_NODE*);
+       pui32UsedPrivateMem = va_arg(va, IMG_UINT32*);
+       pui32UsedSharedMem = va_arg(va, IMG_UINT32*);
+       if (!psDeviceNode || !pui32UsedPrivateMem || !pui32UsedSharedMem) {
+               PVR_LOG(("DBGRESPROF:wrong prarmeter\n"));
+               return PVRSRV_ERROR_INVALID_PARAMS;
+       }
+       /*if (psRes->ui32ResType != RESMAN_TYPE_DEVICEMEM_MAPPING)
+               PVR_LOG(("DBGRESPROF:wrong resource type\n"));*/
+
+       psMemInfo = PVRSRVGetMapMemInfo(PVRSRVGetResData(psRes));
+       psBuf = psMemInfo->sMemBlk.hBuffer;
+       if (psDeviceNode == psBuf->pMapping->pBMHeap->pBMContext->psDeviceNode)
+       {
+               *pui32UsedSharedMem += psMemInfo->ui32AllocSize;
+               if (psMemInfo->psKernelSyncInfo)
+                       *pui32UsedSharedMem += 
psMemInfo->psKernelSyncInfo->psSyncDataMemInfoKM->ui32AllocSize;
+       }
+       return PVRSRV_OK;
+}
+static
+PVRSRV_ERROR SGXAccumlateAllocRes(PRESMAN_ITEM psRes, va_list va)
+{
+       PVRSRV_DEVICE_NODE *psDeviceNode = IMG_NULL;
+       IMG_UINT32 *pui32UsedPrivateMem = IMG_NULL, *pui32UsedExportedMem = 
IMG_NULL;
+       PVRSRV_KERNEL_MEM_INFO  *psMemInfo;
+       BM_BUF  *psBuf;
+       psDeviceNode = va_arg(va, PVRSRV_DEVICE_NODE*);
+       pui32UsedPrivateMem = va_arg(va, IMG_UINT32*);
+       pui32UsedExportedMem = va_arg(va, IMG_UINT32*);
+       if (!psDeviceNode || !pui32UsedPrivateMem || !pui32UsedExportedMem) {
+               PVR_LOG(("DBGRESPROF:wrong prarmeter\n"));
+               return PVRSRV_ERROR_INVALID_PARAMS;
+       }
+       /*if (psRes->ui32ResType != RESMAN_TYPE_DEVICEMEM_ALLOCATION)
+               PVR_LOG(("DBGRESPROF:wrong resource type\n"));*/
+
+       psMemInfo = PVRSRVGetResData(psRes);
+       psBuf = psMemInfo->sMemBlk.hBuffer;
+       if (psDeviceNode == psBuf->pMapping->pBMHeap->pBMContext->psDeviceNode)
+       {
+               if (psBuf->ui32ExportCount)
+               {
+                       *pui32UsedExportedMem += psMemInfo->ui32AllocSize;
+                       if (psMemInfo->psKernelSyncInfo)
+                               *pui32UsedExportedMem += 
psMemInfo->psKernelSyncInfo->psSyncDataMemInfoKM->ui32AllocSize;
+               }
+               else
+               {
+                       *pui32UsedPrivateMem += psMemInfo->ui32AllocSize;
+                       if (psMemInfo->psKernelSyncInfo)
+                               *pui32UsedPrivateMem += 
psMemInfo->psKernelSyncInfo->psSyncDataMemInfoKM->ui32AllocSize;
+               }
+       }
+
+       return PVRSRV_OK;
+}
+
+
+static
+IMG_VOID SGXAccumlateUsedMem(PVRSRV_PER_PROCESS_DATA* psProc, va_list va)
+{
+       PVRSRV_DEVICE_NODE *psDeviceNode;
+       SGX_MISC_INFO *psMiscInfo;
+       IMG_UINT32 ui32UsedPrivateMem = 0, ui32UsedSharedMem = 0, 
ui32UsedExportedMem = 0;
+       PVRSRV_SGX_RESOURCE_INFO *psSGXResInfo;
+       psDeviceNode = va_arg(va, PVRSRV_DEVICE_NODE*);
+       psMiscInfo = va_arg(va, SGX_MISC_INFO*);
+       psSGXResInfo = &psMiscInfo->uData.sSGXResourceInfo;
+
+       PVRSRVResManAnyByCriteria(psProc->hResManContext, 
RESMAN_CRITERIA_RESTYPE, RESMAN_TYPE_DEVICEMEM_ALLOCATION, 0,
+                                       0, &SGXAccumlateAllocRes, psDeviceNode, 
&ui32UsedPrivateMem, &ui32UsedExportedMem);
+       PVRSRVResManAnyByCriteria(psProc->hResManContext, 
RESMAN_CRITERIA_RESTYPE, RESMAN_TYPE_DEVICEMEM_MAPPING, 0,
+                                       0, &SGXAccumlateMapRes, psDeviceNode, 
&ui32UsedPrivateMem, &ui32UsedSharedMem);
+       psSGXResInfo->ui32UsedMem += ui32UsedPrivateMem;
+       psSGXResInfo->ui32UsedMem += ui32UsedExportedMem;
+       /*PVR_LOG(("MarkTu ID:%d, used:%d, shared:%d\n", psProc->ui32PID, 
ui32UsedPrivateMem, ui32UsedSharedMem));*/
+       if ((psMiscInfo->eRequest == SGX_MISC_INFO_RESOURCEPROF_GLOBAL) &&
+               (ui32UsedPrivateMem || ui32UsedSharedMem) &&
+               (psSGXResInfo->ui32ProcCnt < MAX_PROC))
+       {
+               psSGXResInfo->aui32ProcMem[psSGXResInfo->ui32ProcCnt][0] = 
psProc->ui32PID;
+               psSGXResInfo->aui32ProcMem[psSGXResInfo->ui32ProcCnt][1] = 
ui32UsedPrivateMem;
+               psSGXResInfo->aui32ProcMem[psSGXResInfo->ui32ProcCnt][2] = 
ui32UsedExportedMem + ui32UsedSharedMem;
+               psSGXResInfo->ui32ProcCnt++;
+       }
+       if(psSGXResInfo->ui32ProcCnt >= MAX_PROC)
+               PVR_LOG(("DBGRESPROF:Maxiam process number exceed\n"));
+
+}
+static
+PVRSRV_ERROR SGXGetResourceProfile(SGX_MISC_INFO *psMiscInfo, 
PVRSRV_DEVICE_NODE *psDeviceNode)
+{
+       PVRSRV_MEM_INFO sMemInfo;
+       IMG_UINT32 ui32FreeMem;
+       PVRSRV_PER_PROCESS_DATA* psPerProcList;
+       PVRSRV_SGXDEV_INFO *psDevInfo = psDeviceNode->pvDevice;
+       if (!psMiscInfo || !psDeviceNode)
+               return PVRSRV_ERROR_INVALID_PARAMS;
+       OSGetMemoryInfo(&sMemInfo);
+       ui32FreeMem = sMemInfo.ui32FreeMem / 2;
+       OSMemSet(&psMiscInfo->uData.sSGXResourceInfo, 
0,sizeof(psMiscInfo->uData.sSGXResourceInfo));
+       psPerProcList = PVRSRVPerProcessList();
+       List_PVRSRV_PER_PROCESS_DATA_ForEach_va(psPerProcList,
+                                               &SGXAccumlateUsedMem,
+                                               psDeviceNode,
+                                               psMiscInfo);
+       if(psMiscInfo->uData.sSGXResourceInfo.ui32UsedMem != 
*psDevInfo->pui32UsedMem)
+       {
+               PVR_LOG(("Usedmem:cal:%d;stat:%d\n", 
psMiscInfo->uData.sSGXResourceInfo.ui32UsedMem,
+                       *psDevInfo->pui32UsedMem));
+       }
+       psMiscInfo->uData.sSGXResourceInfo.ui32TotalMem = ui32FreeMem + 
psMiscInfo->uData.sSGXResourceInfo.ui32UsedMem;
+
+       return PVRSRV_OK;
+}
 
+static
+PVRSRV_ERROR SGXGetResProfMemInfo(SGX_MISC_INFO *psMiscInfo, 
PVRSRV_DEVICE_NODE *psDeviceNode)
+{
+       PVRSRV_CLIENT_MEM_INFO                  *psSGXResProfMemInfo;
+       PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo = ((PVRSRV_SGXDEV_INFO 
*)psDeviceNode->pvDevice)->psResProfMemInfo;
+       psSGXResProfMemInfo = &psMiscInfo->uData.sSGXResProfMemInfo;
+       OSMemSet(psSGXResProfMemInfo,
+                        0,
+                        sizeof(*psSGXResProfMemInfo));
+
+       psSGXResProfMemInfo->pvLinAddrKM =
+                       psKernelMemInfo->pvLinAddrKM;
+
+       psSGXResProfMemInfo->pvLinAddr = 0;
+       psSGXResProfMemInfo->ui32Flags =
+               psKernelMemInfo->ui32Flags;
+       psSGXResProfMemInfo->ui32AllocSize =
+               psKernelMemInfo->ui32AllocSize;
+       psSGXResProfMemInfo->hMappingInfo = 
psKernelMemInfo->sMemBlk.hOSMemHandle;
+       return PVRSRV_OK;
+}
+
+static PVRSRV_ERROR SGXResProfiling(IMG_VOID *pvDeviceNode, IMG_UINT32 
ui32AllocedMem, IMG_BOOL bAlloc)
+{
+       PVRSRV_DEVICE_NODE *psDeviceNode = (PVRSRV_DEVICE_NODE*)pvDeviceNode;
+       PVRSRV_SGXDEV_INFO *psDevInfo = psDeviceNode->pvDevice;
+       SYS_DATA* psSysData = IMG_NULL;
+       IMG_HANDLE hOSEventKM;
+
+       if (!psDevInfo || psDeviceNode->sDevId.eDeviceType != 
PVRSRV_DEVICE_TYPE_SGX)
+       {
+               PVR_LOG(("SGXResProfiling:invalid psDevInfo or invaid device 
type"));
+               return PVRSRV_ERROR_INVALID_PARAMS;
+       }
+       if(bAlloc)
+       {
+               *psDevInfo->pui32UsedMem += ui32AllocedMem;
+       }
+       else
+       {
+               *psDevInfo->pui32UsedMem -= ui32AllocedMem;
+       }
+       SysAcquireData(&psSysData);
+       if (psSysData->psGlobalEventObject)
+       {
+               hOSEventKM = psSysData->psGlobalEventObject->hOSEventKM;
+               if(hOSEventKM)
+               {
+                       OSEventObjectSignal(hOSEventKM);
+               }
+       }
+       return PVRSRV_OK;
+}
+
+#endif
 PVRSRV_ERROR SGXRegisterDevice (PVRSRV_DEVICE_NODE *psDeviceNode)
 {
        DEVICE_MEMORY_INFO *psDevMemoryInfo;
@@ -1433,7 +1650,9 @@ PVRSRV_ERROR SGXRegisterDevice (PVRSRV_DEVICE_NODE 
*psDeviceNode)
        psDeviceNode->pfnFreeMemTilingRange = SGX_FreeMemTilingRange;
 #endif
 
-       
+#if defined(PVRSRV_RESOURCE_PROFILING)
+       psDeviceNode->pfnResProfCB = &SGXResProfiling;
+#endif
 
        psDeviceNode->pfnDeviceCommandComplete = &SGXCommandComplete;
 
@@ -2024,8 +2243,6 @@ PVRSRV_ERROR SGXGetMiscInfoUkernel(PVRSRV_SGXDEV_INFO     
*psDevInfo,
        return PVRSRV_OK;
 }
 
-
-
 IMG_EXPORT
 PVRSRV_ERROR SGXGetMiscInfoKM(PVRSRV_SGXDEV_INFO       *psDevInfo,
                                                          SGX_MISC_INFO         
        *psMiscInfo,
@@ -2503,7 +2720,21 @@ PVRSRV_ERROR SGXGetMiscInfoKM(PVRSRV_SGXDEV_INFO 
*psDevInfo,
 
                        return PVRSRV_OK;
                }
-
+#if defined(PVRSRV_RESOURCE_PROFILING)
+               case SGX_MISC_INFO_RESOURCEPROF_SIMPLE:
+               case SGX_MISC_INFO_RESOURCEPROF_GLOBAL:
+               {
+                       PVR_LOG(("User requested resource profiling"));
+                       SGXGetResourceProfile(psMiscInfo, psDeviceNode);
+                       return PVRSRV_OK;
+               }
+               case SGX_MISC_INFO_RESOURCEPROF_MEM_INFO:
+               {
+                       PVR_LOG(("User requested resource mem info"));
+                       SGXGetResProfMemInfo(psMiscInfo, psDeviceNode);
+                       return PVRSRV_OK;
+               }
+#endif
                default:
                {
                        
diff --git a/drivers/staging/mrst/pvr/services4/srvkm/env/linux/osfunc.c 
b/drivers/staging/mrst/pvr/services4/srvkm/env/linux/osfunc.c
index da47823..fe7b7a0 100644
--- a/drivers/staging/mrst/pvr/services4/srvkm/env/linux/osfunc.c
+++ b/drivers/staging/mrst/pvr/services4/srvkm/env/linux/osfunc.c
@@ -2965,3 +2965,14 @@ IMG_VOID PVROSFuncDeInit(IMG_VOID)
     }
 #endif
 }
+#ifdef PVRSRV_OS_MEM_INFO
+IMG_VOID OSGetMemoryInfo(PVRSRV_MEM_INFO * psMemInfo)
+{
+       struct sysinfo si;
+       long cached;
+       si_meminfo(&si);
+       cached = global_page_state(NR_FILE_PAGES);
+       psMemInfo->ui32FreeMem = (cached + si.freeram) << PAGE_SHIFT;
+       psMemInfo->ui32TotalMem = si.totalram;
+}
+#endif
diff --git a/drivers/staging/mrst/pvr/services4/srvkm/include/device.h 
b/drivers/staging/mrst/pvr/services4/srvkm/include/device.h
index bed2351..3b8ff54 100644
--- a/drivers/staging/mrst/pvr/services4/srvkm/include/device.h
+++ b/drivers/staging/mrst/pvr/services4/srvkm/include/device.h
@@ -265,7 +265,10 @@ typedef struct _PVRSRV_DEVICE_NODE_
        
        struct _PVRSRV_DEVICE_NODE_     *psNext;
        struct _PVRSRV_DEVICE_NODE_     **ppsThis;
-       
+#if defined(PVRSRV_RESOURCE_PROFILING)
+       PVRSRV_ERROR                     (*pfnResProfCB)(IMG_VOID  
*psDeviceNode, IMG_UINT32 ui32AllocedMem, IMG_BOOL bAlloc);
+#endif
+
 #if defined(PDUMP)
        
        PVRSRV_ERROR                    (*pfnPDumpInitDevice)(struct 
_PVRSRV_DEVICE_NODE_ *psDeviceNode);
diff --git a/drivers/staging/mrst/pvr/services4/srvkm/include/lists.h 
b/drivers/staging/mrst/pvr/services4/srvkm/include/lists.h
index 0d74788..3c9501f 100644
--- a/drivers/staging/mrst/pvr/services4/srvkm/include/lists.h
+++ b/drivers/staging/mrst/pvr/services4/srvkm/include/lists.h
@@ -229,6 +229,12 @@ DECLARE_LIST_ANY_VA_2(PVRSRV_POWER_DEV, PVRSRV_ERROR, 
PVRSRV_OK);
 DECLARE_LIST_INSERT(PVRSRV_POWER_DEV);
 DECLARE_LIST_REMOVE(PVRSRV_POWER_DEV);
 
+#if defined(PERPROC_LIST)
+DECLARE_LIST_FOR_EACH_VA(PVRSRV_PER_PROCESS_DATA);
+DECLARE_LIST_INSERT(PVRSRV_PER_PROCESS_DATA);
+DECLARE_LIST_REMOVE(PVRSRV_PER_PROCESS_DATA);
+#endif
+
 #undef DECLARE_LIST_ANY_2
 #undef DECLARE_LIST_ANY_VA
 #undef DECLARE_LIST_ANY_VA_2
diff --git a/drivers/staging/mrst/pvr/services4/srvkm/include/osfunc.h 
b/drivers/staging/mrst/pvr/services4/srvkm/include/osfunc.h
index 8ffbea6..e0d07ab 100644
--- a/drivers/staging/mrst/pvr/services4/srvkm/include/osfunc.h
+++ b/drivers/staging/mrst/pvr/services4/srvkm/include/osfunc.h
@@ -567,7 +567,15 @@ static INLINE IMG_VOID OSWriteMemoryBarrier(IMG_VOID) { }
 static INLINE IMG_VOID OSMemoryBarrier(IMG_VOID) { }
 
 #endif 
+#ifdef PVRSRV_OS_MEM_INFO
+typedef struct
+{
+       IMG_UINT32 ui32TotalMem;
+       IMG_UINT32 ui32FreeMem;
+} PVRSRV_MEM_INFO;
 
+IMG_VOID OSGetMemoryInfo(PVRSRV_MEM_INFO * psMemInfo);
+#endif
 #if defined (__cplusplus)
 }
 #endif
diff --git a/drivers/staging/mrst/pvr/services4/srvkm/include/perproc.h 
b/drivers/staging/mrst/pvr/services4/srvkm/include/perproc.h
index 37359d5..1921e88 100644
--- a/drivers/staging/mrst/pvr/services4/srvkm/include/perproc.h
+++ b/drivers/staging/mrst/pvr/services4/srvkm/include/perproc.h
@@ -61,6 +61,10 @@ typedef struct _PVRSRV_PER_PROCESS_DATA_
 #endif
        
        IMG_HANDLE              hOsPrivateData;
+#if defined(PERPROC_LIST)
+       struct _PVRSRV_PER_PROCESS_DATA_ *psNext;
+       struct _PVRSRV_PER_PROCESS_DATA_ **ppsThis;
+#endif
 } PVRSRV_PER_PROCESS_DATA;
 
 PVRSRV_PER_PROCESS_DATA *PVRSRVPerProcessData(IMG_UINT32 ui32PID);
@@ -109,6 +113,10 @@ IMG_HANDLE PVRSRVFindPerProcessPrivateData(IMG_VOID)
        return PVRSRVProcessPrivateData(PVRSRVFindPerProcessData());
 }
 
+#if defined(PERPROC_LIST)
+PVRSRV_PER_PROCESS_DATA* PVRSRVPerProcessList(IMG_VOID);
+#endif
+
 #if defined (__cplusplus)
 }
 #endif
diff --git a/drivers/staging/mrst/pvr/services4/srvkm/include/resman.h 
b/drivers/staging/mrst/pvr/services4/srvkm/include/resman.h
index eebec57..7a326fa 100644
--- a/drivers/staging/mrst/pvr/services4/srvkm/include/resman.h
+++ b/drivers/staging/mrst/pvr/services4/srvkm/include/resman.h
@@ -31,6 +31,10 @@
 extern "C" {
 #endif
 
+#ifdef RES_MAN_EXTEND
+#include <stdarg.h>
+#endif
+
 enum {
        
        RESMAN_TYPE_SHARED_PB_DESC = 1,                                 
@@ -105,6 +109,15 @@ PVRSRV_ERROR PVRSRVResManConnect(IMG_HANDLE                
        hPerProc,
                                                                 
PRESMAN_CONTEXT        *phResManContext);
 IMG_VOID PVRSRVResManDisconnect(PRESMAN_CONTEXT hResManContext,
                                                                IMG_BOOL        
        bKernelContext);
+#ifdef RES_MAN_EXTEND
+PVRSRV_ERROR PVRSRVResManAnyByCriteria(PRESMAN_CONTEXT psResManContext,
+                                       IMG_UINT32 ui32SearchCriteria,
+                                       IMG_UINT32              ui32ResType,
+                                       IMG_PVOID               pvParam,
+                                       IMG_UINT32              ui32Param,
+                                       PVRSRV_ERROR(*pfnCallBack)(PRESMAN_ITEM 
psRes, va_list va), ...);
+IMG_PVOID PVRSRVGetResData(PRESMAN_ITEM psResItem);
+#endif
 
 #if defined (__cplusplus)
 }
-- 
1.7.1

_______________________________________________
MeeGo-kernel mailing list
[email protected]
http://lists.meego.com/listinfo/meego-kernel

Reply via email to