1 /****************************************************************************
3 * Copyright (C) 2005 - 2014 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 gckVGKERNEL_AllocateLinearMemory(
351 IN OUT gcePOOL * Pool,
353 IN gctUINT32 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 /******************************************************************************\
383 ******************************* gckVGHARDWARE Object ******************************
384 \******************************************************************************/
386 /* Construct a new gckVGHARDWARE object. */
388 gckVGHARDWARE_Construct(
390 OUT gckVGHARDWARE * Hardware
393 /* Destroy an gckVGHARDWARE object. */
395 gckVGHARDWARE_Destroy(
396 IN gckVGHARDWARE Hardware
399 /* Query system memory requirements. */
401 gckVGHARDWARE_QuerySystemMemory(
402 IN gckVGHARDWARE Hardware,
403 OUT gctSIZE_T * SystemSize,
404 OUT gctUINT32 * SystemBaseAddress
407 /* Build virtual address. */
409 gckVGHARDWARE_BuildVirtualAddress(
410 IN gckVGHARDWARE Hardware,
413 OUT gctUINT32 * Address
416 /* Kickstart the command processor. */
418 gckVGHARDWARE_Execute(
419 IN gckVGHARDWARE Hardware,
420 IN gctUINT32 Address,
424 /* Query the available memory. */
426 gckVGHARDWARE_QueryMemory(
427 IN gckVGHARDWARE Hardware,
428 OUT gctSIZE_T * InternalSize,
429 OUT gctUINT32 * InternalBaseAddress,
430 OUT gctUINT32 * InternalAlignment,
431 OUT gctSIZE_T * ExternalSize,
432 OUT gctUINT32 * ExternalBaseAddress,
433 OUT gctUINT32 * ExternalAlignment,
434 OUT gctUINT32 * HorizontalTileSize,
435 OUT gctUINT32 * VerticalTileSize
438 /* Query the identity of the hardware. */
440 gckVGHARDWARE_QueryChipIdentity(
441 IN gckVGHARDWARE Hardware,
442 OUT gceCHIPMODEL* ChipModel,
443 OUT gctUINT32* ChipRevision,
444 OUT gctUINT32* ChipFeatures,
445 OUT gctUINT32* ChipMinorFeatures,
446 OUT gctUINT32* ChipMinorFeatures1
449 /* Convert an API format. */
451 gckVGHARDWARE_ConvertFormat(
452 IN gckVGHARDWARE Hardware,
453 IN gceSURF_FORMAT Format,
454 OUT gctUINT32 * BitsPerPixel,
455 OUT gctUINT32 * BytesPerTile
458 /* Split a harwdare specific address into API stuff. */
460 gckVGHARDWARE_SplitMemory(
461 IN gckVGHARDWARE Hardware,
462 IN gctUINT32 Address,
464 OUT gctUINT32 * Offset
467 /* Align size to tile boundary. */
469 gckVGHARDWARE_AlignToTile(
470 IN gckVGHARDWARE Hardware,
471 IN gceSURF_TYPE Type,
472 IN OUT gctUINT32_PTR Width,
473 IN OUT gctUINT32_PTR Height
476 /* Convert logical address to hardware specific address. */
478 gckVGHARDWARE_ConvertLogical(
479 IN gckVGHARDWARE Hardware,
480 IN gctPOINTER Logical,
481 IN gctBOOL InUserSpace,
482 OUT gctUINT32 * Address
487 gckVGHARDWARE_SetMMU(
488 IN gckVGHARDWARE Hardware,
489 IN gctPOINTER Logical
494 gckVGHARDWARE_FlushMMU(
495 IN gckVGHARDWARE Hardware
498 /* Get idle register. */
500 gckVGHARDWARE_GetIdle(
501 IN gckVGHARDWARE Hardware,
505 /* Flush the caches. */
508 IN gckVGHARDWARE Hardware,
509 IN gceKERNEL_FLUSH Flush,
510 IN gctPOINTER Logical,
511 IN OUT gctSIZE_T * Bytes
514 /* Enable/disable fast clear. */
516 gckVGHARDWARE_SetFastClear(
517 IN gckVGHARDWARE Hardware,
522 gckVGHARDWARE_ReadInterrupt(
523 IN gckVGHARDWARE Hardware,
524 OUT gctUINT32_PTR IDs
527 /* Power management. */
529 gckVGHARDWARE_SetPowerManagementState(
530 IN gckVGHARDWARE Hardware,
531 IN gceCHIPPOWERSTATE State
535 gckVGHARDWARE_QueryPowerManagementState(
536 IN gckVGHARDWARE Hardware,
537 OUT gceCHIPPOWERSTATE* State
541 gckVGHARDWARE_SetPowerManagement(
542 IN gckVGHARDWARE Hardware,
543 IN gctBOOL PowerManagement
547 gckVGHARDWARE_SetPowerOffTimeout(
548 IN gckVGHARDWARE Hardware,
553 gckVGHARDWARE_QueryPowerOffTimeout(
554 IN gckVGHARDWARE Hardware,
555 OUT gctUINT32* Timeout
559 gckVGHARDWARE_QueryIdle(
560 IN gckVGHARDWARE Hardware,
561 OUT gctBOOL_PTR IsIdle
563 /******************************************************************************\
564 *************************** Command Buffer Structures **************************
565 \******************************************************************************/
567 /* Vacant command buffer marker. */
568 #define gcvVACANT_BUFFER ((gcsCOMPLETION_SIGNAL_PTR) ((gctSIZE_T)1))
570 /* Command buffer header. */
571 typedef struct _gcsCMDBUFFER * gcsCMDBUFFER_PTR;
572 typedef struct _gcsCMDBUFFER
574 /* Pointer to the completion signal. */
575 gcsCOMPLETION_SIGNAL_PTR completion;
577 /* The user sets this to the node of the container buffer whitin which
578 this particular command buffer resides. The kernel sets this to the
579 node of the internally allocated buffer. */
580 gcuVIDMEM_NODE_PTR node;
582 /* Command buffer hardware address. */
585 /* The offset of the buffer from the beginning of the header. */
586 gctUINT32 bufferOffset;
588 /* Size of the area allocated for the data portion of this particular
589 command buffer (headers and tail reserves are excluded). */
592 /* Offset into the buffer [0..size]; reflects exactly how much data has
593 been put into the command buffer. */
596 /* The number of command units in the buffer for the hardware to
600 /* MANAGED BY : user HAL (gcoBUFFER object).
601 USED BY : user HAL (gcoBUFFER object).
602 Points to the immediate next allocated command buffer. */
603 gcsCMDBUFFER_PTR nextAllocated;
605 /* MANAGED BY : user layers (HAL and drivers).
606 USED BY : kernel HAL (gcoBUFFER object).
607 Points to the next subbuffer if any. A family of subbuffers are chained
608 together and are meant to be executed inseparably as a unit. Meaning
609 that context switching cannot occur while a chain of subbuffers is being
611 gcsCMDBUFFER_PTR nextSubBuffer;
615 /* Command queue element. */
616 typedef struct _gcsVGCMDQUEUE
618 /* Pointer to the command buffer header. */
619 gcsCMDBUFFER_PTR commandBuffer;
621 /* Dynamic vs. static command buffer state. */
626 /* Context map entry. */
627 typedef struct _gcsVGCONTEXT_MAP
632 /* New state value. */
635 /* Points to the next entry in the mod list. */
636 gcsVGCONTEXT_MAP_PTR next;
640 /* gcsVGCONTEXT structure that holds the current context. */
641 typedef struct _gcsVGCONTEXT
646 /* State caching ebable flag. */
647 gctBOOL stateCachingEnabled;
650 gctUINT32 currentPipe;
652 /* State map/mod buffer. */
655 gcsVGCONTEXT_MAP_PTR mapContainer;
656 gcsVGCONTEXT_MAP_PTR mapPrev;
657 gcsVGCONTEXT_MAP_PTR mapCurr;
658 gcsVGCONTEXT_MAP_PTR firstPrevMap;
659 gcsVGCONTEXT_MAP_PTR firstCurrMap;
661 /* Main context buffer. */
662 gcsCMDBUFFER_PTR header;
663 gctUINT32_PTR buffer;
665 /* Completion signal. */
669 #if defined(__QNXNTO__)
676 /* User space task header. */
677 typedef struct _gcsTASK * gcsTASK_PTR;
678 typedef struct _gcsTASK
680 /* Pointer to the next task for the same interrupt in user space. */
683 /* Size of the task data that immediately follows the structure. */
686 /* Task data starts here. */
691 /* User space task master table entry. */
692 typedef struct _gcsTASK_MASTER_ENTRY * gcsTASK_MASTER_ENTRY_PTR;
693 typedef struct _gcsTASK_MASTER_ENTRY
695 /* Pointers to the head and to the tail of the task chain. */
699 gcsTASK_MASTER_ENTRY;
701 /* User space task master table entry. */
702 typedef struct _gcsTASK_MASTER_TABLE
704 /* Table with one entry per block. */
705 gcsTASK_MASTER_ENTRY table[gcvBLOCK_COUNT];
707 /* The total number of tasks sckeduled. */
710 /* The total size of event data in bytes. */
713 #if defined(__QNXNTO__)
718 gcsTASK_MASTER_TABLE;
720 /******************************************************************************\
721 ***************************** gckVGINTERRUPT Object ******************************
722 \******************************************************************************/
724 typedef struct _gckVGINTERRUPT * gckVGINTERRUPT;
726 typedef gceSTATUS (* gctINTERRUPT_HANDLER)(
727 IN gckVGKERNEL Kernel
731 gckVGINTERRUPT_Construct(
732 IN gckVGKERNEL Kernel,
733 OUT gckVGINTERRUPT * Interrupt
737 gckVGINTERRUPT_Destroy(
738 IN gckVGINTERRUPT Interrupt
742 gckVGINTERRUPT_Enable(
743 IN gckVGINTERRUPT Interrupt,
744 IN OUT gctINT32_PTR Id,
745 IN gctINTERRUPT_HANDLER Handler
749 gckVGINTERRUPT_Disable(
750 IN gckVGINTERRUPT Interrupt,
757 gckVGINTERRUPT_Enque(
758 IN gckVGINTERRUPT Interrupt
764 gckVGINTERRUPT_Enque(
765 IN gckVGINTERRUPT Interrupt,
767 OUT gctSEMAPHORE *Semaphore
773 gckVGINTERRUPT_DumpState(
774 IN gckVGINTERRUPT Interrupt
778 /******************************************************************************\
779 ******************************* gckVGCOMMAND Object *******************************
780 \******************************************************************************/
782 typedef struct _gckVGCOMMAND * gckVGCOMMAND;
784 /* Construct a new gckVGCOMMAND object. */
786 gckVGCOMMAND_Construct(
787 IN gckVGKERNEL Kernel,
788 IN gctUINT TaskGranularity,
789 IN gctUINT QueueSize,
790 OUT gckVGCOMMAND * Command
793 /* Destroy an gckVGCOMMAND object. */
795 gckVGCOMMAND_Destroy(
796 IN gckVGCOMMAND Command
799 /* Query command buffer attributes. */
801 gckVGCOMMAND_QueryCommandBuffer(
802 IN gckVGCOMMAND Command,
803 OUT gcsCOMMAND_BUFFER_INFO_PTR Information
806 /* Allocate a command queue. */
808 gckVGCOMMAND_Allocate(
809 IN gckVGCOMMAND Command,
811 OUT gcsCMDBUFFER_PTR * CommandBuffer,
812 OUT gctPOINTER * Data
815 /* Release memory held by the command queue. */
818 IN gckVGCOMMAND Command,
819 IN gcsCMDBUFFER_PTR CommandBuffer
822 /* Schedule the command queue for execution. */
824 gckVGCOMMAND_Execute(
825 IN gckVGCOMMAND Command,
826 IN gcsCMDBUFFER_PTR CommandBuffer
829 /* Commit a buffer to the command queue. */
832 IN gckVGCOMMAND Command,
833 IN gcsVGCONTEXT_PTR Context,
834 IN gcsVGCMDQUEUE_PTR Queue,
835 IN gctUINT EntryCount,
836 IN gcsTASK_MASTER_TABLE_PTR TaskTable
839 /******************************************************************************\
840 ********************************* gckVGMMU Object ********************************
841 \******************************************************************************/
843 typedef struct _gckVGMMU * gckVGMMU;
845 /* Construct a new gckVGMMU object. */
848 IN gckVGKERNEL Kernel,
849 IN gctUINT32 MmuSize,
853 /* Destroy an gckVGMMU object. */
859 /* Allocate pages inside the MMU. */
861 gckVGMMU_AllocatePages(
863 IN gctSIZE_T PageCount,
864 OUT gctPOINTER * PageTable,
865 OUT gctUINT32 * Address
868 /* Remove a page table from the MMU. */
872 IN gctPOINTER PageTable,
873 IN gctSIZE_T PageCount
876 /* Set the MMU page with info. */
880 IN gctUINT32 PageAddress,
881 IN gctUINT32 *PageEntry
890 #endif /* gcdENABLE_VG */
896 #endif /* __gc_hal_h_ */