windows-nt/Source/XPSP1/NT/drivers/ddk/wdmaudio/ac97/driver/ichwave.h
2020-09-26 16:20:57 +08:00

240 lines
8.3 KiB
C++

/********************************************************************************
** Copyright (c) 1998-2000 Microsoft Corporation. All Rights Reserved.
**
** Portions Copyright (c) 1998-1999 Intel Corporation
**
********************************************************************************/
#ifndef _ICHWAVE_H_
#define _ICHWAVE_H_
#include "shared.h"
//*****************************************************************************
// Defines
//*****************************************************************************
//
// The scatter gather can (only) handle 32 entries
//
const int MAX_BDL_ENTRIES = 32;
//
// Mask for accessing the scatter gather entries with a counter.
//
const int BDL_MASK = 31;
//
// These are the differnet DMA engine states. The HW can only be in two states
// (on or off) but there are also 2 transition states.
// From DMA_ENGINE_RESET a failed start transitions to DMA_ENGINE_NEED_START, a
// successful start transitions to DMA_ENGINE_ON. From DMA_ENGINE_NEED_START a
// successful restart transitions to DMA_ENGINE_ON, a pause or stop transitions
// to DMA_ENGINE_RESET. From DMA_ENGINE_ON a pause or stop transitions to
// DMA_ENGINE_OFF. From DMA_ENGINE_OFF a start transitions to DMA_ENGINE_ON,
// a reset would transitions to DMA_ENGINE_RESET.
//
const int DMA_ENGINE_OFF = 0;
const int DMA_ENGINE_ON = 1;
const int DMA_ENGINE_RESET = 2;
const int DMA_ENGINE_NEED_START = 3; // DMA_ENGINE_RESET | DMA_ENGINE_ON
//*****************************************************************************
// Data Structures and Typedefs
//*****************************************************************************
//
// This is a description of one mapping entry. It contains information
// about the buffer and a tag which is used for "cancel mappings".
// For one mapping that is described here, there is an entry in the
// scatter gather engine.
//
typedef struct tagMapData
{
ULONG ulTag; //tag, a simple counter.
PHYSICAL_ADDRESS PhysAddr; //phys. addr. of buffer
PVOID pVirtAddr; //virt. addr. of buffer
ULONG ulBufferLength; //buffer length
} tMapData;
//
// Structure to describe the ICH Buffer Descriptor List (BDL).
// The ICH can handle 32 entries, they are allocated at once in common
// memory (non-cached memory). To avoid slow-down of CPU, the additional
// information for handling this structure is stored in tBDList.
//
typedef struct tagBDEntry
{
DWORD dwPtrToPhyAddress;
WORD wLength;
WORD wPolicyBits;
} tBDEntry;
//
// Structure needed to keep track of the BDL tables.
// This structure is seperated from tBDEntry because we want to
// have it in cached memory (and not along with tBDEntry in non-
// cached memory).
//
typedef struct tagBDList
{
PHYSICAL_ADDRESS PhysAddr; // Physical address of BDList
volatile tBDEntry *pBDEntry; // Virtual Address of BDList
tBDEntry *pBDEntryBackup;// needed for rearranging the BDList
tMapData *pMapData; // mapping list
tMapData *pMapDataBackup;// needed for rearranging the BDList
int nHead; // index for the BDL Head
int nTail; // index for the BDL Tail
ULONG ulTagCounter; // the tag is a simple counter.
int nBDEntries; // number of entries.
} tBDList;
//*****************************************************************************
// Classes
//*****************************************************************************
/*****************************************************************************
* CMiniportWaveICHStream
*****************************************************************************
* ICH wave miniport stream.
*/
class CMiniportWaveICHStream : public IMiniportWavePciStream,
public IDrmAudioStream,
public CUnknown
{
private:
//
// CMiniportWaveICHStream private variables
//
CMiniportWaveICH * Wave; // Miniport Object
ULONG Channel; // channel this stream handles.
BOOL Capture; // TRUE=Capture,FALSE=Render
ULONG CurrentRate; // Current Sample Rate
WORD NumberOfChannels; // Number of channels
PSERVICEGROUP ServiceGroup; // service group helps with DPCs
tBDList stBDList; // needed for scatter gather org.
PPORTWAVEPCISTREAM PortStream; // Port Stream Interface
PKSDATAFORMAT_WAVEFORMATEX DataFormat; // Data Format
KSPIN_LOCK MapLock; // for processing mappings.
ULONG m_ulBDAddr; // Offset of the stream's DMA registers.
ULONG DMAEngineState; // DMA engine state (STOP, PAUSE, RUN)
ULONGLONG TotalBytesMapped; // factor in position calculation
ULONGLONG TotalBytesReleased; // factor in position calculation
DEVICE_POWER_STATE m_PowerState; // Current power state of the device.
/*************************************************************************
* CMiniportWaveICHStream methods
*************************************************************************
*
* These are private member functions used internally by the object. See
* ICHWAVE.CPP for specific descriptions.
*/
//
// Moves the BDL and associated mappings list around.
//
void MoveBDList
(
IN int nFirst,
IN int nLast,
IN int nNewPos
);
//
// Called when new mappings have to be processed.
//
NTSTATUS GetNewMappings (void);
//
// Called when we want to release some mappings.
//
NTSTATUS ReleaseUsedMappings (void);
//
// DMA start/stop/pause/reset routines.
//
NTSTATUS ResetDMA (void);
NTSTATUS PauseDMA (void);
NTSTATUS ResumeDMA (void);
public:
/*************************************************************************
* The following two macros are from STDUNK.H. DECLARE_STD_UNKNOWN()
* defines inline IUnknown implementations that use CUnknown's aggregation
* support. NonDelegatingQueryInterface() is declared, but it cannot be
* implemented generically. Its definition appears in ICHWAVE.CPP.
* DEFINE_STD_CONSTRUCTOR() defines inline a constructor which accepts
* only the outer unknown, which is used for aggregation. The standard
* create macro (in ICHWAVE.CPP) uses this constructor.
*/
DECLARE_STD_UNKNOWN ();
DEFINE_STD_CONSTRUCTOR (CMiniportWaveICHStream);
~CMiniportWaveICHStream ();
/*************************************************************************
* Include IMiniportWavePciStream (public/exported) methods.
*************************************************************************
*/
IMP_IMiniportWavePciStream;
/*************************************************************************
* Include IDrmAudioStream (public/exported) methods.
*************************************************************************
*/
IMP_IDrmAudioStream;
/*************************************************************************
* CMiniportWaveICHStream methods
*************************************************************************
*/
//
// Initializes the Stream object.
//
NTSTATUS Init
(
IN CMiniportWaveICH *Miniport_,
IN PPORTWAVEPCISTREAM PortStream,
IN ULONG Channel,
IN BOOLEAN Capture,
IN PKSDATAFORMAT DataFormat,
OUT PSERVICEGROUP * ServiceGroup
);
//
// This method is called when the device changes power states.
//
NTSTATUS PowerChangeNotify
(
IN POWER_STATE NewState
);
//
// Return the current sample rate.
//
ULONG GetCurrentSampleRate (void)
{
return CurrentRate;
}
//
// Friends
//
friend
NTSTATUS CMiniportWaveICH::InterruptServiceRoutine
(
IN PINTERRUPTSYNC InterruptSync,
IN PVOID StaticContext
);
};
#endif