228 lines
7.5 KiB
C
228 lines
7.5 KiB
C
/***************************************************************************\
|
|
|* *|
|
|
|* Copyright 1993-1998 NVIDIA, Corporation. All rights reserved. *|
|
|
|* *|
|
|
|* NOTICE TO USER: The source code is copyrighted under U.S. and *|
|
|
|* international laws. NVIDIA, Corp. of Sunnyvale, California owns *|
|
|
|* copyrights, patents, and has design patents pending on the design *|
|
|
|* and interface of the NV chips. Users and possessors of this *|
|
|
|* source code are hereby granted a nonexclusive, royalty-free copy- *|
|
|
|* right and design patent license to use this code in individual *|
|
|
|* and commercial software. *|
|
|
|* *|
|
|
|* Any use of this source code must include, in the user documenta- *|
|
|
|* tion and internal comments to the code, notices to the end user *|
|
|
|* as follows: *|
|
|
|* *|
|
|
|* Copyright 1993-1998 NVIDIA, Corporation. NVIDIA has design *|
|
|
|* patents and patents pending in the U.S. and foreign countries. *|
|
|
|* *|
|
|
|* NVIDIA, CORPORATION MAKES NO REPRESENTATION ABOUT THE SUITABILITY *|
|
|
|* OF THIS SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITH- *|
|
|
|* OUT EXPRESS OR IMPLIED WARRANTY OF ANY KIND. NVIDIA, CORPORATION *|
|
|
|* DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOURCE CODE, INCLUD- *|
|
|
|* ING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *|
|
|
|* PARTICULAR PURPOSE. IN NO EVENT SHALL NVIDIA, CORPORATION BE *|
|
|
|* LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL *|
|
|
|* DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, *|
|
|
|* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR *|
|
|
|* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE *|
|
|
|* USE OR PERFORMANCE OF THIS SOURCE CODE. *|
|
|
|* *|
|
|
|* RESTRICTED RIGHTS LEGEND: Use, duplication, or disclosure by the *|
|
|
|* Government is subject to restrictions as set forth in subpara- *|
|
|
|* graph (c) (1) (ii) of the Rights in Technical Data and Computer *|
|
|
|* Software clause at DFARS 52.227-7013 and in similar clauses in *|
|
|
|* the FAR and NASA FAR Supplement. *|
|
|
|* *|
|
|
\***************************************************************************/
|
|
|
|
/*
|
|
* nvARmApi.h
|
|
*
|
|
* NVidia resource manager API header file exported to drivers. (as of now, only
|
|
* the audio drivers use it.
|
|
*
|
|
*/
|
|
|
|
#if !defined _NVARMAPIH_
|
|
#define _NVARMAPIH_
|
|
|
|
#if defined __cplusplus
|
|
extern "C" {
|
|
#endif //__cplusplus
|
|
|
|
#include <nvos.h>
|
|
|
|
|
|
// exported functions - OS independent to get to the core
|
|
|
|
// to be called before anything can be done with the RM
|
|
NvU32 NVARM_LoadCore(NvU32 *pDeviceHandle);
|
|
void NVARM_UnloadCore(NvU32 uDeviceHandle);
|
|
|
|
NvU32 NVARM_Alloc(NvU32 uDeviceHandle, NVOS21_PARAMETERS *pIn);
|
|
NvU32 NVARM_Free(NvU32 uDeviceHandle, NV_UNIFIED_FREE *pIn);
|
|
|
|
|
|
#if defined WIN9XVXD // change this to whatever the macro is
|
|
|
|
// some imports from resman files... wonder why it's not in common
|
|
|
|
// this structure is exactly the same as NV_IOCTL_ARCH_STRUCT,
|
|
// name's changed to prevent redfinition.
|
|
typedef struct
|
|
{
|
|
NvU32 nvarchFunction;
|
|
NvU32 nvarchParameters;
|
|
} NVA_IOCTL_ARCH_STRUCT;
|
|
|
|
#if !defined NVRM_IOCTL_NV_ARCH
|
|
#define NVRM_IOCTL_NV_ARCH 21
|
|
#endif
|
|
|
|
#define AVxDCall(service) \
|
|
_asm _emit 0xcd \
|
|
_asm _emit 0x20 \
|
|
_asm _emit (service & 0xff) \
|
|
_asm _emit (service >> 8) & 0xff \
|
|
_asm _emit (service >> 16) & 0xff \
|
|
_asm _emit (service >> 24) & 0xff \
|
|
|
|
NvU32 static __inline
|
|
IOCTLCall(NvU32 pDevInfoParam, DIOCPARAMETERS *pParams)
|
|
{
|
|
NvU32 dw;
|
|
struct DeviceInfo *pDevInfo;
|
|
struct VxD_Desc_Block *pDDB;
|
|
|
|
pDevInfo = (struct DeviceInfo *)pDevInfoParam;
|
|
pDDB = (struct VxD_Desc_Block *)pDevInfo->DI_DDB;
|
|
|
|
// W32_DEVICEIOCONTROL = 0x23
|
|
_asm mov eax, 0x23
|
|
_asm mov ecx, pDDB
|
|
_asm mov esi, pParams
|
|
AVxDCall(0x00010147); // Directed_Sys_Control
|
|
_asm mov dw, eax
|
|
return(dw);
|
|
}
|
|
|
|
inline NvU32
|
|
NVARM_LoadCore(NvU32 *ppDevInfo)
|
|
{
|
|
NvU32 dlResult;
|
|
NvU8 *pName = (NvU8*)VXDLDR_NVA_RESMAN_VXD_NAME;
|
|
struct DeviceInfo *pDevInfo;
|
|
|
|
_asm mov edx, pName
|
|
_asm mov eax, 1
|
|
AVxDCall(0x00270001); // VXDLDR_LoadDevice
|
|
_asm mov dlResult, eax
|
|
_asm jc LoadDeviceError
|
|
// DDB returned in eax
|
|
_asm mov pDevInfo, edx
|
|
|
|
*ppDevInfo = (NvU32)pDevInfo;
|
|
dlResult = 0;
|
|
|
|
LoadDeviceError:
|
|
return (dlResult);
|
|
}
|
|
|
|
inline VOID
|
|
NVARM_UnloadCore(NvU32 pDevInfoParam)
|
|
{
|
|
struct DeviceInfo *pDevInfo;
|
|
|
|
pDevInfo = (struct DeviceInfo *)pDevInfoParam;
|
|
|
|
NvU8 *pName = (NvU8 *)pDevInfo->DI_ModuleName;
|
|
NvU32 deviceID = pDevInfo->DI_DeviceID;
|
|
|
|
_asm mov ebx, deviceID
|
|
_asm mov edx, pName
|
|
AVxDCall(0x00270002); // VXDLDR_UnloadDevice
|
|
}
|
|
|
|
inline NvU32
|
|
NVARM_Alloc(NvU32 pDevInfo, NVOS21_PARAMETERS *pIn)
|
|
{
|
|
DIOCPARAMETERS ioctlParams;
|
|
NVA_IOCTL_ARCH_STRUCT params;
|
|
|
|
params.nvarchFunction = NV04_ALLOC;
|
|
params.nvarchParameters = (NvU32)pIn;
|
|
|
|
ioctlParams.dwIoControlCode = NVRM_IOCTL_NV_ARCH;
|
|
ioctlParams.lpvInBuffer = (NvU32)¶ms;
|
|
ioctlParams.cbInBuffer = sizeof(NVA_IOCTL_ARCH_STRUCT);
|
|
ioctlParams.lpvOutBuffer = NULL;
|
|
ioctlParams.cbOutBuffer = 0;
|
|
|
|
return IOCTLCall(pDevInfo, &ioctlParams);
|
|
}
|
|
|
|
inline NvU32
|
|
NVARM_Free(NvU32 pDevInfo, NV_UNIFIED_FREE *pIn)
|
|
{
|
|
DIOCPARAMETERS ioctlParams;
|
|
NVA_IOCTL_ARCH_STRUCT params;
|
|
|
|
params.nvarchFunction = NV04_UNIFIED_FREE;
|
|
params.nvarchParameters = (NvU32)pIn;
|
|
|
|
ioctlParams.dwIoControlCode = NVRM_IOCTL_NV_ARCH;
|
|
ioctlParams.lpvInBuffer = (NvU32)¶ms;
|
|
ioctlParams.cbInBuffer = sizeof(NVA_IOCTL_ARCH_STRUCT);
|
|
ioctlParams.lpvOutBuffer = NULL;
|
|
ioctlParams.cbOutBuffer = 0;
|
|
|
|
return IOCTLCall(pDevInfo, &ioctlParams);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
#if defined WDM
|
|
|
|
// list of imported functions from the resource manager
|
|
// the user still needs to link to the .lib
|
|
|
|
__declspec(dllimport) NvU32 rmAuDispatch(U032 uFunction, PVOID pIn);
|
|
|
|
inline NvU32
|
|
NVARM_LoadCore(NvU32 *ppDevInfo)
|
|
{
|
|
// nothing to do really - except maybe load the driver??
|
|
|
|
// I was returning '0', but the client thinks '0' is an invalid value
|
|
*ppDevInfo = 0xF;
|
|
return 0;
|
|
}
|
|
|
|
inline VOID
|
|
NVARM_UnloadCore(NvU32 pDevInfoParam)
|
|
{
|
|
return;
|
|
}
|
|
|
|
inline NvU32
|
|
NVARM_Alloc(NvU32 pDevInfo, NVOS21_PARAMETERS *pIn)
|
|
{
|
|
return rmAuDispatch(NV04_ALLOC, (VOID *)pIn);
|
|
}
|
|
|
|
inline NvU32
|
|
NVARM_Free(NvU32 pDevInfo, NV_UNIFIED_FREE *pIn)
|
|
{
|
|
return rmAuDispatch(NV04_UNIFIED_FREE, (VOID *)pIn);
|
|
}
|
|
|
|
#endif // WDM
|
|
|
|
#if defined __cplusplus
|
|
}
|
|
#endif //__cplusplus
|
|
|
|
#endif // _NVARMAPIH_
|