PVRSRV_ERROR SysSystemPostPowerState(PVRSRV_SYS_POWER_STATE eNewPowerState) { PVRSRV_ERROR eError = PVRSRV_OK; PVR_PCI_DEV *psPVRPCI = (PVR_PCI_DEV *)(gsSysSpecificData.hSGXPCI); if (eNewPowerState != gpsSysData->eCurrentPowerState) { if ((gpsSysData->eCurrentPowerState == PVRSRV_SYS_POWER_STATE_D3) && (eNewPowerState < PVRSRV_SYS_POWER_STATE_D3)) { #if !defined(SUPPORT_DRI_DRM_EXT) eError = OSPCIResumeDev(gsSysSpecificData.hSGXPCI); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysSystemPostPowerState: OSPCIResumeDev failed (%d)", eError)); return eError; } #endif //Restore some pci state that will not have gotten restored properly by pci_restore_state() pci_write_config_dword(psPVRPCI->psPCIDev, 0x5c, gsSysSpecificData.saveBSM); pci_write_config_dword(psPVRPCI->psPCIDev, 0xFC, gsSysSpecificData.saveVBT); pci_write_config_dword(psPVRPCI->psPCIDev, MRST_PCIx_MSI_ADDR_LOC, gsSysSpecificData.msi_addr); pci_write_config_dword(psPVRPCI->psPCIDev, MRST_PCIx_MSI_DATA_LOC, gsSysSpecificData.msi_data); eError = SysLocateDevices(gpsSysData); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysSystemPostPowerState: Failed to locate devices")); return eError; } eError = SysMapInRegisters(); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysSystemPostPowerState: Failed to map in registers")); return eError; } #if !defined(SUPPORT_DRI_DRM_EXT) drm_irq_install(gpDrmDevice); #endif } } return eError; }
/*! ****************************************************************************** @Function SysSystemPostPowerState @Description Perform system-level processing required after a system power transition @Input eNewPowerState : @Return PVRSRV_ERROR : ******************************************************************************/ PVRSRV_ERROR SysSystemPostPowerState(PVRSRV_SYS_POWER_STATE eNewPowerState) { PVRSRV_ERROR eError = PVRSRV_OK; if (eNewPowerState != gpsSysData->eCurrentPowerState) { if ((gpsSysData->eCurrentPowerState == PVRSRV_SYS_POWER_STATE_D3) && (eNewPowerState < PVRSRV_SYS_POWER_STATE_D3)) { #ifdef __linux__ eError = OSPCIResumeDev(gsSysSpecificData.hSGXPCI); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysSystemPostPowerState: OSPCIResumeDev failed (%d)", eError)); } #endif /* Returning from D3 state. Find the device again as it may have been remapped. */ eError = SysLocateDevices(gpsSysData); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysSystemPostPowerState: Failed to locate devices")); return eError; } /* * Since this is a local memory architecture system, any local memory * which is currently in use must be restored before power up. */ SysSaveRestoreArenaLiveSegments(IMG_FALSE); /* * Map the system-level registers. */ eError = SysMapInRegisters(); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysSystemPostPowerState: Failed to map in registers")); return eError; } /* Reset Atlas. */ eError = SysInitRegisters(); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysSystemPostPowerState: Failed to Initialise registers")); return eError; } #if defined(SYS_USING_INTERRUPTS) if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNINSTALL_LISR)) { eError = OSInstallSystemLISR(gpsSysData, gsSGXDeviceMap.ui32IRQ); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysSystemPostPowerState: OSInstallSystemLISR failed to install ISR (%d)", eError)); } SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_LISR); SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNINSTALL_LISR); } if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_IRQ_DISABLE)) { SysEnableInterrupts(gpsSysData); SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_IRQ); SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_IRQ_DISABLE); } #endif /* defined(SYS_USING_INTERRUPTS) */ } } return eError; }
PVRSRV_ERROR SysSystemPostPowerState(PVRSRV_SYS_POWER_STATE eNewPowerState) { #if !defined(SUPPORT_DRI_DRM_EXT) PVRSRV_ERROR eError = PVRSRV_OK; if (eNewPowerState != gpsSysData->eCurrentPowerState) { if ((gpsSysData->eCurrentPowerState == PVRSRV_SYS_POWER_STATE_D3) && (eNewPowerState < PVRSRV_SYS_POWER_STATE_D3)) { eError = OSPCIResumeDev(gsSysSpecificData.hSGXPCI); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysSystemPostPowerState: OSPCIResumeDev failed (%d)", eError)); return eError; } eError = SysLocateDevices(gpsSysData); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysSystemPostPowerState: Failed to locate devices")); return eError; } eError = SysMapInRegisters(); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysSystemPostPowerState: Failed to map in registers")); return eError; } #if defined(SYS_USING_INTERRUPTS) if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNINSTALL_LISR)) { eError = OSInstallSystemLISR(gpsSysData, gsSGXDeviceMap.ui32IRQ); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysSystemPostPowerState: OSInstallSystemLISR failed to install ISR (%d)", eError)); } SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_LISR_INSTALLED); SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNINSTALL_LISR); } #endif if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_IRQ_DISABLE)) { SysEnableInterrupts(gpsSysData); SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_IRQ_ENABLED); SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_IRQ_DISABLE); } } } return eError; #else PVR_UNREFERENCED_PARAMETER(eNewPowerState); return PVRSRV_ERROR_NOT_SUPPORTED; #endif }