1 /****************************************************************************
3 * Copyright (C) 2005 - 2011 by Vivante Corp.
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the license, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 *****************************************************************************/
25 #include "gc_hal_kernel.h"
27 #define _GC_OBJ_ZONE gcvZONE_HARDWARE
29 /******************************************************************************\
30 ********************************* Support Code *********************************
31 \******************************************************************************/
42 OUT gceCHIPMODEL
* ChipModel
,
43 OUT gctUINT32_PTR ChipRevision
,
44 OUT gctUINT32_PTR ChipFeatures
,
45 OUT gctUINT32_PTR ChipMinorFeatures0
,
46 OUT gctUINT32_PTR ChipMinorFeatures1
,
47 OUT gctUINT32_PTR ChipMinorFeatures2
,
48 OUT gctUINT32_PTR ChipMinorFeatures3
52 gctUINT32 chipIdentity
;
53 gctUINT32 chipDate
= 0xCCDDCCDD;
54 gctUINT32 chipTime
= 0xCCDDCCDD;
56 gcmkHEADER_ARG("Os=0x%x", Os
);
58 /* Read chip identity register. */
60 gckOS_ReadRegisterEx(Os
, Core
, 0x00018, &chipIdentity
));
62 /* Special case for older graphic cores. */
63 if (((((gctUINT32
) (chipIdentity
)) >> (0 ? 31:24) & ((gctUINT32
) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1)))))) == (0x01 & ((gctUINT32
) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))))
66 *ChipRevision
= (((((gctUINT32
) (chipIdentity
)) >> (0 ? 15:12)) & ((gctUINT32
) ((((1 ? 15:12) - (0 ? 15:12) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:12) - (0 ? 15:12) + 1)))))) );
71 /* Read date and time registers. */
73 gckOS_ReadRegisterEx(Os
, Core
, 0x00028, &chipDate
));
76 gckOS_ReadRegisterEx(Os
, Core
, 0x0002C, &chipTime
));
78 /* Read chip identity register. */
80 gckOS_ReadRegisterEx(Os
,
83 (gctUINT32_PTR
) ChipModel
));
85 /* !!!! HACK ALERT !!!! */
86 /* Because people change device IDs without letting software know
87 ** about it - here is the hack to make it all look the same. Only
88 ** for GC400 family. Next time - TELL ME!!! */
89 if ((*ChipModel
& 0xFF00) == 0x0400)
94 /* Read CHIP_REV register. */
96 gckOS_ReadRegisterEx(Os
, Core
, 0x00024, ChipRevision
));
98 if ((*ChipModel
== gcv300
)
99 && (*ChipRevision
== 0x2201)
102 if ((chipDate
== 0x20080814) && (chipTime
== 0x12051100))
104 /* This IP has an ECO; put the correct revision in it. */
105 *ChipRevision
= 0x1051;
110 /* Read chip feature register. */
112 gckOS_ReadRegisterEx(Os
, Core
, 0x0001C, ChipFeatures
));
114 #ifndef VIVANTE_NO_3D
115 /* Disable fast clear on GC700. */
116 if (*ChipModel
== gcv700
)
118 *ChipFeatures
= ((((gctUINT32
) (*ChipFeatures
)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0))) | (((gctUINT32
) ((gctUINT32
) (0) & ((gctUINT32
) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0)));
122 if (((*ChipModel
== gcv500
) && (*ChipRevision
< 2))
123 || ((*ChipModel
== gcv300
) && (*ChipRevision
< 0x2000))
126 /* GC500 rev 1.x and GC300 rev < 2.0 doesn't have these registers. */
127 *ChipMinorFeatures0
= 0;
128 *ChipMinorFeatures1
= 0;
129 *ChipMinorFeatures2
= 0;
130 *ChipMinorFeatures3
= 0;
134 /* Read chip minor feature register #0. */
136 gckOS_ReadRegisterEx(Os
,
139 ChipMinorFeatures0
));
141 if (((((gctUINT32
) (*ChipMinorFeatures0
)) >> (0 ? 21:21) & ((gctUINT32
) ((((1 ? 21:21) - (0 ? 21:21) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 21:21) - (0 ? 21:21) + 1)))))) == (0x1 & ((gctUINT32
) ((((1 ? 21:21) - (0 ? 21:21) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 21:21) - (0 ? 21:21) + 1)))))))
144 /* Read chip minor featuress register #1. */
146 gckOS_ReadRegisterEx(Os
,
149 ChipMinorFeatures1
));
151 /* Disabling texture hAlignment until it's fully tested. */
152 *ChipMinorFeatures1
= *ChipMinorFeatures1
& ~(1 << 20);
154 /* Read chip minor featuress register #2. */
156 gckOS_ReadRegisterEx(Os
,
159 ChipMinorFeatures2
));
161 /* Read chip minor featuress register #1. */
163 gckOS_ReadRegisterEx(Os
,
166 ChipMinorFeatures3
));
170 /* Chip doesn't has minor features register #1 or 2 or 3. */
171 *ChipMinorFeatures1
= 0;
172 *ChipMinorFeatures2
= 0;
173 *ChipMinorFeatures3
= 0;
177 /* Disable HIERARCHICAL_Z. */
178 *ChipMinorFeatures0
= ((((gctUINT32
) (*ChipMinorFeatures0
)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 27:27) - (0 ? 27:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:27) - (0 ? 27:27) + 1))))))) << (0 ? 27:27))) | (((gctUINT32
) ((gctUINT32
) (0) & ((gctUINT32
) ((((1 ? 27:27) - (0 ? 27:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:27) - (0 ? 27:27) + 1))))))) << (0 ? 27:27)));
181 gcmkFOOTER_ARG("*ChipModel=%x *ChipRevision=%x *ChipFeatures=0x%08x "
182 "*ChipMinorFeatures0=0x%08X *ChipMinorFeatures1=0x%08x "
183 "*ChipMinorFeatures2=0x%08x *ChipMinorFeatures3=0x%08x",
184 *ChipModel
, *ChipRevision
, *ChipFeatures
,
185 *ChipMinorFeatures0
, *ChipMinorFeatures1
,
186 *ChipMinorFeatures2
, *ChipMinorFeatures3
);
190 /* Return the status. */
197 IN gckHARDWARE Hardware
200 gctUINT32 streamCount
= 0;
201 gctUINT32 registerMax
= 0;
202 gctUINT32 threadCount
= 0;
203 gctUINT32 shaderCoreCount
= 0;
204 gctUINT32 vertexCacheSize
= 0;
205 gctUINT32 vertexOutputBufferSize
= 0;
206 gctUINT32 pixelPipes
= 0;
207 gctUINT32 instructionCount
= 0;
208 gctUINT32 numConstants
= 0;
209 gctUINT32 bufferSize
= 0;
212 gcmkHEADER_ARG("Hardware=0x%x", Hardware
);
214 if (((((gctUINT32
) (Hardware
->chipMinorFeatures0
)) >> (0 ? 21:21) & ((gctUINT32
) ((((1 ? 21:21) - (0 ? 21:21) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 21:21) - (0 ? 21:21) + 1)))))) == (0x1 & ((gctUINT32
) ((((1 ? 21:21) - (0 ? 21:21) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 21:21) - (0 ? 21:21) + 1))))))))
216 gctUINT32 specs
, specs2
;
218 /* Read gcChipSpecs register. */
220 gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x00048, &specs
));
222 /* Handy macro to improve reading. */
223 #define gcmSPEC_FIELD(field) \
224 (((((gctUINT32) (specs)) >> (0 ? GC_CHIP_SPECS_field)) & ((gctUINT32) ((((1 ? GC_CHIP_SPECS_field) - (0 ? GC_CHIP_SPECS_field) + 1) == 32) ? ~0 : (~(~0 << ((1 ? GC_CHIP_SPECS_field) - (0 ? GC_CHIP_SPECS_field) + 1)))))) )
226 /* Extract the fields. */
227 streamCount
= (((((gctUINT32
) (specs
)) >> (0 ? 3:0)) & ((gctUINT32
) ((((1 ? 3:0) - (0 ? 3:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 3:0) - (0 ? 3:0) + 1)))))) );
228 registerMax
= (((((gctUINT32
) (specs
)) >> (0 ? 7:4)) & ((gctUINT32
) ((((1 ? 7:4) - (0 ? 7:4) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 7:4) - (0 ? 7:4) + 1)))))) );
229 threadCount
= (((((gctUINT32
) (specs
)) >> (0 ? 11:8)) & ((gctUINT32
) ((((1 ? 11:8) - (0 ? 11:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 11:8) - (0 ? 11:8) + 1)))))) );
230 shaderCoreCount
= (((((gctUINT32
) (specs
)) >> (0 ? 24:20)) & ((gctUINT32
) ((((1 ? 24:20) - (0 ? 24:20) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 24:20) - (0 ? 24:20) + 1)))))) );
231 vertexCacheSize
= (((((gctUINT32
) (specs
)) >> (0 ? 16:12)) & ((gctUINT32
) ((((1 ? 16:12) - (0 ? 16:12) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 16:12) - (0 ? 16:12) + 1)))))) );
232 vertexOutputBufferSize
= (((((gctUINT32
) (specs
)) >> (0 ? 31:28)) & ((gctUINT32
) ((((1 ? 31:28) - (0 ? 31:28) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:28) - (0 ? 31:28) + 1)))))) );
233 pixelPipes
= (((((gctUINT32
) (specs
)) >> (0 ? 27:25)) & ((gctUINT32
) ((((1 ? 27:25) - (0 ? 27:25) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:25) - (0 ? 27:25) + 1)))))) );
235 /* Read gcChipSpecs2 register. */
237 gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x00080, &specs2
));
239 /* Handy macro to improve reading. */
240 #define gcmSPEC2_FIELD(field) \
241 (((((gctUINT32) (specs2)) >> (0 ? GC_CHIP_SPECS2_field)) & ((gctUINT32) ((((1 ? GC_CHIP_SPECS2_field) - (0 ? GC_CHIP_SPECS2_field) + 1) == 32) ? ~0 : (~(~0 << ((1 ? GC_CHIP_SPECS2_field) - (0 ? GC_CHIP_SPECS2_field) + 1)))))) )
243 instructionCount
= (((((gctUINT32
) (specs2
)) >> (0 ? 15:8)) & ((gctUINT32
) ((((1 ? 15:8) - (0 ? 15:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:8) - (0 ? 15:8) + 1)))))) );
244 numConstants
= (((((gctUINT32
) (specs2
)) >> (0 ? 31:16)) & ((gctUINT32
) ((((1 ? 31:16) - (0 ? 31:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:16) - (0 ? 31:16) + 1)))))) );
245 bufferSize
= (((((gctUINT32
) (specs2
)) >> (0 ? 7:0)) & ((gctUINT32
) ((((1 ? 7:0) - (0 ? 7:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 7:0) - (0 ? 7:0) + 1)))))) );
248 /* Get the number of pixel pipes. */
249 Hardware
->pixelPipes
= gcmMAX(pixelPipes
, 1);
251 /* Get the stream count. */
252 Hardware
->streamCount
= (streamCount
!= 0)
254 : (Hardware
->chipModel
>= gcv1000
) ? 4 : 1;
256 gcmkTRACE_ZONE(gcvLEVEL_INFO
, gcvZONE_HARDWARE
,
257 "Specs: streamCount=%u%s",
258 Hardware
->streamCount
,
259 (streamCount
== 0) ? " (default)" : "");
261 /* Get the vertex output buffer size. */
262 Hardware
->vertexOutputBufferSize
= (vertexOutputBufferSize
!= 0)
263 ? 1 << vertexOutputBufferSize
264 : (Hardware
->chipModel
== gcv400
)
265 ? (Hardware
->chipRevision
< 0x4000) ? 512
266 : (Hardware
->chipRevision
< 0x4200) ? 256
268 : (Hardware
->chipModel
== gcv530
)
269 ? (Hardware
->chipRevision
< 0x4200) ? 512
273 gcmkTRACE_ZONE(gcvLEVEL_INFO
, gcvZONE_HARDWARE
,
274 "Specs: vertexOutputBufferSize=%u%s",
275 Hardware
->vertexOutputBufferSize
,
276 (vertexOutputBufferSize
== 0) ? " (default)" : "");
278 /* Get the maximum number of threads. */
279 Hardware
->threadCount
= (threadCount
!= 0)
281 : (Hardware
->chipModel
== gcv400
) ? 64
282 : (Hardware
->chipModel
== gcv500
) ? 128
283 : (Hardware
->chipModel
== gcv530
) ? 128
286 gcmkTRACE_ZONE(gcvLEVEL_INFO
, gcvZONE_HARDWARE
,
287 "Specs: threadCount=%u%s",
288 Hardware
->threadCount
,
289 (threadCount
== 0) ? " (default)" : "");
291 /* Get the number of shader cores. */
292 Hardware
->shaderCoreCount
= (shaderCoreCount
!= 0)
294 : (Hardware
->chipModel
>= gcv1000
) ? 2
296 gcmkTRACE_ZONE(gcvLEVEL_INFO
, gcvZONE_HARDWARE
,
297 "Specs: shaderCoreCount=%u%s",
298 Hardware
->shaderCoreCount
,
299 (shaderCoreCount
== 0) ? " (default)" : "");
301 /* Get the vertex cache size. */
302 Hardware
->vertexCacheSize
= (vertexCacheSize
!= 0)
305 gcmkTRACE_ZONE(gcvLEVEL_INFO
, gcvZONE_HARDWARE
,
306 "Specs: vertexCacheSize=%u%s",
307 Hardware
->vertexCacheSize
,
308 (vertexCacheSize
== 0) ? " (default)" : "");
310 /* Get the maximum number of temporary registers. */
311 Hardware
->registerMax
= (registerMax
!= 0)
312 /* Maximum of registerMax/4 registers are accessible to 1 shader */
314 : (Hardware
->chipModel
== gcv400
) ? 32
316 gcmkTRACE_ZONE(gcvLEVEL_INFO
, gcvZONE_HARDWARE
,
317 "Specs: registerMax=%u%s",
318 Hardware
->registerMax
,
319 (registerMax
== 0) ? " (default)" : "");
321 /* Get the instruction count. */
322 Hardware
->instructionCount
= (instructionCount
== 0) ? 256
323 : (instructionCount
== 1) ? 1024
324 : (instructionCount
== 2) ? 2048
327 gcmkTRACE_ZONE(gcvLEVEL_INFO
, gcvZONE_HARDWARE
,
328 "Specs: instructionCount=%u%s",
329 Hardware
->instructionCount
,
330 (instructionCount
== 0) ? " (default)" : "");
332 /* Get the number of constants. */
333 Hardware
->numConstants
= numConstants
;
335 gcmkTRACE_ZONE(gcvLEVEL_INFO
, gcvZONE_HARDWARE
,
336 "Specs: numConstants=%u%s",
337 Hardware
->numConstants
,
338 (numConstants
== 0) ? " (default)" : "");
340 /* Get the buffer size. */
341 Hardware
->bufferSize
= bufferSize
;
343 gcmkTRACE_ZONE(gcvLEVEL_INFO
, gcvZONE_HARDWARE
,
344 "Specs: bufferSize=%u%s",
345 Hardware
->bufferSize
,
346 (bufferSize
== 0) ? " (default)" : "");
353 /* Return the status. */
358 /******************************************************************************\
359 ****************************** gckHARDWARE API code *****************************
360 \******************************************************************************/
362 /*******************************************************************************
364 ** gckHARDWARE_Construct
366 ** Construct a new gckHARDWARE object.
371 ** Pointer to an initialized gckOS object.
378 ** gckHARDWARE * Hardware
379 ** Pointer to a variable that will hold the pointer to the gckHARDWARE
383 gckHARDWARE_Construct(
386 OUT gckHARDWARE
* Hardware
389 gckHARDWARE hardware
= gcvNULL
;
391 gceCHIPMODEL chipModel
= gcv300
;
392 gctUINT32 chipRevision
= 0;
393 gctUINT32 chipFeatures
= 0;
394 gctUINT32 chipMinorFeatures0
= 0;
395 gctUINT32 chipMinorFeatures1
= 0;
396 gctUINT32 chipMinorFeatures2
= 0;
397 gctUINT32 chipMinorFeatures3
= 0;
398 gctUINT16 data
= 0xff00;
399 gctPOINTER pointer
= gcvNULL
;
401 gcmkHEADER_ARG("Os=0x%x", Os
);
403 /* Verify the arguments. */
404 gcmkVERIFY_OBJECT(Os
, gcvOBJ_OS
);
405 gcmkVERIFY_ARGUMENT(Hardware
!= gcvNULL
);
407 /* Enable the GPU. */
408 gcmkONERROR(gckOS_SetGPUPower(Os
, gcvTRUE
, gcvTRUE
));
409 gcmkONERROR(gckOS_WriteRegisterEx(Os
, Core
, 0x00000, 0));
411 status
= _ResetGPU(Os
, Core
);
413 if (status
!= gcvSTATUS_OK
)
415 gcmkTRACE_ZONE(gcvLEVEL_INFO
, gcvZONE_HARDWARE
,
416 "_ResetGPU failed: status=%d\n", status
);
419 /* Identify the hardware. */
420 gcmkONERROR(_IdentifyHardware(Os
,
428 &chipMinorFeatures3
));
430 /* Allocate the gckHARDWARE object. */
431 gcmkONERROR(gckOS_Allocate(Os
,
432 gcmSIZEOF(struct _gckHARDWARE
),
437 /* Initialize the gckHARDWARE object. */
438 hardware
->object
.type
= gcvOBJ_HARDWARE
;
441 hardware
->core
= Core
;
443 /* Determine the hardware type */
448 hardware
->type
= gcvHARDWARE_VG
;
453 hardware
->type
= gcvHARDWARE_2D
;
457 hardware
->type
= gcvHARDWARE_3D
;
459 if ((((((gctUINT32
) (chipFeatures
)) >> (0 ? 9:9)) & ((gctUINT32
) ((((1 ? 9:9) - (0 ? 9:9) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 9:9) - (0 ? 9:9) + 1)))))) ))
461 hardware
->type
|= gcvHARDWARE_2D
;
465 /* Set chip identity. */
466 hardware
->chipModel
= chipModel
;
467 hardware
->chipRevision
= chipRevision
;
468 hardware
->chipFeatures
= chipFeatures
;
469 hardware
->chipMinorFeatures0
= chipMinorFeatures0
;
470 hardware
->chipMinorFeatures1
= chipMinorFeatures1
;
471 hardware
->chipMinorFeatures2
= chipMinorFeatures2
;
472 hardware
->chipMinorFeatures3
= chipMinorFeatures3
;
473 hardware
->powerBaseAddress
= ((chipModel
== gcv300
)
474 && (chipRevision
< 0x2000)
476 hardware
->powerMutex
= gcvNULL
;
478 hardware
->mmuVersion
=
479 (((((gctUINT32
) (hardware
->chipMinorFeatures1
)) >> (0 ? 28:28)) & ((gctUINT32
) ((((1 ? 28:28) - (0 ? 28:28) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 28:28) - (0 ? 28:28) + 1)))))) );
481 /* Get chip specs. */
482 gcmkONERROR(_GetChipSpecs(hardware
));
484 /* Determine whether bug fixes #1 are present. */
485 hardware
->extraEventStates
= ((((gctUINT32
) (chipMinorFeatures1
)) >> (0 ? 3:3) & ((gctUINT32
) ((((1 ? 3:3) - (0 ? 3:3) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 3:3) - (0 ? 3:3) + 1)))))) == (0x0 & ((gctUINT32
) ((((1 ? 3:3) - (0 ? 3:3) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 3:3) - (0 ? 3:3) + 1)))))));
487 /* Check if big endian */
488 hardware
->bigEndian
= (*(gctUINT8
*)&data
== 0xff);
490 /* Initialize the fast clear. */
491 gcmkONERROR(gckHARDWARE_SetFastClear(hardware
, -1, -1));
493 #if !gcdENABLE_128B_MERGE && 1 && 1
495 if (((((gctUINT32
) (hardware
->chipMinorFeatures2
)) >> (0 ? 21:21) & ((gctUINT32
) ((((1 ? 21:21) - (0 ? 21:21) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 21:21) - (0 ? 21:21) + 1)))))) == (0x1 & ((gctUINT32
) ((((1 ? 21:21) - (0 ? 21:21) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 21:21) - (0 ? 21:21) + 1))))))))
497 /* 128B merge is turned on by default. Disable it. */
498 gcmkONERROR(gckOS_WriteRegisterEx(Os
, Core
, 0x00558, 0));
503 /* Set power state to ON. */
504 hardware
->chipPowerState
= gcvPOWER_ON
;
505 hardware
->clockState
= gcvTRUE
;
506 hardware
->powerState
= gcvTRUE
;
507 hardware
->lastWaitLink
= ~0U;
508 hardware
->globalSemaphore
= gcvNULL
;
510 gcmkONERROR(gckOS_CreateMutex(Os
, &hardware
->powerMutex
));
511 gcmkONERROR(gckOS_CreateSemaphore(Os
, &hardware
->globalSemaphore
));
513 #if gcdPOWEROFF_TIMEOUT
514 gcmkONERROR(gckOS_CreateMutex(Os
, &hardware
->powerOffSema
));
515 gcmkONERROR(gckOS_AcquireMutex(Os
, hardware
->powerOffSema
, gcvINFINITE
));
518 /* Return pointer to the gckHARDWARE object. */
519 *Hardware
= hardware
;
522 gcmkFOOTER_ARG("*Hardware=0x%x", *Hardware
);
527 if (hardware
!= gcvNULL
)
529 /* Turn off the power. */
530 gcmkVERIFY_OK(gckOS_SetGPUPower(Os
, gcvFALSE
, gcvFALSE
));
532 if (hardware
->globalSemaphore
!= gcvNULL
)
534 /* Destroy the global semaphore. */
535 gcmkVERIFY_OK(gckOS_DestroySemaphore(Os
,
536 hardware
->globalSemaphore
));
539 if (hardware
->powerMutex
!= gcvNULL
)
541 /* Destroy the power mutex. */
542 gcmkVERIFY_OK(gckOS_DeleteMutex(Os
, hardware
->powerMutex
));
545 #if gcdPOWEROFF_TIMEOUT
546 if (hardware
->powerOffSema
!= gcvNULL
)
548 gcmkVERIFY_OK(gckOS_DeleteMutex(Os
, &hardware
->powerOffSema
));
552 gcmkVERIFY_OK(gcmkOS_SAFE_FREE(Os
, hardware
));
555 /* Return the status. */
560 /*******************************************************************************
562 ** gckHARDWARE_Destroy
564 ** Destroy an gckHARDWARE object.
568 ** gckHARDWARE Hardware
569 ** Pointer to the gckHARDWARE object that needs to be destroyed.
577 IN gckHARDWARE Hardware
582 gcmkHEADER_ARG("Hardware=0x%x", Hardware
);
584 /* Verify the arguments. */
585 gcmkVERIFY_OBJECT(Hardware
, gcvOBJ_HARDWARE
);
587 /* Turn off the power. */
588 gcmkVERIFY_OK(gckOS_SetGPUPower(Hardware
->os
, gcvFALSE
, gcvFALSE
));
590 /* Destroy the power semaphore. */
591 gcmkVERIFY_OK(gckOS_DestroySemaphore(Hardware
->os
,
592 Hardware
->globalSemaphore
));
594 /* Destroy the power mutex. */
595 gcmkVERIFY_OK(gckOS_DeleteMutex(Hardware
->os
, Hardware
->powerMutex
));
597 #if gcdPOWEROFF_TIMEOUT
598 gcmkVERIFY_OK(gckOS_DeleteMutex(Hardware
->os
, Hardware
->powerOffSema
));
601 /* Mark the object as unknown. */
602 Hardware
->object
.type
= gcvOBJ_UNKNOWN
;
604 /* Free the object. */
605 gcmkONERROR(gcmkOS_SAFE_FREE(Hardware
->os
, Hardware
));
616 /*******************************************************************************
618 ** gckHARDWARE_GetType
620 ** Get the hardware type.
624 ** gckHARDWARE Harwdare
625 ** Pointer to an gckHARDWARE object.
629 ** gceHARDWARE_TYPE * Type
630 ** Pointer to a variable that receives the type of hardware object.
634 IN gckHARDWARE Hardware
,
635 OUT gceHARDWARE_TYPE
* Type
638 gcmkHEADER_ARG("Hardware=0x%x", Hardware
);
639 gcmkVERIFY_ARGUMENT(Type
!= gcvNULL
);
641 *Type
= Hardware
->type
;
646 /*******************************************************************************
648 ** gckHARDWARE_InitializeHardware
650 ** Initialize the hardware.
654 ** gckHARDWARE Hardware
655 ** Pointer to the gckHARDWARE object.
662 gckHARDWARE_InitializeHardware(
663 IN gckHARDWARE Hardware
667 gctUINT32 baseAddress
;
670 gcmkHEADER_ARG("Hardware=0x%x", Hardware
);
672 /* Verify the arguments. */
673 gcmkVERIFY_OBJECT(Hardware
, gcvOBJ_HARDWARE
);
675 /* Read the chip revision register. */
676 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
,
681 if (chipRev
!= Hardware
->chipRevision
)
683 /* Chip is not there! */
684 gcmkONERROR(gcvSTATUS_CONTEXT_LOSSED
);
687 /* Disable isolate GPU bit. */
688 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
,
691 ((((gctUINT32
) (0x00000100)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 19:19) - (0 ? 19:19) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 19:19) - (0 ? 19:19) + 1))))))) << (0 ? 19:19))) | (((gctUINT32
) ((gctUINT32
) (0) & ((gctUINT32
) ((((1 ? 19:19) - (0 ? 19:19) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 19:19) - (0 ? 19:19) + 1))))))) << (0 ? 19:19)))));
693 /* Reset memory counters. */
694 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
,
699 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
,
704 /* Get the system's physical base address. */
705 gcmkONERROR(gckOS_GetBaseAddress(Hardware
->os
, &baseAddress
));
707 /* Program the base addesses. */
708 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
,
713 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
,
718 #ifndef VIVANTE_NO_3D
719 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
,
724 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
,
729 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
,
735 #if !VIVANTE_PROFILER && 1
739 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
,
741 Hardware
->powerBaseAddress
+
745 /* Enable clock gating. */
746 data
= ((((gctUINT32
) (data
)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0))) | (((gctUINT32
) ((gctUINT32
) (1) & ((gctUINT32
) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0)));
748 if ((Hardware
->chipRevision
== 0x4301)
749 || (Hardware
->chipRevision
== 0x4302)
752 /* Disable stall module level clock gating for 4.3.0.1 and 4.3.0.2
754 data
= ((((gctUINT32
) (data
)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 1:1) - (0 ? 1:1) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 1:1) - (0 ? 1:1) + 1))))))) << (0 ? 1:1))) | (((gctUINT32
) ((gctUINT32
) (1) & ((gctUINT32
) ((((1 ? 1:1) - (0 ? 1:1) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 1:1) - (0 ? 1:1) + 1))))))) << (0 ? 1:1)));
757 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
,
759 Hardware
->powerBaseAddress
763 #ifndef VIVANTE_NO_3D
764 /* Disable PE clock gating on revs < 5.0 when HZ is present without a
766 if ((Hardware
->chipRevision
< 0x5000)
767 && ((((gctUINT32
) (Hardware
->chipMinorFeatures1
)) >> (0 ? 9:9) & ((gctUINT32
) ((((1 ? 9:9) - (0 ? 9:9) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 9:9) - (0 ? 9:9) + 1)))))) == (0x0 & ((gctUINT32
) ((((1 ? 9:9) - (0 ? 9:9) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 9:9) - (0 ? 9:9) + 1)))))))
768 && ((((gctUINT32
) (Hardware
->chipMinorFeatures0
)) >> (0 ? 27:27) & ((gctUINT32
) ((((1 ? 27:27) - (0 ? 27:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:27) - (0 ? 27:27) + 1)))))) == (0x1 & ((gctUINT32
) ((((1 ? 27:27) - (0 ? 27:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:27) - (0 ? 27:27) + 1)))))))
772 gckOS_ReadRegisterEx(Hardware
->os
,
774 Hardware
->powerBaseAddress
778 /* Disable PE clock gating. */
779 data
= ((((gctUINT32
) (data
)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 2:2) - (0 ? 2:2) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 2:2) - (0 ? 2:2) + 1))))))) << (0 ? 2:2))) | (((gctUINT32
) ((gctUINT32
) (1) & ((gctUINT32
) ((((1 ? 2:2) - (0 ? 2:2) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 2:2) - (0 ? 2:2) + 1))))))) << (0 ? 2:2)));
782 gckOS_WriteRegisterEx(Hardware
->os
,
784 Hardware
->powerBaseAddress
792 /* Test if MMU is initialized. */
793 if ((Hardware
->kernel
!= gcvNULL
)
794 && (Hardware
->kernel
->mmu
!= gcvNULL
)
799 gckHARDWARE_SetMMU(Hardware
,
800 Hardware
->kernel
->mmu
->pageTableLogical
));
808 /* Return the error. */
813 /*******************************************************************************
815 ** gckHARDWARE_QueryMemory
817 ** Query the amount of memory available on the hardware.
821 ** gckHARDWARE Hardware
822 ** Pointer to the gckHARDWARE object.
826 ** gctSIZE_T * InternalSize
827 ** Pointer to a variable that will hold the size of the internal video
828 ** memory in bytes. If 'InternalSize' is gcvNULL, no information of the
829 ** internal memory will be returned.
831 ** gctUINT32 * InternalBaseAddress
832 ** Pointer to a variable that will hold the hardware's base address for
833 ** the internal video memory. This pointer cannot be gcvNULL if
834 ** 'InternalSize' is also non-gcvNULL.
836 ** gctUINT32 * InternalAlignment
837 ** Pointer to a variable that will hold the hardware's base address for
838 ** the internal video memory. This pointer cannot be gcvNULL if
839 ** 'InternalSize' is also non-gcvNULL.
841 ** gctSIZE_T * ExternalSize
842 ** Pointer to a variable that will hold the size of the external video
843 ** memory in bytes. If 'ExternalSize' is gcvNULL, no information of the
844 ** external memory will be returned.
846 ** gctUINT32 * ExternalBaseAddress
847 ** Pointer to a variable that will hold the hardware's base address for
848 ** the external video memory. This pointer cannot be gcvNULL if
849 ** 'ExternalSize' is also non-gcvNULL.
851 ** gctUINT32 * ExternalAlignment
852 ** Pointer to a variable that will hold the hardware's base address for
853 ** the external video memory. This pointer cannot be gcvNULL if
854 ** 'ExternalSize' is also non-gcvNULL.
856 ** gctUINT32 * HorizontalTileSize
857 ** Number of horizontal pixels per tile. If 'HorizontalTileSize' is
858 ** gcvNULL, no horizontal pixel per tile will be returned.
860 ** gctUINT32 * VerticalTileSize
861 ** Number of vertical pixels per tile. If 'VerticalTileSize' is
862 ** gcvNULL, no vertical pixel per tile will be returned.
865 gckHARDWARE_QueryMemory(
866 IN gckHARDWARE Hardware
,
867 OUT gctSIZE_T
* InternalSize
,
868 OUT gctUINT32
* InternalBaseAddress
,
869 OUT gctUINT32
* InternalAlignment
,
870 OUT gctSIZE_T
* ExternalSize
,
871 OUT gctUINT32
* ExternalBaseAddress
,
872 OUT gctUINT32
* ExternalAlignment
,
873 OUT gctUINT32
* HorizontalTileSize
,
874 OUT gctUINT32
* VerticalTileSize
877 gcmkHEADER_ARG("Hardware=0x%x", Hardware
);
879 /* Verify the arguments. */
880 gcmkVERIFY_OBJECT(Hardware
, gcvOBJ_HARDWARE
);
882 if (InternalSize
!= gcvNULL
)
884 /* No internal memory. */
888 if (ExternalSize
!= gcvNULL
)
890 /* No external memory. */
894 if (HorizontalTileSize
!= gcvNULL
)
897 *HorizontalTileSize
= 4;
900 if (VerticalTileSize
!= gcvNULL
)
903 *VerticalTileSize
= 4;
907 gcmkFOOTER_ARG("*InternalSize=%lu *InternalBaseAddress=0x%08x "
908 "*InternalAlignment=0x%08x *ExternalSize=%lu "
909 "*ExternalBaseAddress=0x%08x *ExtenalAlignment=0x%08x "
910 "*HorizontalTileSize=%u *VerticalTileSize=%u",
911 gcmOPT_VALUE(InternalSize
),
912 gcmOPT_VALUE(InternalBaseAddress
),
913 gcmOPT_VALUE(InternalAlignment
),
914 gcmOPT_VALUE(ExternalSize
),
915 gcmOPT_VALUE(ExternalBaseAddress
),
916 gcmOPT_VALUE(ExternalAlignment
),
917 gcmOPT_VALUE(HorizontalTileSize
),
918 gcmOPT_VALUE(VerticalTileSize
));
922 /*******************************************************************************
924 ** gckHARDWARE_QueryChipIdentity
926 ** Query the identity of the hardware.
930 ** gckHARDWARE Hardware
931 ** Pointer to the gckHARDWARE object.
935 ** gceCHIPMODEL * ChipModel
936 ** If 'ChipModel' is not gcvNULL, the variable it points to will
937 ** receive the model of the chip.
939 ** gctUINT32 * ChipRevision
940 ** If 'ChipRevision' is not gcvNULL, the variable it points to will
941 ** receive the revision of the chip.
943 ** gctUINT32 * ChipFeatures
944 ** If 'ChipFeatures' is not gcvNULL, the variable it points to will
945 ** receive the feature set of the chip.
947 ** gctUINT32 * ChipMinorFeatures
948 ** If 'ChipMinorFeatures' is not gcvNULL, the variable it points to
949 ** will receive the minor feature set of the chip.
951 ** gctUINT32 * ChipMinorFeatures1
952 ** If 'ChipMinorFeatures1' is not gcvNULL, the variable it points to
953 ** will receive the minor feature set 1 of the chip.
955 ** gctUINT32 * ChipMinorFeatures2
956 ** If 'ChipMinorFeatures2' is not gcvNULL, the variable it points to
957 ** will receive the minor feature set 2 of the chip.
961 gckHARDWARE_QueryChipIdentity(
962 IN gckHARDWARE Hardware
,
963 OUT gceCHIPMODEL
* ChipModel
,
964 OUT gctUINT32
* ChipRevision
,
965 OUT gctUINT32
* ChipFeatures
,
966 OUT gctUINT32
* ChipMinorFeatures
,
967 OUT gctUINT32
* ChipMinorFeatures1
,
968 OUT gctUINT32
* ChipMinorFeatures2
,
969 OUT gctUINT32
* ChipMinorFeatures3
972 gcmkHEADER_ARG("Hardware=0x%x", Hardware
);
974 /* Verify the arguments. */
975 gcmkVERIFY_OBJECT(Hardware
, gcvOBJ_HARDWARE
);
977 /* Return chip model. */
978 if (ChipModel
!= gcvNULL
)
980 *ChipModel
= Hardware
->chipModel
;
983 /* Return revision number. */
984 if (ChipRevision
!= gcvNULL
)
986 *ChipRevision
= Hardware
->chipRevision
;
989 /* Return feature set. */
990 if (ChipFeatures
!= gcvNULL
)
992 gctUINT32 features
= Hardware
->chipFeatures
;
994 if ((((((gctUINT32
) (features
)) >> (0 ? 0:0)) & ((gctUINT32
) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 0:0) - (0 ? 0:0) + 1)))))) ))
996 /* Override fast clear by command line. */
997 features
= ((((gctUINT32
) (features
)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0))) | (((gctUINT32
) ((gctUINT32
) (Hardware
->allowFastClear
) & ((gctUINT32
) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0)));
1000 if ((((((gctUINT32
) (features
)) >> (0 ? 5:5)) & ((gctUINT32
) ((((1 ? 5:5) - (0 ? 5:5) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 5:5) - (0 ? 5:5) + 1)))))) ))
1002 /* Override compression by command line. */
1003 features
= ((((gctUINT32
) (features
)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 5:5) - (0 ? 5:5) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 5:5) - (0 ? 5:5) + 1))))))) << (0 ? 5:5))) | (((gctUINT32
) ((gctUINT32
) (Hardware
->allowCompression
) & ((gctUINT32
) ((((1 ? 5:5) - (0 ? 5:5) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 5:5) - (0 ? 5:5) + 1))))))) << (0 ? 5:5)));
1006 /* Mark 2D pipe as available for GC500.0 through GC500.2 and GC300,
1007 ** since they did not have this bit. */
1008 if (((Hardware
->chipModel
== gcv500
)
1009 && (Hardware
->chipRevision
<= 2)
1011 || (Hardware
->chipModel
== gcv300
)
1014 features
= ((((gctUINT32
) (features
)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 9:9) - (0 ? 9:9) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 9:9) - (0 ? 9:9) + 1))))))) << (0 ? 9:9))) | (((gctUINT32
) (0x1 & ((gctUINT32
) ((((1 ? 9:9) - (0 ? 9:9) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 9:9) - (0 ? 9:9) + 1))))))) << (0 ? 9:9)));
1017 *ChipFeatures
= features
;
1020 /* Return minor feature set. */
1021 if (ChipMinorFeatures
!= gcvNULL
)
1023 *ChipMinorFeatures
= Hardware
->chipMinorFeatures0
;
1026 /* Return minor feature set 1. */
1027 if (ChipMinorFeatures1
!= gcvNULL
)
1029 *ChipMinorFeatures1
= Hardware
->chipMinorFeatures1
;
1032 /* Return minor feature set 2. */
1033 if (ChipMinorFeatures2
!= gcvNULL
)
1035 *ChipMinorFeatures2
= Hardware
->chipMinorFeatures2
;
1038 /* Return minor feature set 3. */
1039 if (ChipMinorFeatures3
!= gcvNULL
)
1041 *ChipMinorFeatures3
= Hardware
->chipMinorFeatures3
;
1045 gcmkFOOTER_ARG("*ChipModel=0x%x *ChipRevision=0x%x *ChipFeatures=0x%08x "
1046 "*ChipMinorFeatures=0x%08x *ChipMinorFeatures1=0x%08x "
1047 "*ChipMinorFeatures2=0x%08x *ChipMinorFeatures3=0x%08x",
1048 gcmOPT_VALUE(ChipModel
),
1049 gcmOPT_VALUE(ChipRevision
),
1050 gcmOPT_VALUE(ChipFeatures
),
1051 gcmOPT_VALUE(ChipMinorFeatures
),
1052 gcmOPT_VALUE(ChipMinorFeatures1
),
1053 gcmOPT_VALUE(ChipMinorFeatures2
),
1054 gcmOPT_VALUE(ChipMinorFeatures3
));
1056 return gcvSTATUS_OK
;
1060 gckHARDWARE_QueryChipSpecs(
1061 IN gckHARDWARE Hardware
,
1062 OUT gctUINT32_PTR StreamCount
,
1063 OUT gctUINT32_PTR RegisterMax
,
1064 OUT gctUINT32_PTR ThreadCount
,
1065 OUT gctUINT32_PTR ShaderCoreCount
,
1066 OUT gctUINT32_PTR VertexCacheSize
,
1067 OUT gctUINT32_PTR VertexOutputBufferSize
,
1068 OUT gctUINT32_PTR PixelPipes
,
1069 OUT gctUINT32_PTR InstructionCount
,
1070 OUT gctUINT32_PTR NumConstants
,
1071 OUT gctUINT32_PTR BufferSize
1074 gcmkHEADER_ARG("Hardware=0x%x", Hardware
);
1076 /* Verify the arguments. */
1077 gcmkVERIFY_OBJECT(Hardware
, gcvOBJ_HARDWARE
);
1079 /* Return the number of streams. */
1080 if (StreamCount
!= gcvNULL
)
1082 *StreamCount
= Hardware
->streamCount
;
1085 /* Return the number of temporary registers. */
1086 if (RegisterMax
!= gcvNULL
)
1088 *RegisterMax
= Hardware
->registerMax
;
1091 /* Return the maximum number of thrteads. */
1092 if (ThreadCount
!= gcvNULL
)
1094 *ThreadCount
= Hardware
->threadCount
;
1097 /* Return the number of shader cores. */
1098 if (ShaderCoreCount
!= gcvNULL
)
1100 *ShaderCoreCount
= Hardware
->shaderCoreCount
;
1103 /* Return the number of entries in the vertex cache. */
1104 if (VertexCacheSize
!= gcvNULL
)
1106 *VertexCacheSize
= Hardware
->vertexCacheSize
;
1109 /* Return the number of entries in the vertex output buffer. */
1110 if (VertexOutputBufferSize
!= gcvNULL
)
1112 *VertexOutputBufferSize
= Hardware
->vertexOutputBufferSize
;
1115 /* Return the number of pixel pipes. */
1116 if (PixelPipes
!= gcvNULL
)
1118 *PixelPipes
= Hardware
->pixelPipes
;
1121 /* Return the number of instructions. */
1122 if (InstructionCount
!= gcvNULL
)
1124 *InstructionCount
= Hardware
->instructionCount
;
1127 /* Return the number of constants. */
1128 if (NumConstants
!= gcvNULL
)
1130 *NumConstants
= Hardware
->numConstants
;
1133 /* Return the buffer size. */
1134 if (BufferSize
!= gcvNULL
)
1136 *BufferSize
= Hardware
->bufferSize
;
1140 gcmkFOOTER_ARG("*StreamCount=%u *RegisterMax=%u *ThreadCount=%u "
1141 "*ShaderCoreCount=%u *VertexCacheSize=%u "
1142 "*VertexOutputBufferSize=%u *PixelPipes=%u",
1143 "*InstructionCount=%u *NumConstants=%u *BufferSize=%u",
1144 gcmOPT_VALUE(StreamCount
), gcmOPT_VALUE(RegisterMax
),
1145 gcmOPT_VALUE(ThreadCount
), gcmOPT_VALUE(ShaderCoreCount
),
1146 gcmOPT_VALUE(VertexCacheSize
),
1147 gcmOPT_VALUE(VertexOutputBufferSize
),
1148 gcmOPT_VALUE(PixelPipes
),
1149 gcmOPT_VALUE(InstructionCount
),
1150 gcmOPT_VALUE(NumConstants
),
1151 gcmOPT_VALUE(BufferSize
));
1153 return gcvSTATUS_OK
;
1156 /*******************************************************************************
1158 ** gckHARDWARE_ConvertFormat
1160 ** Convert an API format to hardware parameters.
1164 ** gckHARDWARE Hardware
1165 ** Pointer to the gckHARDWARE object.
1167 ** gceSURF_FORMAT Format
1168 ** API format to convert.
1172 ** gctUINT32 * BitsPerPixel
1173 ** Pointer to a variable that will hold the number of bits per pixel.
1175 ** gctUINT32 * BytesPerTile
1176 ** Pointer to a variable that will hold the number of bytes per tile.
1179 gckHARDWARE_ConvertFormat(
1180 IN gckHARDWARE Hardware
,
1181 IN gceSURF_FORMAT Format
,
1182 OUT gctUINT32
* BitsPerPixel
,
1183 OUT gctUINT32
* BytesPerTile
1186 gctUINT32 bitsPerPixel
;
1187 gctUINT32 bytesPerTile
;
1189 gcmkHEADER_ARG("Hardware=0x%x Format=%d", Hardware
, Format
);
1191 /* Verify the arguments. */
1192 gcmkVERIFY_OBJECT(Hardware
, gcvOBJ_HARDWARE
);
1194 /* Dispatch on format. */
1197 case gcvSURF_INDEX8
:
1202 bytesPerTile
= (8 * 4 * 4) / 8;
1209 /* 12-bpp planar YUV formats. */
1211 bytesPerTile
= (12 * 4 * 4) / 8;
1215 case gcvSURF_X4R4G4B4
:
1216 case gcvSURF_A4R4G4B4
:
1217 case gcvSURF_X1R5G5B5
:
1218 case gcvSURF_A1R5G5B5
:
1219 case gcvSURF_R5G5B5X1
:
1220 case gcvSURF_R4G4B4X4
:
1221 case gcvSURF_X4B4G4R4
:
1222 case gcvSURF_X1B5G5R5
:
1223 case gcvSURF_B4G4R4X4
:
1224 case gcvSURF_R5G6B5
:
1225 case gcvSURF_B5G5R5X1
:
1233 /* 16-bpp format. */
1235 bytesPerTile
= (16 * 4 * 4) / 8;
1238 case gcvSURF_X8R8G8B8
:
1239 case gcvSURF_A8R8G8B8
:
1240 case gcvSURF_X8B8G8R8
:
1241 case gcvSURF_A8B8G8R8
:
1242 case gcvSURF_R8G8B8X8
:
1244 /* 32-bpp format. */
1246 bytesPerTile
= (32 * 4 * 4) / 8;
1251 /* 24-bpp format. */
1253 bytesPerTile
= (32 * 4 * 4) / 8;
1259 bytesPerTile
= (4 * 4 * 4) / 8;
1267 bytesPerTile
= (8 * 4 * 4) / 8;
1271 /* Invalid format. */
1272 gcmkFOOTER_ARG("status=%d", gcvSTATUS_INVALID_ARGUMENT
);
1273 return gcvSTATUS_INVALID_ARGUMENT
;
1276 /* Set the result. */
1277 if (BitsPerPixel
!= gcvNULL
)
1279 * BitsPerPixel
= bitsPerPixel
;
1282 if (BytesPerTile
!= gcvNULL
)
1284 * BytesPerTile
= bytesPerTile
;
1288 gcmkFOOTER_ARG("*BitsPerPixel=%u *BytesPerTile=%u",
1289 gcmOPT_VALUE(BitsPerPixel
), gcmOPT_VALUE(BytesPerTile
));
1290 return gcvSTATUS_OK
;
1293 /*******************************************************************************
1295 ** gckHARDWARE_SplitMemory
1297 ** Split a hardware specific memory address into a pool and offset.
1301 ** gckHARDWARE Hardware
1302 ** Pointer to the gckHARDWARE object.
1304 ** gctUINT32 Address
1305 ** Address in hardware specific format.
1310 ** Pointer to a variable that will hold the pool type for the address.
1312 ** gctUINT32 * Offset
1313 ** Pointer to a variable that will hold the offset for the address.
1316 gckHARDWARE_SplitMemory(
1317 IN gckHARDWARE Hardware
,
1318 IN gctUINT32 Address
,
1320 OUT gctUINT32
* Offset
1323 gcmkHEADER_ARG("Hardware=0x%x Addres=0x%08x", Hardware
, Address
);
1325 /* Verify the arguments. */
1326 gcmkVERIFY_OBJECT(Hardware
, gcvOBJ_HARDWARE
);
1327 gcmkVERIFY_ARGUMENT(Pool
!= gcvNULL
);
1328 gcmkVERIFY_ARGUMENT(Offset
!= gcvNULL
);
1330 /* Dispatch on memory type. */
1331 switch ((((((gctUINT32
) (Address
)) >> (0 ? 31:31)) & ((gctUINT32
) ((((1 ? 31:31) - (0 ? 31:31) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:31) - (0 ? 31:31) + 1)))))) ))
1334 /* System memory. */
1335 *Pool
= gcvPOOL_SYSTEM
;
1339 /* Virtual memory. */
1340 *Pool
= gcvPOOL_VIRTUAL
;
1344 /* Invalid memory type. */
1345 gcmkFOOTER_ARG("status=%d", gcvSTATUS_INVALID_ARGUMENT
);
1346 return gcvSTATUS_INVALID_ARGUMENT
;
1349 /* Return offset of address. */
1350 *Offset
= (((((gctUINT32
) (Address
)) >> (0 ? 30:0)) & ((gctUINT32
) ((((1 ? 30:0) - (0 ? 30:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 30:0) - (0 ? 30:0) + 1)))))) );
1353 gcmkFOOTER_ARG("*Pool=%d *Offset=0x%08x", *Pool
, *Offset
);
1354 return gcvSTATUS_OK
;
1357 /*******************************************************************************
1359 ** gckHARDWARE_Execute
1361 ** Kickstart the hardware's command processor with an initialized command
1366 ** gckHARDWARE Hardware
1367 ** Pointer to the gckHARDWARE object.
1369 ** gctPOINTER Logical
1370 ** Logical address of command buffer.
1373 ** Number of bytes for the prefetch unit (until after the first LINK).
1380 gckHARDWARE_Execute(
1381 IN gckHARDWARE Hardware
,
1382 IN gctPOINTER Logical
,
1384 IN gctPOINTER Physical
,
1385 IN gctBOOL PhysicalAddresses
,
1391 gctUINT32 address
= 0, control
;
1393 gcmkHEADER_ARG("Hardware=0x%x Logical=0x%x Bytes=%lu",
1394 Hardware
, Logical
, Bytes
);
1396 /* Verify the arguments. */
1397 gcmkVERIFY_OBJECT(Hardware
, gcvOBJ_HARDWARE
);
1398 gcmkVERIFY_ARGUMENT(Logical
!= gcvNULL
);
1401 if (PhysicalAddresses
)
1403 /* Convert physical into hardware specific address. */
1405 gckHARDWARE_ConvertPhysical(Hardware
, Physical
, &address
));
1410 /* Convert logical into hardware specific address. */
1412 gckHARDWARE_ConvertLogical(Hardware
, Logical
, &address
));
1417 /* Enable all events. */
1419 gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00014, ~0U));
1421 /* Write address register. */
1423 gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00654, address
));
1425 /* Build control register. */
1426 control
= ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 16:16) - (0 ? 16:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 16:16) - (0 ? 16:16) + 1))))))) << (0 ? 16:16))) | (((gctUINT32
) (0x1 & ((gctUINT32
) ((((1 ? 16:16) - (0 ? 16:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 16:16) - (0 ? 16:16) + 1))))))) << (0 ? 16:16)))
1427 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0))) | (((gctUINT32
) ((gctUINT32
) ((Bytes
+ 7) >> 3) & ((gctUINT32
) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
1429 /* Set big endian */
1430 if (Hardware
->bigEndian
)
1432 control
|= ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 21:20) - (0 ? 21:20) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 21:20) - (0 ? 21:20) + 1))))))) << (0 ? 21:20))) | (((gctUINT32
) (0x2 & ((gctUINT32
) ((((1 ? 21:20) - (0 ? 21:20) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 21:20) - (0 ? 21:20) + 1))))))) << (0 ? 21:20)));
1435 /* Write control register. */
1437 gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00658, control
));
1439 gcmkTRACE_ZONE(gcvLEVEL_INFO
, gcvZONE_HARDWARE
,
1440 "Started command buffer @ 0x%08x",
1445 return gcvSTATUS_OK
;
1448 /* Return the status. */
1453 /*******************************************************************************
1455 ** gckHARDWARE_WaitLink
1457 ** Append a WAIT/LINK command sequence at the specified location in the command
1462 ** gckHARDWARE Hardware
1463 ** Pointer to an gckHARDWARE object.
1465 ** gctPOINTER Logical
1466 ** Pointer to the current location inside the command queue to append
1467 ** WAIT/LINK command sequence at or gcvNULL just to query the size of the
1468 ** WAIT/LINK command sequence.
1471 ** Offset into command buffer required for alignment.
1473 ** gctSIZE_T * Bytes
1474 ** Pointer to the number of bytes available for the WAIT/LINK command
1475 ** sequence. If 'Logical' is gcvNULL, this argument will be ignored.
1479 ** gctSIZE_T * Bytes
1480 ** Pointer to a variable that will receive the number of bytes required
1481 ** by the WAIT/LINK command sequence. If 'Bytes' is gcvNULL, nothing will
1484 ** gctUINT32 * WaitOffset
1485 ** Pointer to a variable that will receive the offset of the WAIT command
1486 ** from the specified logcial pointer.
1487 ** If 'WaitOffset' is gcvNULL nothing will be returned.
1489 ** gctSIZE_T * WaitSize
1490 ** Pointer to a variable that will receive the number of bytes used by
1491 ** the WAIT command. If 'LinkSize' is gcvNULL nothing will be returned.
1494 gckHARDWARE_WaitLink(
1495 IN gckHARDWARE Hardware
,
1496 IN gctPOINTER Logical
,
1497 IN gctUINT32 Offset
,
1498 IN OUT gctSIZE_T
* Bytes
,
1499 OUT gctUINT32
* WaitOffset
,
1500 OUT gctSIZE_T
* WaitSize
1503 static const gctUINT waitCount
= 200;
1507 gctUINT32_PTR logical
;
1510 gcmkHEADER_ARG("Hardware=0x%x Logical=0x%x Offset=0x%08x *Bytes=%lu",
1511 Hardware
, Logical
, Offset
, gcmOPT_VALUE(Bytes
));
1513 /* Verify the arguments. */
1514 gcmkVERIFY_OBJECT(Hardware
, gcvOBJ_HARDWARE
);
1515 gcmkVERIFY_ARGUMENT((Logical
!= gcvNULL
) || (Bytes
!= gcvNULL
));
1517 /* Compute number of bytes required. */
1519 bytes
= gcmALIGN(Offset
+ 96, 8) - Offset
;
1521 bytes
= gcmALIGN(Offset
+ 16, 8) - Offset
;
1524 /* Cast the input pointer. */
1525 logical
= (gctUINT32_PTR
) Logical
;
1527 if (logical
!= gcvNULL
)
1529 /* Not enough space? */
1532 /* Command queue too small. */
1533 gcmkONERROR(gcvSTATUS_BUFFER_TOO_SMALL
);
1536 /* Convert logical into hardware specific address. */
1537 gcmkONERROR(gckHARDWARE_ConvertLogical(Hardware
, logical
, &address
));
1539 /* Store the WAIT/LINK address. */
1540 Hardware
->lastWaitLink
= address
;
1542 /* Append WAIT(count). */
1544 = ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))) | (((gctUINT32
) (0x07 & ((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
1545 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0))) | (((gctUINT32
) ((gctUINT32
) (waitCount
) & ((gctUINT32
) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
1548 /* Send FE-PE sempahore token. */
1550 = ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))) | (((gctUINT32
) (0x01 & ((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
1551 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 25:16) - (0 ? 25:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16))) | (((gctUINT32
) ((gctUINT32
) (1) & ((gctUINT32
) ((((1 ? 25:16) - (0 ? 25:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16)))
1552 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0))) | (((gctUINT32
) ((gctUINT32
) (0x0E02) & ((gctUINT32
) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
1555 = ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 4:0) - (0 ? 4:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0))) | (((gctUINT32
) (0x01 & ((gctUINT32
) ((((1 ? 4:0) - (0 ? 4:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
1556 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 12:8) - (0 ? 12:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8))) | (((gctUINT32
) (0x07 & ((gctUINT32
) ((((1 ? 12:8) - (0 ? 12:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)));
1558 /* Send FE-PE stall token. */
1560 = ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))) | (((gctUINT32
) (0x01 & ((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
1561 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 25:16) - (0 ? 25:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16))) | (((gctUINT32
) ((gctUINT32
) (1) & ((gctUINT32
) ((((1 ? 25:16) - (0 ? 25:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16)))
1562 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0))) | (((gctUINT32
) ((gctUINT32
) (0x0F00) & ((gctUINT32
) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
1565 = ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 4:0) - (0 ? 4:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0))) | (((gctUINT32
) (0x01 & ((gctUINT32
) ((((1 ? 4:0) - (0 ? 4:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
1566 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 12:8) - (0 ? 12:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8))) | (((gctUINT32
) (0x07 & ((gctUINT32
) ((((1 ? 12:8) - (0 ? 12:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)));
1568 /*************************************************************/
1569 /* Enable chip ID 0. */
1571 ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))) | (((gctUINT32
) (0x0D & ((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
1574 /* Send semaphore from FE to ChipID 1. */
1576 ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))) | (((gctUINT32
) (0x01 & ((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
1577 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 25:16) - (0 ? 25:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16))) | (((gctUINT32
) ((gctUINT32
) (1) & ((gctUINT32
) ((((1 ? 25:16) - (0 ? 25:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16)))
1578 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0))) | (((gctUINT32
) ((gctUINT32
) (0x0E02) & ((gctUINT32
) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
1581 ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 4:0) - (0 ? 4:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0))) | (((gctUINT32
) (0x01 & ((gctUINT32
) ((((1 ? 4:0) - (0 ? 4:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
1582 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 12:8) - (0 ? 12:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8))) | (((gctUINT32
) (0x0F & ((gctUINT32
) ((((1 ? 12:8) - (0 ? 12:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)))
1583 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24))) | (((gctUINT32
) ((gctUINT32
) (1) & ((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24)));
1585 /* Send semaphore from FE to ChipID 1. */
1587 ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))) | (((gctUINT32
) (0x09 & ((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)));
1590 ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 4:0) - (0 ? 4:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0))) | (((gctUINT32
) (0x01 & ((gctUINT32
) ((((1 ? 4:0) - (0 ? 4:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
1591 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 12:8) - (0 ? 12:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8))) | (((gctUINT32
) (0x0F & ((gctUINT32
) ((((1 ? 12:8) - (0 ? 12:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)))
1592 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24))) | (((gctUINT32
) ((gctUINT32
) (0) & ((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24)));
1594 /*************************************************************/
1595 /* Enable chip ID 1. */
1597 ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))) | (((gctUINT32
) (0x0D & ((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
1600 /* Send semaphore from FE to ChipID 1. */
1602 ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))) | (((gctUINT32
) (0x01 & ((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
1603 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 25:16) - (0 ? 25:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16))) | (((gctUINT32
) ((gctUINT32
) (1) & ((gctUINT32
) ((((1 ? 25:16) - (0 ? 25:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16)))
1604 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0))) | (((gctUINT32
) ((gctUINT32
) (0x0E02) & ((gctUINT32
) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
1607 ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 4:0) - (0 ? 4:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0))) | (((gctUINT32
) (0x01 & ((gctUINT32
) ((((1 ? 4:0) - (0 ? 4:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
1608 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 12:8) - (0 ? 12:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8))) | (((gctUINT32
) (0x0F & ((gctUINT32
) ((((1 ? 12:8) - (0 ? 12:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)))
1609 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24))) | (((gctUINT32
) ((gctUINT32
) (0) & ((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24)));
1611 /* Wait for semaphore from ChipID 0. */
1613 ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))) | (((gctUINT32
) (0x09 & ((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)));
1616 ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 4:0) - (0 ? 4:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0))) | (((gctUINT32
) (0x01 & ((gctUINT32
) ((((1 ? 4:0) - (0 ? 4:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
1617 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 12:8) - (0 ? 12:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8))) | (((gctUINT32
) (0x0F & ((gctUINT32
) ((((1 ? 12:8) - (0 ? 12:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)))
1618 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24))) | (((gctUINT32
) ((gctUINT32
) (1) & ((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24)));
1620 /*************************************************************/
1621 /* Enable all chips. */
1623 ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))) | (((gctUINT32
) (0x0D & ((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
1626 /* LoadState(AQFlush, 1), flush. */
1628 = ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))) | (((gctUINT32
) (0x01 & ((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
1629 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0))) | (((gctUINT32
) ((gctUINT32
) (0x0E03) & ((gctUINT32
) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
1630 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 25:16) - (0 ? 25:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16))) | (((gctUINT32
) ((gctUINT32
) (1) & ((gctUINT32
) ((((1 ? 25:16) - (0 ? 25:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16)));
1633 = ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? AQ_FLUSH_L2_CACHE
) - (0 ? AQ_FLUSH_L2_CACHE
) + 1) == 32) ? ~0 : (~(~0 << ((1 ? AQ_FLUSH_L2_CACHE
) - (0 ? AQ_FLUSH_L2_CACHE
) + 1))))))) << (0 ? AQ_FLUSH_L2_CACHE
))) | (((gctUINT32
) (AQ_FLUSH_L2_CACHE_ENABLE
& ((gctUINT32
) ((((1 ? AQ_FLUSH_L2_CACHE
) - (0 ? AQ_FLUSH_L2_CACHE
) + 1) == 32) ? ~0 : (~(~0 << ((1 ? AQ_FLUSH_L2_CACHE
) - (0 ? AQ_FLUSH_L2_CACHE
) + 1))))))) << (0 ? AQ_FLUSH_L2_CACHE
)));
1635 /* Append LINK(2, address). */
1637 = ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))) | (((gctUINT32
) (0x08 & ((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
1638 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0))) | (((gctUINT32
) ((gctUINT32
) (bytes
>> 3) & ((gctUINT32
) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
1640 logical
[23] = address
;
1642 /* Append LINK(2, address). */
1644 = ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))) | (((gctUINT32
) (0x08 & ((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
1645 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0))) | (((gctUINT32
) ((gctUINT32
) (bytes
>> 3) & ((gctUINT32
) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
1647 logical
[3] = address
;
1650 gcvLEVEL_INFO
, gcvZONE_HARDWARE
,
1651 "0x%08x: WAIT %u", address
, waitCount
1655 gcvLEVEL_INFO
, gcvZONE_HARDWARE
,
1656 "0x%08x: LINK 0x%08x, #%lu",
1657 address
+ 8, address
, bytes
1661 if (WaitOffset
!= gcvNULL
)
1663 /* Return the offset pointer to WAIT command. */
1667 if (WaitSize
!= gcvNULL
)
1669 /* Return number of bytes used by the WAIT command. */
1674 if (Bytes
!= gcvNULL
)
1676 /* Return number of bytes required by the WAIT/LINK command
1682 gcmkFOOTER_ARG("*Bytes=%lu *WaitOffset=0x%x *WaitSize=%lu",
1683 gcmOPT_VALUE(Bytes
), gcmOPT_VALUE(WaitOffset
),
1684 gcmOPT_VALUE(WaitSize
));
1685 return gcvSTATUS_OK
;
1688 /* Return the status. */
1693 /*******************************************************************************
1697 ** Append an END command at the specified location in the command queue.
1701 ** gckHARDWARE Hardware
1702 ** Pointer to an gckHARDWARE object.
1704 ** gctPOINTER Logical
1705 ** Pointer to the current location inside the command queue to append
1706 ** END command at or gcvNULL just to query the size of the END command.
1708 ** gctSIZE_T * Bytes
1709 ** Pointer to the number of bytes available for the END command. If
1710 ** 'Logical' is gcvNULL, this argument will be ignored.
1714 ** gctSIZE_T * Bytes
1715 ** Pointer to a variable that will receive the number of bytes required
1716 ** for the END command. If 'Bytes' is gcvNULL, nothing will be returned.
1720 IN gckHARDWARE Hardware
,
1721 IN gctPOINTER Logical
,
1722 IN OUT gctSIZE_T
* Bytes
1725 gctUINT32_PTR logical
= (gctUINT32_PTR
) Logical
;
1728 gcmkHEADER_ARG("Hardware=0x%x Logical=0x%x *Bytes=%lu",
1729 Hardware
, Logical
, gcmOPT_VALUE(Bytes
));
1731 /* Verify the arguments. */
1732 gcmkVERIFY_OBJECT(Hardware
, gcvOBJ_HARDWARE
);
1733 gcmkVERIFY_ARGUMENT((Logical
== gcvNULL
) || (Bytes
!= gcvNULL
));
1735 if (Logical
!= gcvNULL
)
1739 /* Command queue too small. */
1740 gcmkONERROR(gcvSTATUS_BUFFER_TOO_SMALL
);
1745 ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))) | (((gctUINT32
) (0x02 & ((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)));
1747 gcmkTRACE_ZONE(gcvLEVEL_INFO
, gcvZONE_HARDWARE
, "0x%x: END", Logical
);
1749 /* Make sure the CPU writes out the data to memory. */
1751 gckOS_MemoryBarrier(Hardware
->os
, Logical
));
1754 if (Bytes
!= gcvNULL
)
1756 /* Return number of bytes required by the END command. */
1761 gcmkFOOTER_ARG("*Bytes=%lu", gcmOPT_VALUE(Bytes
));
1762 return gcvSTATUS_OK
;
1765 /* Return the status. */
1770 /*******************************************************************************
1774 ** Append a NOP command at the specified location in the command queue.
1778 ** gckHARDWARE Hardware
1779 ** Pointer to an gckHARDWARE object.
1781 ** gctPOINTER Logical
1782 ** Pointer to the current location inside the command queue to append
1783 ** NOP command at or gcvNULL just to query the size of the NOP command.
1785 ** gctSIZE_T * Bytes
1786 ** Pointer to the number of bytes available for the NOP command. If
1787 ** 'Logical' is gcvNULL, this argument will be ignored.
1791 ** gctSIZE_T * Bytes
1792 ** Pointer to a variable that will receive the number of bytes required
1793 ** for the NOP command. If 'Bytes' is gcvNULL, nothing will be returned.
1797 IN gckHARDWARE Hardware
,
1798 IN gctPOINTER Logical
,
1799 IN OUT gctSIZE_T
* Bytes
1802 gctUINT32_PTR logical
= (gctUINT32_PTR
) Logical
;
1805 gcmkHEADER_ARG("Hardware=0x%x Logical=0x%x *Bytes=%lu",
1806 Hardware
, Logical
, gcmOPT_VALUE(Bytes
));
1808 /* Verify the arguments. */
1809 gcmkVERIFY_OBJECT(Hardware
, gcvOBJ_HARDWARE
);
1810 gcmkVERIFY_ARGUMENT((Logical
== gcvNULL
) || (Bytes
!= gcvNULL
));
1812 if (Logical
!= gcvNULL
)
1816 /* Command queue too small. */
1817 gcmkONERROR(gcvSTATUS_BUFFER_TOO_SMALL
);
1821 logical
[0] = ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))) | (((gctUINT32
) (0x03 & ((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)));
1823 gcmkTRACE_ZONE(gcvLEVEL_INFO
, gcvZONE_HARDWARE
, "0x%x: NOP", Logical
);
1826 if (Bytes
!= gcvNULL
)
1828 /* Return number of bytes required by the NOP command. */
1833 gcmkFOOTER_ARG("*Bytes=%lu", gcmOPT_VALUE(Bytes
));
1834 return gcvSTATUS_OK
;
1837 /* Return the status. */
1842 /*******************************************************************************
1846 ** Append a WAIT command at the specified location in the command queue.
1850 ** gckHARDWARE Hardware
1851 ** Pointer to an gckHARDWARE object.
1853 ** gctPOINTER Logical
1854 ** Pointer to the current location inside the command queue to append
1855 ** WAIT command at or gcvNULL just to query the size of the WAIT command.
1858 ** Number of cycles to wait.
1860 ** gctSIZE_T * Bytes
1861 ** Pointer to the number of bytes available for the WAIT command. If
1862 ** 'Logical' is gcvNULL, this argument will be ignored.
1866 ** gctSIZE_T * Bytes
1867 ** Pointer to a variable that will receive the number of bytes required
1868 ** for the NOP command. If 'Bytes' is gcvNULL, nothing will be returned.
1872 IN gckHARDWARE Hardware
,
1873 IN gctPOINTER Logical
,
1875 IN OUT gctSIZE_T
* Bytes
1879 gctUINT32_PTR logical
;
1881 gcmkHEADER_ARG("Hardware=0x%x Logical=0x%x Count=%u *Bytes=%lu",
1882 Hardware
, Logical
, Count
, gcmOPT_VALUE(Bytes
));
1884 /* Verify the arguments. */
1885 gcmkVERIFY_OBJECT(Hardware
, gcvOBJ_HARDWARE
);
1886 gcmkVERIFY_ARGUMENT((Logical
== gcvNULL
) || (Bytes
!= gcvNULL
));
1888 /* Cast the input pointer. */
1889 logical
= (gctUINT32_PTR
) Logical
;
1891 if (Logical
!= gcvNULL
)
1895 /* Command queue too small. */
1896 gcmkONERROR(gcvSTATUS_BUFFER_TOO_SMALL
);
1900 logical
[0] = ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))) | (((gctUINT32
) (0x07 & ((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
1901 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0))) | (((gctUINT32
) ((gctUINT32
) (Count
) & ((gctUINT32
) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
1903 #if gcmIS_DEBUG(gcdDEBUG_TRACE)
1907 /* Convert logical into hardware specific address. */
1908 gcmkONERROR(gckHARDWARE_ConvertLogical(
1909 Hardware
, logical
, &address
1913 gcvLEVEL_INFO
, gcvZONE_HARDWARE
,
1914 "0x%08x: WAIT %u", address
, Count
1920 if (Bytes
!= gcvNULL
)
1922 /* Return number of bytes required by the WAIT command. */
1927 gcmkFOOTER_ARG("*Bytes=%lu", gcmOPT_VALUE(Bytes
));
1928 return gcvSTATUS_OK
;
1931 /* Return the status. */
1936 /*******************************************************************************
1938 ** gckHARDWARE_Event
1940 ** Append an EVENT command at the specified location in the command queue.
1944 ** gckHARDWARE Hardware
1945 ** Pointer to an gckHARDWARE object.
1947 ** gctPOINTER Logical
1948 ** Pointer to the current location inside the command queue to append
1949 ** the EVENT command at or gcvNULL just to query the size of the EVENT
1953 ** Event ID to program.
1955 ** gceKERNEL_WHERE FromWhere
1956 ** Location of the pipe to send the event.
1958 ** gctSIZE_T * Bytes
1959 ** Pointer to the number of bytes available for the EVENT command. If
1960 ** 'Logical' is gcvNULL, this argument will be ignored.
1964 ** gctSIZE_T * Bytes
1965 ** Pointer to a variable that will receive the number of bytes required
1966 ** for the EVENT command. If 'Bytes' is gcvNULL, nothing will be
1971 IN gckHARDWARE Hardware
,
1972 IN gctPOINTER Logical
,
1974 IN gceKERNEL_WHERE FromWhere
,
1975 IN OUT gctSIZE_T
* Bytes
1979 gctUINT32 destination
= 0;
1980 gctUINT32_PTR logical
= (gctUINT32_PTR
) Logical
;
1983 gcmkHEADER_ARG("Hardware=0x%x Logical=0x%x Event=%u FromWhere=%d *Bytes=%lu",
1984 Hardware
, Logical
, Event
, FromWhere
, gcmOPT_VALUE(Bytes
));
1986 /* Verify the arguments. */
1987 gcmkVERIFY_OBJECT(Hardware
, gcvOBJ_HARDWARE
);
1988 gcmkVERIFY_ARGUMENT((Logical
== gcvNULL
) || (Bytes
!= gcvNULL
));
1989 gcmkVERIFY_ARGUMENT(Event
< 32);
1991 /* Determine the size of the command. */
1992 size
= (Hardware
->extraEventStates
&& (FromWhere
== gcvKERNEL_PIXEL
))
1993 ? gcmALIGN(8 + (1 + 5) * 4, 8) /* EVENT + 5 STATES */
1996 if (Logical
!= gcvNULL
)
2000 /* Command queue too small. */
2001 gcmkONERROR(gcvSTATUS_BUFFER_TOO_SMALL
);
2006 case gcvKERNEL_COMMAND
:
2007 /* From command processor. */
2008 destination
= ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 5:5) - (0 ? 5:5) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 5:5) - (0 ? 5:5) + 1))))))) << (0 ? 5:5))) | (((gctUINT32
) (0x1 & ((gctUINT32
) ((((1 ? 5:5) - (0 ? 5:5) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 5:5) - (0 ? 5:5) + 1))))))) << (0 ? 5:5)));
2011 case gcvKERNEL_PIXEL
:
2012 /* From pixel engine. */
2013 destination
= ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 6:6) - (0 ? 6:6) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 6:6) - (0 ? 6:6) + 1))))))) << (0 ? 6:6))) | (((gctUINT32
) (0x1 & ((gctUINT32
) ((((1 ? 6:6) - (0 ? 6:6) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 6:6) - (0 ? 6:6) + 1))))))) << (0 ? 6:6)));
2017 gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT
);
2020 /* Append EVENT(Event, destiantion). */
2021 logical
[0] = ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))) | (((gctUINT32
) (0x01 & ((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
2022 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0))) | (((gctUINT32
) ((gctUINT32
) (0x0E01) & ((gctUINT32
) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
2023 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 25:16) - (0 ? 25:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16))) | (((gctUINT32
) ((gctUINT32
) (1) & ((gctUINT32
) ((((1 ? 25:16) - (0 ? 25:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16)));
2025 logical
[1] = ((((gctUINT32
) (destination
)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 4:0) - (0 ? 4:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0))) | (((gctUINT32
) ((gctUINT32
) (Event
) & ((gctUINT32
) ((((1 ? 4:0) - (0 ? 4:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)));
2027 /* Make sure the event ID gets written out before GPU can access it. */
2029 gckOS_MemoryBarrier(Hardware
->os
, logical
+ 1));
2031 #if gcmIS_DEBUG(gcdDEBUG_TRACE)
2034 gckOS_GetPhysicalAddress(Hardware
->os
, Logical
, &phys
);
2035 gcmkTRACE_ZONE(gcvLEVEL_INFO
, gcvZONE_HARDWARE
,
2036 "0x%08x: EVENT %d", phys
, Event
);
2040 /* Append the extra states. These are needed for the chips that do not
2041 ** support back-to-back events due to the async interface. The extra
2042 ** states add the necessary delay to ensure that event IDs do not
2046 logical
[2] = ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))) | (((gctUINT32
) (0x01 & ((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
2047 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0))) | (((gctUINT32
) ((gctUINT32
) (0x0100) & ((gctUINT32
) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
2048 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 25:16) - (0 ? 25:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16))) | (((gctUINT32
) ((gctUINT32
) (5) & ((gctUINT32
) ((((1 ? 25:16) - (0 ? 25:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16)));
2057 if (Bytes
!= gcvNULL
)
2059 /* Return number of bytes required by the EVENT command. */
2064 gcmkFOOTER_ARG("*Bytes=%lu", gcmOPT_VALUE(Bytes
));
2065 return gcvSTATUS_OK
;
2068 /* Return the status. */
2073 /*******************************************************************************
2075 ** gckHARDWARE_PipeSelect
2077 ** Append a PIPESELECT command at the specified location in the command queue.
2081 ** gckHARDWARE Hardware
2082 ** Pointer to an gckHARDWARE object.
2084 ** gctPOINTER Logical
2085 ** Pointer to the current location inside the command queue to append
2086 ** the PIPESELECT command at or gcvNULL just to query the size of the
2087 ** PIPESELECT command.
2089 ** gcePIPE_SELECT Pipe
2090 ** Pipe value to select.
2092 ** gctSIZE_T * Bytes
2093 ** Pointer to the number of bytes available for the PIPESELECT command.
2094 ** If 'Logical' is gcvNULL, this argument will be ignored.
2098 ** gctSIZE_T * Bytes
2099 ** Pointer to a variable that will receive the number of bytes required
2100 ** for the PIPESELECT command. If 'Bytes' is gcvNULL, nothing will be
2104 gckHARDWARE_PipeSelect(
2105 IN gckHARDWARE Hardware
,
2106 IN gctPOINTER Logical
,
2107 IN gcePIPE_SELECT Pipe
,
2108 IN OUT gctSIZE_T
* Bytes
2111 gctUINT32_PTR logical
= (gctUINT32_PTR
) Logical
;
2114 gcmkHEADER_ARG("Hardware=0x%x Logical=0x%x Pipe=%d *Bytes=%lu",
2115 Hardware
, Logical
, Pipe
, gcmOPT_VALUE(Bytes
));
2117 /* Verify the arguments. */
2118 gcmkVERIFY_OBJECT(Hardware
, gcvOBJ_HARDWARE
);
2119 gcmkVERIFY_ARGUMENT((Logical
== gcvNULL
) || (Bytes
!= gcvNULL
));
2121 /* Append a PipeSelect. */
2122 if (Logical
!= gcvNULL
)
2124 gctUINT32 flush
, stall
;
2128 /* Command queue too small. */
2129 gcmkONERROR(gcvSTATUS_BUFFER_TOO_SMALL
);
2132 flush
= (Pipe
== gcvPIPE_2D
)
2133 ? ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 1:1) - (0 ? 1:1) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 1:1) - (0 ? 1:1) + 1))))))) << (0 ? 1:1))) | (((gctUINT32
) (0x1 & ((gctUINT32
) ((((1 ? 1:1) - (0 ? 1:1) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 1:1) - (0 ? 1:1) + 1))))))) << (0 ? 1:1)))
2134 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0))) | (((gctUINT32
) (0x1 & ((gctUINT32
) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0)))
2135 : ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 3:3) - (0 ? 3:3) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 3:3) - (0 ? 3:3) + 1))))))) << (0 ? 3:3))) | (((gctUINT32
) (0x1 & ((gctUINT32
) ((((1 ? 3:3) - (0 ? 3:3) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 3:3) - (0 ? 3:3) + 1))))))) << (0 ? 3:3)));
2137 stall
= ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 4:0) - (0 ? 4:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0))) | (((gctUINT32
) (0x01 & ((gctUINT32
) ((((1 ? 4:0) - (0 ? 4:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
2138 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 12:8) - (0 ? 12:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8))) | (((gctUINT32
) (0x07 & ((gctUINT32
) ((((1 ? 12:8) - (0 ? 12:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)));
2140 /* LoadState(AQFlush, 1), flush. */
2142 = ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))) | (((gctUINT32
) (0x01 & ((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
2143 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0))) | (((gctUINT32
) ((gctUINT32
) (0x0E03) & ((gctUINT32
) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
2144 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 25:16) - (0 ? 25:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16))) | (((gctUINT32
) ((gctUINT32
) (1) & ((gctUINT32
) ((((1 ? 25:16) - (0 ? 25:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16)));
2149 gcmkTRACE_ZONE(gcvLEVEL_INFO
, gcvZONE_HARDWARE
,
2150 "0x%x: FLUSH 0x%x", logical
, flush
);
2152 /* LoadState(AQSempahore, 1), stall. */
2154 = ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))) | (((gctUINT32
) (0x01 & ((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
2155 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 25:16) - (0 ? 25:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16))) | (((gctUINT32
) ((gctUINT32
) (1) & ((gctUINT32
) ((((1 ? 25:16) - (0 ? 25:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16)))
2156 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0))) | (((gctUINT32
) ((gctUINT32
) (0x0E02) & ((gctUINT32
) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
2161 gcmkTRACE_ZONE(gcvLEVEL_INFO
, gcvZONE_HARDWARE
,
2162 "0x%x: SEMAPHORE 0x%x", logical
+ 2, stall
);
2165 logical
[4] = ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))) | (((gctUINT32
) (0x09 & ((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)));
2168 gcmkTRACE_ZONE(gcvLEVEL_INFO
, gcvZONE_HARDWARE
,
2169 "0x%x: STALL 0x%x", logical
+ 4, stall
);
2171 /* LoadState(AQPipeSelect, 1), pipe. */
2173 = ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))) | (((gctUINT32
) (0x01 & ((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
2174 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0))) | (((gctUINT32
) ((gctUINT32
) (0x0E00) & ((gctUINT32
) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
2175 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 25:16) - (0 ? 25:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16))) | (((gctUINT32
) ((gctUINT32
) (1) & ((gctUINT32
) ((((1 ? 25:16) - (0 ? 25:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16)));
2177 logical
[7] = (Pipe
== gcvPIPE_2D
)
2181 gcmkTRACE_ZONE(gcvLEVEL_INFO
, gcvZONE_HARDWARE
,
2182 "0x%x: PIPE %d", logical
+ 6, Pipe
);
2185 if (Bytes
!= gcvNULL
)
2187 /* Return number of bytes required by the PIPESELECT command. */
2192 gcmkFOOTER_ARG("*Bytes=%lu", gcmOPT_VALUE(Bytes
));
2193 return gcvSTATUS_OK
;
2196 /* Return the status. */
2201 /*******************************************************************************
2205 ** Append a LINK command at the specified location in the command queue.
2209 ** gckHARDWARE Hardware
2210 ** Pointer to an gckHARDWARE object.
2212 ** gctPOINTER Logical
2213 ** Pointer to the current location inside the command queue to append
2214 ** the LINK command at or gcvNULL just to query the size of the LINK
2217 ** gctPOINTER FetchAddress
2218 ** Logical address of destination of LINK.
2220 ** gctSIZE_T FetchSize
2221 ** Number of bytes in destination of LINK.
2223 ** gctSIZE_T * Bytes
2224 ** Pointer to the number of bytes available for the LINK command. If
2225 ** 'Logical' is gcvNULL, this argument will be ignored.
2229 ** gctSIZE_T * Bytes
2230 ** Pointer to a variable that will receive the number of bytes required
2231 ** for the LINK command. If 'Bytes' is gcvNULL, nothing will be returned.
2235 IN gckHARDWARE Hardware
,
2236 IN gctPOINTER Logical
,
2237 IN gctPOINTER FetchAddress
,
2238 IN gctSIZE_T FetchSize
,
2239 IN OUT gctSIZE_T
* Bytes
2245 gctUINT32_PTR logical
= (gctUINT32_PTR
) Logical
;
2247 gcmkHEADER_ARG("Hardware=0x%x Logical=0x%x FetchAddress=0x%x FetchSize=%lu "
2249 Hardware
, Logical
, FetchAddress
, FetchSize
,
2250 gcmOPT_VALUE(Bytes
));
2252 /* Verify the arguments. */
2253 gcmkVERIFY_OBJECT(Hardware
, gcvOBJ_HARDWARE
);
2254 gcmkVERIFY_ARGUMENT((Logical
== gcvNULL
) || (Bytes
!= gcvNULL
));
2256 if (Logical
!= gcvNULL
)
2260 /* Command queue too small. */
2261 gcmkONERROR(gcvSTATUS_BUFFER_TOO_SMALL
);
2264 /* Convert logical address to hardware address. */
2266 gckHARDWARE_ConvertLogical(Hardware
, FetchAddress
, &address
));
2268 logical
[1] = address
;
2270 /* Make sure the address got written before the LINK command. */
2272 gckOS_MemoryBarrier(Hardware
->os
, logical
+ 1));
2274 /* Compute number of 64-byte aligned bytes to fetch. */
2275 bytes
= gcmALIGN(address
+ FetchSize
, 64) - address
;
2277 /* Append LINK(bytes / 8), FetchAddress. */
2278 logical
[0] = ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))) | (((gctUINT32
) (0x08 & ((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
2279 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0))) | (((gctUINT32
) ((gctUINT32
) (bytes
>> 3) & ((gctUINT32
) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
2281 /* Memory barrier. */
2283 gckOS_MemoryBarrier(Hardware
->os
, logical
));
2286 if (Bytes
!= gcvNULL
)
2288 /* Return number of bytes required by the LINK command. */
2293 gcmkFOOTER_ARG("*Bytes=%lu", gcmOPT_VALUE(Bytes
));
2294 return gcvSTATUS_OK
;
2297 /* Return the status. */
2302 /*******************************************************************************
2304 ** gckHARDWARE_AlignToTile
2306 ** Align the specified width and height to tile boundaries.
2310 ** gckHARDWARE Hardware
2311 ** Pointer to an gckHARDWARE object.
2313 ** gceSURF_TYPE Type
2314 ** Type of alignment.
2316 ** gctUINT32 * Width
2317 ** Pointer to the width to be aligned. If 'Width' is gcvNULL, no width
2320 ** gctUINT32 * Height
2321 ** Pointer to the height to be aligned. If 'Height' is gcvNULL, no height
2326 ** gctUINT32 * Width
2327 ** Pointer to a variable that will receive the aligned width.
2329 ** gctUINT32 * Height
2330 ** Pointer to a variable that will receive the aligned height.
2332 ** gctBOOL_PTR SuperTiled
2333 ** Pointer to a variable that receives the super-tiling flag for the
2337 gckHARDWARE_AlignToTile(
2338 IN gckHARDWARE Hardware
,
2339 IN gceSURF_TYPE Type
,
2340 IN OUT gctUINT32_PTR Width
,
2341 IN OUT gctUINT32_PTR Height
,
2342 OUT gctBOOL_PTR SuperTiled
2345 gctBOOL superTiled
= gcvFALSE
;
2346 gctUINT32 xAlignment
, yAlignment
;
2347 gctBOOL hAlignmentAvailable
= gcvFALSE
;
2349 gcmkHEADER_ARG("Hardware=0x%x Type=%d *Width=%u *Height=%u",
2350 Hardware
, Type
, gcmOPT_VALUE(Width
), gcmOPT_VALUE(Height
));
2352 /* Verify the arguments. */
2353 gcmkVERIFY_OBJECT(Hardware
, gcvOBJ_HARDWARE
);
2355 /* Super tiling can be enabled for render targets and depth buffers. */
2357 ((Type
== gcvSURF_RENDER_TARGET
)
2358 || (Type
== gcvSURF_DEPTH
)
2361 /* Of course, hardware needs to support super tiles. */
2362 ((((gctUINT32
) (Hardware
->chipMinorFeatures0
)) >> (0 ? 12:12) & ((gctUINT32
) ((((1 ? 12:12) - (0 ? 12:12) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 12:12) - (0 ? 12:12) + 1)))))) == (0x1 & ((gctUINT32
) ((((1 ? 12:12) - (0 ? 12:12) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 12:12) - (0 ? 12:12) + 1)))))));
2364 /* Textures can be better aligned. */
2365 hAlignmentAvailable
= ((((gctUINT32
) (Hardware
->chipMinorFeatures1
)) >> (0 ? 20:20) & ((gctUINT32
) ((((1 ? 20:20) - (0 ? 20:20) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 20:20) - (0 ? 20:20) + 1)))))) == (0x1 & ((gctUINT32
) ((((1 ? 20:20) - (0 ? 20:20) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 20:20) - (0 ? 20:20) + 1)))))));
2367 /* Compute alignment factors. */
2368 xAlignment
= superTiled
? 64
2369 : ((Type
== gcvSURF_TEXTURE
) && !hAlignmentAvailable
) ? 4
2371 yAlignment
= superTiled
? (64 * Hardware
->pixelPipes
)
2372 : (4 * Hardware
->pixelPipes
);
2374 if (Width
!= gcvNULL
)
2376 /* Align the width. */
2377 *Width
= gcmALIGN(*Width
, xAlignment
);
2380 if (Height
!= gcvNULL
)
2382 /* Align the height. */
2383 *Height
= gcmALIGN(*Height
, yAlignment
);
2386 if (SuperTiled
!= gcvNULL
)
2388 /* Copy the super tiling. */
2389 *SuperTiled
= superTiled
;
2393 gcmkFOOTER_ARG("*Width=%u *Height=%u *SuperTiled=%d",
2394 gcmOPT_VALUE(Width
), gcmOPT_VALUE(Height
),
2395 gcmOPT_VALUE(SuperTiled
));
2396 return gcvSTATUS_OK
;
2399 /*******************************************************************************
2401 ** gckHARDWARE_UpdateQueueTail
2403 ** Update the tail of the command queue.
2407 ** gckHARDWARE Hardware
2408 ** Pointer to an gckHARDWARE object.
2410 ** gctPOINTER Logical
2411 ** Logical address of the start of the command queue.
2414 ** Offset into the command queue of the tail (last command).
2421 gckHARDWARE_UpdateQueueTail(
2422 IN gckHARDWARE Hardware
,
2423 IN gctPOINTER Logical
,
2429 gcmkHEADER_ARG("Hardware=0x%x Logical=0x%x Offset=0x%08x",
2430 Hardware
, Logical
, Offset
);
2432 /* Verify the hardware. */
2433 gcmkVERIFY_OBJECT(Hardware
, gcvOBJ_HARDWARE
);
2435 /* Force a barrier. */
2437 gckOS_MemoryBarrier(Hardware
->os
, Logical
));
2439 /* Notify gckKERNEL object of change. */
2441 gckKERNEL_Notify(Hardware
->kernel
,
2442 gcvNOTIFY_COMMAND_QUEUE
,
2445 if (status
== gcvSTATUS_CHIP_NOT_READY
)
2447 gcmkONERROR(gcvSTATUS_GPU_NOT_RESPONDING
);
2452 return gcvSTATUS_OK
;
2455 /* Return the status. */
2460 /*******************************************************************************
2462 ** gckHARDWARE_ConvertLogical
2464 ** Convert a logical system address into a hardware specific address.
2468 ** gckHARDWARE Hardware
2469 ** Pointer to an gckHARDWARE object.
2471 ** gctPOINTER Logical
2472 ** Logical address to convert.
2474 ** gctUINT32* Address
2475 ** Return hardware specific address.
2482 gckHARDWARE_ConvertLogical(
2483 IN gckHARDWARE Hardware
,
2484 IN gctPOINTER Logical
,
2485 OUT gctUINT32
* Address
2491 gcmkHEADER_ARG("Hardware=0x%x Logical=0x%x", Hardware
, Logical
);
2493 /* Verify the arguments. */
2494 gcmkVERIFY_OBJECT(Hardware
, gcvOBJ_HARDWARE
);
2495 gcmkVERIFY_ARGUMENT(Logical
!= gcvNULL
);
2496 gcmkVERIFY_ARGUMENT(Address
!= gcvNULL
);
2498 /* Convert logical address into a physical address. */
2500 gckOS_GetPhysicalAddress(Hardware
->os
, Logical
, &address
));
2502 /* Return hardware specific address. */
2503 *Address
= ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 31:31) - (0 ? 31:31) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:31) - (0 ? 31:31) + 1))))))) << (0 ? 31:31))) | (((gctUINT32
) (0x0 & ((gctUINT32
) ((((1 ? 31:31) - (0 ? 31:31) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:31) - (0 ? 31:31) + 1))))))) << (0 ? 31:31)))
2504 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 30:0) - (0 ? 30:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 30:0) - (0 ? 30:0) + 1))))))) << (0 ? 30:0))) | (((gctUINT32
) ((gctUINT32
) (address
) & ((gctUINT32
) ((((1 ? 30:0) - (0 ? 30:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 30:0) - (0 ? 30:0) + 1))))))) << (0 ? 30:0)));
2507 gcmkFOOTER_ARG("*Address=0x%08x", *Address
);
2508 return gcvSTATUS_OK
;
2511 /* Return the status. */
2516 /*******************************************************************************
2518 ** gckHARDWARE_ConvertPhysical
2520 ** Convert a physical address into a hardware specific address.
2524 ** gckHARDWARE Hardware
2525 ** Pointer to an gckHARDWARE object.
2527 ** gctPHYS_ADDR Physical
2528 ** Physical address to convert.
2530 ** gctUINT32* Address
2531 ** Return hardware specific address.
2538 gckHARDWARE_ConvertPhysical(
2539 IN gckHARDWARE Hardware
,
2540 IN gctPHYS_ADDR Physical
,
2541 OUT gctUINT32
* Address
2546 gcmkHEADER_ARG("Hardware=0x%x Physical=0x%x", Hardware
, Physical
);
2548 /* Verify the arguments. */
2549 gcmkVERIFY_OBJECT(Hardware
, gcvOBJ_HARDWARE
);
2550 gcmkVERIFY_ARGUMENT(Physical
!= gcvNULL
);
2551 gcmkVERIFY_ARGUMENT(Address
!= gcvNULL
);
2553 address
= gcmPTR2INT(Physical
);
2555 /* Return hardware specific address. */
2556 *Address
= ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 31:31) - (0 ? 31:31) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:31) - (0 ? 31:31) + 1))))))) << (0 ? 31:31))) | (((gctUINT32
) (0x0 & ((gctUINT32
) ((((1 ? 31:31) - (0 ? 31:31) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:31) - (0 ? 31:31) + 1))))))) << (0 ? 31:31)))
2557 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 30:0) - (0 ? 30:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 30:0) - (0 ? 30:0) + 1))))))) << (0 ? 30:0))) | (((gctUINT32
) ((gctUINT32
) (address
) & ((gctUINT32
) ((((1 ? 30:0) - (0 ? 30:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 30:0) - (0 ? 30:0) + 1))))))) << (0 ? 30:0)));
2559 /* Return the status. */
2560 gcmkFOOTER_ARG("*Address=0x%08x", *Address
);
2561 return gcvSTATUS_OK
;
2564 /*******************************************************************************
2566 ** gckHARDWARE_Interrupt
2568 ** Process an interrupt.
2572 ** gckHARDWARE Hardware
2573 ** Pointer to an gckHARDWARE object.
2575 ** gctBOOL InterruptValid
2576 ** If gcvTRUE, this function will read the interrupt acknowledge
2577 ** register, stores the data, and return whether or not the interrupt
2578 ** is ours or not. If gcvFALSE, this functions will read the interrupt
2579 ** acknowledge register and combine it with any stored value to handle
2580 ** the event notifications.
2587 gckHARDWARE_Interrupt(
2588 IN gckHARDWARE Hardware
,
2589 IN gctBOOL InterruptValid
2596 gcmkHEADER_ARG("Hardware=0x%x InterruptValid=%d", Hardware
, InterruptValid
);
2598 /* Verify the arguments. */
2599 gcmkVERIFY_OBJECT(Hardware
, gcvOBJ_HARDWARE
);
2601 /* Extract gckEVENT object. */
2602 eventObj
= Hardware
->kernel
->eventObj
;
2603 gcmkVERIFY_OBJECT(eventObj
, gcvOBJ_EVENT
);
2607 /* Read AQIntrAcknowledge register. */
2609 gckOS_ReadRegisterEx(Hardware
->os
,
2614 if (data
& 0x80000000)
2616 gcmkONERROR(gckOS_Broadcast(Hardware
->os
,
2618 gcvBROADCAST_AXI_BUS_ERROR
));
2623 /* Not our interrupt. */
2624 status
= gcvSTATUS_NOT_OUR_INTERRUPT
;
2628 /* Inform gckEVENT of the interrupt. */
2629 status
= gckEVENT_Interrupt(eventObj
, data
& 0x7FFFFFFF);
2634 /* Handle events. */
2635 status
= gckEVENT_Notify(eventObj
, 0);
2639 /* Return the status. */
2644 /*******************************************************************************
2646 ** gckHARDWARE_QueryCommandBuffer
2648 ** Query the command buffer alignment and number of reserved bytes.
2652 ** gckHARDWARE Harwdare
2653 ** Pointer to an gckHARDWARE object.
2657 ** gctSIZE_T * Alignment
2658 ** Pointer to a variable receiving the alignment for each command.
2660 ** gctSIZE_T * ReservedHead
2661 ** Pointer to a variable receiving the number of reserved bytes at the
2662 ** head of each command buffer.
2664 ** gctSIZE_T * ReservedTail
2665 ** Pointer to a variable receiving the number of bytes reserved at the
2666 ** tail of each command buffer.
2669 gckHARDWARE_QueryCommandBuffer(
2670 IN gckHARDWARE Hardware
,
2671 OUT gctSIZE_T
* Alignment
,
2672 OUT gctSIZE_T
* ReservedHead
,
2673 OUT gctSIZE_T
* ReservedTail
2676 gcmkHEADER_ARG("Hardware=0x%x", Hardware
);
2678 /* Verify the arguments. */
2679 gcmkVERIFY_OBJECT(Hardware
, gcvOBJ_HARDWARE
);
2681 if (Alignment
!= gcvNULL
)
2683 /* Align every 8 bytes. */
2687 if (ReservedHead
!= gcvNULL
)
2689 /* Reserve space for SelectPipe(). */
2693 if (ReservedTail
!= gcvNULL
)
2695 /* Reserve space for Link(). */
2700 gcmkFOOTER_ARG("*Alignment=%lu *ReservedHead=%lu *ReservedTail=%lu",
2701 gcmOPT_VALUE(Alignment
), gcmOPT_VALUE(ReservedHead
),
2702 gcmOPT_VALUE(ReservedTail
));
2703 return gcvSTATUS_OK
;
2706 /*******************************************************************************
2708 ** gckHARDWARE_QuerySystemMemory
2710 ** Query the command buffer alignment and number of reserved bytes.
2714 ** gckHARDWARE Harwdare
2715 ** Pointer to an gckHARDWARE object.
2719 ** gctSIZE_T * SystemSize
2720 ** Pointer to a variable that receives the maximum size of the system
2723 ** gctUINT32 * SystemBaseAddress
2724 ** Poinetr to a variable that receives the base address for system
2728 gckHARDWARE_QuerySystemMemory(
2729 IN gckHARDWARE Hardware
,
2730 OUT gctSIZE_T
* SystemSize
,
2731 OUT gctUINT32
* SystemBaseAddress
2734 gcmkHEADER_ARG("Hardware=0x%x", Hardware
);
2736 /* Verify the arguments. */
2737 gcmkVERIFY_OBJECT(Hardware
, gcvOBJ_HARDWARE
);
2739 if (SystemSize
!= gcvNULL
)
2741 /* Maximum system memory can be 2GB. */
2742 *SystemSize
= 1U << 31;
2745 if (SystemBaseAddress
!= gcvNULL
)
2747 /* Set system memory base address. */
2748 *SystemBaseAddress
= ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 31:31) - (0 ? 31:31) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:31) - (0 ? 31:31) + 1))))))) << (0 ? 31:31))) | (((gctUINT32
) (0x0 & ((gctUINT32
) ((((1 ? 31:31) - (0 ? 31:31) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:31) - (0 ? 31:31) + 1))))))) << (0 ? 31:31)));
2752 gcmkFOOTER_ARG("*SystemSize=%lu *SystemBaseAddress=%lu",
2753 gcmOPT_VALUE(SystemSize
), gcmOPT_VALUE(SystemBaseAddress
));
2754 return gcvSTATUS_OK
;
2757 #if !defined(VIVANTE_NO_3D)
2758 /*******************************************************************************
2760 ** gckHARDWARE_QueryShaderCaps
2762 ** Query the shader capabilities.
2770 ** gctUINT * VertexUniforms
2771 ** Pointer to a variable receiving the number of uniforms in the vertex
2774 ** gctUINT * FragmentUniforms
2775 ** Pointer to a variable receiving the number of uniforms in the
2778 ** gctUINT * Varyings
2779 ** Pointer to a variable receiving the maimum number of varyings.
2782 gckHARDWARE_QueryShaderCaps(
2783 IN gckHARDWARE Hardware
,
2784 OUT gctUINT
* VertexUniforms
,
2785 OUT gctUINT
* FragmentUniforms
,
2786 OUT gctUINT
* Varyings
2789 gcmkHEADER_ARG("Hardware=0x%x VertexUniforms=0x%x "
2790 "FragmentUniforms=0x%x Varyings=0x%x",
2791 Hardware
, VertexUniforms
,
2792 FragmentUniforms
, Varyings
);
2794 if (VertexUniforms
!= gcvNULL
)
2796 /* Return the vs shader const count. */
2797 if (Hardware
->chipModel
< gcv4000
)
2799 *VertexUniforms
= 168;
2803 *VertexUniforms
= 256;
2807 if (FragmentUniforms
!= gcvNULL
)
2809 /* Return the ps shader const count. */
2810 if (Hardware
->chipModel
< gcv4000
)
2812 *FragmentUniforms
= 64;
2816 *FragmentUniforms
= 256;
2820 if (Varyings
!= gcvNULL
)
2822 /* Return the shader varyings count. */
2823 if (((((gctUINT32
) (Hardware
->chipMinorFeatures1
)) >> (0 ? 23:23) & ((gctUINT32
) ((((1 ? 23:23) - (0 ? 23:23) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:23) - (0 ? 23:23) + 1)))))) == (0x1 & ((gctUINT32
) ((((1 ? 23:23) - (0 ? 23:23) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:23) - (0 ? 23:23) + 1))))))))
2835 return gcvSTATUS_OK
;
2839 /*******************************************************************************
2841 ** gckHARDWARE_SetMMU
2843 ** Set the page table base address.
2847 ** gckHARDWARE Harwdare
2848 ** Pointer to an gckHARDWARE object.
2850 ** gctPOINTER Logical
2851 ** Logical address of the page table.
2859 IN gckHARDWARE Hardware
,
2860 IN gctPOINTER Logical
2864 gctUINT32 address
= 0;
2865 gctUINT32 baseAddress
;
2867 gcmkHEADER_ARG("Hardware=0x%x Logical=0x%x", Hardware
, Logical
);
2869 /* Verify the arguments. */
2870 gcmkVERIFY_OBJECT(Hardware
, gcvOBJ_HARDWARE
);
2871 gcmkVERIFY_ARGUMENT(Logical
!= gcvNULL
);
2873 /* Convert the logical address into an hardware address. */
2875 gckHARDWARE_ConvertLogical(Hardware
, Logical
, &address
));
2877 /* Also get the base address - we need a real physical address. */
2879 gckOS_GetBaseAddress(Hardware
->os
, &baseAddress
));
2881 gcmkTRACE_ZONE(gcvLEVEL_INFO
, gcvZONE_HARDWARE
,
2882 "Setting page table to 0x%08X",
2883 address
+ baseAddress
);
2885 /* Write the AQMemoryFePageTable register. */
2887 gckOS_WriteRegisterEx(Hardware
->os
,
2890 address
+ baseAddress
));
2892 /* Write the AQMemoryRaPageTable register. */
2894 gckOS_WriteRegisterEx(Hardware
->os
,
2897 address
+ baseAddress
));
2899 #ifndef VIVANTE_NO_3D
2900 /* Write the AQMemoryTxPageTable register. */
2902 gckOS_WriteRegisterEx(Hardware
->os
,
2905 address
+ baseAddress
));
2908 /* Write the AQMemoryPePageTable register. */
2910 gckOS_WriteRegisterEx(Hardware
->os
,
2913 address
+ baseAddress
));
2915 #ifndef VIVANTE_NO_3D
2916 /* Write the AQMemoryPezPageTable register. */
2918 gckOS_WriteRegisterEx(Hardware
->os
,
2921 address
+ baseAddress
));
2924 /* Return the status. */
2929 /* Return the status. */
2934 /*******************************************************************************
2936 ** gckHARDWARE_FlushMMU
2938 ** Flush the page table.
2942 ** gckHARDWARE Harwdare
2943 ** Pointer to an gckHARDWARE object.
2950 gckHARDWARE_FlushMMU(
2951 IN gckHARDWARE Hardware
2956 gctUINT32 reg
, flush
;
2957 gctUINT32_PTR buffer
;
2958 gctSIZE_T bufferSize
;
2959 gctBOOL commitEntered
= gcvFALSE
;
2960 gctPOINTER pointer
= gcvNULL
;
2962 gcmkHEADER_ARG("Hardware=0x%x", Hardware
);
2964 /* Verify the arguments. */
2965 gcmkVERIFY_OBJECT(Hardware
, gcvOBJ_HARDWARE
);
2967 /* Flush the memory controller. */
2968 if (Hardware
->mmuVersion
== 0)
2972 flush
= ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0))) | (((gctUINT32
) (0x1 & ((gctUINT32
) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0)))
2973 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 1:1) - (0 ? 1:1) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 1:1) - (0 ? 1:1) + 1))))))) << (0 ? 1:1))) | (((gctUINT32
) (0x1 & ((gctUINT32
) ((((1 ? 1:1) - (0 ? 1:1) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 1:1) - (0 ? 1:1) + 1))))))) << (0 ? 1:1)))
2974 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 2:2) - (0 ? 2:2) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 2:2) - (0 ? 2:2) + 1))))))) << (0 ? 2:2))) | (((gctUINT32
) (0x1 & ((gctUINT32
) ((((1 ? 2:2) - (0 ? 2:2) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 2:2) - (0 ? 2:2) + 1))))))) << (0 ? 2:2)))
2975 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 3:3) - (0 ? 3:3) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 3:3) - (0 ? 3:3) + 1))))))) << (0 ? 3:3))) | (((gctUINT32
) (0x1 & ((gctUINT32
) ((((1 ? 3:3) - (0 ? 3:3) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 3:3) - (0 ? 3:3) + 1))))))) << (0 ? 3:3)))
2976 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 4:4) - (0 ? 4:4) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 4:4) - (0 ? 4:4) + 1))))))) << (0 ? 4:4))) | (((gctUINT32
) (0x1 & ((gctUINT32
) ((((1 ? 4:4) - (0 ? 4:4) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 4:4) - (0 ? 4:4) + 1))))))) << (0 ? 4:4)));
2982 flush
= (((((gctUINT32
) (~0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 4:4) - (0 ? 4:4) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 4:4) - (0 ? 4:4) + 1))))))) << (0 ? 4:4))) | (((gctUINT32
) (0x1 & ((gctUINT32
) ((((1 ? 4:4) - (0 ? 4:4) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 4:4) - (0 ? 4:4) + 1))))))) << (0 ? 4:4))) & ((((gctUINT32
) (~0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 7:7) - (0 ? 7:7) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 7:7) - (0 ? 7:7) + 1))))))) << (0 ? 7:7))) | (((gctUINT32
) (0x0 & ((gctUINT32
) ((((1 ? 7:7) - (0 ? 7:7) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 7:7) - (0 ? 7:7) + 1))))))) << (0 ? 7:7))) );
2985 /* Verify the gckCOMMAND object pointer. */
2986 command
= Hardware
->kernel
->command
;
2988 /* Acquire the command queue. */
2989 gcmkONERROR(gckCOMMAND_EnterCommit(command
, gcvFALSE
));
2990 commitEntered
= gcvTRUE
;
2992 gcmkONERROR(gckCOMMAND_Reserve(
2993 command
, 8, &pointer
, &bufferSize
2999 = ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))) | (((gctUINT32
) (0x01 & ((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
3000 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0))) | (((gctUINT32
) ((gctUINT32
) (reg
) & ((gctUINT32
) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
3001 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 25:16) - (0 ? 25:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16))) | (((gctUINT32
) ((gctUINT32
) (1) & ((gctUINT32
) ((((1 ? 25:16) - (0 ? 25:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16)));
3005 gcmkTRACE_ZONE(gcvLEVEL_INFO
, gcvZONE_HARDWARE
,
3006 "0x%x: FLUSH MMU(loadstate reg 0x%04x with 0x%08x)", buffer
, reg
, flush
);
3008 gcmkONERROR(gckCOMMAND_Execute(command
, 8));
3010 /* Release the command queue. */
3011 gcmkONERROR(gckCOMMAND_ExitCommit(command
, gcvFALSE
));
3012 commitEntered
= gcvFALSE
;
3016 return gcvSTATUS_OK
;
3021 /* Release the command queue mutex. */
3022 gcmkVERIFY_OK(gckCOMMAND_ExitCommit(Hardware
->kernel
->command
,
3026 /* Return the status. */
3031 /*******************************************************************************
3033 ** gckHARDWARE_SetMMUv2
3035 ** Set the page table base address.
3039 ** gckHARDWARE Harwdare
3040 ** Pointer to an gckHARDWARE object.
3047 gckHARDWARE_SetMMUv2(
3048 IN gckHARDWARE Hardware
,
3050 IN gctPOINTER MtlbAddress
,
3051 IN gceMMU_MODE Mode
,
3052 IN gctPOINTER SafeAddress
3056 gctUINT32 config
, address
;
3058 gctUINT32_PTR buffer
;
3059 gctSIZE_T bufferSize
;
3060 gctBOOL commitEntered
= gcvFALSE
;
3061 gctPOINTER pointer
= gcvNULL
;
3063 gcmkHEADER_ARG("Hardware=0x%x Enable=%d", Hardware
, Enable
);
3065 /* Verify the arguments. */
3066 gcmkVERIFY_OBJECT(Hardware
, gcvOBJ_HARDWARE
);
3068 /* Convert logical address into physical address. */
3070 gckOS_GetPhysicalAddress(Hardware
->os
, MtlbAddress
, &config
));
3073 gckOS_GetPhysicalAddress(Hardware
->os
, SafeAddress
, &address
));
3077 gcmkONERROR(gcvSTATUS_NOT_ALIGNED
);
3082 case gcvMMU_MODE_1K
:
3085 gcmkONERROR(gcvSTATUS_NOT_ALIGNED
);
3088 config
|= ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0))) | (((gctUINT32
) (0x1 & ((gctUINT32
) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0)));
3092 case gcvMMU_MODE_4K
:
3095 gcmkONERROR(gcvSTATUS_NOT_ALIGNED
);
3098 config
|= ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0))) | (((gctUINT32
) (0x0 & ((gctUINT32
) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0)));
3103 gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT
);
3106 /* Verify the gckCOMMAND object pointer. */
3107 command
= Hardware
->kernel
->command
;
3109 /* Acquire the command queue. */
3110 gcmkONERROR(gckCOMMAND_EnterCommit(command
, gcvFALSE
));
3111 commitEntered
= gcvTRUE
;
3113 gcmkONERROR(gckCOMMAND_Reserve(
3114 command
, 16, &pointer
, &bufferSize
3120 = ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))) | (((gctUINT32
) (0x01 & ((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
3121 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0))) | (((gctUINT32
) ((gctUINT32
) (0x0061) & ((gctUINT32
) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
3122 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 25:16) - (0 ? 25:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16))) | (((gctUINT32
) ((gctUINT32
) (1) & ((gctUINT32
) ((((1 ? 25:16) - (0 ? 25:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16)));
3127 = ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))) | (((gctUINT32
) (0x01 & ((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
3128 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0))) | (((gctUINT32
) ((gctUINT32
) (0x0060) & ((gctUINT32
) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
3129 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 25:16) - (0 ? 25:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16))) | (((gctUINT32
) ((gctUINT32
) (1) & ((gctUINT32
) ((((1 ? 25:16) - (0 ? 25:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16)));
3131 buffer
[3] = address
;
3133 gcmkTRACE_ZONE(gcvLEVEL_INFO
, gcvZONE_HARDWARE
,
3134 "Setup MMU: config=%08x, Safe Address=%08x\n.", config
, address
);
3136 gcmkONERROR(gckCOMMAND_Execute(command
, 16));
3138 /* Release the command queue. */
3139 gcmkONERROR(gckCOMMAND_ExitCommit(command
, gcvFALSE
));
3140 commitEntered
= gcvFALSE
;
3142 gcmkTRACE_ZONE(gcvLEVEL_INFO
, gcvZONE_HARDWARE
,
3143 "call gckCOMMAND_Stall to make sure the config is done.\n ");
3145 gcmkONERROR(gckCOMMAND_Stall(command
, gcvFALSE
));
3147 gcmkTRACE_ZONE(gcvLEVEL_INFO
, gcvZONE_HARDWARE
,
3148 "Enable MMU through GCREG_MMU_CONTROL.");
3152 gckOS_WriteRegisterEx(Hardware
->os
,
3155 ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0))) | (((gctUINT32
) ((gctUINT32
) (Enable
) & ((gctUINT32
) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0)))));
3157 gcmkTRACE_ZONE(gcvLEVEL_INFO
, gcvZONE_HARDWARE
,
3158 "call gckCOMMAND_Stall to check MMU available.\n");
3160 gcmkONERROR(gckCOMMAND_Stall(command
, gcvFALSE
));
3162 gcmkTRACE_ZONE(gcvLEVEL_INFO
, gcvZONE_HARDWARE
,
3163 "The MMU is available.\n");
3165 /* Return the status. */
3172 /* Release the command queue mutex. */
3173 gcmkVERIFY_OK(gckCOMMAND_ExitCommit(Hardware
->kernel
->command
,
3177 /* Return the status. */
3182 /*******************************************************************************
3184 ** gckHARDWARE_BuildVirtualAddress
3186 ** Build a virtual address.
3190 ** gckHARDWARE Harwdare
3191 ** Pointer to an gckHARDWARE object.
3194 ** Index into page table.
3197 ** Offset into page.
3201 ** gctUINT32 * Address
3202 ** Pointer to a variable receiving te hardware address.
3205 gckHARDWARE_BuildVirtualAddress(
3206 IN gckHARDWARE Hardware
,
3208 IN gctUINT32 Offset
,
3209 OUT gctUINT32
* Address
3212 gcmkHEADER_ARG("Hardware=0x%x Index=%u Offset=%u", Hardware
, Index
, Offset
);
3214 /* Verify the arguments. */
3215 gcmkVERIFY_OBJECT(Hardware
, gcvOBJ_HARDWARE
);
3216 gcmkVERIFY_ARGUMENT(Address
!= gcvNULL
);
3218 /* Build virtual address. */
3219 *Address
= ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 31:31) - (0 ? 31:31) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:31) - (0 ? 31:31) + 1))))))) << (0 ? 31:31))) | (((gctUINT32
) (0x1 & ((gctUINT32
) ((((1 ? 31:31) - (0 ? 31:31) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:31) - (0 ? 31:31) + 1))))))) << (0 ? 31:31)))
3220 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 30:0) - (0 ? 30:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 30:0) - (0 ? 30:0) + 1))))))) << (0 ? 30:0))) | (((gctUINT32
) ((gctUINT32
) (Offset
| (Index
<< 12)) & ((gctUINT32
) ((((1 ? 30:0) - (0 ? 30:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 30:0) - (0 ? 30:0) + 1))))))) << (0 ? 30:0)));
3223 gcmkFOOTER_ARG("*Address=0x%08x", *Address
);
3224 return gcvSTATUS_OK
;
3228 gckHARDWARE_GetIdle(
3229 IN gckHARDWARE Hardware
,
3231 OUT gctUINT32
* Data
3236 gctINT retry
, poll
, pollCount
;
3238 gcmkHEADER_ARG("Hardware=0x%x Wait=%d", Hardware
, Wait
);
3240 /* Verify the arguments. */
3241 gcmkVERIFY_OBJECT(Hardware
, gcvOBJ_HARDWARE
);
3242 gcmkVERIFY_ARGUMENT(Data
!= gcvNULL
);
3245 /* If we have to wait, try 100 polls per millisecond. */
3246 pollCount
= Wait
? 100 : 1;
3248 /* At most, try for 1 second. */
3249 for (retry
= 0; retry
< 1000; ++retry
)
3251 /* If we have to wait, try 100 polls per millisecond. */
3252 for (poll
= pollCount
; poll
> 0; --poll
)
3254 /* Read register. */
3256 gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x00004, &idle
));
3258 /* See if we have to wait for FE idle. */
3259 if ((((((gctUINT32
) (idle
)) >> (0 ? 0:0)) & ((gctUINT32
) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 0:0) - (0 ? 0:0) + 1)))))) ))
3266 /* Check if we need to wait for FE and FE is busy. */
3267 if (Wait
&& !(((((gctUINT32
) (idle
)) >> (0 ? 0:0)) & ((gctUINT32
) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 0:0) - (0 ? 0:0) + 1)))))) ))
3269 /* Wait a little. */
3270 gcmkTRACE_ZONE(gcvLEVEL_INFO
, gcvZONE_HARDWARE
,
3271 "%s: Waiting for idle: 0x%08X",
3272 __FUNCTION__
, idle
);
3274 gcmkVERIFY_OK(gckOS_Delay(Hardware
->os
, 1));
3282 /* Return idle to caller. */
3286 gcmkFOOTER_ARG("*Data=0x%08x", *Data
);
3287 return gcvSTATUS_OK
;
3290 /* Return the status. */
3295 /* Flush the caches. */
3298 IN gckHARDWARE Hardware
,
3299 IN gceKERNEL_FLUSH Flush
,
3300 IN gctPOINTER Logical
,
3301 IN OUT gctSIZE_T
* Bytes
3305 gctUINT32 flush
= 0;
3306 gctUINT32_PTR logical
= (gctUINT32_PTR
) Logical
;
3309 gcmkHEADER_ARG("Hardware=0x%x Flush=0x%x Logical=0x%x *Bytes=%lu",
3310 Hardware
, Flush
, Logical
, gcmOPT_VALUE(Bytes
));
3312 /* Verify the arguments. */
3313 gcmkVERIFY_OBJECT(Hardware
, gcvOBJ_HARDWARE
);
3315 /* Get current pipe. */
3316 pipe
= Hardware
->kernel
->command
->pipeSelect
;
3318 /* Flush 3D color cache. */
3319 if ((Flush
& gcvFLUSH_COLOR
) && (pipe
== 0x0))
3321 flush
|= ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 1:1) - (0 ? 1:1) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 1:1) - (0 ? 1:1) + 1))))))) << (0 ? 1:1))) | (((gctUINT32
) (0x1 & ((gctUINT32
) ((((1 ? 1:1) - (0 ? 1:1) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 1:1) - (0 ? 1:1) + 1))))))) << (0 ? 1:1)));
3324 /* Flush 3D depth cache. */
3325 if ((Flush
& gcvFLUSH_DEPTH
) && (pipe
== 0x0))
3327 flush
|= ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0))) | (((gctUINT32
) (0x1 & ((gctUINT32
) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0)));
3330 /* Flush 3D texture cache. */
3331 if ((Flush
& gcvFLUSH_TEXTURE
) && (pipe
== 0x0))
3333 flush
|= ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 2:2) - (0 ? 2:2) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 2:2) - (0 ? 2:2) + 1))))))) << (0 ? 2:2))) | (((gctUINT32
) (0x1 & ((gctUINT32
) ((((1 ? 2:2) - (0 ? 2:2) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 2:2) - (0 ? 2:2) + 1))))))) << (0 ? 2:2)));
3336 /* Flush 2D cache. */
3337 if ((Flush
& gcvFLUSH_2D
) && (pipe
== 0x1))
3339 flush
|= ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 3:3) - (0 ? 3:3) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 3:3) - (0 ? 3:3) + 1))))))) << (0 ? 3:3))) | (((gctUINT32
) (0x1 & ((gctUINT32
) ((((1 ? 3:3) - (0 ? 3:3) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 3:3) - (0 ? 3:3) + 1))))))) << (0 ? 3:3)));
3342 /* See if there is a valid flush. */
3345 if (Bytes
!= gcvNULL
)
3347 /* No bytes required. */
3354 /* Copy to command queue. */
3355 if (Logical
!= gcvNULL
)
3359 /* Command queue too small. */
3360 gcmkONERROR(gcvSTATUS_BUFFER_TOO_SMALL
);
3363 /* Append LOAD_STATE to AQFlush. */
3364 logical
[0] = ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))) | (((gctUINT32
) (0x01 & ((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
3365 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0))) | (((gctUINT32
) ((gctUINT32
) (0x0E03) & ((gctUINT32
) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
3366 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 25:16) - (0 ? 25:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16))) | (((gctUINT32
) ((gctUINT32
) (1) & ((gctUINT32
) ((((1 ? 25:16) - (0 ? 25:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16)));
3370 gcmkTRACE_ZONE(gcvLEVEL_INFO
, gcvZONE_HARDWARE
,
3371 "0x%x: FLUSH 0x%x", logical
, flush
);
3374 if (Bytes
!= gcvNULL
)
3376 /* 8 bytes required. */
3382 gcmkFOOTER_ARG("*Bytes=%lu", gcmOPT_VALUE(Bytes
));
3383 return gcvSTATUS_OK
;
3386 /* Return the status. */
3392 gckHARDWARE_SetFastClear(
3393 IN gckHARDWARE Hardware
,
3395 IN gctINT Compression
3398 #ifndef VIVANTE_NO_3D
3402 gcmkHEADER_ARG("Hardware=0x%x Enable=%d Compression=%d",
3403 Hardware
, Enable
, Compression
);
3405 /* Only process if fast clear is available. */
3406 if ((((((gctUINT32
) (Hardware
->chipFeatures
)) >> (0 ? 0:0)) & ((gctUINT32
) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 0:0) - (0 ? 0:0) + 1)))))) ))
3410 /* Determine automatic value for fast clear. */
3411 Enable
= ((Hardware
->chipModel
!= gcv500
)
3412 || (Hardware
->chipRevision
>= 3)
3416 if (Compression
== -1)
3418 /* Determine automatic value for compression. */
3419 Compression
= Enable
3420 & (((((gctUINT32
) (Hardware
->chipFeatures
)) >> (0 ? 5:5)) & ((gctUINT32
) ((((1 ? 5:5) - (0 ? 5:5) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 5:5) - (0 ? 5:5) + 1)))))) );
3423 /* Read AQMemoryDebug register. */
3425 gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x00414, &debug
));
3427 /* Set fast clear bypass. */
3428 debug
= ((((gctUINT32
) (debug
)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 20:20) - (0 ? 20:20) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 20:20) - (0 ? 20:20) + 1))))))) << (0 ? 20:20))) | (((gctUINT32
) ((gctUINT32
) (Enable
== 0) & ((gctUINT32
) ((((1 ? 20:20) - (0 ? 20:20) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 20:20) - (0 ? 20:20) + 1))))))) << (0 ? 20:20)));
3430 /* Set compression bypass. */
3431 debug
= ((((gctUINT32
) (debug
)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 21:21) - (0 ? 21:21) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 21:21) - (0 ? 21:21) + 1))))))) << (0 ? 21:21))) | (((gctUINT32
) ((gctUINT32
) (Compression
== 0) & ((gctUINT32
) ((((1 ? 21:21) - (0 ? 21:21) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 21:21) - (0 ? 21:21) + 1))))))) << (0 ? 21:21)));
3433 /* Write back AQMemoryDebug register. */
3435 gckOS_WriteRegisterEx(Hardware
->os
,
3440 /* Store fast clear and comprersison flags. */
3441 Hardware
->allowFastClear
= Enable
;
3442 Hardware
->allowCompression
= Compression
;
3444 gcmkTRACE_ZONE(gcvLEVEL_INFO
, gcvZONE_HARDWARE
,
3445 "FastClear=%d Compression=%d", Enable
, Compression
);
3450 return gcvSTATUS_OK
;
3453 /* Return the status. */
3457 return gcvSTATUS_OK
;
3463 gcvPOWER_FLAG_INITIALIZE
= 1 << 0,
3464 gcvPOWER_FLAG_STALL
= 1 << 1,
3465 gcvPOWER_FLAG_STOP
= 1 << 2,
3466 gcvPOWER_FLAG_START
= 1 << 3,
3467 gcvPOWER_FLAG_RELEASE
= 1 << 4,
3468 gcvPOWER_FLAG_DELAY
= 1 << 5,
3469 gcvPOWER_FLAG_SAVE
= 1 << 6,
3470 gcvPOWER_FLAG_ACQUIRE
= 1 << 7,
3471 gcvPOWER_FLAG_POWER_OFF
= 1 << 8,
3472 gcvPOWER_FLAG_CLOCK_OFF
= 1 << 9,
3473 gcvPOWER_FLAG_CLOCK_ON
= 1 << 10,
3477 #if gcmIS_DEBUG(gcdDEBUG_TRACE) && gcdPOWER_MANAGEMENT
3478 static gctCONST_STRING
3479 _PowerEnum(gceCHIPPOWERSTATE State
)
3481 const gctCONST_STRING states
[] =
3483 gcmSTRING(gcvPOWER_ON
),
3484 gcmSTRING(gcvPOWER_OFF
),
3485 gcmSTRING(gcvPOWER_IDLE
),
3486 gcmSTRING(gcvPOWER_SUSPEND
),
3487 gcmSTRING(gcvPOWER_SUSPEND_ATPOWERON
),
3488 gcmSTRING(gcvPOWER_OFF_ATPOWERON
),
3489 gcmSTRING(gcvPOWER_IDLE_BROADCAST
),
3490 gcmSTRING(gcvPOWER_SUSPEND_BROADCAST
),
3491 gcmSTRING(gcvPOWER_OFF_BROADCAST
),
3492 gcmSTRING(gcvPOWER_OFF_RECOVERY
),
3493 gcmSTRING(gcvPOWER_ON_AUTO
)
3496 if ((State
>= gcvPOWER_ON
) && (State
<= gcvPOWER_ON_AUTO
))
3498 return states
[State
- gcvPOWER_ON
];
3505 /*******************************************************************************
3507 ** gckHARDWARE_SetPowerManagementState
3509 ** Set GPU to a specified power state.
3513 ** gckHARDWARE Harwdare
3514 ** Pointer to an gckHARDWARE object.
3516 ** gceCHIPPOWERSTATE State
3521 gckHARDWARE_SetPowerManagementState(
3522 IN gckHARDWARE Hardware
,
3523 IN gceCHIPPOWERSTATE State
3526 #if gcdPOWER_MANAGEMENT
3528 gckCOMMAND command
= gcvNULL
;
3530 gctUINT flag
, clock
;
3532 gctSIZE_T bytes
, requested
;
3533 gctBOOL acquired
= gcvFALSE
;
3534 gctBOOL mutexAcquired
= gcvFALSE
;
3535 gctBOOL stall
= gcvTRUE
;
3536 gctBOOL broadcast
= gcvFALSE
;
3537 #if gcdPOWEROFF_TIMEOUT
3538 gctBOOL timeout
= gcvFALSE
;
3539 gctBOOL isAfter
= gcvFALSE
;
3540 gctUINT32 currentTime
;
3542 gctUINT32 process
, thread
;
3543 gctBOOL commitEntered
= gcvFALSE
;
3544 #if gcdENABLE_PROFILING
3545 gctUINT64 time
, freq
, mutexTime
, onTime
, stallTime
, stopTime
, delayTime
,
3546 initTime
, offTime
, startTime
, totalTime
;
3548 gctBOOL global
= gcvFALSE
;
3549 gctBOOL globalAcquired
= gcvFALSE
;
3551 /* State transition flags. */
3552 static const gctUINT flags
[4][4] =
3556 /* OFF */ gcvPOWER_FLAG_ACQUIRE
|
3557 gcvPOWER_FLAG_STALL
|
3558 gcvPOWER_FLAG_STOP
|
3559 gcvPOWER_FLAG_POWER_OFF
|
3560 gcvPOWER_FLAG_CLOCK_OFF
,
3561 /* IDLE */ gcvPOWER_FLAG_ACQUIRE
|
3562 gcvPOWER_FLAG_STALL
,
3563 /* SUSPEND */ gcvPOWER_FLAG_ACQUIRE
|
3564 gcvPOWER_FLAG_STALL
|
3565 gcvPOWER_FLAG_STOP
|
3566 gcvPOWER_FLAG_CLOCK_OFF
,
3570 { /* ON */ gcvPOWER_FLAG_INITIALIZE
|
3571 gcvPOWER_FLAG_START
|
3572 gcvPOWER_FLAG_RELEASE
|
3573 gcvPOWER_FLAG_DELAY
,
3575 /* IDLE */ gcvPOWER_FLAG_INITIALIZE
|
3576 gcvPOWER_FLAG_START
|
3577 gcvPOWER_FLAG_DELAY
,
3578 /* SUSPEND */ gcvPOWER_FLAG_INITIALIZE
|
3579 gcvPOWER_FLAG_CLOCK_OFF
,
3583 { /* ON */ gcvPOWER_FLAG_RELEASE
,
3584 /* OFF */ gcvPOWER_FLAG_STOP
|
3585 gcvPOWER_FLAG_POWER_OFF
|
3586 gcvPOWER_FLAG_CLOCK_OFF
,
3588 /* SUSPEND */ gcvPOWER_FLAG_STOP
|
3589 gcvPOWER_FLAG_CLOCK_OFF
,
3592 /* gcvPOWER_SUSPEND */
3593 { /* ON */ gcvPOWER_FLAG_START
|
3594 gcvPOWER_FLAG_RELEASE
|
3595 gcvPOWER_FLAG_DELAY
|
3596 gcvPOWER_FLAG_CLOCK_ON
,
3597 /* OFF */ gcvPOWER_FLAG_SAVE
|
3598 gcvPOWER_FLAG_POWER_OFF
|
3599 gcvPOWER_FLAG_CLOCK_OFF
,
3600 /* IDLE */ gcvPOWER_FLAG_START
|
3601 gcvPOWER_FLAG_DELAY
|
3602 gcvPOWER_FLAG_CLOCK_ON
,
3608 static const gctUINT clocks
[4] =
3611 ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0))) | (((gctUINT32
) ((gctUINT32
) (0) & ((gctUINT32
) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0))) |
3612 ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 1:1) - (0 ? 1:1) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 1:1) - (0 ? 1:1) + 1))))))) << (0 ? 1:1))) | (((gctUINT32
) ((gctUINT32
) (0) & ((gctUINT32
) ((((1 ? 1:1) - (0 ? 1:1) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 1:1) - (0 ? 1:1) + 1))))))) << (0 ? 1:1))) |
3613 ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 8:2) - (0 ? 8:2) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 8:2) - (0 ? 8:2) + 1))))))) << (0 ? 8:2))) | (((gctUINT32
) ((gctUINT32
) (64) & ((gctUINT32
) ((((1 ? 8:2) - (0 ? 8:2) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 8:2) - (0 ? 8:2) + 1))))))) << (0 ? 8:2))) |
3614 ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 9:9) - (0 ? 9:9) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 9:9) - (0 ? 9:9) + 1))))))) << (0 ? 9:9))) | (((gctUINT32
) ((gctUINT32
) (1) & ((gctUINT32
) ((((1 ? 9:9) - (0 ? 9:9) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 9:9) - (0 ? 9:9) + 1))))))) << (0 ? 9:9))),
3617 ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0))) | (((gctUINT32
) ((gctUINT32
) (1) & ((gctUINT32
) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0))) |
3618 ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 1:1) - (0 ? 1:1) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 1:1) - (0 ? 1:1) + 1))))))) << (0 ? 1:1))) | (((gctUINT32
) ((gctUINT32
) (1) & ((gctUINT32
) ((((1 ? 1:1) - (0 ? 1:1) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 1:1) - (0 ? 1:1) + 1))))))) << (0 ? 1:1))) |
3619 ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 8:2) - (0 ? 8:2) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 8:2) - (0 ? 8:2) + 1))))))) << (0 ? 8:2))) | (((gctUINT32
) ((gctUINT32
) (1) & ((gctUINT32
) ((((1 ? 8:2) - (0 ? 8:2) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 8:2) - (0 ? 8:2) + 1))))))) << (0 ? 8:2))) |
3620 ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 9:9) - (0 ? 9:9) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 9:9) - (0 ? 9:9) + 1))))))) << (0 ? 9:9))) | (((gctUINT32
) ((gctUINT32
) (1) & ((gctUINT32
) ((((1 ? 9:9) - (0 ? 9:9) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 9:9) - (0 ? 9:9) + 1))))))) << (0 ? 9:9))),
3623 ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0))) | (((gctUINT32
) ((gctUINT32
) (0) & ((gctUINT32
) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0))) |
3624 ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 1:1) - (0 ? 1:1) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 1:1) - (0 ? 1:1) + 1))))))) << (0 ? 1:1))) | (((gctUINT32
) ((gctUINT32
) (0) & ((gctUINT32
) ((((1 ? 1:1) - (0 ? 1:1) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 1:1) - (0 ? 1:1) + 1))))))) << (0 ? 1:1))) |
3625 ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 8:2) - (0 ? 8:2) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 8:2) - (0 ? 8:2) + 1))))))) << (0 ? 8:2))) | (((gctUINT32
) ((gctUINT32
) (1) & ((gctUINT32
) ((((1 ? 8:2) - (0 ? 8:2) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 8:2) - (0 ? 8:2) + 1))))))) << (0 ? 8:2))) |
3626 ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 9:9) - (0 ? 9:9) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 9:9) - (0 ? 9:9) + 1))))))) << (0 ? 9:9))) | (((gctUINT32
) ((gctUINT32
) (1) & ((gctUINT32
) ((((1 ? 9:9) - (0 ? 9:9) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 9:9) - (0 ? 9:9) + 1))))))) << (0 ? 9:9))),
3628 /* gcvPOWER_SUSPEND */
3629 ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0))) | (((gctUINT32
) ((gctUINT32
) (1) & ((gctUINT32
) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0))) |
3630 ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 1:1) - (0 ? 1:1) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 1:1) - (0 ? 1:1) + 1))))))) << (0 ? 1:1))) | (((gctUINT32
) ((gctUINT32
) (1) & ((gctUINT32
) ((((1 ? 1:1) - (0 ? 1:1) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 1:1) - (0 ? 1:1) + 1))))))) << (0 ? 1:1))) |
3631 ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 8:2) - (0 ? 8:2) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 8:2) - (0 ? 8:2) + 1))))))) << (0 ? 8:2))) | (((gctUINT32
) ((gctUINT32
) (1) & ((gctUINT32
) ((((1 ? 8:2) - (0 ? 8:2) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 8:2) - (0 ? 8:2) + 1))))))) << (0 ? 8:2))) |
3632 ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 9:9) - (0 ? 9:9) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 9:9) - (0 ? 9:9) + 1))))))) << (0 ? 9:9))) | (((gctUINT32
) ((gctUINT32
) (1) & ((gctUINT32
) ((((1 ? 9:9) - (0 ? 9:9) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 9:9) - (0 ? 9:9) + 1))))))) << (0 ? 9:9))),
3635 gcmkHEADER_ARG("Hardware=0x%x State=%d", Hardware
, State
);
3636 #if gcmIS_DEBUG(gcdDEBUG_TRACE)
3637 gcmkTRACE_ZONE(gcvLEVEL_INFO
, gcvZONE_HARDWARE
,
3638 "Switching to power state %d(%s)",
3639 State
, _PowerEnum(State
));
3642 /* Verify the arguments. */
3643 gcmkVERIFY_OBJECT(Hardware
, gcvOBJ_HARDWARE
);
3645 /* Get the gckOS object pointer. */
3647 gcmkVERIFY_OBJECT(os
, gcvOBJ_OS
);
3649 /* Get the gckCOMMAND object pointer. */
3650 gcmkVERIFY_OBJECT(Hardware
->kernel
, gcvOBJ_KERNEL
);
3651 command
= Hardware
->kernel
->command
;
3652 gcmkVERIFY_OBJECT(command
, gcvOBJ_COMMAND
);
3654 /* Start profiler. */
3655 gcmkPROFILE_INIT(freq
, time
);
3657 /* Convert the broadcast power state. */
3660 case gcvPOWER_SUSPEND_ATPOWERON
:
3661 /* Convert to SUSPEND and don't wait for STALL. */
3662 State
= gcvPOWER_SUSPEND
;
3666 case gcvPOWER_OFF_ATPOWERON
:
3667 /* Convert to OFF and don't wait for STALL. */
3668 State
= gcvPOWER_OFF
;
3672 case gcvPOWER_IDLE_BROADCAST
:
3673 /* Convert to IDLE and note we are inside broadcast. */
3674 State
= gcvPOWER_IDLE
;
3675 broadcast
= gcvTRUE
;
3678 case gcvPOWER_SUSPEND_BROADCAST
:
3679 /* Convert to SUSPEND and note we are inside broadcast. */
3680 State
= gcvPOWER_SUSPEND
;
3681 broadcast
= gcvTRUE
;
3684 case gcvPOWER_OFF_BROADCAST
:
3685 /* Convert to OFF and note we are inside broadcast. */
3686 State
= gcvPOWER_OFF
;
3687 broadcast
= gcvTRUE
;
3690 case gcvPOWER_OFF_RECOVERY
:
3691 /* Convert to OFF and note we are inside recovery. */
3692 State
= gcvPOWER_OFF
;
3694 broadcast
= gcvTRUE
;
3697 case gcvPOWER_ON_AUTO
:
3698 /* Convert to ON and note we are inside recovery. */
3699 State
= gcvPOWER_ON
;
3704 case gcvPOWER_SUSPEND
:
3706 /* Mark as global power management. */
3710 #if gcdPOWEROFF_TIMEOUT
3711 case gcvPOWER_OFF_TIMEOUT
:
3712 /* Convert to OFF and note we are inside broadcast. */
3713 State
= gcvPOWER_OFF
;
3714 broadcast
= gcvTRUE
;
3715 /* Check time out */
3724 /* Get current process and thread IDs. */
3725 gcmkONERROR(gckOS_GetProcessID(&process
));
3726 gcmkONERROR(gckOS_GetThreadID(&thread
));
3730 /* Try to acquire the power mutex. */
3731 status
= gckOS_AcquireMutex(os
, Hardware
->powerMutex
, 0);
3733 if (status
== gcvSTATUS_TIMEOUT
)
3735 /* Check if we already own this mutex. */
3736 if ((Hardware
->powerProcess
== process
)
3737 && (Hardware
->powerThread
== thread
)
3740 /* Bail out on recursive power management. */
3742 return gcvSTATUS_OK
;
3744 else if (State
== gcvPOWER_IDLE
)
3746 /* gcvPOWER_IDLE_BROADCAST is from IST,
3747 ** so waiting here will cause deadlock,
3748 ** if lock holder call gckCOMMAND_Stall() */
3749 gcmkONERROR(gcvSTATUS_INVALID_REQUEST
);
3753 /* Acquire the power mutex. */
3754 gcmkONERROR(gckOS_AcquireMutex(os
,
3755 Hardware
->powerMutex
,
3762 /* Acquire the power mutex. */
3763 gcmkONERROR(gckOS_AcquireMutex(os
, Hardware
->powerMutex
, gcvINFINITE
));
3766 /* Get time until mtuex acquired. */
3767 gcmkPROFILE_QUERY(time
, mutexTime
);
3769 Hardware
->powerProcess
= process
;
3770 Hardware
->powerThread
= thread
;
3771 mutexAcquired
= gcvTRUE
;
3773 /* Grab control flags and clock. */
3774 flag
= flags
[Hardware
->chipPowerState
][State
];
3775 clock
= clocks
[State
];
3777 #if gcdPOWEROFF_TIMEOUT
3780 gcmkONERROR(gckOS_GetTicks(¤tTime
));
3783 gckOS_TicksAfter(Hardware
->powerOffTime
, currentTime
, &isAfter
));
3785 if (isAfter
|| Hardware
->chipPowerState
!= gcvPOWER_IDLE
)
3787 /* Release the power mutex. */
3788 gcmkONERROR(gckOS_ReleaseMutex(os
, Hardware
->powerMutex
));
3790 /* No need to do anything. */
3792 return gcvSTATUS_OK
;
3795 gcmkTRACE_ZONE(gcvLEVEL_INFO
, gcvZONE_HARDWARE
,
3796 "Power Off GPU at %i [supposed to be at %i]",
3797 currentTime
, Hardware
->powerOffTime
);
3803 /* Release the power mutex. */
3804 gcmkONERROR(gckOS_ReleaseMutex(os
, Hardware
->powerMutex
));
3806 /* No need to do anything. */
3808 return gcvSTATUS_OK
;
3811 /* If this is an internal power management, we have to check if we can grab
3812 ** the global power semaphore. If we cannot, we have to wait until the
3813 ** external world changes power management. */
3816 /* Try to acquire the global semaphore. */
3817 status
= gckOS_TryAcquireSemaphore(os
, Hardware
->globalSemaphore
);
3818 if (status
== gcvSTATUS_TIMEOUT
)
3820 /* Release the power mutex. */
3821 gcmkTRACE_ZONE(gcvLEVEL_INFO
, gcvZONE_HARDWARE
,
3822 "Releasing the power mutex.");
3823 gcmkONERROR(gckOS_ReleaseMutex(os
, Hardware
->powerMutex
));
3824 mutexAcquired
= gcvFALSE
;
3826 /* Wait for the semaphore. */
3827 gcmkTRACE_ZONE(gcvLEVEL_INFO
, gcvZONE_HARDWARE
,
3828 "Waiting for global semaphore.");
3829 gcmkONERROR(gckOS_AcquireSemaphore(os
, Hardware
->globalSemaphore
));
3830 globalAcquired
= gcvTRUE
;
3832 /* Acquire the power mutex. */
3833 gcmkTRACE_ZONE(gcvLEVEL_INFO
, gcvZONE_HARDWARE
,
3834 "Reacquiring the power mutex.");
3835 gcmkONERROR(gckOS_AcquireMutex(os
,
3836 Hardware
->powerMutex
,
3838 mutexAcquired
= gcvTRUE
;
3843 gcmkONERROR(status
);
3846 /* Release the global semaphore again. */
3847 gcmkONERROR(gckOS_ReleaseSemaphore(os
, Hardware
->globalSemaphore
));
3848 globalAcquired
= gcvFALSE
;
3851 if (flag
& (gcvPOWER_FLAG_INITIALIZE
| gcvPOWER_FLAG_CLOCK_ON
))
3853 /* Turn on the power. */
3854 gcmkONERROR(gckOS_SetGPUPower(os
, gcvTRUE
, gcvTRUE
));
3856 /* Mark clock and power as enabled. */
3857 Hardware
->clockState
= gcvTRUE
;
3858 Hardware
->powerState
= gcvTRUE
;
3861 /* Get time until powered on. */
3862 gcmkPROFILE_QUERY(time
, onTime
);
3864 if ((flag
& gcvPOWER_FLAG_STALL
) && stall
)
3869 /* Check commit atom. */
3870 gcmkONERROR(gckOS_AtomGet(os
, command
->atomCommit
, &atomValue
));
3874 /* Commits are pending - abort power management. */
3875 status
= broadcast
? gcvSTATUS_CHIP_NOT_READY
3876 : gcvSTATUS_MORE_DATA
;
3882 /* Check for idle. */
3883 gcmkONERROR(gckHARDWARE_QueryIdle(Hardware
, &idle
));
3887 status
= gcvSTATUS_CHIP_NOT_READY
;
3894 /* Acquire the command queue. */
3895 gcmkONERROR(gckCOMMAND_EnterCommit(command
, gcvTRUE
));
3896 commitEntered
= gcvTRUE
;
3898 /* Get the size of the flush command. */
3899 gcmkONERROR(gckHARDWARE_Flush(Hardware
,
3904 /* Reserve space in the command queue. */
3905 gcmkONERROR(gckCOMMAND_Reserve(command
,
3910 /* Append a flush. */
3911 gcmkONERROR(gckHARDWARE_Flush(
3912 Hardware
, gcvFLUSH_ALL
, buffer
, &bytes
3915 /* Execute the command queue. */
3916 gcmkONERROR(gckCOMMAND_Execute(command
, requested
));
3918 /* Release the command queue. */
3919 gcmkONERROR(gckCOMMAND_ExitCommit(command
, gcvTRUE
));
3920 commitEntered
= gcvFALSE
;
3922 /* Wait to finish all commands. */
3923 gcmkONERROR(gckCOMMAND_Stall(command
, gcvTRUE
));
3927 /* Get time until stalled. */
3928 gcmkPROFILE_QUERY(time
, stallTime
);
3930 if (flag
& gcvPOWER_FLAG_ACQUIRE
)
3932 /* Acquire the power management semaphore. */
3933 gcmkONERROR(gckOS_AcquireSemaphore(os
, command
->powerSemaphore
));
3938 /* Acquire the global semaphore. */
3939 gcmkONERROR(gckOS_AcquireSemaphore(os
, Hardware
->globalSemaphore
));
3940 globalAcquired
= gcvTRUE
;
3944 if (flag
& gcvPOWER_FLAG_STOP
)
3946 /* Stop the command parser. */
3947 gcmkONERROR(gckCOMMAND_Stop(command
));
3950 gcmkONERROR(Hardware
->stopIsr(Hardware
->isrContext
));
3953 /* Get time until stopped. */
3954 gcmkPROFILE_QUERY(time
, stopTime
);
3956 /* Only process this when hardware is enabled. */
3957 if (Hardware
->clockState
&& Hardware
->powerState
)
3959 /* Write the clock control register. */
3960 gcmkONERROR(gckOS_WriteRegisterEx(os
,
3965 /* Done loading the frequency scaler. */
3966 gcmkONERROR(gckOS_WriteRegisterEx(os
,
3969 ((((gctUINT32
) (clock
)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 9:9) - (0 ? 9:9) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 9:9) - (0 ? 9:9) + 1))))))) << (0 ? 9:9))) | (((gctUINT32
) ((gctUINT32
) (0) & ((gctUINT32
) ((((1 ? 9:9) - (0 ? 9:9) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 9:9) - (0 ? 9:9) + 1))))))) << (0 ? 9:9)))));
3972 if (flag
& gcvPOWER_FLAG_DELAY
)
3974 /* Wait for the specified amount of time to settle coming back from
3975 ** power-off or suspend state. */
3976 gcmkONERROR(gckOS_Delay(os
, gcdPOWER_CONTROL_DELAY
));
3979 /* Get time until delayed. */
3980 gcmkPROFILE_QUERY(time
, delayTime
);
3982 if (flag
& gcvPOWER_FLAG_INITIALIZE
)
3984 /* Initialize hardware. */
3985 gcmkONERROR(gckHARDWARE_InitializeHardware(Hardware
));
3987 gcmkONERROR(gckHARDWARE_SetFastClear(Hardware
,
3988 Hardware
->allowFastClear
,
3989 Hardware
->allowCompression
));
3991 /* Force the command queue to reload the next context. */
3992 command
->currContext
= gcvNULL
;
3995 /* Get time until initialized. */
3996 gcmkPROFILE_QUERY(time
, initTime
);
3998 if (flag
& (gcvPOWER_FLAG_POWER_OFF
| gcvPOWER_FLAG_CLOCK_OFF
))
4000 /* Turn off the GPU power. */
4002 gckOS_SetGPUPower(os
,
4003 (flag
& gcvPOWER_FLAG_CLOCK_OFF
) ? gcvFALSE
4005 (flag
& gcvPOWER_FLAG_POWER_OFF
) ? gcvFALSE
4008 /* Save current hardware power and clock states. */
4009 Hardware
->clockState
= (flag
& gcvPOWER_FLAG_CLOCK_OFF
) ? gcvFALSE
4011 Hardware
->powerState
= (flag
& gcvPOWER_FLAG_POWER_OFF
) ? gcvFALSE
4015 /* Get time until off. */
4016 gcmkPROFILE_QUERY(time
, offTime
);
4018 if (flag
& gcvPOWER_FLAG_START
)
4020 /* Start the command processor. */
4021 gcmkONERROR(gckCOMMAND_Start(command
));
4023 /* Start the Isr. */
4024 gcmkONERROR(Hardware
->startIsr(Hardware
->isrContext
));
4027 /* Get time until started. */
4028 gcmkPROFILE_QUERY(time
, startTime
);
4030 if (flag
& gcvPOWER_FLAG_RELEASE
)
4032 /* Release the power management semaphore. */
4033 gcmkONERROR(gckOS_ReleaseSemaphore(os
, command
->powerSemaphore
));
4034 acquired
= gcvFALSE
;
4038 /* Release the global semaphore. */
4039 gcmkONERROR(gckOS_ReleaseSemaphore(os
, Hardware
->globalSemaphore
));
4040 globalAcquired
= gcvFALSE
;
4044 /* Save the new power state. */
4045 Hardware
->chipPowerState
= State
;
4047 #if gcdPOWEROFF_TIMEOUT
4048 /* Reset power off time */
4049 gcmkONERROR(gckOS_GetTicks(¤tTime
));
4051 Hardware
->powerOffTime
= currentTime
+ gcdPOWEROFF_TIMEOUT
;
4053 if (State
== gcvPOWER_IDLE
)
4055 gcmkONERROR(gckOS_ReleaseMutex(os
, Hardware
->powerOffSema
));
4059 /* Release the power mutex. */
4060 gcmkONERROR(gckOS_ReleaseMutex(os
, Hardware
->powerMutex
));
4062 /* Get total time. */
4063 gcmkPROFILE_QUERY(time
, totalTime
);
4064 #if gcdENABLE_PROFILING
4065 gcmkTRACE_ZONE(gcvLEVEL_INFO
, gcvZONE_HARDWARE
,
4066 "PROF(%llu): mutex:%llu on:%llu stall:%llu stop:%llu",
4067 freq
, mutexTime
, onTime
, stallTime
, stopTime
);
4068 gcmkTRACE_ZONE(gcvLEVEL_INFO
, gcvZONE_HARDWARE
,
4069 " delay:%llu init:%llu off:%llu start:%llu total:%llu",
4070 delayTime
, initTime
, offTime
, startTime
, totalTime
);
4075 return gcvSTATUS_OK
;
4080 /* Release the command queue mutex. */
4081 gcmkVERIFY_OK(gckCOMMAND_ExitCommit(command
, gcvTRUE
));
4086 /* Release semaphore. */
4087 gcmkVERIFY_OK(gckOS_ReleaseSemaphore(Hardware
->os
,
4088 command
->powerSemaphore
));
4093 gcmkVERIFY_OK(gckOS_ReleaseSemaphore(Hardware
->os
,
4094 Hardware
->globalSemaphore
));
4099 gcmkVERIFY_OK(gckOS_ReleaseMutex(Hardware
->os
, Hardware
->powerMutex
));
4102 /* Return the status. */
4105 #else /* gcdPOWER_MANAGEMENT */
4107 return gcvSTATUS_OK
;
4111 /*******************************************************************************
4113 ** gckHARDWARE_QueryPowerManagementState
4115 ** Get GPU power state.
4119 ** gckHARDWARE Harwdare
4120 ** Pointer to an gckHARDWARE object.
4122 ** gceCHIPPOWERSTATE* State
4127 gckHARDWARE_QueryPowerManagementState(
4128 IN gckHARDWARE Hardware
,
4129 OUT gceCHIPPOWERSTATE
* State
4132 gcmkHEADER_ARG("Hardware=0x%x", Hardware
);
4134 /* Verify the arguments. */
4135 gcmkVERIFY_OBJECT(Hardware
, gcvOBJ_HARDWARE
);
4136 gcmkVERIFY_ARGUMENT(State
!= gcvNULL
);
4138 /* Return the statue. */
4139 *State
= Hardware
->chipPowerState
;
4142 gcmkFOOTER_ARG("*State=%d", *State
);
4143 return gcvSTATUS_OK
;
4147 gckHARDWARE_QueryIdle(
4148 IN gckHARDWARE Hardware
,
4149 OUT gctBOOL_PTR IsIdle
4153 gctUINT32 idle
, address
;
4155 gcmkHEADER_ARG("Hardware=0x%x", Hardware
);
4157 /* Verify the arguments. */
4158 gcmkVERIFY_OBJECT(Hardware
, gcvOBJ_HARDWARE
);
4159 gcmkVERIFY_ARGUMENT(IsIdle
!= gcvNULL
);
4161 /* We are idle when the power is not ON. */
4162 if (Hardware
->chipPowerState
!= gcvPOWER_ON
)
4169 /* Read idle register. */
4171 gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x00004, &idle
));
4173 /* Pipe must be idle. */
4174 if (((((((gctUINT32
) (idle
)) >> (0 ? 1:1)) & ((gctUINT32
) ((((1 ? 1:1) - (0 ? 1:1) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 1:1) - (0 ? 1:1) + 1)))))) ) != 1)
4175 || ((((((gctUINT32
) (idle
)) >> (0 ? 3:3)) & ((gctUINT32
) ((((1 ? 3:3) - (0 ? 3:3) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 3:3) - (0 ? 3:3) + 1)))))) ) != 1)
4176 || ((((((gctUINT32
) (idle
)) >> (0 ? 4:4)) & ((gctUINT32
) ((((1 ? 4:4) - (0 ? 4:4) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 4:4) - (0 ? 4:4) + 1)))))) ) != 1)
4177 || ((((((gctUINT32
) (idle
)) >> (0 ? 5:5)) & ((gctUINT32
) ((((1 ? 5:5) - (0 ? 5:5) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 5:5) - (0 ? 5:5) + 1)))))) ) != 1)
4178 || ((((((gctUINT32
) (idle
)) >> (0 ? 6:6)) & ((gctUINT32
) ((((1 ? 6:6) - (0 ? 6:6) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 6:6) - (0 ? 6:6) + 1)))))) ) != 1)
4179 || ((((((gctUINT32
) (idle
)) >> (0 ? 7:7)) & ((gctUINT32
) ((((1 ? 7:7) - (0 ? 7:7) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 7:7) - (0 ? 7:7) + 1)))))) ) != 1)
4180 || ((((((gctUINT32
) (idle
)) >> (0 ? 2:2)) & ((gctUINT32
) ((((1 ? 2:2) - (0 ? 2:2) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 2:2) - (0 ? 2:2) + 1)))))) ) != 1)
4183 /* Something is busy. */
4189 /* Read the current FE address. */
4190 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
,
4195 /* Test if address is inside the last WAIT/LINK sequence. */
4196 if ((address
>= Hardware
->lastWaitLink
)
4197 && (address
<= Hardware
->lastWaitLink
+ 16)
4200 /* FE is in last WAIT/LINK and the pipe is idle. */
4205 /* FE is not in WAIT/LINK yet. */
4213 return gcvSTATUS_OK
;
4216 /* Return the status. */
4221 /*******************************************************************************
4222 ** Handy macros that will help in reading those debug registers.
4225 #define gcmkREAD_DEBUG_REGISTER(control, block, index, data) \
4227 gckOS_WriteRegisterEx(Hardware->os, \
4229 GC_DEBUG_CONTROL##control##_Address, \
4231 GC_DEBUG_CONTROL##control, \
4235 gckOS_ReadRegisterEx(Hardware->os, \
4237 GC_DEBUG_SIGNALS_##block##_Address, \
4240 #define gcmkRESET_DEBUG_REGISTER(control, block) \
4242 gckOS_WriteRegisterEx(Hardware->os, \
4244 GC_DEBUG_CONTROL##control##_Address, \
4246 GC_DEBUG_CONTROL##control, \
4250 gckOS_WriteRegisterEx(Hardware->os, \
4252 GC_DEBUG_CONTROL##control##_Address, \
4254 GC_DEBUG_CONTROL##control, \
4258 /*******************************************************************************
4260 ** gckHARDWARE_ProfileEngine2D
4262 ** Read the profile registers available in the 2D engine and sets them in the
4263 ** profile. The function will also reset the pixelsRendered counter every time.
4267 ** gckHARDWARE Hardware
4268 ** Pointer to an gckHARDWARE object.
4270 ** OPTIONAL gcs2D_PROFILE_PTR Profile
4271 ** Pointer to a gcs2D_Profile structure.
4278 gckHARDWARE_ProfileEngine2D(
4279 IN gckHARDWARE Hardware
,
4280 OPTIONAL gcs2D_PROFILE_PTR Profile
4284 gcs2D_PROFILE_PTR profiler
= Profile
;
4286 gcmkHEADER_ARG("Hardware=0x%x", Hardware
);
4288 /* Verify the arguments. */
4289 gcmkVERIFY_OBJECT(Hardware
, gcvOBJ_HARDWARE
);
4291 if (Profile
!= gcvNULL
)
4293 /* Read the cycle count. */
4295 gckOS_ReadRegisterEx(Hardware
->os
,
4298 &Profile
->cycleCount
));
4300 /* Read pixels rendered by 2D engine. */
4301 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00470, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 19:16) - (0 ? 19:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 19:16) - (0 ? 19:16) + 1))))))) << (0 ? 19:16))) | (((gctUINT32
) ((gctUINT32
) (11) & ((gctUINT32
) ((((1 ? 19:16) - (0 ? 19:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 19:16) - (0 ? 19:16) + 1))))))) << (0 ? 19:16))) )));
4302 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x00454, &profiler
->pixelsRendered
));
4304 /* Reset counter. */
4305 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00470, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 19:16) - (0 ? 19:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 19:16) - (0 ? 19:16) + 1))))))) << (0 ? 19:16))) | (((gctUINT32
) ((gctUINT32
) (15) & ((gctUINT32
) ((((1 ? 19:16) - (0 ? 19:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 19:16) - (0 ? 19:16) + 1))))))) << (0 ? 19:16))) )));
4306 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00470, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 19:16) - (0 ? 19:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 19:16) - (0 ? 19:16) + 1))))))) << (0 ? 19:16))) | (((gctUINT32
) ((gctUINT32
) (0) & ((gctUINT32
) ((((1 ? 19:16) - (0 ? 19:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 19:16) - (0 ? 19:16) + 1))))))) << (0 ? 19:16)))
4312 return gcvSTATUS_OK
;
4315 /* Return the status. */
4320 #if VIVANTE_PROFILER
4322 gckHARDWARE_QueryProfileRegisters(
4323 IN gckHARDWARE Hardware
,
4324 OUT gcsPROFILER_COUNTERS
* Counters
4328 gcsPROFILER_COUNTERS
* profiler
= Counters
;
4330 gcmkHEADER_ARG("Hardware=0x%x Counters=0x%x", Hardware
, Counters
);
4332 /* Verify the arguments. */
4333 gcmkVERIFY_OBJECT(Hardware
, gcvOBJ_HARDWARE
);
4335 /* Read the counters. */
4337 gckOS_ReadRegisterEx(Hardware
->os
,
4340 &profiler
->gpuTotalRead64BytesPerFrame
));
4342 gckOS_ReadRegisterEx(Hardware
->os
,
4345 &profiler
->gpuTotalWrite64BytesPerFrame
));
4347 gckOS_ReadRegisterEx(Hardware
->os
,
4350 &profiler
->gpuCyclesCounter
));
4352 /* Reset counters. */
4354 gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x0003C, 1));
4356 gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x0003C, 0));
4358 gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00438, 0));
4361 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00470, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 19:16) - (0 ? 19:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 19:16) - (0 ? 19:16) + 1))))))) << (0 ? 19:16))) | (((gctUINT32
) ((gctUINT32
) (0) & ((gctUINT32
) ((((1 ? 19:16) - (0 ? 19:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 19:16) - (0 ? 19:16) + 1))))))) << (0 ? 19:16))) )));
4362 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x00454, &profiler
->pe_pixel_count_killed_by_color_pipe
));
4363 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00470, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 19:16) - (0 ? 19:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 19:16) - (0 ? 19:16) + 1))))))) << (0 ? 19:16))) | (((gctUINT32
) ((gctUINT32
) (1) & ((gctUINT32
) ((((1 ? 19:16) - (0 ? 19:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 19:16) - (0 ? 19:16) + 1))))))) << (0 ? 19:16))) )));
4364 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x00454, &profiler
->pe_pixel_count_killed_by_depth_pipe
));
4365 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00470, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 19:16) - (0 ? 19:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 19:16) - (0 ? 19:16) + 1))))))) << (0 ? 19:16))) | (((gctUINT32
) ((gctUINT32
) (2) & ((gctUINT32
) ((((1 ? 19:16) - (0 ? 19:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 19:16) - (0 ? 19:16) + 1))))))) << (0 ? 19:16))) )));
4366 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x00454, &profiler
->pe_pixel_count_drawn_by_color_pipe
));
4367 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00470, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 19:16) - (0 ? 19:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 19:16) - (0 ? 19:16) + 1))))))) << (0 ? 19:16))) | (((gctUINT32
) ((gctUINT32
) (3) & ((gctUINT32
) ((((1 ? 19:16) - (0 ? 19:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 19:16) - (0 ? 19:16) + 1))))))) << (0 ? 19:16))) )));
4368 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x00454, &profiler
->pe_pixel_count_drawn_by_depth_pipe
));
4369 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00470, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 19:16) - (0 ? 19:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 19:16) - (0 ? 19:16) + 1))))))) << (0 ? 19:16))) | (((gctUINT32
) ((gctUINT32
) (15) & ((gctUINT32
) ((((1 ? 19:16) - (0 ? 19:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 19:16) - (0 ? 19:16) + 1))))))) << (0 ? 19:16))) )));
4370 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00470, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 19:16) - (0 ? 19:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 19:16) - (0 ? 19:16) + 1))))))) << (0 ? 19:16))) | (((gctUINT32
) ((gctUINT32
) (0) & ((gctUINT32
) ((((1 ? 19:16) - (0 ? 19:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 19:16) - (0 ? 19:16) + 1))))))) << (0 ? 19:16)))
4374 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00470, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24))) | (((gctUINT32
) ((gctUINT32
) (7) & ((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24))) )));
4375 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x0045C, &profiler
->ps_inst_counter
));
4376 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00470, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24))) | (((gctUINT32
) ((gctUINT32
) (8) & ((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24))) )));
4377 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x0045C, &profiler
->rendered_pixel_counter
));
4378 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00470, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24))) | (((gctUINT32
) ((gctUINT32
) (9) & ((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24))) )));
4379 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x0045C, &profiler
->vs_inst_counter
));
4380 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00470, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24))) | (((gctUINT32
) ((gctUINT32
) (10) & ((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24))) )));
4381 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x0045C, &profiler
->rendered_vertice_counter
));
4382 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00470, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24))) | (((gctUINT32
) ((gctUINT32
) (11) & ((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24))) )));
4383 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x0045C, &profiler
->vtx_branch_inst_counter
));
4384 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00470, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24))) | (((gctUINT32
) ((gctUINT32
) (12) & ((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24))) )));
4385 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x0045C, &profiler
->vtx_texld_inst_counter
));
4386 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00470, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24))) | (((gctUINT32
) ((gctUINT32
) (13) & ((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24))) )));
4387 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x0045C, &profiler
->pxl_branch_inst_counter
));
4388 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00470, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24))) | (((gctUINT32
) ((gctUINT32
) (14) & ((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24))) )));
4389 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x0045C, &profiler
->pxl_texld_inst_counter
));
4390 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00470, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24))) | (((gctUINT32
) ((gctUINT32
) (15) & ((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24))) )));
4391 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00470, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24))) | (((gctUINT32
) ((gctUINT32
) (0) & ((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24)))
4395 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00474, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 3:0) - (0 ? 3:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 3:0) - (0 ? 3:0) + 1))))))) << (0 ? 3:0))) | (((gctUINT32
) ((gctUINT32
) (3) & ((gctUINT32
) ((((1 ? 3:0) - (0 ? 3:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 3:0) - (0 ? 3:0) + 1))))))) << (0 ? 3:0))) )));
4396 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x00460, &profiler
->pa_input_vtx_counter
));
4397 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00474, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 3:0) - (0 ? 3:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 3:0) - (0 ? 3:0) + 1))))))) << (0 ? 3:0))) | (((gctUINT32
) ((gctUINT32
) (4) & ((gctUINT32
) ((((1 ? 3:0) - (0 ? 3:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 3:0) - (0 ? 3:0) + 1))))))) << (0 ? 3:0))) )));
4398 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x00460, &profiler
->pa_input_prim_counter
));
4399 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00474, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 3:0) - (0 ? 3:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 3:0) - (0 ? 3:0) + 1))))))) << (0 ? 3:0))) | (((gctUINT32
) ((gctUINT32
) (5) & ((gctUINT32
) ((((1 ? 3:0) - (0 ? 3:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 3:0) - (0 ? 3:0) + 1))))))) << (0 ? 3:0))) )));
4400 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x00460, &profiler
->pa_output_prim_counter
));
4401 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00474, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 3:0) - (0 ? 3:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 3:0) - (0 ? 3:0) + 1))))))) << (0 ? 3:0))) | (((gctUINT32
) ((gctUINT32
) (6) & ((gctUINT32
) ((((1 ? 3:0) - (0 ? 3:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 3:0) - (0 ? 3:0) + 1))))))) << (0 ? 3:0))) )));
4402 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x00460, &profiler
->pa_depth_clipped_counter
));
4403 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00474, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 3:0) - (0 ? 3:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 3:0) - (0 ? 3:0) + 1))))))) << (0 ? 3:0))) | (((gctUINT32
) ((gctUINT32
) (7) & ((gctUINT32
) ((((1 ? 3:0) - (0 ? 3:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 3:0) - (0 ? 3:0) + 1))))))) << (0 ? 3:0))) )));
4404 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x00460, &profiler
->pa_trivial_rejected_counter
));
4405 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00474, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 3:0) - (0 ? 3:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 3:0) - (0 ? 3:0) + 1))))))) << (0 ? 3:0))) | (((gctUINT32
) ((gctUINT32
) (8) & ((gctUINT32
) ((((1 ? 3:0) - (0 ? 3:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 3:0) - (0 ? 3:0) + 1))))))) << (0 ? 3:0))) )));
4406 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x00460, &profiler
->pa_culled_counter
));
4407 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00474, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 3:0) - (0 ? 3:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 3:0) - (0 ? 3:0) + 1))))))) << (0 ? 3:0))) | (((gctUINT32
) ((gctUINT32
) (15) & ((gctUINT32
) ((((1 ? 3:0) - (0 ? 3:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 3:0) - (0 ? 3:0) + 1))))))) << (0 ? 3:0))) )));
4408 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00474, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 3:0) - (0 ? 3:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 3:0) - (0 ? 3:0) + 1))))))) << (0 ? 3:0))) | (((gctUINT32
) ((gctUINT32
) (0) & ((gctUINT32
) ((((1 ? 3:0) - (0 ? 3:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 3:0) - (0 ? 3:0) + 1))))))) << (0 ? 3:0)))
4412 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00474, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 11:8) - (0 ? 11:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 11:8) - (0 ? 11:8) + 1))))))) << (0 ? 11:8))) | (((gctUINT32
) ((gctUINT32
) (0) & ((gctUINT32
) ((((1 ? 11:8) - (0 ? 11:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 11:8) - (0 ? 11:8) + 1))))))) << (0 ? 11:8))) )));
4413 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x00464, &profiler
->se_culled_triangle_count
));
4414 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00474, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 11:8) - (0 ? 11:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 11:8) - (0 ? 11:8) + 1))))))) << (0 ? 11:8))) | (((gctUINT32
) ((gctUINT32
) (1) & ((gctUINT32
) ((((1 ? 11:8) - (0 ? 11:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 11:8) - (0 ? 11:8) + 1))))))) << (0 ? 11:8))) )));
4415 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x00464, &profiler
->se_culled_lines_count
));
4416 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00474, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 11:8) - (0 ? 11:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 11:8) - (0 ? 11:8) + 1))))))) << (0 ? 11:8))) | (((gctUINT32
) ((gctUINT32
) (15) & ((gctUINT32
) ((((1 ? 11:8) - (0 ? 11:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 11:8) - (0 ? 11:8) + 1))))))) << (0 ? 11:8))) )));
4417 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00474, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 11:8) - (0 ? 11:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 11:8) - (0 ? 11:8) + 1))))))) << (0 ? 11:8))) | (((gctUINT32
) ((gctUINT32
) (0) & ((gctUINT32
) ((((1 ? 11:8) - (0 ? 11:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 11:8) - (0 ? 11:8) + 1))))))) << (0 ? 11:8)))
4421 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00474, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 19:16) - (0 ? 19:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 19:16) - (0 ? 19:16) + 1))))))) << (0 ? 19:16))) | (((gctUINT32
) ((gctUINT32
) (0) & ((gctUINT32
) ((((1 ? 19:16) - (0 ? 19:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 19:16) - (0 ? 19:16) + 1))))))) << (0 ? 19:16))) )));
4422 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x00448, &profiler
->ra_valid_pixel_count
));
4423 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00474, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 19:16) - (0 ? 19:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 19:16) - (0 ? 19:16) + 1))))))) << (0 ? 19:16))) | (((gctUINT32
) ((gctUINT32
) (1) & ((gctUINT32
) ((((1 ? 19:16) - (0 ? 19:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 19:16) - (0 ? 19:16) + 1))))))) << (0 ? 19:16))) )));
4424 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x00448, &profiler
->ra_total_quad_count
));
4425 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00474, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 19:16) - (0 ? 19:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 19:16) - (0 ? 19:16) + 1))))))) << (0 ? 19:16))) | (((gctUINT32
) ((gctUINT32
) (2) & ((gctUINT32
) ((((1 ? 19:16) - (0 ? 19:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 19:16) - (0 ? 19:16) + 1))))))) << (0 ? 19:16))) )));
4426 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x00448, &profiler
->ra_valid_quad_count_after_early_z
));
4427 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00474, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 19:16) - (0 ? 19:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 19:16) - (0 ? 19:16) + 1))))))) << (0 ? 19:16))) | (((gctUINT32
) ((gctUINT32
) (3) & ((gctUINT32
) ((((1 ? 19:16) - (0 ? 19:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 19:16) - (0 ? 19:16) + 1))))))) << (0 ? 19:16))) )));
4428 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x00448, &profiler
->ra_total_primitive_count
));
4429 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00474, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 19:16) - (0 ? 19:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 19:16) - (0 ? 19:16) + 1))))))) << (0 ? 19:16))) | (((gctUINT32
) ((gctUINT32
) (9) & ((gctUINT32
) ((((1 ? 19:16) - (0 ? 19:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 19:16) - (0 ? 19:16) + 1))))))) << (0 ? 19:16))) )));
4430 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x00448, &profiler
->ra_pipe_cache_miss_counter
));
4431 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00474, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 19:16) - (0 ? 19:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 19:16) - (0 ? 19:16) + 1))))))) << (0 ? 19:16))) | (((gctUINT32
) ((gctUINT32
) (10) & ((gctUINT32
) ((((1 ? 19:16) - (0 ? 19:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 19:16) - (0 ? 19:16) + 1))))))) << (0 ? 19:16))) )));
4432 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x00448, &profiler
->ra_prefetch_cache_miss_counter
));
4433 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00474, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 19:16) - (0 ? 19:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 19:16) - (0 ? 19:16) + 1))))))) << (0 ? 19:16))) | (((gctUINT32
) ((gctUINT32
) (15) & ((gctUINT32
) ((((1 ? 19:16) - (0 ? 19:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 19:16) - (0 ? 19:16) + 1))))))) << (0 ? 19:16))) )));
4434 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00474, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 19:16) - (0 ? 19:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 19:16) - (0 ? 19:16) + 1))))))) << (0 ? 19:16))) | (((gctUINT32
) ((gctUINT32
) (0) & ((gctUINT32
) ((((1 ? 19:16) - (0 ? 19:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 19:16) - (0 ? 19:16) + 1))))))) << (0 ? 19:16)))
4438 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00474, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24))) | (((gctUINT32
) ((gctUINT32
) (0) & ((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24))) )));
4439 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x0044C, &profiler
->tx_total_bilinear_requests
));
4440 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00474, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24))) | (((gctUINT32
) ((gctUINT32
) (1) & ((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24))) )));
4441 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x0044C, &profiler
->tx_total_trilinear_requests
));
4442 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00474, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24))) | (((gctUINT32
) ((gctUINT32
) (2) & ((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24))) )));
4443 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x0044C, &profiler
->tx_total_discarded_texture_requests
));
4444 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00474, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24))) | (((gctUINT32
) ((gctUINT32
) (3) & ((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24))) )));
4445 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x0044C, &profiler
->tx_total_texture_requests
));
4446 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00474, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24))) | (((gctUINT32
) ((gctUINT32
) (5) & ((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24))) )));
4447 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x0044C, &profiler
->tx_mem_read_count
));
4448 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00474, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24))) | (((gctUINT32
) ((gctUINT32
) (6) & ((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24))) )));
4449 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x0044C, &profiler
->tx_mem_read_in_8B_count
));
4450 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00474, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24))) | (((gctUINT32
) ((gctUINT32
) (7) & ((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24))) )));
4451 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x0044C, &profiler
->tx_cache_miss_count
));
4452 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00474, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24))) | (((gctUINT32
) ((gctUINT32
) (8) & ((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24))) )));
4453 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x0044C, &profiler
->tx_cache_hit_texel_count
));
4454 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00474, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24))) | (((gctUINT32
) ((gctUINT32
) (9) & ((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24))) )));
4455 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x0044C, &profiler
->tx_cache_miss_texel_count
));
4456 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00474, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24))) | (((gctUINT32
) ((gctUINT32
) (15) & ((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24))) )));
4457 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00474, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24))) | (((gctUINT32
) ((gctUINT32
) (0) & ((gctUINT32
) ((((1 ? 27:24) - (0 ? 27:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:24) - (0 ? 27:24) + 1))))))) << (0 ? 27:24)))
4461 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00478, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 3:0) - (0 ? 3:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 3:0) - (0 ? 3:0) + 1))))))) << (0 ? 3:0))) | (((gctUINT32
) ((gctUINT32
) (1) & ((gctUINT32
) ((((1 ? 3:0) - (0 ? 3:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 3:0) - (0 ? 3:0) + 1))))))) << (0 ? 3:0))) )));
4462 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x00468, &profiler
->mc_total_read_req_8B_from_pipeline
));
4463 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00478, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 3:0) - (0 ? 3:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 3:0) - (0 ? 3:0) + 1))))))) << (0 ? 3:0))) | (((gctUINT32
) ((gctUINT32
) (2) & ((gctUINT32
) ((((1 ? 3:0) - (0 ? 3:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 3:0) - (0 ? 3:0) + 1))))))) << (0 ? 3:0))) )));
4464 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x00468, &profiler
->mc_total_read_req_8B_from_IP
));
4465 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00478, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 3:0) - (0 ? 3:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 3:0) - (0 ? 3:0) + 1))))))) << (0 ? 3:0))) | (((gctUINT32
) ((gctUINT32
) (3) & ((gctUINT32
) ((((1 ? 3:0) - (0 ? 3:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 3:0) - (0 ? 3:0) + 1))))))) << (0 ? 3:0))) )));
4466 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x00468, &profiler
->mc_total_write_req_8B_from_pipeline
));
4467 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00478, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 3:0) - (0 ? 3:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 3:0) - (0 ? 3:0) + 1))))))) << (0 ? 3:0))) | (((gctUINT32
) ((gctUINT32
) (15) & ((gctUINT32
) ((((1 ? 3:0) - (0 ? 3:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 3:0) - (0 ? 3:0) + 1))))))) << (0 ? 3:0))) )));
4468 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00478, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 3:0) - (0 ? 3:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 3:0) - (0 ? 3:0) + 1))))))) << (0 ? 3:0))) | (((gctUINT32
) ((gctUINT32
) (0) & ((gctUINT32
) ((((1 ? 3:0) - (0 ? 3:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 3:0) - (0 ? 3:0) + 1))))))) << (0 ? 3:0)))
4472 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00478, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 11:8) - (0 ? 11:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 11:8) - (0 ? 11:8) + 1))))))) << (0 ? 11:8))) | (((gctUINT32
) ((gctUINT32
) (0) & ((gctUINT32
) ((((1 ? 11:8) - (0 ? 11:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 11:8) - (0 ? 11:8) + 1))))))) << (0 ? 11:8))) )));
4473 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x0046C, &profiler
->hi_axi_cycles_read_request_stalled
));
4474 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00478, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 11:8) - (0 ? 11:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 11:8) - (0 ? 11:8) + 1))))))) << (0 ? 11:8))) | (((gctUINT32
) ((gctUINT32
) (1) & ((gctUINT32
) ((((1 ? 11:8) - (0 ? 11:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 11:8) - (0 ? 11:8) + 1))))))) << (0 ? 11:8))) )));
4475 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x0046C, &profiler
->hi_axi_cycles_write_request_stalled
));
4476 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00478, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 11:8) - (0 ? 11:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 11:8) - (0 ? 11:8) + 1))))))) << (0 ? 11:8))) | (((gctUINT32
) ((gctUINT32
) (2) & ((gctUINT32
) ((((1 ? 11:8) - (0 ? 11:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 11:8) - (0 ? 11:8) + 1))))))) << (0 ? 11:8))) )));
4477 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
, Hardware
->core
, 0x0046C, &profiler
->hi_axi_cycles_write_data_stalled
));
4478 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00478, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 11:8) - (0 ? 11:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 11:8) - (0 ? 11:8) + 1))))))) << (0 ? 11:8))) | (((gctUINT32
) ((gctUINT32
) (15) & ((gctUINT32
) ((((1 ? 11:8) - (0 ? 11:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 11:8) - (0 ? 11:8) + 1))))))) << (0 ? 11:8))) )));
4479 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, 0x00478, (((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 11:8) - (0 ? 11:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 11:8) - (0 ? 11:8) + 1))))))) << (0 ? 11:8))) | (((gctUINT32
) ((gctUINT32
) (0) & ((gctUINT32
) ((((1 ? 11:8) - (0 ? 11:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 11:8) - (0 ? 11:8) + 1))))))) << (0 ? 11:8)))
4484 return gcvSTATUS_OK
;
4487 /* Return the status. */
4499 gctUINT32 control
, idle
;
4502 /* Read register. */
4503 gcmkONERROR(gckOS_ReadRegisterEx(Os
,
4510 /* Isolate the GPU. */
4511 control
= ((((gctUINT32
) (control
)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 19:19) - (0 ? 19:19) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 19:19) - (0 ? 19:19) + 1))))))) << (0 ? 19:19))) | (((gctUINT32
) ((gctUINT32
) (1) & ((gctUINT32
) ((((1 ? 19:19) - (0 ? 19:19) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 19:19) - (0 ? 19:19) + 1))))))) << (0 ? 19:19)));
4513 gcmkONERROR(gckOS_WriteRegisterEx(Os
,
4518 /* Set soft reset. */
4519 gcmkONERROR(gckOS_WriteRegisterEx(Os
,
4522 ((((gctUINT32
) (control
)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 12:12) - (0 ? 12:12) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 12:12) - (0 ? 12:12) + 1))))))) << (0 ? 12:12))) | (((gctUINT32
) ((gctUINT32
) (1) & ((gctUINT32
) ((((1 ? 12:12) - (0 ? 12:12) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 12:12) - (0 ? 12:12) + 1))))))) << (0 ? 12:12)))));
4524 /* Wait for reset. */
4525 gcmkONERROR(gckOS_Delay(Os
, 1));
4527 /* Reset soft reset bit. */
4528 gcmkONERROR(gckOS_WriteRegisterEx(Os
,
4531 ((((gctUINT32
) (control
)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 12:12) - (0 ? 12:12) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 12:12) - (0 ? 12:12) + 1))))))) << (0 ? 12:12))) | (((gctUINT32
) ((gctUINT32
) (0) & ((gctUINT32
) ((((1 ? 12:12) - (0 ? 12:12) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 12:12) - (0 ? 12:12) + 1))))))) << (0 ? 12:12)))));
4533 /* Reset GPU isolation. */
4534 control
= ((((gctUINT32
) (control
)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 19:19) - (0 ? 19:19) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 19:19) - (0 ? 19:19) + 1))))))) << (0 ? 19:19))) | (((gctUINT32
) ((gctUINT32
) (0) & ((gctUINT32
) ((((1 ? 19:19) - (0 ? 19:19) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 19:19) - (0 ? 19:19) + 1))))))) << (0 ? 19:19)));
4536 gcmkONERROR(gckOS_WriteRegisterEx(Os
,
4541 /* Read idle register. */
4542 gcmkONERROR(gckOS_ReadRegisterEx(Os
,
4547 if ((((((gctUINT32
) (idle
)) >> (0 ? 0:0)) & ((gctUINT32
) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 0:0) - (0 ? 0:0) + 1)))))) ) == 0)
4552 /* Read reset register. */
4553 gcmkONERROR(gckOS_ReadRegisterEx(Os
,
4558 if (((((((gctUINT32
) (control
)) >> (0 ? 16:16)) & ((gctUINT32
) ((((1 ? 16:16) - (0 ? 16:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 16:16) - (0 ? 16:16) + 1)))))) ) == 0)
4559 || ((((((gctUINT32
) (control
)) >> (0 ? 17:17)) & ((gctUINT32
) ((((1 ? 17:17) - (0 ? 17:17) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 17:17) - (0 ? 17:17) + 1)))))) ) == 0)
4570 return gcvSTATUS_OK
;
4574 /* Return the error. */
4580 IN gckHARDWARE Hardware
4585 gctBOOL acquired
= gcvFALSE
;
4587 gcmkHEADER_ARG("Hardware=0x%x", Hardware
);
4589 /* Verify the arguments. */
4590 gcmkVERIFY_OBJECT(Hardware
, gcvOBJ_HARDWARE
);
4591 gcmkVERIFY_OBJECT(Hardware
->kernel
, gcvOBJ_KERNEL
);
4592 command
= Hardware
->kernel
->command
;
4593 gcmkVERIFY_OBJECT(command
, gcvOBJ_COMMAND
);
4595 if (Hardware
->chipRevision
< 0x4600)
4597 /* Not supported - we need the isolation bit. */
4598 gcmkONERROR(gcvSTATUS_NOT_SUPPORTED
);
4601 if (Hardware
->chipPowerState
== gcvPOWER_ON
)
4603 /* Acquire the power management semaphore. */
4605 gckOS_AcquireSemaphore(Hardware
->os
, command
->powerSemaphore
));
4609 if ((Hardware
->chipPowerState
== gcvPOWER_ON
)
4610 || (Hardware
->chipPowerState
== gcvPOWER_IDLE
)
4613 /* Stop the command processor. */
4614 gcmkONERROR(gckCOMMAND_Stop(command
));
4617 gcmkONERROR(_ResetGPU(Hardware
->os
, Hardware
->core
));
4619 /* Force an OFF to ON power switch. */
4620 Hardware
->chipPowerState
= gcvPOWER_OFF
;
4621 gcmkONERROR(gckHARDWARE_SetPowerManagementState(Hardware
, gcvPOWER_ON
));
4625 return gcvSTATUS_OK
;
4630 /* Release the power management semaphore. */
4632 gckOS_ReleaseSemaphore(Hardware
->os
, command
->powerSemaphore
));
4635 /* Return the error. */
4641 gckHARDWARE_GetBaseAddress(
4642 IN gckHARDWARE Hardware
,
4643 OUT gctUINT32_PTR BaseAddress
4648 gcmkHEADER_ARG("Hardware=0x%x", Hardware
);
4650 /* Verify the arguments. */
4651 gcmkVERIFY_OBJECT(Hardware
, gcvOBJ_HARDWARE
);
4652 gcmkVERIFY_ARGUMENT(BaseAddress
!= gcvNULL
);
4654 /* Test if we have a new Memory Controller. */
4655 if (((((gctUINT32
) (Hardware
->chipMinorFeatures0
)) >> (0 ? 22:22) & ((gctUINT32
) ((((1 ? 22:22) - (0 ? 22:22) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 22:22) - (0 ? 22:22) + 1)))))) == (0x1 & ((gctUINT32
) ((((1 ? 22:22) - (0 ? 22:22) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 22:22) - (0 ? 22:22) + 1))))))))
4657 /* No base address required. */
4662 /* Get the base address from the OS. */
4663 gcmkONERROR(gckOS_GetBaseAddress(Hardware
->os
, BaseAddress
));
4667 gcmkFOOTER_ARG("*BaseAddress=0x%08x", *BaseAddress
);
4668 return gcvSTATUS_OK
;
4671 /* Return the status. */
4677 gckHARDWARE_NeedBaseAddress(
4678 IN gckHARDWARE Hardware
,
4680 OUT gctBOOL_PTR NeedBase
4683 gctBOOL need
= gcvFALSE
;
4685 gcmkHEADER_ARG("Hardware=0x%x State=0x%08x", Hardware
, State
);
4687 /* Verify the arguments. */
4688 gcmkVERIFY_OBJECT(Hardware
, gcvOBJ_HARDWARE
);
4689 gcmkVERIFY_ARGUMENT(NeedBase
!= gcvNULL
);
4691 /* Make sure this is a load state. */
4692 if (((((gctUINT32
) (State
)) >> (0 ? 31:27) & ((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1)))))) == (0x01 & ((gctUINT32
) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))))
4694 #ifndef VIVANTE_NO_3D
4695 /* Get the state address. */
4696 switch ((((((gctUINT32
) (State
)) >> (0 ? 15:0)) & ((gctUINT32
) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1)))))) ))
4703 /* These states need a TRUE physical address. */
4708 /* 2D addresses don't need a base address. */
4712 /* Return the flag. */
4716 gcmkFOOTER_ARG("*NeedBase=%d", *NeedBase
);
4717 return gcvSTATUS_OK
;
4721 gckHARDWARE_SetIsrManager(
4722 IN gckHARDWARE Hardware
,
4723 IN gctISRMANAGERFUNC StartIsr
,
4724 IN gctISRMANAGERFUNC StopIsr
,
4725 IN gctPOINTER Context
4728 gceSTATUS status
= gcvSTATUS_OK
;
4730 gcmkHEADER_ARG("Hardware=0x%x, StartIsr=0x%x, StopIsr=0x%x, Context=0x%x",
4731 Hardware
, StartIsr
, StopIsr
, Context
);
4733 /* Verify the arguments. */
4734 gcmkVERIFY_OBJECT(Hardware
, gcvOBJ_HARDWARE
);
4736 if (StartIsr
== gcvNULL
||
4737 StopIsr
== gcvNULL
||
4740 status
= gcvSTATUS_INVALID_ARGUMENT
;
4746 Hardware
->startIsr
= StartIsr
;
4747 Hardware
->stopIsr
= StopIsr
;
4748 Hardware
->isrContext
= Context
;
4756 /*******************************************************************************
4758 ** gckHARDWARE_Compose
4760 ** Start a composition.
4764 ** gckHARDWARE Hardware
4765 ** Pointer to the gckHARDWARE object.
4772 gckHARDWARE_Compose(
4773 IN gckHARDWARE Hardware
,
4774 IN gctUINT32 ProcessID
,
4776 IN gctPHYS_ADDR Physical
,
4777 IN gctPOINTER Logical
,
4781 #ifndef VIVANTE_NO_3D
4783 gctUINT32_PTR sizeState
;
4784 gctUINT32_PTR triggerState
;
4785 gctUINT32_PTR dummyState
;
4788 gcmkHEADER_ARG("Hardware=0x%x Size=%d Physical=0x%x"
4789 " Logical=0x%x EventID=%d",
4790 Hardware
, Size
, Physical
, Logical
, EventID
);
4792 /* Verify the arguments. */
4793 gcmkVERIFY_OBJECT(Hardware
, gcvOBJ_HARDWARE
);
4794 gcmkVERIFY_ARGUMENT((Size
& 7) == 0);
4795 gcmkVERIFY_ARGUMENT(Logical
!= gcvNULL
);
4797 /* Make total state buffer size 64B aligned. */
4798 size
= gcmALIGN(Size
+ 16, 64) - 8;
4800 /* Program the size of the state buffer. */
4801 sizeState
= (gctUINT32_PTR
) Logical
;
4802 sizeState
[0] = 0xFFFFFFFF;
4803 sizeState
[1] = size
>> 3;
4805 /* Program the trigger state. */
4806 triggerState
= (gctUINT32_PTR
) ((gctUINT8_PTR
) Logical
+ Size
);
4807 triggerState
[0] = 0x0C03;
4809 = ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 1:0) - (0 ? 1:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 1:0) - (0 ? 1:0) + 1))))))) << (0 ? 1:0))) | (((gctUINT32
) (0x1 & ((gctUINT32
) ((((1 ? 1:0) - (0 ? 1:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 1:0) - (0 ? 1:0) + 1))))))) << (0 ? 1:0)))
4810 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 5:4) - (0 ? 5:4) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 5:4) - (0 ? 5:4) + 1))))))) << (0 ? 5:4))) | (((gctUINT32
) (0x3 & ((gctUINT32
) ((((1 ? 5:4) - (0 ? 5:4) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 5:4) - (0 ? 5:4) + 1))))))) << (0 ? 5:4)))
4811 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 8:8) - (0 ? 8:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 8:8) - (0 ? 8:8) + 1))))))) << (0 ? 8:8))) | (((gctUINT32
) ((gctUINT32
) (1) & ((gctUINT32
) ((((1 ? 8:8) - (0 ? 8:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 8:8) - (0 ? 8:8) + 1))))))) << (0 ? 8:8)))
4812 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 24:24) - (0 ? 24:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 24:24) - (0 ? 24:24) + 1))))))) << (0 ? 24:24))) | (((gctUINT32
) ((gctUINT32
) (1) & ((gctUINT32
) ((((1 ? 24:24) - (0 ? 24:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 24:24) - (0 ? 24:24) + 1))))))) << (0 ? 24:24)))
4813 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 12:12) - (0 ? 12:12) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 12:12) - (0 ? 12:12) + 1))))))) << (0 ? 12:12))) | (((gctUINT32
) ((gctUINT32
) (1) & ((gctUINT32
) ((((1 ? 12:12) - (0 ? 12:12) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 12:12) - (0 ? 12:12) + 1))))))) << (0 ? 12:12)))
4814 | ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 20:16) - (0 ? 20:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 20:16) - (0 ? 20:16) + 1))))))) << (0 ? 20:16))) | (((gctUINT32
) ((gctUINT32
) (EventID
) & ((gctUINT32
) ((((1 ? 20:16) - (0 ? 20:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 20:16) - (0 ? 20:16) + 1))))))) << (0 ? 20:16)))
4817 /* Dummy state padding. */
4818 dummyState
= triggerState
+ 2;
4822 dummyState
[0] = 0xFFFFFFFF;
4823 dummyState
[1] = 0x00000000;
4829 #if gcdNONPAGED_MEMORY_CACHEABLE
4830 /* Flush the cache for the wait/link. */
4831 gcmkONERROR(gckOS_CacheClean(
4832 Hardware
->os
, ProcessID
, gcvNULL
, Physical
, Logical
, size
4836 /* Start composition. */
4837 gcmkONERROR(gckOS_WriteRegisterEx(
4838 Hardware
->os
, Hardware
->core
, 0x00554,
4839 ((((gctUINT32
) (0)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 1:0) - (0 ? 1:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 1:0) - (0 ? 1:0) + 1))))))) << (0 ? 1:0))) | (((gctUINT32
) (0x3 & ((gctUINT32
) ((((1 ? 1:0) - (0 ? 1:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 1:0) - (0 ? 1:0) + 1))))))) << (0 ? 1:0)))
4844 return gcvSTATUS_OK
;
4847 /* Return the status. */
4851 /* Return the status. */
4852 return gcvSTATUS_NOT_SUPPORTED
;
4856 /*******************************************************************************
4858 ** gckHARDWARE_IsFeatureAvailable
4860 ** Verifies whether the specified feature is available in hardware.
4864 ** gckHARDWARE Hardware
4865 ** Pointer to an gckHARDWARE object.
4867 ** gceFEATURE Feature
4868 ** Feature to be verified.
4871 gckHARDWARE_IsFeatureAvailable(
4872 IN gckHARDWARE Hardware
,
4873 IN gceFEATURE Feature
4878 gcmkHEADER_ARG("Hardware=0x%x Feature=%d", Hardware
, Feature
);
4880 /* Verify the arguments. */
4881 gcmkVERIFY_OBJECT(Hardware
, gcvOBJ_HARDWARE
);
4883 /* Only features needed by common kernel logic added here. */
4886 case gcvFEATURE_END_EVENT
:
4887 /*available = gcmVERIFYFIELDVALUE(Hardware->chipMinorFeatures2,
4888 GC_MINOR_FEATURES2, END_EVENT, AVAILABLE
4890 available
= gcvFALSE
;
4894 gcmkFATAL("Invalid feature has been requested.");
4895 available
= gcvFALSE
;
4898 /* Return result. */
4899 gcmkFOOTER_ARG("%d", available
? gcvSTATUS_TRUE
: gcvSTATUS_OK
);
4900 return available
? gcvSTATUS_TRUE
: gcvSTATUS_OK
;
4905 gckHARDWARE_ReadPerformanceRegister(
4906 IN gckHARDWARE Hardware
,
4907 IN gctUINT PerformanceAddress
,
4908 IN gctUINT IndexAddress
,
4909 IN gctUINT IndexShift
,
4911 OUT gctUINT32_PTR Value
4916 gcmkHEADER_ARG("Hardware=0x%x PerformanceAddress=0x%x IndexAddress=0x%x "
4917 "IndexShift=%u Index=%u",
4918 Hardware
, PerformanceAddress
, IndexAddress
, IndexShift
,
4921 /* Write the index. */
4922 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
,
4925 Index
<< IndexShift
));
4927 /* Read the register. */
4928 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
,
4933 /* Test for reset. */
4936 /* Index another register to get out of reset. */
4937 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
, Hardware
->core
, IndexAddress
, 0));
4941 gcmkFOOTER_ARG("*Value=0x%x", *Value
);
4942 return gcvSTATUS_OK
;
4945 /* Return the status. */
4951 gckHARDWARE_GetFrameInfo(
4952 IN gckHARDWARE Hardware
,
4953 OUT gcsHAL_FRAME_INFO
* FrameInfo
4958 gcsHAL_FRAME_INFO info
;
4959 #if gcdFRAME_DB_RESET
4963 gcmkHEADER_ARG("Hardware=0x%x", Hardware
);
4965 /* Get profile tick. */
4966 gcmkONERROR(gckOS_GetProfileTick(&info
.ticks
));
4968 /* Read SH counters and reset them. */
4969 gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
4975 &info
.shaderCycles
));
4976 gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
4982 &info
.vsInstructionCount
));
4983 gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
4989 &info
.vsTextureCount
));
4990 gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
4996 &info
.psInstructionCount
));
4997 gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
5003 &info
.psTextureCount
));
5004 #if gcdFRAME_DB_RESET
5005 gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
5014 /* Read PA counters and reset them. */
5015 gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
5021 &info
.vertexCount
));
5022 gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
5028 &info
.primitiveCount
));
5029 gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
5035 &info
.rejectedPrimitives
));
5036 gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
5042 &info
.culledPrimitives
));
5043 gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
5049 &info
.clippedPrimitives
));
5050 gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
5056 &info
.outPrimitives
));
5057 #if gcdFRAME_DB_RESET
5058 gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
5067 /* Read RA counters and reset them. */
5068 gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
5074 &info
.inPrimitives
));
5075 gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
5081 &info
.culledQuadCount
));
5082 gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
5088 &info
.totalQuadCount
));
5089 gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
5096 gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
5102 &info
.totalPixelCount
));
5103 #if gcdFRAME_DB_RESET
5104 gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
5113 /* Read TX counters and reset them. */
5114 gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
5120 &info
.bilinearRequests
));
5121 gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
5127 &info
.trilinearRequests
));
5128 gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
5135 gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
5141 &info
.txMissCount
));
5142 gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
5149 #if gcdFRAME_DB_RESET
5150 gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
5159 /* Read clock control register. */
5160 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
,
5165 /* Walk through all avaiable pixel pipes. */
5166 for (i
= 0; i
< Hardware
->pixelPipes
; ++i
)
5168 /* Select proper pipe. */
5169 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
,
5172 ((((gctUINT32
) (clock
)) & ~(((gctUINT32
) (((gctUINT32
) ((((1 ? 23:20) - (0 ? 23:20) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:20) - (0 ? 23:20) + 1))))))) << (0 ? 23:20))) | (((gctUINT32
) ((gctUINT32
) (i
) & ((gctUINT32
) ((((1 ? 23:20) - (0 ? 23:20) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:20) - (0 ? 23:20) + 1))))))) << (0 ? 23:20)))));
5174 /* Read cycle registers. */
5175 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
,
5179 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
,
5182 &info
.idleCycles
[i
]));
5183 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
,
5186 &info
.mcCycles
[i
]));
5188 /* Read bandwidth registers. */
5189 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
,
5192 &info
.readRequests
[i
]));
5193 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
,
5196 &info
.readBytes8
[i
]));
5197 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
,
5200 &info
.writeRequests
[i
]));
5201 gcmkONERROR(gckOS_ReadRegisterEx(Hardware
->os
,
5204 &info
.writeBytes8
[i
]));
5206 /* Read PE counters. */
5207 gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
5213 &info
.colorKilled
[i
]));
5214 gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
5220 &info
.colorDrawn
[i
]));
5221 gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
5227 &info
.depthKilled
[i
]));
5228 gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
5234 &info
.depthDrawn
[i
]));
5237 /* Zero out remaning reserved counters. */
5240 info
.readBytes8
[i
] = 0;
5241 info
.writeBytes8
[i
] = 0;
5243 info
.idleCycles
[i
] = 0;
5244 info
.mcCycles
[i
] = 0;
5245 info
.readRequests
[i
] = 0;
5246 info
.writeRequests
[i
] = 0;
5247 info
.colorKilled
[i
] = 0;
5248 info
.colorDrawn
[i
] = 0;
5249 info
.depthKilled
[i
] = 0;
5250 info
.depthDrawn
[i
] = 0;
5253 /* Reset clock control register. */
5254 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
,
5259 /* Reset cycle and bandwidth counters. */
5260 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
,
5264 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
,
5268 gcmkONERROR(gckOS_WriteRegisterEx(Hardware
->os
,
5273 #if gcdFRAME_DB_RESET
5274 /* Reset PE counters. */
5275 gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
5285 gcmkONERROR(gckOS_CopyToUserData(Hardware
->os
,
5292 return gcvSTATUS_OK
;
5295 /* Return the status. */