summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'src/hal/kernel/gc_hal_kernel.h')
-rwxr-xr-xsrc/hal/kernel/gc_hal_kernel.h1485
1 files changed, 1485 insertions, 0 deletions
diff --git a/src/hal/kernel/gc_hal_kernel.h b/src/hal/kernel/gc_hal_kernel.h
new file mode 100755
index 0000000..14419e8
--- /dev/null
+++ b/src/hal/kernel/gc_hal_kernel.h
@@ -0,0 +1,1485 @@
1/****************************************************************************
2*
3* The MIT License (MIT)
4*
5* Copyright (c) 2014 Vivante Corporation
6*
7* Permission is hereby granted, free of charge, to any person obtaining a
8* copy of this software and associated documentation files (the "Software"),
9* to deal in the Software without restriction, including without limitation
10* the rights to use, copy, modify, merge, publish, distribute, sublicense,
11* and/or sell copies of the Software, and to permit persons to whom the
12* Software is furnished to do so, subject to the following conditions:
13*
14* The above copyright notice and this permission notice shall be included in
15* all copies or substantial portions of the Software.
16*
17* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23* DEALINGS IN THE SOFTWARE.
24*
25*****************************************************************************
26*
27* The GPL License (GPL)
28*
29* Copyright (C) 2014 Vivante Corporation
30*
31* This program is free software; you can redistribute it and/or
32* modify it under the terms of the GNU General Public License
33* as published by the Free Software Foundation; either version 2
34* of the License, or (at your option) any later version.
35*
36* This program is distributed in the hope that it will be useful,
37* but WITHOUT ANY WARRANTY; without even the implied warranty of
38* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
39* GNU General Public License for more details.
40*
41* You should have received a copy of the GNU General Public License
42* along with this program; if not, write to the Free Software Foundation,
43* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
44*
45*****************************************************************************
46*
47* Note: This software is released under dual MIT and GPL licenses. A
48* recipient may use this file under the terms of either the MIT license or
49* GPL License. If you wish to use only one license not the other, you can
50* indicate your decision by deleting one of the above license notices in your
51* version of this file.
52*
53*****************************************************************************/
54
55
56#ifndef __gc_hal_kernel_h_
57#define __gc_hal_kernel_h_
58
59#include "gc_hal.h"
60#include "gc_hal_kernel_hardware.h"
61#include "gc_hal_driver.h"
62
63#include "gc_hal_kernel_mutex.h"
64
65
66
67#ifdef __cplusplus
68extern "C" {
69#endif
70
71/*******************************************************************************
72***** New MMU Defination *******************************************************/
73#define gcdMMU_MTLB_SHIFT 22
74#define gcdMMU_STLB_4K_SHIFT 12
75#define gcdMMU_STLB_64K_SHIFT 16
76
77#define gcdMMU_MTLB_BITS (32 - gcdMMU_MTLB_SHIFT)
78#define gcdMMU_PAGE_4K_BITS gcdMMU_STLB_4K_SHIFT
79#define gcdMMU_STLB_4K_BITS (32 - gcdMMU_MTLB_BITS - gcdMMU_PAGE_4K_BITS)
80#define gcdMMU_PAGE_64K_BITS gcdMMU_STLB_64K_SHIFT
81#define gcdMMU_STLB_64K_BITS (32 - gcdMMU_MTLB_BITS - gcdMMU_PAGE_64K_BITS)
82
83#define gcdMMU_MTLB_ENTRY_NUM (1 << gcdMMU_MTLB_BITS)
84#define gcdMMU_MTLB_SIZE (gcdMMU_MTLB_ENTRY_NUM << 2)
85#define gcdMMU_STLB_4K_ENTRY_NUM (1 << gcdMMU_STLB_4K_BITS)
86#define gcdMMU_STLB_4K_SIZE (gcdMMU_STLB_4K_ENTRY_NUM << 2)
87#define gcdMMU_PAGE_4K_SIZE (1 << gcdMMU_STLB_4K_SHIFT)
88#define gcdMMU_STLB_64K_ENTRY_NUM (1 << gcdMMU_STLB_64K_BITS)
89#define gcdMMU_STLB_64K_SIZE (gcdMMU_STLB_64K_ENTRY_NUM << 2)
90#define gcdMMU_PAGE_64K_SIZE (1 << gcdMMU_STLB_64K_SHIFT)
91
92#define gcdMMU_MTLB_MASK (~((1U << gcdMMU_MTLB_SHIFT)-1))
93#define gcdMMU_STLB_4K_MASK ((~0U << gcdMMU_STLB_4K_SHIFT) ^ gcdMMU_MTLB_MASK)
94#define gcdMMU_PAGE_4K_MASK (gcdMMU_PAGE_4K_SIZE - 1)
95#define gcdMMU_STLB_64K_MASK ((~((1U << gcdMMU_STLB_64K_SHIFT)-1)) ^ gcdMMU_MTLB_MASK)
96#define gcdMMU_PAGE_64K_MASK (gcdMMU_PAGE_64K_SIZE - 1)
97
98/* Page offset definitions. */
99#define gcdMMU_OFFSET_4K_BITS (32 - gcdMMU_MTLB_BITS - gcdMMU_STLB_4K_BITS)
100#define gcdMMU_OFFSET_4K_MASK ((1U << gcdMMU_OFFSET_4K_BITS) - 1)
101#define gcdMMU_OFFSET_16K_BITS (32 - gcdMMU_MTLB_BITS - gcdMMU_STLB_16K_BITS)
102#define gcdMMU_OFFSET_16K_MASK ((1U << gcdMMU_OFFSET_16K_BITS) - 1)
103
104#define gcdMMU_MTLB_PRESENT 0x00000001
105#define gcdMMU_MTLB_EXCEPTION 0x00000002
106#define gcdMMU_MTLB_4K_PAGE 0x00000000
107
108#define gcdMMU_STLB_PRESENT 0x00000001
109#define gcdMMU_STLB_EXCEPTION 0x00000002
110#define gcdMMU_STLB_4K_PAGE 0x00000000
111
112/*******************************************************************************
113***** Stuck Dump Level ********************************************************/
114
115/* Dump nonthing when stuck happens. */
116#define gcvSTUCK_DUMP_NONE 0
117
118/* Dump GPU state and memory near stuck point. */
119#define gcvSTUCK_DUMP_NEARBY_MEMORY 1
120
121/* Beside gcvSTUCK_DUMP_NEARBY_MEMORY, dump context buffer and user command buffer. */
122#define gcvSTUCK_DUMP_USER_COMMAND 2
123
124/* Beside gcvSTUCK_DUMP_USER_COMMAND, commit will be stall
125** to make sure command causing stuck isn't missed. */
126#define gcvSTUCK_DUMP_STALL_COMMAND 3
127
128/* Beside gcvSTUCK_DUMP_USER_COMMAND, dump kernel command buffer. */
129#define gcvSTUCK_DUMP_ALL_COMMAND 4
130
131/*******************************************************************************
132***** Process Secure Cache ****************************************************/
133
134#define gcdSECURE_CACHE_LRU 1
135#define gcdSECURE_CACHE_LINEAR 2
136#define gcdSECURE_CACHE_HASH 3
137#define gcdSECURE_CACHE_TABLE 4
138
139#define gcvPAGE_TABLE_DIRTY_BIT_OTHER (1 << 0)
140#define gcvPAGE_TABLE_DIRTY_BIT_FE (1 << 1)
141
142typedef struct _gcskLOGICAL_CACHE * gcskLOGICAL_CACHE_PTR;
143typedef struct _gcskLOGICAL_CACHE gcskLOGICAL_CACHE;
144struct _gcskLOGICAL_CACHE
145{
146 /* Logical address. */
147 gctPOINTER logical;
148
149 /* DMAable address. */
150 gctUINT32 dma;
151
152#if gcdSECURE_CACHE_METHOD == gcdSECURE_CACHE_HASH
153 /* Pointer to the previous and next hash tables. */
154 gcskLOGICAL_CACHE_PTR nextHash;
155 gcskLOGICAL_CACHE_PTR prevHash;
156#endif
157
158#if gcdSECURE_CACHE_METHOD != gcdSECURE_CACHE_TABLE
159 /* Pointer to the previous and next slot. */
160 gcskLOGICAL_CACHE_PTR next;
161 gcskLOGICAL_CACHE_PTR prev;
162#endif
163
164#if gcdSECURE_CACHE_METHOD == gcdSECURE_CACHE_LINEAR
165 /* Time stamp. */
166 gctUINT64 stamp;
167#endif
168};
169
170typedef struct _gcskSECURE_CACHE * gcskSECURE_CACHE_PTR;
171typedef struct _gcskSECURE_CACHE
172{
173 /* Cache memory. */
174 gcskLOGICAL_CACHE cache[1 + gcdSECURE_CACHE_SLOTS];
175
176 /* Last known index for LINEAR mode. */
177 gcskLOGICAL_CACHE_PTR cacheIndex;
178
179 /* Current free slot for LINEAR mode. */
180 gctUINT32 cacheFree;
181
182 /* Time stamp for LINEAR mode. */
183 gctUINT64 cacheStamp;
184
185#if gcdSECURE_CACHE_METHOD == gcdSECURE_CACHE_HASH
186 /* Hash table for HASH mode. */
187 gcskLOGICAL_CACHE hash[256];
188#endif
189}
190gcskSECURE_CACHE;
191
192/*******************************************************************************
193***** Process Database Management *********************************************/
194
195typedef enum _gceDATABASE_TYPE
196{
197 gcvDB_VIDEO_MEMORY = 1, /* Video memory created. */
198 gcvDB_COMMAND_BUFFER, /* Command Buffer. */
199 gcvDB_NON_PAGED, /* Non paged memory. */
200 gcvDB_CONTIGUOUS, /* Contiguous memory. */
201 gcvDB_SIGNAL, /* Signal. */
202 gcvDB_VIDEO_MEMORY_LOCKED, /* Video memory locked. */
203 gcvDB_CONTEXT, /* Context */
204 gcvDB_IDLE, /* GPU idle. */
205 gcvDB_MAP_MEMORY, /* Map memory */
206 gcvDB_MAP_USER_MEMORY, /* Map user memory */
207 gcvDB_SYNC_POINT, /* Sync point. */
208 gcvDB_SHBUF, /* Shared buffer. */
209}
210gceDATABASE_TYPE;
211
212#define gcdDATABASE_TYPE_MASK 0x000000FF
213#define gcdDB_VIDEO_MEMORY_TYPE_MASK 0x0000FF00
214#define gcdDB_VIDEO_MEMORY_TYPE_SHIFT 8
215
216#define gcdDB_VIDEO_MEMORY_POOL_MASK 0x00FF0000
217#define gcdDB_VIDEO_MEMORY_POOL_SHIFT 16
218
219typedef struct _gcsDATABASE_RECORD * gcsDATABASE_RECORD_PTR;
220typedef struct _gcsDATABASE_RECORD
221{
222 /* Pointer to kernel. */
223 gckKERNEL kernel;
224
225 /* Pointer to next database record. */
226 gcsDATABASE_RECORD_PTR next;
227
228 /* Type of record. */
229 gceDATABASE_TYPE type;
230
231 /* Data for record. */
232 gctPOINTER data;
233 gctPHYS_ADDR physical;
234 gctSIZE_T bytes;
235}
236gcsDATABASE_RECORD;
237
238typedef struct _gcsDATABASE * gcsDATABASE_PTR;
239typedef struct _gcsDATABASE
240{
241 /* Pointer to next entry is hash list. */
242 gcsDATABASE_PTR next;
243 gctSIZE_T slot;
244
245 /* Process ID. */
246 gctUINT32 processID;
247
248 /* Sizes to query. */
249 gcsDATABASE_COUNTERS vidMem;
250 gcsDATABASE_COUNTERS nonPaged;
251 gcsDATABASE_COUNTERS contiguous;
252 gcsDATABASE_COUNTERS mapUserMemory;
253 gcsDATABASE_COUNTERS mapMemory;
254 gcsDATABASE_COUNTERS virtualCommandBuffer;
255
256 gcsDATABASE_COUNTERS vidMemType[gcvSURF_NUM_TYPES];
257 /* Counter for each video memory pool. */
258 gcsDATABASE_COUNTERS vidMemPool[gcvPOOL_NUMBER_OF_POOLS];
259 gctPOINTER counterMutex;
260
261 /* Idle time management. */
262 gctUINT64 lastIdle;
263 gctUINT64 idle;
264
265 /* Pointer to database. */
266 gcsDATABASE_RECORD_PTR list[48];
267
268#if gcdSECURE_USER
269 /* Secure cache. */
270 gcskSECURE_CACHE cache;
271#endif
272
273 gctPOINTER handleDatabase;
274 gctPOINTER handleDatabaseMutex;
275
276#if gcdPROCESS_ADDRESS_SPACE
277 gckMMU mmu;
278#endif
279}
280gcsDATABASE;
281
282typedef struct _gcsRECORDER * gckRECORDER;
283
284typedef struct _gcsFDPRIVATE * gcsFDPRIVATE_PTR;
285typedef struct _gcsFDPRIVATE
286{
287 gctINT (* release) (gcsFDPRIVATE_PTR Private);
288}
289gcsFDPRIVATE;
290
291/* Create a process database that will contain all its allocations. */
292gceSTATUS
293gckKERNEL_CreateProcessDB(
294 IN gckKERNEL Kernel,
295 IN gctUINT32 ProcessID
296 );
297
298/* Add a record to the process database. */
299gceSTATUS
300gckKERNEL_AddProcessDB(
301 IN gckKERNEL Kernel,
302 IN gctUINT32 ProcessID,
303 IN gceDATABASE_TYPE Type,
304 IN gctPOINTER Pointer,
305 IN gctPHYS_ADDR Physical,
306 IN gctSIZE_T Size
307 );
308
309/* Remove a record to the process database. */
310gceSTATUS
311gckKERNEL_RemoveProcessDB(
312 IN gckKERNEL Kernel,
313 IN gctUINT32 ProcessID,
314 IN gceDATABASE_TYPE Type,
315 IN gctPOINTER Pointer
316 );
317
318/* Destroy the process database. */
319gceSTATUS
320gckKERNEL_DestroyProcessDB(
321 IN gckKERNEL Kernel,
322 IN gctUINT32 ProcessID
323 );
324
325/* Find a record to the process database. */
326gceSTATUS
327gckKERNEL_FindProcessDB(
328 IN gckKERNEL Kernel,
329 IN gctUINT32 ProcessID,
330 IN gctUINT32 ThreadID,
331 IN gceDATABASE_TYPE Type,
332 IN gctPOINTER Pointer,
333 OUT gcsDATABASE_RECORD_PTR Record
334 );
335
336/* Query the process database. */
337gceSTATUS
338gckKERNEL_QueryProcessDB(
339 IN gckKERNEL Kernel,
340 IN gctUINT32 ProcessID,
341 IN gctBOOL LastProcessID,
342 IN gceDATABASE_TYPE Type,
343 OUT gcuDATABASE_INFO * Info
344 );
345
346/* Dump the process database. */
347gceSTATUS
348gckKERNEL_DumpProcessDB(
349 IN gckKERNEL Kernel
350 );
351
352/* Dump the video memory usage for process specified. */
353gceSTATUS
354gckKERNEL_DumpVidMemUsage(
355 IN gckKERNEL Kernel,
356 IN gctINT32 ProcessID
357 );
358
359gceSTATUS
360gckKERNEL_FindDatabase(
361 IN gckKERNEL Kernel,
362 IN gctUINT32 ProcessID,
363 IN gctBOOL LastProcessID,
364 OUT gcsDATABASE_PTR * Database
365 );
366
367gceSTATUS
368gckKERNEL_FindHandleDatbase(
369 IN gckKERNEL Kernel,
370 IN gctUINT32 ProcessID,
371 OUT gctPOINTER * HandleDatabase,
372 OUT gctPOINTER * HandleDatabaseMutex
373 );
374
375gceSTATUS
376gckKERNEL_GetProcessMMU(
377 IN gckKERNEL Kernel,
378 OUT gckMMU * Mmu
379 );
380
381gceSTATUS
382gckKERNEL_SetRecovery(
383 IN gckKERNEL Kernel,
384 IN gctBOOL Recovery,
385 IN gctUINT32 StuckDump
386 );
387
388gceSTATUS
389gckMMU_FlatMapping(
390 IN gckMMU Mmu,
391 IN gctUINT32 Physical
392 );
393
394gceSTATUS
395gckMMU_GetPageEntry(
396 IN gckMMU Mmu,
397 IN gctUINT32 Address,
398 IN gctUINT32_PTR *PageTable
399 );
400
401gceSTATUS
402gckMMU_FreePagesEx(
403 IN gckMMU Mmu,
404 IN gctUINT32 Address,
405 IN gctSIZE_T PageCount
406 );
407
408gceSTATUS
409gckKERNEL_CreateIntegerDatabase(
410 IN gckKERNEL Kernel,
411 OUT gctPOINTER * Database
412 );
413
414gceSTATUS
415gckKERNEL_DestroyIntegerDatabase(
416 IN gckKERNEL Kernel,
417 IN gctPOINTER Database
418 );
419
420gceSTATUS
421gckKERNEL_AllocateIntegerId(
422 IN gctPOINTER Database,
423 IN gctPOINTER Pointer,
424 OUT gctUINT32 * Id
425 );
426
427gceSTATUS
428gckKERNEL_FreeIntegerId(
429 IN gctPOINTER Database,
430 IN gctUINT32 Id
431 );
432
433gceSTATUS
434gckKERNEL_QueryIntegerId(
435 IN gctPOINTER Database,
436 IN gctUINT32 Id,
437 OUT gctPOINTER * Pointer
438 );
439
440/* Pointer rename */
441gctUINT32
442gckKERNEL_AllocateNameFromPointer(
443 IN gckKERNEL Kernel,
444 IN gctPOINTER Pointer
445 );
446
447gctPOINTER
448gckKERNEL_QueryPointerFromName(
449 IN gckKERNEL Kernel,
450 IN gctUINT32 Name
451 );
452
453gceSTATUS
454gckKERNEL_DeleteName(
455 IN gckKERNEL Kernel,
456 IN gctUINT32 Name
457 );
458
459#if gcdSECURE_USER
460/* Get secure cache from the process database. */
461gceSTATUS
462gckKERNEL_GetProcessDBCache(
463 IN gckKERNEL Kernel,
464 IN gctUINT32 ProcessID,
465 OUT gcskSECURE_CACHE_PTR * Cache
466 );
467#endif
468
469/*******************************************************************************
470********* Timer Management ****************************************************/
471typedef struct _gcsTIMER * gcsTIMER_PTR;
472typedef struct _gcsTIMER
473{
474 /* Start and Stop time holders. */
475 gctUINT64 startTime;
476 gctUINT64 stopTime;
477}
478gcsTIMER;
479
480/******************************************************************************\
481********************************** Structures **********************************
482\******************************************************************************/
483
484/* gckDB object. */
485struct _gckDB
486{
487 /* Database management. */
488 gcsDATABASE_PTR db[16];
489 gctPOINTER dbMutex;
490 gcsDATABASE_PTR freeDatabase;
491 gcsDATABASE_RECORD_PTR freeRecord;
492 gcsDATABASE_PTR lastDatabase;
493 gctUINT32 lastProcessID;
494 gctUINT64 lastIdle;
495 gctUINT64 idleTime;
496 gctUINT64 lastSlowdown;
497 gctUINT64 lastSlowdownIdle;
498 gctPOINTER nameDatabase;
499 gctPOINTER nameDatabaseMutex;
500
501 gctPOINTER pointerDatabase;
502 gctPOINTER pointerDatabaseMutex;
503};
504
505typedef struct _gckVIRTUAL_COMMAND_BUFFER * gckVIRTUAL_COMMAND_BUFFER_PTR;
506typedef struct _gckVIRTUAL_COMMAND_BUFFER
507{
508 gctPHYS_ADDR physical;
509 gctPOINTER userLogical;
510 gctPOINTER kernelLogical;
511 gctSIZE_T bytes;
512 gctSIZE_T pageCount;
513 gctPOINTER pageTable;
514 gctUINT32 gpuAddress;
515 gctUINT pid;
516 gckVIRTUAL_COMMAND_BUFFER_PTR next;
517 gckVIRTUAL_COMMAND_BUFFER_PTR prev;
518 gckKERNEL kernel;
519#if gcdPROCESS_ADDRESS_SPACE
520 gckMMU mmu;
521#endif
522}
523gckVIRTUAL_COMMAND_BUFFER;
524
525/* gckKERNEL object. */
526struct _gckKERNEL
527{
528 /* Object. */
529 gcsOBJECT object;
530
531 /* Pointer to gckOS object. */
532 gckOS os;
533
534 /* Core */
535 gceCORE core;
536
537 /* Pointer to gckHARDWARE object. */
538 gckHARDWARE hardware;
539
540 /* Pointer to gckCOMMAND object. */
541 gckCOMMAND command;
542
543 /* Pointer to gckEVENT object. */
544 gckEVENT eventObj;
545
546 /* Pointer to context. */
547 gctPOINTER context;
548
549 /* Pointer to gckMMU object. */
550 gckMMU mmu;
551
552 /* Arom holding number of clients. */
553 gctPOINTER atomClients;
554
555#if VIVANTE_PROFILER
556 /* Enable profiling */
557 gctBOOL profileEnable;
558 /* Clear profile register or not*/
559 gctBOOL profileCleanRegister;
560#endif
561
562#ifdef QNX_SINGLE_THREADED_DEBUGGING
563 gctPOINTER debugMutex;
564#endif
565
566 /* Database management. */
567 gckDB db;
568 gctBOOL dbCreated;
569
570 gctUINT64 resetTimeStamp;
571
572 /* Pointer to gckEVENT object. */
573 gcsTIMER timers[8];
574 gctUINT32 timeOut;
575
576
577 /* Virtual command buffer list. */
578 gckVIRTUAL_COMMAND_BUFFER_PTR virtualBufferHead;
579 gckVIRTUAL_COMMAND_BUFFER_PTR virtualBufferTail;
580 gctPOINTER virtualBufferLock;
581
582 /* Enable virtual command buffer. */
583 gctBOOL virtualCommandBuffer;
584
585#if gcdDVFS
586 gckDVFS dvfs;
587#endif
588
589#if gcdANDROID_NATIVE_FENCE_SYNC
590 gctHANDLE timeline;
591#endif
592
593 /* Enable recovery. */
594 gctBOOL recovery;
595
596 /* Level of dump information after stuck. */
597 gctUINT stuckDump;
598
599
600 /* Timer to monitor GPU stuck. */
601 gctPOINTER monitorTimer;
602
603 /* Flag to quit monitor timer. */
604 gctBOOL monitorTimerStop;
605
606 /* Monitor states. */
607 gctBOOL monitoring;
608 gctUINT32 lastCommitStamp;
609 gctUINT32 timer;
610 gctUINT32 restoreAddress;
611 gctUINT32 restoreMask;
612};
613
614struct _FrequencyHistory
615{
616 gctUINT32 frequency;
617 gctUINT32 count;
618};
619
620/* gckDVFS object. */
621struct _gckDVFS
622{
623 gckOS os;
624 gckHARDWARE hardware;
625 gctPOINTER timer;
626 gctUINT32 pollingTime;
627 gctBOOL stop;
628 gctUINT32 totalConfig;
629 gctUINT32 loads[8];
630 gctUINT8 currentScale;
631 struct _FrequencyHistory frequencyHistory[16];
632};
633
634typedef struct _gcsFENCE * gckFENCE;
635typedef struct _gcsFENCE
636{
637 /* Fence location. */
638 gctPHYS_ADDR physical;
639 gctPOINTER logical;
640 gctUINT32 address;
641
642 gctPOINTER mutex;
643}
644gcsFENCE;
645
646/* gckCOMMAND object. */
647struct _gckCOMMAND
648{
649 /* Object. */
650 gcsOBJECT object;
651
652 /* Pointer to required object. */
653 gckKERNEL kernel;
654 gckOS os;
655
656 /* Number of bytes per page. */
657 gctUINT32 pageSize;
658
659 /* Current pipe select. */
660 gcePIPE_SELECT pipeSelect;
661
662 /* Command queue running flag. */
663 gctBOOL running;
664
665 /* Idle flag and commit stamp. */
666 gctBOOL idle;
667 gctUINT64 commitStamp;
668
669 /* Command queue mutex. */
670 gctPOINTER mutexQueue;
671
672 /* Context switching mutex. */
673 gctPOINTER mutexContext;
674
675#if VIVANTE_PROFILER_CONTEXT
676 /* Context sequence mutex. */
677 gctPOINTER mutexContextSeq;
678#endif
679
680 /* Command queue power semaphore. */
681 gctPOINTER powerSemaphore;
682
683 /* Current command queue. */
684 struct _gcskCOMMAND_QUEUE
685 {
686 gctSIGNAL signal;
687 gctPHYS_ADDR physical;
688 gctPOINTER logical;
689 gctUINT32 address;
690 }
691 queues[gcdCOMMAND_QUEUES];
692
693 gctUINT32 physical;
694 gctPOINTER logical;
695 gctUINT32 address;
696 gctUINT32 offset;
697 gctINT index;
698#if gcmIS_DEBUG(gcdDEBUG_TRACE)
699 gctUINT wrapCount;
700#endif
701
702 /* The command queue is new. */
703 gctBOOL newQueue;
704
705 /* Context management. */
706 gckCONTEXT currContext;
707 gctPOINTER stateMap;
708
709 /* Pointer to last WAIT command. */
710 gctUINT32 waitPhysical;
711 gctPOINTER waitLogical;
712 gctUINT32 waitSize;
713
714 /* Command buffer alignment. */
715 gctUINT32 alignment;
716 gctUINT32 reservedHead;
717 gctUINT32 reservedTail;
718
719 /* Commit counter. */
720 gctPOINTER atomCommit;
721
722 /* Kernel process ID. */
723 gctUINT32 kernelProcessID;
724
725 /* End Event signal. */
726 gctSIGNAL endEventSignal;
727
728#if gcdSECURE_USER
729 /* Hint array copy buffer. */
730 gctBOOL hintArrayAllocated;
731 gctUINT hintArraySize;
732 gctUINT32_PTR hintArray;
733#endif
734
735#if gcdPROCESS_ADDRESS_SPACE
736 gckMMU currentMmu;
737#endif
738 struct _gckENTRYQUEUE queue;
739
740 gckFENCE fence;
741};
742
743typedef struct _gcsEVENT * gcsEVENT_PTR;
744
745/* Structure holding one event to be processed. */
746typedef struct _gcsEVENT
747{
748 /* Pointer to next event in queue. */
749 gcsEVENT_PTR next;
750
751 /* Event information. */
752 gcsHAL_INTERFACE info;
753
754 /* Process ID owning the event. */
755 gctUINT32 processID;
756
757#ifdef __QNXNTO__
758 /* Kernel. */
759 gckKERNEL kernel;
760#endif
761
762 gctBOOL fromKernel;
763}
764gcsEVENT;
765
766/* Structure holding a list of events to be processed by an interrupt. */
767typedef struct _gcsEVENT_QUEUE * gcsEVENT_QUEUE_PTR;
768typedef struct _gcsEVENT_QUEUE
769{
770 /* Time stamp. */
771 gctUINT64 stamp;
772
773 /* Source of the event. */
774 gceKERNEL_WHERE source;
775
776
777 /* Pointer to head of event queue. */
778 gcsEVENT_PTR head;
779
780 /* Pointer to tail of event queue. */
781 gcsEVENT_PTR tail;
782
783 /* Next list of events. */
784 gcsEVENT_QUEUE_PTR next;
785
786 /* Current commit stamp. */
787 gctUINT64 commitStamp;
788}
789gcsEVENT_QUEUE;
790
791/*
792 gcdREPO_LIST_COUNT defines the maximum number of event queues with different
793 hardware module sources that may coexist at the same time. Only two sources
794 are supported - gcvKERNEL_COMMAND and gcvKERNEL_PIXEL. gcvKERNEL_COMMAND
795 source is used only for managing the kernel command queue and is only issued
796 when the current command queue gets full. Since we commit event queues every
797 time we commit command buffers, in the worst case we can have up to three
798 pending event queues:
799 - gcvKERNEL_PIXEL
800 - gcvKERNEL_COMMAND (queue overflow)
801 - gcvKERNEL_PIXEL
802*/
803#define gcdREPO_LIST_COUNT 3
804
805/* gckEVENT object. */
806struct _gckEVENT
807{
808 /* The object. */
809 gcsOBJECT object;
810
811 /* Pointer to required objects. */
812 gckOS os;
813 gckKERNEL kernel;
814
815 /* Time stamp. */
816 gctUINT64 stamp;
817 gctUINT32 lastCommitStamp;
818
819 /* Queue mutex. */
820 gctPOINTER eventQueueMutex;
821
822 /* Array of event queues. */
823 gcsEVENT_QUEUE queues[29];
824 gctUINT8 lastID;
825 gctPOINTER freeAtom;
826
827 /* Pending events. */
828#if gcdSMP
829 gctPOINTER pending;
830#else
831 volatile gctUINT pending;
832#endif
833
834 /* List of free event structures and its mutex. */
835 gcsEVENT_PTR freeEventList;
836 gctSIZE_T freeEventCount;
837 gctPOINTER freeEventMutex;
838
839 /* Event queues. */
840 gcsEVENT_QUEUE_PTR queueHead;
841 gcsEVENT_QUEUE_PTR queueTail;
842 gcsEVENT_QUEUE_PTR freeList;
843 gcsEVENT_QUEUE repoList[gcdREPO_LIST_COUNT];
844 gctPOINTER eventListMutex;
845
846 gctPOINTER submitTimer;
847
848#if gcdINTERRUPT_STATISTIC
849 gctPOINTER interruptCount;
850#endif
851
852#if gcdRECORD_COMMAND
853 gckRECORDER recorder;
854#endif
855};
856
857/* Free all events belonging to a process. */
858gceSTATUS
859gckEVENT_FreeProcess(
860 IN gckEVENT Event,
861 IN gctUINT32 ProcessID
862 );
863
864gceSTATUS
865gckEVENT_Stop(
866 IN gckEVENT Event,
867 IN gctUINT32 ProcessID,
868 IN gctUINT32 Handle,
869 IN gctPOINTER Logical,
870 IN gctSIGNAL Signal,
871 IN OUT gctUINT32 * waitSize
872 );
873
874typedef struct _gcsLOCK_INFO * gcsLOCK_INFO_PTR;
875typedef struct _gcsLOCK_INFO
876{
877 gctUINT32 GPUAddresses[gcdMAX_GPU_COUNT];
878 gctPOINTER pageTables[gcdMAX_GPU_COUNT];
879 gctUINT32 lockeds[gcdMAX_GPU_COUNT];
880 gckKERNEL lockKernels[gcdMAX_GPU_COUNT];
881 gckMMU lockMmus[gcdMAX_GPU_COUNT];
882}
883gcsLOCK_INFO;
884
885typedef struct _gcsGPU_MAP * gcsGPU_MAP_PTR;
886typedef struct _gcsGPU_MAP
887{
888 gctINT pid;
889 gcsLOCK_INFO lockInfo;
890 gcsGPU_MAP_PTR prev;
891 gcsGPU_MAP_PTR next;
892}
893gcsGPU_MAP;
894
895/* gcuVIDMEM_NODE structure. */
896typedef union _gcuVIDMEM_NODE
897{
898 /* Allocated from gckVIDMEM. */
899 struct _gcsVIDMEM_NODE_VIDMEM
900 {
901 /* Owner of this node. */
902 gckVIDMEM memory;
903
904 /* Dual-linked list of nodes. */
905 gcuVIDMEM_NODE_PTR next;
906 gcuVIDMEM_NODE_PTR prev;
907
908 /* Dual linked list of free nodes. */
909 gcuVIDMEM_NODE_PTR nextFree;
910 gcuVIDMEM_NODE_PTR prevFree;
911
912 /* Information for this node. */
913 gctSIZE_T offset;
914 gctSIZE_T bytes;
915 gctUINT32 alignment;
916
917#ifdef __QNXNTO__
918 /* Client virtual address. */
919 gctPOINTER logical;
920#endif
921
922 /* Locked counter. */
923 gctINT32 locked;
924
925 /* Memory pool. */
926 gcePOOL pool;
927 gctUINT32 physical;
928
929 /* Process ID owning this memory. */
930 gctUINT32 processID;
931
932 }
933 VidMem;
934
935 /* Allocated from gckOS. */
936 struct _gcsVIDMEM_NODE_VIRTUAL
937 {
938 /* Pointer to gckKERNEL object. */
939 gckKERNEL kernel;
940
941 /* Information for this node. */
942 /* Contiguously allocated? */
943 gctBOOL contiguous;
944 /* mdl record pointer... a kmalloc address. Process agnostic. */
945 gctPHYS_ADDR physical;
946 gctSIZE_T bytes;
947 /* do_mmap_pgoff address... mapped per-process. */
948 gctPOINTER logical;
949
950
951 /* Customer private handle */
952 gctUINT32 gid;
953
954 /* Page table information. */
955 /* Used only when node is not contiguous */
956 gctSIZE_T pageCount;
957
958 /* Used only when node is not contiguous */
959 gctPOINTER pageTables[gcdMAX_GPU_COUNT];
960 /* Pointer to gckKERNEL object who lock this. */
961 gckKERNEL lockKernels[gcdMAX_GPU_COUNT];
962 /* Actual physical address */
963 gctUINT32 addresses[gcdMAX_GPU_COUNT];
964
965 /* Locked counter. */
966 gctINT32 lockeds[gcdMAX_GPU_COUNT];
967
968 /* Process ID owning this memory. */
969 gctUINT32 processID;
970
971 /* Surface type. */
972 gceSURF_TYPE type;
973 }
974 Virtual;
975}
976gcuVIDMEM_NODE;
977
978/* gckVIDMEM object. */
979struct _gckVIDMEM
980{
981 /* Object. */
982 gcsOBJECT object;
983
984 /* Pointer to gckOS object. */
985 gckOS os;
986
987 /* Information for this video memory heap. */
988 gctUINT32 baseAddress;
989 gctSIZE_T bytes;
990 gctSIZE_T freeBytes;
991
992 /* Mapping for each type of surface. */
993 gctINT mapping[gcvSURF_NUM_TYPES];
994
995 /* Sentinel nodes for up to 8 banks. */
996 gcuVIDMEM_NODE sentinel[8];
997
998 /* Allocation threshold. */
999 gctSIZE_T threshold;
1000
1001 /* The heap mutex. */
1002 gctPOINTER mutex;
1003};
1004
1005typedef struct _gcsVIDMEM_NODE
1006{
1007 /* Pointer to gcuVIDMEM_NODE. */
1008 gcuVIDMEM_NODE_PTR node;
1009
1010 /* Mutex to protect node. */
1011 gctPOINTER mutex;
1012
1013 /* Reference count. */
1014 gctPOINTER reference;
1015
1016 /* Name for client to import. */
1017 gctUINT32 name;
1018
1019#if gcdPROCESS_ADDRESS_SPACE
1020 /* Head of mapping list. */
1021 gcsGPU_MAP_PTR mapHead;
1022
1023 /* Tail of mapping list. */
1024 gcsGPU_MAP_PTR mapTail;
1025
1026 gctPOINTER mapMutex;
1027#endif
1028
1029 /* Surface Type. */
1030 gceSURF_TYPE type;
1031
1032 /* Pool from which node is allocated. */
1033 gcePOOL pool;
1034}
1035gcsVIDMEM_NODE;
1036
1037typedef struct _gcsVIDMEM_HANDLE * gckVIDMEM_HANDLE;
1038typedef struct _gcsVIDMEM_HANDLE
1039{
1040 /* Pointer to gckVIDMEM_NODE. */
1041 gckVIDMEM_NODE node;
1042
1043 /* Handle for current process. */
1044 gctUINT32 handle;
1045
1046 /* Reference count for this handle. */
1047 gctPOINTER reference;
1048}
1049gcsVIDMEM_HANDLE;
1050
1051typedef struct _gcsSHBUF * gcsSHBUF_PTR;
1052typedef struct _gcsSHBUF
1053{
1054 /* ID. */
1055 gctUINT32 id;
1056
1057 /* Reference count. */
1058 gctPOINTER reference;
1059
1060 /* Data size. */
1061 gctUINT32 size;
1062
1063 /* Data. */
1064 gctPOINTER data;
1065}
1066gcsSHBUF;
1067
1068gceSTATUS
1069gckVIDMEM_HANDLE_Reference(
1070 IN gckKERNEL Kernel,
1071 IN gctUINT32 ProcessID,
1072 IN gctUINT32 Handle
1073 );
1074
1075gceSTATUS
1076gckVIDMEM_HANDLE_Dereference(
1077 IN gckKERNEL Kernel,
1078 IN gctUINT32 ProcessID,
1079 IN gctUINT32 Handle
1080 );
1081
1082gceSTATUS
1083gckVIDMEM_NODE_Allocate(
1084 IN gckKERNEL Kernel,
1085 IN gcuVIDMEM_NODE_PTR VideoNode,
1086 IN gceSURF_TYPE Type,
1087 IN gcePOOL Pool,
1088 IN gctUINT32 * Handle
1089 );
1090
1091gceSTATUS
1092gckVIDMEM_Node_Lock(
1093 IN gckKERNEL Kernel,
1094 IN gckVIDMEM_NODE Node,
1095 OUT gctUINT32 *Address
1096 );
1097
1098gceSTATUS
1099gckVIDMEM_NODE_Unlock(
1100 IN gckKERNEL Kernel,
1101 IN gckVIDMEM_NODE Node,
1102 IN gctUINT32 ProcessID
1103 );
1104
1105gceSTATUS
1106gckVIDMEM_NODE_Dereference(
1107 IN gckKERNEL Kernel,
1108 IN gckVIDMEM_NODE Node
1109 );
1110
1111gceSTATUS
1112gckVIDMEM_NODE_Name(
1113 IN gckKERNEL Kernel,
1114 IN gctUINT32 Handle,
1115 IN gctUINT32 * Name
1116 );
1117
1118gceSTATUS
1119gckVIDMEM_NODE_Import(
1120 IN gckKERNEL Kernel,
1121 IN gctUINT32 Name,
1122 IN gctUINT32 * Handle
1123 );
1124
1125gceSTATUS
1126gckVIDMEM_HANDLE_LookupAndReference(
1127 IN gckKERNEL Kernel,
1128 IN gctUINT32 Handle,
1129 OUT gckVIDMEM_NODE * Node
1130 );
1131
1132gceSTATUS
1133gckVIDMEM_HANDLE_Lookup(
1134 IN gckKERNEL Kernel,
1135 IN gctUINT32 ProcessID,
1136 IN gctUINT32 Handle,
1137 OUT gckVIDMEM_NODE * Node
1138 );
1139
1140gceSTATUS
1141gckVIDMEM_NODE_GetFd(
1142 IN gckKERNEL Kernel,
1143 IN gctUINT32 Handle,
1144 OUT gctINT * Fd
1145 );
1146
1147gceSTATUS
1148gckVIDMEM_ConstructVirtualFromUserMemory(
1149 IN gckKERNEL Kernel,
1150 IN gcsUSER_MEMORY_DESC_PTR Desc,
1151 OUT gcuVIDMEM_NODE_PTR * Node
1152 );
1153
1154#if gcdPROCESS_ADDRESS_SPACE
1155gceSTATUS
1156gckEVENT_DestroyMmu(
1157 IN gckEVENT Event,
1158 IN gckMMU Mmu,
1159 IN gceKERNEL_WHERE FromWhere
1160 );
1161#endif
1162
1163/* gckMMU object. */
1164struct _gckMMU
1165{
1166 /* The object. */
1167 gcsOBJECT object;
1168
1169 /* Pointer to gckOS object. */
1170 gckOS os;
1171
1172 /* Pointer to gckHARDWARE object. */
1173 gckHARDWARE hardware;
1174
1175 /* The page table mutex. */
1176 gctPOINTER pageTableMutex;
1177
1178 /* Page table information. */
1179 gctSIZE_T pageTableSize;
1180 gctPHYS_ADDR pageTablePhysical;
1181 gctUINT32_PTR pageTableLogical;
1182 gctUINT32 pageTableEntries;
1183
1184 /* Master TLB information. */
1185 gctSIZE_T mtlbSize;
1186 gctPHYS_ADDR mtlbPhysical;
1187 gctUINT32_PTR mtlbLogical;
1188 gctUINT32 mtlbEntries;
1189
1190 /* Free entries. */
1191 gctUINT32 heapList;
1192 gctBOOL freeNodes;
1193
1194 gctPOINTER staticSTLB;
1195 gctBOOL enabled;
1196
1197 gctUINT32 dynamicMappingStart;
1198
1199 gctUINT32_PTR mapLogical;
1200#if gcdPROCESS_ADDRESS_SPACE
1201 gctPOINTER pageTableDirty[gcdMAX_GPU_COUNT];
1202 gctPOINTER stlbs;
1203#endif
1204};
1205
1206gceSTATUS
1207gckOS_CreateKernelVirtualMapping(
1208 IN gckOS Os,
1209 IN gctPHYS_ADDR Physical,
1210 IN gctSIZE_T Bytes,
1211 OUT gctPOINTER * Logical,
1212 OUT gctSIZE_T * PageCount
1213 );
1214
1215gceSTATUS
1216gckOS_DestroyKernelVirtualMapping(
1217 IN gckOS Os,
1218 IN gctPHYS_ADDR Physical,
1219 IN gctSIZE_T Bytes,
1220 IN gctPOINTER Logical
1221 );
1222
1223gceSTATUS
1224gckOS_CreateUserVirtualMapping(
1225 IN gckOS Os,
1226 IN gctPHYS_ADDR Physical,
1227 IN gctSIZE_T Bytes,
1228 OUT gctPOINTER * Logical,
1229 OUT gctSIZE_T * PageCount
1230 );
1231
1232gceSTATUS
1233gckOS_DestroyUserVirtualMapping(
1234 IN gckOS Os,
1235 IN gctPHYS_ADDR Physical,
1236 IN gctSIZE_T Bytes,
1237 IN gctPOINTER Logical
1238 );
1239
1240gceSTATUS
1241gckOS_GetFd(
1242 IN gctSTRING Name,
1243 IN gcsFDPRIVATE_PTR Private,
1244 OUT gctINT *Fd
1245 );
1246
1247gceSTATUS
1248gckKERNEL_AllocateVirtualCommandBuffer(
1249 IN gckKERNEL Kernel,
1250 IN gctBOOL InUserSpace,
1251 IN OUT gctSIZE_T * Bytes,
1252 OUT gctPHYS_ADDR * Physical,
1253 OUT gctPOINTER * Logical
1254 );
1255
1256gceSTATUS
1257gckKERNEL_DestroyVirtualCommandBuffer(
1258 IN gckKERNEL Kernel,
1259 IN gctSIZE_T Bytes,
1260 IN gctPHYS_ADDR Physical,
1261 IN gctPOINTER Logical
1262 );
1263
1264gceSTATUS
1265gckKERNEL_GetGPUAddress(
1266 IN gckKERNEL Kernel,
1267 IN gctPOINTER Logical,
1268 IN gctBOOL InUserSpace,
1269 IN gckVIRTUAL_COMMAND_BUFFER_PTR Buffer,
1270 OUT gctUINT32 * Address
1271 );
1272
1273gceSTATUS
1274gckKERNEL_QueryGPUAddress(
1275 IN gckKERNEL Kernel,
1276 IN gctUINT32 GpuAddress,
1277 OUT gckVIRTUAL_COMMAND_BUFFER_PTR * Buffer
1278 );
1279
1280gceSTATUS
1281gckKERNEL_AttachProcess(
1282 IN gckKERNEL Kernel,
1283 IN gctBOOL Attach
1284 );
1285
1286gceSTATUS
1287gckKERNEL_AttachProcessEx(
1288 IN gckKERNEL Kernel,
1289 IN gctBOOL Attach,
1290 IN gctUINT32 PID
1291 );
1292
1293#if gcdSECURE_USER
1294gceSTATUS
1295gckKERNEL_MapLogicalToPhysical(
1296 IN gckKERNEL Kernel,
1297 IN gcskSECURE_CACHE_PTR Cache,
1298 IN OUT gctPOINTER * Data
1299 );
1300
1301gceSTATUS
1302gckKERNEL_FlushTranslationCache(
1303 IN gckKERNEL Kernel,
1304 IN gcskSECURE_CACHE_PTR Cache,
1305 IN gctPOINTER Logical,
1306 IN gctSIZE_T Bytes
1307 );
1308#endif
1309
1310gceSTATUS
1311gckHARDWARE_QueryIdle(
1312 IN gckHARDWARE Hardware,
1313 OUT gctBOOL_PTR IsIdle
1314 );
1315
1316gceSTATUS
1317gckHARDWARE_AddressInHardwareFuncions(
1318 IN gckHARDWARE Hardware,
1319 IN gctUINT32 Address,
1320 OUT gctPOINTER *Pointer
1321 );
1322
1323
1324gceSTATUS
1325gckKERNEL_CreateShBuffer(
1326 IN gckKERNEL Kernel,
1327 IN gctUINT32 Size,
1328 OUT gctSHBUF * ShBuf
1329 );
1330
1331gceSTATUS
1332gckKERNEL_DestroyShBuffer(
1333 IN gckKERNEL Kernel,
1334 IN gctSHBUF ShBuf
1335 );
1336
1337gceSTATUS
1338gckKERNEL_MapShBuffer(
1339 IN gckKERNEL Kernel,
1340 IN gctSHBUF ShBuf
1341 );
1342
1343gceSTATUS
1344gckKERNEL_WriteShBuffer(
1345 IN gckKERNEL Kernel,
1346 IN gctSHBUF ShBuf,
1347 IN gctPOINTER UserData,
1348 IN gctUINT32 ByteCount
1349 );
1350
1351gceSTATUS
1352gckKERNEL_ReadShBuffer(
1353 IN gckKERNEL Kernel,
1354 IN gctSHBUF ShBuf,
1355 IN gctPOINTER UserData,
1356 IN gctUINT32 ByteCount,
1357 OUT gctUINT32 * BytesRead
1358 );
1359
1360
1361/******************************************************************************\
1362******************************* gckCONTEXT Object *******************************
1363\******************************************************************************/
1364
1365gceSTATUS
1366gckCONTEXT_Construct(
1367 IN gckOS Os,
1368 IN gckHARDWARE Hardware,
1369 IN gctUINT32 ProcessID,
1370 OUT gckCONTEXT * Context
1371 );
1372
1373gceSTATUS
1374gckCONTEXT_Destroy(
1375 IN gckCONTEXT Context
1376 );
1377
1378gceSTATUS
1379gckCONTEXT_Update(
1380 IN gckCONTEXT Context,
1381 IN gctUINT32 ProcessID,
1382 IN gcsSTATE_DELTA_PTR StateDelta
1383 );
1384
1385gceSTATUS
1386gckCONTEXT_MapBuffer(
1387 IN gckCONTEXT Context,
1388 OUT gctUINT32 *Physicals,
1389 OUT gctUINT64 *Logicals,
1390 OUT gctUINT32 *Bytes
1391 );
1392
1393#if gcdLINK_QUEUE_SIZE
1394void
1395gckLINKQUEUE_Enqueue(
1396 IN gckLINKQUEUE LinkQueue,
1397 IN gctUINT32 start,
1398 IN gctUINT32 end,
1399 IN gctUINT32 LinkLow,
1400 IN gctUINT32 LinkHigh
1401 );
1402
1403void
1404gckLINKQUEUE_GetData(
1405 IN gckLINKQUEUE LinkQueue,
1406 IN gctUINT32 Index,
1407 OUT gckLINKDATA * Data
1408 );
1409#endif
1410
1411gceSTATUS
1412gckENTRYQUEUE_Enqueue(
1413 IN gckKERNEL Kernel,
1414 IN gckENTRYQUEUE Queue,
1415 IN gctUINT32 physical,
1416 IN gctUINT32 bytes
1417 );
1418
1419gceSTATUS
1420gckENTRYQUEUE_Dequeue(
1421 IN gckENTRYQUEUE Queue,
1422 OUT gckENTRYDATA * Data
1423 );
1424
1425/******************************************************************************\
1426****************************** gckRECORDER Object ******************************
1427\******************************************************************************/
1428gceSTATUS
1429gckRECORDER_Construct(
1430 IN gckOS Os,
1431 IN gckHARDWARE Hardware,
1432 OUT gckRECORDER * Recorder
1433 );
1434
1435gceSTATUS
1436gckRECORDER_Destory(
1437 IN gckOS Os,
1438 IN gckRECORDER Recorder
1439 );
1440
1441void
1442gckRECORDER_AdvanceIndex(
1443 gckRECORDER Recorder,
1444 gctUINT64 CommitStamp
1445 );
1446
1447void
1448gckRECORDER_Record(
1449 gckRECORDER Recorder,
1450 gctUINT8_PTR CommandBuffer,
1451 gctUINT32 CommandBytes,
1452 gctUINT8_PTR ContextBuffer,
1453 gctUINT32 ContextBytes
1454 );
1455
1456void
1457gckRECORDER_Dump(
1458 gckRECORDER Recorder
1459 );
1460
1461gceSTATUS
1462gckRECORDER_UpdateMirror(
1463 gckRECORDER Recorder,
1464 gctUINT32 State,
1465 gctUINT32 Data
1466 );
1467
1468gceSTATUS
1469gckFENCE_Create(
1470 IN gckOS Os,
1471 IN gckKERNEL Kernel,
1472 OUT gckFENCE * Fence
1473 );
1474
1475gceSTATUS
1476gckFENCE_Destory(
1477 IN gckOS Os,
1478 OUT gckFENCE Fence
1479 );
1480
1481#ifdef __cplusplus
1482}
1483#endif
1484
1485#endif /* __gc_hal_kernel_h_ */