diff options
Diffstat (limited to 'arch/arm/mach-tegra/nv/include/nvos.h')
-rw-r--r-- | arch/arm/mach-tegra/nv/include/nvos.h | 2399 |
1 files changed, 2399 insertions, 0 deletions
diff --git a/arch/arm/mach-tegra/nv/include/nvos.h b/arch/arm/mach-tegra/nv/include/nvos.h new file mode 100644 index 000000000000..9f05fcd905d1 --- /dev/null +++ b/arch/arm/mach-tegra/nv/include/nvos.h @@ -0,0 +1,2399 @@ +/* + * Copyright (c) 2006-2009 NVIDIA Corporation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * Neither the name of the NVIDIA Corporation nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ + +/** + * @file + * <b> NVIDIA Operating System Abstraction</b> + * + * @b Description: Provides interfaces that enable unification of code + * across all supported operating systems. + */ + + +#ifndef INCLUDED_NVOS_H +#define INCLUDED_NVOS_H + +/** + * @defgroup nvos_group NvOS - NVIDIA Operating System Abstraction + * + * This provides a basic set of interfaces to unify code + * across all supported operating systems. This layer does @b not + * handle any hardware specific functions, such as interrupts. + * "Platform" setup and GPU access are done by other layers. + * + * @warning Drivers and applications should @b not make any operating system + * calls outside of this layer, @b including stdlib functions. Doing so will + * result in non-portable code. + * + * For APIs that take key parameters, keys may be of ::NVOS_KEY_MAX length. + * Any characters beyond this maximum is ignored. + * + * All strings passed to or from NvOS functions are encoded in UTF-8. For + * character values below 128, this is the same as simple ASCII. For more + * information, see: + * <a href="http://en.wikipedia.org/wiki/UTF-8" + * target="_blank">http://en.wikipedia.org/wiki/UTF-8</a> + * + * + * @par Important: + * + * At interrupt time there are only a handful of NvOS functions that are safe + * to call: + * - ::NvOsSemaphoreSignal + * - ::NvOsIntrMutexLock + * - ::NvOsIntrMutexUnlock + * - ::NvOsWaitUS + * + * @note Curerntly, ::NvOsWaitUS for ISR has @b only been implemented for AOS and + * WinCE. Use with caution. + * + * @{ + */ + +#include <stdarg.h> +#include "nvcommon.h" +#include "nverror.h" +#include "nvos_trace.h" + +#if defined(__cplusplus) +extern "C" +{ +#endif + +/** + * A physical address. Must be 64 bits for OSs that support more than 64 bits + * of physical addressing, not necessarily correlated to the size of a virtual + * address. + * + * Currently, 64-bit physical addressing is supported by NvOS on WinNT only. + * + * XXX 64-bit phys addressing really should be supported on Linux/x86, since + * all modern x86 CPUs have 36-bit (or more) physical addressing. We might + * need to control a PCI card that the SBIOS has placed at an address above + * 4 GB. + */ +#if NVOS_IS_WINDOWS && !NVOS_IS_WINDOWS_CE +typedef NvU64 NvOsPhysAddr; +#else +typedef NvU32 NvOsPhysAddr; +#endif + +/** The maximum length of a shared resource identifier string. + */ +#define NVOS_KEY_MAX 128 + +/** The maximum length for a file system path. + */ +#define NVOS_PATH_MAX 256 + +/** @name Print Operations + */ +/*@{*/ + +/** Printf family. */ +typedef struct NvOsFileRec *NvOsFileHandle; + +/** Prints a string to a file stream. + * + * @param stream The file stream to which to print. + * @param format The format string. + */ +NvError +NvOsFprintf(NvOsFileHandle stream, const char *format, ...); + +// Doxygen requires escaping backslash characters (\) with another \ so in +// @return, ignore the first backslash if you are reading this in the header. +/** Expands a string into a given string buffer. + * + * @param str A pointer to the target string buffer. + * @param size The size of the string buffer. + * @param format A pointer to the format string. + * + * @return The number of characters printed (not including the \\0). + * The buffer was printed to successfully if the returned value is + * greater than -1 and less than \a size. + */ +NvS32 +NvOsSnprintf(char *str, size_t size, const char *format, ...); + +/** Prints a string to a file stream using a va_list. + * + * @param stream The file stream. + * @param format A pointer to the format string. + * @param ap The va_list structure. + */ +NvError +NvOsVfprintf(NvOsFileHandle stream, const char *format, va_list ap); + +/** Expands a string into a string buffer using a va_list. + * + * @param str A pointer to the target string buffer. + * @param size The size of the string buffer. + * @param format A pointer to the format string. + * @param ap The va_list structure. + * + * @return The number of characters printed (not including the \\0). + * The buffer was printed to successfully if the returned value is + * greater than -1 and less than \a size. + */ +NvS32 +NvOsVsnprintf(char *str, size_t size, const char *format, va_list ap); + +/** + * Outputs a message to the debugging console, if present. All device driver + * debug printfs should use this. Do not use this for interacting with a user + * from an application; in that case, use NvTestPrintf() instead. + * + * @param format A pointer to the format string. + */ +void +NvOsDebugPrintf(const char *format, ...); + +/** + * Same as ::NvOsDebugPrintf, except takes a va_list. + */ +void +NvOsDebugVprintf( const char *format, va_list ap ); + +/** + * Same as ::NvOsDebugPrintf, except returns the number of chars written. + * + * @return number of chars written or -1 if that number is unavailable + */ +NvS32 +NvOsDebugNprintf( const char *format, ...); + +/** + * Prints an error and the line it appeared on. + * Does nothing if err==NvSuccess + * + * @param err - the error to return + * @param file - file the error occurred in. + * @param line - line number the error occurred on. + * @returns err + */ +NvError +NvOsShowError(NvError err, const char *file, int line); + +// Doxygen requires escaping # with a backslash, so in the examples below +// ignore the backslash before the # if reading this in the header file. +/** + * Helper macro to go along with ::NvOsDebugPrintf. Usage: + * <pre> + * NV_DEBUG_PRINTF(("foo: %s\n", bar)); + </pre> + * + * The debug print will be disabled by default in all builds, debug and + * release. @note Usage requires double parentheses. + * + * To enable debug prints in a particular .c file, add the following + * to the top of the .c file and rebuild: + * <pre> + * \#define NV_ENABLE_DEBUG_PRINTS 1 + </pre> + * + * To enable debug prints in a particular module, add the following + * to the makefile and rebuild: + * <pre> + * LCDEFS += -DNV_ENABLE_DEBUG_PRINTS=1 + </pre> + * + */ +#if !defined(NV_ENABLE_DEBUG_PRINTS) +#define NV_ENABLE_DEBUG_PRINTS 0 +#endif +#if NV_ENABLE_DEBUG_PRINTS +// put the print in an if statement so that the compiler will always parse it +#define NV_DEBUG_PRINTF(x) \ + do { if (NV_ENABLE_DEBUG_PRINTS) { NvOsDebugPrintf x ; } } while (0) +#else +#define NV_DEBUG_PRINTF(x) do {} while (0) +#endif + +/*@}*/ +/** @name OS Version + */ +/*@{*/ + +typedef enum +{ + NvOsOs_Unknown, + NvOsOs_Windows, + NvOsOs_Linux, + NvOsOs_Aos, + NvOsOs_Force32 = 0x7fffffffUL, +} NvOsOs; + +typedef enum +{ + NvOsSku_Unknown, + NvOsSku_CeBase, + NvOsSku_Mobile_SmartFon, + NvOsSku_Mobile_PocketPC, + NvOsSku_Android, + NvOsSku_Force32 = 0x7fffffffUL, +} NvOsSku; + +typedef struct NvOsOsInfoRec +{ + NvOsOs OsType; + NvOsSku Sku; + NvU16 MajorVersion; + NvU16 MinorVersion; + NvU32 SubVersion; + NvU32 Caps; +} NvOsOsInfo; + +/** + * Gets the current OS version. + * + * @param pOsInfo A pointer to the operating system information structure. + */ +NvError +NvOsGetOsInformation(NvOsOsInfo *pOsInfo); + +/*@}*/ + +/** @name Resources + */ +/*@{*/ + +/** An opaque resource handle. + */ +typedef struct NvOsResourceRec *NvOsResourceHandle; + +typedef enum +{ + NvOsResource_Unknown, + NvOsResource_Storage, + NvOsResource_Force32 = 0x7fffffffUL, +} NvOsResource; + +#define NVOS_DEV_NAME_MAX 16 + +typedef struct NvOsResourceStorageRec +{ + /// The storage device name. + NvU8 DeviceName[2*NVOS_DEV_NAME_MAX]; + /// The mount point for this storage device. + NvU8 MountPoint[NVOS_PATH_MAX]; + /// The free bytes available within the current context. + NvU64 FreeBytesAvailable; + /// The total bytes available within the current context (used + free). + NvU64 TotalBytes; + /// The total free bytes available on disk. + NvU64 TotalFreeBytes; +} NvOsResourceStorage; + +/** + * Obtain a list of resources of the specified type. + * + * This function is used to aquire a NvOsResourceHandle (may be + * more than one) for a designated resource type. The returned + * handle list is used to retrieve specific details about the + * resource by calling NvOsResouceInfo. + * + * This function may also be used to obtain just the number of + * resources (nResources) if ResourceList is specified as NULL + * by the caller. + * + * If ResourceList is not NULL, this function returns the number + * of resources (nResources) and a pointer to the first resource + * in the array (ResourceList). + * + * @see NvOsResouceInfo() + * + * @param ResourceType The resource type for which to retrieve a handle. + * @param nResources The number of resources in the list. + * @param ResourceList Points to the first resource handle in the list. + * If this parameter is NULL, only nResources is returned. + */ +NvError +NvOsListResources( + NvOsResource ResourceType, + NvU32 *nResources, + NvOsResourceHandle *ResourceList); + +/** + * Gets the resource-specific data for a given + * NvOsResourceHandle. For example, this might include a data + * structure which indicates the amount of free space on a + * particular storage media. + * + * @see NvOsListResources() + * @see NvOsResourceStorage + * + * @param hResource The handle for the resource. + * @param InfoSize The size of the resource structure (Info). + * @param Info Points to a specific resource information structure. + * + * @retval "NvSuccess" if resource information is valid. + * @retval "NvError_FileOperationFailed" if resource info not found. + */ +NvError +NvOsResourceInfo( + NvOsResourceHandle hResource, + NvU32 InfoSize, + void *Info); + +/*@}*/ + +/** @name String Operations + */ +/*@{*/ + +/** Copies a string. + * + * @param dest A pointer to the destination of the copy. + * @param src A pointer to the source string. + * @param size The length of the \a dest string buffer plus NULL terminator. + */ +void +NvOsStrncpy(char *dest, const char *src, size_t size); + +/** Defines straight-forward mappings to international language encodings. + * Commonly-used encodings on supported operating systems are provided. + * @note NvOS string (and file/directory name) processing functions expect + * UTF-8 encodings. If the system-default encoding is not UTF-8, + * conversion may be required. @see NvUStrConvertCodePage. + * + **/ +typedef enum +{ + NvOsCodePage_Unknown, + NvOsCodePage_Utf8, + NvOsCodePage_Utf16, + NvOsCodePage_Windows1252, + NvOsCodePage_Force32 = 0x7fffffffUL, +} NvOsCodePage; + +/** @return The default code page for the system. + * + */ +NvOsCodePage +NvOsStrGetSystemCodePage(void); + +/** Gets the length of a string. + * + * @param s A pointer to the string. + */ +size_t +NvOsStrlen(const char *s); + +/** Compares two strings. + * + * @param s1 A pointer to the first string. + * @param s2 A pointer to the second string. + * + * @return 0 if the strings are identical. + */ +int +NvOsStrcmp(const char *s1, const char *s2); + +/** Compares two strings up to the given length. + * + * @param s1 A pointer to the first string. + * @param s2 A pointer to the second string. + * @param size The length to compare. + * + * @return 0 if the strings are identical. + */ +int +NvOsStrncmp(const char *s1, const char *s2, size_t size); + +/*@}*/ +/** @name Memory Operations (Basic) + */ +/*@{*/ + +/** Copies memory. + * + * @param dest A pointer to the destination of the copy. + * @param src A pointer to the source memory. + * @param size The length of the copy. + */ +void NvOsMemcpy(void *dest, const void *src, size_t size); + +/** Compares two memory regions. + * + * @param s1 A pointer to the first memory region. + * @param s2 A pointer to the second memory region. + * @param size The length to compare. + * + * This returns 0 if the memory regions are identical + */ +int +NvOsMemcmp(const void *s1, const void *s2, size_t size); + +/** Sets a region of memory to a value. + * + * @param s A pointer to the memory region. + * @param c The value to set. + * @param size The length of the region. + */ +void +NvOsMemset(void *s, NvU8 c, size_t size); + +/** Moves memory to a new location (may overlap). + * + * @param dest A pointer to the destination memory region. + * @param src A pointer to the source region. + * @param size The size of the region to move. + */ +void +NvOsMemmove(void *dest, const void *src, size_t size); + +/** + * Like NvOsMemcpy(), but used to safely copy data from an application pointer + * (usually embedded inside an \c ioctl() struct) into a driver pointer. Does not + * make any assumptions about whether the application pointer is valid--will + * return an error instead of crashing if it isn't. Must also validate that + * the application pointer points to memory that the application owns; for + * example, it should point to the user mode region of the address space and + * not the kernel mode region, if such a distinction exists. + * + * @see NvOsCopyOut + * + * @param pDst A pointer to the destination (driver). + * @param pSrc A pointer to the source (client/application). + * @param Bytes The number of bytes to copy. + */ +NvError +NvOsCopyIn( + void *pDst, + const void *pSrc, + size_t Bytes); + +/** + * Like NvOsMemcpy(), but used to safely copy data to an application pointer + * (usually embedded inside an \c ioctl() struct) from a driver pointer. Does not + * make any assumptions about whether the application pointer is valid--will + * return an error instead of crashing if it isn't. Must also validate that + * the application pointer points to memory that the application owns; for + * example, it should point to the user mode region of the address space and + * not the kernel mode region, if such a distinction exists. + * + * @see NvOsCopyIn + * + * @param pDst A pointer to the destination (client/application). + * @param pSrc A pointer to the source (driver). + * @param Bytes The number of bytes to copy. + */ +NvError +NvOsCopyOut( + void *pDst, + const void *pSrc, + size_t Bytes); + +/*@}*/ +/** @name File Input/Output + */ +/*@{*/ + +/** + * + * Defines wrappers over stdlib's file stream functions, + * with some changes to the API. + */ +typedef enum +{ + /** See the fseek manual page for details of Set, Cur, and End. */ + NvOsSeek_Set = 0, + NvOsSeek_Cur = 1, + NvOsSeek_End = 2, + + NvOsSeek_Force32 = 0x7FFFFFFF +} NvOsSeekEnum; + +typedef enum +{ + NvOsFileType_Unknown = 0, + NvOsFileType_File, + NvOsFileType_Directory, + NvOsFileType_Fifo, + NvOsFileType_CharacterDevice, + NvOsFileType_BlockDevice, + + NvOsFileType_Force32 = 0x7FFFFFFF +} NvOsFileType; + +typedef struct NvOsStatTypeRec +{ + NvU64 size; + NvOsFileType type; +} NvOsStatType; + +/** Opens a file with read permissions. */ +#define NVOS_OPEN_READ 0x1 + +/** Opens a file with write persmissions. */ +#define NVOS_OPEN_WRITE 0x2 + +/** Creates a file if is not present on the file system. */ +#define NVOS_OPEN_CREATE 0x4 + +/** Opens a file stream. + * + * If the ::NVOS_OPEN_CREATE flag is specified, ::NVOS_OPEN_WRITE must also + * be specified. + * + * If \c NVOS_OPEN_WRITE is specified, the file will be opened for write and + * will be truncated if it was previously existing. + * + * If \c NVOS_OPEN_WRITE and ::NVOS_OPEN_READ are specified, the file will not + * be truncated. + * + * @param path A pointer to the path to the file. + * @param flags Or'd flags for the open operation (\c NVOS_OPEN_*). + * @param [out] file A pointer to the file that will be opened, if successful. + */ +NvError +NvOsFopen(const char *path, NvU32 flags, NvOsFileHandle *file); + +/** Closes a file stream. + * + * @param stream The file stream to close. + * Passing in a null handle is okay. + */ +void NvOsFclose(NvOsFileHandle stream); + +/** Writes to a file stream. + * + * @param stream The file stream. + * @param ptr A pointer to the data to write. + * @param size The length of the write. + * + * @retval NvError_FileWriteFailed Returned on error. + */ +NvError +NvOsFwrite(NvOsFileHandle stream, const void *ptr, size_t size); + +/** Reads a file stream. + * + * Buffered read implementation if available for a particular OS may + * return corrupted data if multiple threads read from the same + * stream simultaneously. + * + * To detect short reads (less that specified amount), pass in \a bytes + * and check its value to the expected value. The \a bytes parameter may + * be null. + * + * @param stream The file stream. + * @param ptr A pointer to the buffer for the read data. + * @param size The length of the read. + * @param [out] bytes A pointer to the number of bytes readd; may be null. + * + * @retval NvError_FileReadFailed If the file read encountered any + * system errors. + */ +NvError +NvOsFread(NvOsFileHandle stream, void *ptr, size_t size, size_t *bytes); + +/** Reads a file stream with timeout. + * + * Buffered read implementation if available for a particular OS may + * return corrupted data if multiple threads read from the same + * stream simultaneously. + * + * To detect short reads (less that specified amount), pass in \a bytes + * and check its value to the expected value. The \a bytes parameter may + * be null. + * + * @param stream The file stream. + * @param ptr A pointer to the buffer for the read data. + * @param size The length of the read. + * @param [out] bytes A pointer to the number of bytes read; may be null. + * @param timeout_msec Timeout for function to return if no bytes available. + * + * @retval NvError_FileReadFailed If the file read encountered any + * system errors. + * @retval NvError_Timeout If no bytes are available to read. + */ +NvError +NvOsFreadTimeout( + NvOsFileHandle stream, + void *ptr, + size_t size, + size_t *bytes, + NvU32 timeout_msec); + +/** Gets a character from a file stream. + * + * @param stream The file stream. + * @param [out] c A pointer to the character from the file stream. + * + * @retval NvError_EndOfFile When the end of file is reached. + */ +NvError +NvOsFgetc(NvOsFileHandle stream, NvU8 *c); + +/** Changes the file position pointer. + * + * @param file The file. + * @param offset The offset from whence to seek. + * @param whence The starting point for the seek. + * + * @retval NvError_FileOperationFailed On error. + */ +NvError +NvOsFseek(NvOsFileHandle file, NvS64 offset, NvOsSeekEnum whence); + +/** Gets the current file position pointer. + * + * @param file The file. + * @param [out] position A pointer to the file position. + * + * @retval NvError_FileOperationFailed On error. + */ +NvError +NvOsFtell(NvOsFileHandle file, NvU64 *position); + +/** Gets file information. + * + * @param filename A pointer to the file about which to get information. + * @param [out] stat A pointer to the information structure. + */ +NvError +NvOsStat(const char *filename, NvOsStatType *stat); + +/** Gets file information from an already open file. + * + * @param file The open file. + * @param [out] stat A pointer to the information structure. + */ +NvError +NvOsFstat(NvOsFileHandle file, NvOsStatType *stat); + +/** Flushes any pending writes to the file stream. + * + * @param stream The file stream. + */ +NvError +NvOsFflush(NvOsFileHandle stream); + +/** Commits any pending writes to storage media. + * + * After this completes, any pending writes are guaranteed to be on the + * storage media associated with the stream (if any). + * + * @param stream The file stream. + */ +NvError +NvOsFsync(NvOsFileHandle stream); + +/** Removes a file from the storage media. If the file is open, + * this function marks the file for deletion upon close. + * + * @param filename The file to remove + * + * The following error conditions are possible: + * + * NvError_FileOperationFailed - cannot remove file + */ +NvError +NvOsFremove(const char *filename); + +/** + * Thunk into the device driver implementing this file (usually a device file) + * to perform an I/O control (IOCTL) operation. + * + * @param hFile The file on which to perform the IOCTL operation. + * @param IoctlCode The IOCTL code (which operation to perform). + * @param pBuffer A pointer to the buffer containing the data for the IOCTL + * operation. This buffer must first consist of \a InBufferSize bytes of + * input-only data, followed by \a InOutBufferSize bytes of input/output + * data, and finally \a OutBufferSize bytes of output-only data. Its total + * size is therefore: + * <pre> + * InBufferSize + InOutBufferSize + OutBufferSize + </pre> + * @param InBufferSize The number of input-only data bytes in the buffer. + * @param InOutBufferSize The number of input/output data bytes in the buffer. + * @param OutBufferSize The number of output-only data bytes in the buffer. + */ +NvError +NvOsIoctl( + NvOsFileHandle hFile, + NvU32 IoctlCode, + void *pBuffer, + NvU32 InBufferSize, + NvU32 InOutBufferSize, + NvU32 OutBufferSize); + +/*@}*/ +/** @name Directories + */ +/*@{*/ + +/** A handle to a directory. */ +typedef struct NvOsDirRec *NvOsDirHandle; + +/** Opens a directory. + * + * @param path A pointer to the path of the directory to open. + * @param [out] dir A pointer to the directory that will be opened, if successful. + * + * @retval NvError_DirOperationFailed Returned upon failure. + */ +NvError +NvOsOpendir(const char *path, NvOsDirHandle *dir); + +/** Gets the next entry in the directory. + * + * @param dir The directory pointer. + * @param [out] name A pointer to the name of the next file. + * @param size The size of the name buffer. + * + * @retval NvError_EndOfDirList When there are no more entries in the + * directory. + * @retval NvError_DirOperationFailed If there is a system error. + */ +NvError +NvOsReaddir(NvOsDirHandle dir, char *name, size_t size); + +/** Closes the directory. + * + * @param dir The directory to close. + * Passing in a null handle is okay. + */ +void NvOsClosedir(NvOsDirHandle dir); + +/** Virtual filesystem hook. */ +typedef struct NvOsFileHooksRec { + + NvError (*hookFopen)( + const char *path, + NvU32 flags, + NvOsFileHandle *file ); + void (*hookFclose)( + NvOsFileHandle stream); + NvError (*hookFwrite)( + NvOsFileHandle stream, + const void *ptr, + size_t size); + NvError (*hookFread)( + NvOsFileHandle stream, + void *ptr, + size_t size, + size_t *bytes, + NvU32 timeout_msec); + NvError (*hookFseek)( + NvOsFileHandle file, + NvS64 offset, + NvOsSeekEnum whence); + NvError (*hookFtell)( + NvOsFileHandle file, + NvU64 *position); + NvError (*hookFstat)( + NvOsFileHandle file, + NvOsStatType *stat); + NvError (*hookStat)( + const char *filename, + NvOsStatType *stat); + NvError (*hookFflush)( + NvOsFileHandle stream); + NvError (*hookFsync)( + NvOsFileHandle stream); + NvError (*hookFremove)( + const char *filename); + NvError (*hookOpendir)( + const char *path, + NvOsDirHandle *dir); + NvError (*hookReaddir)( + NvOsDirHandle dir, + char *name, + size_t size); + void (*hookClosedir)( + NvOsDirHandle dir); +} NvOsFileHooks; + +/** Sets up hook functions for extra stream functionality. + * + * @note All function pointers must be non-NULL. + * + * @param newHooks A pointer to the new set of functions to handle file I/O. + * NULL for defaults. + */ +const NvOsFileHooks *NvOsSetFileHooks(NvOsFileHooks *newHooks); + +/* configuration variables (in place of getenv) */ + +/** Retrives an unsigned integer variable from the environment. + * + * @param name A pointer to the name of the variable. + * @param [out] value A pointer to the value to write. + * + * @retval NvError_ConfigVarNotFound If the name isn't found in the + * environment. + * @retval NvError_InvalidConfigVar If the configuration variable cannot + * be converted into an unsiged integer. + */ +NvError +NvOsGetConfigU32(const char *name, NvU32 *value); + +/** Retreives a string variable from the environment. + * + * @param name A pointer to the name of the variable. + * @param value A pointer to the value to write into. + * @param size The size of the value buffer. + * + * @retval NvError_ConfigVarNotFound If the name isn't found in the + * environment. + */ +NvError +NvOsGetConfigString(const char *name, char *value, NvU32 size); + +/*@}*/ +/** @name Memory Allocation + */ +/*@{*/ + +/** Dynamically allocates memory. + * Alignment, if desired, must be done by the caller. + * + * @param size The size of the memory to allocate. + */ +void *NvOsAlloc(size_t size); + +/** Re-sizes a previous dynamic allocation. + * + * @param ptr A pointer to the original allocation. + * @param size The new size to allocate. + */ +void *NvOsRealloc(void *ptr, size_t size); + +/** Frees a dynamic memory allocation. + * + * Freeing a null value is okay. + * + * @param ptr A pointer to the memory to free, which should be from + * NvOsAlloc(). + */ +void NvOsFree(void *ptr); + +/** + * Alocates a block of executable memory. + * + * @param size The size of the memory to allocate. + */ +void *NvOsExecAlloc(size_t size); + +/** + * Frees a block of executable memory. + * + * @param ptr A pointer from NvOsExecAlloc() to the memory to free; may be null. + * @param size The size of the allocation. + */ +void NvOsExecFree(void *ptr, size_t size); + +/** An opaque handle returned by shared memory allocations. + */ +typedef struct NvOsSharedMemRec *NvOsSharedMemHandle; + +/** Dynamically allocates multiprocess shared memory. + * + * The memory will be zero initialized when it is first created. + * + * @param key A pointer to the global key to identify the shared allocation. + * @param size The size of the allocation. + * @param [out] descriptor A pointer to the result descriptor. + * + * @return If the shared memory for \a key already exists, then this returns + * the already allcoated shared memory; otherwise, it creates it. + */ +NvError +NvOsSharedMemAlloc(const char *key, size_t size, + NvOsSharedMemHandle *descriptor); + +/** Maps a shared memory region into the process virtual memory. + * + * @param descriptor The memory descriptor to map. + * @param offset The offset in bytes into the mapped area. + * @param size The size area to map. + * @param [out] ptr A pointer to the result pointer. + * + * @retval NvError_SharedMemMapFailed Returned on failure. + */ +NvError +NvOsSharedMemMap(NvOsSharedMemHandle descriptor, size_t offset, + size_t size, void **ptr); + +/** Unmaps a mapped region of shared memory. + * + * @param ptr A pointer to the pointer to virtual memory. + * @param size The size of the mapped region. + */ +void NvOsSharedMemUnmap(void *ptr, size_t size); + +/** Frees shared memory from NvOsSharedMemAlloc(). + * + * It is valid to call \c NvOsSharedMemFree while mappings are still + * outstanding. + * + * @param descriptor The memory descriptor. + */ +void NvOsSharedMemFree(NvOsSharedMemHandle descriptor); + +/** Defines memory attributes. */ +typedef enum +{ + NvOsMemAttribute_Uncached = 0, + NvOsMemAttribute_WriteBack = 1, + NvOsMemAttribute_WriteCombined = 2, + + NvOsMemAttribute_Force32 = 0x7FFFFFFF +} NvOsMemAttribute; + +/** Specifies no memory flags. */ +#define NVOS_MEM_NONE 0x0 + +/** Specifies the memory may be read. */ +#define NVOS_MEM_READ 0x1 + +/** Specifies the memory may be written to. */ +#define NVOS_MEM_WRITE 0x2 + +/** Specifies the memory may be executed. */ +#define NVOS_MEM_EXECUTE 0x4 + +/** + * The memory must be visible by all processes, this is only valid for + * WinCE 5.0. + */ +#define NVOS_MEM_GLOBAL_ADDR 0x8 + +/** The memory may be both read and writen. */ +#define NVOS_MEM_READ_WRITE (NVOS_MEM_READ | NVOS_MEM_WRITE) + +/** Maps computer resources into user space. + * + * @param phys The physical address start. + * @param size The size of the aperture. + * @param attrib Memory attributes (caching). + * @param flags Bitwise OR of \c NVOS_MEM_*. + * @param [out] ptr A pointer to the result pointer. + */ +NvError +NvOsPhysicalMemMap(NvOsPhysAddr phys, size_t size, + NvOsMemAttribute attrib, NvU32 flags, void **ptr); + +/** Maps computer resources into user space. + * + * This function is intended to be called by device drivers only, + * and will fail in user space. The virtual address can be allocated + * by calling NvRmOsPhysicalMemMap() with flags set to ::NVOS_MEM_NONE, which + * should be done by the calling process. That virtual region will be + * passed to some device driver, and this function will set up the + * PTEs to make the virtual space point to the supplied physical + * address. + * + * This is used by NvRmMemMap() to map memory under WinCE6 where user + * mode applications cannot map physical memory directly. + * + * @param pCallerPtr A pointer to the virtual address from the calling process. + * @param phys The physical address start. + * @param size The size of the aperture. + * @param attrib Memory attributes (caching). + * @param flags Bitwise OR of NVOS_MEM_*. + */ +NvError +NvOsPhysicalMemMapIntoCaller(void *pCallerPtr, NvOsPhysAddr phys, + size_t size, NvOsMemAttribute attrib, NvU32 flags); + +/** + * Releases resources previously allocated by NvOsPhysicalMemMap(). + * + * @param ptr The virtual pointer returned by \c NvOsPhysicalMemMap. If this + * pointer is null, this function has no effect. + * @param size The size of the mapped region. + */ +void NvOsPhysicalMemUnmap(void *ptr, size_t size); + +/*@}*/ +/** @name Page Allocator + */ +/*@{*/ + +/** + * Low-level memory allocation of the external system memory. + */ +typedef enum +{ + NvOsPageFlags_Contiguous = 0, + NvOsPageFlags_NonContiguous = 1, + + NvOsMemFlags_Forceword = 0x7ffffff, +} NvOsPageFlags; + +typedef struct NvOsPageAllocRec *NvOsPageAllocHandle; + +/** Allocates memory via the page allocator. + * + * @param size The number of bytes to allocate. + * @param attrib Page caching attributes. + * @param flags Various memory allocation flags. + * @param protect Page protection attributes (\c NVOS_MEM_*). + * @param [out] descriptor A pointer to the result descriptor. + * + * @return A descriptor (not a pointer to virtual memory), + * which may be passed into other functions. + */ +NvError +NvOsPageAlloc(size_t size, NvOsMemAttribute attrib, + NvOsPageFlags flags, NvU32 protect, NvOsPageAllocHandle *descriptor); + +/** + * Locks down the pages in a region of memory and provides a descriptor that can + * be used to query the PTEs. Locked pages are guaranteed to not be swapped + * out or moved by the OS. To unlock the pages when done, call NvOsPageFree() + * on the resulting descriptor. + * + * @param ptr Pointer to the buffer to lock down. + * @param size Number of bytes in the buffer to lock down. + * @param protect Page protection attributes (NVOS_MEM_*) + * @param [out] descriptor Output parameter to pass back the descriptor. + * + * @retval NvSuccess If successful, or the appropriate error code. + * @note Some operating systems may not support this operation and will return + * \a NvError_NotImplemented to all requests. + */ +NvError +NvOsPageLock(void *ptr, size_t size, NvU32 protect, NvOsPageAllocHandle *descriptor); + +/** Frees pages from NvOsPageAlloc(). + * + * It is not valid to call NvOsPageFree() while there are outstanding + * mappings. + * + * @param descriptor The descriptor from \c NvOsPageAlloc. + */ +void +NvOsPageFree(NvOsPageAllocHandle descriptor); + +/** Maps pages into the virtual address space. + * + * Upon successful completion, \a *ptr holds a virtual address + * that may be accessed. + * + * @param descriptor Allocated pages from NvOsPageAlloc(), etc. + * @param offset Offset in bytes into the page range. + * @param size The size of the mapping. + * @param [out] ptr A pointer to the result pointer. + * + * @retval NvSuccess If successful, or the appropriate error code. + */ +NvError +NvOsPageMap(NvOsPageAllocHandle descriptor, size_t offset, size_t size, + void **ptr); + +/** Maps pages into the provided virtual address space. + * + * Virtual address space can be obtained by calling + * NvOsPhysicalMemMap() and passing ::NVOS_MEM_NONE for the + * flags parameter. + * + * @note You should only use this function if you really, really + * know what you are doing(1). + * + * Upon successful completion, \a *ptr holds a virtual address + * that may be accessed. + * + * @param descriptor Allocated pages from NvOsPageAlloc(), etc. + * @param pCallerPtr Pointer to user supplied virtual address space. + * @param offset Offset in bytes into the page range + * @param size The size of the mapping + * + * @retval NvSuccess If successful, or the appropriate error code. + */ +NvError +NvOsPageMapIntoPtr(NvOsPageAllocHandle descriptor, void *pCallerPtr, + size_t offset, size_t size); + +/** Unmaps the virtual address from NvOsPageMap(). + * + * @param descriptor Allocated pages from NvOsPageAlloc(), etc. + * @param ptr A pointer to the virtual address to unmap that was returned + * from \c NvOsPageMap. + * @param size The size of the mapping, which should match what + * was passed into \c NvOsPageMap. + */ +void +NvOsPageUnmap(NvOsPageAllocHandle descriptor, void *ptr, size_t size); + +/** Returns the physical address given an offset. + * + * This is useful for non-contiguous page allocations. + * + * @param descriptor The descriptor from NvOsPageAlloc(), etc. + * @param offset The offset in bytes into the page range. + */ +NvOsPhysAddr +NvOsPageAddress(NvOsPageAllocHandle descriptor, size_t offset); + +/*@}*/ +/** @name Dynamic Library Handling + */ +/*@{*/ + +/** A handle to a dynamic library. */ +typedef struct NvOsLibraryRec *NvOsLibraryHandle; + +/** Load a dynamic library. + * + * No operating system specific suffixes or paths should be used for the + * library name. So do not use: + * <pre> + /usr/lib/libnvos.so + libnvos.dll + </pre> + * Just use: + * <pre> + libnvos + </pre> + * + * @param name A pointer to the library name. + * @param [out] library A pointer to the result library. + * + * @retval NvError_LibraryNotFound If the library cannot be opened. + */ +NvError +NvOsLibraryLoad(const char *name, NvOsLibraryHandle *library); + +/** Gets an address of a symbol in a dynamic library. + * + * @param library The dynamic library. + * @param symbol A pointer to the symbol to lookup. + * + * @return The address of the symbol, or NULL if the symbol cannot be found. + */ +void* +NvOsLibraryGetSymbol(NvOsLibraryHandle library, const char *symbol); + +/** Unloads a dynamic library. + * + * @param library The dynamic library to unload. + * It is okay to pass a null \a library value. + */ +void +NvOsLibraryUnload(NvOsLibraryHandle library); + +/*@}*/ +/** @name Syncronization Objects and Thread Management + */ +/*@{*/ + +typedef struct NvOsMutexRec *NvOsMutexHandle; +typedef struct NvOsIntrMutexRec *NvOsIntrMutexHandle; +typedef struct NvOsSpinMutexRec *NvOsSpinMutexHandle; +typedef struct NvOsSemaphoreRec *NvOsSemaphoreHandle; +typedef struct NvOsThreadRec *NvOsThreadHandle; + +/** Unschedules the calling thread for at least the given + * number of milliseconds. + * + * Other threads may run during the sleep time. + * + * @param msec The number of milliseconds to sleep. + */ +void +NvOsSleepMS(NvU32 msec); + +/** Stalls the calling thread for at least the given number of + * microseconds. The actual time waited might be longer; you cannot + * depend on this function for precise timing. + * + * @note It is safe to use this function at ISR time. + * + * @param usec The number of microseconds to wait. + */ +void +NvOsWaitUS(NvU32 usec); + +/** + * Allocates a new (intra-process) mutex. + * + * @note Mutexes can be locked recursively; if a thread owns the lock, + * it can lock it again as long as it unlocks it an equal number of times. + * + * @param mutex The mutex to initialize. + * + * @return \a NvError_MutexCreateFailed, or one of common error codes on + * failure. + */ +NvError NvOsMutexCreate(NvOsMutexHandle *mutex); + +/** Locks the given unlocked mutex. + * + * If a process is holding a lock on a multi-process mutex when it terminates, + * this lock will be automatically released. + * + * @param mutex The mutex to lock; note that this is a recursive lock. + */ +void NvOsMutexLock(NvOsMutexHandle mutex); + +/** Unlocks a locked mutex. + * + * A mutex must be unlocked exactly as many times as it has been locked. + * + * @param mutex The mutex to unlock. + */ +void NvOsMutexUnlock(NvOsMutexHandle mutex); + +/** Frees the resources held by a mutex. + * + * Mutecies are reference counted across the computer (multiproceses), + * and a given mutex will not be destroyed until the last reference has + * gone away. + * + * @param mutex The mutex to destroy. Passing in a null mutex is okay. + */ +void NvOsMutexDestroy(NvOsMutexHandle mutex); + +/** + * Creates a mutex that is safe to aquire in an ISR. + * + * @param mutex A pointer to the mutex is stored here on success. + */ +NvError NvOsIntrMutexCreate(NvOsIntrMutexHandle *mutex); + +/** + * Aquire an ISR-safe mutex. + * + * @param mutex The mutex to lock. For kernel (OAL) implementations, + * NULL implies the system-wide lock will be used. + */ +void NvOsIntrMutexLock(NvOsIntrMutexHandle mutex); + +/** + * Releases an ISR-safe mutex. + * + * @param mutex The mutex to unlock. For kernel (OAL) implementations, + * NULL implies the system-wide lock will be used. + */ +void NvOsIntrMutexUnlock(NvOsIntrMutexHandle mutex); + +/** + * Destroys an ISR-safe mutex. + * + * @param mutex The mutex to destroy. If \a mutex is NULL, this API has no + * effect. + */ +void NvOsIntrMutexDestroy(NvOsIntrMutexHandle mutex); + +/** + * Creates a spin mutex. + * This mutex is SMP safe, but it is not ISR-safe. + * + * @param mutex A pointer to the mutex is stored here on success. + */ +NvError NvOsSpinMutexCreate(NvOsSpinMutexHandle *mutex); + +/** + * Acquire a spin mutex. + * Spins until mutex is acquired; when acquired disables kernel preemption. + * + * @param mutex The mutex handle to lock. + */ +void NvOsSpinMutexLock(NvOsSpinMutexHandle mutex); + +/** + * Releases a spin mutex. + * + * @param mutex The mutex handle to unlock. + */ +void NvOsSpinMutexUnlock(NvOsSpinMutexHandle mutex); + +/** + * Destroys a spin mutex. + * + * @param mutex The mutex to destroy. If \a mutex is NULL, this API has no + * effect. + */ +void NvOsSpinMutexDestroy(NvOsSpinMutexHandle mutex); + +/** + * Creates a counting semaphore. + * + * @param semaphore A pointer to the semaphore to initialize. + * @param value The initial semaphore value. + * + * @retval NvSuccess If successful, or the appropriate error code. + */ +NvError +NvOsSemaphoreCreate(NvOsSemaphoreHandle *semaphore, NvU32 value); + +/** + * Creates a duplicate semaphore from the given semaphore. + * Freeing the original semaphore has no effect on the new semaphore. + * + * @param orig The semaphore to duplicate. + * @param semaphore A pointer to the new semaphore. + * + * @retval NvSuccess If successful, or the appropriate error code. + */ +NvError +NvOsSemaphoreClone( NvOsSemaphoreHandle orig, NvOsSemaphoreHandle *semaphore); + +/** + * Obtains a safe, usable handle to a semaphore passed across an ioctl() + * interface by a client to a device driver. Validates that the original + * semaphore handle is legal, and creates a new handle (valid in the driver's + * process/address space) that the client cannot asynchronously destroy. + * + * The new handle must be freed, just like any other semaphore handle, by + * passing it to NvOsSemaphoreDestroy(). + * + * @param hClientSema The client's semaphore handle. + * @param phDriverSema If successful, returns a new handle to the semaphore + * that the driver can safely use. + * + * @retval NvSuccess If successful, or the appropriate error code. + */ +NvError +NvOsSemaphoreUnmarshal( NvOsSemaphoreHandle hClientSema, + NvOsSemaphoreHandle *phDriverSema); + +/** Waits until the semaphore value becomes non-zero, then + * decrements the value and returns. + * + * @param semaphore The semaphore to wait for. + */ +void NvOsSemaphoreWait(NvOsSemaphoreHandle semaphore); + +/** + * Waits for the given semaphore value to become non-zero with timeout. If + * the semaphore value becomes non-zero before the timeout, then the value is + * decremented and \a NvSuccess is returned. + * + * @param semaphore The semaphore to wait for. + * @param msec Timeout value in milliseconds. + * ::NV_WAIT_INFINITE can be used to wait forever. + * + * @retval NvError_Timeout If the wait expires. + */ +NvError +NvOsSemaphoreWaitTimeout(NvOsSemaphoreHandle semaphore, NvU32 msec); + +/** Increments the semaphore value. + * + * @param semaphore The semaphore to signal. + */ +void +NvOsSemaphoreSignal(NvOsSemaphoreHandle semaphore); + +/** Frees resources held by the semaphore. + * + * Semaphores are reference counted across the computer (multiproceses), + * and a given semaphore will not be destroyed until the last reference has + * gone away. + * + * @param semaphore The semaphore to destroy. + * Passing in a null semaphore is okay (no op). + */ +void +NvOsSemaphoreDestroy(NvOsSemaphoreHandle semaphore); + +/** Sets thread mode. + * + * @pre If this is called, it must be called before any other threading function. + * All but the first call to this function do nothing and return + * \a NvError_AlreadyAllocated. + * + * @param coop 0 to disable coop mode, and 1 to enable coop mode. + * + * @returns NvSuccess On success. + * @returns NvError_AlreadyAllocated If called previously. + */ +NvError NvOsThreadMode(int coop); + +/** Entry point for a thread. + */ +typedef void (*NvOsThreadFunction)(void *args); + +/** Creates a thread. + * + * @param function The thread entry point. + * @param args A pointer to the thread arguments. + * @param [out] thread A pointer to the result thread ID structure. + */ +NvError +NvOsThreadCreate( NvOsThreadFunction function, void *args, + NvOsThreadHandle *thread); + +/** Creates a near interrupt priority thread. + * + * @param function The thread entry point. + * @param args A pointer to the thread arguments. + * @param [out] thread A pointer to the result thread ID structure. + */ +NvError +NvOsInterruptPriorityThreadCreate( NvOsThreadFunction function, void *args, + NvOsThreadHandle *thread); + +/** + * Sets the thread's priority to low priority. + * + * @retval NvError_NotSupported May be returned. + */ +NvError NvOsThreadSetLowPriority(void); + +/** Waits for the given thread to exit. + * + * The joined thread will be destroyed automatically. All OS resources + * will be reclaimed. There is no method for terminating a thread + * before it exits naturally. + * + * @param thread The thread to wait for. + * Passing in a null thread ID is okay (no op). + */ +void NvOsThreadJoin(NvOsThreadHandle thread); + +/** Yields to another runnable thread. + */ +void NvOsThreadYield(void); + +/** + * Atomically compares the contents of a 32-bit memory location with a value, + * and if they match, updates it to a new value. This function is the + * equivalent of the following code, except that other threads or processors + * are effectively prevented from reading or writing \a *pTarget while we are + * inside the function. + * + * @code + * NvS32 OldTarget = *pTarget; + * if (OldTarget == OldValue) + * *pTarget = NewValue; + * return OldTarget; + * @endcode + */ +NvS32 NvOsAtomicCompareExchange32(NvS32 *pTarget, NvS32 OldValue, NvS32 + NewValue); + +/** + * Atomically swaps the contents of a 32-bit memory location with a value. This + * function is the equivalent of the following code, except that other threads + * or processors are effectively prevented from reading or writing \a *pTarget + * while we are inside the function. + * + * @code + * NvS32 OldTarget = *pTarget; + * *pTarget = Value; + * return OldTarget; + * @endcode + */ +NvS32 NvOsAtomicExchange32(NvS32 *pTarget, NvS32 Value); + +/** + * Atomically increments the contents of a 32-bit memory location by a specified + * amount. This function is the equivalent of the following code, except that + * other threads or processors are effectively prevented from reading or + * writing \a *pTarget while we are inside the function. + * + * @code + * NvS32 OldTarget = *pTarget; + * *pTarget = OldTarget + Value; + * return OldTarget; + * @endcode + */ +NvS32 NvOsAtomicExchangeAdd32(NvS32 *pTarget, NvS32 Value); + +/** A TLS index that is guaranteed to be invalid. */ +#define NVOS_INVALID_TLS_INDEX 0xFFFFFFFF +#define NVOS_TLS_CNT 4 + +/** + * Allocates a thread-local storage variable. All TLS variables have initial + * value NULL in all threads when first allocated. + * + * @returns The TLS index of the TLS variable if successful, or + * ::NVOS_INVALID_TLS_INDEX if not. + */ +NvU32 NvOsTlsAlloc(void); + +/** + * Frees a thread-local storage variable. + * + * @param TlsIndex The TLS index of the TLS variable. This function is a no-op + * if TlsIndex equals ::NVOS_INVALID_TLS_INDEX. + */ +void NvOsTlsFree(NvU32 TlsIndex); + +/** + * Gets the value of a thread-local storage variable. + * + * @param TlsIndex The TLS index of the TLS variable. + * The current value of the TLS variable is returned. + */ +void *NvOsTlsGet(NvU32 TlsIndex); + +/** + * Sets the value of a thread-local storage variable. + * + * @param TlsIndex The TLS index of the TLS variable. + * @param Value A pointer to the new value of the TLS variable. + */ +void NvOsTlsSet(NvU32 TlsIndex, void *Value); + +/*@}*/ +/** @name Time Functions + */ +/*@{*/ + +/** @return The system time in milliseconds. + * + * The returned values are guaranteed to be monotonically increasing, + * but may wrap back to zero (after about 50 days of runtime). + * + * In some systems, this is the number of milliseconds since power-on, + * or may actually be an accurate date. + */ +NvU32 +NvOsGetTimeMS(void); + +/** @return The system time in microseconds. + * + * The returned values are guaranteed to be monotonically increasing, + * but may wrap back to zero. + * + * Some systems cannot gauantee a microsecond resolution timer. + * Even though the time returned is in microseconds, it is not gaurnateed + * to have micro-second resolution. + * + * Please be advised that this API is mainly used for code profiling and + * meant to be used direclty in driver code. + */ +NvU64 +NvOsGetTimeUS(void); + +/*@}*/ +/** @name CPU Cache + * Cache operations for both instruction and data cache, implemented + * per processor. + */ +/*@{*/ + +/** Writes back the entire data cache. + */ +void +NvOsDataCacheWriteback(void); + +/** Writes back and invalidates the entire data cache. + */ +void +NvOsDataCacheWritebackInvalidate(void); + +/** Writes back a range of the data cache. + * + * @param start A pointer to the start address. + * @param length The number of bytes to write back. + */ +void +NvOsDataCacheWritebackRange(void *start, NvU32 length); + +/** Writes back and invlidates a range of the data cache. + * + * @param start A pointer to the start address. + * @param length The number of bytes to write back. + */ +void +NvOsDataCacheWritebackInvalidateRange(void *start, NvU32 length); + +/** Invalidates the entire instruction cache. + */ +void +NvOsInstrCacheInvalidate(void); + +/** Invalidates a range of the instruction cache. + * + * @param start A pointer to the start address. + * @param length The number of bytes. + */ +void +NvOsInstrCacheInvalidateRange(void *start, NvU32 length); + +/** Flushes the CPU's write combine buffer. + */ +void +NvOsFlushWriteCombineBuffer(void); + +/** Interrupt handler function. + */ +typedef void (*NvOsInterruptHandler)(void *args); + +/** Interrupt handler type. + */ +typedef struct NvOsInterruptRec *NvOsInterruptHandle; + +/** + * Registers the interrupt handler with the IRQ number. + * + * @note This function is intended to @b only be called + * from NvRmInterruptRegister(). + * + * @param IrqListSize Size of the \a IrqList passed in for registering the IRQ + * handlers for each IRQ number. + * @param pIrqList Array of IRQ numbers for which interupt handlers are to be + * registerd. + * @param pIrqHandlerList A pointer to an array of interrupt routines to be + * called when an interrupt occurs. + * @param context A pointer to the register's context handle. + * @param handle A pointer to the interrupt handle. + * @param InterruptEnable If true, immediately enable interrupt. Otherwise + * enable interrupt only after calling NvOsInterruptEnable(). + * + * @retval NvError_IrqRegistrationFailed If the interrupt is already registered. + * @retval NvError_BadParameter If the IRQ number is not valid. + */ +NvError +NvOsInterruptRegister(NvU32 IrqListSize, + const NvU32 *pIrqList, + const NvOsInterruptHandler *pIrqHandlerList, + void *context, + NvOsInterruptHandle *handle, + NvBool InterruptEnable); + +/** + * Unregisters the interrupt handler from the associated IRQ number. + * + * @note This function is intended to @b only be called + * from NvRmInterruptUnregister(). + * + * @param handle interrupt Handle returned when a successfull call is made to + * NvOsInterruptRegister(). + */ +void +NvOsInterruptUnregister(NvOsInterruptHandle handle); + +/** + * Enables the interrupt handler with the IRQ number. + * + * @note This function is intended to @b only be called + * from NvOsInterruptRegister() and NvRmInterruptRegister(). + * + * @param handle Interrupt handle returned when a successfull call is made to + * \c NvOsInterruptRegister. + * + * @retval NvError_BadParameter If the handle is not valid. + * @retval NvError_InsufficientMemory If interrupt enable failed. + * @retval NvSuccess If interrupt enable is successful. + */ +NvError +NvOsInterruptEnable(NvOsInterruptHandle handle); + +/** + * Called when the ISR/IST is done handling the interrupt. + * + * @note This API should be called only from NvRmInterruptDone(). + * + * @param handle Interrupt handle returned when a successfull call is made to + * NvOsInterruptRegister(). + */ +void +NvOsInterruptDone(NvOsInterruptHandle handle); + +/** + * Mask/unmask an interrupt. + * + * Drivers can use this API to fend off interrupts. Mask means no interrupts + * are forwarded to the CPU. Unmask means, interrupts are forwarded to the + * CPU. In case of SMP systems, this API masks the interrutps to all the CPUs, + * not just the calling CPU. + * + * @param handle Interrupt handle returned by NvOsInterruptRegister(). + * @param mask NV_FALSE to forward the interrupt to CPU; NV_TRUE to + * mask the interrupts to CPU. + */ +void NvOsInterruptMask(NvOsInterruptHandle handle, NvBool mask); + +#define NVOS_MAX_PROFILE_APERTURES (4UL) + +/** + * Profile aperture sizes. + * + * Code may execute and be profiled from mutliple apertures. This will get the + * size of each aperture. The caller is expected to allocate the number of + * bytes for each aperture into a single void* array (void**), which will be + * used in NvOsProfileStart() and NvOsProfileStop(). + * + * This may be called twice, the first time to get the number of apertures + * (sizes should be null), and the second time with the sizes parameter + * non-null. Alternately, ::NVOS_MAX_PROFILE_APERTURES may be used as the + * size of the sizes array. + * + * @param apertures A pointer to the number of apertures that will be profiled. + * @param sizes A pointer to the size of each aperture. + */ +void +NvOsProfileApertureSizes( NvU32 *apertures, NvU32 *sizes ); + +/** + * Enables statistical profiling. + * + * @param apertures A pointer to an array of storage for profile data. + */ +void +NvOsProfileStart( void **apertures ); + +/** + * Stops profiling and prepares the profile samples for analysis. + * + * @param apertures A pointer to the storage for the profile samples. + */ +void +NvOsProfileStop( void **apertures ); + +/** + * Writes profile data to the given file. + * + * @post This is expected to close the file after a successful write. + * + * @param file The file to write to. + * @param index The aperture number. + * @param aperture A pointer to the storage for the profile samples. + */ +NvError +NvOsProfileWrite( NvOsFileHandle file, NvU32 index, void *aperture ); + +/** + * Sets the boot arguments from thet system's boot loader. The data may be keyed. + * + * @param key The key for the argument. + * @param arg A pointer to the argument to store. + * @param size The size of the argument in bytes. + * + * @retval NvSuccess If successful, or the appropriate error code. + */ +NvError +NvOsBootArgSet( NvU32 key, void *arg, NvU32 size ); + +/** + * Retrieves the system boot arguments. Requires the same key from + * NvOsBootArgSet(). + * + * @param key The key for the argument. + * @param arg A pointer to the argument buffer. + * @param size The size of the argument in bytes. + */ +NvError +NvOsBootArgGet( NvU32 key, void *arg, NvU32 size ); + +/* + * Tracing support. Enable with NVOS_TRACE in nvos_trace.h. + */ +#if NVOS_TRACE || NV_DEBUG + +#if NV_DEBUG +void *NvOsAllocLeak( size_t size, const char *f, int l ); +void *NvOsReallocLeak( void *ptr, size_t size, const char *f, int l ); +void NvOsFreeLeak( void *ptr, const char *f, int l ); +#endif + +static NV_INLINE void *NvOsAllocTraced(size_t size, const char *f, int l) +{ + void *ptr; + +#if NV_DEBUG + ptr = (NvOsAllocLeak)(size, f, l); +#else + ptr = (NvOsAlloc)(size); +#endif +#if NVOS_TRACE + NVOS_TRACE_LOG_PRINTF(("NvOsAlloc, %s, %d, %ums, 0x%x\n", + f, l, NvOsGetTimeMS(), (NvU32)ptr)); +#endif + + return ptr; +} + +static NV_INLINE void *NvOsReallocTraced(void *ptr, size_t size, const char *f, + int l ) +{ + void* ret; + +#if NV_DEBUG + ret = (NvOsReallocLeak)(ptr, size, f, l); +#else + ret = (NvOsRealloc)(ptr, size); +#endif +#if NVOS_TRACE + NVOS_TRACE_LOG_PRINTF(("NvOsRealloc, %s, %d, %ums, 0x%x\n", + f, l, NvOsGetTimeMS(), (NvU32)ret)); +#endif + + return ret; +} + +static NV_INLINE void NvOsFreeTraced(void *ptr, const char *f, int l ) +{ + +#if NV_DEBUG + (NvOsFreeLeak)(ptr, f, l); +#else + (NvOsFree)(ptr); +#endif +#if NVOS_TRACE + NVOS_TRACE_LOG_PRINTF(("NvOsFree, %s, %d, %ums, 0x%x\n", + f, l, NvOsGetTimeMS(), (NvU32)ptr)); +#endif +} + + +#define NvOsAlloc(size) NvOsAllocTraced(size, __FILE__, __LINE__) +#define NvOsRealloc(ptr, size) \ + NvOsReallocTraced(ptr, size, __FILE__, __LINE__) +#define NvOsFree(ptr) NvOsFreeTraced(ptr, __FILE__, __LINE__) + +#endif /* NVOS_TRACE */ + + +#if (NVOS_TRACE || NV_DEBUG) + +/** + * Sets the file and line corresponding to a resource allocation. + * Call will fill file and line for the most recently stored + * allocation location, if not already set. + * + * @param userptr A pointer to used by client to identify resource. + * Can be NULL, which leads to no-op. + * @param file A pointer to the name of the file from which allocation + * originated. Value cannot be NULL; use "" for an empty string. + * @param l The line. + */ +void NvOsSetResourceAllocFileLine(void* userptr, const char* file, int line); + +static NV_INLINE void * +NvOsExecAllocTraced(size_t size, const char *f, int l ) +{ + void* ret; + ret = (NvOsExecAlloc)(size); + NvOsSetResourceAllocFileLine(ret, f, l); + NVOS_TRACE_LOG_PRINTF(("NvOsExecAlloc, %s, %d, %ums, 0x%x\n", + f, l, NvOsGetTimeMS(), (NvU32)ret)); + return ret; +} + +static NV_INLINE void +NvOsExecFreeTraced(void *ptr, size_t size, const char *f, int l ) +{ + NVOS_TRACE_LOG_PRINTF(("NvOsExecFree, %s, %d, %ums, 0x%x\n", + f, l, NvOsGetTimeMS(), (NvU32)ptr)); + (NvOsExecFree)(ptr, size); +} + +static NV_INLINE NvError +NvOsSharedMemAllocTraced(const char *key, size_t size, + NvOsSharedMemHandle *descriptor, const char *f, int l ) +{ + NvError status; + status = (NvOsSharedMemAlloc)(key, size, descriptor); + if (status == NvSuccess) + NvOsSetResourceAllocFileLine(*descriptor, f, l); + NVOS_TRACE_LOG_PRINTF(("NvOsSharedMemAlloc, %s, %d, %ums, 0x%x\n", + f, l, NvOsGetTimeMS(), (NvU32)(*descriptor))); + return status; +} + +static NV_INLINE NvError +NvOsSharedMemMapTraced(NvOsSharedMemHandle descriptor, size_t offset, + size_t size, void **ptr, const char *f, int l ) +{ + NvError status; + status = (NvOsSharedMemMap)(descriptor, offset, size, ptr); + NVOS_TRACE_LOG_PRINTF(("NvOsSharedMemMap, %s, %d, %ums, 0x%x\n", + f, l, NvOsGetTimeMS(), (NvU32)(*ptr))); + return status; +} + +static NV_INLINE void +NvOsSharedMemUnmapTraced(void *ptr, size_t size, const char *f, int l ) +{ + NVOS_TRACE_LOG_PRINTF(("NvOsSharedMemUnmap, %s, %d, %ums, 0x%x\n", + f, l, NvOsGetTimeMS(), (NvU32)(ptr))); + (NvOsSharedMemUnmap)(ptr, size); +} + +static NV_INLINE void +NvOsSharedMemFreeTraced(NvOsSharedMemHandle descriptor, const char *f, int l ) +{ + NVOS_TRACE_LOG_PRINTF(("NvOsSharedMemFree, %s, %d, %ums, 0x%x\n", + f, l, NvOsGetTimeMS(), (NvU32)(descriptor))); + (NvOsSharedMemFree)(descriptor); +} + +static NV_INLINE NvError +NvOsPhysicalMemMapTraced(NvOsPhysAddr phys, size_t size, + NvOsMemAttribute attrib, NvU32 flags, void **ptr, const char *f, int l ) +{ + NvError status; + status = (NvOsPhysicalMemMap)(phys, size, attrib, flags, ptr); + if (status == NvSuccess) + NvOsSetResourceAllocFileLine(*ptr, f, l); + NVOS_TRACE_LOG_PRINTF(("NvOsPhysicalMemMap, %s, %d, %ums, 0x%x\n", + f, l, NvOsGetTimeMS(), (NvU32)(*ptr))); + return status; +} + +static NV_INLINE NvError +NvOsPhysicalMemMapIntoCallerTraced( void *pCallerPtr, NvOsPhysAddr phys, + size_t size, NvOsMemAttribute attrib, NvU32 flags, const char *f, int l ) +{ + NVOS_TRACE_LOG_PRINTF(("NvOsPhysicalMemMapIntoCaller, \ + %s, %d, %ums, 0x%x\n", f, l, NvOsGetTimeMS(), (NvU32)(pCallerPtr))); + return (NvOsPhysicalMemMapIntoCaller)(pCallerPtr, phys, size, attrib, + flags); +} + +static NV_INLINE void +NvOsPhysicalMemUnmapTraced(void *ptr, size_t size, const char *f, int l ) +{ + NVOS_TRACE_LOG_PRINTF(("NvOsPhysicalMemUnmap, %s, %d, %ums, 0x%x\n", + f, l, NvOsGetTimeMS(), (NvU32)(ptr))); + (NvOsPhysicalMemUnmap)(ptr, size); +} + +static NV_INLINE NvError +NvOsPageAllocTraced(size_t size, NvOsMemAttribute attrib, + NvOsPageFlags flags, NvU32 protect, NvOsPageAllocHandle *descriptor, + const char *f, int l ) +{ + NvError status; + status = (NvOsPageAlloc)(size, attrib, flags, protect, descriptor); + if (status == NvSuccess) + NvOsSetResourceAllocFileLine(*descriptor, f, l); + NVOS_TRACE_LOG_PRINTF(("NvOsPageAlloc, %s, %d, %ums, 0x%x\n", + f, l, NvOsGetTimeMS(), (NvU32)(descriptor))); + return status; +} + +static NV_INLINE NvError +NvOsPageLockTraced(void *ptr, size_t size, NvU32 protect, NvOsPageAllocHandle* descriptor, + const char *f, int l ) +{ + NvError status; + status = (NvOsPageLock)(ptr, size, protect, descriptor); + NVOS_TRACE_LOG_PRINTF(("NvOsPageLock, %s, %d, %ums, 0x%x, %d, 0x%x, 0x%x\n", + f, l, NvOsGetTimeMS(), (NvU32)(ptr), size, protect, (NvU32)*descriptor)); + return status; +} + +static NV_INLINE void +NvOsPageFreeTraced(NvOsPageAllocHandle descriptor, const char *f, int l ) +{ + NVOS_TRACE_LOG_PRINTF(("NvOsPageFree, %s, %d, %ums, 0x%x\n", + f, l, NvOsGetTimeMS(), (NvU32)(descriptor))); + (NvOsPageFree)(descriptor); +} + +static NV_INLINE NvError +NvOsPageMapTraced(NvOsPageAllocHandle descriptor, size_t offset, size_t size, + void **ptr, const char *f, int l ) +{ + NvError status; + status = (NvOsPageMap)(descriptor, offset, size, ptr); + NVOS_TRACE_LOG_PRINTF(("NvOsPageMap, %s, %d, %ums, 0x%x\n", + f, l, NvOsGetTimeMS(), (NvU32)(*ptr))); + return status; +} + +static NV_INLINE NvError +NvOsPageMapIntoPtrTraced( NvOsPageAllocHandle descriptor, void *pCallerPtr, + size_t offset, size_t size, const char *f, int l ) +{ + NvError status; + status = (NvOsPageMapIntoPtr)(descriptor, pCallerPtr, offset, size); + NVOS_TRACE_LOG_PRINTF(("NvOsPageMapIntoCaller, %s, %d, %ums, 0x%x\n", + f, l, NvOsGetTimeMS(), (NvU32)(pCallerPtr))); + return status; +} + +static NV_INLINE void +NvOsPageUnmapTraced(NvOsPageAllocHandle descriptor, void *ptr, size_t size, + const char *f, int l ) +{ + NVOS_TRACE_LOG_PRINTF(("NvOsPageUnmap, %s, %d, %ums, 0x%x\n", + f, l, NvOsGetTimeMS(), (NvU32)(ptr))); + (NvOsPageUnmap)(descriptor, ptr, size); +} + +static NV_INLINE NvOsPhysAddr +NvOsPageAddressTraced(NvOsPageAllocHandle descriptor, size_t offset, + const char *f, int l ) +{ + NvOsPhysAddr PhysAddr; + PhysAddr = (NvOsPageAddress)(descriptor, offset); + NVOS_TRACE_LOG_PRINTF(("NvOsPageAddress, %s, %d, %ums, 0x%x\n", + f, l, NvOsGetTimeMS(), (NvU32)(PhysAddr))); + return PhysAddr; +} + +static NV_INLINE NvError +NvOsMutexCreateTraced(NvOsMutexHandle *mutex, const char *f, int l ) +{ + NvError status; + status = (NvOsMutexCreate)(mutex); + if (status == NvSuccess) + NvOsSetResourceAllocFileLine(*mutex, f, l); + NVOS_TRACE_LOG_PRINTF(("NvOsMutexCreate, %s, %d, %ums, 0x%x\n", + f, l, NvOsGetTimeMS(), (NvU32)(*mutex))); + return status; +} + +static NV_INLINE void +NvOsMutexLockTraced(NvOsMutexHandle mutex, const char *f, int l ) +{ + NVOS_TRACE_LOG_PRINTF(("NvOsMutexLock, %s, %d, %ums, 0x%x\n", + f, l, NvOsGetTimeMS(), (NvU32)mutex)); + (NvOsMutexLock)(mutex); +} + +static NV_INLINE void +NvOsMutexUnlockTraced(NvOsMutexHandle mutex, const char *f, int l ) +{ + NVOS_TRACE_LOG_PRINTF(("NvOsMutexUnlock, %s, %d, %ums, 0x%x\n", + f, l, NvOsGetTimeMS(), (NvU32)mutex)); + (NvOsMutexUnlock)(mutex); +} + +static NV_INLINE void NvOsMutexDestroyTraced( + NvOsMutexHandle mutex, + const char *f, + int l ) +{ + NVOS_TRACE_LOG_PRINTF(("NvOsMutexDestroy, %s, %d, %ums, 0x%x\n", + f, l, NvOsGetTimeMS(), (NvU32)mutex)); + (NvOsMutexDestroy)(mutex); +} + +static NV_INLINE NvError +NvOsIntrMutexCreateTraced(NvOsIntrMutexHandle *mutex, const char *f, int l ) +{ + NvError status; + status = (NvOsIntrMutexCreate)(mutex); + if (status == NvSuccess) + NvOsSetResourceAllocFileLine(*mutex, f, l); + NVOS_TRACE_LOG_PRINTF(("NvOsIntrMutexCreate, %s, %d, %ums, 0x%x\n", + f, l, NvOsGetTimeMS(), (NvU32)(*mutex))); + return status; +} + +static NV_INLINE void +NvOsIntrMutexLockTraced(NvOsIntrMutexHandle mutex, const char *f, int l ) +{ + NVOS_TRACE_LOG_PRINTF(("NvOsIntrMutexLock, %s, %d, %ums, 0x%x\n", + f, l, NvOsGetTimeMS(), (NvU32)mutex)); + (NvOsIntrMutexLock)(mutex); +} + +static NV_INLINE void +NvOsIntrMutexUnlockTraced(NvOsIntrMutexHandle mutex, const char *f, int l ) +{ + NVOS_TRACE_LOG_PRINTF(("NvOsIntrMutexUnlock, %s, %d, %ums, 0x%x\n", + f, l, NvOsGetTimeMS(), (NvU32)mutex)); + (NvOsIntrMutexUnlock)(mutex); +} + +static NV_INLINE void +NvOsIntrMutexDestroyTraced(NvOsIntrMutexHandle mutex, const char *f, int l ) +{ + NVOS_TRACE_LOG_PRINTF(("NvOsIntrMutexDestroy, %s, %d, %ums, 0x%x\n", + f, l, NvOsGetTimeMS(), (NvU32)mutex)); + (NvOsIntrMutexDestroy)(mutex); +} + +static NV_INLINE NvError +NvOsSemaphoreCreateTraced( NvOsSemaphoreHandle *semaphore, NvU32 value, + const char *f, int l ) +{ + NvError status; + status = (NvOsSemaphoreCreate)(semaphore, value); + if (status == NvSuccess) + NvOsSetResourceAllocFileLine(*semaphore, f, l); + NVOS_TRACE_LOG_PRINTF(("NvOsSemaphoreCreate, %s, %d, %ums, 0x%x\n", + f, l, NvOsGetTimeMS(), (NvU32)(*semaphore))); + return status; +} + +static NV_INLINE NvError +NvOsSemaphoreCloneTraced( NvOsSemaphoreHandle orig, NvOsSemaphoreHandle *clone, + const char *f, int l ) +{ + NvError status; + status = (NvOsSemaphoreClone)(orig, clone); + if (status == NvSuccess) + NvOsSetResourceAllocFileLine(*clone, f, l); + NVOS_TRACE_LOG_PRINTF(("NvOsSemaphoreClone, %s, %d, %ums, 0x%x\n", + f, l, NvOsGetTimeMS(), (NvU32)(*clone))); + return status; +} + +static NV_INLINE NvError +NvOsSemaphoreUnmarshalTraced( NvOsSemaphoreHandle hClientSema, + NvOsSemaphoreHandle *phDriverSema, const char *f, int l ) +{ + NvError status; + status = (NvOsSemaphoreUnmarshal)(hClientSema, phDriverSema); + if (status == NvSuccess) + NvOsSetResourceAllocFileLine(*phDriverSema, f, l); + NVOS_TRACE_LOG_PRINTF(("NvOsSemaphoreUnmarshal, %s, %d, %ums, 0x%x\r\n", + f, l, NvOsGetTimeMS(), (NvU32)(hClientSema))); + return status; +} + +static NV_INLINE void +NvOsSemaphoreWaitTraced( NvOsSemaphoreHandle semaphore, const char *f, int l ) +{ + NVOS_TRACE_LOG_PRINTF(("NvOsSemaphoreWait, %s, %d, %ums, 0x%x\n", + f, l, NvOsGetTimeMS(), (NvU32)semaphore)); + (NvOsSemaphoreWait)(semaphore); +} + +static NV_INLINE NvError +NvOsSemaphoreWaitTimeoutTraced( NvOsSemaphoreHandle semaphore, NvU32 msec, + const char *f, int l ) +{ + NvError status; + NVOS_TRACE_LOG_PRINTF(("NvOsSemaphoreWaitTimeout, %s, %d, %ums, 0x%x\n", + f, l, NvOsGetTimeMS(), (NvU32)semaphore)); + status = (NvOsSemaphoreWaitTimeout)(semaphore, msec); + return status; +} + +static NV_INLINE void +NvOsSemaphoreSignalTraced( NvOsSemaphoreHandle semaphore, const char *f, int l ) +{ + NVOS_TRACE_LOG_PRINTF(("NvOsSemaphoreSignal, %s, %d, %ums, 0x%x\n", + f, l, NvOsGetTimeMS(), (NvU32)semaphore)); + (NvOsSemaphoreSignal)(semaphore); +} + +static NV_INLINE void +NvOsSemaphoreDestroyTraced( NvOsSemaphoreHandle semaphore, const char *f, int l ) +{ + NVOS_TRACE_LOG_PRINTF(("NvOsSemaphoreDestory, %s, %d, %ums, 0x%x\n", + f, l, NvOsGetTimeMS(), (NvU32)semaphore)); + (NvOsSemaphoreDestroy)(semaphore); +} + +static NV_INLINE NvError +NvOsThreadCreateTraced( NvOsThreadFunction function, void *args, + NvOsThreadHandle *thread, const char *f, int l ) +{ + NvError status; + status = (NvOsThreadCreate)(function, args, thread); + if (status == NvSuccess) + NvOsSetResourceAllocFileLine(*thread, f, l); + NVOS_TRACE_LOG_PRINTF(("NvOsThreadCreate, %s, %d, %ums, 0x%x\n", + f, l, NvOsGetTimeMS(), (NvU32)(*thread))); + return status; +} + +static NV_INLINE void +NvOsThreadJoinTraced( NvOsThreadHandle thread, const char *f, int l ) +{ + NVOS_TRACE_LOG_PRINTF(("NvOsThreadJoin, %s, %d, %ums, 0x%x\n", + f, l, NvOsGetTimeMS(), (NvU32)thread)); + (NvOsThreadJoin)(thread); +} + +static NV_INLINE void +NvOsThreadYieldTraced(const char *f, int l ) +{ + NVOS_TRACE_LOG_PRINTF(("NvOsThreadYield, %s, %d, %ums, 0x%x\n", + f, l, NvOsGetTimeMS(), (NvU32)0)); + (NvOsThreadYield)(); +} + +static NV_INLINE NvError +NvOsInterruptRegisterTraced(NvU32 IrqListSize, const NvU32 *pIrqList, + const NvOsInterruptHandler *pIrqHandlerList, void *context, + NvOsInterruptHandle *handle, NvBool InterruptEnable, const char *f, int l ) +{ + NvError status; + status = (NvOsInterruptRegister)(IrqListSize, pIrqList, pIrqHandlerList, + context, handle, InterruptEnable); + NVOS_TRACE_LOG_PRINTF(("NvOsInterruptRegister, %s, %d, %ums, 0x%x\n", + f, l, NvOsGetTimeMS(), (NvU32)(handle))); + return status; +} + +static NV_INLINE void +NvOsInterruptUnregisterTraced(NvOsInterruptHandle handle, const char *f, int l ) +{ + NVOS_TRACE_LOG_PRINTF(("NvOsInterruptUnregister, %s, %d, %ums, 0x%x\n", + f, l, NvOsGetTimeMS(), (NvU32)(handle))); + (NvOsInterruptUnregister)(handle); +} + +static NV_INLINE NvError +NvOsInterruptEnableTraced(NvOsInterruptHandle handle, const char *f, int l ) +{ + NvError status; + + status = (NvOsInterruptEnable)(handle); + NVOS_TRACE_LOG_PRINTF(("NvOsInterruptRegister, %s, %d, %ums, 0x%x\n", + f, l, NvOsGetTimeMS(), (NvU32)(handle))); + return status; +} + +static NV_INLINE void +NvOsInterruptDoneTraced(NvOsInterruptHandle handle, const char *f, int l ) +{ + NVOS_TRACE_LOG_PRINTF(("NvOsInterruptDone, %s, %d, %ums, 0x%x\n", + f, l, NvOsGetTimeMS(), (NvU32)(handle))); + (NvOsInterruptDone)(handle); +} + +#define NvOsExecAlloc(size) NvOsExecAllocTraced(size, __FILE__, __LINE__) +#define NvOsExecFree(ptr, size) \ + NvOsExecFreeTraced(ptr, size, __FILE__, __LINE__) +#define NvOsSharedMemAlloc(key, size, descriptor) \ + NvOsSharedMemAllocTraced(key, size, descriptor, __FILE__, __LINE__) +#define NvOsSharedMemMap(descriptor, offset, size, ptr) \ + NvOsSharedMemMapTraced(descriptor, offset, size, ptr, __FILE__, __LINE__) +#define NvOsSharedMemUnmap(ptr, size) \ + NvOsSharedMemUnmapTraced(ptr, size, __FILE__, __LINE__) +#define NvOsSharedMemFree(descriptor) \ + NvOsSharedMemFreeTraced(descriptor, __FILE__, __LINE__) +#define NvOsPhysicalMemMap(phys, size, attrib, flags, ptr) \ + NvOsPhysicalMemMapTraced(phys, size, attrib, flags, ptr, \ + __FILE__, __LINE__) +#define NvOsPhysicalMemMapIntoCaller(pCallerPtr, phys, size, attrib, flags) \ + NvOsPhysicalMemMapIntoCallerTraced(pCallerPtr, phys, size, attrib, flags, \ + __FILE__, __LINE__) +#define NvOsPhysicalMemUnmap(ptr, size) \ + NvOsPhysicalMemUnmapTraced(ptr, size, __FILE__, __LINE__) +#define NvOsPageAlloc(size, attrib, flags, protect, descriptor) \ + NvOsPageAllocTraced(size, attrib, flags, protect, descriptor, \ + __FILE__, __LINE__) +#define NvOsPageFree(descriptor) \ + NvOsPageFreeTraced(descriptor, __FILE__, __LINE__) +#define NvOsPageMap(descriptor, offset, size, ptr) \ + NvOsPageMapTraced(descriptor, offset, size, ptr, __FILE__, __LINE__) +#define NvOsPageMapIntoPtr(descriptor, pCallerPtr, offset, size) \ + NvOsPageMapIntoPtrTraced(descriptor, pCallerPtr, offset, size, \ + __FILE__, __LINE__) +#define NvOsPageUnmap(descriptor, ptr, size) \ + NvOsPageUnmapTraced(descriptor, ptr, size, __FILE__, __LINE__) +#define NvOsPageAddress(descriptor, offset) \ + NvOsPageAddressTraced(descriptor, offset, __FILE__, __LINE__) +#define NvOsMutexCreate(mutex) NvOsMutexCreateTraced(mutex, __FILE__, __LINE__) +#define NvOsMutexLock(mutex) NvOsMutexLockTraced(mutex, __FILE__, __LINE__) +#define NvOsMutexUnlock(mutex) NvOsMutexUnlockTraced(mutex, __FILE__, __LINE__) +#define NvOsMutexDestroy(mutex) \ + NvOsMutexDestroyTraced(mutex, __FILE__, __LINE__) +#define NvOsIntrMutexCreate(mutex) \ + NvOsIntrMutexCreateTraced(mutex, __FILE__, __LINE__) +#define NvOsIntrMutexLock(mutex) \ + NvOsIntrMutexLockTraced(mutex, __FILE__, __LINE__) +#define NvOsIntrMutexUnlock(mutex) \ + NvOsIntrMutexUnlockTraced(mutex, __FILE__, __LINE__) +#define NvOsIntrMutexDestroy(mutex) \ + NvOsIntrMutexDestroyTraced(mutex, __FILE__, __LINE__) +#define NvOsSemaphoreCreate(semaphore, value) \ + NvOsSemaphoreCreateTraced(semaphore, value, __FILE__, __LINE__) +#define NvOsSemaphoreClone(orig, semaphore) \ + NvOsSemaphoreCloneTraced(orig, semaphore, __FILE__, __LINE__) +#define NvOsSemaphoreUnmarshal(hClientSema, phDriverSema) \ + NvOsSemaphoreUnmarshalTraced(hClientSema, phDriverSema, __FILE__, __LINE__) +/* +#define NvOsSemaphoreWait(semaphore) \ + NvOsSemaphoreWaitTraced(semaphore, __FILE__, __LINE__) +#define NvOsSemaphoreWaitTimeout(semaphore, msec) \ + NvOsSemaphoreWaitTimeoutTraced(semaphore, msec, __FILE__, __LINE__) +*/ +#define NvOsSemaphoreSignal(semaphore) \ + NvOsSemaphoreSignalTraced(semaphore, __FILE__, __LINE__) +#define NvOsSemaphoreDestroy(semaphore) \ + NvOsSemaphoreDestroyTraced(semaphore, __FILE__, __LINE__) +#define NvOsThreadCreate(func, args, thread) \ + NvOsThreadCreateTraced(func, args, thread, __FILE__, __LINE__) +#define NvOsThreadJoin(thread) \ + NvOsThreadJoinTraced(thread, __FILE__, __LINE__) +#define NvOsThreadYield() NvOsThreadYieldTraced(__FILE__, __LINE__) +#define NvOsInterruptRegister(IrqListSize, pIrqList, pIrqHandlerList, \ + context, handle, InterruptEnable) \ + NvOsInterruptRegisterTraced(IrqListSize, pIrqList, pIrqHandlerList, \ + context, handle, InterruptEnable, __FILE__, __LINE__) +#define NvOsInterruptUnregister(handle) \ + NvOsInterruptUnregisterTraced(handle, __FILE__, __LINE__) +#define NvOsInterruptEnable(handle) \ + NvOsInterruptEnableTraced(handle, __FILE__, __LINE__) +#define NvOsInterruptDone(handle) \ + NvOsInterruptDoneTraced(handle, __FILE__, __LINE__) + +#endif // NVOS_TRACE + +// Forward declare resource tracking struct. +typedef struct NvCallstackRec NvCallstack; + +typedef enum +{ + NvOsCallstackType_NoStack = 1, + NvOsCallstackType_HexStack, + NvOsCallstackType_SymbolStack, + + NvOsCallstackType_Last, + NvOsCallstackType_Force32 = 0x7FFFFFFF +} NvOsCallstackType; + +typedef void (*NvOsDumpCallback)(void* context, const char* line); + +void NvOsDumpToDebugPrintf(void* context, const char* line); +void NvOsGetProcessInfo(char* buf, NvU32 len); + +/* implemented by the OS-backend, for now CE and Linux only */ +#if (NVOS_IS_WINDOWS_CE || NVOS_IS_LINUX) +NvCallstack* NvOsCreateCallstack (NvOsCallstackType stackType); +void NvOsGetStackFrame (char* buf, NvU32 len, NvCallstack* stack, NvU32 level); +void NvOsDestroyCallstack (NvCallstack* callstack); +NvU32 NvOsHashCallstack (NvCallstack* stack); +void NvOsDumpCallstack (NvCallstack* stack, NvU32 skip, NvOsDumpCallback callBack, void* context); +NvBool NvOsCallstackContainsPid (NvCallstack* stack, NvU32 pid); +NvU32 NvOsCallstackGetNumLevels(NvCallstack* stack); +#else // (NVOS_IS_WINDOWS_CE || NVOS_IS_LINUX) +static NV_INLINE NvCallstack* NvOsCreateCallstack (NvOsCallstackType stackType) { return NULL; } +static NV_INLINE void NvOsGetStackFrame (char* buf, NvU32 len, NvCallstack* stack, NvU32 level) { NvOsStrncpy(buf, "<stack>", len); } +static NV_INLINE void NvOsDestroyCallstack (NvCallstack* callstack) { } +static NV_INLINE NvU32 NvOsHashCallstack (NvCallstack* stack) { return 0; } +static NV_INLINE void NvOsDumpCallstack (NvCallstack* stack, NvU32 skip, NvOsDumpCallback callBack, void* context) { } +static NvBool NV_INLINE NvOsCallstackContainsPid (NvCallstack* stack, NvU32 pid) { return NV_FALSE; } +static NV_INLINE NvU32 NvOsCallstackGetNumLevels (NvCallstack* stack) { return 0; } +#endif // (NVOS_IS_WINDOWS_CE || NVOS_IS_LINUX) + +/*@}*/ +/** @} */ + +#if defined(__cplusplus) +} +#endif + +#endif // INCLUDED_NVOS_H |