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 *****************************************************************************/
27 #include "gc_hal_rename.h"
28 #include "gc_hal_types.h"
29 #include "gc_hal_enum.h"
30 #include "gc_hal_base.h"
31 #include "gc_hal_profiler.h"
32 #include "gc_hal_driver.h"
38 /******************************************************************************\
39 ******************************* Alignment Macros *******************************
40 \******************************************************************************/
42 #define gcmALIGN(n, align) \
44 ((n) + ((align) - 1)) & ~((align) - 1) \
47 #define gcmALIGN_BASE(n, align) \
49 (n) & ~((align) - 1) \
52 /******************************************************************************\
53 ***************************** Element Count Macro *****************************
54 \******************************************************************************/
56 #define gcmSIZEOF(a) \
58 (gctSIZE_T) (sizeof(a)) \
61 #define gcmCOUNTOF(a) \
63 sizeof(a) / sizeof(a[0]) \
66 /******************************************************************************\
67 ******************************** gcsOBJECT Object *******************************
68 \******************************************************************************/
70 /* Type of objects. */
71 typedef enum _gceOBJECT_TYPE
74 gcvOBJ_2D
= gcmCC('2','D',' ',' '),
75 gcvOBJ_3D
= gcmCC('3','D',' ',' '),
76 gcvOBJ_ATTRIBUTE
= gcmCC('A','T','T','R'),
77 gcvOBJ_BRUSHCACHE
= gcmCC('B','R','U','$'),
78 gcvOBJ_BRUSHNODE
= gcmCC('B','R','U','n'),
79 gcvOBJ_BRUSH
= gcmCC('B','R','U','o'),
80 gcvOBJ_BUFFER
= gcmCC('B','U','F','R'),
81 gcvOBJ_COMMAND
= gcmCC('C','M','D',' '),
82 gcvOBJ_COMMANDBUFFER
= gcmCC('C','M','D','B'),
83 gcvOBJ_CONTEXT
= gcmCC('C','T','X','T'),
84 gcvOBJ_DEVICE
= gcmCC('D','E','V',' '),
85 gcvOBJ_DUMP
= gcmCC('D','U','M','P'),
86 gcvOBJ_EVENT
= gcmCC('E','V','N','T'),
87 gcvOBJ_FUNCTION
= gcmCC('F','U','N','C'),
88 gcvOBJ_HAL
= gcmCC('H','A','L',' '),
89 gcvOBJ_HARDWARE
= gcmCC('H','A','R','D'),
90 gcvOBJ_HEAP
= gcmCC('H','E','A','P'),
91 gcvOBJ_INDEX
= gcmCC('I','N','D','X'),
92 gcvOBJ_INTERRUPT
= gcmCC('I','N','T','R'),
93 gcvOBJ_KERNEL
= gcmCC('K','E','R','N'),
94 gcvOBJ_KERNEL_FUNCTION
= gcmCC('K','F','C','N'),
95 gcvOBJ_MEMORYBUFFER
= gcmCC('M','E','M','B'),
96 gcvOBJ_MMU
= gcmCC('M','M','U',' '),
97 gcvOBJ_OS
= gcmCC('O','S',' ',' '),
98 gcvOBJ_OUTPUT
= gcmCC('O','U','T','P'),
99 gcvOBJ_PAINT
= gcmCC('P','N','T',' '),
100 gcvOBJ_PATH
= gcmCC('P','A','T','H'),
101 gcvOBJ_QUEUE
= gcmCC('Q','U','E',' '),
102 gcvOBJ_SAMPLER
= gcmCC('S','A','M','P'),
103 gcvOBJ_SHADER
= gcmCC('S','H','D','R'),
104 gcvOBJ_STREAM
= gcmCC('S','T','R','M'),
105 gcvOBJ_SURF
= gcmCC('S','U','R','F'),
106 gcvOBJ_TEXTURE
= gcmCC('T','X','T','R'),
107 gcvOBJ_UNIFORM
= gcmCC('U','N','I','F'),
108 gcvOBJ_VARIABLE
= gcmCC('V','A','R','I'),
109 gcvOBJ_VERTEX
= gcmCC('V','R','T','X'),
110 gcvOBJ_VIDMEM
= gcmCC('V','M','E','M'),
111 gcvOBJ_VG
= gcmCC('V','G',' ',' '),
115 /* gcsOBJECT object defintinon. */
116 typedef struct _gcsOBJECT
118 /* Type of an object. */
123 typedef struct _gckHARDWARE
* gckHARDWARE
;
126 typedef enum _gceCORE
134 #define gcdCORE_COUNT 3
136 /*******************************************************************************
140 ** Assert if an object is invalid or is not of the specified type. If the
141 ** object is invalid or not of the specified type, gcvSTATUS_INVALID_OBJECT
142 ** will be returned from the current function. In retail mode this macro
147 ** obj Object to test.
148 ** t Expected type of the object.
150 #if gcmIS_DEBUG(gcdDEBUG_TRACE)
151 #define _gcmVERIFY_OBJECT(prefix, obj, t) \
152 if ((obj) == gcvNULL) \
154 prefix##TRACE(gcvLEVEL_ERROR, \
155 #prefix "VERIFY_OBJECT failed: NULL"); \
156 prefix##TRACE(gcvLEVEL_ERROR, " expected: %c%c%c%c", \
158 prefix##ASSERT((obj) != gcvNULL); \
159 prefix##FOOTER_ARG("status=%d", gcvSTATUS_INVALID_OBJECT); \
160 return gcvSTATUS_INVALID_OBJECT; \
162 else if (((gcsOBJECT*) (obj))->type != t) \
164 prefix##TRACE(gcvLEVEL_ERROR, \
165 #prefix "VERIFY_OBJECT failed: %c%c%c%c", \
166 gcmCC_PRINT(((gcsOBJECT*) (obj))->type)); \
167 prefix##TRACE(gcvLEVEL_ERROR, " expected: %c%c%c%c", \
169 prefix##ASSERT(((gcsOBJECT*)(obj))->type == t); \
170 prefix##FOOTER_ARG("status=%d", gcvSTATUS_INVALID_OBJECT); \
171 return gcvSTATUS_INVALID_OBJECT; \
174 # define gcmVERIFY_OBJECT(obj, t) _gcmVERIFY_OBJECT(gcm, obj, t)
175 # define gcmkVERIFY_OBJECT(obj, t) _gcmVERIFY_OBJECT(gcmk, obj, t)
177 # define gcmVERIFY_OBJECT(obj, t) do {} while (gcvFALSE)
178 # define gcmkVERIFY_OBJECT(obj, t) do {} while (gcvFALSE)
181 /******************************************************************************/
182 /*VERIFY_OBJECT if special return expected*/
183 /******************************************************************************/
184 #ifndef EGL_API_ANDROID
185 # define _gcmVERIFY_OBJECT_RETURN(prefix, obj, t, retVal) \
188 if ((obj) == gcvNULL) \
190 prefix##PRINT_VERSION(); \
191 prefix##TRACE(gcvLEVEL_ERROR, \
192 #prefix "VERIFY_OBJECT_RETURN failed: NULL"); \
193 prefix##TRACE(gcvLEVEL_ERROR, " expected: %c%c%c%c", \
195 prefix##ASSERT((obj) != gcvNULL); \
196 prefix##FOOTER_ARG("retVal=%d", retVal); \
199 else if (((gcsOBJECT*) (obj))->type != t) \
201 prefix##PRINT_VERSION(); \
202 prefix##TRACE(gcvLEVEL_ERROR, \
203 #prefix "VERIFY_OBJECT_RETURN failed: %c%c%c%c", \
204 gcmCC_PRINT(((gcsOBJECT*) (obj))->type)); \
205 prefix##TRACE(gcvLEVEL_ERROR, " expected: %c%c%c%c", \
207 prefix##ASSERT(((gcsOBJECT*)(obj))->type == t); \
208 prefix##FOOTER_ARG("retVal=%d", retVal); \
213 # define gcmVERIFY_OBJECT_RETURN(obj, t, retVal) \
214 _gcmVERIFY_OBJECT_RETURN(gcm, obj, t, retVal)
215 # define gcmkVERIFY_OBJECT_RETURN(obj, t, retVal) \
216 _gcmVERIFY_OBJECT_RETURN(gcmk, obj, t, retVal)
218 # define gcmVERIFY_OBJECT_RETURN(obj, t) do {} while (gcvFALSE)
219 # define gcmVERIFY_OBJECT_RETURN(obj, t) do {} while (gcvFALSE)
222 /******************************************************************************\
223 ********************************** gckOS Object *********************************
224 \******************************************************************************/
226 /* Construct a new gckOS object. */
229 IN gctPOINTER Context
,
233 /* Destroy an gckOS object. */
239 /* Query the video memory. */
241 gckOS_QueryVideoMemory(
243 OUT gctPHYS_ADDR
* InternalAddress
,
244 OUT gctSIZE_T
* InternalSize
,
245 OUT gctPHYS_ADDR
* ExternalAddress
,
246 OUT gctSIZE_T
* ExternalSize
,
247 OUT gctPHYS_ADDR
* ContiguousAddress
,
248 OUT gctSIZE_T
* ContiguousSize
251 /* Allocate memory from the heap. */
256 OUT gctPOINTER
* Memory
259 /* Free allocated memory. */
266 /* Wrapper for allocation memory.. */
268 gckOS_AllocateMemory(
271 OUT gctPOINTER
* Memory
274 /* Wrapper for freeing memory. */
281 /* Allocate paged memory. */
283 gckOS_AllocatePagedMemory(
286 OUT gctPHYS_ADDR
* Physical
289 /* Allocate paged memory. */
291 gckOS_AllocatePagedMemoryEx(
293 IN gctBOOL Contiguous
,
295 OUT gctPHYS_ADDR
* Physical
302 IN gctPHYS_ADDR Physical
,
304 IN gctBOOL Cacheable
,
305 OUT gctPOINTER
* Logical
,
306 OUT gctSIZE_T
* PageCount
313 IN gctPHYS_ADDR Physical
,
315 IN gctPOINTER Logical
,
317 IN gctSIZE_T PageCount
,
318 IN gctPOINTER PageTable
326 IN gctPHYS_ADDR Physical
,
328 IN gctPOINTER Logical
,
330 IN gctSIZE_T PageCount
,
331 IN gctPOINTER PageTable
338 IN gctPHYS_ADDR Physical
,
340 IN gctPOINTER Logical
343 /* Free paged memory. */
345 gckOS_FreePagedMemory(
347 IN gctPHYS_ADDR Physical
,
351 /* Allocate non-paged memory. */
353 gckOS_AllocateNonPagedMemory(
355 IN gctBOOL InUserSpace
,
356 IN OUT gctSIZE_T
* Bytes
,
357 OUT gctPHYS_ADDR
* Physical
,
358 OUT gctPOINTER
* Logical
361 /* Free non-paged memory. */
363 gckOS_FreeNonPagedMemory(
366 IN gctPHYS_ADDR Physical
,
367 IN gctPOINTER Logical
370 /* Allocate contiguous memory. */
372 gckOS_AllocateContiguous(
374 IN gctBOOL InUserSpace
,
375 IN OUT gctSIZE_T
* Bytes
,
376 OUT gctPHYS_ADDR
* Physical
,
377 OUT gctPOINTER
* Logical
380 /* Free contiguous memory. */
382 gckOS_FreeContiguous(
384 IN gctPHYS_ADDR Physical
,
385 IN gctPOINTER Logical
,
389 /* Get the number fo bytes per page. */
393 OUT gctSIZE_T
* PageSize
396 /* Get the physical address of a corresponding logical address. */
398 gckOS_GetPhysicalAddress(
400 IN gctPOINTER Logical
,
401 OUT gctUINT32
* Address
404 /* Get the physical address of a corresponding logical address. */
406 gckOS_GetPhysicalAddressProcess(
408 IN gctPOINTER Logical
,
409 IN gctUINT32 ProcessID
,
410 OUT gctUINT32
* Address
413 /* Map physical memory. */
417 IN gctUINT32 Physical
,
419 OUT gctPOINTER
* Logical
422 /* Unmap previously mapped physical memory. */
426 IN gctPOINTER Logical
,
430 /* Read data from a hardware register. */
434 IN gctUINT32 Address
,
438 /* Read data from a hardware register. */
440 gckOS_ReadRegisterEx(
443 IN gctUINT32 Address
,
447 /* Write data to a hardware register. */
451 IN gctUINT32 Address
,
455 /* Write data to a hardware register. */
457 gckOS_WriteRegisterEx(
460 IN gctUINT32 Address
,
464 /* Write data to a 32-bit memory location. */
468 IN gctPOINTER Address
,
472 /* Map physical memory into the process space. */
476 IN gctPHYS_ADDR Physical
,
478 OUT gctPOINTER
* Logical
481 /* Unmap physical memory from the specified process space. */
485 IN gctPHYS_ADDR Physical
,
487 IN gctPOINTER Logical
,
491 /* Unmap physical memory from the process space. */
495 IN gctPHYS_ADDR Physical
,
497 IN gctPOINTER Logical
500 /* Create a new mutex. */
504 OUT gctPOINTER
* Mutex
507 /* Delete a mutex. */
514 /* Acquire a mutex. */
522 /* Release a mutex. */
529 /* Atomically exchange a pair of 32-bit values. */
531 gckOS_AtomicExchange(
533 IN OUT gctUINT32_PTR Target
,
534 IN gctUINT32 NewValue
,
535 OUT gctUINT32_PTR OldValue
538 /* Atomically exchange a pair of pointers. */
540 gckOS_AtomicExchangePtr(
542 IN OUT gctPOINTER
* Target
,
543 IN gctPOINTER NewValue
,
544 OUT gctPOINTER
* OldValue
547 /*******************************************************************************
549 ** gckOS_AtomConstruct
556 ** Pointer to a gckOS object.
561 ** Pointer to a variable receiving the constructed atom.
566 OUT gctPOINTER
* Atom
569 /*******************************************************************************
578 ** Pointer to a gckOS object.
581 ** Pointer to the atom to destroy.
593 /*******************************************************************************
597 ** Get the 32-bit value protected by an atom.
602 ** Pointer to a gckOS object.
605 ** Pointer to the atom.
609 ** gctINT32_PTR Value
610 ** Pointer to a variable the receives the value of the atom.
616 OUT gctINT32_PTR Value
619 /*******************************************************************************
623 ** Set the 32-bit value protected by an atom.
628 ** Pointer to a gckOS object.
631 ** Pointer to the atom.
634 ** The value of the atom.
647 /*******************************************************************************
649 ** gckOS_AtomIncrement
651 ** Atomically increment the 32-bit integer value inside an atom.
656 ** Pointer to a gckOS object.
659 ** Pointer to the atom.
663 ** gctINT32_PTR Value
664 ** Pointer to a variable the receives the original value of the atom.
670 OUT gctINT32_PTR Value
673 /*******************************************************************************
675 ** gckOS_AtomDecrement
677 ** Atomically decrement the 32-bit integer value inside an atom.
682 ** Pointer to a gckOS object.
685 ** Pointer to the atom.
689 ** gctINT32_PTR Value
690 ** Pointer to a variable the receives the original value of the atom.
696 OUT gctINT32_PTR Value
699 /* Delay a number of microseconds. */
706 /* Get time in milliseconds. */
709 OUT gctUINT32_PTR Time
712 /* Compare time value. */
717 OUT gctBOOL_PTR IsAfter
720 /* Get time in microseconds. */
723 OUT gctUINT64_PTR Time
726 /* Memory barrier. */
730 IN gctPOINTER Address
733 /* Map user pointer. */
735 gckOS_MapUserPointer(
737 IN gctPOINTER Pointer
,
739 OUT gctPOINTER
* KernelPointer
742 /* Unmap user pointer. */
744 gckOS_UnmapUserPointer(
746 IN gctPOINTER Pointer
,
748 IN gctPOINTER KernelPointer
751 /*******************************************************************************
753 ** gckOS_QueryNeedCopy
755 ** Query whether the memory can be accessed or mapped directly or it has to be
761 ** Pointer to an gckOS object.
763 ** gctUINT32 ProcessID
764 ** Process ID of the current process.
768 ** gctBOOL_PTR NeedCopy
769 ** Pointer to a boolean receiving gcvTRUE if the memory needs a copy or
770 ** gcvFALSE if the memory can be accessed or mapped dircetly.
775 IN gctUINT32 ProcessID
,
776 OUT gctBOOL_PTR NeedCopy
779 /*******************************************************************************
781 ** gckOS_CopyFromUserData
783 ** Copy data from user to kernel memory.
788 ** Pointer to an gckOS object.
790 ** gctPOINTER KernelPointer
791 ** Pointer to kernel memory.
793 ** gctPOINTER Pointer
794 ** Pointer to user memory.
797 ** Number of bytes to copy.
804 gckOS_CopyFromUserData(
806 IN gctPOINTER KernelPointer
,
807 IN gctPOINTER Pointer
,
811 /*******************************************************************************
813 ** gckOS_CopyToUserData
815 ** Copy data from kernel to user memory.
820 ** Pointer to an gckOS object.
822 ** gctPOINTER KernelPointer
823 ** Pointer to kernel memory.
825 ** gctPOINTER Pointer
826 ** Pointer to user memory.
829 ** Number of bytes to copy.
836 gckOS_CopyToUserData(
838 IN gctPOINTER KernelPointer
,
839 IN gctPOINTER Pointer
,
844 /* Map user physical address. */
846 gckOS_MapUserPhysical(
848 IN gctPHYS_ADDR Phys
,
849 OUT gctPOINTER
* KernelPointer
854 gckOS_SuspendInterrupt(
859 gckOS_SuspendInterruptEx(
865 gckOS_ResumeInterrupt(
870 gckOS_ResumeInterruptEx(
875 /* Get the base address for the physical memory. */
877 gckOS_GetBaseAddress(
879 OUT gctUINT32_PTR BaseAddress
882 /* Perform a memory copy. */
885 IN gctPOINTER Destination
,
886 IN gctCONST_POINTER Source
,
893 IN gctPOINTER Memory
,
897 /* Device I/O control to the kernel HAL layer. */
902 IN gctUINT32 IoControlCode
,
903 IN gctPOINTER InputBuffer
,
904 IN gctSIZE_T InputBufferSize
,
905 OUT gctPOINTER OutputBuffer
,
906 IN gctSIZE_T OutputBufferSize
909 #if gcdENABLE_BANK_ALIGNMENT
911 gckOS_GetSurfaceBankAlignment(
913 IN gceSURF_TYPE Type
,
914 IN gctUINT32 BaseAddress
,
915 OUT gctUINT32_PTR Alignment
919 /*******************************************************************************
921 ** gckOS_GetProcessID
923 ** Get current process ID.
931 ** gctUINT32_PTR ProcessID
932 ** Pointer to the variable that receives the process ID.
936 OUT gctUINT32_PTR ProcessID
940 gckOS_GetCurrentProcessID(
941 OUT gctUINT32_PTR ProcessID
944 /*******************************************************************************
948 ** Get current thread ID.
956 ** gctUINT32_PTR ThreadID
957 ** Pointer to the variable that receives the thread ID.
961 OUT gctUINT32_PTR ThreadID
964 /******************************************************************************\
965 ********************************** Signal Object *********************************
966 \******************************************************************************/
968 /* Create a signal. */
972 IN gctBOOL ManualReset
,
973 OUT gctSIGNAL
* Signal
976 /* Destroy a signal. */
983 /* Signal a signal. */
991 /* Wait for a signal. */
999 /* Map a user signal to the kernel space. */
1003 IN gctSIGNAL Signal
,
1004 IN gctHANDLE Process
,
1005 OUT gctSIGNAL
* MappedSignal
1008 /* Unmap a user signal */
1015 /* Map user memory. */
1017 gckOS_MapUserMemory(
1019 IN gctPOINTER Memory
,
1021 OUT gctPOINTER
* Info
,
1022 OUT gctUINT32_PTR Address
1025 /* Map user memory. */
1027 gckOS_MapUserMemoryEx(
1030 IN gctPOINTER Memory
,
1032 OUT gctPOINTER
* Info
,
1033 OUT gctUINT32_PTR Address
1036 /* Unmap user memory. */
1038 gckOS_UnmapUserMemory(
1040 IN gctPOINTER Memory
,
1043 IN gctUINT32 Address
1046 /* Unmap user memory. */
1048 gckOS_UnmapUserMemoryEx(
1051 IN gctPOINTER Memory
,
1054 IN gctUINT32 Address
1057 #if !USE_NEW_LINUX_SIGNAL
1058 /* Create signal to be used in the user space. */
1060 gckOS_CreateUserSignal(
1062 IN gctBOOL ManualReset
,
1063 OUT gctINT
* SignalID
1066 /* Destroy signal used in the user space. */
1068 gckOS_DestroyUserSignal(
1073 /* Wait for signal used in the user space. */
1075 gckOS_WaitUserSignal(
1081 /* Signal a signal used in the user space. */
1083 gckOS_SignalUserSignal(
1088 #endif /* USE_NEW_LINUX_SIGNAL */
1090 /* Set a signal owned by a process. */
1091 #if defined(__QNXNTO__)
1095 IN gctSIGNAL Signal
,
1103 IN gctSIGNAL Signal
,
1104 IN gctHANDLE Process
1108 /******************************************************************************\
1115 gctUINT32 ProcessID
,
1116 gctPHYS_ADDR Handle
,
1117 gctPOINTER Physical
,
1125 gctUINT32 ProcessID
,
1126 gctPHYS_ADDR Handle
,
1127 gctPOINTER Physical
,
1133 gckOS_CacheInvalidate(
1135 gctUINT32 ProcessID
,
1136 gctPHYS_ADDR Handle
,
1137 gctPOINTER Physical
,
1142 /******************************************************************************\
1147 gckOS_SetDebugLevel(
1157 gckOS_SetDebugLevelZone(
1163 gckOS_SetDebugZones(
1170 IN gctCONST_STRING FileName
1173 /*******************************************************************************
1174 ** Broadcast interface.
1177 typedef enum _gceBROADCAST
1179 /* GPU might be idle. */
1180 gcvBROADCAST_GPU_IDLE
,
1182 /* A commit is going to happen. */
1183 gcvBROADCAST_GPU_COMMIT
,
1185 /* GPU seems to be stuck. */
1186 gcvBROADCAST_GPU_STUCK
,
1188 /* First process gets attached. */
1189 gcvBROADCAST_FIRST_PROCESS
,
1191 /* Last process gets detached. */
1192 gcvBROADCAST_LAST_PROCESS
,
1194 /* AXI bus error. */
1195 gcvBROADCAST_AXI_BUS_ERROR
,
1202 IN gckHARDWARE Hardware
,
1203 IN gceBROADCAST Reason
1207 gckOS_BroadcastHurry(
1209 IN gckHARDWARE Hardware
,
1214 gckOS_BroadcastCalibrateSpeed(
1216 IN gckHARDWARE Hardware
,
1221 /*******************************************************************************
1223 ** gckOS_SetGPUPower
1225 ** Set the power of the GPU on or off.
1230 ** Pointer to a gckOS object.ß
1233 ** gcvTRUE to turn on the clock, or gcvFALSE to turn off the clock.
1236 ** gcvTRUE to turn on the power, or gcvFALSE to turn off the power.
1249 /*******************************************************************************
1253 /* Create a new semaphore. */
1255 gckOS_CreateSemaphore(
1257 OUT gctPOINTER
* Semaphore
1262 gckOS_CreateSemaphoreVG(
1264 OUT gctPOINTER
* Semaphore
1268 /* Delete a semahore. */
1270 gckOS_DestroySemaphore(
1272 IN gctPOINTER Semaphore
1275 /* Acquire a semahore. */
1277 gckOS_AcquireSemaphore(
1279 IN gctPOINTER Semaphore
1282 /* Try to acquire a semahore. */
1284 gckOS_TryAcquireSemaphore(
1286 IN gctPOINTER Semaphore
1289 /* Release a semahore. */
1291 gckOS_ReleaseSemaphore(
1293 IN gctPOINTER Semaphore
1296 /******************************************************************************\
1297 ********************************* gckHEAP Object ********************************
1298 \******************************************************************************/
1300 typedef struct _gckHEAP
* gckHEAP
;
1302 /* Construct a new gckHEAP object. */
1306 IN gctSIZE_T AllocationSize
,
1310 /* Destroy an gckHEAP object. */
1316 /* Allocate memory. */
1321 OUT gctPOINTER
* Node
1331 /* Profile the heap. */
1333 gckHEAP_ProfileStart(
1340 IN gctCONST_STRING Title
1344 /******************************************************************************\
1345 ******************************** gckVIDMEM Object ******************************
1346 \******************************************************************************/
1348 typedef struct _gckVIDMEM
* gckVIDMEM
;
1349 typedef struct _gckKERNEL
* gckKERNEL
;
1350 typedef struct _gckDB
* gckDB
;
1352 /* Construct a new gckVIDMEM object. */
1354 gckVIDMEM_Construct(
1356 IN gctUINT32 BaseAddress
,
1358 IN gctSIZE_T Threshold
,
1359 IN gctSIZE_T Banking
,
1360 OUT gckVIDMEM
* Memory
1363 /* Destroy an gckVDIMEM object. */
1369 /* Allocate rectangular memory. */
1372 IN gckVIDMEM Memory
,
1376 IN gctUINT BytesPerPixel
,
1377 IN gctUINT32 Alignment
,
1378 IN gceSURF_TYPE Type
,
1379 OUT gcuVIDMEM_NODE_PTR
* Node
1382 /* Allocate linear memory. */
1384 gckVIDMEM_AllocateLinear(
1385 IN gckVIDMEM Memory
,
1387 IN gctUINT32 Alignment
,
1388 IN gceSURF_TYPE Type
,
1389 OUT gcuVIDMEM_NODE_PTR
* Node
1395 IN gcuVIDMEM_NODE_PTR Node
1401 IN gckKERNEL Kernel
,
1402 IN gcuVIDMEM_NODE_PTR Node
,
1403 IN gctBOOL Cacheable
,
1404 OUT gctUINT32
* Address
1407 /* Unlock memory. */
1410 IN gckKERNEL Kernel
,
1411 IN gcuVIDMEM_NODE_PTR Node
,
1412 IN gceSURF_TYPE Type
,
1413 IN OUT gctBOOL
* Asynchroneous
1416 /* Construct a gcuVIDMEM_NODE union for virtual memory. */
1418 gckVIDMEM_ConstructVirtual(
1419 IN gckKERNEL Kernel
,
1420 IN gctBOOL Contiguous
,
1422 OUT gcuVIDMEM_NODE_PTR
* Node
1425 /* Destroy a gcuVIDMEM_NODE union for virtual memory. */
1427 gckVIDMEM_DestroyVirtual(
1428 IN gcuVIDMEM_NODE_PTR Node
1431 /******************************************************************************\
1432 ******************************** gckKERNEL Object ******************************
1433 \******************************************************************************/
1435 struct _gcsHAL_INTERFACE
;
1437 /* Notifications. */
1438 typedef enum _gceNOTIFY
1440 gcvNOTIFY_INTERRUPT
,
1441 gcvNOTIFY_COMMAND_QUEUE
,
1446 typedef enum _gceKERNEL_FLUSH
1448 gcvFLUSH_COLOR
= 0x01,
1449 gcvFLUSH_DEPTH
= 0x02,
1450 gcvFLUSH_TEXTURE
= 0x04,
1452 gcvFLUSH_ALL
= gcvFLUSH_COLOR
1459 /* Construct a new gckKERNEL object. */
1461 gckKERNEL_Construct(
1464 IN gctPOINTER Context
,
1466 OUT gckKERNEL
* Kernel
1469 /* Destroy an gckKERNEL object. */
1475 /* Dispatch a user-level command. */
1478 IN gckKERNEL Kernel
,
1479 IN gctBOOL FromUser
,
1480 IN OUT
struct _gcsHAL_INTERFACE
* Interface
1483 /* Query the video memory. */
1485 gckKERNEL_QueryVideoMemory(
1486 IN gckKERNEL Kernel
,
1487 OUT
struct _gcsHAL_INTERFACE
* Interface
1490 /* Lookup the gckVIDMEM object for a pool. */
1492 gckKERNEL_GetVideoMemoryPool(
1493 IN gckKERNEL Kernel
,
1495 OUT gckVIDMEM
* VideoMemory
1498 #if gcdUSE_VIDMEM_PER_PID
1500 gckKERNEL_GetVideoMemoryPoolPid(
1501 IN gckKERNEL Kernel
,
1504 OUT gckVIDMEM
* VideoMemory
1508 gckKERNEL_CreateVideoMemoryPoolPid(
1509 IN gckKERNEL Kernel
,
1512 OUT gckVIDMEM
* VideoMemory
1516 gckKERNEL_RemoveVideoMemoryPoolPid(
1517 IN gckKERNEL Kernel
,
1518 IN gckVIDMEM VideoMemory
1522 /* Map video memory. */
1524 gckKERNEL_MapVideoMemory(
1525 IN gckKERNEL Kernel
,
1526 IN gctBOOL InUserSpace
,
1527 IN gctUINT32 Address
,
1532 OUT gctPOINTER
* Logical
1535 /* Map video memory. */
1537 gckKERNEL_MapVideoMemoryEx(
1538 IN gckKERNEL Kernel
,
1540 IN gctBOOL InUserSpace
,
1541 IN gctUINT32 Address
,
1546 OUT gctPOINTER
* Logical
1550 /* Unmap video memory. */
1552 gckKERNEL_UnmapVideoMemory(
1553 IN gckKERNEL Kernel
,
1554 IN gctPOINTER Logical
,
1562 gckKERNEL_MapMemory(
1563 IN gckKERNEL Kernel
,
1564 IN gctPHYS_ADDR Physical
,
1566 OUT gctPOINTER
* Logical
1571 gckKERNEL_UnmapMemory(
1572 IN gckKERNEL Kernel
,
1573 IN gctPHYS_ADDR Physical
,
1575 IN gctPOINTER Logical
1578 /* Notification of events. */
1581 IN gckKERNEL Kernel
,
1582 IN gceNOTIFY Notifcation
,
1587 gckKERNEL_QuerySettings(
1588 IN gckKERNEL Kernel
,
1589 OUT gcsKERNEL_SETTINGS
* Settings
1592 /*******************************************************************************
1594 ** gckKERNEL_Recovery
1596 ** Try to recover the GPU from a fatal error.
1601 ** Pointer to an gckKERNEL object.
1612 /* Set the value of timeout on HW operation. */
1614 gckKERNEL_SetTimeOut(
1615 IN gckKERNEL Kernel
,
1616 IN gctUINT32 timeOut
1619 /* Get access to the user data. */
1621 gckKERNEL_OpenUserData(
1622 IN gckKERNEL Kernel
,
1623 IN gctBOOL NeedCopy
,
1624 IN gctPOINTER StaticStorage
,
1625 IN gctPOINTER UserPointer
,
1627 OUT gctPOINTER
* KernelPointer
1630 /* Release resources associated with the user data connection. */
1632 gckKERNEL_CloseUserData(
1633 IN gckKERNEL Kernel
,
1634 IN gctBOOL NeedCopy
,
1635 IN gctBOOL FlushData
,
1636 IN gctPOINTER UserPointer
,
1638 OUT gctPOINTER
* KernelPointer
1641 /******************************************************************************\
1642 ******************************* gckHARDWARE Object *****************************
1643 \******************************************************************************/
1645 /* Construct a new gckHARDWARE object. */
1647 gckHARDWARE_Construct(
1650 OUT gckHARDWARE
* Hardware
1653 /* Destroy an gckHARDWARE object. */
1655 gckHARDWARE_Destroy(
1656 IN gckHARDWARE Hardware
1659 /* Get hardware type. */
1661 gckHARDWARE_GetType(
1662 IN gckHARDWARE Hardware
,
1663 OUT gceHARDWARE_TYPE
* Type
1666 /* Query system memory requirements. */
1668 gckHARDWARE_QuerySystemMemory(
1669 IN gckHARDWARE Hardware
,
1670 OUT gctSIZE_T
* SystemSize
,
1671 OUT gctUINT32
* SystemBaseAddress
1674 /* Build virtual address. */
1676 gckHARDWARE_BuildVirtualAddress(
1677 IN gckHARDWARE Hardware
,
1679 IN gctUINT32 Offset
,
1680 OUT gctUINT32
* Address
1683 /* Query command buffer requirements. */
1685 gckHARDWARE_QueryCommandBuffer(
1686 IN gckHARDWARE Hardware
,
1687 OUT gctSIZE_T
* Alignment
,
1688 OUT gctSIZE_T
* ReservedHead
,
1689 OUT gctSIZE_T
* ReservedTail
1692 /* Add a WAIT/LINK pair in the command queue. */
1694 gckHARDWARE_WaitLink(
1695 IN gckHARDWARE Hardware
,
1696 IN gctPOINTER Logical
,
1697 IN gctUINT32 Offset
,
1698 IN OUT gctSIZE_T
* Bytes
,
1699 OUT gctUINT32
* WaitOffset
,
1700 OUT gctSIZE_T
* WaitBytes
1703 /* Kickstart the command processor. */
1705 gckHARDWARE_Execute(
1706 IN gckHARDWARE Hardware
,
1707 IN gctPOINTER Logical
,
1709 IN gctPOINTER Physical
,
1710 IN gctBOOL PhysicalAddresses
,
1715 /* Add an END command in the command queue. */
1718 IN gckHARDWARE Hardware
,
1719 IN gctPOINTER Logical
,
1720 IN OUT gctSIZE_T
* Bytes
1723 /* Add a NOP command in the command queue. */
1726 IN gckHARDWARE Hardware
,
1727 IN gctPOINTER Logical
,
1728 IN OUT gctSIZE_T
* Bytes
1731 /* Add a WAIT command in the command queue. */
1734 IN gckHARDWARE Hardware
,
1735 IN gctPOINTER Logical
,
1737 IN OUT gctSIZE_T
* Bytes
1740 /* Add a PIPESELECT command in the command queue. */
1742 gckHARDWARE_PipeSelect(
1743 IN gckHARDWARE Hardware
,
1744 IN gctPOINTER Logical
,
1745 IN gcePIPE_SELECT Pipe
,
1746 IN OUT gctSIZE_T
* Bytes
1749 /* Add a LINK command in the command queue. */
1752 IN gckHARDWARE Hardware
,
1753 IN gctPOINTER Logical
,
1754 IN gctPOINTER FetchAddress
,
1755 IN gctSIZE_T FetchSize
,
1756 IN OUT gctSIZE_T
* Bytes
1759 /* Add an EVENT command in the command queue. */
1762 IN gckHARDWARE Hardware
,
1763 IN gctPOINTER Logical
,
1765 IN gceKERNEL_WHERE FromWhere
,
1766 IN OUT gctSIZE_T
* Bytes
1769 /* Query the available memory. */
1771 gckHARDWARE_QueryMemory(
1772 IN gckHARDWARE Hardware
,
1773 OUT gctSIZE_T
* InternalSize
,
1774 OUT gctUINT32
* InternalBaseAddress
,
1775 OUT gctUINT32
* InternalAlignment
,
1776 OUT gctSIZE_T
* ExternalSize
,
1777 OUT gctUINT32
* ExternalBaseAddress
,
1778 OUT gctUINT32
* ExternalAlignment
,
1779 OUT gctUINT32
* HorizontalTileSize
,
1780 OUT gctUINT32
* VerticalTileSize
1783 /* Query the identity of the hardware. */
1785 gckHARDWARE_QueryChipIdentity(
1786 IN gckHARDWARE Hardware
,
1787 OUT gceCHIPMODEL
* ChipModel
,
1788 OUT gctUINT32
* ChipRevision
,
1789 OUT gctUINT32
* ChipFeatures
,
1790 OUT gctUINT32
* ChipMinorFeatures
,
1791 OUT gctUINT32
* ChipMinorFeatures1
,
1792 OUT gctUINT32
* ChipMinorFeatures2
,
1793 OUT gctUINT32
* ChipMinorFeatures3
1796 /* Query the specifications sof the hardware. */
1798 gckHARDWARE_QueryChipSpecs(
1799 IN gckHARDWARE Hardware
,
1800 OUT gctUINT32_PTR StreamCount
,
1801 OUT gctUINT32_PTR RegisterMax
,
1802 OUT gctUINT32_PTR ThreadCount
,
1803 OUT gctUINT32_PTR ShaderCoreCount
,
1804 OUT gctUINT32_PTR VertexCacheSize
,
1805 OUT gctUINT32_PTR VertexOutputBufferSize
,
1806 OUT gctUINT32_PTR PixelPipes
,
1807 OUT gctUINT32_PTR InstructionCount
,
1808 OUT gctUINT32_PTR NumConstants
,
1809 OUT gctUINT32_PTR BufferSize
1812 /* Query the shader support. */
1814 gckHARDWARE_QueryShaderCaps(
1815 IN gckHARDWARE Hardware
,
1816 OUT gctUINT
* VertexUniforms
,
1817 OUT gctUINT
* FragmentUniforms
,
1818 OUT gctUINT
* Varyings
1821 /* Convert an API format. */
1823 gckHARDWARE_ConvertFormat(
1824 IN gckHARDWARE Hardware
,
1825 IN gceSURF_FORMAT Format
,
1826 OUT gctUINT32
* BitsPerPixel
,
1827 OUT gctUINT32
* BytesPerTile
1830 /* Split a harwdare specific address into API stuff. */
1832 gckHARDWARE_SplitMemory(
1833 IN gckHARDWARE Hardware
,
1834 IN gctUINT32 Address
,
1836 OUT gctUINT32
* Offset
1839 /* Align size to tile boundary. */
1841 gckHARDWARE_AlignToTile(
1842 IN gckHARDWARE Hardware
,
1843 IN gceSURF_TYPE Type
,
1844 IN OUT gctUINT32_PTR Width
,
1845 IN OUT gctUINT32_PTR Height
,
1846 OUT gctBOOL_PTR SuperTiled
1849 /* Update command queue tail pointer. */
1851 gckHARDWARE_UpdateQueueTail(
1852 IN gckHARDWARE Hardware
,
1853 IN gctPOINTER Logical
,
1857 /* Convert logical address to hardware specific address. */
1859 gckHARDWARE_ConvertLogical(
1860 IN gckHARDWARE Hardware
,
1861 IN gctPOINTER Logical
,
1862 OUT gctUINT32
* Address
1866 /* Convert physical address to hardware specific address. */
1868 gckHARDWARE_ConvertPhysical(
1869 IN gckHARDWARE Hardware
,
1870 IN gctPHYS_ADDR Physical
,
1871 OUT gctUINT32
* Address
1875 /* Interrupt manager. */
1877 gckHARDWARE_Interrupt(
1878 IN gckHARDWARE Hardware
,
1879 IN gctBOOL InterruptValid
1885 IN gckHARDWARE Hardware
,
1886 IN gctPOINTER Logical
1889 /* Flush the MMU. */
1891 gckHARDWARE_FlushMMU(
1892 IN gckHARDWARE Hardware
1895 /* Set the page table base address. */
1897 gckHARDWARE_SetMMUv2(
1898 IN gckHARDWARE Hardware
,
1900 IN gctPOINTER MtlbAddress
,
1901 IN gceMMU_MODE Mode
,
1902 IN gctPOINTER SafeAddress
1905 /* Get idle register. */
1907 gckHARDWARE_GetIdle(
1908 IN gckHARDWARE Hardware
,
1910 OUT gctUINT32
* Data
1913 /* Flush the caches. */
1916 IN gckHARDWARE Hardware
,
1917 IN gceKERNEL_FLUSH Flush
,
1918 IN gctPOINTER Logical
,
1919 IN OUT gctSIZE_T
* Bytes
1922 /* Enable/disable fast clear. */
1924 gckHARDWARE_SetFastClear(
1925 IN gckHARDWARE Hardware
,
1927 IN gctINT Compression
1931 gckHARDWARE_ReadInterrupt(
1932 IN gckHARDWARE Hardware
,
1933 OUT gctUINT32_PTR IDs
1936 /* Power management. */
1938 gckHARDWARE_SetPowerManagementState(
1939 IN gckHARDWARE Hardware
,
1940 IN gceCHIPPOWERSTATE State
1944 gckHARDWARE_QueryPowerManagementState(
1945 IN gckHARDWARE Hardware
,
1946 OUT gceCHIPPOWERSTATE
* State
1949 /* Profile 2D Engine. */
1951 gckHARDWARE_ProfileEngine2D(
1952 IN gckHARDWARE Hardware
,
1953 OUT gcs2D_PROFILE_PTR Profile
1957 gckHARDWARE_InitializeHardware(
1958 IN gckHARDWARE Hardware
1963 IN gckHARDWARE Hardware
1966 typedef gceSTATUS (*gctISRMANAGERFUNC
)(gctPOINTER Context
);
1969 gckHARDWARE_SetIsrManager(
1970 IN gckHARDWARE Hardware
,
1971 IN gctISRMANAGERFUNC StartIsr
,
1972 IN gctISRMANAGERFUNC StopIsr
,
1973 IN gctPOINTER Context
1976 /* Start a composition. */
1978 gckHARDWARE_Compose(
1979 IN gckHARDWARE Hardware
,
1980 IN gctUINT32 ProcessID
,
1982 IN gctPHYS_ADDR Physical
,
1983 IN gctPOINTER Logical
,
1987 /* Check for Hardware features. */
1989 gckHARDWARE_IsFeatureAvailable(
1990 IN gckHARDWARE Hardware
,
1991 IN gceFEATURE Feature
1995 /******************************************************************************\
1996 ***************************** gckINTERRUPT Object ******************************
1997 \******************************************************************************/
1999 typedef struct _gckINTERRUPT
* gckINTERRUPT
;
2001 typedef gceSTATUS (* gctINTERRUPT_HANDLER
)(
2006 gckINTERRUPT_Construct(
2007 IN gckKERNEL Kernel
,
2008 OUT gckINTERRUPT
* Interrupt
2012 gckINTERRUPT_Destroy(
2013 IN gckINTERRUPT Interrupt
2017 gckINTERRUPT_SetHandler(
2018 IN gckINTERRUPT Interrupt
,
2019 IN OUT gctINT32_PTR Id
,
2020 IN gctINTERRUPT_HANDLER Handler
2024 gckINTERRUPT_Notify(
2025 IN gckINTERRUPT Interrupt
,
2029 /******************************************************************************\
2030 ******************************** gckEVENT Object *******************************
2031 \******************************************************************************/
2033 typedef struct _gckEVENT
* gckEVENT
;
2035 /* Construct a new gckEVENT object. */
2038 IN gckKERNEL Kernel
,
2039 OUT gckEVENT
* Event
2042 /* Destroy an gckEVENT object. */
2048 /* Reserve the next available hardware event. */
2053 OUT gctUINT8
* EventID
,
2054 IN gceKERNEL_WHERE Source
2057 /* Add a new event to the list of events. */
2061 IN gcsHAL_INTERFACE_PTR Interface
,
2062 IN gceKERNEL_WHERE FromWhere
,
2063 IN gctBOOL AllocateAllowed
2066 /* Schedule a FreeNonPagedMemory event. */
2068 gckEVENT_FreeNonPagedMemory(
2071 IN gctPHYS_ADDR Physical
,
2072 IN gctPOINTER Logical
,
2073 IN gceKERNEL_WHERE FromWhere
2076 /* Schedule a FreeContiguousMemory event. */
2078 gckEVENT_FreeContiguousMemory(
2081 IN gctPHYS_ADDR Physical
,
2082 IN gctPOINTER Logical
,
2083 IN gceKERNEL_WHERE FromWhere
2086 /* Schedule a FreeVideoMemory event. */
2088 gckEVENT_FreeVideoMemory(
2090 IN gcuVIDMEM_NODE_PTR VideoMemory
,
2091 IN gceKERNEL_WHERE FromWhere
2094 /* Schedule a signal event. */
2098 IN gctSIGNAL Signal
,
2099 IN gceKERNEL_WHERE FromWhere
2102 /* Schedule an Unlock event. */
2106 IN gceKERNEL_WHERE FromWhere
,
2107 IN gcuVIDMEM_NODE_PTR Node
,
2108 IN gceSURF_TYPE Type
2115 IN gctBOOL FromPower
2118 /* Commit an event queue. */
2122 IN gcsQUEUE_PTR Queue
2125 /* Schedule a composition event. */
2129 IN gcsHAL_COMPOSE_PTR Info
2132 /* Event callback routine. */
2139 /* Event callback routine. */
2146 /******************************************************************************\
2147 ******************************* gckCOMMAND Object ******************************
2148 \******************************************************************************/
2150 typedef struct _gckCOMMAND
* gckCOMMAND
;
2152 /* Construct a new gckCOMMAND object. */
2154 gckCOMMAND_Construct(
2155 IN gckKERNEL Kernel
,
2156 OUT gckCOMMAND
* Command
2159 /* Destroy an gckCOMMAND object. */
2162 IN gckCOMMAND Command
2165 /* Acquire command queue synchronization objects. */
2167 gckCOMMAND_EnterCommit(
2168 IN gckCOMMAND Command
,
2169 IN gctBOOL FromPower
2172 /* Release command queue synchronization objects. */
2174 gckCOMMAND_ExitCommit(
2175 IN gckCOMMAND Command
,
2176 IN gctBOOL FromPower
2179 /* Start the command queue. */
2182 IN gckCOMMAND Command
2185 /* Stop the command queue. */
2188 IN gckCOMMAND Command
2191 /* Commit a buffer to the command queue. */
2194 IN gckCOMMAND Command
,
2195 IN gckCONTEXT Context
,
2196 IN gcoCMDBUF CommandBuffer
,
2197 IN gcsSTATE_DELTA_PTR StateDelta
,
2198 IN gcsQUEUE_PTR EventQueue
,
2199 IN gctUINT32 ProcessID
2202 /* Reserve space in the command buffer. */
2205 IN gckCOMMAND Command
,
2206 IN gctSIZE_T RequestedBytes
,
2207 OUT gctPOINTER
* Buffer
,
2208 OUT gctSIZE_T
* BufferSize
2211 /* Execute reserved space in the command buffer. */
2214 IN gckCOMMAND Command
,
2215 IN gctSIZE_T RequstedBytes
2218 /* Stall the command queue. */
2221 IN gckCOMMAND Command
,
2222 IN gctBOOL FromPower
2225 /* Attach user process. */
2228 IN gckCOMMAND Command
,
2229 OUT gckCONTEXT
* Context
,
2230 OUT gctSIZE_T
* StateCount
,
2231 IN gctUINT32 ProcessID
2234 /* Detach user process. */
2237 IN gckCOMMAND Command
,
2238 IN gckCONTEXT Context
2241 /******************************************************************************\
2242 ********************************* gckMMU Object ********************************
2243 \******************************************************************************/
2245 typedef struct _gckMMU
* gckMMU
;
2247 /* Construct a new gckMMU object. */
2250 IN gckKERNEL Kernel
,
2251 IN gctSIZE_T MmuSize
,
2255 /* Destroy an gckMMU object. */
2261 /* Enable the MMU. */
2265 IN gctUINT32 PhysBaseAddr
,
2266 IN gctUINT32 PhysSize
2269 /* Allocate pages inside the MMU. */
2271 gckMMU_AllocatePages(
2273 IN gctSIZE_T PageCount
,
2274 OUT gctPOINTER
* PageTable
,
2275 OUT gctUINT32
* Address
2278 /* Remove a page table from the MMU. */
2282 IN gctPOINTER PageTable
,
2283 IN gctSIZE_T PageCount
2286 /* Set the MMU page with info. */
2290 IN gctUINT32 PageAddress
,
2291 IN gctUINT32
*PageEntry
2298 IN gcuVIDMEM_NODE_PTR Node
);
2303 IN gcuVIDMEM_NODE_PTR Node
);
2308 gckMMU_FreeHandleMemory(
2309 IN gckKERNEL Kernel
,
2316 #if VIVANTE_PROFILER
2318 gckHARDWARE_QueryProfileRegisters(
2319 IN gckHARDWARE Hardware
,
2320 OUT gcsPROFILER_COUNTERS
* Counters
2331 #include "gc_hal_vg.h"
2334 #endif /* __gc_hal_h_ */