From a3167bcfc5ec779e66f2ad7a3a535dccb7eff5ab Mon Sep 17 00:00:00 2001 From: Richard Zhao Date: Thu, 15 Sep 2011 16:42:04 +0800 Subject: ENGR00156850 gpu-viv: add gpu-viv driver source It's vivante driver 4.5.0 (Sep 5, 2011) with freescale changes. Signed-off-by: Richard Zhao Acked-by: Lily Zhang --- .../hal/kernel/gc_hal_kernel_hardware_command_vg.h | 316 +++++++++++++++++++++ 1 file changed, 316 insertions(+) create mode 100644 drivers/mxc/gpu-viv/arch/GC350/hal/kernel/gc_hal_kernel_hardware_command_vg.h (limited to 'drivers/mxc/gpu-viv/arch/GC350/hal/kernel/gc_hal_kernel_hardware_command_vg.h') diff --git a/drivers/mxc/gpu-viv/arch/GC350/hal/kernel/gc_hal_kernel_hardware_command_vg.h b/drivers/mxc/gpu-viv/arch/GC350/hal/kernel/gc_hal_kernel_hardware_command_vg.h new file mode 100644 index 000000000000..a3738fe47b60 --- /dev/null +++ b/drivers/mxc/gpu-viv/arch/GC350/hal/kernel/gc_hal_kernel_hardware_command_vg.h @@ -0,0 +1,316 @@ +/**************************************************************************** +* +* Copyright (C) 2005 - 2011 by Vivante Corp. +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the license, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not write to the Free Software +* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +* +*****************************************************************************/ + + + + + + +#ifndef __gc_hal_kernel_hardware_command_vg_h_ +#define __gc_hal_kernel_hardware_command_vg_h_ + +/******************************************************************************\ +******************* Task and Interrupt Management Structures. ****************** +\******************************************************************************/ + +/* Task storage header. */ +typedef struct _gcsTASK_STORAGE * gcsTASK_STORAGE_PTR; +typedef struct _gcsTASK_STORAGE +{ + /* Next allocated storage buffer. */ + gcsTASK_STORAGE_PTR next; +} +gcsTASK_STORAGE; + +/* Task container header. */ +typedef struct _gcsTASK_CONTAINER * gcsTASK_CONTAINER_PTR; +typedef struct _gcsTASK_CONTAINER +{ + /* The number of tasks left to be processed in the container. */ + gctINT referenceCount; + + /* Size of the buffer. */ + gctUINT size; + + /* Link to the previous and the next allocated containers. */ + gcsTASK_CONTAINER_PTR allocPrev; + gcsTASK_CONTAINER_PTR allocNext; + + /* Link to the previous and the next containers in the free list. */ + gcsTASK_CONTAINER_PTR freePrev; + gcsTASK_CONTAINER_PTR freeNext; +} +gcsTASK_CONTAINER; + +/* Kernel space task master table entry. */ +typedef struct _gcsBLOCK_TASK_ENTRY * gcsBLOCK_TASK_ENTRY_PTR; +typedef struct _gcsBLOCK_TASK_ENTRY +{ + /* Pointer to the current task container for the block. */ + gcsTASK_CONTAINER_PTR container; + + /* Pointer to the current task data within the container. */ + gcsTASK_HEADER_PTR task; + + /* Pointer to the last link task within the container. */ + gcsTASK_LINK_PTR link; + + /* Number of interrupts allocated for this block. */ + gctUINT interruptCount; + + /* The index of the current interrupt. */ + gctUINT interruptIndex; + + /* Interrupt semaphore. */ + gctSEMAPHORE interruptSemaphore; + + /* Interrupt value array. */ + gctINT32 interruptArray[32]; +} +gcsBLOCK_TASK_ENTRY; + + +/******************************************************************************\ +********************* Command Queue Management Structures. ********************* +\******************************************************************************/ + +/* Command queue kernel element pointer. */ +typedef struct _gcsKERNEL_CMDQUEUE * gcsKERNEL_CMDQUEUE_PTR; + +/* Command queue object handler function type. */ +typedef gceSTATUS (* gctOBJECT_HANDLER) ( + gckVGKERNEL Kernel, + gcsKERNEL_CMDQUEUE_PTR Entry + ); + +/* Command queue kernel element. */ +typedef struct _gcsKERNEL_CMDQUEUE +{ + /* The number of buffers in the queue. */ + gcsCMDBUFFER_PTR commandBuffer; + + /* Pointer to the object handler function. */ + gctOBJECT_HANDLER handler; +} +gcsKERNEL_CMDQUEUE; + +/* Command queue header. */ +typedef struct _gcsKERNEL_QUEUE_HEADER * gcsKERNEL_QUEUE_HEADER_PTR; +typedef struct _gcsKERNEL_QUEUE_HEADER +{ + /* The size of the buffer in bytes. */ + gctUINT size; + + /* The number of pending entries to be processed. */ + volatile gctUINT pending; + + /* The current command queue entry. */ + gcsKERNEL_CMDQUEUE_PTR currentEntry; + + /* Next buffer. */ + gcsKERNEL_QUEUE_HEADER_PTR next; +} +gcsKERNEL_QUEUE_HEADER; + + +/******************************************************************************\ +******************************* gckVGCOMMAND Object ******************************* +\******************************************************************************/ + +/* gckVGCOMMAND object. */ +struct _gckVGCOMMAND +{ + /*************************************************************************** + ** Object data and pointers. + */ + + gcsOBJECT object; + gckVGKERNEL kernel; + gckOS os; + gckVGHARDWARE hardware; + + /* Features. */ + gctBOOL fe20; + gctBOOL vg20; + gctBOOL vg21; + + + /*************************************************************************** + ** Enable command queue dumping. + */ + + gctBOOL enableDumping; + + + /*************************************************************************** + ** Bus Error interrupt. + */ + + gctINT32 busErrorInt; + + + /*************************************************************************** + ** Command buffer information. + */ + + gcsCOMMAND_BUFFER_INFO info; + + + /*************************************************************************** + ** Synchronization objects. + */ + + gctPOINTER queueMutex; + gctPOINTER taskMutex; + gctPOINTER commitMutex; + + + /*************************************************************************** + ** Task management. + */ + + /* The head of the storage buffer linked list. */ + gcsTASK_STORAGE_PTR taskStorage; + + /* Allocation size. */ + gctUINT taskStorageGranularity; + gctUINT taskStorageUsable; + + /* The free container list. */ + gcsTASK_CONTAINER_PTR taskFreeHead; + gcsTASK_CONTAINER_PTR taskFreeTail; + + /* Task table */ + gcsBLOCK_TASK_ENTRY taskTable[gcvBLOCK_COUNT]; + + + /*************************************************************************** + ** Command queue. + */ + + /* Pointer to the allocated queue memory. */ + gcsKERNEL_QUEUE_HEADER_PTR queue; + + /* Pointer to the current available queue from which new queue entries + will be allocated. */ + gcsKERNEL_QUEUE_HEADER_PTR queueHead; + + /* If different from queueHead, points to the command queue which is + currently being executed by the hardware. */ + gcsKERNEL_QUEUE_HEADER_PTR queueTail; + + /* Points to the queue to merge the tail with when the tail is processed. */ + gcsKERNEL_QUEUE_HEADER_PTR mergeQueue; + + /* Queue overflow counter. */ + gctUINT queueOverflow; + + + /*************************************************************************** + ** Context. + */ + + /* Context counter used for unique ID. */ + gctUINT64 contextCounter; + + /* Current context ID. */ + gctUINT64 currentContext; +}; + +/******************************************************************************\ +************************ gckVGCOMMAND Object Internal API. *********************** +\******************************************************************************/ + +/* Initialize architecture dependent command buffer information. */ +gceSTATUS +gckVGCOMMAND_InitializeInfo( + IN gckVGCOMMAND Command + ); + +/* Form a STATE command at the specified location in the command buffer. */ +gceSTATUS +gckVGCOMMAND_StateCommand( + IN gckVGCOMMAND Command, + IN gctUINT32 Pipe, + IN gctPOINTER Logical, + IN gctUINT32 Address, + IN gctSIZE_T Count, + IN OUT gctSIZE_T * Bytes + ); + +/* Form a RESTART command at the specified location in the command buffer. */ +gceSTATUS +gckVGCOMMAND_RestartCommand( + IN gckVGCOMMAND Command, + IN gctPOINTER Logical, + IN gctUINT32 FetchAddress, + IN gctUINT FetchCount, + IN OUT gctSIZE_T * Bytes + ); + +/* Form a FETCH command at the specified location in the command buffer. */ +gceSTATUS +gckVGCOMMAND_FetchCommand( + IN gckVGCOMMAND Command, + IN gctPOINTER Logical, + IN gctUINT32 FetchAddress, + IN gctUINT FetchCount, + IN OUT gctSIZE_T * Bytes + ); + +/* Form a CALL command at the specified location in the command buffer. */ +gceSTATUS +gckVGCOMMAND_CallCommand( + IN gckVGCOMMAND Command, + IN gctPOINTER Logical, + IN gctUINT32 FetchAddress, + IN gctUINT FetchCount, + IN OUT gctSIZE_T * Bytes + ); + +/* Form a RETURN command at the specified location in the command buffer. */ +gceSTATUS +gckVGCOMMAND_ReturnCommand( + IN gckVGCOMMAND Command, + IN gctPOINTER Logical, + IN OUT gctSIZE_T * Bytes + ); + +/* Form an EVENT command at the specified location in the command buffer. */ +gceSTATUS +gckVGCOMMAND_EventCommand( + IN gckVGCOMMAND Command, + IN gctPOINTER Logical, + IN gceBLOCK Block, + IN gctINT32 InterruptId, + IN OUT gctSIZE_T * Bytes + ); + +/* Form an END command at the specified location in the command buffer. */ +gceSTATUS +gckVGCOMMAND_EndCommand( + IN gckVGCOMMAND Command, + IN gctPOINTER Logical, + IN gctINT32 InterruptId, + IN OUT gctSIZE_T * Bytes + ); + +#endif /* __gc_hal_kernel_hardware_command_h_ */ + -- cgit v1.2.3