2 *-----------------------------------------------------------------------------
3 * Filename: syscommon.c
5 *-----------------------------------------------------------------------------
6 * Copyright (c) 2002-2010, Intel Corporation.
8 * Permission is hereby granted, free of charge, to any person obtaining a copy
9 * of this software and associated documentation files (the "Software"), to deal
10 * in the Software without restriction, including without limitation the rights
11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 * copies of the Software, and to permit persons to whom the Software is
13 * furnished to do so, subject to the following conditions:
15 * The above copyright notice and this permission notice shall be included in
16 * all copies or substantial portions of the Software.
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
26 *-----------------------------------------------------------------------------
27 * Description: platform detection, and sharing of correct platform interface.
29 *-----------------------------------------------------------------------------
32 #include <linux/pci.h>
34 #include "services_headers.h"
35 #include "kerneldisplay.h"
38 #include "sgxinfokm.h"
40 #include "msvdx_defs.h"
42 #include "msvdx_infokm.h"
47 #include "sysconfig.h"
48 #include "pvr_debug.h"
49 #include "msvdx_pvr.h"
51 /* --------------------------------------------------------------------------*/
53 * @Synopsis Pointer to "System Data" used by all platform blocks, exported
54 * in "syscommon.h" header file.
56 /* --------------------------------------------------------------------------*/
57 SYS_DATA *gpsSysData = (SYS_DATA*)IMG_NULL;
59 /* --------------------------------------------------------------------------*/
61 * @Synopsis Pointer to found platform interface. It is IMG_NULL when no
62 * correct platform can be found.
64 /* --------------------------------------------------------------------------*/
65 SYS_PLATFORM_INTERFACE *gpsSysPlatformInterface = (SYS_PLATFORM_INTERFACE*)IMG_NULL;
68 /* --------------------------------------------------------------------------*/
70 * @Synopsis Poulsbo platform interface.
72 /* --------------------------------------------------------------------------*/
73 extern SYS_PLATFORM_INTERFACE gpsSysPlatformInterfacePlb;
75 /* --------------------------------------------------------------------------*/
77 * @Synopsis Atom E6xx platform interface.
79 /* --------------------------------------------------------------------------*/
80 extern SYS_PLATFORM_INTERFACE gpsSysPlatformInterfaceTnc;
82 /* --------------------------------------------------------------------------*/
84 * @Synopsis Table to available platforms interfaces.
85 * The last element must be set to IMG_NULL.
87 * @Param &gpsSysPlatformInterfacePlb Poulsbo interface
88 * @Param &gpsSysPlatformInterfaceTnc Atom E6xx interface
90 /* --------------------------------------------------------------------------*/
91 SYS_PLATFORM_INTERFACE* gpsSysPlatformInterfacesTab[] = { &gpsSysPlatformInterfacePlb,
92 &gpsSysPlatformInterfaceTnc,
93 (SYS_PLATFORM_INTERFACE*)IMG_NULL};
96 /* --------------------------------------------------------------------------*/
98 * @Synopsis Function to detect platform and set "gpsSysPlatformInterface" to
99 * one member of "gpsSysPlatformInterfacesTab".
105 /* --------------------------------------------------------------------------*/
106 IMG_VOID SysPlatformDetect(IMG_VOID)
108 SYS_PLATFORM_INTERFACE** psSysPlatformInterfacesTab = gpsSysPlatformInterfacesTab;
110 while(*psSysPlatformInterfacesTab != IMG_NULL) {
112 if(pci_get_device(SYS_SGX_DEV_VENDOR_ID, (unsigned short)((*psSysPlatformInterfacesTab)->uiSgxDevDeviceID), NULL)) {
113 gpsSysPlatformInterface = *psSysPlatformInterfacesTab;
114 PVR_DPF((PVR_DBG_MESSAGE,"Platform detected: %s", gpsSysPlatformInterface->sProductName));
117 PVR_DPF((PVR_DBG_MESSAGE,"Platform search: %s", (*psSysPlatformInterfacesTab)->sProductName));
118 psSysPlatformInterfacesTab++;
120 PVR_DPF((PVR_DBG_ERROR,"Platform detected Failed"));
124 /* --------------------------------------------------------------------------*/
126 * @Synopsis Interface for Atom E6xx device
128 /* ----------------------------------------------------------------------------*/
130 static SYS_DATA gsSysData;
132 static SYS_SPECIFIC_DATA gsSysSpecificData;
134 static IMG_UINT32 gui32SGXDeviceID;
135 static SGX_DEVICE_MAP gsSGXDeviceMap;
136 static IMG_UINT32 gui32MSVDXDeviceID;
139 static IMG_UINT32 gui32MSVDXDeviceID;
140 static MSVDX_DEVICE_MAP gsMSVDXDeviceMap;
144 #if defined(NO_HARDWARE)
145 static IMG_CPU_VIRTADDR gsSGXRegsCPUVAddr;
147 static IMG_CPU_VIRTADDR gsMSVDXRegsCPUVAddr;
151 #if !defined(NO_HARDWARE)
152 static IMG_CPU_VIRTADDR gsPoulsboRegsCPUVaddr;
154 #if defined(MAP_UNUSED_MAPPINGS)
155 static IMG_CPU_VIRTADDR gsPoulsboDisplayRegsCPUVaddr;
161 extern struct pci_dev *gpsPVRLDMDev;
164 IMG_UINT32 PVRSRV_BridgeDispatchKM( IMG_UINT32 Ioctl,
168 IMG_UINT32 OutBufLen,
169 IMG_UINT32 *pdwBytesTransferred);
172 #define ADDR_RANGE_INDEX (MMADR_INDEX - 4)
173 #if defined(SGX_FEATURE_HOST_PORT)
174 #define HP_ADDR_RANGE_INDEX (GMADR_INDEX - 4)
176 static PVRSRV_ERROR PCIInitDev(SYS_DATA *psSysData)
178 SYS_SPECIFIC_DATA *psSysSpecData = (SYS_SPECIFIC_DATA *) psSysData->pvSysSpecificData;
181 psSysSpecData->hSGXPCI = OSPCISetDev((IMG_VOID *)psSysSpecData->psPCIDev, HOST_PCI_INIT_FLAG_BUS_MASTER);
183 psSysSpecData->hSGXPCI = OSPCIAcquireDev(SYS_SGX_DEV_VENDOR_ID, SYS_SGX_DEV_DEVICE_ID, HOST_PCI_INIT_FLAG_BUS_MASTER);
185 if (!psSysSpecData->hSGXPCI)
187 PVR_DPF((PVR_DBG_ERROR,"PCIInitDev: Failed to acquire PCI device"));
188 return PVRSRV_ERROR_GENERIC;
191 SYS_SPECIFIC_DATA_SET(psSysSpecData, SYS_SPECIFIC_DATA_PCI_ACQUIRE_DEV);
193 PVR_TRACE(("PCI memory region: %x to %x", OSPCIAddrRangeStart(psSysSpecData->hSGXPCI, ADDR_RANGE_INDEX), OSPCIAddrRangeEnd(psSysSpecData->hSGXPCI, ADDR_RANGE_INDEX)));
194 #if defined(SGX_FEATURE_HOST_PORT)
195 PVR_TRACE(("Host Port region: %x to %x", OSPCIAddrRangeStart(psSysSpecData->hSGXPCI, HP_ADDR_RANGE_INDEX), OSPCIAddrRangeEnd(psSysSpecData->hSGXPCI, HP_ADDR_RANGE_INDEX)));
198 if (OSPCIAddrRangeLen(psSysSpecData->hSGXPCI, ADDR_RANGE_INDEX) < MAX_OFFSET)
200 PVR_DPF((PVR_DBG_ERROR,"PCIInitDev: Device memory region isn't big enough"));
201 return PVRSRV_ERROR_GENERIC;
205 if (OSPCIRequestAddrRange(psSysSpecData->hSGXPCI, ADDR_RANGE_INDEX) != PVRSRV_OK)
207 PVR_DPF((PVR_DBG_ERROR,"PCIInitDev: Device memory region not available"));
208 return PVRSRV_ERROR_GENERIC;
210 SYS_SPECIFIC_DATA_SET(psSysSpecData, SYS_SPECIFIC_DATA_PCI_REQUEST_SGX_ADDR_RANGE);
213 #if defined(SGX_FEATURE_HOST_PORT)
214 if (OSPCIRequestAddrRange(psSysSpecData->hSGXPCI, HP_ADDR_RANGE_INDEX) != PVRSRV_OK)
216 PVR_DPF((PVR_DBG_ERROR,"PCIInitDev: Host Port region not available"));
217 return PVRSRV_ERROR_GENERIC;
219 SYS_SPECIFIC_DATA_SET(psSysSpecData, SYS_SPECIFIC_DATA_PCI_REQUEST_HOST_PORT_RANGE);
224 static IMG_VOID PCIDeInitDev(SYS_DATA *psSysData)
226 SYS_SPECIFIC_DATA *psSysSpecData = (SYS_SPECIFIC_DATA *) psSysData->pvSysSpecificData;
228 if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_PCI_REQUEST_SGX_ADDR_RANGE))
230 OSPCIReleaseAddrRange(psSysSpecData->hSGXPCI, ADDR_RANGE_INDEX);
233 #if defined(SGX_FEATURE_HOST_PORT)
234 if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_PCI_REQUEST_HOST_PORT_RANGE))
236 OSPCIReleaseAddrRange(psSysSpecData->hSGXPCI, HP_ADDR_RANGE_INDEX);
240 if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_PCI_ACQUIRE_DEV))
242 OSPCIReleaseDev(psSysSpecData->hSGXPCI);
246 static PVRSRV_ERROR FindPCIDevice(IMG_UINT16 ui16VenID, IMG_UINT16 ui16DevID, PCICONFIG_SPACE *psPCISpace)
248 IMG_UINT32 ui32BusNum;
249 IMG_UINT32 ui32DevNum;
250 IMG_UINT32 ui32VenDevID;
253 for (ui32BusNum=0; ui32BusNum < 255; ui32BusNum++)
256 for (ui32DevNum=0; ui32DevNum < 32; ui32DevNum++)
259 ui32VenDevID=OSPCIReadDword(ui32BusNum, ui32DevNum, 0, 0);
262 if (ui32VenDevID == (IMG_UINT32)((ui16DevID<<16)+ui16VenID))
267 OSPCIWriteDword(ui32BusNum, ui32DevNum, 0, 4, OSPCIReadDword(ui32BusNum, ui32DevNum, 0, 4) | 0x02);
270 for (ui32Idx=0; ui32Idx < 64; ui32Idx++)
272 psPCISpace->u.aui32PCISpace[ui32Idx] = OSPCIReadDword(ui32BusNum, ui32DevNum, 0, ui32Idx*4);
276 PVR_DPF((PVR_DBG_VERBOSE,"%08X\n",psPCISpace->u.aui32PCISpace[ui32Idx]));
286 PVR_DPF((PVR_DBG_ERROR,"Couldn't find PCI device"));
288 return PVRSRV_ERROR_GENERIC;
292 static PVRSRV_ERROR SysLocateDevices(SYS_DATA *psSysData)
294 #if !defined(NO_HARDWARE) || defined(__linux__)
295 IMG_UINT32 ui32BaseAddr;
298 #if defined(SGX_FEATURE_HOST_PORT)
299 IMG_UINT32 ui32HostPortAddr = 0UL;
301 #if defined(NO_HARDWARE)
302 IMG_CPU_PHYADDR sCpuPAddr;
304 #if defined(NO_HARDWARE) || defined(__linux__)
305 SYS_SPECIFIC_DATA *psSysSpecData = (SYS_SPECIFIC_DATA *) psSysData->pvSysSpecificData;
307 #if (!defined(__linux__) || defined(NO_HARDWARE))
312 ui32BaseAddr = OSPCIAddrRangeStart(psSysSpecData->hSGXPCI, ADDR_RANGE_INDEX);
313 #if defined(SGX_FEATURE_HOST_PORT)
314 ui32HostPortAddr = OSPCIAddrRangeStart(psSysSpecData->hSGXPCI, HP_ADDR_RANGE_INDEX);
316 if (OSPCIIRQ(psSysSpecData->hSGXPCI, &ui32IRQ) != PVRSRV_OK)
318 PVR_DPF((PVR_DBG_ERROR,"SysLocateDevices: Couldn't get IRQ"));
319 return PVRSRV_ERROR_INVALID_DEVICE;
321 PVR_TRACE(("IRQ: %d", ui32IRQ));
324 PCICONFIG_SPACE sPCISpace;
326 eError = FindPCIDevice(VENDOR_ID, DEVICE_ID, &sPCISpace);
327 if (eError == PVRSRV_OK)
329 ui32BaseAddr = sPCISpace.u.aui32PCISpace[MMADR_INDEX];
330 #if defined(SGX_FEATURE_HOST_PORT)
331 ui32HostPortAddr = sPCISpace.u.aui32PCISpace[GMADR_INDEX];
336 return PVRSRV_ERROR_INVALID_DEVICE;
339 ui32IRQ = (IMG_UINT32)sPCISpace.u.aui8PCISpace[0x3C];
343 gsSGXDeviceMap.ui32Flags = 0x0;
346 #if defined(NO_HARDWARE)
348 gsSGXDeviceMap.ui32IRQ = 0;
350 gsSGXDeviceMap.ui32IRQ = ui32IRQ;
353 #if defined(NO_HARDWARE)
355 eError = OSBaseAllocContigMemory(SGX_REG_SIZE,
358 if(eError != PVRSRV_OK)
362 SYS_SPECIFIC_DATA_SET(psSysSpecData, SYS_SPECIFIC_DATA_ALLOC_DUMMY_SGX_REGS);
364 gsSGXDeviceMap.sRegsCpuPBase = sCpuPAddr;
366 OSMemSet(gsSGXRegsCPUVAddr, 0, SGX_REG_SIZE);
368 #if defined(__linux__)
370 gsSGXDeviceMap.pvRegsCpuVBase = gsSGXRegsCPUVAddr;
373 gsSGXDeviceMap.pvRegsCpuVBase = IMG_NULL;
377 gsSGXDeviceMap.sRegsSysPBase.uiAddr = ui32BaseAddr + SGX_REGS_OFFSET;
381 gsSGXDeviceMap.sRegsCpuPBase = SysSysPAddrToCpuPAddr(gsSGXDeviceMap.sRegsSysPBase);
382 gsSGXDeviceMap.ui32RegsSize = SGX_REG_SIZE;
384 #if defined(SGX_FEATURE_HOST_PORT)
386 gsSGXDeviceMap.ui32Flags = SGX_HOSTPORT_PRESENT;
387 gsSGXDeviceMap.sHPSysPBase.uiAddr = ui32HostPortAddr;
388 gsSGXDeviceMap.sHPCpuPBase = SysSysPAddrToCpuPAddr(gsSGXDeviceMap.sHPSysPBase);
389 gsSGXDeviceMap.ui32HPSize = SYS_SGX_HP_SIZE;
395 gsSGXDeviceMap.sLocalMemSysPBase.uiAddr = 0;
396 gsSGXDeviceMap.sLocalMemDevPBase.uiAddr = 0;
397 gsSGXDeviceMap.sLocalMemCpuPBase.uiAddr = 0;
398 gsSGXDeviceMap.ui32LocalMemSize = 0;
400 #if !defined(NO_HARDWARE)
403 IMG_SYS_PHYADDR sPoulsboRegsCpuPBase;
405 sPoulsboRegsCpuPBase.uiAddr = ui32BaseAddr + REGS_OFFSET;
406 gsPoulsboRegsCPUVaddr = OSMapPhysToLin(SysSysPAddrToCpuPAddr(sPoulsboRegsCpuPBase),
408 PVRSRV_HAP_KERNEL_ONLY|PVRSRV_HAP_UNCACHED,
411 #if defined(MAP_UNUSED_MAPPINGS)
412 sPoulsboRegsCpuPBase.uiAddr = ui32BaseAddr + DISPLAY_REGS_OFFSET;
413 gsPoulsboDisplayRegsCPUVaddr = OSMapPhysToLin(SysSysPAddrToCpuPAddr(sPoulsboRegsCpuPBase),
415 PVRSRV_HAP_KERNEL_ONLY|PVRSRV_HAP_UNCACHED,
424 #if defined(NO_HARDWARE)
426 eError = OSBaseAllocContigMemory(MSVDX_REG_SIZE,
427 &gsMSVDXRegsCPUVAddr,
429 if(eError != PVRSRV_OK)
433 SYS_SPECIFIC_DATA_SET(psSysSpecData, SYS_SPECIFIC_DATA_ALLOC_DUMMY_MSVDX_REGS);
434 gsMSVDXDeviceMap.sRegsCpuPBase = sCpuPAddr;
436 OSMemSet(gsMSVDXRegsCPUVAddr, 0, MSVDX_REG_SIZE);
438 #if defined(__linux__)
440 gsMSVDXDeviceMap.pvRegsCpuVBase = gsMSVDXRegsCPUVAddr;
443 gsMSVDXDeviceMap.pvRegsCpuVBase = IMG_NULL;
446 gsMSVDXDeviceMap.sRegsCpuPBase.uiAddr = ui32BaseAddr + MSVDX_REGS_OFFSET;
448 gsMSVDXDeviceMap.sRegsSysPBase = SysCpuPAddrToSysPAddr(gsMSVDXDeviceMap.sRegsCpuPBase);
449 gsMSVDXDeviceMap.ui32RegsSize = MSVDX_REG_SIZE;
455 gsMSVDXDeviceMap.sLocalMemSysPBase.uiAddr = 0;
456 gsMSVDXDeviceMap.sLocalMemDevPBase.uiAddr = 0;
457 gsMSVDXDeviceMap.sLocalMemCpuPBase.uiAddr = 0;
458 gsMSVDXDeviceMap.ui32LocalMemSize = 0;
462 gsMSVDXDeviceMap.ui32IRQ = ui32IRQ;
471 #ifdef SUPPORT_MSVDX_FPGA
472 static PVRSRV_ERROR FindPCIDevice(IMG_UINT16 ui16VenID, IMG_UINT16 ui16DevID, PCICONFIG_SPACE *psPCISpace)
474 IMG_UINT32 ui32BusNum;
475 IMG_UINT32 ui32DevNum;
476 IMG_UINT32 ui32VenDevID;
477 IMG_UINT32 ui32BarIndex;
480 for (ui32BusNum=0; ui32BusNum < 255; ui32BusNum++)
483 for (ui32DevNum=0; ui32DevNum < 32; ui32DevNum++)
486 ui32VenDevID=OSPCIReadDword(ui32BusNum, ui32DevNum, 0, 0);
489 if (ui32VenDevID == (IMG_UINT32)((ui16DevID<<16)+ui16VenID))
494 OSPCIWriteDword(ui32BusNum, ui32DevNum, 0, 4, OSPCIReadDword(ui32BusNum, ui32DevNum, 0, 4) | 0x02);
496 psPCISpace->ui32BusNum = ui32BusNum;
497 psPCISpace->ui32DevNum = ui32DevNum;
498 psPCISpace->ui32FuncNum = 0;
501 for (ui32Idx=0; ui32Idx < 64; ui32Idx++)
503 psPCISpace->u.aui32PCISpace[ui32Idx] = OSPCIReadDword(ui32BusNum, ui32DevNum, 0, ui32Idx*4);
507 PVR_DPF((PVR_DBG_VERBOSE,"%08X\n",psPCISpace->u.aui32PCISpace[ui32Idx]));
511 for (ui32BarIndex = 0; ui32BarIndex < 6; ui32BarIndex++)
513 GetPCIMemSpaceSize (ui32BusNum, ui32DevNum, ui32BarIndex, &psPCISpace->aui32PCIMemSpaceSize[ui32BarIndex]);
522 PVR_DPF((PVR_DBG_ERROR,"Couldn't find PCI device"));
524 return PVRSRV_ERROR_GENERIC;
527 static IMG_UINT32 GetPCIMemSpaceSize (IMG_UINT32 ui32BusNum, IMG_UINT32 ui32DevNum, IMG_UINT32 ui32BarIndex, IMG_UINT32* pui32PCIMemSpaceSize)
530 IMG_UINT32 ui32AddressRange;
531 IMG_UINT32 ui32BarSave;
533 ui32BarSave = OSPCIReadDword (ui32BusNum, ui32DevNum, 0, ((4 + ui32BarIndex) * sizeof (IMG_UINT32)));
535 OSPCIWriteDword (ui32BusNum, ui32DevNum, 0, ((4 + ui32BarIndex) * sizeof (IMG_UINT32)), 0xFFFFFFFF);
537 ui32AddressRange = OSPCIReadDword (ui32BusNum, ui32DevNum, 0, ((4 + ui32BarIndex) * sizeof (IMG_UINT32)));
539 OSPCIWriteDword (ui32BusNum, ui32DevNum, 0, ((4 + ui32BarIndex) * sizeof (IMG_UINT32)), ui32BarSave);
541 *pui32PCIMemSpaceSize = (~(ui32AddressRange & 0xFFFFFFF0)) + 1;
548 #define VERSION_STR_MAX_LEN_TEMPLATE "SGX revision = 000.000.000"
549 static PVRSRV_ERROR SysCreateVersionString(SYS_DATA *psSysData)
551 IMG_UINT32 ui32SGXRevision = 0;
552 IMG_UINT32 ui32MaxStrLen;
555 IMG_CHAR *pszVersionString;
557 #if !defined(NO_HARDWARE)
562 pvSGXRegs = OSMapPhysToLin(gsSGXDeviceMap.sRegsCpuPBase,
563 gsSGXDeviceMap.ui32RegsSize,
564 PVRSRV_HAP_KERNEL_ONLY|PVRSRV_HAP_UNCACHED,
567 if (pvSGXRegs != IMG_NULL)
569 ui32SGXRevision = OSReadHWReg(pvSGXRegs, EUR_CR_CORE_REVISION);
571 OSUnMapPhysToLin(pvSGXRegs,
572 gsSGXDeviceMap.ui32RegsSize,
573 PVRSRV_HAP_KERNEL_ONLY|PVRSRV_HAP_UNCACHED,
578 PVR_DPF((PVR_DBG_ERROR,"SysCreateVersionString: Couldn't map SGX registers"));
583 ui32MaxStrLen = OSStringLength(VERSION_STR_MAX_LEN_TEMPLATE);
584 eError = OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
586 (IMG_PVOID *)&pszVersionString,
589 if(eError != PVRSRV_OK)
591 return PVRSRV_ERROR_GENERIC;
594 i32Count = OSSNPrintf(pszVersionString, ui32MaxStrLen + 1,
595 "SGX revision = %u.%u.%u",
596 (IMG_UINT)((ui32SGXRevision & EUR_CR_CORE_REVISION_MAJOR_MASK)
597 >> EUR_CR_CORE_REVISION_MAJOR_SHIFT),
598 (IMG_UINT)((ui32SGXRevision & EUR_CR_CORE_REVISION_MINOR_MASK)
599 >> EUR_CR_CORE_REVISION_MINOR_SHIFT),
600 (IMG_UINT)((ui32SGXRevision & EUR_CR_CORE_REVISION_MAINTENANCE_MASK)
601 >> EUR_CR_CORE_REVISION_MAINTENANCE_SHIFT)
605 ui32MaxStrLen = OSStringLength(VERSION_STR_MAX_LEN_TEMPLATE);
606 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
611 return PVRSRV_ERROR_GENERIC;
614 psSysData->pszVersionString = pszVersionString;
619 static IMG_VOID SysFreeVersionString(SYS_DATA *psSysData)
621 if(psSysData->pszVersionString)
623 IMG_UINT32 ui32MaxStrLen;
624 ui32MaxStrLen = OSStringLength(VERSION_STR_MAX_LEN_TEMPLATE);
625 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
627 psSysData->pszVersionString,
629 psSysData->pszVersionString = NULL;
633 PVRSRV_ERROR SysInitialise(IMG_VOID)
637 PVRSRV_DEVICE_NODE *psDeviceNode;
638 SGX_TIMING_INFORMATION* psTimingInfo;
640 PVR_DPF((PVR_DBG_MESSAGE,"SysInitialise"));
644 gpsSysData = &gsSysData;
645 OSMemSet(gpsSysData, 0, sizeof(SYS_DATA));
647 gpsSysData->pvSysSpecificData = &gsSysSpecificData;
648 gsSysSpecificData.ui32SysSpecificData = 0;
651 PVR_ASSERT(gpsPVRLDMDev != IMG_NULL);
652 gsSysSpecificData.psPCIDev = gpsPVRLDMDev;
655 eError = OSInitEnvData(&gpsSysData->pvEnvSpecificData);
656 if (eError != PVRSRV_OK)
658 PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to setup env structure"));
659 SysDeinitialise(gpsSysData);
660 gpsSysData = IMG_NULL;
665 psTimingInfo = &gsSGXDeviceMap.sTimingInfo;
666 psTimingInfo->ui32CoreClockSpeed = SYS_SGX_CLOCK_SPEED;
667 psTimingInfo->ui32HWRecoveryFreq = SYS_SGX_HWRECOVERY_TIMEOUT_FREQ;
668 #if defined(SUPPORT_ACTIVE_POWER_MANAGEMENT)
669 psTimingInfo->bEnableActivePM = IMG_TRUE;
671 psTimingInfo->bEnableActivePM = IMG_FALSE;
673 psTimingInfo->ui32ActivePowManLatencyms = SYS_SGX_ACTIVE_POWER_LATENCY_MS;
674 psTimingInfo->ui32uKernelFreq = SYS_SGX_PDS_TIMER_FREQ;
677 eError = PCIInitDev(gpsSysData);
678 if (eError != PVRSRV_OK)
680 SysDeinitialise(gpsSysData);
681 gpsSysData = IMG_NULL;
686 gpsSysData->ui32NumDevices = SYS_DEVICE_COUNT;
689 for(i=0; i<SYS_DEVICE_COUNT; i++)
691 gpsSysData->sDeviceID[i].uiID = i;
692 gpsSysData->sDeviceID[i].bInUse = IMG_FALSE;
695 gpsSysData->psDeviceNodeList = IMG_NULL;
696 gpsSysData->psQueueList = IMG_NULL;
698 eError = SysInitialiseCommon(gpsSysData);
699 if (eError != PVRSRV_OK)
701 PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed in SysInitialiseCommon"));
702 SysDeinitialise(gpsSysData);
703 gpsSysData = IMG_NULL;
708 eError = SysLocateDevices(gpsSysData);
709 if (eError != PVRSRV_OK)
711 PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to locate devices"));
712 SysDeinitialise(gpsSysData);
713 gpsSysData = IMG_NULL;
718 eError = PVRSRVRegisterDevice(gpsSysData, SGXRegisterDevice,
719 DEVICE_SGX_INTERRUPT, &gui32SGXDeviceID);
720 if (eError != PVRSRV_OK)
722 PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to register device!"));
723 SysDeinitialise(gpsSysData);
724 gpsSysData = IMG_NULL;
728 //#ifdef SUPPORT_MSVDX
729 eError = PVRSRVRegisterDevice(gpsSysData, MSVDXRegisterDevice,
730 DEVICE_MSVDX_INTERRUPT, &gui32MSVDXDeviceID);
731 if (eError != PVRSRV_OK)
733 PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to register device!"));
734 SysDeinitialise(gpsSysData);
735 gpsSysData = IMG_NULL;
741 psDeviceNode = gpsSysData->psDeviceNodeList;
746 switch(psDeviceNode->sDevId.eDeviceType)
748 case PVRSRV_DEVICE_TYPE_SGX:
750 DEVICE_MEMORY_INFO *psDevMemoryInfo;
751 DEVICE_MEMORY_HEAP_INFO *psDeviceMemoryHeap;
754 psDeviceNode->psLocalDevMemArena = IMG_NULL;
757 psDevMemoryInfo = &psDeviceNode->sDevMemoryInfo;
758 psDeviceMemoryHeap = psDevMemoryInfo->psDeviceMemoryHeap;
761 for(i=0; i<psDevMemoryInfo->ui32HeapCount; i++)
763 psDeviceMemoryHeap[i].ui32Attribs |= PVRSRV_BACKINGSTORE_SYSMEM_NONCONTIG;
772 //#ifdef SUPPORT_MSVDX
773 case PVRSRV_DEVICE_TYPE_MSVDX:
775 DEVICE_MEMORY_INFO *psDevMemoryInfo;
776 DEVICE_MEMORY_HEAP_INFO *psDeviceMemoryHeap;
779 psDeviceNode->psLocalDevMemArena = IMG_NULL;
782 psDevMemoryInfo = &psDeviceNode->sDevMemoryInfo;
783 psDeviceMemoryHeap = psDevMemoryInfo->psDeviceMemoryHeap;
786 for(i=0; i<psDevMemoryInfo->ui32HeapCount; i++)
788 psDeviceMemoryHeap[i].ui32Attribs |= PVRSRV_BACKINGSTORE_SYSMEM_NONCONTIG;
798 PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to find SGX device node!"));
799 return PVRSRV_ERROR_INIT_FAILURE;
804 psDeviceNode = psDeviceNode->psNext;
808 SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_PDUMP_INIT);
811 eError = PVRSRVInitialiseDevice (gui32SGXDeviceID);
812 if (eError != PVRSRV_OK)
814 PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to initialise device!"));
815 SysDeinitialise(gpsSysData);
816 gpsSysData = IMG_NULL;
819 SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_SGX_INITIALISED);
821 //#ifdef SUPPORT_MSVDX
822 eError = PVRSRVInitialiseDevice (gui32MSVDXDeviceID);
823 if (eError != PVRSRV_OK)
825 PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to initialise device!"));
826 SysDeinitialise(gpsSysData);
827 gpsSysData = IMG_NULL;
830 SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_MSVDX_INITIALISED);
837 static IMG_VOID SysEnableInterrupts(SYS_DATA *psSysData)
839 #if !defined(NO_HARDWARE)
840 IMG_UINT32 ui32RegData;
843 ui32Mask = THALIA_MASK | MSVDX_MASK;
845 ui32RegData = OSReadHWReg(gsPoulsboRegsCPUVaddr, INTERRUPT_IDENTITY_REG);
846 OSWriteHWReg(gsPoulsboRegsCPUVaddr, INTERRUPT_IDENTITY_REG, ui32RegData | ui32Mask);
849 ui32RegData = OSReadHWReg(gsPoulsboRegsCPUVaddr, INTERRUPT_MASK_REG);
850 OSWriteHWReg(gsPoulsboRegsCPUVaddr, INTERRUPT_MASK_REG, ui32RegData & (~ui32Mask));
853 ui32RegData = OSReadHWReg(gsPoulsboRegsCPUVaddr, INTERRUPT_ENABLE_REG);
854 OSWriteHWReg(gsPoulsboRegsCPUVaddr, INTERRUPT_ENABLE_REG, ui32RegData | ui32Mask);
856 PVR_TRACE(("SysEnableInterrupts: Interrupts enabled"));
858 PVR_UNREFERENCED_PARAMETER(psSysData);
861 static IMG_VOID SysDisableInterrupts(SYS_DATA *psSysData)
863 #if !defined(NO_HARDWARE)
864 IMG_UINT32 ui32RegData;
868 ui32Mask = THALIA_MASK | MSVDX_MASK;
870 ui32RegData = OSReadHWReg(gsPoulsboRegsCPUVaddr, INTERRUPT_ENABLE_REG);
871 OSWriteHWReg(gsPoulsboRegsCPUVaddr, INTERRUPT_ENABLE_REG, ui32RegData & (~ui32Mask));
874 ui32RegData = OSReadHWReg(gsPoulsboRegsCPUVaddr, INTERRUPT_MASK_REG);
875 OSWriteHWReg(gsPoulsboRegsCPUVaddr, INTERRUPT_MASK_REG, ui32RegData | ui32Mask);
877 PVR_TRACE(("SysDisableInterrupts: Interrupts disabled"));
879 PVR_UNREFERENCED_PARAMETER(psSysData);
882 IMG_VOID SysReEnableInterrupts(IMG_VOID)
884 SysEnableInterrupts(gpsSysData);
887 PVRSRV_ERROR SysFinalise(IMG_VOID)
889 PVRSRV_ERROR eError = PVRSRV_OK;
891 #if defined(SYS_USING_INTERRUPTS)
892 eError = OSInstallMISR(gpsSysData);
893 if (eError != PVRSRV_OK)
895 PVR_DPF((PVR_DBG_ERROR,"SysFinalise: OSInstallMISR failed"));
896 SysDeinitialise(gpsSysData);
897 gpsSysData = IMG_NULL;
900 SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_MISR_INSTALLED);
902 eError = OSInstallSystemLISR(gpsSysData, gsSGXDeviceMap.ui32IRQ);
903 if (eError != PVRSRV_OK)
905 PVR_DPF((PVR_DBG_ERROR,"SysFinalise: OSInstallSystemLISR failed"));
906 SysDeinitialise(gpsSysData);
907 gpsSysData = IMG_NULL;
910 SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_LISR_INSTALLED);
913 SysEnableInterrupts(gpsSysData);
914 SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_IRQ_ENABLED);
918 eError = SysCreateVersionString(gpsSysData);
919 if (eError != PVRSRV_OK)
921 PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to create a system version string"));
928 PVRSRV_ERROR SysDeinitialise (SYS_DATA *psSysData)
932 SYS_SPECIFIC_DATA *psSysSpecData = (SYS_SPECIFIC_DATA *) psSysData->pvSysSpecificData;
934 if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_IRQ_ENABLED))
936 SysDisableInterrupts(psSysData);
939 #if defined(SYS_USING_INTERRUPTS)
940 if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_LISR_INSTALLED))
942 eError = OSUninstallSystemLISR(psSysData);
943 if (eError != PVRSRV_OK)
945 PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: OSUninstallSystemLISR failed"));
950 if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_MISR_INSTALLED))
952 eError = OSUninstallMISR(psSysData);
953 if (eError != PVRSRV_OK)
955 PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: OSUninstallMISR failed"));
960 /* Commenting this out to clean up allocation made in SysInitialise */
961 /*#if defined(SUPPORT_MSVDX)*/
962 if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_MSVDX_INITIALISED))
965 eError = PVRSRVDeinitialiseDevice(gui32MSVDXDeviceID);
966 if (eError != PVRSRV_OK)
968 PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: failed to de-init the device"));
974 if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_SGX_INITIALISED))
977 eError = PVRSRVDeinitialiseDevice(gui32SGXDeviceID);
978 if (eError != PVRSRV_OK)
980 PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: failed to de-init the device"));
986 SysFreeVersionString(psSysData);
988 PCIDeInitDev(psSysData);
991 eError = OSDeInitEnvData(psSysData->pvEnvSpecificData);
992 if (eError != PVRSRV_OK)
994 PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: failed to de-init env structure"));
998 SysDeinitialiseCommon(gpsSysData);
1000 #if defined(NO_HARDWARE)
1001 #ifdef SUPPORT_MSVDX
1002 if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_ALLOC_DUMMY_MSVDX_REGS))
1004 OSBaseFreeContigMemory(MSVDX_REG_SIZE, gsMSVDXRegsCPUVAddr, gsMSVDXDeviceMap.sRegsCpuPBase);
1008 if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_ALLOC_DUMMY_SGX_REGS))
1010 OSBaseFreeContigMemory(SGX_REG_SIZE, gsSGXRegsCPUVAddr, gsSGXDeviceMap.sRegsCpuPBase);
1014 #if !defined(NO_HARDWARE)
1016 OSUnMapPhysToLin(gsPoulsboRegsCPUVaddr,
1018 PVRSRV_HAP_KERNEL_ONLY|PVRSRV_HAP_UNCACHED,
1021 #if defined(MAP_UNUSED_MAPPINGS)
1022 OSUnMapPhysToLin(gsPoulsboDisplayRegsCPUVaddr,
1024 PVRSRV_HAP_KERNEL_ONLY|PVRSRV_HAP_UNCACHED,
1029 if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_PDUMP_INIT))
1034 gpsSysData = IMG_NULL;
1040 IMG_UINT32 SysGetInterruptSource(SYS_DATA* psSysData,
1041 PVRSRV_DEVICE_NODE *psDeviceNode)
1043 #if !defined(NO_HARDWARE)
1044 IMG_UINT32 ui32Devices = 0;
1045 IMG_UINT32 ui32Data, ui32DIMMask;
1047 PVR_UNREFERENCED_PARAMETER(psSysData);
1048 PVR_UNREFERENCED_PARAMETER(psDeviceNode);
1051 ui32Data = OSReadHWReg(gsPoulsboRegsCPUVaddr, INTERRUPT_IDENTITY_REG);
1053 if (ui32Data & THALIA_MASK)
1055 ui32Devices |= DEVICE_SGX_INTERRUPT;
1058 if (ui32Data & MSVDX_MASK)
1060 ui32Devices |= DEVICE_MSVDX_INTERRUPT;
1064 ui32DIMMask = OSReadHWReg(gsPoulsboRegsCPUVaddr, INTERRUPT_ENABLE_REG);
1065 ui32DIMMask &= ~(THALIA_MASK | MSVDX_MASK);
1068 if (ui32Data & ui32DIMMask)
1070 ui32Devices |= DEVICE_DISP_INTERRUPT;
1073 return (ui32Devices);
1075 PVR_UNREFERENCED_PARAMETER(psSysData);
1076 PVR_UNREFERENCED_PARAMETER(psDeviceNode);
1082 IMG_VOID SysClearInterrupts(SYS_DATA* psSysData, IMG_UINT32 ui32ClearBits)
1084 #if !defined(NO_HARDWARE)
1085 IMG_UINT32 ui32Data;
1086 IMG_UINT32 ui32Mask = 0;
1088 PVR_UNREFERENCED_PARAMETER(psSysData);
1090 ui32Data = OSReadHWReg(gsPoulsboRegsCPUVaddr, INTERRUPT_STATUS_REG);
1092 if ((ui32ClearBits & DEVICE_SGX_INTERRUPT) &&
1093 ((ui32Data & THALIA_MASK) == 0))
1095 ui32Mask |= THALIA_MASK;
1098 if ((ui32ClearBits & DEVICE_MSVDX_INTERRUPT) &&
1099 ((ui32Data & MSVDX_MASK) == 0))
1101 ui32Mask |= MSVDX_MASK;
1106 OSWriteHWReg(gsPoulsboRegsCPUVaddr, INTERRUPT_IDENTITY_REG, ui32Mask);
1109 PVR_UNREFERENCED_PARAMETER(psSysData);
1110 PVR_UNREFERENCED_PARAMETER(ui32ClearBits);
1116 PVRSRV_ERROR SysGetDeviceMemoryMap(PVRSRV_DEVICE_TYPE eDeviceType,
1117 IMG_VOID **ppvDeviceMap)
1122 case PVRSRV_DEVICE_TYPE_SGX:
1125 *ppvDeviceMap = (IMG_VOID*)&gsSGXDeviceMap;
1128 #ifdef SUPPORT_MSVDX
1129 case PVRSRV_DEVICE_TYPE_MSVDX:
1132 *ppvDeviceMap = (IMG_VOID*)&gsMSVDXDeviceMap;
1138 PVR_DPF((PVR_DBG_ERROR,"SysGetDeviceMemoryMap: unsupported device type"));
1145 IMG_DEV_PHYADDR SysCpuPAddrToDevPAddr (PVRSRV_DEVICE_TYPE eDeviceType,
1146 IMG_CPU_PHYADDR CpuPAddr)
1148 IMG_DEV_PHYADDR DevPAddr;
1150 PVR_UNREFERENCED_PARAMETER(eDeviceType);
1153 DevPAddr.uiAddr = CpuPAddr.uiAddr;
1159 IMG_CPU_PHYADDR SysSysPAddrToCpuPAddr (IMG_SYS_PHYADDR sys_paddr)
1161 IMG_CPU_PHYADDR cpu_paddr;
1164 cpu_paddr.uiAddr = sys_paddr.uiAddr;
1168 IMG_SYS_PHYADDR SysCpuPAddrToSysPAddr (IMG_CPU_PHYADDR cpu_paddr)
1170 IMG_SYS_PHYADDR sys_paddr;
1173 sys_paddr.uiAddr = cpu_paddr.uiAddr;
1178 IMG_DEV_PHYADDR SysSysPAddrToDevPAddr (PVRSRV_DEVICE_TYPE eDeviceType, IMG_SYS_PHYADDR SysPAddr)
1180 IMG_DEV_PHYADDR DevPAddr;
1182 PVR_UNREFERENCED_PARAMETER(eDeviceType);
1185 DevPAddr.uiAddr = SysPAddr.uiAddr;
1191 IMG_SYS_PHYADDR SysDevPAddrToSysPAddr (PVRSRV_DEVICE_TYPE eDeviceType, IMG_DEV_PHYADDR DevPAddr)
1193 IMG_SYS_PHYADDR SysPAddr;
1195 PVR_UNREFERENCED_PARAMETER(eDeviceType);
1198 SysPAddr.uiAddr = DevPAddr.uiAddr;
1204 IMG_VOID SysRegisterExternalDevice(PVRSRV_DEVICE_NODE *psDeviceNode)
1206 PVR_UNREFERENCED_PARAMETER(psDeviceNode);
1210 IMG_VOID SysRemoveExternalDevice(PVRSRV_DEVICE_NODE *psDeviceNode)
1212 PVR_UNREFERENCED_PARAMETER(psDeviceNode);
1215 PVRSRV_ERROR SysOEMFunction ( IMG_UINT32 ui32ID,
1217 IMG_UINT32 ulInSize,
1219 IMG_UINT32 ulOutSize)
1221 if (ulInSize || pvIn);
1223 if ((ui32ID == OEM_GET_EXT_FUNCS) &&
1224 (ulOutSize == sizeof(PVRSRV_DC_OEM_JTABLE)))
1226 PVRSRV_DC_OEM_JTABLE *psOEMJTable = (PVRSRV_DC_OEM_JTABLE*)pvOut;
1227 psOEMJTable->pfnOEMBridgeDispatch = &PVRSRV_BridgeDispatchKM;
1229 psOEMJTable->pfnOEMReadRegistryString = IMG_NULL;
1230 psOEMJTable->pfnOEMWriteRegistryString = IMG_NULL;
1232 psOEMJTable->pfnOEMReadRegistryString = IMG_NULL;
1233 psOEMJTable->pfnOEMWriteRegistryString = IMG_NULL;
1238 return PVRSRV_ERROR_INVALID_PARAMS;
1243 PVRSRV_ERROR SysSystemPrePowerState(PVRSRV_SYS_POWER_STATE eNewPowerState)
1245 PVRSRV_ERROR eError= PVRSRV_OK;
1247 if (eNewPowerState != gpsSysData->eCurrentPowerState)
1249 if ((eNewPowerState == PVRSRV_SYS_POWER_STATE_D3) &&
1250 (gpsSysData->eCurrentPowerState < PVRSRV_SYS_POWER_STATE_D3))
1253 if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_IRQ_ENABLED))
1255 SysDisableInterrupts(gpsSysData);
1257 SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_IRQ_DISABLE);
1258 SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData, SYS_SPECIFIC_DATA_IRQ_ENABLED);
1261 #if defined(SYS_USING_INTERRUPTS)
1262 if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_LISR_INSTALLED))
1264 eError = OSUninstallSystemLISR(gpsSysData);
1265 if (eError != PVRSRV_OK)
1267 PVR_DPF((PVR_DBG_ERROR,"SysSystemPrePowerState: OSUninstallSystemLISR failed (%d)", eError));
1269 SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNINSTALL_LISR);
1270 SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData, SYS_SPECIFIC_DATA_LISR_INSTALLED);
1276 eError = OSPCISuspendDev(gsSysSpecificData.hSGXPCI);
1277 if (eError != PVRSRV_OK)
1279 PVR_DPF((PVR_DBG_ERROR,"SysSystemPrePowerState: OSPCISuspendDev failed (%d)", eError));
1288 PVRSRV_ERROR SysSystemPostPowerState(PVRSRV_SYS_POWER_STATE eNewPowerState)
1290 PVRSRV_ERROR eError = PVRSRV_OK;
1292 if (eNewPowerState != gpsSysData->eCurrentPowerState)
1294 if ((gpsSysData->eCurrentPowerState == PVRSRV_SYS_POWER_STATE_D3) &&
1295 (eNewPowerState < PVRSRV_SYS_POWER_STATE_D3))
1298 eError = OSPCIResumeDev(gsSysSpecificData.hSGXPCI);
1299 if (eError != PVRSRV_OK)
1301 PVR_DPF((PVR_DBG_ERROR,"SysSystemPostPowerState: OSPCIResumeDev failed (%d)", eError));
1306 #if defined(SYS_USING_INTERRUPTS)
1307 if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNINSTALL_LISR))
1309 eError = OSInstallSystemLISR(gpsSysData, gsSGXDeviceMap.ui32IRQ);
1310 if (eError != PVRSRV_OK)
1312 PVR_DPF((PVR_DBG_ERROR,"SysSystemPostPowerState: OSInstallSystemLISR failed to install ISR (%d)", eError));
1314 SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_LISR_INSTALLED);
1315 SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNINSTALL_LISR);
1319 if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_IRQ_DISABLE))
1321 SysEnableInterrupts(gpsSysData);
1323 SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_IRQ_ENABLED);
1324 SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_IRQ_DISABLE);
1332 PVRSRV_ERROR SysDevicePrePowerState(IMG_UINT32 ui32DeviceIndex,
1333 PVRSRV_DEV_POWER_STATE eNewPowerState,
1334 PVRSRV_DEV_POWER_STATE eCurrentPowerState)
1336 if (ui32DeviceIndex == gui32SGXDeviceID)
1338 if ((eNewPowerState != eCurrentPowerState) &&
1339 (eNewPowerState == PVRSRV_DEV_POWER_STATE_OFF))
1341 PVR_DPF((PVR_DBG_MESSAGE,"SysDevicePrePowerState: Remove SGX power"));
1349 PVRSRV_ERROR SysDevicePostPowerState(IMG_UINT32 ui32DeviceIndex,
1350 PVRSRV_DEV_POWER_STATE eNewPowerState,
1351 PVRSRV_DEV_POWER_STATE eCurrentPowerState)
1353 if (ui32DeviceIndex == gui32SGXDeviceID)
1355 if ((eNewPowerState != eCurrentPowerState) &&
1356 (eCurrentPowerState == PVRSRV_DEV_POWER_STATE_OFF))
1358 PVR_DPF((PVR_DBG_MESSAGE,"SysDevicePostPowerState: Restore SGX power"));