gpu: pvr: V2: Find and fix all incorrect sync counter completion checks
[sgx.git] / pvr / sgxutils.c
index 616aad4..b5e5b7d 100644 (file)
@@ -33,7 +33,7 @@
 #include "sgxinfo.h"
 #include "sgxinfokm.h"
 #include "sysconfig.h"
-#include "pdump_km.h"
+#include "pvr_pdump.h"
 #include "mmu.h"
 #include "pvr_bridge_km.h"
 #include "sgx_bridge_km.h"
@@ -51,6 +51,9 @@ static void SGXPostActivePowerEvent(struct PVRSRV_DEVICE_NODE *psDeviceNode)
                                             psDevInfo->psSGXHostCtl;
        u32 l;
 
+       /* To aid in calculating the next power down delay */
+       sgx_mark_power_down(psDeviceNode);
+
        l = readl(&psSGXHostCtl->ui32NumActivePowerEvents);
        l++;
        writel(l, &psSGXHostCtl->ui32NumActivePowerEvents);
@@ -67,6 +70,9 @@ void SGXTestActivePowerEvent(struct PVRSRV_DEVICE_NODE *psDeviceNode)
        struct SGXMKIF_HOST_CTL __iomem *psSGXHostCtl = psDevInfo->psSGXHostCtl;
        u32 l;
 
+       if (isSGXPerfServerActive())
+               return;
+
        l = readl(&psSGXHostCtl->ui32InterruptFlags);
        if (!(l & PVRSRV_USSE_EDM_INTERRUPT_ACTIVE_POWER))
                return;
@@ -169,7 +175,7 @@ enum PVRSRV_ERROR SGXScheduleCCBCommand(struct PVRSRV_SGXDEV_INFO *psDevInfo,
                PDUMPMEMPOL(psKernelCCB->psCCBCtlMemInfo,
                            offsetof(struct PVRSRV_SGX_CCB_CTL, ui32ReadOffset),
                            (psKernelCCB->ui32CCBDumpWOff + 1) & 0xff, 0xff,
-                           PDUMP_POLL_OPERATOR_NOTEQUAL, IMG_FALSE, IMG_FALSE,
+                           PDUMP_POLL_OPERATOR_NOTEQUAL,
                            MAKEUNIQUETAG(psKernelCCB->psCCBCtlMemInfo));
 
                PDUMPCOMMENTWITHFLAGS(0, "Kernel CCB command\r\n");
@@ -253,7 +259,7 @@ enum PVRSRV_ERROR SGXScheduleCCBCommandKM(
 
        PDUMPSUSPEND();
 
-       pvr_dvfs_lock();
+       pvr_dev_lock();
 
        eError =
            PVRSRVSetDevicePowerStateKM(psDeviceNode->sDevId.ui32DeviceIndex,
@@ -266,7 +272,7 @@ enum PVRSRV_ERROR SGXScheduleCCBCommandKM(
        } else {
                PVR_DPF(PVR_DBG_ERROR, "%s: can't power on device (%d)",
                                        __func__, eError);
-               pvr_dvfs_unlock();
+               pvr_dev_unlock();
                return eError;
        }
 
@@ -276,7 +282,7 @@ enum PVRSRV_ERROR SGXScheduleCCBCommandKM(
        if (ui32CallerID != ISR_ID)
                SGXTestActivePowerEvent(psDeviceNode);
 
-       pvr_dvfs_unlock();
+       pvr_dev_unlock();
 
        return eError;
 }
@@ -319,9 +325,9 @@ enum PVRSRV_ERROR SGXScheduleProcessQueuesKM(struct PVRSRV_DEVICE_NODE
 {
        enum PVRSRV_ERROR eError;
 
-       pvr_dvfs_lock();
+       pvr_dev_lock();
        eError = SGXScheduleProcessQueues(psDeviceNode);
-       pvr_dvfs_unlock();
+       pvr_dev_unlock();
 
        return eError;
 }
@@ -367,7 +373,7 @@ void SGXCleanupRequest(struct PVRSRV_DEVICE_NODE *psDeviceNode,
 #endif
        u32 l;
 
-       pvr_dvfs_lock();
+       pvr_dev_lock();
        if (readl(&psSGXHostCtl->ui32PowerStatus) &
             PVRSRV_USSE_EDM_POWMAN_NO_WORK) {
                ;
@@ -438,8 +444,7 @@ void SGXCleanupRequest(struct PVRSRV_DEVICE_NODE *psDeviceNode,
                            offsetof(struct SGXMKIF_HOST_CTL, ui32ResManFlags),
                            PVRSRV_USSE_EDM_RESMAN_CLEANUP_COMPLETE,
                            PVRSRV_USSE_EDM_RESMAN_CLEANUP_COMPLETE,
-                           PDUMP_POLL_OPERATOR_EQUAL, IMG_FALSE, IMG_FALSE,
-                           hUniqueTag);
+                           PDUMP_POLL_OPERATOR_EQUAL, hUniqueTag);
 #endif
 
                l = readl(&psSGXHostCtl->ui32ResManFlags);
@@ -456,7 +461,7 @@ void SGXCleanupRequest(struct PVRSRV_DEVICE_NODE *psDeviceNode,
                         sizeof(u32), 0, hUniqueTag);
 #endif
        }
-       pvr_dvfs_unlock();
+       pvr_dev_unlock();
 }
 
 struct SGX_HW_RENDER_CONTEXT_CLEANUP {
@@ -639,16 +644,26 @@ enum PVRSRV_ERROR SGXUnregisterHWTransferContextKM(void *hHWTransferContext)
        return PVRSRV_OK;
 }
 
+
+
+static inline int sync_cnt_after_eq(u32 c1, u32 c2)
+{
+       return (int)(c1 - c2) >= 0;
+}
+
+
+
 static inline IMG_BOOL SGX2DQuerySyncOpsComplete(
                                struct PVRSRV_KERNEL_SYNC_INFO *psSyncInfo,
                                u32 ui32ReadOpsPending, u32 ui32WriteOpsPending)
 {
        struct PVRSRV_SYNC_DATA *psSyncData = psSyncInfo->psSyncData;
 
-       return (IMG_BOOL)((psSyncData->ui32ReadOpsComplete >=
-                               ui32ReadOpsPending) &&
-                          (psSyncData->ui32WriteOpsComplete >=
-                               ui32WriteOpsPending));
+       return (IMG_BOOL)(
+               sync_cnt_after_eq(
+                       psSyncData->ui32ReadOpsComplete, ui32ReadOpsPending) &&
+               sync_cnt_after_eq(
+                       psSyncData->ui32WriteOpsComplete, ui32WriteOpsPending));
 }
 
 enum PVRSRV_ERROR SGX2DQueryBlitsCompleteKM(