#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"
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);
l = readl(&psSGXHostCtl->ui32PowerStatus);
if (l & PVRSRV_USSE_EDM_POWMAN_POWEROFF_RESTART_IMMEDIATE)
- SGXScheduleProcessQueuesKM(psDeviceNode);
+ SGXScheduleProcessQueues(psDeviceNode);
}
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;
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");
PDUMPSUSPEND();
+ pvr_dev_lock();
+
eError =
PVRSRVSetDevicePowerStateKM(psDeviceNode->sDevId.ui32DeviceIndex,
PVRSRV_POWER_STATE_D0);
} else {
PVR_DPF(PVR_DBG_ERROR, "%s: can't power on device (%d)",
__func__, eError);
+ pvr_dev_unlock();
return eError;
}
if (ui32CallerID != ISR_ID)
SGXTestActivePowerEvent(psDeviceNode);
+ pvr_dev_unlock();
+
return eError;
}
-enum PVRSRV_ERROR SGXScheduleProcessQueuesKM(struct PVRSRV_DEVICE_NODE
- *psDeviceNode)
+enum PVRSRV_ERROR SGXScheduleProcessQueues(struct PVRSRV_DEVICE_NODE
+ *psDeviceNode)
{
enum PVRSRV_ERROR eError;
struct PVRSRV_SGXDEV_INFO *psDevInfo = psDeviceNode->pvDevice;
if ((ui32PowerStatus & PVRSRV_USSE_EDM_POWMAN_NO_WORK) != 0)
return PVRSRV_OK;
- sCommand.ui32Data[0] = PVRSRV_CCBFLAGS_PROCESS_QUEUESCMD;
eError =
- SGXScheduleCCBCommandKM(psDeviceNode, SGXMKIF_COMMAND_EDM_KICK,
- &sCommand, ISR_ID, 0);
+ PVRSRVSetDevicePowerStateKM(psDeviceNode->sDevId.ui32DeviceIndex,
+ PVRSRV_POWER_STATE_D0);
+ if (eError != PVRSRV_OK)
+ return eError;
+
+ sCommand.ui32Data[0] = PVRSRV_CCBFLAGS_PROCESS_QUEUESCMD;
+ eError = SGXScheduleCCBCommand(psDeviceNode->pvDevice,
+ SGXMKIF_COMMAND_EDM_KICK, &sCommand,
+ ISR_ID, 0);
if (eError != PVRSRV_OK) {
- PVR_DPF(PVR_DBG_ERROR, "SGXScheduleProcessQueuesKM failed "
- "to schedule CCB command: %lu",
- eError);
+ PVR_DPF(PVR_DBG_ERROR, "%s failed to schedule CCB command: %lu",
+ __func__, eError);
return PVRSRV_ERROR_GENERIC;
}
return PVRSRV_OK;
}
+enum PVRSRV_ERROR SGXScheduleProcessQueuesKM(struct PVRSRV_DEVICE_NODE
+ *psDeviceNode)
+{
+ enum PVRSRV_ERROR eError;
+
+ pvr_dev_lock();
+ eError = SGXScheduleProcessQueues(psDeviceNode);
+ pvr_dev_unlock();
+
+ return eError;
+}
+
IMG_BOOL SGXIsDevicePowered(struct PVRSRV_DEVICE_NODE *psDeviceNode)
{
return PVRSRVIsDevicePowered(psDeviceNode->sDevId.ui32DeviceIndex);
#endif
u32 l;
+ pvr_dev_lock();
if (readl(&psSGXHostCtl->ui32PowerStatus) &
PVRSRV_USSE_EDM_POWMAN_NO_WORK) {
;
PDUMPCOMMENTWITHFLAGS(0, "Clean-up event on uKernel disabled");
#endif
- SGXScheduleProcessQueuesKM(psDeviceNode);
+ SGXScheduleProcessQueues(psDeviceNode);
#if !defined(NO_HARDWARE)
if (PollForValueKM(&psSGXHostCtl->ui32ResManFlags,
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);
sizeof(u32), 0, hUniqueTag);
#endif
}
+ pvr_dev_unlock();
}
struct SGX_HW_RENDER_CONTEXT_CLEANUP {
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(