PVRSRV_ERROR SysCreateConfigData(PVRSRV_SYSTEM_CONFIG **ppsSysConfig) { PLAT_DATA *psPlatData; PVRSRV_ERROR eError; psPlatData = OSAllocMem(sizeof(PLAT_DATA)); OSMemSet(psPlatData, 0, sizeof(PLAT_DATA)); /* Query the Emu for reg and IRQ information */ eError = PCIInitDev(psPlatData); if (eError != PVRSRV_OK) { goto e0; } /* Save data for this device */ sSysConfig.pasDevices[0].hSysData = (IMG_HANDLE) psPlatData; #if defined (LMA) /* Save private data for the physical memory heaps */ gsPhysHeapConfig[0].hPrivData = (IMG_HANDLE) psPlatData; gsPhysHeapConfig[1].hPrivData = (IMG_HANDLE) psPlatData; #endif *ppsSysConfig = &sSysConfig; /* Ion is only supported on UMA builds */ #if (defined(SUPPORT_ION) && (!defined(LMA))) IonInit(NULL); #endif gpsPlatData = psPlatData; return PVRSRV_OK; e0: return eError; }
PVRSRV_ERROR SysCreateConfigData(PVRSRV_SYSTEM_CONFIG **ppsSysConfig, void *hDevice) { PLAT_DATA *psPlatData; PVRSRV_ERROR eError; PVR_UNREFERENCED_PARAMETER(hDevice); psPlatData = OSAllocZMem(sizeof(*psPlatData)); /* Query the Emu for reg and IRQ information */ eError = PCIInitDev(psPlatData); if (eError != PVRSRV_OK) { goto e0; } /* Save data for this device */ sSysConfig.pasDevices[0].hSysData = (IMG_HANDLE) psPlatData; /* Save private data for the physical memory heap */ gsPhysHeapConfig[0].hPrivData = (IMG_HANDLE) psPlatData; #if defined(TDMETACODE) #error "Not supported services/3rdparty/intel_drm/sysconfig.c" gsPhysHeapConfig[1].hPrivData = IMG_NULL; #endif *ppsSysConfig = &sSysConfig; gpsPlatData = psPlatData; /* Setup other system specific stuff */ #if defined(SUPPORT_ION) IonInit(NULL); #endif return PVRSRV_OK; e0: return eError; }
PVRSRV_ERROR SysInitialise(IMG_VOID) { IMG_UINT32 i = 0; PVRSRV_ERROR eError; PVRSRV_DEVICE_NODE *psDeviceNode; SGX_TIMING_INFORMATION* psTimingInfo; struct drm_psb_private *dev_priv = (struct drm_psb_private *) gpDrmDevice->dev_private; gpsSysData = &gsSysData; OSMemSet(gpsSysData, 0, sizeof(SYS_DATA)); gpsSysData->pvSysSpecificData = &gsSysSpecificData; gsSysSpecificData.ui32SysSpecificData = 0; #if defined(LDM_PCI) || defined(SUPPORT_DRI_DRM) PVR_ASSERT(gpsPVRLDMDev != IMG_NULL); gsSysSpecificData.psPCIDev = gpsPVRLDMDev; #endif eError = OSInitEnvData(&gpsSysData->pvEnvSpecificData); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to setup env structure")); SysDeinitialise(gpsSysData); gpsSysData = IMG_NULL; return eError; } psTimingInfo = &gsSGXDeviceMap.sTimingInfo; psTimingInfo->ui32CoreClockSpeed = SYS_SGX_CLOCK_SPEED; psTimingInfo->ui32HWRecoveryFreq = SYS_SGX_HWRECOVERY_TIMEOUT_FREQ; #if defined(SUPPORT_ACTIVE_POWER_MANAGEMENT) /* Note: Enable active PM unconditionally, regardless of runtime PM. */ psTimingInfo->bEnableActivePM = IMG_TRUE; #else psTimingInfo->bEnableActivePM = IMG_FALSE; #endif psTimingInfo->ui32ActivePowManLatencyms = SYS_SGX_ACTIVE_POWER_LATENCY_MS; psTimingInfo->ui32uKernelFreq = SYS_SGX_PDS_TIMER_FREQ; eError = PCIInitDev(gpsSysData); if (eError != PVRSRV_OK) { SysDeinitialise(gpsSysData); gpsSysData = IMG_NULL; return eError; } gpsSysData->ui32NumDevices = SYS_DEVICE_COUNT; for(i=0; i<SYS_DEVICE_COUNT; i++) { gpsSysData->sDeviceID[i].uiID = i; gpsSysData->sDeviceID[i].bInUse = IMG_FALSE; } gpsSysData->psDeviceNodeList = IMG_NULL; gpsSysData->psQueueList = IMG_NULL; eError = SysInitialiseCommon(gpsSysData); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed in SysInitialiseCommon")); SysDeinitialise(gpsSysData); gpsSysData = IMG_NULL; return eError; } eError = SysLocateDevices(gpsSysData); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to locate devices")); SysDeinitialise(gpsSysData); gpsSysData = IMG_NULL; return eError; } eError = PVRSRVRegisterDevice(gpsSysData, SGXRegisterDevice, DEVICE_SGX_INTERRUPT, &gui32SGXDeviceID); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to register device!")); SysDeinitialise(gpsSysData); gpsSysData = IMG_NULL; return eError; } /* register MSVDX, with 0 interrupt bit, no interrupt will be served */ eError = PVRSRVRegisterDevice(gpsSysData, MSVDXRegisterDevice, DEVICE_MSVDX_INTERRUPT, &gui32MRSTMSVDXDeviceID); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to register MSVDXdevice!")); SysDeinitialise(gpsSysData); gpsSysData = IMG_NULL; return eError; } if (!dev_priv->topaz_disabled) { /* register TOPAZ, with 0 interrupt bit, no interrupt will be served */ eError = PVRSRVRegisterDevice(gpsSysData, TOPAZRegisterDevice, DEVICE_TOPAZ_INTERRUPT, &gui32MRSTTOPAZDeviceID); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to register TOPAZdevice!")); SysDeinitialise(gpsSysData); gpsSysData = IMG_NULL; return eError; } } psDeviceNode = gpsSysData->psDeviceNodeList; while(psDeviceNode) { switch(psDeviceNode->sDevId.eDeviceType) { case PVRSRV_DEVICE_TYPE_SGX: { DEVICE_MEMORY_INFO *psDevMemoryInfo; DEVICE_MEMORY_HEAP_INFO *psDeviceMemoryHeap; psDeviceNode->psLocalDevMemArena = IMG_NULL; psDevMemoryInfo = &psDeviceNode->sDevMemoryInfo; psDeviceMemoryHeap = psDevMemoryInfo->psDeviceMemoryHeap; for(i=0; i<psDevMemoryInfo->ui32HeapCount; i++) { psDeviceMemoryHeap[i].ui32Attribs |= PVRSRV_BACKINGSTORE_SYSMEM_NONCONTIG; #ifdef OEM_CUSTOMISE #endif } #if defined(SUPPORT_DRI_DRM_EXT) gpsSGXDevNode = psDeviceNode; #endif break; } case PVRSRV_DEVICE_TYPE_MSVDX: /* nothing need to do here */ break; case PVRSRV_DEVICE_TYPE_TOPAZ: break; default: { PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to find SGX device node!")); return PVRSRV_ERROR_INIT_FAILURE; } } psDeviceNode = psDeviceNode->psNext; } PDUMPINIT(); SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_PDUMP_INIT); eError = PVRSRVInitialiseDevice (gui32SGXDeviceID); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to initialise device!")); SysDeinitialise(gpsSysData); gpsSysData = IMG_NULL; return eError; } SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_SGX_INITIALISED); eError = PVRSRVInitialiseDevice (gui32MRSTMSVDXDeviceID); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to initialise device!")); SysDeinitialise(gpsSysData); gpsSysData = IMG_NULL; return eError; } if (!dev_priv->topaz_disabled) { eError = PVRSRVInitialiseDevice (gui32MRSTTOPAZDeviceID); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to initialise device!")); SysDeinitialise(gpsSysData); gpsSysData = IMG_NULL; return eError; } } return PVRSRV_OK; }
/*! ****************************************************************************** @Function SysInitialise @Description Initialises kernel services at 'driver load' time @Return PVRSRV_ERROR : ******************************************************************************/ PVRSRV_ERROR SysInitialise(IMG_VOID) { IMG_UINT32 i; PVRSRV_ERROR eError; PVRSRV_DEVICE_NODE *psDeviceNode; SGX_TIMING_INFORMATION* psTimingInfo; gpsSysData = &gsSysData; OSMemSet(gpsSysData, 0, sizeof(SYS_DATA)); gpsSysData->pvSysSpecificData = &gsSysSpecificData; gsSysSpecificData.ui32SysSpecificData = 0; #if defined(LDM_PCI) || defined(SUPPORT_DRI_DRM) /* Save the pci_dev structure pointer from module.c */ PVR_ASSERT(gpsPVRLDMDev != IMG_NULL); gsSysSpecificData.psPCIDev = gpsPVRLDMDev; #endif eError = OSInitEnvData(&gpsSysData->pvEnvSpecificData); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to setup env structure")); SysDeinitialise(gpsSysData); gpsSysData = IMG_NULL; return eError; } SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_ENVDATA); /* Set up timing information*/ psTimingInfo = &gsSGXDeviceMap.sTimingInfo; psTimingInfo->ui32CoreClockSpeed = SYS_SGX_CLOCK_SPEED; psTimingInfo->ui32HWRecoveryFreq = SYS_SGX_HWRECOVERY_TIMEOUT_FREQ; #if defined(SUPPORT_ACTIVE_POWER_MANAGEMENT) psTimingInfo->bEnableActivePM = IMG_TRUE; #else psTimingInfo->bEnableActivePM = IMG_FALSE; #endif /* SUPPORT_ACTIVE_POWER_MANAGEMENT */ psTimingInfo->ui32ActivePowManLatencyms = SYS_SGX_ACTIVE_POWER_LATENCY_MS; psTimingInfo->ui32uKernelFreq = SYS_SGX_PDS_TIMER_FREQ; #ifdef __linux__ eError = PCIInitDev(gpsSysData); if (eError != PVRSRV_OK) { SysDeinitialise(gpsSysData); gpsSysData = IMG_NULL; return eError; } SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_PCINIT); #endif gpsSysData->ui32NumDevices = SYS_DEVICE_COUNT; /* init device ID's */ for(i=0; i<SYS_DEVICE_COUNT; i++) { gpsSysData->sDeviceID[i].uiID = i; gpsSysData->sDeviceID[i].bInUse = IMG_FALSE; } gpsSysData->psDeviceNodeList = IMG_NULL; gpsSysData->psQueueList = IMG_NULL; eError = SysInitialiseCommon(gpsSysData); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed in SysInitialiseCommon")); SysDeinitialise(gpsSysData); gpsSysData = IMG_NULL; return eError; } /* Locate the devices within the system, specifying the physical addresses of each devices components (regs, mem, ports etc.) */ eError = SysLocateDevices(gpsSysData); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to locate devices")); SysDeinitialise(gpsSysData); gpsSysData = IMG_NULL; return eError; } SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_LOCATEDEV); /* Map the Atlas and PDP registers. */ gpsSysData->pvSOCRegsBase = OSMapPhysToLin(gsSOCRegsCpuPBase, SYS_ATLAS_REG_REGION_SIZE, PVRSRV_HAP_UNCACHED|PVRSRV_HAP_KERNEL_ONLY, IMG_NULL); /* Do some initial register setup */ eError = SysInitRegisters(); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysInitRegisters: Failed to initialise registers")); SysDeinitialise(gpsSysData); gpsSysData = IMG_NULL; return eError; } SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_INITREG); #if defined(READ_TCF_HOST_MEM_SIGNATURE) SysTestTCFHostMemSig(gsSGXDeviceMap.sRegsCpuPBase, gsSGXDeviceMap.sLocalMemCpuPBase); #endif /* Register devices with the system This also sets up their memory maps/heaps */ eError = PVRSRVRegisterDevice(gpsSysData, SGXRegisterDevice, SysGetSGXInterruptBit(), &gui32SGXDeviceID); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to register device!")); SysDeinitialise(gpsSysData); gpsSysData = IMG_NULL; return eError; } SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_REGDEV); /* A given SOC may have 0 to n local device memory blocks. It is assumed device local memory blocks will be either specific to each device or shared among one or more services managed devices. Note: no provision is made for a single device having more than one local device memory blocks. If required we must add new types, e.g.PVRSRV_BACKINGSTORE_LOCALMEM_NONCONTIG0 PVRSRV_BACKINGSTORE_LOCALMEM_NONCONTIG1 */ /* Create Local Device Page Managers for each device memory block. We'll use an RA to do the management (only one for the emulator) */ gpsSysData->apsLocalDevMemArena[0] = RA_Create ("TestChipDeviceMemory", gsSGXDeviceMap.sLocalMemSysPBase.uiAddr, gsSGXDeviceMap.ui32LocalMemSize, IMG_NULL, HOST_PAGESIZE(), IMG_NULL, IMG_NULL, IMG_NULL, IMG_NULL); if (gpsSysData->apsLocalDevMemArena[0] == IMG_NULL) { PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to create local dev mem allocator!")); SysDeinitialise(gpsSysData); gpsSysData = IMG_NULL; return eError; } SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_RA_ARENA); /* Once all devices are registered, specify the backing store and, if required, customise the memory heap config */ psDeviceNode = gpsSysData->psDeviceNodeList; while(psDeviceNode) { /* perform any OEM SOC address space customisations here */ switch(psDeviceNode->sDevId.eDeviceType) { case PVRSRV_DEVICE_TYPE_SGX: { DEVICE_MEMORY_INFO *psDevMemoryInfo; DEVICE_MEMORY_HEAP_INFO *psDeviceMemoryHeap; /* specify the backing store to use for the device's MMU PT/PDs */ psDeviceNode->psLocalDevMemArena = gpsSysData->apsLocalDevMemArena[0]; /* useful pointers */ psDevMemoryInfo = &psDeviceNode->sDevMemoryInfo; psDeviceMemoryHeap = psDevMemoryInfo->psDeviceMemoryHeap; /* specify the backing store for all SGX heaps */ for(i=0; i<psDevMemoryInfo->ui32HeapCount; i++) { /* specify the backing store type (all local device mem noncontig) for test chip */ psDeviceMemoryHeap[i].ui32Attribs |= PVRSRV_BACKINGSTORE_LOCALMEM_CONTIG; /* map the device memory allocator(s) onto the device memory heaps as required */ psDeviceMemoryHeap[i].psLocalDevMemArena = gpsSysData->apsLocalDevMemArena[0]; #ifdef OEM_CUSTOMISE /* if required, modify the memory config */ #endif } break; } default: break; } /* advance to next device */ psDeviceNode = psDeviceNode->psNext; } /* Initialise all devices 'managed' by services: */ eError = PVRSRVInitialiseDevice (gui32SGXDeviceID); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to initialise device!")); SysDeinitialise(gpsSysData); gpsSysData = IMG_NULL; return eError; } SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_INITDEV); return PVRSRV_OK; }
/***********************************************************************//** * Perform hardware initialisation at driver load time * * @returns PVRSRV_OK for success, or failure code **************************************************************************/ PVRSRV_ERROR SysInitialise(IMG_VOID) { IMG_UINT32 i; PVRSRV_ERROR eError; PVRSRV_DEVICE_NODE *psDeviceNode; SGX_TIMING_INFORMATION *psTimingInfo; gpsSysData = &gsSysData; OSMemSet(gpsSysData, 0, sizeof(SYS_DATA)); gpsSysData->pvSysSpecificData = &gsSysSpecificData; gsSysSpecificData.ui32SysSpecificData = 0; #if defined(LDM_PCI) || defined(SUPPORT_DRI_DRM) /* Save the pci_dev structure pointer from module.c */ PVR_ASSERT(gpsPVRLDMDev != IMG_NULL); gsSysSpecificData.psPCIDev = gpsPVRLDMDev; #endif #if defined(SUPPORT_DRI_DRM) /* Save the DRM device structure pointer */ PVR_ASSERT(gpsPVRDRMDev != IMG_NULL); gsSysSpecificData.psDRMDev = gpsPVRDRMDev; #endif eError = OSInitEnvData(&gpsSysData->pvEnvSpecificData); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to setup env structure")); goto errorExit; } SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENVDATA); /* Set up timing information*/ psTimingInfo = &gsSGXDeviceMap.sTimingInfo; psTimingInfo->ui32CoreClockSpeed = SYS_SGX_CLOCK_SPEED; psTimingInfo->ui32HWRecoveryFreq = SYS_SGX_HWRECOVERY_TIMEOUT_FREQ; psTimingInfo->ui32ActivePowManLatencyms = SYS_SGX_ACTIVE_POWER_LATENCY_MS; psTimingInfo->ui32uKernelFreq = SYS_SGX_PDS_TIMER_FREQ; #if defined(SUPPORT_ACTIVE_POWER_MANAGEMENT) psTimingInfo->bEnableActivePM = IMG_TRUE; #else /* defined(SUPPORT_ACTIVE_POWER_MANAGEMENT) */ psTimingInfo->bEnableActivePM = IMG_FALSE; #endif /* defined(SUPPORT_ACTIVE_POWER_MANAGEMENT) */ eError = PCIInitDev(gpsSysData); if (eError != PVRSRV_OK) { SysDeinitialise(gpsSysData); gpsSysData = IMG_NULL; return eError; } gpsSysData->ui32NumDevices = SYS_DEVICE_COUNT; /* init device ID's */ for(i=0; i<SYS_DEVICE_COUNT; i++) { gpsSysData->sDeviceID[i].uiID = i; gpsSysData->sDeviceID[i].bInUse = IMG_FALSE; } gpsSysData->psDeviceNodeList = IMG_NULL; gpsSysData->psQueueList = IMG_NULL; SysPowerMaybeInit(gpsSysData); eError = SysInitialiseCommon(gpsSysData); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed in SysInitialiseCommon")); goto errorExit; } /* * Locate the devices within the system and get the * physical addresses of each */ eError = SysLocateDevices(gpsSysData); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to locate devices")); goto errorExit; } SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_LOCATEDEV); /* * Register devices with the system * This also sets up their memory maps/heaps */ eError = PVRSRVRegisterDevice(gpsSysData, SGXRegisterDevice, DEVICE_SGX_INTERRUPT, &gui32SGXDeviceID); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to register device!")); goto errorExit; } SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_REGSGXDEV); #if defined(SUPPORT_MSVDX) eError = PVRSRVRegisterDevice(gpsSysData, MSVDXRegisterDevice, DEVICE_MSVDX_INTERRUPT, &gui32MSVDXDeviceID); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to register VXD device!")); goto errorExit; } SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_REGVXDDEV); #endif /* * Once all devices are registered, specify the backing store * and, if required, customise the memory heap config */ psDeviceNode = gpsSysData->psDeviceNodeList; while(psDeviceNode) { /* perform any OEM SOC address space customisations here */ switch(psDeviceNode->sDevId.eDeviceType) { case PVRSRV_DEVICE_TYPE_SGX: { DEVICE_MEMORY_INFO *psDevMemoryInfo; DEVICE_MEMORY_HEAP_INFO *psDeviceMemoryHeap; /* * Specify the backing store to use for the devices MMU PT/PDs */ psDeviceNode->psLocalDevMemArena = IMG_NULL; /* useful pointers */ psDevMemoryInfo = &psDeviceNode->sDevMemoryInfo; psDeviceMemoryHeap = psDevMemoryInfo->psDeviceMemoryHeap; /* specify the backing store for all SGX heaps */ for(i=0; i<psDevMemoryInfo->ui32HeapCount; i++) { psDeviceMemoryHeap[i].ui32Attribs |= PVRSRV_BACKINGSTORE_SYSMEM_NONCONTIG; #if defined(OEM_CUSTOMISE) /* if required, modify the memory config */ #endif } break; } #if defined(SUPPORT_MSVDX) case PVRSRV_DEVICE_TYPE_MSVDX: { DEVICE_MEMORY_INFO *psDevMemoryInfo; DEVICE_MEMORY_HEAP_INFO *psDeviceMemoryHeap; /* specify the backing store to use for the devices MMU PT/PDs */ psDeviceNode->psLocalDevMemArena = IMG_NULL; /* useful pointers */ psDevMemoryInfo = &psDeviceNode->sDevMemoryInfo; psDeviceMemoryHeap = psDevMemoryInfo->psDeviceMemoryHeap; /* specify the backing store for all SGX heaps */ for(i=0; i<psDevMemoryInfo->ui32HeapCount; i++) { psDeviceMemoryHeap[i].ui32Attribs |= PVRSRV_BACKINGSTORE_SYSMEM_NONCONTIG; #if defined(OEM_CUSTOMISE) /* if required, modify the memory config */ #endif } break; } #endif default: break; } /* advance to next device */ psDeviceNode = psDeviceNode->psNext; } /* * Initialise all devices managed by us */ eError = PVRSRVInitialiseDevice(gui32SGXDeviceID); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to initialise SGX!")); goto errorExit; } SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_INITSGXDEV); #ifdef SUPPORT_MSVDX eError = PVRSRVInitialiseDevice(gui32MSVDXDeviceID); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to initialise VXD!")); goto errorExit; } SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_INITVXDDEV); #endif /* All fine! */ return eError; errorExit: /* Error occurred - shut down everything and return */ SysDeinitialise(gpsSysData); gpsSysData = IMG_NULL; return eError; }