TIM-VX/unified-tina/inc/HAL/gc_hal.h

1637 lines
48 KiB
C

/****************************************************************************
*
* Copyright (c) 2005 - 2023 by Vivante Corp. All rights reserved.
*
* The material in this file is confidential and contains trade secrets
* of Vivante Corporation. This is proprietary information owned by
* Vivante Corporation. No part of this work may be disclosed,
* reproduced, copied, transmitted, or used in any way for any purpose,
* without the express written permission of Vivante Corporation.
*
*****************************************************************************/
#ifndef __gc_hal_h_
#define __gc_hal_h_
#include "gc_hal_types.h"
#include "gc_hal_enum.h"
#include "gc_hal_base.h"
#include "gc_hal_profiler.h"
#include "gc_hal_driver.h"
#if gcdENABLE_3D
#include "gc_hal_statistics.h"
#endif
#ifdef __cplusplus
extern "C" {
#endif
typedef struct _gckVIDMEM *gckVIDMEM;
typedef struct _gckKERNEL *gckKERNEL;
typedef struct _gckCOMMAND *gckCOMMAND;
typedef struct _gckEVENT *gckEVENT;
typedef struct _gckDB *gckDB;
typedef struct _gckDVFS *gckDVFS;
typedef struct _gckMMU *gckMMU;
typedef struct _gcsDEVICE *gckDEVICE;
/******************************************************************************
****************************** Alignment Macros ******************************
******************************************************************************/
/* Alignment with a non-power of two value. */
#define gcmALIGN_NP2(n, align) (((n) + (align) - 1) - (((n) + (align) - 1) % (align)))
#define gcmALIGN_NP2_SAFE(n, align) \
(\
(gcmALIGN_NP2((n) & ~0ULL, (align) & ~0ULL) ^ gcmALIGN_NP2(n, align)) ? \
(n) : gcmALIGN_NP2(n, align) \
)
/* Alignment with a power of two value. */
#define gcmALIGN(n, align) (((n) + ((align) - 1)) & ~((align) - 1))
#define gcmALIGN_SAFE(n, align) \
(\
(gcmALIGN((n) & ~0ULL, (align) & ~0ULL) ^ gcmALIGN(n, align)) ? \
(n) : gcmALIGN(n, align) \
)
#define gcmALIGN_CHECK_OVERFLOW(n, align) \
(\
(gcmALIGN((n) & ~0ULL, (align) & ~0ULL) ^ gcmALIGN(n, align)) ? \
gcvSTATUS_RESLUT_OVERFLOW : gcvSTATUS_OK \
)
#define gcmALIGN_BASE(n, align) \
(\
((n) & ~((align) - 1)) \
)
/******************************************************************************
**************************** Element Count Macro *****************************
******************************************************************************/
#define gcmSIZEOF(a) ((gctSIZE_T)(sizeof(a)))
#define gcmCOUNTOF(a) (sizeof(a) / sizeof(a[0]))
/******************************************************************************
******************************** Cast Macro **********************************
******************************************************************************/
#define gcmNAME_TO_PTR(na) \
gckKERNEL_QueryPointerFromName(kernel, gcmALL_TO_UINT32(na))
#define gcmPTR_TO_NAME(ptr) \
gckKERNEL_AllocateNameFromPointer(kernel, ptr)
#define gcmRELEASE_NAME(na) \
gckKERNEL_DeleteName(kernel, gcmALL_TO_UINT32(na))
#define gcmALL_TO_UINT32(t) ((gctUINT32)(gctUINTPTR_T)(t))
#define gcmPTR_TO_UINT64(p) ((gctUINT64)(gctUINTPTR_T)(p))
#define gcmUINT64_TO_PTR(u) ((gctPOINTER)(gctUINTPTR_T)(u))
#define gcmUINT64_TO_TYPE(u, t) ((t)(gctUINTPTR_T)(u))
/******************************************************************************
******************************* Useful Macro *********************************
******************************************************************************/
#define gcvINVALID_ADDRESS ~0ULL
#define gcvINVALID_VALUE 0xCCCCCCCC
#define gcvINVALID_PHYSICAL_ADDRESS ~0ULL
#define gcmGET_PRE_ROTATION(rotate) \
((rotate) & (~(gcvSURF_POST_FLIP_X | gcvSURF_POST_FLIP_Y)))
#define gcmGET_POST_ROTATION(rotate) \
((rotate) & (gcvSURF_POST_FLIP_X | gcvSURF_POST_FLIP_Y))
typedef struct _gckHARDWARE *gckHARDWARE;
#define gcdMAX_GPU_COUNT gcvCORE_COUNT
#define gcdMAX_SURF_LAYERS 4
#define gcdMAX_DRAW_BUFFERS 16
#define gcdMAX_3DGPU_COUNT 8
#define gcdMAX_VERTEX_STREAM_COUNT 4
/*******************************************************************************
**
** gcmVERIFY_OBJECT
**
** Assert if an object is invalid or is not of the specified type. If the
** object is invalid or not of the specified type, gcvSTATUS_INVALID_OBJECT
** will be returned from the current function. In retail mode this macro
** does nothing.
**
** ARGUMENTS:
**
** obj Object to test.
** t Expected type of the object.
*/
#if gcmIS_DEBUG(gcdDEBUG_TRACE)
#define _gcmVERIFY_OBJECT(prefix, obj, t) \
if ((obj) == gcvNULL) \
{ \
prefix##TRACE(gcvLEVEL_ERROR, \
#prefix "VERIFY_OBJECT failed: NULL"); \
prefix##TRACE(gcvLEVEL_ERROR, " expected: %c%c%c%c", \
gcmCC_PRINT(t)); \
prefix##ASSERT((obj) != gcvNULL); \
prefix##FOOTER_ARG("status=%d", gcvSTATUS_INVALID_OBJECT); \
return gcvSTATUS_INVALID_OBJECT; \
} \
else if (((gcsOBJECT*) (obj))->type != t) \
{ \
prefix##TRACE(gcvLEVEL_ERROR, \
#prefix "VERIFY_OBJECT failed: %c%c%c%c", \
gcmCC_PRINT(((gcsOBJECT*) (obj))->type)); \
prefix##TRACE(gcvLEVEL_ERROR, " expected: %c%c%c%c", \
gcmCC_PRINT(t)); \
prefix##ASSERT(((gcsOBJECT*)(obj))->type == t); \
prefix##FOOTER_ARG("status=%d", gcvSTATUS_INVALID_OBJECT); \
return gcvSTATUS_INVALID_OBJECT; \
}
#define gcmVERIFY_OBJECT(obj, t) _gcmVERIFY_OBJECT(gcm, obj, t)
#define gcmkVERIFY_OBJECT(obj, t) _gcmVERIFY_OBJECT(gcmk, obj, t)
#else
#define gcmVERIFY_OBJECT(obj, t) do {} while (gcvFALSE)
#define gcmkVERIFY_OBJECT(obj, t) do {} while (gcvFALSE)
#endif
/******************************************************************************/
/*VERIFY_OBJECT if special return expected*/
/******************************************************************************/
#ifndef EGL_API_ANDROID
# define _gcmVERIFY_OBJECT_RETURN(prefix, obj, t, retVal) \
do { \
if ((obj) == gcvNULL) { \
prefix##PRINT_VERSION(); \
prefix##TRACE(gcvLEVEL_ERROR, \
#prefix "VERIFY_OBJECT_RETURN failed: NULL"); \
prefix##TRACE(gcvLEVEL_ERROR, " expected: %c%c%c%c", \
gcmCC_PRINT(t)); \
prefix##ASSERT((obj) != gcvNULL); \
prefix##FOOTER_ARG("retVal=%d", retVal); \
return retVal; \
} else if (((gcsOBJECT *)(obj))->type != t) { \
prefix##PRINT_VERSION(); \
prefix##TRACE(gcvLEVEL_ERROR, \
#prefix "VERIFY_OBJECT_RETURN failed: %c%c%c%c", \
gcmCC_PRINT(((gcsOBJECT *)(obj))->type)); \
prefix##TRACE(gcvLEVEL_ERROR, " expected: %c%c%c%c", \
gcmCC_PRINT(t)); \
prefix##ASSERT(((gcsOBJECT *)(obj))->type == t); \
prefix##FOOTER_ARG("retVal=%d", retVal); \
return retVal; \
} \
} while (gcvFALSE)
# define gcmVERIFY_OBJECT_RETURN(obj, t, retVal) \
_gcmVERIFY_OBJECT_RETURN(gcm, obj, t, retVal)
# define gcmkVERIFY_OBJECT_RETURN(obj, t, retVal) \
_gcmVERIFY_OBJECT_RETURN(gcmk, obj, t, retVal)
#else
# define gcmVERIFY_OBJECT_RETURN(obj, t) do {} while (gcvFALSE)
# define gcmkVERIFY_OBJECT_RETURN(obj, t) do {} while (gcvFALSE)
#endif
/******************************************************************************
********************************* gckOS Object *******************************
******************************************************************************/
/* Construct a new gckOS object. */
gceSTATUS
gckOS_Construct(IN gctPOINTER Context, OUT gckOS *Os);
/* Destroy an gckOS object. */
gceSTATUS
gckOS_Destroy(IN gckOS Os);
/* Query the video memory. */
gceSTATUS
gckOS_QueryVideoMemory(IN gckOS Os,
OUT gctPHYS_ADDR *InternalAddress,
OUT gctSIZE_T *InternalSize,
OUT gctPHYS_ADDR *ExternalAddress,
OUT gctSIZE_T *ExternalSize,
OUT gctPHYS_ADDR *ContiguousAddress,
OUT gctSIZE_T *ContiguousSize);
/* Allocate memory from the heap. */
gceSTATUS
gckOS_Allocate(IN gckOS Os, IN gctSIZE_T Bytes, OUT gctPOINTER *Memory);
/* Free allocated memory. */
gceSTATUS
gckOS_Free(IN gckOS Os, IN gctPOINTER Memory);
/* Wrapper for allocation memory.. */
gceSTATUS
gckOS_AllocateMemory(IN gckOS Os, IN gctSIZE_T Bytes, OUT gctPOINTER *Memory);
/* Wrapper for freeing memory. */
gceSTATUS
gckOS_FreeMemory(IN gckOS Os, IN gctPOINTER Memory);
/* Allocate paged memory. */
gceSTATUS
gckOS_AllocatePagedMemory(IN gckOS Os,
IN gckKERNEL Kernel,
IN gctUINT32 Flag,
IN gceVIDMEM_TYPE Type,
IN OUT gctSIZE_T *Bytes,
OUT gctUINT32 *Gid,
OUT gctPHYS_ADDR *Physical);
/* Lock pages. */
gceSTATUS
gckOS_LockPages(IN gckOS Os,
IN gctPHYS_ADDR Physical,
IN gctSIZE_T Bytes,
IN gctBOOL Cacheable,
OUT gctPOINTER *Logical);
/* Map pages. */
gceSTATUS
gckOS_MapPagesEx(IN gckOS Os,
IN gckKERNEL Kernel,
IN gckMMU Mmu,
IN gctPHYS_ADDR Physical,
IN gctSIZE_T Offset,
IN gctSIZE_T PageCount,
IN gctADDRESS Address,
IN gctPOINTER PageTable,
IN gctBOOL Writable,
IN gceVIDMEM_TYPE Type);
/* Map 1M pages. */
gceSTATUS
gckOS_Map1MPages(IN gckOS Os,
IN gckKERNEL Kernel,
IN gckMMU Mmu,
IN gctPHYS_ADDR Physical,
IN gctSIZE_T PageCount,
IN gctADDRESS Address,
IN gctPOINTER PageTable,
IN gctBOOL Writable,
IN gceVIDMEM_TYPE Type);
gceSTATUS
gckOS_UnmapPages(IN gckOS Os, IN gctSIZE_T PageCount, IN gctADDRESS Address);
/* Unlock pages. */
gceSTATUS
gckOS_UnlockPages(IN gckOS Os, IN gctPHYS_ADDR Physical,
IN gctSIZE_T Bytes, IN gctPOINTER Logical);
/* Free paged memory. */
gceSTATUS
gckOS_FreePagedMemory(IN gckOS Os, IN gctPHYS_ADDR Physical, IN gctSIZE_T Bytes);
/* Allocate non-paged memory. */
gceSTATUS
gckOS_AllocateNonPagedMemory(IN gckOS Os,
IN gckKERNEL Kernel,
IN gctBOOL InUserSpace,
IN gctUINT32 Flag,
IN OUT gctSIZE_T *Bytes,
OUT gctPHYS_ADDR *Physical,
OUT gctPOINTER *Logical);
/* Free non-paged memory. */
gceSTATUS
gckOS_FreeNonPagedMemory(IN gckOS Os,
IN gctPHYS_ADDR Physical,
IN gctPOINTER Logical,
IN gctSIZE_T Bytes);
/* Reserved memory. */
gceSTATUS
gckOS_RequestReservedMemory(gckOS Os,
gctPHYS_ADDR_T Start,
gctSIZE_T Size,
const char *Name,
gctBOOL Requested,
gctPOINTER *MemoryHandle);
void
gckOS_ReleaseReservedMemory(gckOS Os, gctPOINTER MemoryHandle);
/* Reserved memory sub area */
gceSTATUS
gckOS_RequestReservedMemoryArea(IN gckOS Os,
IN gctPOINTER MemoryHandle,
IN gctSIZE_T Offset,
IN gctSIZE_T Size,
OUT gctPOINTER *MemoryAreaHandle);
void
gckOS_ReleaseReservedMemoryArea(gctPOINTER MemoryAreaHandle);
/* Get the number fo bytes per page. */
gceSTATUS
gckOS_GetPageSize(IN gckOS Os, OUT gctSIZE_T *PageSize);
/* Get the physical address of a corresponding logical address. */
gceSTATUS
gckOS_GetPhysicalAddress(IN gckOS Os, IN gctPOINTER Logical,
OUT gctPHYS_ADDR_T *Address);
/* Get real physical address from handle. */
gceSTATUS
gckOS_GetPhysicalFromHandle(IN gckOS Os,
IN gctPHYS_ADDR Physical,
IN gctSIZE_T Offset,
OUT gctPHYS_ADDR_T *PhysicalAddress);
/* Get the physical address of a corresponding user logical address. */
gceSTATUS
gckOS_UserLogicalToPhysical(IN gckOS Os, IN gctPOINTER Logical,
OUT gctPHYS_ADDR_T *Address);
/* Map physical memory. */
gceSTATUS
gckOS_MapPhysical(IN gckOS Os,
IN gctPHYS_ADDR_T Physical,
IN gctSIZE_T Bytes,
OUT gctPOINTER *Logical);
/* Unmap previously mapped physical memory. */
gceSTATUS
gckOS_UnmapPhysical(IN gckOS Os, IN gctPOINTER Logical, IN gctSIZE_T Bytes);
/* Read data from a hardware register. */
gceSTATUS
gckOS_ReadRegister(IN gckOS Os, IN gctUINT32 Address, OUT gctUINT32 *Data);
/* Read data from a hardware register. */
gceSTATUS
gckOS_ReadRegisterEx(IN gckOS Os,
IN gckKERNEL Kernel,
IN gctUINT32 Address,
OUT gctUINT32 *Data);
/* Write data to a hardware register. */
gceSTATUS
gckOS_WriteRegister(IN gckOS Os, IN gctUINT32 Address, IN gctUINT32 Data);
/* Write data to a hardware register. */
gceSTATUS
gckOS_WriteRegisterEx(IN gckOS Os,
IN gckKERNEL Kernel,
IN gctUINT32 Address,
IN gctUINT32 Data);
/* Write data to a hardware register without dump. */
gceSTATUS
gckOS_WriteRegisterEx_NoDump(IN gckOS Os,
IN gckKERNEL Kernel,
IN gctUINT32 Address,
IN gctUINT32 Data);
#ifdef __QNXNTO__
static gcmINLINE gceSTATUS
gckOS_WriteMemory(IN gckOS Os, IN gctPOINTER Address, IN gctUINT32 Data)
{
/* Write memory. */
*(gctUINT32 *)Address = Data;
return gcvSTATUS_OK;
}
#else
/* Write data to a 32-bit memory location. */
gceSTATUS
gckOS_WriteMemory(IN gckOS Os, IN gctPOINTER Address, IN gctUINT32 Data);
#endif
/* Map physical memory into the process space. */
gceSTATUS
gckOS_MapMemory(IN gckOS Os, IN gctPHYS_ADDR Physical,
IN gctSIZE_T Bytes, OUT gctPOINTER *Logical);
/* Unmap physical memory from the specified process space. */
gceSTATUS
gckOS_UnmapMemoryEx(IN gckOS Os,
IN gctPHYS_ADDR Physical,
IN gctSIZE_T Bytes,
IN gctPOINTER Logical,
IN gctUINT32 PID);
/* Unmap physical memory from the process space. */
gceSTATUS
gckOS_UnmapMemory(IN gckOS Os, IN gctPHYS_ADDR Physical,
IN gctSIZE_T Bytes, IN gctPOINTER Logical);
/* Delete a mutex. */
gceSTATUS
gckOS_DeleteMutex(IN gckOS Os, IN gctPOINTER Mutex);
/* Acquire a mutex. */
gceSTATUS
gckOS_AcquireMutex(IN gckOS Os, IN gctPOINTER Mutex, IN gctUINT32 Timeout);
/* Release a mutex. */
gceSTATUS
gckOS_ReleaseMutex(IN gckOS Os, IN gctPOINTER Mutex);
/* Atomically exchange a pair of 32-bit values. */
gceSTATUS
gckOS_AtomicExchange(IN gckOS Os,
IN OUT gctUINT32_PTR Target,
IN gctUINT32 NewValue,
OUT gctUINT32_PTR OldValue);
/* Atomically exchange a pair of pointers. */
gceSTATUS
gckOS_AtomicExchangePtr(IN gckOS Os,
IN OUT gctPOINTER *Target,
IN gctPOINTER NewValue,
OUT gctPOINTER *OldValue);
gceSTATUS
gckOS_AtomSetMask(IN gctPOINTER Atom, IN gctUINT32 Mask);
gceSTATUS
gckOS_AtomClearMask(IN gctPOINTER Atom, IN gctUINT32 Mask);
gceSTATUS
gckOS_DumpCallStack(IN gckOS Os);
gceSTATUS
gckOS_GetProcessNameByPid(IN gctINT Pid, IN gctSIZE_T Length, OUT gctUINT8_PTR String);
gceSTATUS
gckOS_QueryCPUFrequency(IN gckOS Os, IN gctUINT32 CPUId, OUT gctUINT32 *Frequency);
gceSTATUS
gckOS_TraceGpuMemory(IN gckOS Os, IN gctINT32 ProcessID, IN gctINT64 Delta);
void
gckOS_NodeIdAssign(gckOS Os, gcuVIDMEM_NODE_PTR Node);
#if gcdENABLE_CLEAR_FENCE
gceSTATUS
gckOS_ClearAllFence(gckDEVICE Device);
gctUINT64
gckOS_AllocFenceRecordId(IN gckOS Os, IN gcsUSER_FENCE_INFO_PTR fence_info);
gcsUSER_FENCE_INFO_PTR
gckOS_ReleaseFenceRecordId(IN gckOS Os, IN gctUINT64 recordId);
void
gckOS_PreLoadFenceRecId(IN gckOS Os);
void
gckOS_PreLoadEndFenceRecId(IN gckOS Os);
#endif
/*******************************************************************************
**
** gckOS_AtomConstruct
**
** Create an atom.
**
** INPUT:
**
** gckOS Os
** Pointer to a gckOS object.
**
** OUTPUT:
**
** gctPOINTER *Atom
** Pointer to a variable receiving the constructed atom.
*/
gceSTATUS
gckOS_AtomConstruct(IN gckOS Os, OUT gctPOINTER *Atom);
/*******************************************************************************
**
** gckOS_AtomDestroy
**
** Destroy an atom.
**
** INPUT:
**
** gckOS Os
** Pointer to a gckOS object.
**
** gctPOINTER Atom
** Pointer to the atom to destroy.
**
** OUTPUT:
**
** Nothing.
*/
gceSTATUS
gckOS_AtomDestroy(IN gckOS Os, OUT gctPOINTER Atom);
/*******************************************************************************
**
** gckOS_AtomGet
**
** Get the 32-bit value protected by an atom.
**
** INPUT:
**
** gckOS Os
** Pointer to a gckOS object.
**
** gctPOINTER Atom
** Pointer to the atom.
**
** OUTPUT:
**
** gctINT32_PTR Value
** Pointer to a variable the receives the value of the atom.
*/
gceSTATUS
gckOS_AtomGet(IN gckOS Os, IN gctPOINTER Atom, OUT gctINT32_PTR Value);
/*******************************************************************************
**
** gckOS_AtomSet
**
** Set the 32-bit value protected by an atom.
**
** INPUT:
**
** gckOS Os
** Pointer to a gckOS object.
**
** gctPOINTER Atom
** Pointer to the atom.
**
** gctINT32 Value
** The value of the atom.
**
** OUTPUT:
**
** Nothing.
*/
gceSTATUS
gckOS_AtomSet(IN gckOS Os, IN gctPOINTER Atom, IN gctINT32 Value);
/*******************************************************************************
**
** gckOS_AtomIncrement
**
** Atomically increment the 32-bit integer value inside an atom.
**
** INPUT:
**
** gckOS Os
** Pointer to a gckOS object.
**
** gctPOINTER Atom
** Pointer to the atom.
**
** OUTPUT:
**
** gctINT32_PTR Value
** Pointer to a variable the receives the original value of the atom.
*/
gceSTATUS
gckOS_AtomIncrement(IN gckOS Os, IN gctPOINTER Atom, OUT gctINT32_PTR Value);
/*******************************************************************************
**
** gckOS_AtomDecrement
**
** Atomically decrement the 32-bit integer value inside an atom.
**
** INPUT:
**
** gckOS Os
** Pointer to a gckOS object.
**
** gctPOINTER Atom
** Pointer to the atom.
**
** OUTPUT:
**
** gctINT32_PTR Value
** Pointer to a variable the receives the original value of the atom.
*/
gceSTATUS
gckOS_AtomDecrement(IN gckOS Os, IN gctPOINTER Atom, OUT gctINT32_PTR Value);
/* Delay a number of milliseconds. */
gceSTATUS
gckOS_Delay(IN gckOS Os, IN gctUINT32 Delay);
/* Delay a number of milliseconds. */
gceSTATUS
gckOS_Udelay(IN gckOS Os, IN gctUINT32 Delay);
/* Get time in milliseconds. */
gceSTATUS
gckOS_GetTicks(OUT gctUINT32_PTR Time);
/* Compare time value. */
gceSTATUS
gckOS_TicksAfter(IN gctUINT32 Time1, IN gctUINT32 Time2, OUT gctBOOL_PTR IsAfter);
/* Get time in microseconds. */
gceSTATUS
gckOS_GetTime(OUT gctUINT64_PTR Time);
/* Memory barrier. */
gceSTATUS
gckOS_MemoryBarrier(IN gckOS Os, IN gctPOINTER Address);
/* Map user pointer. */
gceSTATUS
gckOS_MapUserPointer(IN gckOS Os,
IN gctPOINTER Pointer,
IN gctSIZE_T Size,
OUT gctPOINTER *KernelPointer);
/* Unmap user pointer. */
gceSTATUS
gckOS_UnmapUserPointer(IN gckOS Os,
IN gctPOINTER Pointer,
IN gctSIZE_T Size,
IN gctPOINTER KernelPointer);
/*******************************************************************************
**
** gckOS_QueryNeedCopy
**
** Query whether the memory can be accessed or mapped directly or it has to be
** copied.
**
** INPUT:
**
** gckOS Os
** Pointer to an gckOS object.
**
** gctUINT32 ProcessID
** Process ID of the current process.
**
** OUTPUT:
**
** gctBOOL_PTR NeedCopy
** Pointer to a boolean receiving gcvTRUE if the memory needs a copy or
** gcvFALSE if the memory can be accessed or mapped dircetly.
*/
gceSTATUS
gckOS_QueryNeedCopy(IN gckOS Os, IN gctUINT32 ProcessID, OUT gctBOOL_PTR NeedCopy);
/*******************************************************************************
**
** gckOS_CopyFromUserData
**
** Copy data from user to kernel memory.
**
** INPUT:
**
** gckOS Os
** Pointer to an gckOS object.
**
** gctPOINTER KernelPointer
** Pointer to kernel memory.
**
** gctPOINTER Pointer
** Pointer to user memory.
**
** gctSIZE_T Size
** Number of bytes to copy.
**
** OUTPUT:
**
** Nothing.
*/
gceSTATUS
gckOS_CopyFromUserData(IN gckOS Os,
IN gctPOINTER KernelPointer,
IN gctPOINTER Pointer,
IN gctSIZE_T Size);
/*******************************************************************************
**
** gckOS_CopyToUserData
**
** Copy data from kernel to user memory.
**
** INPUT:
**
** gckOS Os
** Pointer to an gckOS object.
**
** gctPOINTER KernelPointer
** Pointer to kernel memory.
**
** gctPOINTER Pointer
** Pointer to user memory.
**
** gctSIZE_T Size
** Number of bytes to copy.
**
** OUTPUT:
**
** Nothing.
*/
gceSTATUS
gckOS_CopyToUserData(IN gckOS Os,
IN gctPOINTER KernelPointer,
IN gctPOINTER Pointer,
IN gctSIZE_T Size);
gceSTATUS
gckOS_SuspendInterrupt(IN gckOS Os);
gceSTATUS
gckOS_SuspendInterruptEx(IN gckOS Os, IN gceCORE Core);
gceSTATUS
gckOS_ResumeInterrupt(IN gckOS Os);
gceSTATUS
gckOS_ResumeInterruptEx(IN gckOS Os, IN gceCORE Core);
/* Get the base address for the physical memory. */
gceSTATUS
gckOS_GetBaseAddress(IN gckOS Os, OUT gctUINT32_PTR BaseAddress);
/* Perform a memory copy. */
gceSTATUS
gckOS_MemCopy(IN gctPOINTER Destination,
IN gctCONST_POINTER Source,
IN gctSIZE_T Bytes);
/* Zero memory. */
gceSTATUS
gckOS_ZeroMemory(IN gctPOINTER Memory, IN gctSIZE_T Bytes);
/*******************************************************************************
**
** gckOS_GetProcessID
**
** Get current process ID.
**
** INPUT:
**
** Nothing.
**
** OUTPUT:
**
** gctUINT32_PTR ProcessID
** Pointer to the variable that receives the process ID.
*/
gceSTATUS
gckOS_GetProcessID(OUT gctUINT32_PTR ProcessID);
gceSTATUS
gckOS_GetCurrentProcessID(OUT gctUINT32_PTR ProcessID);
/*******************************************************************************
**
** gckOS_GetThreadID
**
** Get current thread ID.
**
** INPUT:
**
** Nothing.
**
** OUTPUT:
**
** gctUINT32_PTR ThreadID
** Pointer to the variable that receives the thread ID.
*/
gceSTATUS
gckOS_GetThreadID(OUT gctUINT32_PTR ThreadID);
/******************************************************************************
********************************* Signal Object ******************************
******************************************************************************/
/* Create a signal. */
gceSTATUS
gckOS_CreateSignal(IN gckOS Os, IN gctBOOL ManualReset, OUT gctSIGNAL *Signal);
/* Destroy a signal. */
gceSTATUS
gckOS_DestroySignal(IN gckOS Os, IN gctSIGNAL Signal);
/* Signal a signal. */
gceSTATUS
gckOS_Signal(IN gckOS Os, IN gctSIGNAL Signal, IN gctBOOL State);
/* Wait for a signal. */
gceSTATUS
gckOS_WaitSignal(IN gckOS Os, IN gctSIGNAL Signal,
IN gctBOOL Interruptable, IN gctUINT32 Wait);
#ifdef __QNXNTO__
gceSTATUS
gckOS_SignalPulse(IN gckOS Os, IN gctSIGNAL Signal);
gceSTATUS
gckOS_SignalPending(IN gckOS Os, IN gctSIGNAL Signal);
#endif
/* Map a user signal to the kernel space. */
gceSTATUS
gckOS_MapSignal(IN gckOS Os, IN gctSIGNAL Signal,
IN gctHANDLE Process, OUT gctSIGNAL *MappedSignal);
/* Unmap a user signal */
gceSTATUS
gckOS_UnmapSignal(IN gckOS Os, IN gctSIGNAL Signal);
/* Get scatter-gather table from memory. */
gceSTATUS
gckOS_MemoryGetSGT(IN gckOS Os,
IN gctPHYS_ADDR Physical,
IN gctSIZE_T Offset,
IN gctSIZE_T Bytes,
OUT gctPOINTER *SGT);
/* Map a page range of memory to user space. */
gceSTATUS
gckOS_MemoryMmap(IN gckOS Os,
IN gctPHYS_ADDR Physical,
IN gctSIZE_T skipPages,
IN gctSIZE_T numPages,
INOUT gctPOINTER Vma);
/* Wrap a user memory to gctPHYS_ADDR. */
gceSTATUS
gckOS_WrapMemory(IN gckOS Os,
IN gckKERNEL Kernel,
IN gcsUSER_MEMORY_DESC_PTR Desc,
OUT gctSIZE_T *Bytes,
OUT gctPHYS_ADDR *Physical,
OUT gctBOOL *Contiguous,
OUT gctSIZE_T *PageCountCpu);
gceSTATUS
gckOS_GetPolicyID(IN gckOS Os,
IN gceVIDMEM_TYPE Type,
OUT gctUINT32_PTR PolicyID,
OUT gctUINT32_PTR AXIConfig);
#if gcdENABLE_MP_SWITCH
gceSTATUS
gckOS_SwitchCoreCount(IN gckOS Os, OUT gctUINT32 *Count);
#endif
/******************************************************************************
************************* Android Native Fence Sync **************************
******************************************************************************/
gceSTATUS
gckOS_CreateSyncTimeline(IN gckOS Os, IN gceCORE Core, OUT gctHANDLE *Timeline);
gceSTATUS
gckOS_DestroySyncTimeline(IN gckOS Os, IN gctHANDLE Timeline);
gceSTATUS
gckOS_CreateNativeFence(IN gckOS Os,
IN gctHANDLE Timeline,
IN gctSIGNAL Signal,
OUT gctINT *FenceFD);
gceSTATUS
gckOS_WaitNativeFence(IN gckOS Os, IN gctHANDLE Timeline,
IN gctINT FenceFD, IN gctUINT32 Timeout);
#if !USE_NEW_LINUX_SIGNAL
/* Create signal to be used in the user space. */
gceSTATUS
gckOS_CreateUserSignal(IN gckOS Os, IN gctBOOL ManualReset, OUT gctINT *SignalID);
/* Destroy signal used in the user space. */
gceSTATUS
gckOS_DestroyUserSignal(IN gckOS Os, IN gctINT SignalID);
/* Wait for signal used in the user space. */
gceSTATUS
gckOS_WaitUserSignal(IN gckOS Os,
IN gctINT SignalID,
IN gctUINT32 Wait,
OUT gceSIGNAL_STATUS *SignalStatus);
/* Signal a signal used in the user space. */
gceSTATUS
gckOS_SignalUserSignal(IN gckOS Os, IN gctINT SignalID, IN gctBOOL State);
#endif /* USE_NEW_LINUX_SIGNAL */
/* Set a signal owned by a process. */
#if defined(__QNXNTO__)
gceSTATUS
gckOS_UserSignal(IN gckOS Os, IN gctSIGNAL Signal,
IN gctINT Rcvid, IN const struct sigevent *Event);
#else
gceSTATUS
gckOS_UserSignal(IN gckOS Os, IN gctSIGNAL Signal, IN gctHANDLE Handle);
#endif
/******************************************************************************\
** Cache Support
*/
gceSTATUS
gckOS_CacheClean(gckOS Os,
gctUINT32 ProcessID,
gctPHYS_ADDR Handle,
gctSIZE_T Offset,
gctPOINTER Logical,
gctSIZE_T Bytes);
gceSTATUS
gckOS_CacheFlush(gckOS Os,
gctUINT32 ProcessID,
gctPHYS_ADDR Handle,
gctSIZE_T Offset,
gctPOINTER Logical,
gctSIZE_T Bytes);
gceSTATUS
gckOS_CacheInvalidate(gckOS Os,
gctUINT32 ProcessID,
gctPHYS_ADDR Handle,
gctSIZE_T Offset,
gctPOINTER Logical,
gctSIZE_T Bytes);
gceSTATUS
gckOS_CPUPhysicalToGPUPhysical(IN gckOS Os,
IN gctPHYS_ADDR_T CPUPhysical,
IN gctPHYS_ADDR_T *GPUPhysical);
gceSTATUS
gckOS_GPUPhysicalToCPUPhysical(IN gckOS Os,
IN gctPHYS_ADDR_T GPUPhysical,
IN gctPHYS_ADDR_T *CPUPhysical);
gceSTATUS
gckOS_QueryOption(IN gckOS Os, IN gctCONST_STRING Option, OUT gctUINT64 *Value);
/******************************************************************************\
** Debug Support
*/
void
gckOS_SetDebugLevel(IN gctUINT32 Level);
void
gckOS_SetDebugZone(IN gctUINT32 Zone);
void
gckOS_SetDebugLevelZone(IN gctUINT32 Level, IN gctUINT32 Zone);
void
gckOS_SetDebugZones(IN gctUINT32 Zones, IN gctBOOL Enable);
void
gckOS_SetDebugFile(IN gctCONST_STRING FileName);
gceSTATUS
gckOS_Broadcast(IN gckOS Os, IN gckHARDWARE Hardware, IN gceBROADCAST Reason);
gceSTATUS
gckOS_BroadcastHurry(IN gckOS Os, IN gckHARDWARE Hardware, IN gctUINT Urgency);
gceSTATUS
gckOS_BroadcastCalibrateSpeed(IN gckOS Os,
IN gckHARDWARE Hardware,
IN gctUINT Idle,
IN gctUINT Time);
/*******************************************************************************
**
** gckOS_SetGPUPower
**
** Set the power of the GPU on or off.
**
** INPUT:
**
** gckOS Os
** Pointer to a gckOS object.
**
** gckKERNEL Kernel
** Core whose power is set.
**
** gctBOOL Clock
** gcvTRUE to turn on the clock, or gcvFALSE to turn off the clock.
**
** gctBOOL Power
** gcvTRUE to turn on the power, or gcvFALSE to turn off the power.
**
** OUTPUT:
**
** Nothing.
*/
gceSTATUS
gckOS_SetGPUPower(IN gckOS Os,
IN gckKERNEL Kernel,
IN gctBOOL Clock,
IN gctBOOL Power);
gceSTATUS
gckOS_SetClockState(IN gckOS Os, IN gckKERNEL Kernel, IN gctBOOL Clock);
gceSTATUS
gckOS_GetClockState(IN gckOS Os, IN gckKERNEL Kernel, IN gctBOOL *Clock);
gceSTATUS
gckOS_ResetGPU(IN gckOS Os, IN gckKERNEL Kernel);
gceSTATUS
gckOS_PrepareGPUFrequency(IN gckOS Os, IN gceCORE Core);
gceSTATUS
gckOS_FinishGPUFrequency(IN gckOS Os, IN gceCORE Core);
gceSTATUS
gckOS_QueryGPUFrequency(IN gckOS Os,
IN gceCORE Core,
OUT gctUINT32 *Frequency,
OUT gctUINT8 *Scale);
gceSTATUS
gckOS_SetGPUFrequency(IN gckOS Os, IN gceCORE Core, IN gctUINT8 Scale);
/*******************************************************************************
** Semaphores.
*/
/* Create a new semaphore. */
gceSTATUS
gckOS_CreateSemaphore(IN gckOS Os, OUT gctPOINTER *Semaphore);
gceSTATUS
gckOS_CreateSemaphoreEx(IN gckOS Os, OUT gctPOINTER *Semaphore);
/* Delete a semaphore. */
gceSTATUS
gckOS_DestroySemaphore(IN gckOS Os, IN gctPOINTER Semaphore);
/* Acquire a semaphore. */
gceSTATUS
gckOS_AcquireSemaphore(IN gckOS Os, IN gctPOINTER Semaphore);
/* Try to acquire a semaphore. */
gceSTATUS
gckOS_TryAcquireSemaphore(IN gckOS Os, IN gctPOINTER Semaphore);
/* Release a semaphore. */
gceSTATUS
gckOS_ReleaseSemaphore(IN gckOS Os, IN gctPOINTER Semaphore);
/* Release a semaphore. */
gceSTATUS
gckOS_ReleaseSemaphoreEx(IN gckOS Os, IN gctPOINTER Semaphore);
/*******************************************************************************
** Timer API.
*/
typedef void (*gctTIMERFUNCTION)(gctPOINTER);
/* Create a timer. */
gceSTATUS
gckOS_CreateTimer(IN gckOS Os,
IN gctTIMERFUNCTION Function,
IN gctPOINTER Data,
OUT gctPOINTER *Timer);
/* Destroy a timer. */
gceSTATUS
gckOS_DestroyTimer(IN gckOS Os, IN gctPOINTER Timer);
/* Start a timer. */
gceSTATUS
gckOS_StartTimer(IN gckOS Os, IN gctPOINTER Timer, IN gctUINT32 Delay);
/* Stop a timer. */
gceSTATUS
gckOS_StopTimer(IN gckOS Os, IN gctPOINTER Timer);
/******************************************************************************
******************************** gckHEAP Object ******************************
******************************************************************************/
typedef struct _gckHEAP *gckHEAP;
/* Construct a new gckHEAP object. */
gceSTATUS
gckHEAP_Construct(IN gckOS Os, IN gctSIZE_T AllocationSize, OUT gckHEAP *Heap);
/* Destroy an gckHEAP object. */
gceSTATUS
gckHEAP_Destroy(IN gckHEAP Heap);
/* Allocate memory. */
gceSTATUS
gckHEAP_Allocate(IN gckHEAP Heap, IN gctSIZE_T Bytes, OUT gctPOINTER *Node);
/* Free memory. */
gceSTATUS
gckHEAP_Free(IN gckHEAP Heap, IN gctPOINTER Node);
/* Profile the heap. */
gceSTATUS
gckHEAP_ProfileStart(IN gckHEAP Heap);
gceSTATUS
gckHEAP_ProfileEnd(IN gckHEAP Heap, IN gctCONST_STRING Title);
/******************************************************************************
******************************* gckKERNEL Object *****************************
******************************************************************************/
struct _gcsHAL_INTERFACE;
/* Construct a new gckKERNEL object. */
gceSTATUS
gckKERNEL_Construct(IN gckOS Os,
IN gceCORE Core,
IN gctUINT ChipID,
IN gctPOINTER Context,
IN gckDEVICE Device,
IN gckDB SharedDB,
OUT gckKERNEL *Kernel);
/* Destroy an gckKERNEL object. */
gceSTATUS
gckKERNEL_Destroy(IN gckKERNEL Kernel);
/* Dispatch a user-level command. */
gceSTATUS
gckKERNEL_Dispatch(IN gckKERNEL Kernel,
IN gckDEVICE Device,
IN OUT struct _gcsHAL_INTERFACE *Interface);
/* Query Database requirements. */
gceSTATUS
gckKERNEL_QueryDatabase(IN gckKERNEL Kernel,
IN gctUINT32 ProcessID,
IN OUT gcsHAL_INTERFACE *Interface);
/* Query the video memory. */
gceSTATUS
gckKERNEL_QueryVideoMemory(IN gckKERNEL Kernel,
OUT struct _gcsHAL_INTERFACE *Interface);
/* Lookup the gckVIDMEM object for a pool. */
gceSTATUS
gckKERNEL_GetVideoMemoryPool(IN gckKERNEL Kernel, IN gcePOOL Pool,
OUT gckVIDMEM *VideoMemory);
/* Map dedicated video memory node. */
gceSTATUS
gckKERNEL_MapVideoMemory(IN gckKERNEL Kernel,
IN gctBOOL InUserSpace,
IN gcePOOL Pool,
IN gctPHYS_ADDR Physical,
IN gctSIZE_T Offset,
IN gctSIZE_T Bytes,
OUT gctPOINTER *Logical);
/* Unmap dedicated video memory. */
gceSTATUS
gckKERNEL_UnmapVideoMemory(IN gckKERNEL Kernel,
IN gcePOOL Pool,
IN gctPHYS_ADDR Physical,
IN gctPOINTER Logical,
IN gctUINT32 Pid,
IN gctSIZE_T Bytes);
/* Map memory. */
gceSTATUS
gckKERNEL_MapMemory(IN gckKERNEL Kernel,
IN gctPHYS_ADDR Physical,
IN gctSIZE_T Bytes,
OUT gctPOINTER *Logical);
/* Unmap memory. */
gceSTATUS
gckKERNEL_UnmapMemory(IN gckKERNEL Kernel,
IN gctPHYS_ADDR Physical,
IN gctSIZE_T Bytes,
IN gctPOINTER Logical,
IN gctUINT32 ProcessID);
/* Destroy reserved mem when destroy process*/
gceSTATUS
gckKERNEL_DestroyProcessReservedUserMap(IN gckKERNEL Kernel, IN gctUINT32 Pid);
/* Notification of events. */
gceSTATUS
gckKERNEL_Notify(IN gckKERNEL Kernel, IN gceNOTIFY Notifcation);
#if gcdENABLE_VIDEO_MEMORY_MIRROR
gceSTATUS
gckKERNEL_SyncVideoMemoryMirror(gckKERNEL Kernel,
gckVIDMEM_NODE Node,
gctSIZE_T Offset,
gctSIZE_T Bytes,
gctUINT32 Reason);
#endif
/*******************************************************************************
**
** gckKERNEL_Recovery
**
** Try to recover the GPU from a fatal error.
**
** INPUT:
**
** gckKERNEL Kernel
** Pointer to an gckKERNEL object.
**
** OUTPUT:
**
** Nothing.
*/
gceSTATUS
gckKERNEL_Recovery(IN gckKERNEL Kernel);
/* Get access to the user data. */
gceSTATUS
gckKERNEL_OpenUserData(IN gckKERNEL Kernel,
IN gctBOOL NeedCopy,
IN gctPOINTER StaticStorage,
IN gctPOINTER UserPointer,
IN gctSIZE_T Size,
OUT gctPOINTER *KernelPointer);
/* Release resources associated with the user data connection. */
gceSTATUS
gckKERNEL_CloseUserData(IN gckKERNEL Kernel,
IN gctBOOL NeedCopy,
IN gctBOOL FlushData,
IN gctPOINTER UserPointer,
IN gctSIZE_T Size,
OUT gctPOINTER *KernelPointer);
/* Query kernel by core index */
gceSTATUS
gckOS_QueryKernel(IN gckKERNEL Kernel, IN gctINT index, OUT gckKERNEL *KernelOut);
gceSTATUS
gckDVFS_Construct(IN gckHARDWARE Hardware, OUT gckDVFS *Frequency);
gceSTATUS
gckDVFS_Destroy(IN gckDVFS Dvfs);
gceSTATUS
gckDVFS_Start(IN gckDVFS Dvfs);
gceSTATUS
gckDVFS_Stop(IN gckDVFS Dvfs);
/******************************************************************************
******************************* gckHARDWARE Object ***************************
******************************************************************************/
/* Construct a new gckHARDWARE object. */
gceSTATUS
gckHARDWARE_Construct(IN gckOS Os,
IN gckKERNEL Kernel,
OUT gckHARDWARE *Hardware);
/* Post hardware resource allocation after gckHARDWARE object constructed. */
gceSTATUS
gckHARDWARE_PostConstruct(IN gckHARDWARE Hardware);
/* Pre-destroy hardwre resource before destroying an gckHARDWARE object. */
gceSTATUS
gckHARDWARE_PreDestroy(IN gckHARDWARE Hardware);
/* Destroy an gckHARDWARE object. */
gceSTATUS
gckHARDWARE_Destroy(IN gckHARDWARE Hardware);
/* Get hardware type. */
gceSTATUS
gckHARDWARE_GetType(IN gckHARDWARE Hardware, OUT gceHARDWARE_TYPE *Type);
/* Query system memory requirements. */
gceSTATUS
gckHARDWARE_QuerySystemMemory(IN gckHARDWARE Hardware,
OUT gctSIZE_T *SystemSize,
OUT gctUINT32 *SystemBaseAddress);
/* Build virtual address. */
gceSTATUS
gckHARDWARE_BuildVirtualAddress(IN gckHARDWARE Hardware,
IN gctUINT32 Index,
IN gctUINT32 Offset,
OUT gctUINT32 *Address);
/* Query command buffer requirements. */
gceSTATUS
gckHARDWARE_QueryCommandBuffer(IN gckHARDWARE Hardware,
IN gceENGINE Engine,
OUT gctUINT32 *Alignment,
OUT gctUINT32 *ReservedHead,
OUT gctUINT32 *ReservedTail);
/* Add a PIPESELECT command in the command queue. */
gceSTATUS
gckHARDWARE_PipeSelect(IN gckHARDWARE Hardware,
IN gctPOINTER Logical,
IN gcePIPE_SELECT Pipe,
IN OUT gctUINT32 *Bytes);
/* Query the available memory. */
gceSTATUS
gckHARDWARE_QueryMemory(IN gckHARDWARE Hardware,
OUT gctSIZE_T *InternalSize,
OUT gctADDRESS *InternalBaseAddress,
OUT gctUINT32 *InternalAlignment,
OUT gctSIZE_T *ExternalSize,
OUT gctADDRESS *ExternalBaseAddress,
OUT gctUINT32 *ExternalAlignment,
OUT gctUINT32 *HorizontalTileSize,
OUT gctUINT32 *VerticalTileSize);
/* Query the identity of the hardware. */
gceSTATUS
gckHARDWARE_QueryChipIdentity(IN gckHARDWARE Hardware,
OUT gcsHAL_QUERY_CHIP_IDENTITY_PTR Identity);
gceSTATUS
gckHARDWARE_QueryChipOptions(IN gckHARDWARE Hardware,
OUT gcsHAL_QUERY_CHIP_OPTIONS_PTR Options);
/* Split a harwdare specific address into API stuff. */
gceSTATUS
gckHARDWARE_SplitMemory(IN gckHARDWARE Hardware,
IN gctUINT32 Address,
OUT gcePOOL *Pool,
OUT gctUINT32 *Offset);
/* Update command queue tail pointer. */
gceSTATUS
gckHARDWARE_UpdateQueueTail(IN gckHARDWARE Hardware,
IN gctPOINTER Logical,
IN gctUINT32 Offset);
/* Interrupt manager. */
gceSTATUS
gckHARDWARE_Interrupt(IN gckHARDWARE Hardware);
gceSTATUS
gckHARDWARE_Notify(IN gckHARDWARE Hardware);
/* Program MMU. */
gceSTATUS
gckHARDWARE_SetMMU(IN gckHARDWARE Hardware, IN gckMMU Mmu);
/* Flush the MMU. */
gceSTATUS
gckHARDWARE_FlushMMU(IN gckHARDWARE Hardware,
IN gctPOINTER Logical,
IN gctADDRESS Address,
IN gctUINT32 SubsequentBytes,
IN OUT gctUINT32 *Bytes);
gceSTATUS
gckHARDWARE_FlushAsyncMMU(IN gckHARDWARE Hardware,
IN gctPOINTER Logical,
IN OUT gctUINT32 *Bytes);
gceSTATUS
gckHARDWARE_FlushMcfeMMU(IN gckHARDWARE Hardware,
IN gctPOINTER Logical,
IN OUT gctUINT32 *Bytes);
/* Get idle register. */
gceSTATUS
gckHARDWARE_GetIdle(IN gckHARDWARE Hardware, IN gctBOOL Wait, OUT gctUINT32 *Data);
/* Flush the caches. */
gceSTATUS
gckHARDWARE_Flush(IN gckHARDWARE Hardware,
IN gceKERNEL_FLUSH Flush,
IN gctPOINTER Logical,
IN OUT gctUINT32 *Bytes);
/* Enable/disable fast clear. */
gceSTATUS
gckHARDWARE_SetFastClear(IN gckHARDWARE Hardware,
IN gctINT Enable,
IN gctINT Compression);
gceSTATUS
gckHARDWARE_ReadInterrupt(IN gckHARDWARE Hardware, OUT gctUINT32_PTR IDs);
/*
* State timer helper.
*/
gceSTATUS
gckHARDWARE_StartTimerReset(IN gckHARDWARE Hardware);
/* Power management. */
gceSTATUS
gckHARDWARE_SetPowerState(IN gckHARDWARE Hardware, IN gceCHIPPOWERSTATE State);
gceSTATUS
gckHARDWARE_QueryPowerStateUnlocked(IN gckHARDWARE Hardware, OUT gceCHIPPOWERSTATE *State);
gceSTATUS
gckHARDWARE_QueryPowerState(IN gckHARDWARE Hardware, OUT gceCHIPPOWERSTATE *State);
gceSTATUS
gckHARDWARE_EnablePowerManagement(IN gckHARDWARE Hardware, IN gctBOOL Enable);
gceSTATUS
gckHARDWARE_QueryPowerManagement(IN gckHARDWARE Hardware, OUT gctBOOL *Enable);
gceSTATUS
gckHARDWARE_SetGpuProfiler(IN gckHARDWARE Hardware, IN gctBOOL GpuProfiler);
#if gcdENABLE_FSCALE_VAL_ADJUST
gceSTATUS
gckHARDWARE_SetFscaleValue(IN gckHARDWARE Hardware,
IN gctUINT32 FscaleValue,
IN gctUINT32 ShaderFscaleValue);
gceSTATUS
gckHARDWARE_GetFscaleValue(IN gckHARDWARE Hardware,
IN gctUINT *FscaleValue,
IN gctUINT *MinFscaleValue,
IN gctUINT *MaxFscaleValue);
gceSTATUS
gckHARDWARE_SetMinFscaleValue(IN gckHARDWARE Hardware, IN gctUINT MinFscaleValue);
#endif
gceSTATUS
gckHARDWARE_InitializeHardware(IN gckHARDWARE Hardware);
gceSTATUS
gckHARDWARE_Reset(IN gckHARDWARE Hardware);
/* Check for Hardware features. */
gceSTATUS
gckHARDWARE_IsFeatureAvailable(IN gckHARDWARE Hardware, IN gceFEATURE Feature);
gceSTATUS
gckHARDWARE_DumpMMUException(IN gckHARDWARE Hardware);
gceSTATUS
gckHARDWARE_DumpGPUState(IN gckHARDWARE Hardware);
gceSTATUS
gckHARDWARE_InitDVFS(IN gckHARDWARE Hardware);
gceSTATUS
gckHARDWARE_QueryLoad(IN gckHARDWARE Hardware, OUT gctUINT32 *Load);
gceSTATUS
gckHARDWARE_SetDVFSPeroid(IN gckHARDWARE Hardware, IN gctUINT32 Frequency);
gceSTATUS
gckHARDWARE_QueryStateTimer(IN gckHARDWARE Hardware,
OUT gctUINT64_PTR On,
OUT gctUINT64_PTR Off,
OUT gctUINT64_PTR Idle,
OUT gctUINT64_PTR Suspend);
gceSTATUS
gckHARDWARE_Fence(IN gckHARDWARE Hardware,
IN gceENGINE Engine,
IN gctPOINTER Logical,
IN gctADDRESS FenceAddress,
IN gctUINT64 FenceData,
IN OUT gctUINT32 *Bytes);
/******************************************************************************
**************************** gckINTERRUPT Object *****************************
******************************************************************************/
typedef struct _gckINTERRUPT *gckINTERRUPT;
typedef gceSTATUS (*gctINTERRUPT_HANDLER)(IN gckKERNEL Kernel);
gceSTATUS
gckINTERRUPT_Construct(IN gckKERNEL Kernel, OUT gckINTERRUPT *Interrupt);
gceSTATUS
gckINTERRUPT_Destroy(IN gckINTERRUPT Interrupt);
gceSTATUS
gckINTERRUPT_SetHandler(IN gckINTERRUPT Interrupt,
IN OUT gctINT32_PTR Id,
IN gctINTERRUPT_HANDLER Handler);
gceSTATUS
gckINTERRUPT_Notify(IN gckINTERRUPT Interrupt, IN gctBOOL Valid);
/******************************************************************************
******************************** gckMMU Object *******************************
******************************************************************************/
/* Construct a new gckMMU object. */
gceSTATUS
gckMMU_Construct(IN gckKERNEL Kernel, IN gctSIZE_T MmuSize, OUT gckMMU *Mmu);
/* Destroy an gckMMU object. */
gceSTATUS
gckMMU_Destroy(IN gckMMU Mmu);
/* Allocate pages inside the MMU. */
gceSTATUS
gckMMU_AllocatePages(IN gckMMU Mmu,
IN gctSIZE_T PageCount,
IN gcePAGE_TYPE PageType,
OUT gctPOINTER *PageTable,
OUT gctADDRESS *Address);
gceSTATUS
gckMMU_AllocatePagesEx(IN gckMMU Mmu,
IN gctSIZE_T PageCount,
IN gceVIDMEM_TYPE Type,
IN gcePAGE_TYPE PageType,
IN gctBOOL LowVA,
IN gctBOOL Secure,
OUT gctPOINTER *PageTable,
OUT gctADDRESS *Address);
/* Remove a page table from the MMU. */
gceSTATUS
gckMMU_FreePages(IN gckMMU Mmu,
IN gctBOOL Secure,
IN gcePAGE_TYPE PageType,
IN gctBOOL LowVA,
IN gctADDRESS Address,
IN gctPOINTER PageTable,
IN gctSIZE_T PageCount);
/* Set the MMU page with info. */
gceSTATUS
gckMMU_SetPage(IN gckMMU Mmu,
IN gctPHYS_ADDR_T PageAddress,
IN gcePAGE_TYPE PageType,
IN gctBOOL LowVA,
IN gctBOOL Writable,
IN gctUINT32 *PageEntry);
gceSTATUS
gckMMU_Flush(IN gckMMU Mmu, IN gceVIDMEM_TYPE Type);
gceSTATUS
gckMMU_DumpPageTableEntry(IN gckMMU Mmu, IN gceAREA_TYPE AreaType, IN gctADDRESS Address);
gceSTATUS
gckMMU_FillFlatMapping(IN gckMMU Mmu,
IN gctUINT64 PhysBase,
IN gctSIZE_T Size,
IN gctBOOL Reserved,
IN gctBOOL AbleToShift,
OUT gctADDRESS *GpuBaseAddress);
gceSTATUS
gckMMU_IsFlatMapped(IN gckMMU Mmu,
IN gctUINT64 Physical,
IN gctSIZE_T Bytes,
OUT gctBOOL *In,
INOUT gctADDRESS *Address);
gceSTATUS
gckMMU_GetAreaType(IN gckMMU Mmu, IN gctADDRESS GpuAddress, OUT gceAREA_TYPE *AreaType);
gceSTATUS
gckHARDWARE_QueryContextProfile(IN gckHARDWARE Hardware,
IN gctBOOL Reset,
OUT gcsPROFILER_COUNTERS_PART1 *Counters_part1,
OUT gcsPROFILER_COUNTERS_PART2 *Counters_part2);
gceSTATUS
gckHARDWARE_UpdateContextProfile(IN gckHARDWARE Hardware);
gceSTATUS
gckHARDWARE_InitProfiler(IN gckHARDWARE Hardware);
gceSTATUS
gckOS_DetectProcessByName(IN gctCONST_POINTER Name);
void
gckOS_DumpParam(void);
gceSTATUS
gc_mmuinfo_show(void);
#ifdef __cplusplus
}
#endif
#endif /* __gc_hal_h_ */