1 /**********************************************************************
3 * Copyright(c) 2008 Imagination Technologies Ltd. All rights reserved.
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms and conditions of the GNU General Public License,
7 * version 2, as published by the Free Software Foundation.
9 * This program is distributed in the hope it will be useful but, except
10 * as otherwise stated in writing, without any warranty; without even the
11 * implied warranty of merchantability or fitness for a particular purpose.
12 * See the GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
18 * The full GNU General Public License is included in this distribution in
19 * the file called "COPYING".
21 * Contact Information:
22 * Imagination Technologies Ltd. <gpl-support@imgtec.com>
23 * Home Park Estate, Kings Langley, Herts, WD4 8LZ, UK
25 ******************************************************************************/
27 #include <linux/platform_device.h>
29 #include "services_headers.h"
30 #include "kerneldisplay.h"
33 #include "pvr_pdump.h"
34 #include "sgxinfokm.h"
36 #include "sysconfig.h"
37 #include "syscommon.h"
38 #include "img_types.h"
40 #include "pvr_bridge_km.h"
42 struct SYS_DATA *gpsSysData;
43 static struct SYS_DATA gsSysData;
45 static struct SYS_SPECIFIC_DATA gsSysSpecificData;
46 struct SYS_SPECIFIC_DATA *gpsSysSpecificData;
48 static u32 gui32SGXDeviceID;
49 static struct SGX_DEVICE_MAP gsSGXDeviceMap;
50 static struct PVRSRV_DEVICE_NODE *gpsSGXDevNode;
52 #define DEVICE_SGX_INTERRUPT (1 << 0)
54 #if defined(NO_HARDWARE)
55 static void *gsSGXRegsCPUVAddr;
58 static void __iomem *ocp_base;
60 static enum PVRSRV_ERROR SysLocateDevices(struct SYS_DATA *psSysData)
62 #if defined(NO_HARDWARE)
63 enum PVRSRV_ERROR eError;
64 struct IMG_CPU_PHYADDR sCpuPAddr;
67 PVR_UNREFERENCED_PARAMETER(psSysData);
69 gsSGXDeviceMap.ui32Flags = 0x0;
71 #if defined(NO_HARDWARE)
73 eError = OSBaseAllocContigMemory(SYS_OMAP3430_SGX_REGS_SIZE,
74 &gsSGXRegsCPUVAddr, &sCpuPAddr);
75 if (eError != PVRSRV_OK)
77 gsSGXDeviceMap.sRegsCpuPBase = sCpuPAddr;
78 gsSGXDeviceMap.sRegsSysPBase =
79 SysCpuPAddrToSysPAddr(gsSGXDeviceMap.sRegsCpuPBase);
80 gsSGXDeviceMap.ui32RegsSize = SYS_OMAP3430_SGX_REGS_SIZE;
82 gsSGXDeviceMap.pvRegsCpuVBase = gsSGXRegsCPUVAddr;
84 OSMemSet(gsSGXRegsCPUVAddr, 0, SYS_OMAP3430_SGX_REGS_SIZE);
86 gsSGXDeviceMap.ui32IRQ = 0;
90 gsSGXDeviceMap.sRegsSysPBase.uiAddr =
91 SYS_OMAP3430_SGX_REGS_SYS_PHYS_BASE;
92 gsSGXDeviceMap.sRegsCpuPBase =
93 SysSysPAddrToCpuPAddr(gsSGXDeviceMap.sRegsSysPBase);
94 gsSGXDeviceMap.ui32RegsSize = SYS_OMAP3430_SGX_REGS_SIZE;
96 gsSGXDeviceMap.ui32IRQ = SYS_OMAP3430_SGX_IRQ;
104 u32 sgx_get_rev(void)
107 * Ugly solution, used until we have proper per device instances
108 * passed to functions and get rid of most if not all globals.
110 struct SYS_SPECIFIC_DATA *sysd = gpsSysSpecificData;
112 static u32 rev = -1UL;
118 regs = OSMapPhysToLin(gsSGXDeviceMap.sRegsCpuPBase,
119 SYS_OMAP3430_SGX_REGS_SIZE,
120 PVRSRV_HAP_UNCACHED | PVRSRV_HAP_KERNEL_ONLY,
125 err = clk_enable(sysd->psSGX_FCK);
127 err = clk_enable(sysd->psSGX_ICK);
130 rev = OSReadHWReg(regs, EUR_CR_CORE_REVISION);
132 clk_disable(sysd->psSGX_ICK);
133 clk_disable(sysd->psSGX_FCK);
135 OSUnMapPhysToLin(regs, SYS_OMAP3430_SGX_REGS_SIZE,
136 PVRSRV_HAP_UNCACHED | PVRSRV_HAP_KERNEL_ONLY, NULL);
141 unsigned long sgx_get_max_freq(void)
143 struct SYS_SPECIFIC_DATA *sysd = gpsSysSpecificData;
147 if (sysd->sgx_fck_max)
148 return sysd->sgx_fck_max;
151 * In case there's no board specific setting for this, return
152 * some revision specific defaults.
155 switch (sgx_get_rev()) {
156 case EUR_CR_CORE_MAKE_REV(1, 2, 1):
157 return SYS_SGX_MAX_FREQ_530R121;
158 case EUR_CR_CORE_MAKE_REV(1, 2, 5):
159 return SYS_SGX_MAX_FREQ_530R125;
167 u32 sgx_get_rev(void)
172 unsigned long sgx_get_max_freq()
174 return SYS_SGX_MAX_FREQ_NO_HW;
179 bool sgx_is_530(void)
187 char *SysCreateVersionString(struct IMG_CPU_PHYADDR sRegRegion)
189 static char aszVersionString[100];
190 struct SYS_DATA *psSysData;
194 if (SysAcquireData(&psSysData) != PVRSRV_OK)
197 ui32SGXRevision = sgx_get_rev();
199 i32Count = OSSNPrintf(aszVersionString, 100,
200 "SGX revision = %u.%u.%u",
201 (unsigned)((ui32SGXRevision &
202 EUR_CR_CORE_REVISION_MAJOR_MASK)
203 >> EUR_CR_CORE_REVISION_MAJOR_SHIFT),
204 (unsigned)((ui32SGXRevision &
205 EUR_CR_CORE_REVISION_MINOR_MASK)
206 >> EUR_CR_CORE_REVISION_MINOR_SHIFT),
207 (unsigned)((ui32SGXRevision &
208 EUR_CR_CORE_REVISION_MAINTENANCE_MASK)
209 >> EUR_CR_CORE_REVISION_MAINTENANCE_SHIFT)
215 return aszVersionString;
218 static int sgx_ocp_init(void)
220 struct IMG_SYS_PHYADDR sys_pbase;
221 struct IMG_CPU_PHYADDR cpu_pbase;
223 sys_pbase.uiAddr = SYS_OMAP3430_OCP_REGS_SYS_PHYS_BASE;
224 cpu_pbase = SysSysPAddrToCpuPAddr(sys_pbase);
226 ocp_base = OSMapPhysToLin(cpu_pbase, SYS_OMAP3430_OCP_REGS_SIZE,
227 PVRSRV_HAP_UNCACHED | PVRSRV_HAP_KERNEL_ONLY,
231 PVR_DPF(PVR_DBG_ERROR, "%s: Failed to map OCP registers",
239 static void sgx_ocp_cleanup(void)
241 OSUnMapPhysToLin(ocp_base, SYS_OMAP3430_OCP_REGS_SIZE,
242 PVRSRV_HAP_UNCACHED | PVRSRV_HAP_KERNEL_ONLY, NULL);
245 void sgx_ocp_write_reg(u32 reg, u32 val)
249 /* OCP offsets are based at EUR_CR_OCP_REVISION */
250 reg -= EUR_CR_OCP_REVISION;
251 OSWriteHWReg(ocp_base, reg, val);
254 enum PVRSRV_ERROR SysInitialise(struct platform_device *pdev)
257 enum PVRSRV_ERROR eError;
258 struct PVRSRV_DEVICE_NODE *psDeviceNode;
259 struct IMG_CPU_PHYADDR TimerRegPhysBase;
260 struct sgx_platform_data *spd;
262 gpsSysData = &gsSysData;
264 gpsSysSpecificData = &gsSysSpecificData;
266 gpsSysData->pvSysSpecificData = gpsSysSpecificData;
268 spd = pdev->dev.platform_data;
270 gpsSysSpecificData->sgx_fck_max = spd->fclock_max;
272 eError = OSInitEnvData(&gpsSysData->pvEnvSpecificData);
273 if (eError != PVRSRV_OK) {
274 PVR_DPF(PVR_DBG_ERROR,
275 "SysInitialise: Failed to setup env structure");
276 SysDeinitialise(gpsSysData);
280 SYS_SPECIFIC_DATA_SET(&gsSysSpecificData,
281 SYS_SPECIFIC_DATA_ENABLE_ENVDATA);
283 gpsSysData->ui32NumDevices = SYS_DEVICE_COUNT;
285 for (i = 0; i < SYS_DEVICE_COUNT; i++) {
286 gpsSysData->sDeviceID[i].uiID = i;
287 gpsSysData->sDeviceID[i].bInUse = IMG_FALSE;
290 gpsSysData->psDeviceNodeList = NULL;
291 gpsSysData->psQueueList = NULL;
293 eError = SysInitialiseCommon(gpsSysData);
294 if (eError != PVRSRV_OK) {
295 PVR_DPF(PVR_DBG_ERROR,
296 "SysInitialise: Failed in SysInitialiseCommon");
297 SysDeinitialise(gpsSysData);
302 TimerRegPhysBase.uiAddr =
303 SYS_OMAP3430_GP11TIMER_PHYS_BASE + SYS_OMAP3430_GPTIMER_REGS;
304 gpsSysData->pvSOCTimerRegisterKM = NULL;
305 gpsSysData->hSOCTimerRegisterOSMemHandle = NULL;
306 OSReservePhys(TimerRegPhysBase, 4,
307 PVRSRV_HAP_MULTI_PROCESS | PVRSRV_HAP_UNCACHED,
308 (void **)&gpsSysData->pvSOCTimerRegisterKM,
309 &gpsSysData->hSOCTimerRegisterOSMemHandle);
311 gpsSysSpecificData->ui32SrcClockDiv = 3;
313 eError = SysLocateDevices(gpsSysData);
314 if (eError != PVRSRV_OK) {
315 PVR_DPF(PVR_DBG_ERROR,
316 "SysInitialise: Failed to locate devices");
317 SysDeinitialise(gpsSysData);
321 SYS_SPECIFIC_DATA_SET(&gsSysSpecificData,
322 SYS_SPECIFIC_DATA_ENABLE_LOCATEDEV);
324 if (sgx_ocp_init() < 0) {
325 SysDeinitialise(gpsSysData);
328 return PVRSRV_ERROR_GENERIC;
331 eError = PVRSRVRegisterDevice(gpsSysData, SGXRegisterDevice,
332 DEVICE_SGX_INTERRUPT, &gui32SGXDeviceID);
333 if (eError != PVRSRV_OK) {
334 PVR_DPF(PVR_DBG_ERROR,
335 "SysInitialise: Failed to register device!");
336 SysDeinitialise(gpsSysData);
340 SYS_SPECIFIC_DATA_SET(&gsSysSpecificData,
341 SYS_SPECIFIC_DATA_ENABLE_REGDEV);
343 psDeviceNode = gpsSysData->psDeviceNodeList;
344 while (psDeviceNode) {
345 switch (psDeviceNode->sDevId.eDeviceType) {
346 case PVRSRV_DEVICE_TYPE_SGX:
348 struct DEVICE_MEMORY_INFO *psDevMemoryInfo;
349 struct DEVICE_MEMORY_HEAP_INFO
352 psDeviceNode->psLocalDevMemArena = NULL;
354 psDevMemoryInfo = &psDeviceNode->sDevMemoryInfo;
356 psDevMemoryInfo->psDeviceMemoryHeap;
358 for (i = 0; i < psDevMemoryInfo->ui32HeapCount;
360 psDeviceMemoryHeap[i].ui32Attribs |=
361 PVRSRV_BACKINGSTORE_SYSMEM_NONCONTIG;
363 gpsSGXDevNode = psDeviceNode;
364 gsSysSpecificData.psSGXDevNode = psDeviceNode;
369 PVR_DPF(PVR_DBG_ERROR, "SysInitialise: "
370 "Failed to find SGX device node!");
371 return PVRSRV_ERROR_INIT_FAILURE;
374 psDeviceNode = psDeviceNode->psNext;
378 SYS_SPECIFIC_DATA_SET(&gsSysSpecificData,
379 SYS_SPECIFIC_DATA_ENABLE_PDUMPINIT);
381 eError = InitSystemClocks(gpsSysData);
382 if (eError != PVRSRV_OK) {
383 PVR_DPF(PVR_DBG_ERROR,
384 "SysInitialise: Failed to init system clocks (%d)",
386 SysDeinitialise(gpsSysData);
391 eError = EnableSystemClocks(gpsSysData);
392 if (eError != PVRSRV_OK) {
393 PVR_DPF(PVR_DBG_ERROR,
394 "SysInitialise: Failed to Enable system clocks (%d)",
396 SysDeinitialise(gpsSysData);
400 SYS_SPECIFIC_DATA_SET(&gsSysSpecificData,
401 SYS_SPECIFIC_DATA_ENABLE_SYSCLOCKS);
403 eError = OSInitPerf(gpsSysData);
404 if (eError != PVRSRV_OK) {
405 PVR_DPF(PVR_DBG_ERROR,
406 "SysInitialise: Failed to init DVFS (%d)", eError);
407 SysDeinitialise(gpsSysData);
411 SYS_SPECIFIC_DATA_SET(&gsSysSpecificData,
412 SYS_SPECIFIC_DATA_ENABLE_PERF);
414 eError = EnableSGXClocks(gpsSysData);
415 if (eError != PVRSRV_OK) {
416 PVR_DPF(PVR_DBG_ERROR,
417 "SysInitialise: Failed to Enable SGX clocks (%d)",
419 SysDeinitialise(gpsSysData);
424 eError = PVRSRVInitialiseDevice(gui32SGXDeviceID);
425 if (eError != PVRSRV_OK) {
426 PVR_DPF(PVR_DBG_ERROR,
427 "SysInitialise: Failed to initialise device!");
428 SysDeinitialise(gpsSysData);
432 SYS_SPECIFIC_DATA_SET(&gsSysSpecificData,
433 SYS_SPECIFIC_DATA_ENABLE_INITDEV);
435 gpsSysData->pszVersionString =
436 SysCreateVersionString(gsSGXDeviceMap.sRegsCpuPBase);
437 if (!gpsSysData->pszVersionString)
438 PVR_DPF(PVR_DBG_ERROR,
439 "SysFinalise: Failed to create a system version string");
441 PVR_DPF(PVR_DBG_WARNING, "SysFinalise: Version string: %s",
442 gpsSysData->pszVersionString);
444 DisableSGXClocks(gpsSysData);
449 enum PVRSRV_ERROR SysFinalise(void)
451 enum PVRSRV_ERROR eError = PVRSRV_OK;
453 eError = EnableSGXClocks(gpsSysData);
454 if (eError != PVRSRV_OK) {
455 PVR_DPF(PVR_DBG_ERROR,
456 "SysInitialise: Failed to Enable SGX clocks (%d)",
458 SysDeinitialise(gpsSysData);
464 eError = OSInstallMISR(gpsSysData);
465 if (eError != PVRSRV_OK) {
466 PVR_DPF(PVR_DBG_ERROR, "SysFinalise: Failed to install MISR");
467 SysDeinitialise(gpsSysData);
471 SYS_SPECIFIC_DATA_SET(&gsSysSpecificData,
472 SYS_SPECIFIC_DATA_ENABLE_MISR);
475 OSInstallDeviceLISR(gpsSysData, gsSGXDeviceMap.ui32IRQ, "SGX ISR",
477 if (eError != PVRSRV_OK) {
478 PVR_DPF(PVR_DBG_ERROR, "SysFinalise: Failed to install ISR");
479 SysDeinitialise(gpsSysData);
483 SYS_SPECIFIC_DATA_SET(&gsSysSpecificData,
484 SYS_SPECIFIC_DATA_ENABLE_LISR);
486 DisableSGXClocks(gpsSysData);
488 gpsSysSpecificData->bSGXInitComplete = IMG_TRUE;
493 enum PVRSRV_ERROR SysDeinitialise(struct SYS_DATA *psSysData)
495 enum PVRSRV_ERROR eError;
497 if (SYS_SPECIFIC_DATA_TEST
498 (gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_LISR)) {
499 eError = OSUninstallDeviceLISR(psSysData);
500 if (eError != PVRSRV_OK) {
501 PVR_DPF(PVR_DBG_ERROR, "SysDeinitialise: "
502 "OSUninstallDeviceLISR failed");
507 if (SYS_SPECIFIC_DATA_TEST
508 (gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_MISR)) {
509 eError = OSUninstallMISR(psSysData);
510 if (eError != PVRSRV_OK) {
511 PVR_DPF(PVR_DBG_ERROR, "SysDeinitialise: "
512 "OSUninstallMISR failed");
517 if (SYS_SPECIFIC_DATA_TEST
518 (gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_INITDEV)) {
519 PVR_ASSERT(SYS_SPECIFIC_DATA_TEST
521 SYS_SPECIFIC_DATA_ENABLE_SYSCLOCKS));
523 eError = EnableSGXClocks(gpsSysData);
524 if (eError != PVRSRV_OK) {
525 PVR_DPF(PVR_DBG_ERROR,
526 "SysDeinitialise: EnableSGXClocks failed");
530 eError = PVRSRVDeinitialiseDevice(gui32SGXDeviceID);
532 DisableSGXClocks(gpsSysData);
534 if (eError != PVRSRV_OK) {
535 PVR_DPF(PVR_DBG_ERROR, "SysDeinitialise: "
536 "failed to de-init the device");
541 if (SYS_SPECIFIC_DATA_TEST
542 (gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_SYSCLOCKS))
543 DisableSystemClocks(gpsSysData);
545 CleanupSystemClocks(gpsSysData);
547 if (SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData,
548 SYS_SPECIFIC_DATA_ENABLE_PERF)) {
549 eError = OSCleanupPerf(psSysData);
550 if (eError != PVRSRV_OK) {
551 PVR_DPF(PVR_DBG_ERROR,
552 "SysDeinitialise: OSCleanupDvfs failed");
559 if (SYS_SPECIFIC_DATA_TEST
560 (gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_ENVDATA)) {
561 eError = OSDeInitEnvData(gpsSysData->pvEnvSpecificData);
562 if (eError != PVRSRV_OK) {
563 PVR_DPF(PVR_DBG_ERROR,
564 "SysDeinitialise: failed to de-init env structure");
569 if (gpsSysData->pvSOCTimerRegisterKM)
570 OSUnReservePhys(gpsSysData->pvSOCTimerRegisterKM, 4,
571 PVRSRV_HAP_MULTI_PROCESS | PVRSRV_HAP_UNCACHED,
572 gpsSysData->hSOCTimerRegisterOSMemHandle);
574 SysDeinitialiseCommon(gpsSysData);
576 #if defined(NO_HARDWARE)
577 if (SYS_SPECIFIC_DATA_TEST
578 (gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_LOCATEDEV))
580 OSBaseFreeContigMemory(SYS_OMAP3430_SGX_REGS_SIZE,
582 gsSGXDeviceMap.sRegsCpuPBase);
585 if (SYS_SPECIFIC_DATA_TEST
586 (gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_PDUMPINIT))
589 gpsSysSpecificData->ui32SysSpecificData = 0;
590 gpsSysSpecificData->bSGXInitComplete = IMG_FALSE;
597 enum PVRSRV_ERROR SysGetDeviceMemoryMap(enum PVRSRV_DEVICE_TYPE eDeviceType,
600 switch (eDeviceType) {
601 case PVRSRV_DEVICE_TYPE_SGX:
602 *ppvDeviceMap = (void *) &gsSGXDeviceMap;
605 PVR_DPF(PVR_DBG_ERROR, "SysGetDeviceMemoryMap: "
606 "unsupported device type");
611 struct IMG_DEV_PHYADDR SysCpuPAddrToDevPAddr(
612 enum PVRSRV_DEVICE_TYPE eDeviceType,
613 struct IMG_CPU_PHYADDR CpuPAddr)
615 struct IMG_DEV_PHYADDR DevPAddr;
617 PVR_UNREFERENCED_PARAMETER(eDeviceType);
619 DevPAddr.uiAddr = CpuPAddr.uiAddr;
624 struct IMG_CPU_PHYADDR SysSysPAddrToCpuPAddr(struct IMG_SYS_PHYADDR sys_paddr)
626 struct IMG_CPU_PHYADDR cpu_paddr;
628 cpu_paddr.uiAddr = sys_paddr.uiAddr;
632 struct IMG_SYS_PHYADDR SysCpuPAddrToSysPAddr(struct IMG_CPU_PHYADDR cpu_paddr)
634 struct IMG_SYS_PHYADDR sys_paddr;
636 sys_paddr.uiAddr = cpu_paddr.uiAddr;
640 struct IMG_DEV_PHYADDR SysSysPAddrToDevPAddr(
641 enum PVRSRV_DEVICE_TYPE eDeviceType,
642 struct IMG_SYS_PHYADDR SysPAddr)
644 struct IMG_DEV_PHYADDR DevPAddr;
646 PVR_UNREFERENCED_PARAMETER(eDeviceType);
648 DevPAddr.uiAddr = SysPAddr.uiAddr;
653 struct IMG_SYS_PHYADDR SysDevPAddrToSysPAddr(
654 enum PVRSRV_DEVICE_TYPE eDeviceType,
655 struct IMG_DEV_PHYADDR DevPAddr)
657 struct IMG_SYS_PHYADDR SysPAddr;
659 PVR_UNREFERENCED_PARAMETER(eDeviceType);
661 SysPAddr.uiAddr = DevPAddr.uiAddr;
666 void SysRegisterExternalDevice(struct PVRSRV_DEVICE_NODE *psDeviceNode)
668 PVR_UNREFERENCED_PARAMETER(psDeviceNode);
671 void SysRemoveExternalDevice(struct PVRSRV_DEVICE_NODE *psDeviceNode)
673 PVR_UNREFERENCED_PARAMETER(psDeviceNode);
676 u32 SysGetInterruptSource(struct SYS_DATA *psSysData,
677 struct PVRSRV_DEVICE_NODE *psDeviceNode)
679 PVR_UNREFERENCED_PARAMETER(psSysData);
680 #if defined(NO_HARDWARE)
685 return psDeviceNode->ui32SOCInterruptBit;
689 void SysClearInterrupts(struct SYS_DATA *psSysData, u32 ui32ClearBits)
691 PVR_UNREFERENCED_PARAMETER(psSysData);
692 PVR_UNREFERENCED_PARAMETER(ui32ClearBits);
694 OSReadHWReg(((struct PVRSRV_SGXDEV_INFO *)gpsSGXDevNode->pvDevice)->
695 pvRegsBaseKM, EUR_CR_EVENT_HOST_CLEAR);
698 enum PVRSRV_ERROR SysSystemPrePowerState(enum PVR_POWER_STATE eNewPowerState)
700 enum PVRSRV_ERROR eError = PVRSRV_OK;
702 if (eNewPowerState == PVRSRV_POWER_STATE_D3) {
703 PVR_TRACE("SysSystemPrePowerState: Entering state D3");
705 if (SYS_SPECIFIC_DATA_TEST
706 (&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_LISR)) {
707 eError = OSUninstallDeviceLISR(gpsSysData);
708 if (eError != PVRSRV_OK) {
709 PVR_DPF(PVR_DBG_ERROR,
710 "SysSystemPrePowerState: "
711 "OSUninstallDeviceLISR failed "
716 SYS_SPECIFIC_DATA_SET(&gsSysSpecificData,
717 SYS_SPECIFIC_DATA_PM_UNINSTALL_LISR);
718 SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData,
719 SYS_SPECIFIC_DATA_ENABLE_LISR);
722 if (SYS_SPECIFIC_DATA_TEST
723 (&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_SYSCLOCKS)) {
724 DisableSystemClocks(gpsSysData);
726 SYS_SPECIFIC_DATA_SET(&gsSysSpecificData,
727 SYS_SPECIFIC_DATA_PM_DISABLE_SYSCLOCKS);
728 SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData,
729 SYS_SPECIFIC_DATA_ENABLE_SYSCLOCKS);
736 enum PVRSRV_ERROR SysSystemPostPowerState(enum PVR_POWER_STATE eNewPowerState)
738 enum PVRSRV_ERROR eError = PVRSRV_OK;
740 if (eNewPowerState == PVRSRV_POWER_STATE_D0) {
741 PVR_TRACE("SysSystemPostPowerState: Entering state D0");
743 if (SYS_SPECIFIC_DATA_TEST
745 SYS_SPECIFIC_DATA_PM_DISABLE_SYSCLOCKS)) {
746 eError = EnableSystemClocks(gpsSysData);
747 if (eError != PVRSRV_OK) {
748 PVR_DPF(PVR_DBG_ERROR,
749 "SysSystemPostPowerState: "
750 "EnableSystemClocks failed (%d)",
754 SYS_SPECIFIC_DATA_SET(&gsSysSpecificData,
755 SYS_SPECIFIC_DATA_ENABLE_SYSCLOCKS);
756 SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData,
757 SYS_SPECIFIC_DATA_PM_DISABLE_SYSCLOCKS);
759 if (SYS_SPECIFIC_DATA_TEST
760 (&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNINSTALL_LISR)) {
762 OSInstallDeviceLISR(gpsSysData,
763 gsSGXDeviceMap.ui32IRQ,
764 "SGX ISR", gpsSGXDevNode);
765 if (eError != PVRSRV_OK) {
766 PVR_DPF(PVR_DBG_ERROR,
767 "SysSystemPostPowerState: "
768 "OSInstallDeviceLISR failed "
769 "to install ISR (%d)",
773 SYS_SPECIFIC_DATA_SET(&gsSysSpecificData,
774 SYS_SPECIFIC_DATA_ENABLE_LISR);
775 SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData,
776 SYS_SPECIFIC_DATA_PM_UNINSTALL_LISR);
782 enum PVRSRV_ERROR SysDevicePrePowerState(u32 ui32DeviceIndex,
783 enum PVR_POWER_STATE eNewPowerState,
784 enum PVR_POWER_STATE eCurrentPowerState)
786 PVR_UNREFERENCED_PARAMETER(eCurrentPowerState);
788 if (ui32DeviceIndex != gui32SGXDeviceID)
790 if (eNewPowerState == PVRSRV_POWER_STATE_D3) {
791 PVR_DPF(PVR_DBG_MESSAGE,
792 "SysDevicePrePowerState: SGX Entering state D3");
793 DisableSGXClocks(gpsSysData);
798 enum PVRSRV_ERROR SysDevicePostPowerState(u32 ui32DeviceIndex,
799 enum PVR_POWER_STATE eNewPowerState,
800 enum PVR_POWER_STATE eCurrentPowerState)
802 enum PVRSRV_ERROR eError = PVRSRV_OK;
804 PVR_UNREFERENCED_PARAMETER(eNewPowerState);
806 if (ui32DeviceIndex != gui32SGXDeviceID)
808 if (eCurrentPowerState == PVRSRV_POWER_STATE_D3) {
809 PVR_DPF(PVR_DBG_MESSAGE,
810 "SysDevicePostPowerState: SGX Leaving state D3");
811 eError = EnableSGXClocks(gpsSysData);
817 enum PVRSRV_ERROR SysOEMFunction(u32 ui32ID, void *pvIn, u32 ulInSize,
818 void *pvOut, u32 ulOutSize)
820 PVR_UNREFERENCED_PARAMETER(ui32ID);
821 PVR_UNREFERENCED_PARAMETER(pvIn);
822 PVR_UNREFERENCED_PARAMETER(ulInSize);
823 PVR_UNREFERENCED_PARAMETER(pvOut);
824 PVR_UNREFERENCED_PARAMETER(ulOutSize);
826 if ((ui32ID == OEM_GET_EXT_FUNCS) &&
827 (ulOutSize == sizeof(struct PVRSRV_DC_OEM_JTABLE))) {
829 struct PVRSRV_DC_OEM_JTABLE *psOEMJTable =
830 (struct PVRSRV_DC_OEM_JTABLE *)pvOut;
831 psOEMJTable->pfnOEMBridgeDispatch = &PVRSRV_BridgeDispatchKM;
835 return PVRSRV_ERROR_INVALID_PARAMS;