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
