/*! ****************************************************************************** @Function PCIDeInitDev @Description Uninitialise the PCI device when it is no loger required @Input psSysData : System data @Return none ******************************************************************************/ static IMG_VOID PCIDeInitDev(SYS_DATA *psSysData) { SYS_SPECIFIC_DATA *psSysSpecData; psSysSpecData = (SYS_SPECIFIC_DATA *) psSysData->pvSysSpecificData; if(SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_ENABLE_PCI_MEM)) { OSPCIReleaseAddrRange(psSysSpecData->hSGXPCI, SYS_SGX_MEM_PCI_BASENUM); } if(SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_ENABLE_PCI_REG)) { OSPCIReleaseAddrRange(psSysSpecData->hSGXPCI, SYS_SGX_REG_PCI_BASENUM); } if(SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_ENABLE_PCI_ATL)) { OSPCIReleaseAddrRange(psSysSpecData->hSGXPCI, SYS_ATLAS_REG_PCI_BASENUM); } if(SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_ENABLE_PCI_DEV)) { OSPCIReleaseDev(psSysSpecData->hSGXPCI); } }
/*! ****************************************************************************** @Function SysSystemPrePowerState @Description Perform system-level processing required before a system power transition @Input eNewPowerState : @Return PVRSRV_ERROR : ******************************************************************************/ PVRSRV_ERROR SysSystemPrePowerState(PVRSRV_SYS_POWER_STATE eNewPowerState) { PVRSRV_ERROR eError= PVRSRV_OK; if (eNewPowerState != gpsSysData->eCurrentPowerState) { if ((eNewPowerState == PVRSRV_SYS_POWER_STATE_D3) && (gpsSysData->eCurrentPowerState < PVRSRV_SYS_POWER_STATE_D3)) { /* * About to enter D3 state. */ #if defined(SYS_USING_INTERRUPTS) if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_IRQ)) { SysDisableInterrupts(gpsSysData); SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_IRQ_DISABLE); SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_IRQ); } if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_LISR)) { eError = OSUninstallSystemLISR(gpsSysData); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysSystemPrePowerState: OSUninstallSystemLISR failed (%d)", eError)); } SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNINSTALL_LISR); SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_LISR); } #endif /* defined(SYS_USING_INTERRUPTS) */ /* * Since this is a local memory architecture system, * any local memory which is currently in use must * be saved before power down. */ SysSaveRestoreArenaLiveSegments(IMG_TRUE); /* * Unmap the system-level registers. */ SysUnmapRegisters(); #ifdef __linux__ eError = OSPCISuspendDev(gsSysSpecificData.hSGXPCI); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysSystemPrePowerState: OSPCISuspendDev failed (%d)", eError)); } #endif } } return eError; }
/*! ****************************************************************************** @Function SysEnableSGXInterrupts @Description Enables SGX interrupts @Input psSysData @Return IMG_VOID ******************************************************************************/ IMG_VOID SysEnableSGXInterrupts(SYS_DATA *psSysData) { SYS_SPECIFIC_DATA *psSysSpecData = (SYS_SPECIFIC_DATA *)psSysData->pvSysSpecificData; if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_ENABLE_LISR) && !SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_IRQ_ENABLED)) { OSWriteHWReg(gpvOCPRegsLinAddr, EUR_CR_OCP_IRQSTATUS_2, 0x1); OSWriteHWReg(gpvOCPRegsLinAddr, EUR_CR_OCP_IRQENABLE_SET_2, 0x1); SYS_SPECIFIC_DATA_SET(psSysSpecData, SYS_SPECIFIC_DATA_IRQ_ENABLED); } }
/***********************************************************************//** * Perform system-level processing required after a system power transition * * @param eNewPowerState Power state we're switching to * * @returns PVRSRV_OK for success, or failure code **************************************************************************/ 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)) { /* * 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; } /* * Remap the system-level registers. */ 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 /* defined (SYS_USING_INTERRUPTS) */ 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; }
PVRSRV_ERROR SysSystemPrePowerState(PVRSRV_SYS_POWER_STATE eNewPowerState) { #if !defined(SUPPORT_DRI_DRM_EXT) PVRSRV_ERROR eError= PVRSRV_OK; if (eNewPowerState != gpsSysData->eCurrentPowerState) { if ((eNewPowerState == PVRSRV_SYS_POWER_STATE_D3) && (gpsSysData->eCurrentPowerState < PVRSRV_SYS_POWER_STATE_D3)) { if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_IRQ_ENABLED)) { SysDisableInterrupts(gpsSysData); SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_IRQ_DISABLE); SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData, SYS_SPECIFIC_DATA_IRQ_ENABLED); } #if defined(SYS_USING_INTERRUPTS) if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_LISR_INSTALLED)) { eError = OSUninstallSystemLISR(gpsSysData); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysSystemPrePowerState: OSUninstallSystemLISR failed (%d)", eError)); } SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNINSTALL_LISR); SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData, SYS_SPECIFIC_DATA_LISR_INSTALLED); } #endif SysUnmapRegisters(); eError = OSPCISuspendDev(gsSysSpecificData.hSGXPCI); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysSystemPrePowerState: OSPCISuspendDev failed (%d)", eError)); } } } return eError; #else PVR_UNREFERENCED_PARAMETER(eNewPowerState); return PVRSRV_ERROR_NOT_SUPPORTED; #endif }
/*! ****************************************************************************** @Function SysSystemPostPowerState @Description Perform system-level processing required after a power transition @Input eNewPowerState : @Return PVRSRV_ERROR ******************************************************************************/ PVRSRV_ERROR SysSystemPostPowerState(PVRSRV_SYS_POWER_STATE eNewPowerState) { PVRSRV_ERROR eError = PVRSRV_OK; if (eNewPowerState == PVRSRV_SYS_POWER_STATE_D0) { PVR_TRACE(("SysSystemPostPowerState: Entering state D0")); if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_DISABLE_SYSCLOCKS)) { eError = EnableSystemClocksWrap(gpsSysData); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysSystemPostPowerState: EnableSystemClocksWrap failed (%d)", eError)); return eError; } SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_SYSCLOCKS); SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_DISABLE_SYSCLOCKS); } #if defined(SYS_USING_INTERRUPTS) if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNINSTALL_LISR)) { #if defined(SYS_CUSTOM_POWERLOCK_WRAP) IMG_BOOL bWrapped = WrapSystemPowerChange(&gsSysSpecificData); #endif eError = OSInstallDeviceLISR(gpsSysData, gsSGXDeviceMap.ui32IRQ, "SGX ISR", gpsSGXDevNode); #if defined(SYS_CUSTOM_POWERLOCK_WRAP) if (bWrapped) { UnwrapSystemPowerChange(&gsSysSpecificData); } #endif if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysSystemPostPowerState: OSInstallDeviceLISR failed to install ISR (%d)", eError)); return eError; } SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_LISR); SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNINSTALL_LISR); } #endif } return eError; }
static IMG_VOID PCIDeInitDev(SYS_DATA *psSysData) { SYS_SPECIFIC_DATA *psSysSpecData = (SYS_SPECIFIC_DATA *) psSysData->pvSysSpecificData; if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_PCI_REQUEST_SGX_ADDR_RANGE)) { OSPCIReleaseAddrRange(psSysSpecData->hSGXPCI, POULSBO_ADDR_RANGE_INDEX); } #if defined(SGX_FEATURE_HOST_PORT) if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_PCI_REQUEST_HOST_PORT_RANGE)) { OSPCIReleaseAddrRange(psSysSpecData->hSGXPCI, POULSBO_HP_ADDR_RANGE_INDEX); } #endif if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_PCI_ACQUIRE_DEV)) { OSPCIReleaseDev(psSysSpecData->hSGXPCI); } }
/*! ****************************************************************************** @Function SysDisableSGXInterrupts @Description Disables SGX interrupts @Input psSysData @Return IMG_VOID ******************************************************************************/ IMG_VOID SysDisableSGXInterrupts(SYS_DATA *psSysData) { SYS_SPECIFIC_DATA *psSysSpecData = (SYS_SPECIFIC_DATA *)psSysData->pvSysSpecificData; if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_IRQ_ENABLED)) { OSWriteHWReg(gpvOCPRegsLinAddr, EUR_CR_OCP_IRQENABLE_CLR_2, 0x1); SYS_SPECIFIC_DATA_CLEAR(psSysSpecData, SYS_SPECIFIC_DATA_IRQ_ENABLED); } }
/***********************************************************************//** * Perform system-level processing required before a system power transition * * @param eNewPowerState Power state we're switching to * * @returns PVRSRV_OK for success, or failure code **************************************************************************/ PVRSRV_ERROR SysSystemPrePowerState(PVRSRV_SYS_POWER_STATE eNewPowerState) { PVRSRV_ERROR eError= PVRSRV_OK; if (eNewPowerState != gpsSysData->eCurrentPowerState) { if ((eNewPowerState == PVRSRV_SYS_POWER_STATE_D3) && (gpsSysData->eCurrentPowerState < PVRSRV_SYS_POWER_STATE_D3)) { /* * About to enter D3 state. */ if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_IRQ_ENABLED)) { SysDisableInterrupts(gpsSysData); SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_IRQ_DISABLE); SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData, SYS_SPECIFIC_DATA_IRQ_ENABLED); } #if defined (SYS_USING_INTERRUPTS) if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_LISR_INSTALLED)) { eError = OSUninstallSystemLISR(gpsSysData); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysSystemPrePowerState: OSUninstallSystemLISR failed (%d)", eError)); } SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNINSTALL_LISR); SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData, SYS_SPECIFIC_DATA_LISR_INSTALLED); } #endif /* defined (SYS_USING_INTERRUPTS) */ /* * Unmap the system-level registers. */ SysUnmapRegisters(); } } return eError; }
/*! ****************************************************************************** @Function SysDeinitialise @Description De-initialises kernel services at 'driver unload' time @Return PVRSRV_ERROR ******************************************************************************/ PVRSRV_ERROR SysDeinitialise (SYS_DATA *psSysData) { PVRSRV_ERROR eError; PVR_UNREFERENCED_PARAMETER(psSysData); if(gpsSysData->pvSOCTimerRegisterKM) { OSUnReservePhys(gpsSysData->pvSOCTimerRegisterKM, 4, PVRSRV_HAP_MULTI_PROCESS|PVRSRV_HAP_UNCACHED, gpsSysData->hSOCTimerRegisterOSMemHandle); } #if defined(SYS_USING_INTERRUPTS) if (SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_LISR)) { eError = OSUninstallDeviceLISR(gpsSysData); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: OSUninstallDeviceLISR failed")); return eError; } } #endif if (SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_MISR)) { eError = OSUninstallMISR(gpsSysData); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: OSUninstallMISR failed")); return eError; } } if (SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_INITDEV)) { #if defined(SUPPORT_ACTIVE_POWER_MANAGEMENT) PVR_ASSERT(SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_SYSCLOCKS)); /* Reenable SGX clocks whilst SGX is being deinitialised. */ eError = EnableSGXClocksWrap(gpsSysData); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: EnableSGXClocks failed")); return eError; } #endif /* SUPPORT_ACTIVE_POWER_MANAGEMENT */ /* Deinitialise SGX */ eError = PVRSRVDeinitialiseDevice(gui32SGXDeviceID); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: failed to de-init the device")); return eError; } } /* Disable system clocks. Must happen after last access to hardware */ if (SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_SYSCLOCKS)) { DisableSystemClocks(gpsSysData); } if (SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData, SYS_SPECIFIC_DATA_DVFS_INIT)) { eError = SysDvfsDeinitialize(gpsSysSpecificData); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: Failed to de-init DVFS")); gpsSysData = IMG_NULL; return eError; } } if (SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_PM_RUNTIME)) { eError = SysPMRuntimeUnregister(); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: Failed to unregister with OSPM!")); gpsSysData = IMG_NULL; return eError; } } if (SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_ENVDATA)) { eError = OSDeInitEnvData(gpsSysData->pvEnvSpecificData); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: failed to de-init env structure")); return eError; } } SysDeinitialiseCommon(gpsSysData); #if defined(NO_HARDWARE) || defined(SGX_OCP_REGS_ENABLED) if(gsSGXRegsCPUVAddr != IMG_NULL) { #if defined(NO_HARDWARE) /* Free hardware resources. */ OSBaseFreeContigMemory(SYS_OMAP3630_SGX_REGS_SIZE, gsSGXRegsCPUVAddr, gsSGXDeviceMap.sRegsCpuPBase); #else #if defined(SGX_OCP_REGS_ENABLED) OSUnMapPhysToLin(gsSGXRegsCPUVAddr, gsSGXDeviceMap.ui32RegsSize, PVRSRV_HAP_UNCACHED|PVRSRV_HAP_KERNEL_ONLY, IMG_NULL); gpvOCPRegsLinAddr = IMG_NULL; #endif #endif /* defined(NO_HARDWARE) */ gsSGXRegsCPUVAddr = IMG_NULL; gsSGXDeviceMap.pvRegsCpuVBase = gsSGXRegsCPUVAddr; } #endif /* defined(NO_HARDWARE) || defined(SGX_OCP_REGS_ENABLED) */ gpsSysSpecificData->ui32SysSpecificData = 0; gpsSysSpecificData->bSGXInitComplete = IMG_FALSE; gpsSysData = IMG_NULL; return PVRSRV_OK; }
/***********************************************************************//** * Unmap the CPU virtual memory from the registers * * @returns PVRSRV_OK for success, or failure code **************************************************************************/ static PVRSRV_ERROR SysUnmapRegisters(void) { PVRSRV_DEVICE_NODE *psDeviceNodeList; psDeviceNodeList = gpsSysData->psDeviceNodeList; while (psDeviceNodeList) { switch (psDeviceNodeList->sDevId.eDeviceType) { case PVRSRV_DEVICE_TYPE_SGX: { PVRSRV_SGXDEV_INFO *psDevInfo = (PVRSRV_SGXDEV_INFO *) psDeviceNodeList->pvDevice; #if !defined(NO_HARDWARE) /* Unmap Regs */ if (psDevInfo->pvRegsBaseKM) { OSUnMapPhysToLin(psDevInfo->pvRegsBaseKM, gsSGXDeviceMap.ui32RegsSize, PVRSRV_HAP_KERNEL_ONLY|PVRSRV_HAP_UNCACHED, IMG_NULL); SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNMAP_SGX_REGS); } #endif psDevInfo->pvRegsBaseKM = IMG_NULL; psDevInfo->ui32RegSize = 0; psDevInfo->sRegsPhysBase.uiAddr = 0; break; } #ifdef SUPPORT_MSVDX case PVRSRV_DEVICE_TYPE_MSVDX: { PVRSRV_MSVDXDEV_INFO *psDevInfo = (PVRSRV_MSVDXDEV_INFO *) psDeviceNodeList->pvDevice; #if !defined(NO_HARDWARE) if (psDevInfo->pvRegsBaseKM) { OSUnMapPhysToLin(psDevInfo->pvRegsBaseKM, psDevInfo->ui32RegSize, PVRSRV_HAP_KERNEL_ONLY|PVRSRV_HAP_UNCACHED, IMG_NULL); SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNMAP_MSVDX_REGS); } #endif psDevInfo->pvRegsBaseKM = IMG_NULL; psDevInfo->ui32RegSize = 0; psDevInfo->sRegsPhysBase.uiAddr = 0; break; } #endif /* SUPPORT_MSVDX */ default: /* Ignore unknowns */ break; } psDeviceNodeList = psDeviceNodeList->psNext; } #if defined(NO_HARDWARE) #if defined(SUPPORT_MSVDX) if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_DUMMY_MSVDX_REGS)) { PVR_ASSERT(gsMSVDXDeviceMap); OSBaseFreeContigMemory(MSVDX_REG_SIZE, gsMSVDXDeviceMap.sRegsCpuVBase, gsMSVDXDeviceMap.sRegsCpuPBase); SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData, SYS_SPECIFIC_DATA_DUMMY_MSVDX_REGS); } #endif /* defined(SUPPORT_MSVDX) */ if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_DUMMY_SGX_REGS)) { OSBaseFreeContigMemory(SYS_SGX_REG_SIZE, gsSGXDeviceMap.pvRegsCpuVBase, gsSGXDeviceMap.sRegsCpuPBase); SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData, SYS_SPECIFIC_DATA_DUMMY_SGX_REGS); } #endif /* defined(NO_HARDWARE) */ #if !defined(NO_HARDWARE) if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_SOC_REGS_MAPPED)) { OSUnMapPhysToLin(gsSOCDeviceMap.sRegsCpuVBase, SYS_SOC_REG_SIZE, PVRSRV_HAP_KERNEL_ONLY | PVRSRV_HAP_UNCACHED, IMG_NULL); SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData, SYS_SPECIFIC_DATA_SOC_REGS_MAPPED); } #endif return PVRSRV_OK; }
static PVRSRV_ERROR SysMapInRegisters(IMG_VOID) { PVRSRV_DEVICE_NODE *psDeviceNodeList; psDeviceNodeList = gpsSysData->psDeviceNodeList; while (psDeviceNodeList) { switch(psDeviceNodeList->sDevId.eDeviceType) { case PVRSRV_DEVICE_TYPE_SGX: { PVRSRV_SGXDEV_INFO *psDevInfo = (PVRSRV_SGXDEV_INFO *)psDeviceNodeList->pvDevice; if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNMAP_SGX_REGS)) { psDevInfo->pvRegsBaseKM = OSMapPhysToLin(gsSGXDeviceMap.sRegsCpuPBase, gsSGXDeviceMap.ui32RegsSize, PVRSRV_HAP_KERNEL_ONLY|PVRSRV_HAP_UNCACHED, IMG_NULL); if (!psDevInfo->pvRegsBaseKM) { PVR_DPF((PVR_DBG_ERROR,"SysMapInRegisters : Failed to map in SGX registers\n")); return PVRSRV_ERROR_BAD_MAPPING; } SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNMAP_SGX_REGS); } psDevInfo->ui32RegSize = gsSGXDeviceMap.ui32RegsSize; psDevInfo->sRegsPhysBase = gsSGXDeviceMap.sRegsSysPBase; #if defined(SGX_FEATURE_HOST_PORT) if (gsSGXDeviceMap.ui32Flags & SGX_HOSTPORT_PRESENT) { if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNMAP_SGX_HP)) { psDevInfo->pvHostPortBaseKM = OSMapPhysToLin(gsSGXDeviceMap.sHPCpuPBase, gsSGXDeviceMap.ui32HPSize, PVRSRV_HAP_KERNEL_ONLY|PVRSRV_HAP_UNCACHED, IMG_NULL); if (!psDevInfo->pvHostPortBaseKM) { PVR_DPF((PVR_DBG_ERROR,"SysMapInRegisters : Failed to map in host port\n")); return PVRSRV_ERROR_BAD_MAPPING; } SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNMAP_SGX_HP); } psDevInfo->ui32HPSize = gsSGXDeviceMap.ui32HPSize; psDevInfo->sHPSysPAddr = gsSGXDeviceMap.sHPSysPBase; } #endif break; } default: break; } psDeviceNodeList = psDeviceNodeList->psNext; } return PVRSRV_OK; }
PVRSRV_ERROR SysDeinitialise (SYS_DATA *psSysData) { PVRSRV_ERROR eError; SYS_SPECIFIC_DATA *psSysSpecData = (SYS_SPECIFIC_DATA *) psSysData->pvSysSpecificData; #if (defined(SYS_USING_INTERRUPTS) && !defined(SUPPORT_DRI_DRM_EXT)) if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_IRQ_ENABLED)) { SysDisableInterrupts(psSysData); } #endif #if defined(SYS_USING_INTERRUPTS) && !defined(SUPPORT_DRI_DRM_EXT) if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_LISR_INSTALLED)) { eError = OSUninstallSystemLISR(psSysData); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: OSUninstallSystemLISR failed")); return eError; } } #endif if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_MISR_INSTALLED)) { eError = OSUninstallMISR(psSysData); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: OSUninstallMISR failed")); return eError; } } if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_SGX_INITIALISED)) { eError = PVRSRVDeinitialiseDevice(gui32SGXDeviceID); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: failed to de-init the device")); return eError; } } SysFreeVersionString(psSysData); PCIDeInitDev(psSysData); eError = OSDeInitEnvData(psSysData->pvEnvSpecificData); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: failed to de-init env structure")); return eError; } SysDeinitialiseCommon(gpsSysData); #if !defined(NO_HARDWARE) OSUnMapPhysToLin(gsPoulsboRegsCPUVaddr, POULSBO_REG_SIZE, PVRSRV_HAP_KERNEL_ONLY|PVRSRV_HAP_UNCACHED, IMG_NULL); OSUnMapPhysToLin(gsPoulsboDisplayRegsCPUVaddr, POULSBO_DISPLAY_REG_SIZE, PVRSRV_HAP_KERNEL_ONLY|PVRSRV_HAP_UNCACHED, IMG_NULL); #endif if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_PDUMP_INIT)) { PDUMPDEINIT(); } gpsSysData = IMG_NULL; return PVRSRV_OK; }
PVRSRV_ERROR SysDeinitialise (SYS_DATA *psSysData) { PVRSRV_ERROR eError; #if defined(SYS_USING_INTERRUPTS) if (SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_LISR)) { eError = OSUninstallDeviceLISR(psSysData); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: OSUninstallDeviceLISR failed")); return eError; } } #endif if (SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_MISR)) { eError = OSUninstallMISR(psSysData); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: OSUninstallMISR failed")); return eError; } } if (SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_INITDEV)) { #if defined(SUPPORT_ACTIVE_POWER_MANAGEMENT) PVR_ASSERT(SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_SYSCLOCKS)); eError = EnableSGXClocksWrap(gpsSysData); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: EnableSGXClocks failed")); return eError; } #endif eError = PVRSRVDeinitialiseDevice (gui32SGXDeviceID); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: failed to de-init the device")); return eError; } } #if defined(SGX_OCP_REGS_ENABLED) if (SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_OCPREGS)) { OSUnMapPhysToLin(gpvOCPRegsLinAddr, SYS_OMAP3430_OCP_REGS_SIZE, PVRSRV_HAP_UNCACHED|PVRSRV_HAP_KERNEL_ONLY, IMG_NULL); } #endif if (SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_SYSCLOCKS)) { DisableSystemClocks(gpsSysData); } if (SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_ENVDATA)) { eError = OSDeInitEnvData(gpsSysData->pvEnvSpecificData); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: failed to de-init env structure")); return eError; } } if(gpsSysData->pvSOCTimerRegisterKM) { OSUnReservePhys(gpsSysData->pvSOCTimerRegisterKM, 4, PVRSRV_HAP_MULTI_PROCESS|PVRSRV_HAP_UNCACHED, gpsSysData->hSOCTimerRegisterOSMemHandle); } SysDeinitialiseCommon(gpsSysData); #if defined(NO_HARDWARE) if(SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_LOCATEDEV)) { OSBaseFreeContigMemory(SYS_OMAP3430_SGX_REGS_SIZE, gsSGXRegsCPUVAddr, gsSGXDeviceMap.sRegsCpuPBase); } #endif gpsSysSpecificData->ui32SysSpecificData = 0; gpsSysSpecificData->bSGXInitComplete = IMG_FALSE; gpsSysData = IMG_NULL; return PVRSRV_OK; }
/*! ****************************************************************************** @Function SysDeinitialise @Description De-initialises kernel services at 'driver unload' time @Return PVRSRV_ERROR : ******************************************************************************/ PVRSRV_ERROR SysDeinitialise (SYS_DATA *psSysData) { SYS_SPECIFIC_DATA * psSysSpecData; PVRSRV_ERROR eError; if (psSysData == IMG_NULL) { PVR_DPF((PVR_DBG_ERROR, "SysDeinitialise: Called with NULL SYS_DATA pointer. Probably called before.")); return PVRSRV_OK; } psSysSpecData = (SYS_SPECIFIC_DATA *) psSysData->pvSysSpecificData; #if defined(SYS_USING_INTERRUPTS) if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_ENABLE_IRQ)) { SysDisableInterrupts(psSysData); } #endif #if defined(SYS_USING_INTERRUPTS) if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_ENABLE_LISR)) { eError = OSUninstallSystemLISR(psSysData); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: OSUninstallSystemLISR failed")); return eError; } } #endif /* defined(SYS_USING_INTERRUPTS) */ if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_ENABLE_MISR)) { eError = OSUninstallMISR(psSysData); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: OSUninstallMISR failed")); return eError; } } if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_ENABLE_INITDEV)) { /* de-initialise all services managed devices */ eError = PVRSRVDeinitialiseDevice (gui32SGXDeviceID); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: failed to de-init the device")); return eError; } } if (gpsSysData->pvSOCRegsBase) { OSUnMapPhysToLin(gpsSysData->pvSOCRegsBase, SYS_ATLAS_REG_SIZE + SYS_PDP_REG_SIZE, PVRSRV_HAP_UNCACHED|PVRSRV_HAP_KERNEL_ONLY, IMG_NULL); gpsSysData->pvSOCRegsBase = IMG_NULL; } /* Destroy the local memory arena. */ if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_ENABLE_RA_ARENA)) { RA_Delete(gpsSysData->apsLocalDevMemArena[0]); gpsSysData->apsLocalDevMemArena[0] = IMG_NULL; } SysDeinitialiseCommon(gpsSysData); #ifdef __linux__ if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_ENABLE_PCINIT)) { PCIDeInitDev(psSysData); } #endif if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_ENABLE_ENVDATA)) { eError = OSDeInitEnvData(gpsSysData->pvEnvSpecificData); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: failed to de-init env structure")); return eError; } } #if defined(NO_HARDWARE) if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_ENABLE_REG_MEM)) { OSBaseFreeContigMemory(SYS_SGX_REG_SIZE, gsSGXRegsCPUVAddr, gsSGXDeviceMap.sRegsCpuPBase); } #endif psSysSpecData->ui32SysSpecificData = 0; gpsSysData = IMG_NULL; return PVRSRV_OK; }
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 }
/*! ****************************************************************************** @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; }
static PVRSRV_ERROR SysMapInRegisters(IMG_VOID) { PVRSRV_DEVICE_NODE *psDeviceNodeList; /* Map the Atlas and PDP registers. */ gpsSysData->pvSOCRegsBase = OSMapPhysToLin(gsSOCRegsCpuPBase, SYS_ATLAS_REG_REGION_SIZE, PVRSRV_HAP_UNCACHED|PVRSRV_HAP_KERNEL_ONLY, IMG_NULL); if (gpsSysData->pvSOCRegsBase == IMG_NULL) { PVR_DPF((PVR_DBG_ERROR,"SysPrePowerState: Failed to map SOC Register base")); return PVRSRV_ERROR_REGISTER_BASE_NOT_SET; } psDeviceNodeList = gpsSysData->psDeviceNodeList; while (psDeviceNodeList) { PVRSRV_SGXDEV_INFO *psDevInfo = (PVRSRV_SGXDEV_INFO *)psDeviceNodeList->pvDevice; if (psDeviceNodeList->sDevId.eDeviceType == PVRSRV_DEVICE_TYPE_SGX) { #if defined(NO_HARDWARE) && defined(__linux__) /* * SysLocateDevices will have reallocated the dummy * registers. */ PVR_ASSERT(gsSGXRegsCPUVAddr); psDevInfo->pvRegsBaseKM = gsSGXRegsCPUVAddr; #else if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNMAP_SGX_REGS)) { /* Remap Regs */ psDevInfo->pvRegsBaseKM = OSMapPhysToLin(gsSGXDeviceMap.sRegsCpuPBase, gsSGXDeviceMap.ui32RegsSize, PVRSRV_HAP_KERNEL_ONLY|PVRSRV_HAP_UNCACHED, IMG_NULL); if (!psDevInfo->pvRegsBaseKM) { PVR_DPF((PVR_DBG_ERROR,"SysMapInRegisters : Failed to map in regs\n")); return PVRSRV_ERROR_BAD_MAPPING; } SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNMAP_SGX_REGS); } #endif /* #if defined(NO_HARDWARE) && defined(__linux__) */ psDevInfo->ui32RegSize = gsSGXDeviceMap.ui32RegsSize; psDevInfo->sRegsPhysBase = gsSGXDeviceMap.sRegsSysPBase; #if defined(SGX_FEATURE_HOST_PORT) if (gsSGXDeviceMap.ui32Flags & SGX_HOSTPORT_PRESENT) { if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNMAP_SGX_HP)) { /* Map Host Port */ psDevInfo->pvHostPortBaseKM = OSMapPhysToLin(gsSGXDeviceMap.sHPCpuPBase, gsSGXDeviceMap.ui32HPSize, PVRSRV_HAP_KERNEL_ONLY|PVRSRV_HAP_UNCACHED, IMG_NULL); if (!psDevInfo->pvHostPortBaseKM) { PVR_DPF((PVR_DBG_ERROR,"SysMapInRegisters : Failed to map in host port\n")); return PVRSRV_ERROR_BAD_MAPPING; } SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNMAP_SGX_HP); } psDevInfo->ui32HPSize = gsSGXDeviceMap.ui32HPSize; psDevInfo->sHPSysPAddr = gsSGXDeviceMap.sHPSysPBase; } #endif /* #if defined(SGX_FEATURE_HOST_PORT) */ } psDeviceNodeList = psDeviceNodeList->psNext; } return PVRSRV_OK; }
/***********************************************************************//** * Map the CPU physical backing for the registers to CPU virtual memory * so we can write to it from the host * * @returns PVRSRV_OK for success, or failure code **************************************************************************/ static PVRSRV_ERROR SysMapInRegisters(void) { PVRSRV_DEVICE_NODE *psDeviceNodeList; psDeviceNodeList = gpsSysData->psDeviceNodeList; while (psDeviceNodeList) { switch (psDeviceNodeList->sDevId.eDeviceType) { case PVRSRV_DEVICE_TYPE_SGX: { PVRSRV_SGXDEV_INFO *psDevInfo = (PVRSRV_SGXDEV_INFO *) psDeviceNodeList->pvDevice; #if !defined(NO_HARDWARE) if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNMAP_SGX_REGS)) { /* Remap Regs */ psDevInfo->pvRegsBaseKM = OSMapPhysToLin(gsSGXDeviceMap.sRegsCpuPBase, gsSGXDeviceMap.ui32RegsSize, PVRSRV_HAP_KERNEL_ONLY|PVRSRV_HAP_UNCACHED, IMG_NULL); if (!psDevInfo->pvRegsBaseKM) { PVR_DPF((PVR_DBG_ERROR,"SysMapInRegisters : Failed to map in regs\n")); return PVRSRV_ERROR_BAD_MAPPING; } SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNMAP_SGX_REGS); } #else /* !defined(NO_HARDWARE) */ /* * SysLocateDevices will have reallocated the dummy * registers. */ psDevInfo->pvRegsBaseKM = gsSGXDeviceMap.pvRegsCpuVBase; #endif /* !defined(NO_HARDWARE) */ psDevInfo->ui32RegSize = gsSGXDeviceMap.ui32RegsSize; psDevInfo->sRegsPhysBase = gsSGXDeviceMap.sRegsSysPBase; break; } #if defined(SUPPORT_MSVDX) case PVRSRV_DEVICE_TYPE_MSVDX: { PVRSRV_MSVDXDEV_INFO *psDevInfo = (PVRSRV_MSVDXDEV_INFO *) psDeviceNodeList->pvDevice; #if !defined(NO_HARDWARE) if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNMAP_MSVDX_REGS)) { /* Remap registers */ psDevInfo->pvRegsBaseKM = OSMapPhysToLin(gsMSVDXDeviceMap.sRegsCpuPBase, gsMSVDXDeviceMap.ui32RegsSize, PVRSRV_HAP_KERNEL_ONLY|PVRSRV_HAP_UNCACHED, IMG_NULL); if (!psDevInfo->pvRegsBaseKM) { PVR_DPF((PVR_DBG_ERROR,"SysMapInRegisters : Failed to map MSVDX registers\n")); return PVRSRV_ERROR_BAD_MAPPING; } SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNMAP_MSVDX_REGS); } #else /* !defined(NO_HARDWARE) */ /* * SysLocateDevices will have reallocated the dummy * registers. */ psDevInfo->pvRegsBaseKM = gsMSVDXDeviceMap.sRegsCpuVBase; #endif /* !defined(NO_HARDWARE) */ psDevInfo->ui32RegSize = gsMSVDXDeviceMap.ui32RegsSize; psDevInfo->sRegsPhysBase = gsMSVDXDeviceMap.sRegsSysPBase; break; } #endif /* SUPPORT_MSVDX */ default: /* Ignore any other (unknown) devices */ break; } psDeviceNodeList = psDeviceNodeList->psNext; } return PVRSRV_OK; }
/***********************************************************************//** * Deinitialise the system for unloading the driver * * @returns PVRSRV_OK for success, or failure code **************************************************************************/ PVRSRV_ERROR SysDeinitialise (SYS_DATA *psSysData) { SYS_SPECIFIC_DATA * psSysSpecData; PVRSRV_ERROR eError; if (psSysData == IMG_NULL) { PVR_DPF((PVR_DBG_ERROR, "SysDeinitialise: NULL SYS_DATA pointer.")); return PVRSRV_OK; } psSysSpecData = (SYS_SPECIFIC_DATA *) psSysData->pvSysSpecificData; #if defined(SYS_USING_INTERRUPTS) if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_IRQ_ENABLED)) { SysDisableInterrupts(psSysData); SYS_SPECIFIC_DATA_CLEAR(psSysSpecData, SYS_SPECIFIC_DATA_IRQ_ENABLED); } if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_LISR_INSTALLED)) { eError = OSUninstallSystemLISR(psSysData); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: OSUninstallSystemLISR failed")); return eError; } SYS_SPECIFIC_DATA_CLEAR(psSysSpecData, SYS_SPECIFIC_DATA_LISR_INSTALLED); } if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_MISR_INSTALLED)) { eError = OSUninstallMISR(psSysData); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: OSUninstallMISR failed")); return eError; } SYS_SPECIFIC_DATA_CLEAR(psSysSpecData, SYS_SPECIFIC_DATA_MISR_INSTALLED); } #endif /* #if defined(SYS_USING_INTERRUPTS) */ #if defined(SUPPORT_MSVDX) if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_INITVXDDEV)) { /* de-initialise all services managed devices */ eError = PVRSRVDeinitialiseDevice(gui32MSVDXDeviceID); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: failed to de-init the device")); return eError; } SYS_SPECIFIC_DATA_CLEAR(psSysSpecData, SYS_SPECIFIC_DATA_INITVXDDEV); } #endif if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_INITSGXDEV)) { /* de-initialise all services managed devices */ eError = PVRSRVDeinitialiseDevice(gui32SGXDeviceID); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: failed to de-init the device")); return eError; } SYS_SPECIFIC_DATA_CLEAR(psSysSpecData, SYS_SPECIFIC_DATA_INITSGXDEV); } SysFreeVersionString(psSysData); PCIDeInitDev(psSysData); SysDeinitialiseCommon(gpsSysData); if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_ENVDATA)) { eError = OSDeInitEnvData(gpsSysData->pvEnvSpecificData); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: failed to de-init env structure")); return eError; } SYS_SPECIFIC_DATA_CLEAR(psSysSpecData, SYS_SPECIFIC_DATA_ENVDATA); } #if defined(NO_HARDWARE) #if defined(SUPPORT_MSVDX) if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_DUMMY_MSVDX_REGS)) { OSBaseFreeContigMemory(MSVDX_REG_SIZE, gsMSVDXDeviceMap.sRegsCpuVBase, gsMSVDXDeviceMap.sRegsCpuPBase); SYS_SPECIFIC_DATA_CLEAR(psSysSpecData, SYS_SPECIFIC_DATA_DUMMY_MSVDX_REGS); } #endif if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_DUMMY_SGX_REGS)) { OSBaseFreeContigMemory(SYS_SGX_REG_SIZE, gsSGXDeviceMap.pvRegsCpuVBase, gsSGXDeviceMap.sRegsCpuPBase); SYS_SPECIFIC_DATA_CLEAR(psSysSpecData, SYS_SPECIFIC_DATA_DUMMY_SGX_REGS); } #endif #if !defined(NO_HARDWARE) if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_SOC_REGS_MAPPED)) { OSUnMapPhysToLin(gsSOCDeviceMap.sRegsCpuVBase, SYS_SOC_REG_SIZE, PVRSRV_HAP_KERNEL_ONLY | PVRSRV_HAP_UNCACHED, IMG_NULL); SYS_SPECIFIC_DATA_CLEAR(psSysSpecData, SYS_SPECIFIC_DATA_SOC_REGS_MAPPED); } #endif psSysSpecData->ui32SysSpecificData = 0; gpsSysData = IMG_NULL; return PVRSRV_OK; }