| Index: arch/arm/mach-tegra/nv/include/nvos.h
|
| 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 0000000000000000000000000000000000000000..9f05fcd905d13c914551d8dec5937819e67525e2
|
| --- /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
|
|
|