windows-nt/Source/XPSP1/NT/drivers/wdm/dvd/mini/tecra/wdmbuff.cpp
2020-09-26 16:20:57 +08:00

218 lines
4.8 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//**************************************************************************
//
// Title : WDMBuff.cpp
//
// Date : 1997.12.08 1st making
//
// Author : Toshiba [PCS](PSY) Hideki Yagi
//
// Copyright 1997 Toshiba Corporation. All Rights Reserved.
//
// -------------------------------------------------------------------------
//
// Change log :
//
// Date Revision Description
// ------------ ---------- -----------------------------------------------
// 1997.12.08 000.0000 1st making.
//
//**************************************************************************
#include "includes.h"
#include "wdmbuff.h"
#include "dvdinit.h"
CWDMBuffer::CWDMBuffer( void )
{
m_pSrb = NULL;
m_WDMBuffNext = NULL;
#ifndef REARRANGEMENT
m_EndFlag = TRUE; //TRUE:last buffer FALSE:non last buffer
m_BuffNumber = 0;
m_StartPacketNumber = 0;
m_PacketNum = 0;
m_BeforePacketNum = 0;
m_Enable = FALSE;
#endif REARRANGEMENT
}
CWDMBuffer::~CWDMBuffer( void )
{
m_pSrb = NULL;
m_WDMBuffNext = NULL;
#ifndef REARRANGEMENT
//ljÁ•ª•Ï<E280A2>Ì<E2809A>‰Šú‰»
m_EndFlag = TRUE;
m_BuffNumber = 0;
m_StartPacketNumber = 0;
m_PacketNum = 0;
m_BeforePacketNum = 0;
m_Enable = FALSE;
#endif REARRANGEMENT
}
IMBoardListItem *CWDMBuffer::GetNext( void )
{
return( m_WDMBuffNext );
}
void CWDMBuffer::SetNext( IMBoardListItem *item )
{
m_WDMBuffNext = item;
}
DWORD CWDMBuffer::GetPageNum( void )
{
ASSERT( m_pSrb != NULL );
#ifndef REARRANGEMENT
return ((DWORD) m_PacketNum);
#else
return( (DWORD)(m_pSrb->NumberOfPhysicalPages) ); // Is it OK??????
#endif REARRANGEMENT
// return( (DWORD)(m_pSrb->NumberOfBuffers) ); // Is it OK??????
}
DWORD CWDMBuffer::GetPageSize( DWORD pagenum )
{
ULONG PageSize;
// DWORD i, j;
// PKSSTREAM_HEADER pStruc;
ASSERT( m_pSrb != NULL );
#ifndef REARRANGEMENT
ASSERT( m_PacketNum >= pagenum );
#else
ASSERT( m_pSrb->NumberOfPhysicalPages >= pagenum );
#endif REARRANGEMENT
ASSERT( pagenum != 0 );
#ifndef REARRANGEMENT
PageSize = m_pSrb->ScatterGatherBuffer[m_BeforePacketNum + pagenum - 1].Length;
#else
PageSize = m_pSrb->ScatterGatherBuffer[pagenum-1].Length;
#endif REARRANGEMENT
// DBG_PRINTF( ("WDMBUFF: PageSzie = 0x%0x\n\r", PageSize ) );
/*
j = 0;
for( i=0; i<(m_pSrb->NumberOfBuffers); i++ ){
pStruc = &((PKSSTREAM_HEADER)(m_pSrb->CommandData.DataBufferArray))[i];
if( pStruc->DataUsed != 0 ){
if( !(pStruc->OptionsFlags & KSSTREAM_HEADER_OPTIONSF_TYPECHANGED ) ){
// DVD valid data to transfer to decoder board.
PageSize = m_pSrb->ScatterGatherBuffer[j].Length;
j++;
}
if( j>=pagenum )
break;
}
}
*/
ASSERT( (PageSize % 2048) == 0 );
return( (DWORD)PageSize );
}
BOOL CWDMBuffer::GetPagePointer( DWORD pagenum, DWORD *LinAddr, DWORD *PhysAddr )
{
PHYSICAL_ADDRESS pAdd;
DWORD i, j;
PKSSTREAM_HEADER pStruc;
ASSERT( m_pSrb != NULL );
#ifndef REARRANGEMENT
ASSERT( m_PacketNum >= pagenum );
#else
ASSERT( m_pSrb->NumberOfPhysicalPages >= pagenum );
#endif REARRANGEMENT
ASSERT( pagenum != 0 );
#ifndef REARRANGEMENT
pAdd = m_pSrb->ScatterGatherBuffer[m_BeforePacketNum + pagenum - 1].PhysicalAddress;
#else
pAdd = m_pSrb->ScatterGatherBuffer[pagenum-1].PhysicalAddress;
#endif REARRANGEMENT
*PhysAddr = (DWORD)(pAdd.LowPart);
*LinAddr = (DWORD)0;
// Linear address is validate?
j = 0;
for( i=0; i<(m_pSrb->NumberOfBuffers); i++ ){
pStruc = &((PKSSTREAM_HEADER)(m_pSrb->CommandData.DataBufferArray))[i];
ASSERT( pStruc != NULL );
if( pStruc->DataUsed != 0 ){
if( !(pStruc->OptionsFlags & KSSTREAM_HEADER_OPTIONSF_TYPECHANGED) )
{
// DVD valid data to transfer to decoder board.
*LinAddr = (DWORD)(pStruc->Data);
j++;
}
if( j>=pagenum )
break;
}
}
ASSERT( j != 0 );
ASSERT( *LinAddr != 0 );
return( TRUE );
}
DWORD CWDMBuffer::GetBufferFlag( void )
{
return( (DWORD)0 );
// return( (DWORD)m_pSrb->Flags );
}
BOOL CWDMBuffer::SetSRB( PHW_STREAM_REQUEST_BLOCK pSrb )
{
ASSERT( pSrb != NULL );
if( pSrb == NULL ){
return( FALSE );
}
m_pSrb = pSrb;
return( TRUE );
}
PHW_STREAM_REQUEST_BLOCK CWDMBuffer::GetSRB( void )
{
ASSERT( m_pSrb != NULL );
return( m_pSrb );
}
VOID CWDMBuffer::Init( void )
{
m_pSrb = NULL;
m_WDMBuffNext = NULL;
#ifndef REARRANGEMENT
m_EndFlag = TRUE;
m_BuffNumber = 0;
m_StartPacketNumber = 0;
m_PacketNum = 0;
m_BeforePacketNum = 0;
m_Enable = FALSE;
#endif REARRANGEMENT
}