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 ******************************************************************************/
31 #include "services_headers.h"
32 #include "buffer_manager.h"
33 #include "sgxapi_km.h"
35 #include "sgxinfokm.h"
36 #include "sgxconfig.h"
37 #include "sysconfig.h"
38 #include "pvr_bridge_km.h"
48 #if defined (SGX_FEATURE_2D_HARDWARE)
49 #define SGX_USING_CMD_PROC_LIST
52 IMG_BOOL SGX_ISRHandler(IMG_VOID * pvData);
54 IMG_UINT32 gui32EventStatusServicesByISR = 0;
56 IMG_VOID SGXReset(PVRSRV_SGXDEV_INFO * psDevInfo, IMG_UINT32 ui32PDUMPFlags);
58 static PVRSRV_ERROR SGXInitialise(PVRSRV_SGXDEV_INFO * psDevInfo,
59 IMG_BOOL bHardwareRecovery);
60 PVRSRV_ERROR SGXDeinitialise(IMG_HANDLE hDevCookie);
62 static IMG_VOID SGXCommandComplete(PVRSRV_DEVICE_NODE * psDeviceNode)
64 SGXScheduleProcessQueues(psDeviceNode);
67 static IMG_UINT32 DeinitDevInfo(PVRSRV_SGXDEV_INFO * psDevInfo)
69 if (psDevInfo->psKernelCCBInfo != IMG_NULL) {
71 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_SGX_CCB_INFO),
72 psDevInfo->psKernelCCBInfo, IMG_NULL);
78 static PVRSRV_ERROR InitDevInfo(PVRSRV_PER_PROCESS_DATA * psPerProc,
79 PVRSRV_DEVICE_NODE * psDeviceNode,
80 SGX_BRIDGE_INIT_INFO * psInitInfo)
82 PVRSRV_SGXDEV_INFO *psDevInfo =
83 (PVRSRV_SGXDEV_INFO *) psDeviceNode->pvDevice;
86 PVRSRV_SGX_CCB_INFO *psKernelCCBInfo = IMG_NULL;
88 PVR_UNREFERENCED_PARAMETER(psPerProc);
89 psDevInfo->sScripts = psInitInfo->sScripts;
91 psDevInfo->psKernelCCBMemInfo =
92 (PVRSRV_KERNEL_MEM_INFO *) psInitInfo->hKernelCCBMemInfo;
93 psDevInfo->psKernelCCB =
94 (PVRSRV_SGX_KERNEL_CCB *) psDevInfo->psKernelCCBMemInfo->
97 psDevInfo->psKernelCCBCtlMemInfo =
98 (PVRSRV_KERNEL_MEM_INFO *) psInitInfo->hKernelCCBCtlMemInfo;
99 psDevInfo->psKernelCCBCtl =
100 (PVRSRV_SGX_CCB_CTL *) psDevInfo->psKernelCCBCtlMemInfo->
103 psDevInfo->psKernelCCBEventKickerMemInfo =
104 (PVRSRV_KERNEL_MEM_INFO *) psInitInfo->hKernelCCBEventKickerMemInfo;
105 psDevInfo->pui32KernelCCBEventKicker =
106 (IMG_UINT32 *) psDevInfo->psKernelCCBEventKickerMemInfo->
109 psDevInfo->psKernelSGXHostCtlMemInfo =
110 (PVRSRV_KERNEL_MEM_INFO *) psInitInfo->hKernelSGXHostCtlMemInfo;
111 psDevInfo->psSGXHostCtl =
112 (PVRSRV_SGX_HOST_CTL *) psDevInfo->psKernelSGXHostCtlMemInfo->
115 #if defined(SGX_SUPPORT_HWPROFILING)
116 psDevInfo->psKernelHWProfilingMemInfo =
117 (PVRSRV_KERNEL_MEM_INFO *) psInitInfo->hKernelHWProfilingMemInfo;
119 #if defined(SUPPORT_SGX_HWPERF)
120 psDevInfo->psKernelHWPerfCBMemInfo =
121 (PVRSRV_KERNEL_MEM_INFO *) psInitInfo->hKernelHWPerfCBMemInfo;
123 #if defined(SGX_FEATURE_OVERLAPPED_SPM)
124 psDevInfo->psKernelTmpRgnHeaderMemInfo =
125 (PVRSRV_KERNEL_MEM_INFO *) psInitInfo->hKernelTmpRgnHeaderMemInfo;
127 #if defined(SGX_FEATURE_SPM_MODE_0)
128 psDevInfo->psKernelTmpDPMStateMemInfo =
129 (PVRSRV_KERNEL_MEM_INFO *) psInitInfo->hKernelTmpDPMStateMemInfo;
132 eError = OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
133 sizeof(PVRSRV_SGX_CCB_INFO),
134 (IMG_VOID **) & psKernelCCBInfo, 0);
135 if (eError != PVRSRV_OK) {
136 PVR_DPF((PVR_DBG_ERROR, "InitDevInfo: Failed to alloc memory"));
137 goto failed_allockernelccb;
140 OSMemSet(psKernelCCBInfo, 0, sizeof(PVRSRV_SGX_CCB_INFO));
141 psKernelCCBInfo->psCCBMemInfo = psDevInfo->psKernelCCBMemInfo;
142 psKernelCCBInfo->psCCBCtlMemInfo = psDevInfo->psKernelCCBCtlMemInfo;
143 psKernelCCBInfo->psCommands = psDevInfo->psKernelCCB->asCommands;
144 psKernelCCBInfo->pui32WriteOffset =
145 &psDevInfo->psKernelCCBCtl->ui32WriteOffset;
146 psKernelCCBInfo->pui32ReadOffset =
147 &psDevInfo->psKernelCCBCtl->ui32ReadOffset;
148 psDevInfo->psKernelCCBInfo = psKernelCCBInfo;
150 psDevInfo->ui32TAKickAddress = psInitInfo->ui32TAKickAddress;
152 psDevInfo->ui32VideoHandlerAddress =
153 psInitInfo->ui32VideoHandlerAddress;
155 psDevInfo->bForcePTOff = IMG_FALSE;
157 psDevInfo->ui32CacheControl = psInitInfo->ui32CacheControl;
159 psDevInfo->ui32EDMTaskReg0 = psInitInfo->ui32EDMTaskReg0;
160 psDevInfo->ui32EDMTaskReg1 = psInitInfo->ui32EDMTaskReg1;
161 psDevInfo->ui32ClkGateCtl = psInitInfo->ui32ClkGateCtl;
162 psDevInfo->ui32ClkGateCtl2 = psInitInfo->ui32ClkGateCtl2;
163 psDevInfo->ui32ClkGateStatusMask = psInitInfo->ui32ClkGateStatusMask;
165 OSMemCopy(&psDevInfo->asSGXDevData, &psInitInfo->asInitDevData,
166 sizeof(psDevInfo->asSGXDevData));
170 failed_allockernelccb:
171 DeinitDevInfo(psDevInfo);
176 static IMG_VOID SGXStartTimer(PVRSRV_SGXDEV_INFO * psDevInfo)
178 IMG_UINT32 ui32RegVal =
179 EUR_CR_EVENT_TIMER_ENABLE_MASK | psDevInfo->ui32uKernelTimerClock;
180 OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_EVENT_TIMER, ui32RegVal);
181 PDUMPREGWITHFLAGS(EUR_CR_EVENT_TIMER, ui32RegVal,
182 PDUMP_FLAGS_CONTINUOUS);
185 PVRSRV_ERROR SGXPrePowerState(IMG_HANDLE hDevHandle,
186 PVR_POWER_STATE eNewPowerState,
187 PVR_POWER_STATE eCurrentPowerState)
189 if (eNewPowerState != eCurrentPowerState) {
190 PVRSRV_DEVICE_NODE *psDeviceNode =
191 (PVRSRV_DEVICE_NODE *) hDevHandle;
192 PVRSRV_SGXDEV_INFO *psDevInfo =
193 (PVRSRV_SGXDEV_INFO *) psDeviceNode->pvDevice;
195 if (eNewPowerState == PVRSRV_POWER_STATE_D3) {
196 PVRSRV_SGX_HOST_CTL *psSGXHostCtl =
197 psDevInfo->psSGXHostCtl;
199 #if defined (SGX_FEATURE_AUTOCLOCKGATING) && (!defined(NO_HARDWARE) || defined(PDUMP))
200 IMG_UINT32 ui32ClockMask =
201 psDevInfo->ui32ClkGateStatusMask;
204 #if defined(SUPPORT_HW_RECOVERY)
206 if (OSDisableTimer(psDevInfo->hTimer) != PVRSRV_OK) {
207 PVR_DPF((PVR_DBG_ERROR,
208 "SGXPrePowerState: Failed to disable timer"));
209 return PVRSRV_ERROR_GENERIC;
213 psSGXHostCtl->ui32PowManFlags |=
214 PVRSRV_USSE_EDM_POWMAN_POWEROFF_REQUEST;
217 ("TA/3D CCB Control - Trigger power down event on uKernel...");
218 PDUMPMEM(IMG_NULL, psDevInfo->psKernelSGXHostCtlMemInfo,
219 offsetof(PVRSRV_SGX_HOST_CTL, ui32PowManFlags),
220 sizeof(IMG_UINT32), PDUMP_FLAGS_CONTINUOUS,
221 MAKEUNIQUETAG(psDevInfo->
222 psKernelSGXHostCtlMemInfo));
224 #if !defined(NO_HARDWARE)
226 ((volatile IMG_UINT32 *)(&psSGXHostCtl->
228 PVRSRV_USSE_EDM_POWMAN_POWEROFF_COMPLETE,
229 PVRSRV_USSE_EDM_POWMAN_POWEROFF_COMPLETE,
230 MAX_HW_TIME_US / WAIT_TRY_COUNT,
231 WAIT_TRY_COUNT) != PVRSRV_OK) {
232 PVR_DPF((PVR_DBG_ERROR,
233 "SGXPrePowerState: Wait for chip power off failed."));
240 ("TA/3D CCB Control - Wait for power down event on uKernel...");
241 PDUMPMEMPOL(psDevInfo->psKernelSGXHostCtlMemInfo,
242 offsetof(PVRSRV_SGX_HOST_CTL,
244 PVRSRV_USSE_EDM_POWMAN_POWEROFF_COMPLETE,
245 PVRSRV_USSE_EDM_POWMAN_POWEROFF_COMPLETE,
246 PDUMP_POLL_OPERATOR_EQUAL, IMG_FALSE,
248 MAKEUNIQUETAG(psDevInfo->
249 psKernelSGXHostCtlMemInfo));
252 SGXDeinitialise(psDevInfo);
254 #if defined(SGX_FEATURE_AUTOCLOCKGATING)
256 #if !defined(NO_HARDWARE)
258 ((volatile IMG_UINT32 *)((IMG_UINT8 *) psDevInfo->
260 EUR_CR_CLKGATESTATUS), 0,
261 ui32ClockMask, MAX_HW_TIME_US / WAIT_TRY_COUNT,
262 WAIT_TRY_COUNT) != PVRSRV_OK) {
263 PVR_DPF((PVR_DBG_ERROR,
264 "SGXPrePowerState: Wait for chip idle failed."));
267 PDUMPREGPOL(EUR_CR_CLKGATESTATUS, 0, ui32ClockMask);
275 PVRSRV_ERROR SGXPostPowerState(IMG_HANDLE hDevHandle,
276 PVR_POWER_STATE eNewPowerState,
277 PVR_POWER_STATE eCurrentPowerState)
279 if (eNewPowerState != eCurrentPowerState) {
281 PVRSRV_DEVICE_NODE *psDeviceNode =
282 (PVRSRV_DEVICE_NODE *) hDevHandle;
283 PVRSRV_SGXDEV_INFO *psDevInfo =
284 (PVRSRV_SGXDEV_INFO *) psDeviceNode->pvDevice;
287 eError = SysAcquireData(&psSysData);
288 if (eError != PVRSRV_OK) {
292 if (eCurrentPowerState == PVRSRV_POWER_STATE_D3) {
293 PVRSRV_SGX_HOST_CTL *psSGXHostCtl =
294 psDevInfo->psSGXHostCtl;
296 psSGXHostCtl->ui32PowManFlags = 0;
299 ("TA/3D CCB Control - Reset Power Manager flags");
300 PDUMPMEM(IMG_NULL, psDevInfo->psKernelSGXHostCtlMemInfo,
301 offsetof(PVRSRV_SGX_HOST_CTL, ui32PowManFlags),
302 sizeof(IMG_UINT32), PDUMP_FLAGS_CONTINUOUS,
303 MAKEUNIQUETAG(psDevInfo->
304 psKernelSGXHostCtlMemInfo));
306 eError = SGXInitialise(psDevInfo, IMG_FALSE);
308 if (eError != PVRSRV_OK) {
309 PVR_DPF((PVR_DBG_ERROR,
310 "SGXPostPowerState: SGXInitialise failed"));
313 #if defined(SUPPORT_HW_RECOVERY)
314 eError = OSEnableTimer(psDevInfo->hTimer);
315 if (eError != PVRSRV_OK) {
316 PVR_DPF((PVR_DBG_ERROR,
317 "SGXPostPowerState : Failed to enable host timer"));
318 return PVRSRV_ERROR_GENERIC;
323 PVR_DPF((PVR_DBG_WARNING,
324 "SGXPostPowerState : SGX Power Transition from %d to %d OK",
325 eCurrentPowerState, eNewPowerState));
331 static IMG_VOID SGXGetTimingInfo(PVRSRV_SGXDEV_INFO * psDevInfo,
332 SGX_TIMING_INFORMATION * psSGXTimingInfo)
334 IMG_UINT32 ui32ActivePowManSampleRate;
336 psDevInfo->ui32CoreClockSpeed = psSGXTimingInfo->ui32CoreClockSpeed;
337 psDevInfo->ui32uKernelTimerClock =
338 psSGXTimingInfo->ui32CoreClockSpeed /
339 psSGXTimingInfo->ui32uKernelFreq;
341 #if defined(SUPPORT_HW_RECOVERY)
342 psDevInfo->psSGXHostCtl->ui32HWRecoverySampleRate =
343 psSGXTimingInfo->ui32uKernelFreq /
344 psSGXTimingInfo->ui32HWRecoveryFreq;
347 ui32ActivePowManSampleRate =
348 psSGXTimingInfo->ui32uKernelFreq *
349 psSGXTimingInfo->ui32ActivePowManLatencyms / 1000;
351 ui32ActivePowManSampleRate += 1;
353 psDevInfo->psSGXHostCtl->ui32ActivePowManSampleRate =
354 ui32ActivePowManSampleRate;
357 static PVRSRV_ERROR SGXPreClockSpeedChange(IMG_HANDLE hDevHandle,
358 IMG_BOOL bIdleDevice)
361 PVRSRV_DEVICE_NODE *psDeviceNode = hDevHandle;
362 PVRSRV_SGXDEV_INFO *psDevInfo = psDeviceNode->pvDevice;
363 SGX_DEVICE_MAP *psSGXDeviceMap;
365 eError = SysGetDeviceMemoryMap(PVRSRV_DEVICE_TYPE_SGX,
366 (IMG_VOID **) & psSGXDeviceMap);
367 if (eError != PVRSRV_OK) {
368 PVR_DPF((PVR_DBG_ERROR,
369 "DevInitSGXPart2KM: Failed to get device memory map!"));
370 return PVRSRV_ERROR_INIT_FAILURE;
377 SGXGetTimingInfo(psDevInfo, &psSGXDeviceMap->sTimingInfo);
379 PVR_DPF((PVR_DBG_MESSAGE,
380 "SGXPreClockSpeedChange: SGX clock speed now %luHz",
381 psDevInfo->ui32CoreClockSpeed));
386 static PVRSRV_ERROR SGXPostClockSpeedChange(IMG_HANDLE hDevHandle,
387 IMG_BOOL bIdleDevice)
389 PVRSRV_DEVICE_NODE *psDeviceNode = hDevHandle;
390 PVRSRV_SGXDEV_INFO *psDevInfo = psDeviceNode->pvDevice;
395 SGXStartTimer(psDevInfo);
401 static PVRSRV_ERROR SGXRunScript(PVRSRV_SGXDEV_INFO * psDevInfo,
402 SGX_INIT_COMMAND * psScript,
403 IMG_UINT32 ui32NumInitCommands)
406 SGX_INIT_COMMAND *psComm;
408 for (ui32PC = 0, psComm = psScript;
409 ui32PC < ui32NumInitCommands; ui32PC++, psComm++) {
410 switch (psComm->eOp) {
411 case SGX_INIT_OP_WRITE_HW_REG:
413 OSWriteHWReg(psDevInfo->pvRegsBaseKM,
414 psComm->sWriteHWReg.ui32Offset,
415 psComm->sWriteHWReg.ui32Value);
416 PDUMPREG(psComm->sWriteHWReg.ui32Offset,
417 psComm->sWriteHWReg.ui32Value);
421 case SGX_INIT_OP_PDUMP_HW_REG:
423 PDUMPREG(psComm->sPDumpHWReg.ui32Offset,
424 psComm->sPDumpHWReg.ui32Value);
428 case SGX_INIT_OP_HALT:
432 case SGX_INIT_OP_ILLEGAL:
436 PVR_DPF((PVR_DBG_ERROR,
437 "SGXRunScript: PC %d: Illegal command: %d",
438 ui32PC, psComm->eOp));
439 return PVRSRV_ERROR_GENERIC;
445 return PVRSRV_ERROR_GENERIC;;
448 static PVRSRV_ERROR SGXInitialise(PVRSRV_SGXDEV_INFO * psDevInfo,
449 IMG_BOOL bHardwareRecovery)
452 IMG_UINT32 ui32ReadOffset, ui32WriteOffset;
454 OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_CLKGATECTL,
455 psDevInfo->ui32ClkGateCtl);
456 PDUMPREGWITHFLAGS(EUR_CR_CLKGATECTL, psDevInfo->ui32ClkGateCtl,
457 PDUMP_FLAGS_CONTINUOUS);
459 OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_CLKGATECTL2,
460 psDevInfo->ui32ClkGateCtl2);
461 PDUMPREGWITHFLAGS(EUR_CR_CLKGATECTL2, psDevInfo->ui32ClkGateCtl2,
462 PDUMP_FLAGS_CONTINUOUS);
465 SGXReset(psDevInfo, PDUMP_FLAGS_CONTINUOUS);
467 #if defined(EUR_CR_POWER)
470 OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_POWER, 1);
471 PDUMPREG(EUR_CR_POWER, 1);
474 OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_POWER, 0);
475 PDUMPREG(EUR_CR_POWER, 0);
479 #if defined(SGX_FEATURE_SYSTEM_CACHE)
481 OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_MNE_CR_CTRL,
482 EUR_CR_MNE_CR_CTRL_BYP_CC_MASK);
483 PDUMPREG(EUR_CR_MNE_CR_CTRL, EUR_CR_MNE_CR_CTRL_BYP_CC_MASK);
486 *psDevInfo->pui32KernelCCBEventKicker = 0;
488 PDUMPMEM(IMG_NULL, psDevInfo->psKernelCCBEventKickerMemInfo, 0,
489 sizeof(*psDevInfo->pui32KernelCCBEventKicker),
490 PDUMP_FLAGS_CONTINUOUS,
491 MAKEUNIQUETAG(psDevInfo->psKernelCCBEventKickerMemInfo));
494 psDevInfo->psSGXHostCtl->sTAHWPBDesc.uiAddr = 0;
495 psDevInfo->psSGXHostCtl->s3DHWPBDesc.uiAddr = 0;
497 PDUMPCOMMENT(" CCB Control - Reset HW PBDesc records");
498 PDUMPMEM(IMG_NULL, psDevInfo->psKernelSGXHostCtlMemInfo,
499 offsetof(PVRSRV_SGX_HOST_CTL, sTAHWPBDesc),
500 sizeof(IMG_DEV_VIRTADDR), PDUMP_FLAGS_CONTINUOUS,
501 MAKEUNIQUETAG(psDevInfo->psKernelSGXHostCtlMemInfo));
502 PDUMPMEM(IMG_NULL, psDevInfo->psKernelSGXHostCtlMemInfo,
503 offsetof(PVRSRV_SGX_HOST_CTL, s3DHWPBDesc),
504 sizeof(IMG_DEV_VIRTADDR), PDUMP_FLAGS_CONTINUOUS,
505 MAKEUNIQUETAG(psDevInfo->psKernelSGXHostCtlMemInfo));
509 SGXRunScript(psDevInfo, psDevInfo->sScripts.asInitCommands,
510 SGX_MAX_INIT_COMMANDS);
511 if (eError != PVRSRV_OK) {
512 PVR_DPF((PVR_DBG_ERROR,
513 "SGXInitialise: SGXRunScript failed (%d)", eError));
514 return (PVRSRV_ERROR_GENERIC);
517 SGXStartTimer(psDevInfo);
519 if (bHardwareRecovery) {
520 PVRSRV_SGX_HOST_CTL *psSGXHostCtl =
521 (PVRSRV_SGX_HOST_CTL *) psDevInfo->psSGXHostCtl;
524 ((volatile IMG_UINT32 *)(&psSGXHostCtl->
525 ui32InterruptClearFlags), 0,
526 PVRSRV_USSE_EDM_INTERRUPT_HWR,
527 MAX_HW_TIME_US / WAIT_TRY_COUNT, 1000) != PVRSRV_OK) {
528 PVR_DPF((PVR_DBG_ERROR,
529 "SGXInitialise: Wait for uKernel HW Recovery failed"));
530 return PVRSRV_ERROR_RETRY;
534 for (ui32ReadOffset = psDevInfo->psKernelCCBCtl->ui32ReadOffset,
535 ui32WriteOffset = psDevInfo->psKernelCCBCtl->ui32WriteOffset;
536 ui32ReadOffset != ui32WriteOffset;
537 ui32ReadOffset = (ui32ReadOffset + 1) & 0xFF) {
538 *psDevInfo->pui32KernelCCBEventKicker =
539 (*psDevInfo->pui32KernelCCBEventKicker + 1) & 0xFF;
540 OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_EVENT_KICK,
541 EUR_CR_EVENT_KICK_NOW_MASK);
547 PVRSRV_ERROR SGXDeinitialise(IMG_HANDLE hDevCookie)
549 PVRSRV_SGXDEV_INFO *psDevInfo = (PVRSRV_SGXDEV_INFO *) hDevCookie;
552 if (psDevInfo->pvRegsBaseKM == IMG_NULL) {
557 SGXRunScript(psDevInfo, psDevInfo->sScripts.asDeinitCommands,
558 SGX_MAX_DEINIT_COMMANDS);
559 if (eError != PVRSRV_OK) {
560 PVR_DPF((PVR_DBG_ERROR,
561 "SGXDeinitialise: SGXRunScript failed (%d)", eError));
562 return (PVRSRV_ERROR_GENERIC);
568 static PVRSRV_ERROR DevInitSGXPart1(IMG_VOID * pvDeviceNode)
570 PVRSRV_SGXDEV_INFO *psDevInfo;
571 IMG_HANDLE hKernelDevMemContext;
572 IMG_DEV_PHYADDR sPDDevPAddr;
574 PVRSRV_DEVICE_NODE *psDeviceNode = (PVRSRV_DEVICE_NODE *) pvDeviceNode;
575 DEVICE_MEMORY_HEAP_INFO *psDeviceMemoryHeap =
576 psDeviceNode->sDevMemoryInfo.psDeviceMemoryHeap;
577 IMG_HANDLE hDevInfoOSMemHandle = (IMG_HANDLE) IMG_NULL;
580 PDUMPCOMMENT("SGX Initialisation Part 1");
582 PDUMPCOMMENT("SGX Core Version Information: %s",
583 SGX_CORE_FRIENDLY_NAME);
585 PDUMPCOMMENT("SGX Core Revision Information: %d", SGX_CORE_REV);
587 PDUMPCOMMENT("SGX Core Revision Information: head rtl");
591 (PVRSRV_OS_PAGEABLE_HEAP | PVRSRV_HAP_MULTI_PROCESS |
592 PVRSRV_HAP_CACHED, sizeof(PVRSRV_SGXDEV_INFO),
593 (IMG_VOID **) & psDevInfo, &hDevInfoOSMemHandle) != PVRSRV_OK) {
594 PVR_DPF((PVR_DBG_ERROR,
595 "DevInitSGXPart1 : Failed to alloc memory for DevInfo"));
596 return (PVRSRV_ERROR_OUT_OF_MEMORY);
598 OSMemSet(psDevInfo, 0, sizeof(PVRSRV_SGXDEV_INFO));
600 psDevInfo->eDeviceType = DEV_DEVICE_TYPE;
601 psDevInfo->eDeviceClass = DEV_DEVICE_CLASS;
603 psDeviceNode->pvDevice = (IMG_PVOID) psDevInfo;
604 psDeviceNode->hDeviceOSMemHandle = hDevInfoOSMemHandle;
606 psDevInfo->pvDeviceMemoryHeap = (IMG_VOID *) psDeviceMemoryHeap;
608 hKernelDevMemContext = BM_CreateContext(psDeviceNode,
612 psDevInfo->sKernelPDDevPAddr = sPDDevPAddr;
614 for (i = 0; i < psDeviceNode->sDevMemoryInfo.ui32HeapCount; i++) {
615 IMG_HANDLE hDevMemHeap;
617 switch (psDeviceMemoryHeap[i].DevMemHeapType) {
618 case DEVICE_MEMORY_HEAP_KERNEL:
619 case DEVICE_MEMORY_HEAP_SHARED:
620 case DEVICE_MEMORY_HEAP_SHARED_EXPORTED:
623 BM_CreateHeap(hKernelDevMemContext,
624 &psDeviceMemoryHeap[i]);
626 psDeviceMemoryHeap[i].hDevMemHeap = hDevMemHeap;
632 eError = MMU_BIFResetPDAlloc(psDevInfo);
633 if (eError != PVRSRV_OK) {
634 PVR_DPF((PVR_DBG_ERROR,
635 "DevInitSGX : Failed to alloc memory for BIF reset"));
636 return PVRSRV_ERROR_GENERIC;
643 PVRSRV_ERROR SGXGetInfoForSrvinitKM(IMG_HANDLE hDevHandle,
644 SGX_BRIDGE_INFO_FOR_SRVINIT *
647 PVRSRV_DEVICE_NODE *psDeviceNode;
648 PVRSRV_SGXDEV_INFO *psDevInfo;
651 PDUMPCOMMENT("SGXGetInfoForSrvinit");
653 psDeviceNode = (PVRSRV_DEVICE_NODE *) hDevHandle;
654 psDevInfo = (PVRSRV_SGXDEV_INFO *) psDeviceNode->pvDevice;
656 psInitInfo->sPDDevPAddr = psDevInfo->sKernelPDDevPAddr;
659 PVRSRVGetDeviceMemHeapsKM(hDevHandle, &psInitInfo->asHeapInfo[0]);
660 if (eError != PVRSRV_OK) {
661 PVR_DPF((PVR_DBG_ERROR,
662 "SGXGetInfoForSrvinit: PVRSRVGetDeviceMemHeapsKM failed (%d)",
664 return PVRSRV_ERROR_GENERIC;
671 PVRSRV_ERROR DevInitSGXPart2KM(PVRSRV_PER_PROCESS_DATA * psPerProc,
672 IMG_HANDLE hDevHandle,
673 SGX_BRIDGE_INIT_INFO * psInitInfo)
675 PVRSRV_DEVICE_NODE *psDeviceNode;
676 PVRSRV_SGXDEV_INFO *psDevInfo;
678 SGX_DEVICE_MAP *psSGXDeviceMap;
679 PVR_POWER_STATE eDefaultPowerState;
681 PDUMPCOMMENT("SGX Initialisation Part 2");
683 psDeviceNode = (PVRSRV_DEVICE_NODE *) hDevHandle;
684 psDevInfo = (PVRSRV_SGXDEV_INFO *) psDeviceNode->pvDevice;
686 eError = InitDevInfo(psPerProc, psDeviceNode, psInitInfo);
687 if (eError != PVRSRV_OK) {
688 PVR_DPF((PVR_DBG_ERROR,
689 "DevInitSGXPart2KM: Failed to load EDM program"));
690 goto failed_init_dev_info;
693 #ifdef SGX_FEATURE_2D_HARDWARE
694 eError = OSCreateResource(&psDevInfo->s2DSlaveportResource);
695 if (eError != PVRSRV_OK) {
696 PVR_DPF((PVR_DBG_ERROR,
697 "DevInitSGXPart2KM: Failed to create resource !"));
698 return PVRSRV_ERROR_INIT_FAILURE;
702 eError = SysGetDeviceMemoryMap(PVRSRV_DEVICE_TYPE_SGX,
703 (IMG_VOID **) & psSGXDeviceMap);
704 if (eError != PVRSRV_OK) {
705 PVR_DPF((PVR_DBG_ERROR,
706 "DevInitSGXPart2KM: Failed to get device memory map!"));
707 return PVRSRV_ERROR_INIT_FAILURE;
710 if (psSGXDeviceMap->pvRegsCpuVBase) {
711 psDevInfo->pvRegsBaseKM = psSGXDeviceMap->pvRegsCpuVBase;
714 psDevInfo->pvRegsBaseKM =
715 OSMapPhysToLin(psSGXDeviceMap->sRegsCpuPBase,
716 psSGXDeviceMap->ui32RegsSize,
717 PVRSRV_HAP_KERNEL_ONLY | PVRSRV_HAP_UNCACHED,
719 if (!psDevInfo->pvRegsBaseKM) {
720 PVR_DPF((PVR_DBG_ERROR,
721 "DevInitSGXPart2KM: Failed to map in regs\n"));
722 return PVRSRV_ERROR_BAD_MAPPING;
725 psDevInfo->ui32RegSize = psSGXDeviceMap->ui32RegsSize;
726 psDevInfo->sRegsPhysBase = psSGXDeviceMap->sRegsSysPBase;
728 #ifdef SGX_FEATURE_2D_HARDWARE
730 if (psSGXDeviceMap->pvSPCpuVBase) {
731 psDevInfo->s2DSlavePortKM.pvData = psSGXDeviceMap->pvSPCpuVBase;
734 psDevInfo->s2DSlavePortKM.pvData =
735 OSMapPhysToLin(psSGXDeviceMap->sSPCpuPBase,
736 psSGXDeviceMap->ui32SPSize,
737 PVRSRV_HAP_KERNEL_ONLY | PVRSRV_HAP_UNCACHED,
740 if (!psDevInfo->s2DSlavePortKM.pvData) {
741 PVR_DPF((PVR_DBG_ERROR,
742 "DevInitSGXPart2KM: Failed to map 2D Slave port region\n"));
743 return PVRSRV_ERROR_BAD_MAPPING;
747 psDevInfo->s2DSlavePortKM.ui32DataRange = psSGXDeviceMap->ui32SPSize;
748 psDevInfo->s2DSlavePortKM.sPhysBase = psSGXDeviceMap->sSPSysPBase;
751 SGXGetTimingInfo(psDevInfo, &psSGXDeviceMap->sTimingInfo);
753 #if defined (SYS_USING_INTERRUPTS)
755 psDeviceNode->pvISRData = psDeviceNode;
757 PVR_ASSERT(psDeviceNode->pfnDeviceISR == SGX_ISRHandler);
761 #if defined(SUPPORT_ACTIVE_POWER_MANAGEMENT)
763 psDevInfo->psSGXHostCtl->ui32PowManFlags |=
764 PVRSRV_USSE_EDM_POWMAN_NO_WORK;
765 eDefaultPowerState = PVRSRV_POWER_STATE_D3;
767 eDefaultPowerState = PVRSRV_POWER_STATE_D0;
769 eError = PVRSRVRegisterPowerDevice(psDeviceNode->sDevId.ui32DeviceIndex,
770 SGXPrePowerState, SGXPostPowerState,
771 SGXPreClockSpeedChange,
772 SGXPostClockSpeedChange,
773 (IMG_HANDLE) psDeviceNode,
774 PVRSRV_POWER_STATE_D3,
776 if (eError != PVRSRV_OK) {
777 PVR_DPF((PVR_DBG_ERROR,
778 "DevInitSGXPart2KM: failed to register device with power manager"));
782 OSMemSet(psDevInfo->psKernelCCB, 0, sizeof(PVRSRV_SGX_KERNEL_CCB));
783 OSMemSet(psDevInfo->psKernelCCBCtl, 0, sizeof(PVRSRV_SGX_CCB_CTL));
784 OSMemSet(psDevInfo->pui32KernelCCBEventKicker, 0,
785 sizeof(*psDevInfo->pui32KernelCCBEventKicker));
786 PDUMPCOMMENT("Kernel CCB");
787 PDUMPMEM(IMG_NULL, psDevInfo->psKernelCCBMemInfo, 0,
788 sizeof(PVRSRV_SGX_KERNEL_CCB), PDUMP_FLAGS_CONTINUOUS,
789 MAKEUNIQUETAG(psDevInfo->psKernelCCBMemInfo));
790 PDUMPCOMMENT("Kernel CCB Control");
791 PDUMPMEM(IMG_NULL, psDevInfo->psKernelCCBCtlMemInfo, 0,
792 sizeof(PVRSRV_SGX_CCB_CTL), PDUMP_FLAGS_CONTINUOUS,
793 MAKEUNIQUETAG(psDevInfo->psKernelCCBCtlMemInfo));
794 PDUMPCOMMENT("Kernel CCB Event Kicker");
795 PDUMPMEM(IMG_NULL, psDevInfo->psKernelCCBEventKickerMemInfo, 0,
796 sizeof(*psDevInfo->pui32KernelCCBEventKicker),
797 PDUMP_FLAGS_CONTINUOUS,
798 MAKEUNIQUETAG(psDevInfo->psKernelCCBEventKickerMemInfo));
800 #if defined(SUPPORT_HW_RECOVERY)
802 psDevInfo->hTimer = OSAddTimer(SGXOSTimer, psDeviceNode,
804 psSGXDeviceMap->sTimingInfo.
806 if (psDevInfo->hTimer == IMG_NULL) {
807 PVR_DPF((PVR_DBG_ERROR,
808 "DevInitSGXPart2KM : Failed to register timer callback function"));
809 return PVRSRV_ERROR_GENERIC;
815 failed_init_dev_info:
819 static PVRSRV_ERROR DevDeInitSGX(IMG_VOID * pvDeviceNode)
821 PVRSRV_DEVICE_NODE *psDeviceNode = (PVRSRV_DEVICE_NODE *) pvDeviceNode;
822 PVRSRV_SGXDEV_INFO *psDevInfo =
823 (PVRSRV_SGXDEV_INFO *) psDeviceNode->pvDevice;
824 IMG_HANDLE hDevInfoOSMemHandle = psDeviceNode->hDeviceOSMemHandle;
825 PVRSRV_ERROR eError = PVRSRV_ERROR_INVALID_PARAMS;
827 DEVICE_MEMORY_HEAP_INFO *psDeviceMemoryHeap;
828 SGX_DEVICE_MAP *psSGXDeviceMap;
832 PVR_DPF((PVR_DBG_ERROR, "DevDeInitSGX: Null DevInfo"));
835 #if defined(SUPPORT_HW_RECOVERY)
836 if (psDevInfo->hTimer) {
837 eError = OSRemoveTimer(psDevInfo->hTimer);
838 if (eError != PVRSRV_OK) {
839 PVR_DPF((PVR_DBG_ERROR,
840 "DevDeInitSGX: Failed to remove timer"));
843 psDevInfo->hTimer = IMG_NULL;
847 MMU_BIFResetPDFree(psDevInfo);
849 DeinitDevInfo(psDevInfo);
851 #if defined(SGX_USING_CMD_PROC_LIST)
853 PVRSRVRemoveCmdProcListKM(psDeviceNode->sDevId.ui32DeviceIndex,
855 if (eError != PVRSRV_OK) {
856 PVR_DPF((PVR_DBG_ERROR,
857 "DevDeInitSGX: PVRSRVRemoveCmdProcList failed"));
863 (DEVICE_MEMORY_HEAP_INFO *) psDevInfo->pvDeviceMemoryHeap;
865 ui32Heap < psDeviceNode->sDevMemoryInfo.ui32HeapCount;
867 switch (psDeviceMemoryHeap[ui32Heap].DevMemHeapType) {
868 case DEVICE_MEMORY_HEAP_KERNEL:
869 case DEVICE_MEMORY_HEAP_SHARED:
870 case DEVICE_MEMORY_HEAP_SHARED_EXPORTED:
872 if (psDeviceMemoryHeap[ui32Heap].hDevMemHeap !=
874 BM_DestroyHeap(psDeviceMemoryHeap
875 [ui32Heap].hDevMemHeap);
883 BM_DestroyContext(psDeviceNode->sDevMemoryInfo.pBMKernelContext,
885 if (eError != PVRSRV_OK) {
886 PVR_DPF((PVR_DBG_ERROR,
887 "DevDeInitSGX : Failed to destroy kernel context"));
892 PVRSRVRemovePowerDevice(((PVRSRV_DEVICE_NODE *) pvDeviceNode)->
893 sDevId.ui32DeviceIndex);
894 if (eError != PVRSRV_OK) {
897 #ifdef SGX_FEATURE_2D_HARDWARE
898 eError = OSDestroyResource(&psDevInfo->s2DSlaveportResource);
899 if (eError != PVRSRV_OK) {
904 eError = SysGetDeviceMemoryMap(PVRSRV_DEVICE_TYPE_SGX,
905 (IMG_VOID **) & psSGXDeviceMap);
906 if (eError != PVRSRV_OK) {
907 PVR_DPF((PVR_DBG_ERROR,
908 "DevDeInitSGX: Failed to get device memory map!"));
912 if (!psSGXDeviceMap->pvRegsCpuVBase) {
914 if (psDevInfo->pvRegsBaseKM != IMG_NULL) {
915 OSUnMapPhysToLin(psDevInfo->pvRegsBaseKM,
916 psDevInfo->ui32RegSize,
917 PVRSRV_HAP_KERNEL_ONLY |
918 PVRSRV_HAP_UNCACHED, IMG_NULL);
921 #ifdef SGX_FEATURE_2D_HARDWARE
923 if (!psSGXDeviceMap->pvSPCpuVBase) {
924 if (psDevInfo->s2DSlavePortKM.pvData != IMG_NULL) {
925 OSUnMapPhysToLin(psDevInfo->s2DSlavePortKM.pvData,
926 psDevInfo->s2DSlavePortKM.
928 PVRSRV_HAP_KERNEL_ONLY |
929 PVRSRV_HAP_UNCACHED, IMG_NULL);
934 OSFreePages(PVRSRV_OS_PAGEABLE_HEAP | PVRSRV_HAP_MULTI_PROCESS,
935 sizeof(PVRSRV_SGXDEV_INFO), psDevInfo, hDevInfoOSMemHandle);
936 psDeviceNode->pvDevice = IMG_NULL;
938 if (psDeviceMemoryHeap != IMG_NULL) {
940 OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP,
941 sizeof(DEVICE_MEMORY_HEAP_INFO) *
942 psDeviceNode->sDevMemoryInfo.ui32HeapCount,
943 psDeviceMemoryHeap, 0);
949 #if defined(SYS_USING_INTERRUPTS) || defined(SUPPORT_HW_RECOVERY)
951 IMG_VOID HWRecoveryResetSGX(PVRSRV_DEVICE_NODE * psDeviceNode,
952 IMG_UINT32 ui32Component, IMG_UINT32 ui32CallerID)
955 PVRSRV_SGXDEV_INFO *psDevInfo =
956 (PVRSRV_SGXDEV_INFO *) psDeviceNode->pvDevice;
957 PVRSRV_SGX_HOST_CTL *psSGXHostCtl =
958 (PVRSRV_SGX_HOST_CTL *) psDevInfo->psSGXHostCtl;
960 PVR_UNREFERENCED_PARAMETER(ui32Component);
962 eError = PVRSRVPowerLock(ui32CallerID, IMG_FALSE);
963 if (eError != PVRSRV_OK) {
965 PVR_DPF((PVR_DBG_WARNING,
966 "HWRecoveryResetSGX: Power transition in progress"));
970 psSGXHostCtl->ui32InterruptClearFlags |= PVRSRV_USSE_EDM_INTERRUPT_HWR;
972 PVR_DPF((PVR_DBG_ERROR,
973 "HWRecoveryResetSGX: SGX Hardware Recovery triggered"));
978 eError = SGXInitialise(psDevInfo, IMG_TRUE);
980 while (eError == PVRSRV_ERROR_RETRY);
981 if (eError != PVRSRV_OK) {
982 PVR_DPF((PVR_DBG_ERROR,
983 "HWRecoveryResetSGX: SGXInitialise failed (%d)",
989 PVRSRVPowerUnlock(ui32CallerID);
991 SGXScheduleProcessQueues(psDeviceNode);
993 PVRSRVProcessQueues(ui32CallerID, IMG_TRUE);
997 #if defined(SUPPORT_HW_RECOVERY)
998 IMG_VOID SGXOSTimer(IMG_VOID * pvData)
1000 PVRSRV_DEVICE_NODE *psDeviceNode = pvData;
1001 PVRSRV_SGXDEV_INFO *psDevInfo = psDeviceNode->pvDevice;
1002 static IMG_UINT32 ui32EDMTasks = 0;
1003 static IMG_UINT32 ui32LockupCounter = 0;
1004 static IMG_UINT32 ui32NumResets = 0;
1005 IMG_UINT32 ui32CurrentEDMTasks;
1006 IMG_BOOL bLockup = IMG_FALSE;
1007 IMG_BOOL bPoweredDown;
1009 psDevInfo->ui32TimeStamp++;
1011 bPoweredDown = (IMG_BOOL) ! SGXIsDevicePowered(psDeviceNode);
1014 ui32LockupCounter = 0;
1017 ui32CurrentEDMTasks =
1018 OSReadHWReg(psDevInfo->pvRegsBaseKM,
1019 psDevInfo->ui32EDMTaskReg0);
1020 if (psDevInfo->ui32EDMTaskReg1 != 0) {
1021 ui32CurrentEDMTasks ^=
1022 OSReadHWReg(psDevInfo->pvRegsBaseKM,
1023 psDevInfo->ui32EDMTaskReg1);
1025 if ((ui32CurrentEDMTasks == ui32EDMTasks) &&
1026 (psDevInfo->ui32NumResets == ui32NumResets)) {
1027 ui32LockupCounter++;
1028 if (ui32LockupCounter == 3) {
1029 ui32LockupCounter = 0;
1030 PVR_DPF((PVR_DBG_ERROR,
1031 "SGXOSTimer() detected SGX lockup (0x%x tasks)",
1037 ui32LockupCounter = 0;
1038 ui32EDMTasks = ui32CurrentEDMTasks;
1039 ui32NumResets = psDevInfo->ui32NumResets;
1044 PVRSRV_SGX_HOST_CTL *psSGXHostCtl =
1045 (PVRSRV_SGX_HOST_CTL *) psDevInfo->psSGXHostCtl;
1047 psSGXHostCtl->ui32HostDetectedLockups++;
1049 HWRecoveryResetSGX(psDeviceNode, 0, KERNEL_ID);
1054 #if defined(SYS_USING_INTERRUPTS)
1056 IMG_BOOL SGX_ISRHandler(IMG_VOID * pvData)
1058 IMG_BOOL bInterruptProcessed = IMG_FALSE;
1061 IMG_UINT32 ui32EventStatus, ui32EventEnable;
1062 IMG_UINT32 ui32EventClear = 0;
1063 PVRSRV_DEVICE_NODE *psDeviceNode;
1064 PVRSRV_SGXDEV_INFO *psDevInfo;
1066 if (pvData == IMG_NULL) {
1067 PVR_DPF((PVR_DBG_ERROR,
1068 "SGX_ISRHandler: Invalid params\n"));
1069 return bInterruptProcessed;
1072 psDeviceNode = (PVRSRV_DEVICE_NODE *) pvData;
1073 psDevInfo = (PVRSRV_SGXDEV_INFO *) psDeviceNode->pvDevice;
1076 OSReadHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_EVENT_STATUS);
1078 OSReadHWReg(psDevInfo->pvRegsBaseKM,
1079 EUR_CR_EVENT_HOST_ENABLE);
1081 gui32EventStatusServicesByISR = ui32EventStatus;
1083 ui32EventStatus &= ui32EventEnable;
1085 if (ui32EventStatus & EUR_CR_EVENT_STATUS_SW_EVENT_MASK) {
1086 ui32EventClear |= EUR_CR_EVENT_HOST_CLEAR_SW_EVENT_MASK;
1089 if (ui32EventClear) {
1090 bInterruptProcessed = IMG_TRUE;
1093 EUR_CR_EVENT_HOST_CLEAR_MASTER_INTERRUPT_MASK;
1095 OSWriteHWReg(psDevInfo->pvRegsBaseKM,
1096 EUR_CR_EVENT_HOST_CLEAR, ui32EventClear);
1097 //Read back to flush posted write to fix spurious IRQ
1098 OSReadHWReg(psDevInfo->pvRegsBaseKM,
1099 EUR_CR_EVENT_HOST_CLEAR);
1103 return bInterruptProcessed;
1106 IMG_VOID SGX_MISRHandler(IMG_VOID * pvData)
1108 PVRSRV_DEVICE_NODE *psDeviceNode = (PVRSRV_DEVICE_NODE *) pvData;
1109 PVRSRV_SGXDEV_INFO *psDevInfo =
1110 (PVRSRV_SGXDEV_INFO *) psDeviceNode->pvDevice;
1111 PVRSRV_SGX_HOST_CTL *psSGXHostCtl =
1112 (PVRSRV_SGX_HOST_CTL *) psDevInfo->psSGXHostCtl;
1114 if ((psSGXHostCtl->ui32InterruptFlags & PVRSRV_USSE_EDM_INTERRUPT_HWR)
1116 ui32InterruptClearFlags & PVRSRV_USSE_EDM_INTERRUPT_HWR)) {
1117 HWRecoveryResetSGX(psDeviceNode, 0, ISR_ID);
1119 #if defined(SUPPORT_ACTIVE_POWER_MANAGEMENT)
1120 SGXTestActivePowerEvent(psDeviceNode, ISR_ID);
1125 PVRSRV_ERROR SGXRegisterDevice(PVRSRV_DEVICE_NODE * psDeviceNode)
1127 DEVICE_MEMORY_INFO *psDevMemoryInfo;
1128 DEVICE_MEMORY_HEAP_INFO *psDeviceMemoryHeap;
1130 psDeviceNode->sDevId.eDeviceType = DEV_DEVICE_TYPE;
1131 psDeviceNode->sDevId.eDeviceClass = DEV_DEVICE_CLASS;
1133 psDeviceNode->pfnInitDevice = DevInitSGXPart1;
1134 psDeviceNode->pfnDeInitDevice = DevDeInitSGX;
1136 psDeviceNode->pfnMMUInitialise = MMU_Initialise;
1137 psDeviceNode->pfnMMUFinalise = MMU_Finalise;
1138 psDeviceNode->pfnMMUInsertHeap = MMU_InsertHeap;
1139 psDeviceNode->pfnMMUCreate = MMU_Create;
1140 psDeviceNode->pfnMMUDelete = MMU_Delete;
1141 psDeviceNode->pfnMMUAlloc = MMU_Alloc;
1142 psDeviceNode->pfnMMUFree = MMU_Free;
1143 psDeviceNode->pfnMMUMapPages = MMU_MapPages;
1144 psDeviceNode->pfnMMUMapShadow = MMU_MapShadow;
1145 psDeviceNode->pfnMMUUnmapPages = MMU_UnmapPages;
1146 psDeviceNode->pfnMMUMapScatter = MMU_MapScatter;
1147 psDeviceNode->pfnMMUGetPhysPageAddr = MMU_GetPhysPageAddr;
1148 psDeviceNode->pfnMMUGetPDDevPAddr = MMU_GetPDDevPAddr;
1150 #if defined (SYS_USING_INTERRUPTS)
1152 psDeviceNode->pfnDeviceISR = SGX_ISRHandler;
1153 psDeviceNode->pfnDeviceMISR = SGX_MISRHandler;
1156 psDeviceNode->pfnDeviceCommandComplete = SGXCommandComplete;
1158 psDevMemoryInfo = &psDeviceNode->sDevMemoryInfo;
1160 psDevMemoryInfo->ui32AddressSpaceSizeLog2 = SGX_ADDRESS_SPACE_SIZE;
1162 psDevMemoryInfo->ui32Flags = 0;
1164 psDevMemoryInfo->ui32HeapCount = SGX_MAX_HEAP_ID;
1166 psDevMemoryInfo->ui32SyncHeapID = SGX_SYNCINFO_HEAP_ID;
1168 psDevMemoryInfo->ui32MappingHeapID = SGX_GENERAL_MAPPING_HEAP_ID;
1170 if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
1171 sizeof(DEVICE_MEMORY_HEAP_INFO) *
1172 psDevMemoryInfo->ui32HeapCount,
1173 (IMG_VOID **) & psDevMemoryInfo->psDeviceMemoryHeap,
1175 PVR_DPF((PVR_DBG_ERROR,
1176 "SGXRegisterDevice : Failed to alloc memory for DEVICE_MEMORY_HEAP_INFO"));
1177 return (PVRSRV_ERROR_OUT_OF_MEMORY);
1179 OSMemSet(psDevMemoryInfo->psDeviceMemoryHeap, 0,
1180 sizeof(DEVICE_MEMORY_HEAP_INFO) *
1181 psDevMemoryInfo->ui32HeapCount);
1183 psDeviceMemoryHeap = psDevMemoryInfo->psDeviceMemoryHeap;
1185 psDeviceMemoryHeap[SGX_GENERAL_HEAP_ID].ui32HeapID =
1186 HEAP_ID(PVRSRV_DEVICE_TYPE_SGX, SGX_GENERAL_HEAP_ID);
1187 psDeviceMemoryHeap[SGX_GENERAL_HEAP_ID].sDevVAddrBase.uiAddr =
1188 SGX_GENERAL_HEAP_BASE;
1189 psDeviceMemoryHeap[SGX_GENERAL_HEAP_ID].ui32HeapSize =
1190 SGX_GENERAL_HEAP_SIZE;
1191 psDeviceMemoryHeap[SGX_GENERAL_HEAP_ID].ui32Attribs =
1192 PVRSRV_HAP_WRITECOMBINE | PVRSRV_MEM_RAM_BACKED_ALLOCATION |
1193 PVRSRV_HAP_SINGLE_PROCESS;
1194 psDeviceMemoryHeap[SGX_GENERAL_HEAP_ID].pszName = "General";
1195 psDeviceMemoryHeap[SGX_GENERAL_HEAP_ID].pszBSName = "General BS";
1196 psDeviceMemoryHeap[SGX_GENERAL_HEAP_ID].DevMemHeapType =
1197 DEVICE_MEMORY_HEAP_PERCONTEXT;
1199 psDeviceMemoryHeap[SGX_TADATA_HEAP_ID].ui32HeapID =
1200 HEAP_ID(PVRSRV_DEVICE_TYPE_SGX, SGX_TADATA_HEAP_ID);
1201 psDeviceMemoryHeap[SGX_TADATA_HEAP_ID].sDevVAddrBase.uiAddr =
1202 SGX_TADATA_HEAP_BASE;
1203 psDeviceMemoryHeap[SGX_TADATA_HEAP_ID].ui32HeapSize =
1204 SGX_TADATA_HEAP_SIZE;
1205 psDeviceMemoryHeap[SGX_TADATA_HEAP_ID].ui32Attribs =
1206 PVRSRV_HAP_WRITECOMBINE | PVRSRV_MEM_RAM_BACKED_ALLOCATION
1208 | PVRSRV_HAP_KERNEL_ONLY;
1210 | PVRSRV_HAP_MULTI_PROCESS;
1212 psDeviceMemoryHeap[SGX_TADATA_HEAP_ID].pszName = "TA Data";
1213 psDeviceMemoryHeap[SGX_TADATA_HEAP_ID].pszBSName = "TA Data BS";
1214 psDeviceMemoryHeap[SGX_TADATA_HEAP_ID].DevMemHeapType =
1215 DEVICE_MEMORY_HEAP_PERCONTEXT;
1217 psDeviceMemoryHeap[SGX_KERNEL_CODE_HEAP_ID].ui32HeapID =
1218 HEAP_ID(PVRSRV_DEVICE_TYPE_SGX, SGX_KERNEL_CODE_HEAP_ID);
1219 psDeviceMemoryHeap[SGX_KERNEL_CODE_HEAP_ID].sDevVAddrBase.uiAddr =
1220 SGX_KERNEL_CODE_HEAP_BASE;
1221 psDeviceMemoryHeap[SGX_KERNEL_CODE_HEAP_ID].ui32HeapSize =
1222 SGX_KERNEL_CODE_HEAP_SIZE;
1223 psDeviceMemoryHeap[SGX_KERNEL_CODE_HEAP_ID].ui32Attribs =
1224 PVRSRV_HAP_WRITECOMBINE | PVRSRV_MEM_RAM_BACKED_ALLOCATION
1226 | PVRSRV_HAP_KERNEL_ONLY;
1228 | PVRSRV_HAP_MULTI_PROCESS;
1230 psDeviceMemoryHeap[SGX_KERNEL_CODE_HEAP_ID].pszName = "Kernel";
1231 psDeviceMemoryHeap[SGX_KERNEL_CODE_HEAP_ID].pszBSName = "Kernel BS";
1232 psDeviceMemoryHeap[SGX_KERNEL_CODE_HEAP_ID].DevMemHeapType =
1233 DEVICE_MEMORY_HEAP_SHARED_EXPORTED;
1235 psDeviceMemoryHeap[SGX_VIDEO_CODE_HEAP_ID].ui32HeapID =
1236 HEAP_ID(PVRSRV_DEVICE_TYPE_SGX, SGX_VIDEO_CODE_HEAP_ID);
1237 psDeviceMemoryHeap[SGX_VIDEO_CODE_HEAP_ID].sDevVAddrBase.uiAddr =
1238 SGX_VIDEO_CODE_HEAP_BASE;
1239 psDeviceMemoryHeap[SGX_VIDEO_CODE_HEAP_ID].ui32HeapSize =
1240 SGX_VIDEO_CODE_HEAP_SIZE;
1241 psDeviceMemoryHeap[SGX_VIDEO_CODE_HEAP_ID].ui32Attribs =
1242 PVRSRV_HAP_WRITECOMBINE | PVRSRV_MEM_RAM_BACKED_ALLOCATION |
1243 PVRSRV_HAP_KERNEL_ONLY;
1244 psDeviceMemoryHeap[SGX_VIDEO_CODE_HEAP_ID].pszName = "Video";
1245 psDeviceMemoryHeap[SGX_VIDEO_CODE_HEAP_ID].pszBSName = "Video BS";
1246 psDeviceMemoryHeap[SGX_VIDEO_CODE_HEAP_ID].DevMemHeapType =
1247 DEVICE_MEMORY_HEAP_SHARED;
1249 psDeviceMemoryHeap[SGX_KERNEL_VIDEO_DATA_HEAP_ID].ui32HeapID =
1250 HEAP_ID(PVRSRV_DEVICE_TYPE_SGX, SGX_KERNEL_VIDEO_DATA_HEAP_ID);
1251 psDeviceMemoryHeap[SGX_KERNEL_VIDEO_DATA_HEAP_ID].sDevVAddrBase.uiAddr =
1252 SGX_KERNEL_VIDEO_DATA_HEAP_BASE;
1253 psDeviceMemoryHeap[SGX_KERNEL_VIDEO_DATA_HEAP_ID].ui32HeapSize =
1254 SGX_KERNEL_VIDEO_DATA_HEAP_SIZE;
1255 psDeviceMemoryHeap[SGX_KERNEL_VIDEO_DATA_HEAP_ID].ui32Attribs =
1256 PVRSRV_HAP_WRITECOMBINE | PVRSRV_MEM_RAM_BACKED_ALLOCATION |
1258 PVRSRV_HAP_KERNEL_ONLY;
1260 PVRSRV_HAP_MULTI_PROCESS;
1262 psDeviceMemoryHeap[SGX_KERNEL_VIDEO_DATA_HEAP_ID].pszName =
1264 psDeviceMemoryHeap[SGX_KERNEL_VIDEO_DATA_HEAP_ID].pszBSName =
1265 "KernelVideoData BS";
1266 psDeviceMemoryHeap[SGX_KERNEL_VIDEO_DATA_HEAP_ID].DevMemHeapType =
1267 DEVICE_MEMORY_HEAP_SHARED_EXPORTED;
1269 psDeviceMemoryHeap[SGX_PIXELSHADER_HEAP_ID].ui32HeapID =
1270 HEAP_ID(PVRSRV_DEVICE_TYPE_SGX, SGX_PIXELSHADER_HEAP_ID);
1271 psDeviceMemoryHeap[SGX_PIXELSHADER_HEAP_ID].sDevVAddrBase.uiAddr =
1272 SGX_PIXELSHADER_HEAP_BASE;
1273 psDeviceMemoryHeap[SGX_PIXELSHADER_HEAP_ID].ui32HeapSize =
1274 SGX_PIXELSHADER_HEAP_SIZE;
1275 psDeviceMemoryHeap[SGX_PIXELSHADER_HEAP_ID].ui32Attribs =
1276 PVRSRV_HAP_WRITECOMBINE | PVRSRV_MEM_RAM_BACKED_ALLOCATION |
1277 PVRSRV_HAP_SINGLE_PROCESS;
1278 psDeviceMemoryHeap[SGX_PIXELSHADER_HEAP_ID].pszName = "PixelShaderUSSE";
1279 psDeviceMemoryHeap[SGX_PIXELSHADER_HEAP_ID].pszBSName =
1280 "PixelShaderUSSE BS";
1281 psDeviceMemoryHeap[SGX_PIXELSHADER_HEAP_ID].DevMemHeapType =
1282 DEVICE_MEMORY_HEAP_PERCONTEXT;
1284 psDeviceMemoryHeap[SGX_VERTEXSHADER_HEAP_ID].ui32HeapID =
1285 HEAP_ID(PVRSRV_DEVICE_TYPE_SGX, SGX_VERTEXSHADER_HEAP_ID);
1286 psDeviceMemoryHeap[SGX_VERTEXSHADER_HEAP_ID].sDevVAddrBase.uiAddr =
1287 SGX_VERTEXSHADER_HEAP_BASE;
1288 psDeviceMemoryHeap[SGX_VERTEXSHADER_HEAP_ID].ui32HeapSize =
1289 SGX_VERTEXSHADER_HEAP_SIZE;
1290 psDeviceMemoryHeap[SGX_VERTEXSHADER_HEAP_ID].ui32Attribs =
1291 PVRSRV_HAP_WRITECOMBINE | PVRSRV_MEM_RAM_BACKED_ALLOCATION |
1292 PVRSRV_HAP_SINGLE_PROCESS;
1293 psDeviceMemoryHeap[SGX_VERTEXSHADER_HEAP_ID].pszName =
1295 psDeviceMemoryHeap[SGX_VERTEXSHADER_HEAP_ID].pszBSName =
1296 "VertexShaderUSSE BS";
1297 psDeviceMemoryHeap[SGX_VERTEXSHADER_HEAP_ID].DevMemHeapType =
1298 DEVICE_MEMORY_HEAP_PERCONTEXT;
1300 psDeviceMemoryHeap[SGX_PDSPIXEL_CODEDATA_HEAP_ID].ui32HeapID =
1301 HEAP_ID(PVRSRV_DEVICE_TYPE_SGX, SGX_PDSPIXEL_CODEDATA_HEAP_ID);
1302 psDeviceMemoryHeap[SGX_PDSPIXEL_CODEDATA_HEAP_ID].sDevVAddrBase.uiAddr =
1303 SGX_PDSPIXEL_CODEDATA_HEAP_BASE;
1304 psDeviceMemoryHeap[SGX_PDSPIXEL_CODEDATA_HEAP_ID].ui32HeapSize =
1305 SGX_PDSPIXEL_CODEDATA_HEAP_SIZE;
1306 psDeviceMemoryHeap[SGX_PDSPIXEL_CODEDATA_HEAP_ID].ui32Attribs =
1307 PVRSRV_HAP_WRITECOMBINE | PVRSRV_MEM_RAM_BACKED_ALLOCATION |
1308 PVRSRV_HAP_SINGLE_PROCESS;
1309 psDeviceMemoryHeap[SGX_PDSPIXEL_CODEDATA_HEAP_ID].pszName =
1311 psDeviceMemoryHeap[SGX_PDSPIXEL_CODEDATA_HEAP_ID].pszBSName =
1312 "PDSPixelCodeData BS";
1313 psDeviceMemoryHeap[SGX_PDSPIXEL_CODEDATA_HEAP_ID].DevMemHeapType =
1314 DEVICE_MEMORY_HEAP_PERCONTEXT;
1316 psDeviceMemoryHeap[SGX_PDSVERTEX_CODEDATA_HEAP_ID].ui32HeapID =
1317 HEAP_ID(PVRSRV_DEVICE_TYPE_SGX, SGX_PDSVERTEX_CODEDATA_HEAP_ID);
1318 psDeviceMemoryHeap[SGX_PDSVERTEX_CODEDATA_HEAP_ID].sDevVAddrBase.
1319 uiAddr = SGX_PDSVERTEX_CODEDATA_HEAP_BASE;
1320 psDeviceMemoryHeap[SGX_PDSVERTEX_CODEDATA_HEAP_ID].ui32HeapSize =
1321 SGX_PDSVERTEX_CODEDATA_HEAP_SIZE;
1322 psDeviceMemoryHeap[SGX_PDSVERTEX_CODEDATA_HEAP_ID].ui32Attribs =
1323 PVRSRV_HAP_WRITECOMBINE | PVRSRV_MEM_RAM_BACKED_ALLOCATION |
1324 PVRSRV_HAP_SINGLE_PROCESS;
1325 psDeviceMemoryHeap[SGX_PDSVERTEX_CODEDATA_HEAP_ID].pszName =
1326 "PDSVertexCodeData";
1327 psDeviceMemoryHeap[SGX_PDSVERTEX_CODEDATA_HEAP_ID].pszBSName =
1328 "PDSVertexCodeData BS";
1329 psDeviceMemoryHeap[SGX_PDSVERTEX_CODEDATA_HEAP_ID].DevMemHeapType =
1330 DEVICE_MEMORY_HEAP_PERCONTEXT;
1332 psDeviceMemoryHeap[SGX_SYNCINFO_HEAP_ID].ui32HeapID =
1333 HEAP_ID(PVRSRV_DEVICE_TYPE_SGX, SGX_SYNCINFO_HEAP_ID);
1334 psDeviceMemoryHeap[SGX_SYNCINFO_HEAP_ID].sDevVAddrBase.uiAddr =
1335 SGX_SYNCINFO_HEAP_BASE;
1336 psDeviceMemoryHeap[SGX_SYNCINFO_HEAP_ID].ui32HeapSize =
1337 SGX_SYNCINFO_HEAP_SIZE;
1339 psDeviceMemoryHeap[SGX_SYNCINFO_HEAP_ID].ui32Attribs =
1340 PVRSRV_HAP_WRITECOMBINE | PVRSRV_MEM_RAM_BACKED_ALLOCATION |
1341 PVRSRV_HAP_MULTI_PROCESS;
1342 psDeviceMemoryHeap[SGX_SYNCINFO_HEAP_ID].pszName = "CacheCoherent";
1343 psDeviceMemoryHeap[SGX_SYNCINFO_HEAP_ID].pszBSName = "CacheCoherent BS";
1345 psDeviceMemoryHeap[SGX_SYNCINFO_HEAP_ID].DevMemHeapType =
1346 DEVICE_MEMORY_HEAP_SHARED_EXPORTED;
1348 psDeviceMemoryHeap[SGX_3DPARAMETERS_HEAP_ID].ui32HeapID =
1349 HEAP_ID(PVRSRV_DEVICE_TYPE_SGX, SGX_3DPARAMETERS_HEAP_ID);
1350 psDeviceMemoryHeap[SGX_3DPARAMETERS_HEAP_ID].sDevVAddrBase.uiAddr =
1351 SGX_3DPARAMETERS_HEAP_BASE;
1352 psDeviceMemoryHeap[SGX_3DPARAMETERS_HEAP_ID].ui32HeapSize =
1353 SGX_3DPARAMETERS_HEAP_SIZE;
1354 psDeviceMemoryHeap[SGX_3DPARAMETERS_HEAP_ID].pszName = "3DParameters";
1355 psDeviceMemoryHeap[SGX_3DPARAMETERS_HEAP_ID].pszBSName =
1357 #if defined(SUPPORT_PERCONTEXT_PB)
1358 psDeviceMemoryHeap[SGX_3DPARAMETERS_HEAP_ID].ui32Attribs =
1359 PVRSRV_HAP_WRITECOMBINE | PVRSRV_MEM_RAM_BACKED_ALLOCATION |
1360 PVRSRV_HAP_SINGLE_PROCESS;
1361 psDeviceMemoryHeap[SGX_3DPARAMETERS_HEAP_ID].DevMemHeapType =
1362 DEVICE_MEMORY_HEAP_PERCONTEXT;
1364 psDeviceMemoryHeap[SGX_3DPARAMETERS_HEAP_ID].ui32Attribs =
1365 PVRSRV_HAP_WRITECOMBINE | PVRSRV_MEM_RAM_BACKED_ALLOCATION |
1366 PVRSRV_HAP_MULTI_PROCESS;
1367 psDeviceMemoryHeap[SGX_3DPARAMETERS_HEAP_ID].DevMemHeapType =
1368 DEVICE_MEMORY_HEAP_SHARED_EXPORTED;
1371 psDeviceMemoryHeap[SGX_GENERAL_MAPPING_HEAP_ID].ui32HeapID =
1372 HEAP_ID(PVRSRV_DEVICE_TYPE_SGX, SGX_GENERAL_MAPPING_HEAP_ID);
1373 psDeviceMemoryHeap[SGX_GENERAL_MAPPING_HEAP_ID].sDevVAddrBase.uiAddr =
1374 SGX_GENERAL_MAPPING_HEAP_BASE;
1375 psDeviceMemoryHeap[SGX_GENERAL_MAPPING_HEAP_ID].ui32HeapSize =
1376 SGX_GENERAL_MAPPING_HEAP_SIZE;
1377 psDeviceMemoryHeap[SGX_GENERAL_MAPPING_HEAP_ID].ui32Attribs =
1378 PVRSRV_HAP_WRITECOMBINE | PVRSRV_HAP_MULTI_PROCESS;
1379 psDeviceMemoryHeap[SGX_GENERAL_MAPPING_HEAP_ID].pszName =
1381 psDeviceMemoryHeap[SGX_GENERAL_MAPPING_HEAP_ID].pszBSName =
1382 "GeneralMapping BS";
1384 psDeviceMemoryHeap[SGX_GENERAL_MAPPING_HEAP_ID].DevMemHeapType =
1385 DEVICE_MEMORY_HEAP_SHARED_EXPORTED;
1387 #if defined(SGX_FEATURE_2D_HARDWARE)
1389 psDeviceMemoryHeap[SGX_2D_HEAP_ID].ui32HeapID =
1390 HEAP_ID(PVRSRV_DEVICE_TYPE_SGX, SGX_2D_HEAP_ID);
1391 psDeviceMemoryHeap[SGX_2D_HEAP_ID].sDevVAddrBase.uiAddr =
1393 psDeviceMemoryHeap[SGX_2D_HEAP_ID].ui32HeapSize = SGX_2D_HEAP_SIZE;
1394 psDeviceMemoryHeap[SGX_2D_HEAP_ID].ui32Attribs = PVRSRV_HAP_WRITECOMBINE
1395 | PVRSRV_MEM_RAM_BACKED_ALLOCATION | PVRSRV_HAP_SINGLE_PROCESS;
1396 psDeviceMemoryHeap[SGX_2D_HEAP_ID].pszName = "2D";
1397 psDeviceMemoryHeap[SGX_2D_HEAP_ID].pszBSName = "2D BS";
1399 psDeviceMemoryHeap[SGX_2D_HEAP_ID].DevMemHeapType =
1400 DEVICE_MEMORY_HEAP_SHARED_EXPORTED;
1407 PVRSRV_ERROR SGXGetClientInfoKM(IMG_HANDLE hDevCookie,
1408 PVR3DIF4_CLIENT_INFO * psClientInfo)
1410 PVRSRV_SGXDEV_INFO *psDevInfo =
1411 (PVRSRV_SGXDEV_INFO *) ((PVRSRV_DEVICE_NODE *) hDevCookie)->
1414 psDevInfo->ui32ClientRefCount++;
1416 if (psDevInfo->ui32ClientRefCount == 1) {
1417 psDevInfo->psKernelCCBInfo->ui32CCBDumpWOff = 0;
1421 psClientInfo->ui32ProcessID = OSGetCurrentProcessIDKM();
1423 OSMemCopy(&psClientInfo->asDevData, &psDevInfo->asSGXDevData,
1424 sizeof(psClientInfo->asDevData));
1430 PVRSRV_ERROR SGXGetMiscInfoKM(PVRSRV_SGXDEV_INFO * psDevInfo,
1431 SGX_MISC_INFO * psMiscInfo)
1433 switch (psMiscInfo->eRequest) {
1434 case SGX_MISC_INFO_REQUEST_CLOCKSPEED:
1436 psMiscInfo->uData.ui32SGXClockSpeed =
1437 psDevInfo->ui32CoreClockSpeed;
1440 #ifdef SUPPORT_SGX_HWPERF
1441 case SGX_MISC_INFO_REQUEST_HWPERF_CB_ON:
1443 psDevInfo->psSGXHostCtl->ui32HWPerfFlags |=
1444 PVRSRV_SGX_HWPERF_ON;
1447 case SGX_MISC_INFO_REQUEST_HWPERF_CB_OFF:
1449 psDevInfo->psSGXHostCtl->ui32HWPerfFlags &=
1450 ~PVRSRV_SGX_HWPERF_ON;
1453 case SGX_MISC_INFO_REQUEST_HWPERF_RETRIEVE_CB:
1455 SGX_MISC_INFO_HWPERF_RETRIEVE_CB *psRetrieve =
1456 &psMiscInfo->uData.sRetrieveCB;
1457 PVRSRV_SGX_HWPERF_CB *psHWPerfCB =
1458 (PVRSRV_SGX_HWPERF_CB *) psDevInfo->
1459 psKernelHWPerfCBMemInfo->pvLinAddrKM;
1463 psHWPerfCB->ui32Woff != psHWPerfCB->ui32Roff
1464 && i < psRetrieve->ui32ArraySize; i++) {
1465 PVRSRV_SGX_HWPERF_CBDATA *psData =
1466 &psHWPerfCB->psHWPerfCBData[psHWPerfCB->
1468 OSMemCopy(&psRetrieve->psHWPerfData[i], psData,
1469 sizeof(PVRSRV_SGX_HWPERF_CBDATA));
1470 psRetrieve->psHWPerfData[i].ui32ClockSpeed =
1471 psDevInfo->ui32CoreClockSpeed;
1472 psRetrieve->psHWPerfData[i].ui32TimeMax =
1473 psDevInfo->ui32uKernelTimerClock;
1474 psHWPerfCB->ui32Roff =
1475 (psHWPerfCB->ui32Roff +
1476 1) & (PVRSRV_SGX_HWPERF_CBSIZE - 1);
1478 psRetrieve->ui32DataCount = i;
1479 psRetrieve->ui32Time = OSClockus();
1486 return PVRSRV_ERROR_INVALID_PARAMS;
1491 #if defined(SUPPORT_SGX_HWPERF)
1493 PVRSRV_ERROR SGXReadDiffCountersKM(IMG_HANDLE hDevHandle,
1495 IMG_UINT32 * pui32Old,
1498 IMG_UINT32 ui32NewReset,
1499 IMG_UINT32 ui32CountersReg,
1500 IMG_UINT32 * pui32Time,
1501 IMG_BOOL * pbActive,
1502 PVRSRV_SGXDEV_DIFF_INFO * psDiffs)
1504 PVRSRV_ERROR eError;
1505 SYS_DATA *psSysData;
1506 PVRSRV_POWER_DEV *psPowerDevice;
1507 IMG_BOOL bPowered = IMG_FALSE;
1508 PVRSRV_DEVICE_NODE *psDeviceNode = hDevHandle;
1509 PVRSRV_SGXDEV_INFO *psDevInfo = psDeviceNode->pvDevice;
1512 psDevInfo->ui32HWGroupRequested = ui32New;
1514 psDevInfo->ui32HWReset |= ui32NewReset;
1516 eError = PVRSRVPowerLock(KERNEL_ID, IMG_FALSE);
1517 if (eError != PVRSRV_OK) {
1521 SysAcquireData(&psSysData);
1523 psPowerDevice = psSysData->psPowerDeviceList;
1524 while (psPowerDevice) {
1525 if (psPowerDevice->ui32DeviceIndex ==
1526 psDeviceNode->sDevId.ui32DeviceIndex) {
1528 (IMG_BOOL) (psPowerDevice->eCurrentPowerState ==
1529 PVRSRV_POWER_STATE_D0);
1533 psPowerDevice = psPowerDevice->psNext;
1536 *pbActive = bPowered;
1539 PVRSRV_SGXDEV_DIFF_INFO sNew, *psPrev = &psDevInfo->sDiffInfo;
1542 sNew.ui32Time[0] = OSClockus();
1544 *pui32Time = sNew.ui32Time[0];
1546 if (sNew.ui32Time[0] != psPrev->ui32Time[0] && bPowered) {
1549 OSReadHWReg(psDevInfo->pvRegsBaseKM, ui32Reg);
1551 for (i = 0; i < PVRSRV_SGX_DIFF_NUM_COUNTERS; ++i) {
1552 sNew.aui32Counters[i] =
1553 OSReadHWReg(psDevInfo->pvRegsBaseKM,
1554 ui32CountersReg + (i * 4));
1557 if (psDevInfo->ui32HWGroupRequested != *pui32Old) {
1559 if (psDevInfo->ui32HWReset != 0) {
1560 OSWriteHWReg(psDevInfo->pvRegsBaseKM,
1563 ui32HWGroupRequested |
1564 psDevInfo->ui32HWReset);
1565 psDevInfo->ui32HWReset = 0;
1568 OSWriteHWReg(psDevInfo->pvRegsBaseKM, ui32Reg,
1569 psDevInfo->ui32HWGroupRequested);
1572 sNew.ui32Marker[0] = psDevInfo->ui32KickTACounter;
1573 sNew.ui32Marker[1] = psDevInfo->ui32KickTARenderCounter;
1576 psDevInfo->psSGXHostCtl->ui32TimeWraps;
1578 for (i = 0; i < PVRSRV_SGX_DIFF_NUM_COUNTERS; ++i) {
1579 psDiffs->aui32Counters[i] =
1580 sNew.aui32Counters[i] -
1581 psPrev->aui32Counters[i];
1584 psDiffs->ui32Marker[0] =
1585 sNew.ui32Marker[0] - psPrev->ui32Marker[0];
1586 psDiffs->ui32Marker[1] =
1587 sNew.ui32Marker[1] - psPrev->ui32Marker[1];
1589 psDiffs->ui32Time[0] =
1590 sNew.ui32Time[0] - psPrev->ui32Time[0];
1591 psDiffs->ui32Time[1] =
1592 sNew.ui32Time[1] - psPrev->ui32Time[1];
1597 for (i = 0; i < PVRSRV_SGX_DIFF_NUM_COUNTERS; ++i) {
1598 psDiffs->aui32Counters[i] = 0;
1601 psDiffs->ui32Marker[0] = 0;
1602 psDiffs->ui32Marker[1] = 0;
1604 psDiffs->ui32Time[0] = 0;
1605 psDiffs->ui32Time[1] = 0;
1609 PVRSRVPowerUnlock(KERNEL_ID);
1611 #if defined(SUPPORT_ACTIVE_POWER_MANAGEMENT)
1612 SGXTestActivePowerEvent(psDeviceNode, KERNEL_ID);