summaryrefslogtreecommitdiff
path: root/arch/arm/mach-tegra/nv/include/nvos.h
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-tegra/nv/include/nvos.h')
-rw-r--r--arch/arm/mach-tegra/nv/include/nvos.h2399
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