aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/pvr/sgx/sgxutils.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/pvr/sgx/sgxutils.c')
-rw-r--r--drivers/gpu/pvr/sgx/sgxutils.c154
1 files changed, 90 insertions, 64 deletions
diff --git a/drivers/gpu/pvr/sgx/sgxutils.c b/drivers/gpu/pvr/sgx/sgxutils.c
index cf7ecc68d93..75b1b893200 100644
--- a/drivers/gpu/pvr/sgx/sgxutils.c
+++ b/drivers/gpu/pvr/sgx/sgxutils.c
@@ -206,7 +206,7 @@ PVRSRV_ERROR SGXScheduleCCBCommand(PVRSRV_DEVICE_NODE *psDeviceNode,
206 206
207 207
208 208
209 if ( (eCmdType != SGXMKIF_CMD_PROCESS_QUEUES) && 209 if ( (eCmdType != SGXMKIF_CMD_PROCESS_QUEUES) &&
210 ((psDevInfo->ui32CacheControl & SGXMKIF_CC_INVAL_DATA) != 0) && 210 ((psDevInfo->ui32CacheControl & SGXMKIF_CC_INVAL_DATA) != 0) &&
211 ((psDevInfo->ui32CacheControl & (SGXMKIF_CC_INVAL_BIF_PT | SGXMKIF_CC_INVAL_BIF_PD)) != 0)) 211 ((psDevInfo->ui32CacheControl & (SGXMKIF_CC_INVAL_BIF_PT | SGXMKIF_CC_INVAL_BIF_PD)) != 0))
212 { 212 {
@@ -227,7 +227,7 @@ PVRSRV_ERROR SGXScheduleCCBCommand(PVRSRV_DEVICE_NODE *psDeviceNode,
227 { 227 {
228 goto Exit; 228 goto Exit;
229 } 229 }
230 230
231 231
232 #if !defined(NO_HARDWARE) 232 #if !defined(NO_HARDWARE)
233 if(PollForValueKM(&psSGXHostCtl->ui32InvalStatus, 233 if(PollForValueKM(&psSGXHostCtl->ui32InvalStatus,
@@ -241,7 +241,7 @@ PVRSRV_ERROR SGXScheduleCCBCommand(PVRSRV_DEVICE_NODE *psDeviceNode,
241 PVR_DBG_BREAK; 241 PVR_DBG_BREAK;
242 } 242 }
243 #endif 243 #endif
244 244
245 #if defined(PDUMP) 245 #if defined(PDUMP)
246 246
247 PDUMPCOMMENTWITHFLAGS(0, "Host Control - Poll for BIF cache invalidate request to complete"); 247 PDUMPCOMMENTWITHFLAGS(0, "Host Control - Poll for BIF cache invalidate request to complete");
@@ -253,14 +253,14 @@ PVRSRV_ERROR SGXScheduleCCBCommand(PVRSRV_DEVICE_NODE *psDeviceNode,
253 0, 253 0,
254 MAKEUNIQUETAG(psSGXHostCtlMemInfo)); 254 MAKEUNIQUETAG(psSGXHostCtlMemInfo));
255 #endif 255 #endif
256 256
257 psSGXHostCtl->ui32InvalStatus &= ~(PVRSRV_USSE_EDM_BIF_INVAL_COMPLETE); 257 psSGXHostCtl->ui32InvalStatus &= ~(PVRSRV_USSE_EDM_BIF_INVAL_COMPLETE);
258 PDUMPMEM(IMG_NULL, psSGXHostCtlMemInfo, offsetof(SGXMKIF_HOST_CTL, ui32CleanupStatus), sizeof(IMG_UINT32), 0, MAKEUNIQUETAG(psSGXHostCtlMemInfo)); 258 PDUMPMEM(IMG_NULL, psSGXHostCtlMemInfo, offsetof(SGXMKIF_HOST_CTL, ui32CleanupStatus), sizeof(IMG_UINT32), 0, MAKEUNIQUETAG(psSGXHostCtlMemInfo));
259 } 259 }
260#else 260#else
261 PVR_UNREFERENCED_PARAMETER(hDevMemContext); 261 PVR_UNREFERENCED_PARAMETER(hDevMemContext);
262#endif 262#endif
263 263
264#if defined(FIX_HW_BRN_31620) 264#if defined(FIX_HW_BRN_31620)
265 if ((eCmdType != SGXMKIF_CMD_FLUSHPDCACHE) && (psDevInfo->ui32CacheControl & SGXMKIF_CC_INVAL_BIF_PD)) 265 if ((eCmdType != SGXMKIF_CMD_FLUSHPDCACHE) && (psDevInfo->ui32CacheControl & SGXMKIF_CC_INVAL_BIF_PD))
266 { 266 {
@@ -636,9 +636,10 @@ PVRSRV_ERROR SGXGetInternalDevInfoKM(IMG_HANDLE hDevCookie,
636} 636}
637 637
638 638
639IMG_VOID SGXCleanupRequest(PVRSRV_DEVICE_NODE *psDeviceNode, 639PVRSRV_ERROR SGXCleanupRequest(PVRSRV_DEVICE_NODE *psDeviceNode,
640 IMG_DEV_VIRTADDR *psHWDataDevVAddr, 640 IMG_DEV_VIRTADDR *psHWDataDevVAddr,
641 IMG_UINT32 ui32CleanupType) 641 IMG_UINT32 ui32CleanupType,
642 IMG_BOOL bForceCleanup)
642{ 643{
643 PVRSRV_ERROR eError; 644 PVRSRV_ERROR eError;
644 PVRSRV_SGXDEV_INFO *psDevInfo = psDeviceNode->pvDevice; 645 PVRSRV_SGXDEV_INFO *psDevInfo = psDeviceNode->pvDevice;
@@ -647,52 +648,64 @@ IMG_VOID SGXCleanupRequest(PVRSRV_DEVICE_NODE *psDeviceNode,
647 648
648 SGXMKIF_COMMAND sCommand = {0}; 649 SGXMKIF_COMMAND sCommand = {0};
649 650
650 sCommand.ui32Data[0] = ui32CleanupType;
651 sCommand.ui32Data[1] = (psHWDataDevVAddr == IMG_NULL) ? 0 : psHWDataDevVAddr->uiAddr;
652 PDUMPCOMMENTWITHFLAGS(0, "Request ukernel resource clean-up, Type %u, Data 0x%X", sCommand.ui32Data[0], sCommand.ui32Data[1]);
653 651
654 eError = SGXScheduleCCBCommandKM(psDeviceNode, SGXMKIF_CMD_CLEANUP, &sCommand, KERNEL_ID, 0, IMG_NULL, IMG_FALSE); 652 if (bForceCleanup != FORCE_CLEANUP)
655 if (eError != PVRSRV_OK)
656 { 653 {
657 PVR_DPF((PVR_DBG_ERROR,"SGXCleanupRequest: Failed to submit clean-up command")); 654 sCommand.ui32Data[0] = ui32CleanupType;
658 PVR_DBG_BREAK; 655 sCommand.ui32Data[1] = (psHWDataDevVAddr == IMG_NULL) ? 0 : psHWDataDevVAddr->uiAddr;
659 } 656 PDUMPCOMMENTWITHFLAGS(0, "Request ukernel resource clean-up, Type %u, Data 0x%X", sCommand.ui32Data[0], sCommand.ui32Data[1]);
660
661 657
662 #if !defined(NO_HARDWARE) 658 eError = SGXScheduleCCBCommandKM(psDeviceNode, SGXMKIF_CMD_CLEANUP, &sCommand, KERNEL_ID, 0, IMG_NULL, IMG_FALSE);
663 if(PollForValueKM(&psHostCtl->ui32CleanupStatus, 659 if (eError != PVRSRV_OK)
664 PVRSRV_USSE_EDM_CLEANUPCMD_COMPLETE, 660 {
665 PVRSRV_USSE_EDM_CLEANUPCMD_COMPLETE, 661 PVR_DPF((PVR_DBG_ERROR,"SGXCleanupRequest: Failed to submit clean-up command"));
666 10 * MAX_HW_TIME_US, 662 PVR_DBG_BREAK;
667 1000, 663 return eError;
668 IMG_TRUE) != PVRSRV_OK) 664 }
669 {
670 PVR_DPF((PVR_DBG_ERROR,"SGXCleanupRequest: Wait for uKernel to clean up (%u) failed", ui32CleanupType));
671 PVR_DBG_BREAK;
672 }
673 #endif
674 665
675 #if defined(PDUMP)
676
677 PDUMPCOMMENTWITHFLAGS(0, "Host Control - Poll for clean-up request to complete");
678 PDUMPMEMPOL(psHostCtlMemInfo,
679 offsetof(SGXMKIF_HOST_CTL, ui32CleanupStatus),
680 PVRSRV_USSE_EDM_CLEANUPCMD_COMPLETE,
681 PVRSRV_USSE_EDM_CLEANUPCMD_COMPLETE,
682 PDUMP_POLL_OPERATOR_EQUAL,
683 0,
684 MAKEUNIQUETAG(psHostCtlMemInfo));
685 #endif
686 666
667 #if !defined(NO_HARDWARE)
668 if(PollForValueKM(&psHostCtl->ui32CleanupStatus,
669 PVRSRV_USSE_EDM_CLEANUPCMD_COMPLETE,
670 PVRSRV_USSE_EDM_CLEANUPCMD_COMPLETE,
671 10 * MAX_HW_TIME_US,
672 1000,
673 IMG_TRUE) != PVRSRV_OK)
674 {
675 PVR_DPF((PVR_DBG_ERROR,"SGXCleanupRequest: Wait for uKernel to clean up (%u) failed", ui32CleanupType));
676 eError = PVRSRV_ERROR_TIMEOUT;
677 PVR_DBG_BREAK;
678 }
679 #endif
680
681 #if defined(PDUMP)
682
683 PDUMPCOMMENTWITHFLAGS(0, "Host Control - Poll for clean-up request to complete");
684 PDUMPMEMPOL(psHostCtlMemInfo,
685 offsetof(SGXMKIF_HOST_CTL, ui32CleanupStatus),
686 PVRSRV_USSE_EDM_CLEANUPCMD_COMPLETE,
687 PVRSRV_USSE_EDM_CLEANUPCMD_COMPLETE,
688 PDUMP_POLL_OPERATOR_EQUAL,
689 0,
690 MAKEUNIQUETAG(psHostCtlMemInfo));
691 #endif
692
693 if (eError != PVRSRV_OK)
694 {
695 return eError;
696 }
697 }
698
687 psHostCtl->ui32CleanupStatus &= ~(PVRSRV_USSE_EDM_CLEANUPCMD_COMPLETE); 699 psHostCtl->ui32CleanupStatus &= ~(PVRSRV_USSE_EDM_CLEANUPCMD_COMPLETE);
688 PDUMPMEM(IMG_NULL, psHostCtlMemInfo, offsetof(SGXMKIF_HOST_CTL, ui32CleanupStatus), sizeof(IMG_UINT32), 0, MAKEUNIQUETAG(psHostCtlMemInfo)); 700 PDUMPMEM(IMG_NULL, psHostCtlMemInfo, offsetof(SGXMKIF_HOST_CTL, ui32CleanupStatus), sizeof(IMG_UINT32), 0, MAKEUNIQUETAG(psHostCtlMemInfo));
689 701
690 702
691#if defined(SGX_FEATURE_SYSTEM_CACHE) 703#if defined(SGX_FEATURE_SYSTEM_CACHE)
692 psDevInfo->ui32CacheControl |= (SGXMKIF_CC_INVAL_BIF_SL | SGXMKIF_CC_INVAL_DATA); 704 psDevInfo->ui32CacheControl |= (SGXMKIF_CC_INVAL_BIF_SL | SGXMKIF_CC_INVAL_DATA);
693#else 705#else
694 psDevInfo->ui32CacheControl |= SGXMKIF_CC_INVAL_DATA; 706 psDevInfo->ui32CacheControl |= SGXMKIF_CC_INVAL_DATA;
695#endif 707#endif
708 return PVRSRV_OK;
696} 709}
697 710
698 711
@@ -706,15 +719,18 @@ typedef struct _SGX_HW_RENDER_CONTEXT_CLEANUP_
706 719
707 720
708static PVRSRV_ERROR SGXCleanupHWRenderContextCallback(IMG_PVOID pvParam, 721static PVRSRV_ERROR SGXCleanupHWRenderContextCallback(IMG_PVOID pvParam,
709 IMG_UINT32 ui32Param) 722 IMG_UINT32 ui32Param,
723 IMG_BOOL bForceCleanup)
710{ 724{
725 PVRSRV_ERROR eError;
711 SGX_HW_RENDER_CONTEXT_CLEANUP *psCleanup = pvParam; 726 SGX_HW_RENDER_CONTEXT_CLEANUP *psCleanup = pvParam;
712 727
713 PVR_UNREFERENCED_PARAMETER(ui32Param); 728 PVR_UNREFERENCED_PARAMETER(ui32Param);
714 729
715 SGXCleanupRequest(psCleanup->psDeviceNode, 730 eError = SGXCleanupRequest(psCleanup->psDeviceNode,
716 &psCleanup->sHWRenderContextDevVAddr, 731 &psCleanup->sHWRenderContextDevVAddr,
717 PVRSRV_CLEANUPCMD_RC); 732 PVRSRV_CLEANUPCMD_RC,
733 bForceCleanup);
718 734
719 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, 735 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
720 sizeof(SGX_HW_RENDER_CONTEXT_CLEANUP), 736 sizeof(SGX_HW_RENDER_CONTEXT_CLEANUP),
@@ -722,7 +738,7 @@ static PVRSRV_ERROR SGXCleanupHWRenderContextCallback(IMG_PVOID pvParam,
722 psCleanup->hBlockAlloc); 738 psCleanup->hBlockAlloc);
723 739
724 740
725 return PVRSRV_OK; 741 return eError;
726} 742}
727 743
728typedef struct _SGX_HW_TRANSFER_CONTEXT_CLEANUP_ 744typedef struct _SGX_HW_TRANSFER_CONTEXT_CLEANUP_
@@ -735,15 +751,18 @@ typedef struct _SGX_HW_TRANSFER_CONTEXT_CLEANUP_
735 751
736 752
737static PVRSRV_ERROR SGXCleanupHWTransferContextCallback(IMG_PVOID pvParam, 753static PVRSRV_ERROR SGXCleanupHWTransferContextCallback(IMG_PVOID pvParam,
738 IMG_UINT32 ui32Param) 754 IMG_UINT32 ui32Param,
755 IMG_BOOL bForceCleanup)
739{ 756{
757 PVRSRV_ERROR eError;
740 SGX_HW_TRANSFER_CONTEXT_CLEANUP *psCleanup = (SGX_HW_TRANSFER_CONTEXT_CLEANUP *)pvParam; 758 SGX_HW_TRANSFER_CONTEXT_CLEANUP *psCleanup = (SGX_HW_TRANSFER_CONTEXT_CLEANUP *)pvParam;
741 759
742 PVR_UNREFERENCED_PARAMETER(ui32Param); 760 PVR_UNREFERENCED_PARAMETER(ui32Param);
743 761
744 SGXCleanupRequest(psCleanup->psDeviceNode, 762 eError = SGXCleanupRequest(psCleanup->psDeviceNode,
745 &psCleanup->sHWTransferContextDevVAddr, 763 &psCleanup->sHWTransferContextDevVAddr,
746 PVRSRV_CLEANUPCMD_TC); 764 PVRSRV_CLEANUPCMD_TC,
765 bForceCleanup);
747 766
748 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, 767 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
749 sizeof(SGX_HW_TRANSFER_CONTEXT_CLEANUP), 768 sizeof(SGX_HW_TRANSFER_CONTEXT_CLEANUP),
@@ -751,7 +770,7 @@ static PVRSRV_ERROR SGXCleanupHWTransferContextCallback(IMG_PVOID pvParam,
751 psCleanup->hBlockAlloc); 770 psCleanup->hBlockAlloc);
752 771
753 772
754 return PVRSRV_OK; 773 return eError;
755} 774}
756 775
757IMG_EXPORT 776IMG_EXPORT
@@ -804,7 +823,7 @@ IMG_HANDLE SGXRegisterHWRenderContextKM(IMG_HANDLE psDeviceNode,
804} 823}
805 824
806IMG_EXPORT 825IMG_EXPORT
807PVRSRV_ERROR SGXUnregisterHWRenderContextKM(IMG_HANDLE hHWRenderContext) 826PVRSRV_ERROR SGXUnregisterHWRenderContextKM(IMG_HANDLE hHWRenderContext, IMG_BOOL bForceCleanup)
808{ 827{
809 PVRSRV_ERROR eError; 828 PVRSRV_ERROR eError;
810 SGX_HW_RENDER_CONTEXT_CLEANUP *psCleanup; 829 SGX_HW_RENDER_CONTEXT_CLEANUP *psCleanup;
@@ -819,7 +838,7 @@ PVRSRV_ERROR SGXUnregisterHWRenderContextKM(IMG_HANDLE hHWRenderContext)
819 return PVRSRV_ERROR_INVALID_PARAMS; 838 return PVRSRV_ERROR_INVALID_PARAMS;
820 } 839 }
821 840
822 eError = ResManFreeResByPtr(psCleanup->psResItem); 841 eError = ResManFreeResByPtr(psCleanup->psResItem, bForceCleanup);
823 842
824 return eError; 843 return eError;
825} 844}
@@ -875,7 +894,7 @@ IMG_HANDLE SGXRegisterHWTransferContextKM(IMG_HANDLE psDeviceNode,
875} 894}
876 895
877IMG_EXPORT 896IMG_EXPORT
878PVRSRV_ERROR SGXUnregisterHWTransferContextKM(IMG_HANDLE hHWTransferContext) 897PVRSRV_ERROR SGXUnregisterHWTransferContextKM(IMG_HANDLE hHWTransferContext, IMG_BOOL bForceCleanup)
879{ 898{
880 PVRSRV_ERROR eError; 899 PVRSRV_ERROR eError;
881 SGX_HW_TRANSFER_CONTEXT_CLEANUP *psCleanup; 900 SGX_HW_TRANSFER_CONTEXT_CLEANUP *psCleanup;
@@ -890,7 +909,7 @@ PVRSRV_ERROR SGXUnregisterHWTransferContextKM(IMG_HANDLE hHWTransferContext)
890 return PVRSRV_ERROR_INVALID_PARAMS; 909 return PVRSRV_ERROR_INVALID_PARAMS;
891 } 910 }
892 911
893 eError = ResManFreeResByPtr(psCleanup->psResItem); 912 eError = ResManFreeResByPtr(psCleanup->psResItem, bForceCleanup);
894 913
895 return eError; 914 return eError;
896} 915}
@@ -904,15 +923,19 @@ typedef struct _SGX_HW_2D_CONTEXT_CLEANUP_
904 PRESMAN_ITEM psResItem; 923 PRESMAN_ITEM psResItem;
905} SGX_HW_2D_CONTEXT_CLEANUP; 924} SGX_HW_2D_CONTEXT_CLEANUP;
906 925
907static PVRSRV_ERROR SGXCleanupHW2DContextCallback(IMG_PVOID pvParam, IMG_UINT32 ui32Param) 926static PVRSRV_ERROR SGXCleanupHW2DContextCallback(IMG_PVOID pvParam,
927 IMG_UINT32 ui32Param,
928 IMG_BOOL bForceCleanup)
908{ 929{
930 PVRSRV_ERROR eError;
909 SGX_HW_2D_CONTEXT_CLEANUP *psCleanup = (SGX_HW_2D_CONTEXT_CLEANUP *)pvParam; 931 SGX_HW_2D_CONTEXT_CLEANUP *psCleanup = (SGX_HW_2D_CONTEXT_CLEANUP *)pvParam;
910 932
911 PVR_UNREFERENCED_PARAMETER(ui32Param); 933 PVR_UNREFERENCED_PARAMETER(ui32Param);
912 934
913 SGXCleanupRequest(psCleanup->psDeviceNode, 935 eError = SGXCleanupRequest(psCleanup->psDeviceNode,
914 &psCleanup->sHW2DContextDevVAddr, 936 &psCleanup->sHW2DContextDevVAddr,
915 PVRSRV_CLEANUPCMD_2DC); 937 PVRSRV_CLEANUPCMD_2DC,
938 bForceCleanup);
916 939
917 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, 940 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
918 sizeof(SGX_HW_2D_CONTEXT_CLEANUP), 941 sizeof(SGX_HW_2D_CONTEXT_CLEANUP),
@@ -920,7 +943,7 @@ static PVRSRV_ERROR SGXCleanupHW2DContextCallback(IMG_PVOID pvParam, IMG_UINT32
920 psCleanup->hBlockAlloc); 943 psCleanup->hBlockAlloc);
921 944
922 945
923 return PVRSRV_OK; 946 return eError;
924} 947}
925 948
926IMG_EXPORT 949IMG_EXPORT
@@ -973,7 +996,7 @@ IMG_HANDLE SGXRegisterHW2DContextKM(IMG_HANDLE psDeviceNode,
973} 996}
974 997
975IMG_EXPORT 998IMG_EXPORT
976PVRSRV_ERROR SGXUnregisterHW2DContextKM(IMG_HANDLE hHW2DContext) 999PVRSRV_ERROR SGXUnregisterHW2DContextKM(IMG_HANDLE hHW2DContext, IMG_BOOL bForceCleanup)
977{ 1000{
978 PVRSRV_ERROR eError; 1001 PVRSRV_ERROR eError;
979 SGX_HW_2D_CONTEXT_CLEANUP *psCleanup; 1002 SGX_HW_2D_CONTEXT_CLEANUP *psCleanup;
@@ -987,7 +1010,7 @@ PVRSRV_ERROR SGXUnregisterHW2DContextKM(IMG_HANDLE hHW2DContext)
987 1010
988 psCleanup = (SGX_HW_2D_CONTEXT_CLEANUP *)hHW2DContext; 1011 psCleanup = (SGX_HW_2D_CONTEXT_CLEANUP *)hHW2DContext;
989 1012
990 eError = ResManFreeResByPtr(psCleanup->psResItem); 1013 eError = ResManFreeResByPtr(psCleanup->psResItem, bForceCleanup);
991 1014
992 return eError; 1015 return eError;
993} 1016}
@@ -1076,13 +1099,16 @@ PVRSRV_ERROR SGX2DQueryBlitsCompleteKM(PVRSRV_SGXDEV_INFO *psDevInfo,
1076 1099
1077 1100
1078IMG_EXPORT 1101IMG_EXPORT
1079IMG_VOID SGXFlushHWRenderTargetKM(IMG_HANDLE psDeviceNode, IMG_DEV_VIRTADDR sHWRTDataSetDevVAddr) 1102PVRSRV_ERROR SGXFlushHWRenderTargetKM(IMG_HANDLE psDeviceNode,
1103 IMG_DEV_VIRTADDR sHWRTDataSetDevVAddr,
1104 IMG_BOOL bForceCleanup)
1080{ 1105{
1081 PVR_ASSERT(sHWRTDataSetDevVAddr.uiAddr != IMG_NULL); 1106 PVR_ASSERT(sHWRTDataSetDevVAddr.uiAddr != IMG_NULL);
1082 1107
1083 SGXCleanupRequest(psDeviceNode, 1108 return SGXCleanupRequest(psDeviceNode,
1084 &sHWRTDataSetDevVAddr, 1109 &sHWRTDataSetDevVAddr,
1085 PVRSRV_CLEANUPCMD_RT); 1110 PVRSRV_CLEANUPCMD_RT,
1111 bForceCleanup);
1086} 1112}
1087 1113
1088 1114
@@ -1141,7 +1167,7 @@ PVRSRV_ERROR SGXContextSuspend(PVRSRV_DEVICE_NODE *psDeviceNode,
1141 PVR_DPF((PVR_DBG_ERROR,"SGXContextSuspend: Failed to submit context suspend command")); 1167 PVR_DPF((PVR_DBG_ERROR,"SGXContextSuspend: Failed to submit context suspend command"));
1142 return eError; 1168 return eError;
1143 } 1169 }
1144 1170
1145 return eError; 1171 return eError;
1146} 1172}
1147 1173