diff options
Diffstat (limited to 'drivers/gpu/drm/emgd/pvr/services4/srvkm/common/queue.c')
-rw-r--r-- | drivers/gpu/drm/emgd/pvr/services4/srvkm/common/queue.c | 1165 |
1 files changed, 0 insertions, 1165 deletions
diff --git a/drivers/gpu/drm/emgd/pvr/services4/srvkm/common/queue.c b/drivers/gpu/drm/emgd/pvr/services4/srvkm/common/queue.c deleted file mode 100644 index bfef74720ee7..000000000000 --- a/drivers/gpu/drm/emgd/pvr/services4/srvkm/common/queue.c +++ /dev/null @@ -1,1165 +0,0 @@ -/********************************************************************** - * - * Copyright(c) 2008 Imagination Technologies Ltd. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful but, except - * as otherwise stated in writing, without any warranty; without even the - * implied warranty of merchantability or fitness for a particular purpose. - * See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - * - * Contact Information: - * Imagination Technologies Ltd. <gpl-support@imgtec.com> - * Home Park Estate, Kings Langley, Herts, WD4 8LZ, UK - * - ******************************************************************************/ - -#include "services_headers.h" - -#include "lists.h" - -DECLARE_LIST_FOR_EACH(PVRSRV_DEVICE_NODE); - -#if defined(__linux__) && defined(__KERNEL__) - -#include "proc.h" - -static IMG_INT -QueuePrintCommands (PVRSRV_QUEUE_INFO * psQueue, IMG_CHAR * buffer, size_t size) -{ - off_t off = 0; - IMG_INT cmds = 0; - IMG_SIZE_T ui32ReadOffset = psQueue->ui32ReadOffset; - IMG_SIZE_T ui32WriteOffset = psQueue->ui32WriteOffset; - PVRSRV_COMMAND * psCmd; - - while (ui32ReadOffset != ui32WriteOffset) - { - psCmd= (PVRSRV_COMMAND *)((IMG_UINTPTR_T)psQueue->pvLinQueueKM + ui32ReadOffset); - - off = printAppend(buffer, size, off, "%p %p %5lu %6lu %3lu %5lu %2lu %2lu %3lu \n", - psQueue, - psCmd, - psCmd->ui32ProcessID, - psCmd->CommandType, - psCmd->ui32CmdSize, - psCmd->ui32DevIndex, - psCmd->ui32DstSyncCount, - psCmd->ui32SrcSyncCount, - psCmd->ui32DataSize); - - ui32ReadOffset += psCmd->ui32CmdSize; - ui32ReadOffset &= psQueue->ui32QueueSize - 1; - cmds++; - } - if (cmds == 0) - off = printAppend(buffer, size, off, "%p <empty>\n", psQueue); - return off; -} - - - -#ifdef PVR_PROC_USE_SEQ_FILE - -void ProcSeqShowQueue(struct seq_file *sfile,void* el) -{ - PVRSRV_QUEUE_INFO * psQueue = (PVRSRV_QUEUE_INFO*)el; - IMG_INT cmds = 0; - IMG_SIZE_T ui32ReadOffset; - IMG_SIZE_T ui32WriteOffset; - PVRSRV_COMMAND * psCmd; - - if(el == PVR_PROC_SEQ_START_TOKEN) - { - seq_printf( sfile, - "Command Queues\n" - "Queue CmdPtr Pid Command Size DevInd DSC SSC #Data ...\n"); - return; - } - - ui32ReadOffset = psQueue->ui32ReadOffset; - ui32WriteOffset = psQueue->ui32WriteOffset; - - while (ui32ReadOffset != ui32WriteOffset) - { - psCmd= (PVRSRV_COMMAND *)((IMG_UINTPTR_T)psQueue->pvLinQueueKM + ui32ReadOffset); - - seq_printf(sfile, "%p %p %5lu %6lu %3lu %5lu %2lu %2lu %3lu \n", - psQueue, - psCmd, - psCmd->ui32ProcessID, - psCmd->CommandType, - psCmd->ui32CmdSize, - psCmd->ui32DevIndex, - psCmd->ui32DstSyncCount, - psCmd->ui32SrcSyncCount, - psCmd->ui32DataSize); - - ui32ReadOffset += psCmd->ui32CmdSize; - ui32ReadOffset &= psQueue->ui32QueueSize - 1; - cmds++; - } - - if (cmds == 0) - seq_printf(sfile, "%p <empty>\n", psQueue); -} - -void* ProcSeqOff2ElementQueue(struct seq_file * sfile, loff_t off) -{ - PVRSRV_QUEUE_INFO * psQueue; - SYS_DATA * psSysData; - - if(!off) - { - return PVR_PROC_SEQ_START_TOKEN; - } - - - SysAcquireData(&psSysData); - - for (psQueue = psSysData->psQueueList; (((--off) > 0) && (psQueue != IMG_NULL)); psQueue = psQueue->psNextKM); - return psQueue; -} - -#endif - -off_t -QueuePrintQueues (IMG_CHAR * buffer, size_t size, off_t off) -{ - SYS_DATA * psSysData; - PVRSRV_QUEUE_INFO * psQueue; - - SysAcquireData(&psSysData); - - if (!off) - return printAppend (buffer, size, 0, - "Command Queues\n" - "Queue CmdPtr Pid Command Size DevInd DSC SSC #Data ...\n"); - - - - for (psQueue = psSysData->psQueueList; (((--off) > 0) && (psQueue != IMG_NULL)); psQueue = psQueue->psNextKM) - ; - - return psQueue ? QueuePrintCommands (psQueue, buffer, size) : END_OF_FILE; -} -#endif - -#define GET_SPACE_IN_CMDQ(psQueue) \ - (((psQueue->ui32ReadOffset - psQueue->ui32WriteOffset) \ - + (psQueue->ui32QueueSize - 1)) & (psQueue->ui32QueueSize - 1)) - -#define UPDATE_QUEUE_WOFF(psQueue, ui32Size) \ - psQueue->ui32WriteOffset = (psQueue->ui32WriteOffset + ui32Size) \ - & (psQueue->ui32QueueSize - 1); - -#define SYNCOPS_STALE(ui32OpsComplete, ui32OpsPending) \ - (ui32OpsComplete >= ui32OpsPending) - - -DECLARE_LIST_FOR_EACH(PVRSRV_DEVICE_NODE); - -static IMG_VOID QueueDumpCmdComplete(COMMAND_COMPLETE_DATA *psCmdCompleteData, - IMG_UINT32 i, - IMG_BOOL bIsSrc) -{ - PVRSRV_SYNC_OBJECT *psSyncObject; - - psSyncObject = bIsSrc ? psCmdCompleteData->psSrcSync : psCmdCompleteData->psDstSync; - - if (psCmdCompleteData->bInUse) - { - PVR_LOG(("\t%s %lu: ROC DevVAddr:0x%lX ROP:0x%lx ROC:0x%lx, WOC DevVAddr:0x%lX WOP:0x%lx WOC:0x%lx", - bIsSrc ? "SRC" : "DEST", i, - psSyncObject[i].psKernelSyncInfoKM->sReadOpsCompleteDevVAddr.uiAddr, - psSyncObject[i].psKernelSyncInfoKM->psSyncData->ui32ReadOpsPending, - psSyncObject[i].psKernelSyncInfoKM->psSyncData->ui32ReadOpsComplete, - psSyncObject[i].psKernelSyncInfoKM->sWriteOpsCompleteDevVAddr.uiAddr, - psSyncObject[i].psKernelSyncInfoKM->psSyncData->ui32WriteOpsPending, - psSyncObject[i].psKernelSyncInfoKM->psSyncData->ui32WriteOpsComplete)); - } - else - { - PVR_LOG(("\t%s %lu: (Not in use)", bIsSrc ? "SRC" : "DEST", i)); - } -} - - -static IMG_VOID QueueDumpDebugInfo_ForEachCb(PVRSRV_DEVICE_NODE *psDeviceNode) -{ - if (psDeviceNode->sDevId.eDeviceClass == PVRSRV_DEVICE_CLASS_DISPLAY) - { - IMG_UINT32 i; - SYS_DATA *psSysData; - COMMAND_COMPLETE_DATA **ppsCmdCompleteData; - COMMAND_COMPLETE_DATA *psCmdCompleteData; - - SysAcquireData(&psSysData); - - ppsCmdCompleteData = psSysData->ppsCmdCompleteData[psDeviceNode->sDevId.ui32DeviceIndex]; - - if (ppsCmdCompleteData != IMG_NULL) - { - psCmdCompleteData = ppsCmdCompleteData[DC_FLIP_COMMAND]; - - PVR_LOG(("Command Complete Data for display device %lu:", psDeviceNode->sDevId.ui32DeviceIndex)); - - for (i = 0; i < psCmdCompleteData->ui32SrcSyncCount; i++) - { - QueueDumpCmdComplete(psCmdCompleteData, i, IMG_TRUE); - } - - for (i = 0; i < psCmdCompleteData->ui32DstSyncCount; i++) - { - QueueDumpCmdComplete(psCmdCompleteData, i, IMG_FALSE); - } - } - else - { - PVR_LOG(("There is no Command Complete Data for display device %u", psDeviceNode->sDevId.ui32DeviceIndex)); - } - } -} - - -IMG_VOID QueueDumpDebugInfo(IMG_VOID) -{ - SYS_DATA *psSysData; - SysAcquireData(&psSysData); - List_PVRSRV_DEVICE_NODE_ForEach(psSysData->psDeviceNodeList, QueueDumpDebugInfo_ForEachCb); -} - - -IMG_SIZE_T NearestPower2(IMG_SIZE_T ui32Value) -{ - IMG_SIZE_T ui32Temp, ui32Result = 1; - - if(!ui32Value) - return 0; - - ui32Temp = ui32Value - 1; - while(ui32Temp) - { - ui32Result <<= 1; - ui32Temp >>= 1; - } - - return ui32Result; -} - - -IMG_EXPORT -PVRSRV_ERROR IMG_CALLCONV PVRSRVCreateCommandQueueKM(IMG_SIZE_T ui32QueueSize, - PVRSRV_QUEUE_INFO **ppsQueueInfo) -{ - PVRSRV_QUEUE_INFO *psQueueInfo; - IMG_SIZE_T ui32Power2QueueSize = NearestPower2(ui32QueueSize); - SYS_DATA *psSysData; - PVRSRV_ERROR eError; - IMG_HANDLE hMemBlock; - - SysAcquireData(&psSysData); - - - if(OSAllocMem(PVRSRV_OS_NON_PAGEABLE_HEAP, - sizeof(PVRSRV_QUEUE_INFO), - (IMG_VOID **)&psQueueInfo, &hMemBlock, - "Queue Info") != PVRSRV_OK) - { - PVR_DPF((PVR_DBG_ERROR,"PVRSRVCreateCommandQueueKM: Failed to alloc queue struct")); - goto ErrorExit; - } - OSMemSet(psQueueInfo, 0, sizeof(PVRSRV_QUEUE_INFO)); - - psQueueInfo->hMemBlock[0] = hMemBlock; - psQueueInfo->ui32ProcessID = OSGetCurrentProcessIDKM(); - - - if(OSAllocMem(PVRSRV_OS_NON_PAGEABLE_HEAP, - ui32Power2QueueSize + PVRSRV_MAX_CMD_SIZE, - &psQueueInfo->pvLinQueueKM, &hMemBlock, - "Command Queue") != PVRSRV_OK) - { - PVR_DPF((PVR_DBG_ERROR,"PVRSRVCreateCommandQueueKM: Failed to alloc queue buffer")); - goto ErrorExit; - } - - psQueueInfo->hMemBlock[1] = hMemBlock; - psQueueInfo->pvLinQueueUM = psQueueInfo->pvLinQueueKM; - - - PVR_ASSERT(psQueueInfo->ui32ReadOffset == 0); - PVR_ASSERT(psQueueInfo->ui32WriteOffset == 0); - - psQueueInfo->ui32QueueSize = ui32Power2QueueSize; - - - if (psSysData->psQueueList == IMG_NULL) - { - eError = OSCreateResource(&psSysData->sQProcessResource); - if (eError != PVRSRV_OK) - { - goto ErrorExit; - } - } - - - if (OSLockResource(&psSysData->sQProcessResource, - KERNEL_ID) != PVRSRV_OK) - { - goto ErrorExit; - } - - psQueueInfo->psNextKM = psSysData->psQueueList; - psSysData->psQueueList = psQueueInfo; - - if (OSUnlockResource(&psSysData->sQProcessResource, KERNEL_ID) != PVRSRV_OK) - { - goto ErrorExit; - } - - *ppsQueueInfo = psQueueInfo; - - return PVRSRV_OK; - -ErrorExit: - - if(psQueueInfo) - { - if(psQueueInfo->pvLinQueueKM) - { - OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP, - psQueueInfo->ui32QueueSize, - psQueueInfo->pvLinQueueKM, - psQueueInfo->hMemBlock[1]); - psQueueInfo->pvLinQueueKM = IMG_NULL; - } - - OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP, - sizeof(PVRSRV_QUEUE_INFO), - psQueueInfo, - psQueueInfo->hMemBlock[0]); - - } - - return PVRSRV_ERROR_GENERIC; -} - - -IMG_EXPORT -PVRSRV_ERROR IMG_CALLCONV PVRSRVDestroyCommandQueueKM(PVRSRV_QUEUE_INFO *psQueueInfo) -{ - PVRSRV_QUEUE_INFO *psQueue; - SYS_DATA *psSysData; - PVRSRV_ERROR eError; - IMG_BOOL bTimeout = IMG_TRUE; - - SysAcquireData(&psSysData); - - psQueue = psSysData->psQueueList; - - LOOP_UNTIL_TIMEOUT(MAX_HW_TIME_US) - { - if(psQueueInfo->ui32ReadOffset == psQueueInfo->ui32WriteOffset) - { - bTimeout = IMG_FALSE; - break; - } - OSWaitus(MAX_HW_TIME_US/WAIT_TRY_COUNT); - } END_LOOP_UNTIL_TIMEOUT(); - - if (bTimeout) - { - - PVR_DPF((PVR_DBG_ERROR,"PVRSRVDestroyCommandQueueKM : Failed to empty queue")); - eError = PVRSRV_ERROR_CANNOT_FLUSH_QUEUE; - goto ErrorExit; - } - - - eError = OSLockResource(&psSysData->sQProcessResource, - KERNEL_ID); - if (eError != PVRSRV_OK) - { - goto ErrorExit; - } - - if(psQueue == psQueueInfo) - { - psSysData->psQueueList = psQueueInfo->psNextKM; - - OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP, - NearestPower2(psQueueInfo->ui32QueueSize) + PVRSRV_MAX_CMD_SIZE, - psQueueInfo->pvLinQueueKM, - psQueueInfo->hMemBlock[1]); - psQueueInfo->pvLinQueueKM = IMG_NULL; - OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP, - sizeof(PVRSRV_QUEUE_INFO), - psQueueInfo, - psQueueInfo->hMemBlock[0]); - - psQueueInfo = IMG_NULL; - } - else - { - while(psQueue) - { - if(psQueue->psNextKM == psQueueInfo) - { - psQueue->psNextKM = psQueueInfo->psNextKM; - - OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP, - psQueueInfo->ui32QueueSize, - psQueueInfo->pvLinQueueKM, - psQueueInfo->hMemBlock[1]); - psQueueInfo->pvLinQueueKM = IMG_NULL; - OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP, - sizeof(PVRSRV_QUEUE_INFO), - psQueueInfo, - psQueueInfo->hMemBlock[0]); - - psQueueInfo = IMG_NULL; - break; - } - psQueue = psQueue->psNextKM; - } - - if(!psQueue) - { - eError = OSUnlockResource(&psSysData->sQProcessResource, KERNEL_ID); - if (eError != PVRSRV_OK) - { - goto ErrorExit; - } - eError = PVRSRV_ERROR_INVALID_PARAMS; - goto ErrorExit; - } - } - - - eError = OSUnlockResource(&psSysData->sQProcessResource, KERNEL_ID); - if (eError != PVRSRV_OK) - { - goto ErrorExit; - } - - - if (psSysData->psQueueList == IMG_NULL) - { - eError = OSDestroyResource(&psSysData->sQProcessResource); - if (eError != PVRSRV_OK) - { - goto ErrorExit; - } - } - -ErrorExit: - - return eError; -} - - -IMG_EXPORT -PVRSRV_ERROR IMG_CALLCONV PVRSRVGetQueueSpaceKM(PVRSRV_QUEUE_INFO *psQueue, - IMG_SIZE_T ui32ParamSize, - IMG_VOID **ppvSpace) -{ - IMG_BOOL bTimeout = IMG_TRUE; - - - ui32ParamSize = (ui32ParamSize+3) & 0xFFFFFFFC; - - if (ui32ParamSize > PVRSRV_MAX_CMD_SIZE) - { - PVR_DPF((PVR_DBG_WARNING,"PVRSRVGetQueueSpace: max command size is %d bytes", PVRSRV_MAX_CMD_SIZE)); - return PVRSRV_ERROR_CMD_TOO_BIG; - } - - LOOP_UNTIL_TIMEOUT(MAX_HW_TIME_US) - { - if (GET_SPACE_IN_CMDQ(psQueue) > ui32ParamSize) - { - bTimeout = IMG_FALSE; - break; - } - OSWaitus(MAX_HW_TIME_US/WAIT_TRY_COUNT); - } END_LOOP_UNTIL_TIMEOUT(); - - if (bTimeout == IMG_TRUE) - { - *ppvSpace = IMG_NULL; - - return PVRSRV_ERROR_CANNOT_GET_QUEUE_SPACE; - } - else - { - *ppvSpace = (IMG_VOID *)((IMG_UINTPTR_T)psQueue->pvLinQueueUM + psQueue->ui32WriteOffset); - } - - return PVRSRV_OK; -} - - -IMG_EXPORT -PVRSRV_ERROR IMG_CALLCONV PVRSRVInsertCommandKM(PVRSRV_QUEUE_INFO *psQueue, - PVRSRV_COMMAND **ppsCommand, - IMG_UINT32 ui32DevIndex, - IMG_UINT16 CommandType, - IMG_UINT32 ui32DstSyncCount, - PVRSRV_KERNEL_SYNC_INFO *apsDstSync[], - IMG_UINT32 ui32SrcSyncCount, - PVRSRV_KERNEL_SYNC_INFO *apsSrcSync[], - IMG_SIZE_T ui32DataByteSize ) -{ - PVRSRV_ERROR eError; - PVRSRV_COMMAND *psCommand; - IMG_SIZE_T ui32CommandSize; - IMG_UINT32 i; - - - ui32DataByteSize = (ui32DataByteSize + 3UL) & ~3UL; - - - ui32CommandSize = sizeof(PVRSRV_COMMAND) - + ((ui32DstSyncCount + ui32SrcSyncCount) * sizeof(PVRSRV_SYNC_OBJECT)) - + ui32DataByteSize; - - - eError = PVRSRVGetQueueSpaceKM (psQueue, ui32CommandSize, (IMG_VOID**)&psCommand); - if(eError != PVRSRV_OK) - { - return eError; - } - - psCommand->ui32ProcessID = OSGetCurrentProcessIDKM(); - - - psCommand->ui32CmdSize = ui32CommandSize; - psCommand->ui32DevIndex = ui32DevIndex; - psCommand->CommandType = CommandType; - psCommand->ui32DstSyncCount = ui32DstSyncCount; - psCommand->ui32SrcSyncCount = ui32SrcSyncCount; - - - psCommand->psDstSync = (PVRSRV_SYNC_OBJECT*)(((IMG_UINTPTR_T)psCommand) + sizeof(PVRSRV_COMMAND)); - - - psCommand->psSrcSync = (PVRSRV_SYNC_OBJECT*)(((IMG_UINTPTR_T)psCommand->psDstSync) - + (ui32DstSyncCount * sizeof(PVRSRV_SYNC_OBJECT))); - - psCommand->pvData = (PVRSRV_SYNC_OBJECT*)(((IMG_UINTPTR_T)psCommand->psSrcSync) - + (ui32SrcSyncCount * sizeof(PVRSRV_SYNC_OBJECT))); - psCommand->ui32DataSize = ui32DataByteSize; - - - for (i=0; i<ui32DstSyncCount; i++) - { - psCommand->psDstSync[i].psKernelSyncInfoKM = apsDstSync[i]; - psCommand->psDstSync[i].ui32WriteOpsPending = PVRSRVGetWriteOpsPending(apsDstSync[i], IMG_FALSE); - psCommand->psDstSync[i].ui32ReadOpsPending = PVRSRVGetReadOpsPending(apsDstSync[i], IMG_FALSE); - - PVR_DPF((PVR_DBG_MESSAGE, "PVRSRVInsertCommandKM: Dst %lu RO-VA:0x%lx WO-VA:0x%lx ROP:0x%lx WOP:0x%lx", - i, psCommand->psDstSync[i].psKernelSyncInfoKM->sReadOpsCompleteDevVAddr.uiAddr, - psCommand->psDstSync[i].psKernelSyncInfoKM->sWriteOpsCompleteDevVAddr.uiAddr, - psCommand->psDstSync[i].ui32ReadOpsPending, - psCommand->psDstSync[i].ui32WriteOpsPending)); - } - - - for (i=0; i<ui32SrcSyncCount; i++) - { - psCommand->psSrcSync[i].psKernelSyncInfoKM = apsSrcSync[i]; - psCommand->psSrcSync[i].ui32WriteOpsPending = PVRSRVGetWriteOpsPending(apsSrcSync[i], IMG_TRUE); - psCommand->psSrcSync[i].ui32ReadOpsPending = PVRSRVGetReadOpsPending(apsSrcSync[i], IMG_TRUE); - - PVR_DPF((PVR_DBG_MESSAGE, "PVRSRVInsertCommandKM: Src %lu RO-VA:0x%lx WO-VA:0x%lx ROP:0x%lx WOP:0x%lx", - i, psCommand->psSrcSync[i].psKernelSyncInfoKM->sReadOpsCompleteDevVAddr.uiAddr, - psCommand->psSrcSync[i].psKernelSyncInfoKM->sWriteOpsCompleteDevVAddr.uiAddr, - psCommand->psSrcSync[i].ui32ReadOpsPending, - psCommand->psSrcSync[i].ui32WriteOpsPending)); - } - - - *ppsCommand = psCommand; - - return PVRSRV_OK; -} - - -IMG_EXPORT -PVRSRV_ERROR IMG_CALLCONV PVRSRVSubmitCommandKM(PVRSRV_QUEUE_INFO *psQueue, - PVRSRV_COMMAND *psCommand) -{ - - - - if (psCommand->ui32DstSyncCount > 0) - { - psCommand->psDstSync = (PVRSRV_SYNC_OBJECT*)(((IMG_UINTPTR_T)psQueue->pvLinQueueKM) - + psQueue->ui32WriteOffset + sizeof(PVRSRV_COMMAND)); - } - - if (psCommand->ui32SrcSyncCount > 0) - { - psCommand->psSrcSync = (PVRSRV_SYNC_OBJECT*)(((IMG_UINTPTR_T)psQueue->pvLinQueueKM) - + psQueue->ui32WriteOffset + sizeof(PVRSRV_COMMAND) - + (psCommand->ui32DstSyncCount * sizeof(PVRSRV_SYNC_OBJECT))); - } - - psCommand->pvData = (PVRSRV_SYNC_OBJECT*)(((IMG_UINTPTR_T)psQueue->pvLinQueueKM) - + psQueue->ui32WriteOffset + sizeof(PVRSRV_COMMAND) - + (psCommand->ui32DstSyncCount * sizeof(PVRSRV_SYNC_OBJECT)) - + (psCommand->ui32SrcSyncCount * sizeof(PVRSRV_SYNC_OBJECT))); - - - UPDATE_QUEUE_WOFF(psQueue, psCommand->ui32CmdSize); - - return PVRSRV_OK; -} - - - -IMG_EXPORT -PVRSRV_ERROR PVRSRVProcessCommand(SYS_DATA *psSysData, - PVRSRV_COMMAND *psCommand, - IMG_BOOL bFlush) -{ - PVRSRV_SYNC_OBJECT *psWalkerObj; - PVRSRV_SYNC_OBJECT *psEndObj; - IMG_UINT32 i; - COMMAND_COMPLETE_DATA *psCmdCompleteData; - PVRSRV_ERROR eError = PVRSRV_OK; - IMG_UINT32 ui32WriteOpsComplete; - IMG_UINT32 ui32ReadOpsComplete; - - - psWalkerObj = psCommand->psDstSync; - psEndObj = psWalkerObj + psCommand->ui32DstSyncCount; - while (psWalkerObj < psEndObj) - { - PVRSRV_SYNC_DATA *psSyncData = psWalkerObj->psKernelSyncInfoKM->psSyncData; - - ui32WriteOpsComplete = psSyncData->ui32WriteOpsComplete; - ui32ReadOpsComplete = psSyncData->ui32ReadOpsComplete; - - if ((ui32WriteOpsComplete != psWalkerObj->ui32WriteOpsPending) - || (ui32ReadOpsComplete != psWalkerObj->ui32ReadOpsPending)) - { - if (!bFlush || - !SYNCOPS_STALE(ui32WriteOpsComplete, psWalkerObj->ui32WriteOpsPending) || - !SYNCOPS_STALE(ui32ReadOpsComplete, psWalkerObj->ui32ReadOpsPending)) - { - return PVRSRV_ERROR_FAILED_DEPENDENCIES; - } - } - - psWalkerObj++; - } - - - psWalkerObj = psCommand->psSrcSync; - psEndObj = psWalkerObj + psCommand->ui32SrcSyncCount; - while (psWalkerObj < psEndObj) - { - PVRSRV_SYNC_DATA *psSyncData = psWalkerObj->psKernelSyncInfoKM->psSyncData; - - ui32ReadOpsComplete = psSyncData->ui32ReadOpsComplete; - ui32WriteOpsComplete = psSyncData->ui32WriteOpsComplete; - - if ((ui32WriteOpsComplete != psWalkerObj->ui32WriteOpsPending) - || (ui32ReadOpsComplete != psWalkerObj->ui32ReadOpsPending)) - { - if (!bFlush && - SYNCOPS_STALE(ui32WriteOpsComplete, psWalkerObj->ui32WriteOpsPending) && - SYNCOPS_STALE(ui32ReadOpsComplete, psWalkerObj->ui32ReadOpsPending)) - { - PVR_DPF((PVR_DBG_WARNING, - "PVRSRVProcessCommand: Stale syncops psSyncData:0x%x ui32WriteOpsComplete:0x%x ui32WriteOpsPending:0x%x", - psSyncData, ui32WriteOpsComplete, psWalkerObj->ui32WriteOpsPending)); - } - - if (!bFlush || - !SYNCOPS_STALE(ui32WriteOpsComplete, psWalkerObj->ui32WriteOpsPending) || - !SYNCOPS_STALE(ui32ReadOpsComplete, psWalkerObj->ui32ReadOpsPending)) - { - return PVRSRV_ERROR_FAILED_DEPENDENCIES; - } - } - psWalkerObj++; - } - - - if (psCommand->ui32DevIndex >= SYS_DEVICE_COUNT) - { - PVR_DPF((PVR_DBG_ERROR, - "PVRSRVProcessCommand: invalid DeviceType 0x%x", - psCommand->ui32DevIndex)); - return PVRSRV_ERROR_INVALID_PARAMS; - } - - - psCmdCompleteData = psSysData->ppsCmdCompleteData[psCommand->ui32DevIndex][psCommand->CommandType]; - if (psCmdCompleteData->bInUse) - { - - return PVRSRV_ERROR_FAILED_DEPENDENCIES; - } - - - psCmdCompleteData->bInUse = IMG_TRUE; - - - psCmdCompleteData->ui32DstSyncCount = psCommand->ui32DstSyncCount; - for (i=0; i<psCommand->ui32DstSyncCount; i++) - { - psCmdCompleteData->psDstSync[i] = psCommand->psDstSync[i]; - - PVR_DPF((PVR_DBG_MESSAGE, "PVRSRVProcessCommand: Dst %lu RO-VA:0x%lx WO-VA:0x%lx ROP:0x%lx WOP:0x%lx", - i, psCmdCompleteData->psDstSync[i].psKernelSyncInfoKM->sReadOpsCompleteDevVAddr.uiAddr, - psCmdCompleteData->psDstSync[i].psKernelSyncInfoKM->sWriteOpsCompleteDevVAddr.uiAddr, - psCmdCompleteData->psDstSync[i].ui32ReadOpsPending, - psCmdCompleteData->psDstSync[i].ui32WriteOpsPending)); - } - - - psCmdCompleteData->ui32SrcSyncCount = psCommand->ui32SrcSyncCount; - for (i=0; i<psCommand->ui32SrcSyncCount; i++) - { - psCmdCompleteData->psSrcSync[i] = psCommand->psSrcSync[i]; - - PVR_DPF((PVR_DBG_MESSAGE, "PVRSRVProcessCommand: Src %lu RO-VA:0x%lx WO-VA:0x%lx ROP:0x%lx WOP:0x%lx", - i, psCmdCompleteData->psSrcSync[i].psKernelSyncInfoKM->sReadOpsCompleteDevVAddr.uiAddr, - psCmdCompleteData->psSrcSync[i].psKernelSyncInfoKM->sWriteOpsCompleteDevVAddr.uiAddr, - psCmdCompleteData->psSrcSync[i].ui32ReadOpsPending, - psCmdCompleteData->psSrcSync[i].ui32WriteOpsPending)); - } - - - - - - - - - - - - if (psSysData->ppfnCmdProcList[psCommand->ui32DevIndex][psCommand->CommandType]((IMG_HANDLE)psCmdCompleteData, - psCommand->ui32DataSize, - psCommand->pvData) == IMG_FALSE) - { - - - - psCmdCompleteData->bInUse = IMG_FALSE; - eError = PVRSRV_ERROR_CMD_NOT_PROCESSED; - } - - return eError; -} - - -IMG_VOID PVRSRVProcessQueues_ForEachCb(PVRSRV_DEVICE_NODE *psDeviceNode) -{ - if (psDeviceNode->bReProcessDeviceCommandComplete && - psDeviceNode->pfnDeviceCommandComplete != IMG_NULL) - { - (*psDeviceNode->pfnDeviceCommandComplete)(psDeviceNode); - } -} - -IMG_EXPORT -PVRSRV_ERROR PVRSRVProcessQueues(IMG_UINT32 ui32CallerID, - IMG_BOOL bFlush) -{ - PVRSRV_QUEUE_INFO *psQueue; - SYS_DATA *psSysData; - PVRSRV_COMMAND *psCommand; - PVRSRV_ERROR eError; - - SysAcquireData(&psSysData); - - - psSysData->bReProcessQueues = IMG_FALSE; - - - eError = OSLockResource(&psSysData->sQProcessResource, - ui32CallerID); - if(eError != PVRSRV_OK) - { - - psSysData->bReProcessQueues = IMG_TRUE; - - - if(ui32CallerID == ISR_ID) - { - if (bFlush) - { - PVR_DPF((PVR_DBG_ERROR,"PVRSRVProcessQueues: Couldn't acquire queue processing lock for FLUSH")); - } - else - { - PVR_DPF((PVR_DBG_MESSAGE,"PVRSRVProcessQueues: Couldn't acquire queue processing lock")); - } - } - else - { - PVR_DPF((PVR_DBG_MESSAGE,"PVRSRVProcessQueues: Queue processing lock-acquire failed when called from the Services driver.")); - PVR_DPF((PVR_DBG_MESSAGE," This is due to MISR queue processing being interrupted by the Services driver.")); - } - - return PVRSRV_OK; - } - - psQueue = psSysData->psQueueList; - - if(!psQueue) - { - PVR_DPF((PVR_DBG_MESSAGE,"No Queues installed - cannot process commands")); - } - - if (bFlush) - { - PVRSRVSetDCState(DC_STATE_FLUSH_COMMANDS); - } - - while (psQueue) - { - while (psQueue->ui32ReadOffset != psQueue->ui32WriteOffset) - { - psCommand = (PVRSRV_COMMAND*)((IMG_UINTPTR_T)psQueue->pvLinQueueKM + psQueue->ui32ReadOffset); - - if (PVRSRVProcessCommand(psSysData, psCommand, bFlush) == PVRSRV_OK) - { - - UPDATE_QUEUE_ROFF(psQueue, psCommand->ui32CmdSize) - - if (bFlush) - { - continue; - } - } - - break; - } - psQueue = psQueue->psNextKM; - } - - if (bFlush) - { - PVRSRVSetDCState(DC_STATE_NO_FLUSH_COMMANDS); - } - - - List_PVRSRV_DEVICE_NODE_ForEach(psSysData->psDeviceNodeList, - PVRSRVProcessQueues_ForEachCb); - - - - OSUnlockResource(&psSysData->sQProcessResource, ui32CallerID); - - - if(psSysData->bReProcessQueues) - { - return PVRSRV_ERROR_PROCESSING_BLOCKED; - } - - return PVRSRV_OK; -} - -#if defined(SUPPORT_CUSTOM_SWAP_OPERATIONS) -IMG_INTERNAL -IMG_VOID PVRSRVFreeCommandCompletePacketKM(IMG_HANDLE hCmdCookie, - IMG_BOOL bScheduleMISR) -{ - COMMAND_COMPLETE_DATA *psCmdCompleteData = (COMMAND_COMPLETE_DATA *)hCmdCookie; - SYS_DATA *psSysData; - - SysAcquireData(&psSysData); - - - psCmdCompleteData->bInUse = IMG_FALSE; - - - PVRSRVCommandCompleteCallbacks(); - -#if defined(SYS_USING_INTERRUPTS) - if(bScheduleMISR) - { - OSScheduleMISR(psSysData); - } -#else - PVR_UNREFERENCED_PARAMETER(bScheduleMISR); -#endif -} - -#endif -IMG_EXPORT -IMG_VOID PVRSRVCommandCompleteKM(IMG_HANDLE hCmdCookie, - IMG_BOOL bScheduleMISR) -{ - IMG_UINT32 i; - COMMAND_COMPLETE_DATA *psCmdCompleteData = (COMMAND_COMPLETE_DATA *)hCmdCookie; - SYS_DATA *psSysData; - - SysAcquireData(&psSysData); - - - for (i=0; i<psCmdCompleteData->ui32DstSyncCount; i++) - { - psCmdCompleteData->psDstSync[i].psKernelSyncInfoKM->psSyncData->ui32WriteOpsComplete++; - - PVR_DPF((PVR_DBG_MESSAGE, "PVRSRVCommandCompleteKM: Dst %lu RO-VA:0x%lx WO-VA:0x%lx ROP:0x%lx WOP:0x%lx", - i, psCmdCompleteData->psDstSync[i].psKernelSyncInfoKM->sReadOpsCompleteDevVAddr.uiAddr, - psCmdCompleteData->psDstSync[i].psKernelSyncInfoKM->sWriteOpsCompleteDevVAddr.uiAddr, - psCmdCompleteData->psDstSync[i].ui32ReadOpsPending, - psCmdCompleteData->psDstSync[i].ui32WriteOpsPending)); - } - - - for (i=0; i<psCmdCompleteData->ui32SrcSyncCount; i++) - { - psCmdCompleteData->psSrcSync[i].psKernelSyncInfoKM->psSyncData->ui32ReadOpsComplete++; - - PVR_DPF((PVR_DBG_MESSAGE, "PVRSRVCommandCompleteKM: Src %lu RO-VA:0x%lx WO-VA:0x%lx ROP:0x%lx WOP:0x%lx", - i, psCmdCompleteData->psSrcSync[i].psKernelSyncInfoKM->sReadOpsCompleteDevVAddr.uiAddr, - psCmdCompleteData->psSrcSync[i].psKernelSyncInfoKM->sWriteOpsCompleteDevVAddr.uiAddr, - psCmdCompleteData->psSrcSync[i].ui32ReadOpsPending, - psCmdCompleteData->psSrcSync[i].ui32WriteOpsPending)); - } - - - psCmdCompleteData->bInUse = IMG_FALSE; - - - PVRSRVCommandCompleteCallbacks(); - -#if defined(SYS_USING_INTERRUPTS) - if(bScheduleMISR) - { - OSScheduleMISR(psSysData); - } -#else - PVR_UNREFERENCED_PARAMETER(bScheduleMISR); -#endif -} - - -IMG_VOID PVRSRVCommandCompleteCallbacks_ForEachCb(PVRSRV_DEVICE_NODE *psDeviceNode) -{ - if(psDeviceNode->pfnDeviceCommandComplete != IMG_NULL) - { - - (*psDeviceNode->pfnDeviceCommandComplete)(psDeviceNode); - } -} - -IMG_VOID PVRSRVCommandCompleteCallbacks(IMG_VOID) -{ - SYS_DATA *psSysData; - SysAcquireData(&psSysData); - - - List_PVRSRV_DEVICE_NODE_ForEach(psSysData->psDeviceNodeList, - PVRSRVCommandCompleteCallbacks_ForEachCb); -} - -IMG_EXPORT -PVRSRV_ERROR PVRSRVRegisterCmdProcListKM(IMG_UINT32 ui32DevIndex, - PFN_CMD_PROC *ppfnCmdProcList, - IMG_UINT32 ui32MaxSyncsPerCmd[][2], - IMG_UINT32 ui32CmdCount) -{ - SYS_DATA *psSysData; - PVRSRV_ERROR eError; - IMG_UINT32 i; - IMG_SIZE_T ui32AllocSize; - PFN_CMD_PROC *ppfnCmdProc; - COMMAND_COMPLETE_DATA *psCmdCompleteData; - - - if(ui32DevIndex >= SYS_DEVICE_COUNT) - { - PVR_DPF((PVR_DBG_ERROR, - "PVRSRVRegisterCmdProcListKM: invalid DeviceType 0x%x", - ui32DevIndex)); - return PVRSRV_ERROR_INVALID_PARAMS; - } - - - SysAcquireData(&psSysData); - - - eError = OSAllocMem( PVRSRV_OS_PAGEABLE_HEAP, - ui32CmdCount * sizeof(PFN_CMD_PROC), - (IMG_VOID **)&psSysData->ppfnCmdProcList[ui32DevIndex], IMG_NULL, - "Internal Queue Info structure"); - if (eError != PVRSRV_OK) - { - PVR_DPF((PVR_DBG_ERROR,"PVRSRVRegisterCmdProcListKM: Failed to alloc queue")); - return eError; - } - - - ppfnCmdProc = psSysData->ppfnCmdProcList[ui32DevIndex]; - - - for (i=0; i<ui32CmdCount; i++) - { - ppfnCmdProc[i] = ppfnCmdProcList[i]; - } - - - ui32AllocSize = ui32CmdCount * sizeof(COMMAND_COMPLETE_DATA*); - eError = OSAllocMem( PVRSRV_OS_NON_PAGEABLE_HEAP, - ui32AllocSize, - (IMG_VOID **)&psSysData->ppsCmdCompleteData[ui32DevIndex], IMG_NULL, - "Array of Pointers for Command Store"); - if (eError != PVRSRV_OK) - { - PVR_DPF((PVR_DBG_ERROR,"PVRSRVRegisterCmdProcListKM: Failed to alloc CC data")); - goto ErrorExit; - } - - for (i=0; i<ui32CmdCount; i++) - { - - - ui32AllocSize = sizeof(COMMAND_COMPLETE_DATA) - + ((ui32MaxSyncsPerCmd[i][0] - + ui32MaxSyncsPerCmd[i][1]) - * sizeof(PVRSRV_SYNC_OBJECT)); - - eError = OSAllocMem(PVRSRV_OS_NON_PAGEABLE_HEAP, - ui32AllocSize, - (IMG_VOID **)&psSysData->ppsCmdCompleteData[ui32DevIndex][i], - IMG_NULL, - "Command Complete Data"); - if (eError != PVRSRV_OK) - { - PVR_DPF((PVR_DBG_ERROR,"PVRSRVRegisterCmdProcListKM: Failed to alloc cmd %d",i)); - goto ErrorExit; - } - - - OSMemSet(psSysData->ppsCmdCompleteData[ui32DevIndex][i], 0x00, ui32AllocSize); - - psCmdCompleteData = psSysData->ppsCmdCompleteData[ui32DevIndex][i]; - - - psCmdCompleteData->psDstSync = (PVRSRV_SYNC_OBJECT*) - (((IMG_UINTPTR_T)psCmdCompleteData) - + sizeof(COMMAND_COMPLETE_DATA)); - psCmdCompleteData->psSrcSync = (PVRSRV_SYNC_OBJECT*) - (((IMG_UINTPTR_T)psCmdCompleteData->psDstSync) - + (sizeof(PVRSRV_SYNC_OBJECT) * ui32MaxSyncsPerCmd[i][0])); - - psCmdCompleteData->ui32AllocSize = ui32AllocSize; - } - - return PVRSRV_OK; - -ErrorExit: - - - - if(psSysData->ppsCmdCompleteData[ui32DevIndex] != IMG_NULL) - { - for (i=0; i<ui32CmdCount; i++) - { - if (psSysData->ppsCmdCompleteData[ui32DevIndex][i] != IMG_NULL) - { - ui32AllocSize = sizeof(COMMAND_COMPLETE_DATA) - + ((ui32MaxSyncsPerCmd[i][0] - + ui32MaxSyncsPerCmd[i][1]) - * sizeof(PVRSRV_SYNC_OBJECT)); - OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP, ui32AllocSize, psSysData->ppsCmdCompleteData[ui32DevIndex][i], IMG_NULL); - psSysData->ppsCmdCompleteData[ui32DevIndex][i] = IMG_NULL; - } - } - ui32AllocSize = ui32CmdCount * sizeof(COMMAND_COMPLETE_DATA*); - OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP, ui32AllocSize, psSysData->ppsCmdCompleteData[ui32DevIndex], IMG_NULL); - psSysData->ppsCmdCompleteData[ui32DevIndex] = IMG_NULL; - } - - if(psSysData->ppfnCmdProcList[ui32DevIndex] != IMG_NULL) - { - ui32AllocSize = ui32CmdCount * sizeof(PFN_CMD_PROC); - OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP, ui32AllocSize, psSysData->ppfnCmdProcList[ui32DevIndex], IMG_NULL); - psSysData->ppfnCmdProcList[ui32DevIndex] = IMG_NULL; - } - - return eError; -} - - -IMG_EXPORT -PVRSRV_ERROR PVRSRVRemoveCmdProcListKM(IMG_UINT32 ui32DevIndex, - IMG_UINT32 ui32CmdCount) -{ - SYS_DATA *psSysData; - IMG_UINT32 i; - - - if(ui32DevIndex >= SYS_DEVICE_COUNT) - { - PVR_DPF((PVR_DBG_ERROR, - "PVRSRVRemoveCmdProcListKM: invalid DeviceType 0x%x", - ui32DevIndex)); - return PVRSRV_ERROR_INVALID_PARAMS; - } - - - SysAcquireData(&psSysData); - - if(psSysData->ppsCmdCompleteData[ui32DevIndex] == IMG_NULL) - { - PVR_DPF((PVR_DBG_ERROR,"PVRSRVRemoveCmdProcListKM: Invalid command array")); - return PVRSRV_ERROR_INVALID_PARAMS; - } - else - { - for(i=0; i<ui32CmdCount; i++) - { - - if(psSysData->ppsCmdCompleteData[ui32DevIndex][i] != IMG_NULL) - { - OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP, - psSysData->ppsCmdCompleteData[ui32DevIndex][i]->ui32AllocSize, - psSysData->ppsCmdCompleteData[ui32DevIndex][i], - IMG_NULL); - psSysData->ppsCmdCompleteData[ui32DevIndex][i] = IMG_NULL; - } - } - - - OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP, - ui32CmdCount * sizeof(COMMAND_COMPLETE_DATA*), - psSysData->ppsCmdCompleteData[ui32DevIndex], - IMG_NULL); - psSysData->ppsCmdCompleteData[ui32DevIndex] = IMG_NULL; - } - - - if(psSysData->ppfnCmdProcList[ui32DevIndex] != IMG_NULL) - { - OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP, - ui32CmdCount * sizeof(PFN_CMD_PROC), - psSysData->ppfnCmdProcList[ui32DevIndex], - IMG_NULL); - psSysData->ppfnCmdProcList[ui32DevIndex] = IMG_NULL; - } - - return PVRSRV_OK; -} - |