You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
163 lines
5.8 KiB
163 lines
5.8 KiB
/******************************Module*Header**********************************\
|
|
*
|
|
* *****************
|
|
* * SAMPLE CODE *
|
|
* *****************
|
|
*
|
|
* Module Name: mini.h
|
|
*
|
|
* Content: structures and constants for communication with minidriver
|
|
*
|
|
* Copyright (c) 1994-1998 3Dlabs Inc. Ltd. All rights reserved.
|
|
* Copyright (c) 1995-1999 Microsoft Corporation. All rights reserved.
|
|
\*****************************************************************************/
|
|
|
|
#ifndef _MINI_H_
|
|
#define _MINI_H_
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
// structures used in IOCTL calls to miniport
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
typedef struct tagLINE_DMA_BUFFER { //
|
|
LARGE_INTEGER physAddr; // physical address of DMA buffer
|
|
PVOID virtAddr; // mapped virtual address
|
|
ULONG size; // size in bytes
|
|
BOOLEAN cacheEnabled; // Whether buffer is cached
|
|
} LINE_DMA_BUFFER, *PLINE_DMA_BUFFER;
|
|
|
|
typedef struct tagEMULATED_DMA_BUFFER { //
|
|
PVOID virtAddr; // virtual address
|
|
ULONG size; // size in bytes
|
|
ULONG tag; // allocation tag
|
|
} EMULATED_DMA_BUFFER, *PEMULATED_DMA_BUFFER;
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
// shared structures used display driver and miniport
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
#define P2_ICB_MAGICNUMBER 0xbadabe01
|
|
|
|
typedef struct tagINTERRUPT_CONTROL_BLOCK {
|
|
|
|
ULONG ulMagicNo;
|
|
|
|
volatile ULONG ulControl;
|
|
volatile ULONG ulIRQCounter;
|
|
|
|
LARGE_INTEGER liDMAPhysAddr; // physical start address of DMA buffer
|
|
ULONG *pDMABufferStart; // virtual buffer start
|
|
ULONG *pDMABufferEnd; // virtual buffer end
|
|
volatile ULONG *pDMAActualBufferEnd; // virtual actual buffer end
|
|
volatile ULONG *pDMAWriteEnd; // end for next write operation
|
|
volatile ULONG *pDMAPrevStart; // previous start address of a DMA
|
|
volatile ULONG *pDMANextStart; // next start address of a DMA
|
|
volatile ULONG *pDMAWritePos; // current write pointer
|
|
|
|
// these flags lock the miniport interrupts and the display driver access
|
|
// to these data structures. Use InterlockedExchange to lock to make
|
|
// sure it works on multiprocessing environments
|
|
volatile ULONG ulICBLock; // this lock is set by the display driver
|
|
|
|
volatile ULONG ulVSIRQCounter; // VS IRQ Counter (if enabled)
|
|
|
|
volatile ULONG ulLastErrorFlags; // miniport saves value of last Error Interrupt
|
|
volatile ULONG ulErrorCounter; // counter for number of errors
|
|
|
|
// the following variables are only used in the display driver
|
|
|
|
|
|
|
|
}INTERRUPT_CONTROL_BLOCK, *PINTERRUPT_CONTROL_BLOCK;
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
// interrupt status bits set by minidriver IRQ service routine
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
enum {
|
|
DMA_IRQ_AVAILABLE = 0x01, // can use DMA interrupts
|
|
VBLANK_IRQ_AVAILABLE = 0x02, // can use VBLANK interrupts
|
|
};
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
// IOCTL codes for minidriver calls
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
#define IOCTL_VIDEO_QUERY_DEVICE_INFO \
|
|
CTL_CODE(FILE_DEVICE_VIDEO, 0x3DD2, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
|
|
|
#define IOCTL_VIDEO_MAP_INTERRUPT_CMD_BUF \
|
|
CTL_CODE(FILE_DEVICE_VIDEO, 0x3DD3, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
|
|
|
#define IOCTL_VIDEO_STALL_EXECUTION \
|
|
CTL_CODE(FILE_DEVICE_VIDEO, 0x3DD4, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
|
|
|
#define IOCTL_VIDEO_QUERY_REGISTRY_DWORD \
|
|
CTL_CODE(FILE_DEVICE_VIDEO, 0x3DD5, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
|
|
|
#define IOCTL_VIDEO_QUERY_INTERLOCKEDEXCHANGE \
|
|
CTL_CODE(FILE_DEVICE_VIDEO, 0x3DD6, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
|
|
|
#define IOCTL_VIDEO_REG_SAVE_GAMMA_LUT \
|
|
CTL_CODE(FILE_DEVICE_VIDEO, 0x3DD7, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
|
|
|
#define IOCTL_VIDEO_REG_RETRIEVE_GAMMA_LUT \
|
|
CTL_CODE(FILE_DEVICE_VIDEO, 0x3DD8, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
|
|
|
#define IOCTL_VIDEO_QUERY_LINE_DMA_BUFFER \
|
|
CTL_CODE(FILE_DEVICE_VIDEO, 0x3DD9, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
|
|
|
#define IOCTL_VIDEO_GET_LUT_REGISTERS \
|
|
CTL_CODE(FILE_DEVICE_VIDEO, 0x3DDB, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
|
|
|
#define IOCTL_VIDEO_SET_LUT_REGISTERS \
|
|
CTL_CODE(FILE_DEVICE_VIDEO, 0x3DDC, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
|
|
|
#define IOCTL_VIDEO_SET_SAME_VIDEO_MODE \
|
|
CTL_CODE(FILE_DEVICE_VIDEO, 0x3DDD, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
|
|
|
#define IOCTL_VIDEO_QUERY_EMULATED_DMA_BUFFER \
|
|
CTL_CODE(FILE_DEVICE_VIDEO, 0x3DDE, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
// functions provided by minidriver
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
BOOL
|
|
AllocateDMABuffer( HANDLE hDriver,
|
|
PLONG plSize,
|
|
PULONG *ppVirtAddr,
|
|
LARGE_INTEGER *pPhysAddr);
|
|
|
|
BOOL
|
|
FreeDMABuffer( HANDLE hDriver, PVOID pVirtAddr);
|
|
|
|
PULONG
|
|
AllocateEmulatedDMABuffer(
|
|
HANDLE hDriver,
|
|
ULONG ulSize,
|
|
ULONG ulTag
|
|
);
|
|
BOOL
|
|
FreeEmulatedDMABuffer(
|
|
HANDLE hDriver,
|
|
PVOID pVirtAddr
|
|
);
|
|
|
|
VOID
|
|
StallExecution( HANDLE hDriver, ULONG ulMicroSeconds);
|
|
#if defined(_X86_)
|
|
PVOID
|
|
GetPInterlockedExchange( HANDLE hDriver);
|
|
#endif
|
|
#endif
|