[PVR/GFX]: Enable one IMG option to avoid SGX lock up
authorRandy Xu <randy.xu@intel.com>
Sat, 9 Jun 2012 03:25:01 +0000 (11:25 +0800)
committerbuildbot <buildbot@intel.com>
Fri, 15 Jun 2012 18:08:15 +0000 (11:08 -0700)
BZ: 37183

Per IMG's suggestion, enable kernel driver option to avoid SGX lock up
   SUPPORT_DC_CMDCOMPLETE_WHEN_NO_LONGER_DISPLAYED := 1

More, Mark solves the tearing issue introduced by this option

Change-Id: I280ece6cfaa09e97e24dae8b4a92058ad27ba17b
Signed-off-by: Randy Xu <randy.xu@intel.com>
Signed-off-by: Tong, Bo <box.tong@intel.com>
Reviewed-on: http://android.intel.com:8080/52258
Reviewed-by: buildbot <buildbot@intel.com>
Tested-by: buildbot <buildbot@intel.com>
drivers/staging/mrst/medfield/Makefile
drivers/staging/mrst/pvr/services4/3rdparty/linux_framebuffer_drm/drmlfb.h
drivers/staging/mrst/pvr/services4/3rdparty/linux_framebuffer_drm/drmlfb_displayclass.c

index cf81542..ecf86e8 100644 (file)
@@ -88,7 +88,9 @@ ccflags-y += \
     -DDRM_PVR_USE_INTEL_FB \
        -DSUPPORT_MEMINFO_IDS \
     -DSUPPORT_SGX_NEW_STATUS_VALS \
-    -DSUPPORT_LARGE_GENERAL_HEAP
+    -DSUPPORT_LARGE_GENERAL_HEAP \
+    -DSUPPORT_DC_CMDCOMPLETE_WHEN_NO_LONGER_DISPLAYED\
+    -DSUPPORT_CUSTOM_SWAP_OPERATIONS
 
 #    -DSUPPORT_PDUMP_MULTI_PROCESS \
 
index 97bdfb9..851a3b9 100644 (file)
@@ -149,7 +149,7 @@ typedef struct MRSTLFB_SWAPCHAIN_TAG
        struct MRSTLFB_SWAPCHAIN_TAG *psNext;
 
        struct MRSTLFB_DEVINFO_TAG *psDevInfo;
-
+       MRSTLFB_VSYNC_FLIP_ITEM sLastItem;
 } MRSTLFB_SWAPCHAIN;
 
 typedef struct MRSTLFB_DEVINFO_TAG
index f07de01..dbc2526 100644 (file)
@@ -93,6 +93,28 @@ static IMG_BOOL MRSTLFBFlip(MRSTLFB_DEVINFO *psDevInfo,
        return IMG_TRUE;
 }
 
+static inline void MRSTFBFlipComplete(MRSTLFB_SWAPCHAIN *psSwapChain, MRSTLFB_VSYNC_FLIP_ITEM* psFlipItem, MRST_BOOL bSchedule)
+{
+       MRSTLFB_VSYNC_FLIP_ITEM *psLastItem;
+       SYS_DATA                                *psSysData;
+       MRST_BOOL bMISRScheduled = MRST_FALSE;
+       SysAcquireData(&psSysData);
+       if (psSwapChain) {
+               psLastItem = &(psSwapChain->sLastItem);
+               if (psLastItem->bValid && psLastItem->bFlipped && psLastItem->bCmdCompleted == MRST_FALSE)
+               {
+                       psSwapChain->psPVRJTable->pfnPVRSRVCmdComplete((IMG_HANDLE)psLastItem->hCmdComplete, MRST_TRUE);
+                       psLastItem->bCmdCompleted = MRST_TRUE;
+                       bMISRScheduled = MRST_TRUE;
+               }
+               if (psFlipItem)
+                       psSwapChain->sLastItem = *psFlipItem;
+       }
+       if (bSchedule && !bMISRScheduled)
+               OSScheduleMISR(psSysData);
+}
+
+
 static void MRSTLFBFlipOverlay(MRSTLFB_DEVINFO *psDevInfo,
                        struct intel_overlay_context *psContext)
 {
@@ -224,6 +246,7 @@ static IMG_BOOL FlushInternalVSyncQueue(MRSTLFB_SWAPCHAIN *psSwapChain,
        psFlipItem = &psSwapChain->psVSyncFlips[psSwapChain->ulRemoveIndex];
        ulMaxIndex = psSwapChain->ulSwapChainLength - 1;
 
+       MRSTFBFlipComplete(psSwapChain, NULL, MRST_TRUE);
        for(i = 0; i < psSwapChain->ulSwapChainLength; i++)
        {
                if (psFlipItem->bValid == MRST_FALSE)
@@ -741,7 +764,7 @@ static PVRSRV_ERROR CreateDCSwapChain(IMG_HANDLE hDevice,
        }
 
 
-       ulSwapChainLength = ui32BufferCount + 1;
+       ulSwapChainLength = ui32BufferCount + 6;
 
 
        if(psDstSurfAttrib->pixelformat != psDevInfo->sDisplayFormat.pixelformat
@@ -786,7 +809,6 @@ static PVRSRV_ERROR CreateDCSwapChain(IMG_HANDLE hDevice,
                eError = PVRSRV_ERROR_OUT_OF_MEMORY;
                goto ErrorFreeSwapChain;
        }
-
        ppsBuffer = (MRSTLFB_BUFFER**)MRSTLFBAllocKernelMem(sizeof(MRSTLFB_BUFFER*) * ui32BufferCount);
        if(!ppsBuffer)
        {
@@ -810,7 +832,7 @@ static PVRSRV_ERROR CreateDCSwapChain(IMG_HANDLE hDevice,
        psSwapChain->ulInsertIndex = 0;
        psSwapChain->ulRemoveIndex = 0;
        psSwapChain->psPVRJTable = &psDevInfo->sPVRJTable;
-
+       psSwapChain->sLastItem.bValid = MRST_FALSE;
 
 
        for (i = 0; i < ui32BufferCount; i++)
@@ -899,7 +921,6 @@ static PVRSRV_ERROR DestroyDCSwapChain(IMG_HANDLE hDevice,
        {
                return (PVRSRV_ERROR_INVALID_PARAMS);
        }
-
        psDevInfo = (MRSTLFB_DEVINFO*)hDevice;
        psSwapChain = (MRSTLFB_SWAPCHAIN*)hSwapChain;
 
@@ -1122,10 +1143,11 @@ static PVRSRV_ERROR SwapToDCSystem(IMG_HANDLE hDevice,
        return (PVRSRV_OK);
 }
 
+
 static MRST_BOOL MRSTLFBVSyncIHandler(MRSTLFB_DEVINFO *psDevInfo, int iPipe)
 {
        MRST_BOOL bStatus = MRST_FALSE;
-       MRSTLFB_VSYNC_FLIP_ITEM *psFlipItem;
+       MRSTLFB_VSYNC_FLIP_ITEM *psFlipItem, *psLastItem;
        unsigned long ulMaxIndex;
        unsigned long ulLockFlags;
        MRSTLFB_SWAPCHAIN *psSwapChain;
@@ -1152,7 +1174,7 @@ static MRST_BOOL MRSTLFBVSyncIHandler(MRSTLFB_DEVINFO *psDevInfo, int iPipe)
                                MRST_BOOL bScheduleMISR;
 
                                bScheduleMISR = MRST_TRUE;
-                               psSwapChain->psPVRJTable->pfnPVRSRVCmdComplete((IMG_HANDLE)psFlipItem->hCmdComplete, bScheduleMISR);
+                               MRSTFBFlipComplete(psSwapChain, psFlipItem, MRST_TRUE);
                                psFlipItem->bCmdCompleted = MRST_TRUE;
                        }
 
@@ -1186,7 +1208,6 @@ static MRST_BOOL MRSTLFBVSyncIHandler(MRSTLFB_DEVINFO *psDevInfo, int iPipe)
                                                &psFlipItem->sPlaneContexts);
                        psFlipItem->bFlipped = MRST_TRUE;
 
-
                        break;
                }
 
@@ -1264,6 +1285,7 @@ static IMG_BOOL ProcessFlip2(IMG_HANDLE hCmdCookie,
                                        IMG_TRUE);
                        goto ExitErrorUnlock;
                }
+               MRSTFBFlipComplete(psSwapChain, NULL, MRST_FALSE);
                psSwapChain->psPVRJTable->pfnPVRSRVCmdComplete(hCmdCookie,
                                                                IMG_TRUE);
 #if defined(MRST_USING_INTERRUPTS)
@@ -1301,7 +1323,6 @@ static IMG_BOOL ProcessFlip2(IMG_HANDLE hCmdCookie,
 
        if (psFlipItem->bValid == MRST_FALSE) {
                unsigned long ulMaxIndex = psSwapChain->ulSwapChainLength - 1;
-
                if (psSwapChain->ulInsertIndex == psSwapChain->ulRemoveIndex) {
                        /*update sprite plane context*/
                        if (DRMLFBFlipBuffer2(
@@ -1406,6 +1427,7 @@ static IMG_BOOL ProcessFlip(IMG_HANDLE  hCmdCookie,
                        goto ExitErrorUnlock;
                }
 
+               MRSTFBFlipComplete(psSwapChain, NULL, MRST_FALSE);
                psSwapChain->psPVRJTable->pfnPVRSRVCmdComplete(hCmdCookie, IMG_TRUE);
 
 #if defined(MRST_USING_INTERRUPTS)
@@ -1439,7 +1461,6 @@ static IMG_BOOL ProcessFlip(IMG_HANDLE  hCmdCookie,
        if(psFlipItem->bValid == MRST_FALSE)
        {
                unsigned long ulMaxIndex = psSwapChain->ulSwapChainLength - 1;
-
                if(psSwapChain->ulInsertIndex == psSwapChain->ulRemoveIndex)
                {
                        if (DRMLFBFlipBuffer(psDevInfo,
@@ -1940,6 +1961,17 @@ static MRST_ERROR InitDev(MRSTLFB_DEVINFO *psDevInfo)
        return MRST_OK;
 }
 
+IMG_VOID MRSTQuerySwapCommand(IMG_HANDLE hDev, IMG_HANDLE hSwap, IMG_HANDLE hBuffer, IMG_HANDLE hTag, IMG_UINT16* ID, IMG_BOOL* bAddRef)
+{
+       UNREFERENCED_PARAMETER(hDev);
+       UNREFERENCED_PARAMETER(hSwap);
+       UNREFERENCED_PARAMETER(hBuffer);
+       UNREFERENCED_PARAMETER(hTag);
+       UNREFERENCED_PARAMETER(ID);
+       *bAddRef = IMG_FALSE;
+}
+
+
 MRST_ERROR MRSTLFBInit(struct drm_device * dev)
 {
 
@@ -2033,6 +2065,7 @@ MRST_ERROR MRSTLFBInit(struct drm_device * dev)
                psDevInfo->sDCJTable.pfnSwapToDCSystem = SwapToDCSystem;
                psDevInfo->sDCJTable.pfnSetDCState = SetDCState;
                psDevInfo->sDCJTable.pfnGetDCFrontBuffer = GetDCFrontBuffer;
+               psDevInfo->sDCJTable.pfnQuerySwapCommandID = MRSTQuerySwapCommand;
 
 
                if(psDevInfo->sPVRJTable.pfnPVRSRVRegisterDCDevice (