1 /****************************************************************************
3 * Copyright (C) 2005 - 2013 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 *****************************************************************************/
22 #ifndef __gc_hal_vg_h_
23 #define __gc_hal_vg_h_
30 #include "gc_hal_rename.h"
31 #include "gc_hal_types.h"
32 #include "gc_hal_enum.h"
33 #include "gc_hal_base.h"
37 /* Thread routine type. */
39 typedef gctINT gctTHREADFUNCRESULT;
40 typedef gctPOINTER gctTHREADFUNCPARAMETER;
41 # define gctTHREADFUNCTYPE
43 typedef gctUINT gctTHREADFUNCRESULT;
44 typedef gctPOINTER gctTHREADFUNCPARAMETER;
45 # define gctTHREADFUNCTYPE __stdcall
46 #elif defined(__QNXNTO__)
47 typedef void * gctTHREADFUNCRESULT;
48 typedef gctPOINTER gctTHREADFUNCPARAMETER;
49 # define gctTHREADFUNCTYPE
52 typedef gctTHREADFUNCRESULT (gctTHREADFUNCTYPE * gctTHREADFUNC) (
53 gctTHREADFUNCPARAMETER ThreadParameter
61 #define gcdFORCE_DEBUG 0
62 #define gcdFORCE_MESSAGES 0
65 #if DBG || defined(DEBUG) || defined(_DEBUG) || gcdFORCE_DEBUG
71 #define _gcmERROR_RETURN(prefix, func) \
73 if (gcmIS_ERROR(status)) \
75 prefix##PRINT_VERSION(); \
76 prefix##TRACE(gcvLEVEL_ERROR, \
77 #prefix "ERR_RETURN: status=%d(%s) @ %s(%d)", \
78 status, gcoOS_DebugStatus2Name(status), __FUNCTION__, __LINE__); \
81 do { } while (gcvFALSE)
83 #define gcmERROR_RETURN(func) _gcmERROR_RETURN(gcm, func)
85 #define gcmLOG_LOCATION()
87 #define gcmkIS_ERROR(status) (status < 0)
89 #define gcmALIGNDOWN(n, align) \
91 (n) & ~((align) - 1) \
94 #define gcmIS_VALID_INDEX(Index, Array) \
95 (((gctUINT) (Index)) < gcmCOUNTOF(Array))
98 #define gcmIS_NAN(x) \
100 ((* (gctUINT32_PTR) &(x)) & 0x7FFFFFFF) == 0x7FFFFFFF \
103 #define gcmLERP(v1, v2, w) \
104 ((v1) * (w) + (v2) * (1.0f - (w)))
106 #define gcmINTERSECT(Start1, Start2, Length) \
107 (gcmABS((Start1) - (Start2)) < (Length))
109 /*******************************************************************************
113 ** Prints a message and terminates the current loop on error.
117 ** 'status' variable of gceSTATUS type must be defined.
122 ** Function to evaluate.
125 #define gcmERR_GOTO(Function) \
127 if (gcmIS_ERROR(status)) \
131 "gcmERR_GOTO: status=%d @ line=%d in function %s.\n", \
132 status, __LINE__, __FUNCTION__ \
137 #if gcvDEBUG || gcdFORCE_MESSAGES
138 # define gcmVERIFY_BOOLEAN(Expression) \
140 ( (Expression) == gcvFALSE ) || \
141 ( (Expression) == gcvTRUE ) \
144 # define gcmVERIFY_BOOLEAN(Expression)
147 /*******************************************************************************
151 ** Verify whether the value fits in the field.
156 ** reg Name of register.
157 ** field Name of field within register.
158 ** value Value for field.
160 #define gcmVERIFYFIELDFIT(reg, field, value) \
162 (value) <= gcmFIELDMAX(reg, field) \
164 /*******************************************************************************
168 ** Get field maximum value.
172 ** reg Name of register.
173 ** field Name of field within register.
175 #define gcmFIELDMAX(reg, field) \
179 (__gcmGETSIZE(reg##_##field) == 32) \
181 : (~(~0 << __gcmGETSIZE(reg##_##field))) \
186 /* ANSI C does not have the 'f' functions, define replacements here. */
187 #define gcmSINF(x) ((gctFLOAT) sin(x))
188 #define gcmCOSF(x) ((gctFLOAT) cos(x))
189 #define gcmASINF(x) ((gctFLOAT) asin(x))
190 #define gcmACOSF(x) ((gctFLOAT) acos(x))
191 #define gcmSQRTF(x) ((gctFLOAT) sqrt(x))
192 #define gcmFABSF(x) ((gctFLOAT) fabs(x))
193 #define gcmFMODF(x, y) ((gctFLOAT) fmod((x), (y)))
194 #define gcmCEILF(x) ((gctFLOAT) ceil(x))
195 #define gcmFLOORF(x) ((gctFLOAT) floor(x))
199 /* Fixed point constants. */
200 #define gcvZERO_X ((gctFIXED_POINT) 0x00000000)
201 #define gcvHALF_X ((gctFIXED_POINT) 0x00008000)
202 #define gcvONE_X ((gctFIXED_POINT) 0x00010000)
203 #define gcvNEGONE_X ((gctFIXED_POINT) 0xFFFF0000)
204 #define gcvTWO_X ((gctFIXED_POINT) 0x00020000)
206 /* Integer constants. */
207 #define gcvMAX_POS_INT ((gctINT) 0x7FFFFFFF)
208 #define gcvMAX_NEG_INT ((gctINT) 0x80000000)
210 /* Float constants. */
211 #define gcvMAX_POS_FLOAT ((gctFLOAT) 3.4028235e+038)
212 #define gcvMAX_NEG_FLOAT ((gctFLOAT) -3.4028235e+038)
214 /******************************************************************************\
215 ***************************** Miscellaneous Macro ******************************
216 \******************************************************************************/
218 #define gcmKB2BYTES(Kilobyte) \
223 #define gcmMB2BYTES(Megabyte) \
228 #define gcmMAT(Matrix, Row, Column) \
230 (Matrix) [(Row) * 3 + (Column)] \
233 #define gcmMAKE2CHAR(Char1, Char2) \
235 ((gctUINT16) (gctUINT8) (Char1) << 0) | \
236 ((gctUINT16) (gctUINT8) (Char2) << 8) \
239 #define gcmMAKE4CHAR(Char1, Char2, Char3, Char4) \
241 ((gctUINT32)(gctUINT8) (Char1) << 0) | \
242 ((gctUINT32)(gctUINT8) (Char2) << 8) | \
243 ((gctUINT32)(gctUINT8) (Char3) << 16) | \
244 ((gctUINT32)(gctUINT8) (Char4) << 24) \
247 /* some platforms need to fix the physical address for HW to access*/
248 #define gcmFIXADDRESS(address) \
253 #define gcmkFIXADDRESS(address) \
258 /******************************************************************************\
259 ****************************** Kernel Debug Macro ******************************
260 \******************************************************************************/
262 /* Set signal to signaled state for specified process. */
266 IN gctHANDLE Process,
270 /* Return the kernel logical pointer for the given physical one. */
272 gckOS_GetKernelLogical(
274 IN gctUINT32 Address,
275 OUT gctPOINTER * KernelPointer
278 /* Return the kernel logical pointer for the given physical one. */
280 gckOS_GetKernelLogicalEx(
283 IN gctUINT32 Address,
284 OUT gctPOINTER * KernelPointer
287 /*----------------------------------------------------------------------------*/
288 /*----------------------------- Semaphore Object -----------------------------*/
290 /* Increment the value of a semaphore. */
292 gckOS_IncrementSemaphore(
294 IN gctSEMAPHORE Semaphore
297 /* Decrement the value of a semaphore (waiting might occur). */
299 gckOS_DecrementSemaphore(
301 IN gctSEMAPHORE Semaphore
305 /*----------------------------------------------------------------------------*/
306 /*------------------------------- Thread Object ------------------------------*/
308 /* Start a thread. */
312 IN gctTHREADFUNC ThreadFunction,
313 IN gctPOINTER ThreadParameter,
314 OUT gctTHREAD * Thread
324 /* Verify whether the thread is still running. */
332 /* Construct a new gckVGKERNEL object. */
334 gckVGKERNEL_Construct(
336 IN gctPOINTER Context,
337 IN gckKERNEL inKernel,
338 OUT gckVGKERNEL * Kernel
341 /* Destroy an gckVGKERNEL object. */
344 IN gckVGKERNEL Kernel
347 /* Allocate linear video memory. */
349 gckKERNEL_AllocateLinearMemory(
351 IN OUT gcePOOL * Pool,
353 IN gctSIZE_T Alignment,
354 IN gceSURF_TYPE Type,
355 OUT gcuVIDMEM_NODE_PTR * Node
360 gckKERNEL_UnmapMemory(
362 IN gctPHYS_ADDR Physical,
364 IN gctPOINTER Logical
367 /* Dispatch a user-level command. */
369 gckVGKERNEL_Dispatch(
372 IN OUT struct _gcsHAL_INTERFACE * Interface
375 /* Query command buffer requirements. */
377 gckKERNEL_QueryCommandBuffer(
379 OUT gcsCOMMAND_BUFFER_INFO_PTR Information
382 #if gcdDYNAMIC_MAP_RESERVED_MEMORY
384 gckOS_MapReservedMemoryToKernel(
386 IN gctUINT32 Physical,
388 IN OUT gctPOINTER *Virtual
392 gckOS_UnmapReservedMemoryFromKernel(
393 IN gctPOINTER Virtual
397 /******************************************************************************\
398 ******************************* gckVGHARDWARE Object ******************************
399 \******************************************************************************/
401 /* Construct a new gckVGHARDWARE object. */
403 gckVGHARDWARE_Construct(
405 OUT gckVGHARDWARE * Hardware
408 /* Destroy an gckVGHARDWARE object. */
410 gckVGHARDWARE_Destroy(
411 IN gckVGHARDWARE Hardware
414 /* Query system memory requirements. */
416 gckVGHARDWARE_QuerySystemMemory(
417 IN gckVGHARDWARE Hardware,
418 OUT gctSIZE_T * SystemSize,
419 OUT gctUINT32 * SystemBaseAddress
422 /* Build virtual address. */
424 gckVGHARDWARE_BuildVirtualAddress(
425 IN gckVGHARDWARE Hardware,
428 OUT gctUINT32 * Address
431 /* Kickstart the command processor. */
433 gckVGHARDWARE_Execute(
434 IN gckVGHARDWARE Hardware,
435 IN gctUINT32 Address,
439 /* Query the available memory. */
441 gckVGHARDWARE_QueryMemory(
442 IN gckVGHARDWARE Hardware,
443 OUT gctSIZE_T * InternalSize,
444 OUT gctUINT32 * InternalBaseAddress,
445 OUT gctUINT32 * InternalAlignment,
446 OUT gctSIZE_T * ExternalSize,
447 OUT gctUINT32 * ExternalBaseAddress,
448 OUT gctUINT32 * ExternalAlignment,
449 OUT gctUINT32 * HorizontalTileSize,
450 OUT gctUINT32 * VerticalTileSize
453 /* Query the identity of the hardware. */
455 gckVGHARDWARE_QueryChipIdentity(
456 IN gckVGHARDWARE Hardware,
457 OUT gceCHIPMODEL* ChipModel,
458 OUT gctUINT32* ChipRevision,
459 OUT gctUINT32* ChipFeatures,
460 OUT gctUINT32* ChipMinorFeatures,
461 OUT gctUINT32* ChipMinorFeatures1
464 /* Convert an API format. */
466 gckVGHARDWARE_ConvertFormat(
467 IN gckVGHARDWARE Hardware,
468 IN gceSURF_FORMAT Format,
469 OUT gctUINT32 * BitsPerPixel,
470 OUT gctUINT32 * BytesPerTile
473 /* Split a harwdare specific address into API stuff. */
475 gckVGHARDWARE_SplitMemory(
476 IN gckVGHARDWARE Hardware,
477 IN gctUINT32 Address,
479 OUT gctUINT32 * Offset
482 /* Align size to tile boundary. */
484 gckVGHARDWARE_AlignToTile(
485 IN gckVGHARDWARE Hardware,
486 IN gceSURF_TYPE Type,
487 IN OUT gctUINT32_PTR Width,
488 IN OUT gctUINT32_PTR Height
491 /* Convert logical address to hardware specific address. */
493 gckVGHARDWARE_ConvertLogical(
494 IN gckVGHARDWARE Hardware,
495 IN gctPOINTER Logical,
496 OUT gctUINT32 * Address
501 gckVGHARDWARE_SetMMU(
502 IN gckVGHARDWARE Hardware,
503 IN gctPOINTER Logical
508 gckVGHARDWARE_FlushMMU(
509 IN gckVGHARDWARE Hardware
512 /* Get idle register. */
514 gckVGHARDWARE_GetIdle(
515 IN gckVGHARDWARE Hardware,
519 /* Flush the caches. */
522 IN gckVGHARDWARE Hardware,
523 IN gceKERNEL_FLUSH Flush,
524 IN gctPOINTER Logical,
525 IN OUT gctSIZE_T * Bytes
528 /* Enable/disable fast clear. */
530 gckVGHARDWARE_SetFastClear(
531 IN gckVGHARDWARE Hardware,
536 gckVGHARDWARE_ReadInterrupt(
537 IN gckVGHARDWARE Hardware,
538 OUT gctUINT32_PTR IDs
541 /* Power management. */
543 gckVGHARDWARE_SetPowerManagementState(
544 IN gckVGHARDWARE Hardware,
545 IN gceCHIPPOWERSTATE State
549 gckVGHARDWARE_QueryPowerManagementState(
550 IN gckVGHARDWARE Hardware,
551 OUT gceCHIPPOWERSTATE* State
555 gckVGHARDWARE_SetPowerManagement(
556 IN gckVGHARDWARE Hardware,
557 IN gctBOOL PowerManagement
561 gckVGHARDWARE_SetPowerOffTimeout(
562 IN gckVGHARDWARE Hardware,
567 gckVGHARDWARE_QueryPowerOffTimeout(
568 IN gckVGHARDWARE Hardware,
569 OUT gctUINT32* Timeout
573 gckVGHARDWARE_QueryIdle(
574 IN gckVGHARDWARE Hardware,
575 OUT gctBOOL_PTR IsIdle
577 /******************************************************************************\
578 *************************** Command Buffer Structures **************************
579 \******************************************************************************/
581 /* Vacant command buffer marker. */
582 #define gcvVACANT_BUFFER ((gcsCOMPLETION_SIGNAL_PTR) (1))
584 /* Command buffer header. */
585 typedef struct _gcsCMDBUFFER * gcsCMDBUFFER_PTR;
586 typedef struct _gcsCMDBUFFER
588 /* Pointer to the completion signal. */
589 gcsCOMPLETION_SIGNAL_PTR completion;
591 /* The user sets this to the node of the container buffer whitin which
592 this particular command buffer resides. The kernel sets this to the
593 node of the internally allocated buffer. */
596 /* Command buffer hardware address. */
599 /* The offset of the buffer from the beginning of the header. */
600 gctUINT32 bufferOffset;
602 /* Size of the area allocated for the data portion of this particular
603 command buffer (headers and tail reserves are excluded). */
606 /* Offset into the buffer [0..size]; reflects exactly how much data has
607 been put into the command buffer. */
610 /* The number of command units in the buffer for the hardware to
614 /* MANAGED BY : user HAL (gcoBUFFER object).
615 USED BY : user HAL (gcoBUFFER object).
616 Points to the immediate next allocated command buffer. */
617 gcsCMDBUFFER_PTR nextAllocated;
619 /* MANAGED BY : user layers (HAL and drivers).
620 USED BY : kernel HAL (gcoBUFFER object).
621 Points to the next subbuffer if any. A family of subbuffers are chained
622 together and are meant to be executed inseparably as a unit. Meaning
623 that context switching cannot occur while a chain of subbuffers is being
625 gcsCMDBUFFER_PTR nextSubBuffer;
629 /* Command queue element. */
630 typedef struct _gcsVGCMDQUEUE
632 /* Pointer to the command buffer header. */
633 gcsCMDBUFFER_PTR commandBuffer;
635 /* Dynamic vs. static command buffer state. */
640 /* Context map entry. */
641 typedef struct _gcsVGCONTEXT_MAP
646 /* New state value. */
649 /* Points to the next entry in the mod list. */
650 gcsVGCONTEXT_MAP_PTR next;
654 /* gcsVGCONTEXT structure that holds the current context. */
655 typedef struct _gcsVGCONTEXT
660 /* State caching ebable flag. */
661 gctBOOL stateCachingEnabled;
664 gctUINT32 currentPipe;
666 /* State map/mod buffer. */
670 gctSIZE_T mapContainerSize;
672 gcsVGCONTEXT_MAP_PTR mapContainer;
673 gcsVGCONTEXT_MAP_PTR mapPrev;
674 gcsVGCONTEXT_MAP_PTR mapCurr;
675 gcsVGCONTEXT_MAP_PTR firstPrevMap;
676 gcsVGCONTEXT_MAP_PTR firstCurrMap;
678 /* Main context buffer. */
679 gcsCMDBUFFER_PTR header;
680 gctUINT32_PTR buffer;
682 /* Completion signal. */
686 #if defined(__QNXNTO__)
693 /* User space task header. */
694 typedef struct _gcsTASK * gcsTASK_PTR;
695 typedef struct _gcsTASK
697 /* Pointer to the next task for the same interrupt in user space. */
700 /* Size of the task data that immediately follows the structure. */
703 /* Task data starts here. */
708 /* User space task master table entry. */
709 typedef struct _gcsTASK_MASTER_ENTRY * gcsTASK_MASTER_ENTRY_PTR;
710 typedef struct _gcsTASK_MASTER_ENTRY
712 /* Pointers to the head and to the tail of the task chain. */
716 gcsTASK_MASTER_ENTRY;
718 /* User space task master table entry. */
719 typedef struct _gcsTASK_MASTER_TABLE
721 /* Table with one entry per block. */
722 gcsTASK_MASTER_ENTRY table[gcvBLOCK_COUNT];
724 /* The total number of tasks sckeduled. */
727 /* The total size of event data in bytes. */
730 #if defined(__QNXNTO__)
735 gcsTASK_MASTER_TABLE;
737 /******************************************************************************\
738 ***************************** gckVGINTERRUPT Object ******************************
739 \******************************************************************************/
741 typedef struct _gckVGINTERRUPT * gckVGINTERRUPT;
743 typedef gceSTATUS (* gctINTERRUPT_HANDLER)(
744 IN gckVGKERNEL Kernel
748 gckVGINTERRUPT_Construct(
749 IN gckVGKERNEL Kernel,
750 OUT gckVGINTERRUPT * Interrupt
754 gckVGINTERRUPT_Destroy(
755 IN gckVGINTERRUPT Interrupt
759 gckVGINTERRUPT_Enable(
760 IN gckVGINTERRUPT Interrupt,
761 IN OUT gctINT32_PTR Id,
762 IN gctINTERRUPT_HANDLER Handler
766 gckVGINTERRUPT_Disable(
767 IN gckVGINTERRUPT Interrupt,
774 gckVGINTERRUPT_Enque(
775 IN gckVGINTERRUPT Interrupt
781 gckVGINTERRUPT_Enque(
782 IN gckVGINTERRUPT Interrupt,
784 OUT gctSEMAPHORE *Semaphore
790 gckVGINTERRUPT_DumpState(
791 IN gckVGINTERRUPT Interrupt
795 /******************************************************************************\
796 ******************************* gckVGCOMMAND Object *******************************
797 \******************************************************************************/
799 typedef struct _gckVGCOMMAND * gckVGCOMMAND;
801 /* Construct a new gckVGCOMMAND object. */
803 gckVGCOMMAND_Construct(
804 IN gckVGKERNEL Kernel,
805 IN gctUINT TaskGranularity,
806 IN gctUINT QueueSize,
807 OUT gckVGCOMMAND * Command
810 /* Destroy an gckVGCOMMAND object. */
812 gckVGCOMMAND_Destroy(
813 IN gckVGCOMMAND Command
816 /* Query command buffer attributes. */
818 gckVGCOMMAND_QueryCommandBuffer(
819 IN gckVGCOMMAND Command,
820 OUT gcsCOMMAND_BUFFER_INFO_PTR Information
823 /* Allocate a command queue. */
825 gckVGCOMMAND_Allocate(
826 IN gckVGCOMMAND Command,
828 OUT gcsCMDBUFFER_PTR * CommandBuffer,
829 OUT gctPOINTER * Data
832 /* Release memory held by the command queue. */
835 IN gckVGCOMMAND Command,
836 IN gcsCMDBUFFER_PTR CommandBuffer
839 /* Schedule the command queue for execution. */
841 gckVGCOMMAND_Execute(
842 IN gckVGCOMMAND Command,
843 IN gcsCMDBUFFER_PTR CommandBuffer
846 /* Commit a buffer to the command queue. */
849 IN gckVGCOMMAND Command,
850 IN gcsVGCONTEXT_PTR Context,
851 IN gcsVGCMDQUEUE_PTR Queue,
852 IN gctUINT EntryCount,
853 IN gcsTASK_MASTER_TABLE_PTR TaskTable
856 /******************************************************************************\
857 ********************************* gckVGMMU Object ********************************
858 \******************************************************************************/
860 typedef struct _gckVGMMU * gckVGMMU;
862 /* Construct a new gckVGMMU object. */
865 IN gckVGKERNEL Kernel,
866 IN gctSIZE_T MmuSize,
870 /* Destroy an gckVGMMU object. */
876 /* Allocate pages inside the MMU. */
878 gckVGMMU_AllocatePages(
880 IN gctSIZE_T PageCount,
881 OUT gctPOINTER * PageTable,
882 OUT gctUINT32 * Address
885 /* Remove a page table from the MMU. */
889 IN gctPOINTER PageTable,
890 IN gctSIZE_T PageCount
893 /* Set the MMU page with info. */
897 IN gctUINT32 PageAddress,
898 IN gctUINT32 *PageEntry
907 #endif /* gcdENABLE_VG */
913 #endif /* __gc_hal_h_ */