aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/pvr/pvrsrv.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/pvr/pvrsrv.c')
-rw-r--r--drivers/gpu/pvr/pvrsrv.c62
1 files changed, 50 insertions, 12 deletions
diff --git a/drivers/gpu/pvr/pvrsrv.c b/drivers/gpu/pvr/pvrsrv.c
index 5862fb925f8..cb05a59e8aa 100644
--- a/drivers/gpu/pvr/pvrsrv.c
+++ b/drivers/gpu/pvr/pvrsrv.c
@@ -32,6 +32,9 @@
32#include "pdump_km.h" 32#include "pdump_km.h"
33#include "deviceid.h" 33#include "deviceid.h"
34#include "ra.h" 34#include "ra.h"
35#if defined(TTRACE)
36#include "ttrace.h"
37#endif
35 38
36#include "pvrversion.h" 39#include "pvrversion.h"
37 40
@@ -40,6 +43,7 @@
40IMG_UINT32 g_ui32InitFlags; 43IMG_UINT32 g_ui32InitFlags;
41 44
42#define INIT_DATA_ENABLE_PDUMPINIT 0x1U 45#define INIT_DATA_ENABLE_PDUMPINIT 0x1U
46#define INIT_DATA_ENABLE_TTARCE 0x2U
43 47
44PVRSRV_ERROR AllocateDeviceID(SYS_DATA *psSysData, IMG_UINT32 *pui32DevID) 48PVRSRV_ERROR AllocateDeviceID(SYS_DATA *psSysData, IMG_UINT32 *pui32DevID)
45{ 49{
@@ -238,12 +242,24 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVInit(PSYS_DATA psSysData)
238 goto Error; 242 goto Error;
239 } 243 }
240 244
241 if(OSEventObjectCreate("PVRSRV_GLOBAL_EVENTOBJECT", psSysData->psGlobalEventObject) != PVRSRV_OK) 245 if(OSEventObjectCreateKM("PVRSRV_GLOBAL_EVENTOBJECT", psSysData->psGlobalEventObject) != PVRSRV_OK)
242 { 246 {
243 goto Error; 247 goto Error;
244 } 248 }
245 249
246 250
251 psSysData->pfnHighResTimerCreate = OSFuncHighResTimerCreate;
252 psSysData->pfnHighResTimerGetus = OSFuncHighResTimerGetus;
253 psSysData->pfnHighResTimerDestroy = OSFuncHighResTimerDestroy;
254
255#if defined(TTRACE)
256 eError = PVRSRVTimeTraceInit();
257 if (eError != PVRSRV_OK)
258 goto Error;
259 g_ui32InitFlags |= INIT_DATA_ENABLE_TTARCE;
260#endif
261
262
247 PDUMPINIT(); 263 PDUMPINIT();
248 g_ui32InitFlags |= INIT_DATA_ENABLE_PDUMPINIT; 264 g_ui32InitFlags |= INIT_DATA_ENABLE_PDUMPINIT;
249 265
@@ -267,7 +283,13 @@ IMG_VOID IMG_CALLCONV PVRSRVDeInit(PSYS_DATA psSysData)
267 PVR_DPF((PVR_DBG_ERROR,"PVRSRVDeInit: PVRSRVHandleDeInit failed - invalid param")); 283 PVR_DPF((PVR_DBG_ERROR,"PVRSRVDeInit: PVRSRVHandleDeInit failed - invalid param"));
268 return; 284 return;
269 } 285 }
270 286#if defined(TTRACE)
287
288 if ((g_ui32InitFlags & INIT_DATA_ENABLE_TTARCE) > 0)
289 {
290 PVRSRVTimeTraceDeinit();
291 }
292#endif
271 293
272 if( (g_ui32InitFlags & INIT_DATA_ENABLE_PDUMPINIT) > 0) 294 if( (g_ui32InitFlags & INIT_DATA_ENABLE_PDUMPINIT) > 0)
273 { 295 {
@@ -277,7 +299,7 @@ IMG_VOID IMG_CALLCONV PVRSRVDeInit(PSYS_DATA psSysData)
277 299
278 if(psSysData->psGlobalEventObject) 300 if(psSysData->psGlobalEventObject)
279 { 301 {
280 OSEventObjectDestroy(psSysData->psGlobalEventObject); 302 OSEventObjectDestroyKM(psSysData->psGlobalEventObject);
281 OSFreeMem( PVRSRV_PAGEABLE_SELECT, 303 OSFreeMem( PVRSRV_PAGEABLE_SELECT,
282 sizeof(PVRSRV_EVENTOBJECT), 304 sizeof(PVRSRV_EVENTOBJECT),
283 psSysData->psGlobalEventObject, 305 psSysData->psGlobalEventObject,
@@ -621,14 +643,14 @@ PVRSRV_ERROR IMG_CALLCONV PollForValueKM (volatile IMG_UINT32* pui32LinMemAddr,
621 IMG_BOOL bAllowPreemption) 643 IMG_BOOL bAllowPreemption)
622{ 644{
623 { 645 {
624 IMG_UINT32 ui32ActualValue = 0xFFFFFFFFU; 646 IMG_UINT32 ui32ActualValue = 0xFFFFFFFFU;
625 647
626 if (bAllowPreemption) 648 if (bAllowPreemption)
627 { 649 {
628 PVR_ASSERT(ui32PollPeriodus >= 1000); 650 PVR_ASSERT(ui32PollPeriodus >= 1000);
629 } 651 }
630 652
631 653
632 LOOP_UNTIL_TIMEOUT(ui32Timeoutus) 654 LOOP_UNTIL_TIMEOUT(ui32Timeoutus)
633 { 655 {
634 ui32ActualValue = (*pui32LinMemAddr & ui32Mask); 656 ui32ActualValue = (*pui32LinMemAddr & ui32Mask);
@@ -636,7 +658,7 @@ PVRSRV_ERROR IMG_CALLCONV PollForValueKM (volatile IMG_UINT32* pui32LinMemAddr,
636 { 658 {
637 return PVRSRV_OK; 659 return PVRSRV_OK;
638 } 660 }
639 661
640 if (bAllowPreemption) 662 if (bAllowPreemption)
641 { 663 {
642 OSSleepms(ui32PollPeriodus / 1000); 664 OSSleepms(ui32PollPeriodus / 1000);
@@ -646,7 +668,7 @@ PVRSRV_ERROR IMG_CALLCONV PollForValueKM (volatile IMG_UINT32* pui32LinMemAddr,
646 OSWaitus(ui32PollPeriodus); 668 OSWaitus(ui32PollPeriodus);
647 } 669 }
648 } END_LOOP_UNTIL_TIMEOUT(); 670 } END_LOOP_UNTIL_TIMEOUT();
649 671
650 PVR_DPF((PVR_DBG_ERROR,"PollForValueKM: Timeout. Expected 0x%x but found 0x%x (mask 0x%x).", 672 PVR_DPF((PVR_DBG_ERROR,"PollForValueKM: Timeout. Expected 0x%x but found 0x%x (mask 0x%x).",
651 ui32Value, ui32ActualValue, ui32Mask)); 673 ui32Value, ui32ActualValue, ui32Mask));
652 } 674 }
@@ -666,7 +688,7 @@ static IMG_VOID PVRSRVGetMiscInfoKM_RA_GetStats_ForEachVaCb(BM_HEAP *psBMHeap, v
666 pui32StrLen = va_arg(va, IMG_UINT32*); 688 pui32StrLen = va_arg(va, IMG_UINT32*);
667 ui32Mode = va_arg(va, IMG_UINT32); 689 ui32Mode = va_arg(va, IMG_UINT32);
668 690
669 691
670 switch(ui32Mode) 692 switch(ui32Mode)
671 { 693 {
672 case PVRSRV_MISC_INFO_MEMSTATS_PRESENT: 694 case PVRSRV_MISC_INFO_MEMSTATS_PRESENT:
@@ -762,7 +784,11 @@ static PVRSRV_ERROR PVRSRVGetMiscInfoKM_Device_AnyVaCb(PVRSRV_DEVICE_NODE *psDev
762 784
763 785
764IMG_EXPORT 786IMG_EXPORT
787#if defined (SUPPORT_SID_INTERFACE)
788PVRSRV_ERROR IMG_CALLCONV PVRSRVGetMiscInfoKM(PVRSRV_MISC_INFO_KM *psMiscInfo)
789#else
765PVRSRV_ERROR IMG_CALLCONV PVRSRVGetMiscInfoKM(PVRSRV_MISC_INFO *psMiscInfo) 790PVRSRV_ERROR IMG_CALLCONV PVRSRVGetMiscInfoKM(PVRSRV_MISC_INFO *psMiscInfo)
791#endif
766{ 792{
767 SYS_DATA *psSysData; 793 SYS_DATA *psSysData;
768 794
@@ -857,7 +883,7 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVGetMiscInfoKM(PVRSRV_MISC_INFO *psMiscInfo)
857 } 883 }
858 884
859 885
860 if((psMiscInfo->ui32StateRequest & PVRSRV_MISC_INFO_FREEMEM_PRESENT) 886 if(((psMiscInfo->ui32StateRequest & PVRSRV_MISC_INFO_FREEMEM_PRESENT) != 0)
861 && psMiscInfo->pszMemoryStr) 887 && psMiscInfo->pszMemoryStr)
862 { 888 {
863 IMG_CHAR *pszStr; 889 IMG_CHAR *pszStr;
@@ -929,6 +955,8 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVGetMiscInfoKM(PVRSRV_MISC_INFO *psMiscInfo)
929 955
930 if((psMiscInfo->ui32StateRequest & PVRSRV_MISC_INFO_CPUCACHEOP_PRESENT) != 0UL) 956 if((psMiscInfo->ui32StateRequest & PVRSRV_MISC_INFO_CPUCACHEOP_PRESENT) != 0UL)
931 { 957 {
958 psMiscInfo->ui32StatePresent |= PVRSRV_MISC_INFO_CPUCACHEOP_PRESENT;
959
932 if(psMiscInfo->sCacheOpCtl.bDeferOp) 960 if(psMiscInfo->sCacheOpCtl.bDeferOp)
933 { 961 {
934 962
@@ -936,10 +964,16 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVGetMiscInfoKM(PVRSRV_MISC_INFO *psMiscInfo)
936 } 964 }
937 else 965 else
938 { 966 {
967#if defined (SUPPORT_SID_INTERFACE)
968 PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo = psMiscInfo->sCacheOpCtl.psKernelMemInfo;
969
970 if(!psMiscInfo->sCacheOpCtl.psKernelMemInfo)
971#else
939 PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo; 972 PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo;
940 PVRSRV_PER_PROCESS_DATA *psPerProc; 973 PVRSRV_PER_PROCESS_DATA *psPerProc;
941 974
942 if(!psMiscInfo->sCacheOpCtl.u.psKernelMemInfo) 975 if(!psMiscInfo->sCacheOpCtl.u.psKernelMemInfo)
976#endif
943 { 977 {
944 PVR_DPF((PVR_DBG_WARNING, "PVRSRVGetMiscInfoKM: " 978 PVR_DPF((PVR_DBG_WARNING, "PVRSRVGetMiscInfoKM: "
945 "Ignoring non-deferred cache op with no meminfo")); 979 "Ignoring non-deferred cache op with no meminfo"));
@@ -953,6 +987,9 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVGetMiscInfoKM(PVRSRV_MISC_INFO *psMiscInfo)
953 "to combine deferred cache ops with immediate ones")); 987 "to combine deferred cache ops with immediate ones"));
954 } 988 }
955 989
990#if defined (SUPPORT_SID_INTERFACE)
991 PVR_DBG_BREAK
992#else
956 993
957 psPerProc = PVRSRVFindPerProcessData(); 994 psPerProc = PVRSRVFindPerProcessData();
958 995
@@ -965,6 +1002,7 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVGetMiscInfoKM(PVRSRV_MISC_INFO *psMiscInfo)
965 "Can't find kernel meminfo")); 1002 "Can't find kernel meminfo"));
966 return PVRSRV_ERROR_INVALID_PARAMS; 1003 return PVRSRV_ERROR_INVALID_PARAMS;
967 } 1004 }
1005#endif
968 1006
969 if(psMiscInfo->sCacheOpCtl.eCacheOpType == PVRSRV_MISC_INFO_CPUCACHEOP_FLUSH) 1007 if(psMiscInfo->sCacheOpCtl.eCacheOpType == PVRSRV_MISC_INFO_CPUCACHEOP_FLUSH)
970 { 1008 {
@@ -1109,9 +1147,9 @@ IMG_VOID IMG_CALLCONV PVRSRVMISR(IMG_VOID *pvSysData)
1109 &PVRSRVMISR_ForEachCb); 1147 &PVRSRVMISR_ForEachCb);
1110 1148
1111 1149
1112 if (PVRSRVProcessQueues(ISR_ID, IMG_FALSE) == PVRSRV_ERROR_PROCESSING_BLOCKED) 1150 if (PVRSRVProcessQueues(IMG_FALSE) == PVRSRV_ERROR_PROCESSING_BLOCKED)
1113 { 1151 {
1114 PVRSRVProcessQueues(ISR_ID, IMG_FALSE); 1152 PVRSRVProcessQueues(IMG_FALSE);
1115 } 1153 }
1116 1154
1117 1155
@@ -1120,7 +1158,7 @@ IMG_VOID IMG_CALLCONV PVRSRVMISR(IMG_VOID *pvSysData)
1120 IMG_HANDLE hOSEventKM = psSysData->psGlobalEventObject->hOSEventKM; 1158 IMG_HANDLE hOSEventKM = psSysData->psGlobalEventObject->hOSEventKM;
1121 if(hOSEventKM) 1159 if(hOSEventKM)
1122 { 1160 {
1123 OSEventObjectSignal(hOSEventKM); 1161 OSEventObjectSignalKM(hOSEventKM);
1124 } 1162 }
1125 } 1163 }
1126} 1164}