//==========================================================================; // // MMCONFIG.CPP // CATIMultimediaTable Class implementation. // Copyright (c) 1996 - 1998 ATI Technologies Inc. All Rights Reserved. // // $Date: 23 Jun 1999 11:58:20 $ // $Revision: 1.8 $ // $Author: pleung $ // //==========================================================================; extern"C" { #include "conio.h" #include "strmini.h" #include "wdmdebug.h" } #include "wdmdrv.h" #include "i2cgpio.h" #include "initguid.h" #include "mmconfig.h" #include "atiguids.h" #include "aticonfg.h" /*^^* * operator new * Purpose : called, before the class constructor, when the class object is created * by invoking the operator new * * Inputs : UINT size_t : size of the object to be placed * * Outputs : none * Author : IKLEBANOV *^^*/ PVOID CATIMultimediaTable::operator new( size_t stSize) { PVOID pvAllocation = NULL; ENSURE { if( stSize != sizeof( CATIMultimediaTable)) FAIL; pvAllocation = ::ExAllocatePool( PagedPool, stSize); } END_ENSURE; return( pvAllocation); } /*^^* * operator delete * Purpose : called, after the class destructor, when the class object is killed * by invoking the operator delete * * Inputs : PVOID pvAllocation : memory assisiated with the class object * * Outputs : none * Author : IKLEBANOV *^^*/ void CATIMultimediaTable::operator delete( PVOID pvAllocation) { if( pvAllocation != NULL) ::ExFreePool( pvAllocation); } /*^^* * CATIMultimediaTable() * Purpose : CATIMultimediaTable Class constructor * * Inputs : PDEVICE_OBJECT pDeviceObject : pointer to the creator DeviceObject * GPIOINTERFACE * pGPIOInterface : pointer to GPIO Interface * PBOOL pbResult : pointer to return success indicator * * Outputs : none * Author : IKLEBANOV *^^*/ CATIMultimediaTable::CATIMultimediaTable( PDEVICE_OBJECT pDeviceObject, GPIOINTERFACE * pGPIOInterface, PBOOL pbResult) { GPIOControl gpioAccessBlock; ATI_QueryPrivateInterface pfnQueryInterface; BOOL bResult = FALSE; m_ulRevision = ( DWORD)-1; m_ulSize = 0; m_pvConfigurationData = NULL; // Let's get MultiMedia data using private interfaces exposed by MiniVDD via // the standard Microsoft-defined GPIO interface ENSURE { if( !QueryGPIOProvider( pDeviceObject, pGPIOInterface, &gpioAccessBlock)) FAIL; if( !::IsEqualGUID( ( const struct _GUID &)gpioAccessBlock.PrivateInterfaceType, ( const struct _GUID &)GUID_ATI_PRIVATE_INTERFACES_QueryInterface)) FAIL; pfnQueryInterface = ( ATI_QueryPrivateInterface)gpioAccessBlock.PrivateInterface; if( pfnQueryInterface == NULL) FAIL; if( !GetMultimediaInfo_IConfiguration2( pDeviceObject, pfnQueryInterface)) { OutputDebugError(( "CATIMultimediaTable constructor fails to access IConfiguration2 for pDO = %x\n", pDeviceObject)); if( !GetMultimediaInfo_IConfiguration1( pDeviceObject, pfnQueryInterface)) { OutputDebugError(( "CATIMultimediaTable constructor fails to access IConfiguration1 for pDO = %x\n", pDeviceObject)); if( !GetMultimediaInfo_IConfiguration( pDeviceObject, pfnQueryInterface)) { OutputDebugError(( "CATIMultimediaTable constructor fails to access IConfiguration for pDO = %x\n", pDeviceObject)); FAIL; } } } bResult = TRUE; } END_ENSURE; * pbResult = bResult; } /*^^* * CATIMultimediaTable() * Purpose : CATIMultimediaTable Class destructor * * Inputs : none * * Outputs : none * Author : IKLEBANOV *^^*/ CATIMultimediaTable::~CATIMultimediaTable() { if( m_pvConfigurationData != NULL) { ::ExFreePool( m_pvConfigurationData); m_pvConfigurationData = NULL; } m_ulSize = 0; m_ulRevision = ( DWORD)-1; } /*^^* * GetMultimediaInfo_IConfiguration2() * Purpose : Get ATI Multimedia table, using IConfiguration2 interface * * Inputs : PDEVICE_OBJECT pDeviceObject : pointer to the creator DeviceObject * ATI_QueryPrivateInterface pfnQueryInterface : pointer to Query interface function * * Outputs : BOOL, returns TRUE, if succeeded * Author : IKLEBANOV *^^*/ BOOL CATIMultimediaTable::GetMultimediaInfo_IConfiguration2( PDEVICE_OBJECT pDeviceObject, ATI_QueryPrivateInterface pfnQueryInterface) { BOOL bResult = FALSE; ATI_PRIVATE_INTERFACE_CONFIGURATION_Two iConfigurationTwo; PATI_PRIVATE_INTERFACE_CONFIGURATION_Two pIConfigurationTwo = &iConfigurationTwo; ENSURE { iConfigurationTwo.usSize = sizeof( ATI_PRIVATE_INTERFACE_CONFIGURATION_Two); pfnQueryInterface( pDeviceObject, ( const struct _GUID &)GUID_ATI_PRIVATE_INTERFACES_Configuration_Two, ( PVOID *)&pIConfigurationTwo); if(( pIConfigurationTwo == NULL) || ( pIConfigurationTwo->pfnGetConfigurationRevision == NULL) || ( pIConfigurationTwo->pfnGetConfigurationData == NULL)) FAIL; //let's query GetConfigurationRevision Interface member first if( !( NT_SUCCESS( pIConfigurationTwo->pfnGetConfigurationRevision( pIConfigurationTwo->pvContext, ATI_BIOS_CONFIGURATIONTABLE_MULTIMEDIA, &m_ulRevision)))) FAIL; if( !( NT_SUCCESS( pIConfigurationTwo->pfnGetConfigurationData( pIConfigurationTwo->pvContext, ATI_BIOS_CONFIGURATIONTABLE_MULTIMEDIA, NULL, &m_ulSize)))) FAIL; m_pvConfigurationData = ( PUCHAR)::ExAllocatePool( PagedPool, m_ulSize); if( m_pvConfigurationData == NULL) FAIL; if( !( NT_SUCCESS( pIConfigurationTwo->pfnGetConfigurationData( pIConfigurationTwo->pvContext, ATI_BIOS_CONFIGURATIONTABLE_MULTIMEDIA, m_pvConfigurationData, &m_ulSize)))) FAIL; bResult = TRUE; } END_ENSURE; return( bResult); } /*^^* * GetMultimediaInfo_IConfiguration1() * Purpose : Get ATI Multimedia table, using IConfiguration1 interface * * Inputs : PDEVICE_OBJECT pDeviceObject : pointer to the creator DeviceObject * ATI_QueryPrivateInterface pfnQueryInterface : pointer to Query interface function * * Outputs : BOOL, returns TRUE, if succeeded * Author : IKLEBANOV *^^*/ BOOL CATIMultimediaTable::GetMultimediaInfo_IConfiguration1( PDEVICE_OBJECT pDeviceObject, ATI_QueryPrivateInterface pfnQueryInterface) { BOOL bResult = FALSE; ATI_PRIVATE_INTERFACE_CONFIGURATION_One iConfigurationOne; PATI_PRIVATE_INTERFACE_CONFIGURATION_One pIConfigurationOne = &iConfigurationOne; ENSURE { iConfigurationOne.usSize = sizeof( ATI_PRIVATE_INTERFACE_CONFIGURATION_One); pfnQueryInterface( pDeviceObject, ( const struct _GUID &)GUID_ATI_PRIVATE_INTERFACES_Configuration_One, ( PVOID *)&pIConfigurationOne); if(( pIConfigurationOne == NULL) || ( pIConfigurationOne->pfnGetMultimediaConfiguration == NULL)) FAIL; if( !( NT_SUCCESS( pIConfigurationOne->pfnGetMultimediaConfiguration( pIConfigurationOne->pvContext, NULL, &m_ulSize)))) FAIL; if( m_ulSize != sizeof( ATI_MULTIMEDIAINFO)) FAIL; m_pvConfigurationData = ( PUCHAR)::ExAllocatePool( PagedPool, m_ulSize); if( m_pvConfigurationData == NULL) FAIL; if( !( NT_SUCCESS( pIConfigurationOne->pfnGetMultimediaConfiguration( pIConfigurationOne->pvContext, m_pvConfigurationData, &m_ulSize)))) FAIL; m_ulRevision = 0; bResult = TRUE; } END_ENSURE; return( bResult); } /*^^* * GetMultimediaInfo_IConfiguration() * Purpose : Get ATI Multimedia table, using IConfiguration interface * * Inputs : PDEVICE_OBJECT pDeviceObject : pointer to the creator DeviceObject * ATI_QueryPrivateInterface pfnQueryInterface : pointer to Query interface function * * Outputs : BOOL, returns TRUE, if succeeded * Author : IKLEBANOV *^^*/ BOOL CATIMultimediaTable::GetMultimediaInfo_IConfiguration( PDEVICE_OBJECT pDeviceObject, ATI_QueryPrivateInterface pfnQueryInterface) { BOOL bResult = FALSE; PATI_PRIVATE_INTERFACE_CONFIGURATION pIConfiguration = NULL; ENSURE { pfnQueryInterface( pDeviceObject, ( const struct _GUID &)GUID_ATI_PRIVATE_INTERFACES_Configuration, ( PVOID *)&pIConfiguration); if(( pIConfiguration == NULL) || ( pIConfiguration->pfnGetMultimediaConfiguration == NULL)) FAIL; if( !( NT_SUCCESS( pIConfiguration->pfnGetMultimediaConfiguration( pDeviceObject, NULL, &m_ulSize)))) FAIL; if( m_ulSize != sizeof( ATI_MULTIMEDIAINFO)) FAIL; m_pvConfigurationData = ( PUCHAR)::ExAllocatePool( PagedPool, m_ulSize); if( m_pvConfigurationData == NULL) FAIL; if( !( NT_SUCCESS( pIConfiguration->pfnGetMultimediaConfiguration( pDeviceObject, m_pvConfigurationData, &m_ulSize)))) FAIL; m_ulRevision = 0; bResult = TRUE; } END_ENSURE; return( bResult); } /*^^* * GetTVTunerId() * Purpose : Retrieves TVTuner Id from the Multimedia configuration table * * Inputs : PUSHORT pusTVTunerId : pointer to return TVTuner Id * * Outputs : BOOL, returns TRUE, if succeeded * Author : IKLEBANOV *^^*/ BOOL CATIMultimediaTable::GetTVTunerId( PUSHORT pusTVTunerId) { USHORT usValue; BOOL bResult = TRUE; if(( m_pvConfigurationData != NULL) && ( m_ulSize) && ( pusTVTunerId != NULL)) { switch( m_ulRevision) { case 0: usValue = ( USHORT)(( PATI_MULTIMEDIAINFO)m_pvConfigurationData)->MMInfo_Byte0; break; case 1: usValue = ( USHORT)(((( PATI_MULTIMEDIAINFO1)m_pvConfigurationData)->MMInfo1_Byte0) & 0x1F); break; default: bResult = FALSE; break; } } else bResult = FALSE; if( bResult) * pusTVTunerId = usValue; else OutputDebugError(( "CATIMultimediaTable::GetTVTunerId() fails\n")); return( bResult); } /*^^* * GetVideoDecoderId() * Purpose : Retrieves Video decoder Id from the Multimedia configuration table * * Inputs : PUSHORT pusDecoderId : pointer to return Video decoder Id * * Outputs : BOOL, returns TRUE, if succeeded * Author : IKLEBANOV *^^*/ BOOL CATIMultimediaTable::GetVideoDecoderId( PUSHORT pusDecoderId) { USHORT usValue; BOOL bResult = TRUE; if(( m_pvConfigurationData != NULL) && ( m_ulSize) && ( pusDecoderId != NULL)) { switch( m_ulRevision) { case 0: usValue = ( USHORT)(((( PATI_MULTIMEDIAINFO)m_pvConfigurationData)->MMInfo_Byte2) & 0x07); break; case 1: usValue = ( USHORT)(((( PATI_MULTIMEDIAINFO1)m_pvConfigurationData)->MMInfo1_Byte5) & 0x0F); break; default: bResult = FALSE; break; } } else bResult = FALSE; if( bResult) * pusDecoderId = usValue; else OutputDebugError(( "CATIMultimediaTable::GetVideoDecoderId() fails\n")); return( bResult); } /*^^* * GetOEMId() * Purpose : Retrieves OEM Id from the Multimedia configuration table * * Inputs : PUSHORT pusOEMId : pointer to return OEM Id * * Outputs : BOOL, returns TRUE, if succeeded * Author : IKLEBANOV *^^*/ BOOL CATIMultimediaTable::GetOEMId( PUSHORT pusOEMId) { USHORT usValue; BOOL bResult = TRUE; if(( m_pvConfigurationData != NULL) && ( m_ulSize) && ( pusOEMId != NULL)) { switch( m_ulRevision) { case 0: usValue = ( USHORT)((( PATI_MULTIMEDIAINFO)m_pvConfigurationData)->MMInfo_Byte4); break; case 1: usValue = ( USHORT)((( PATI_MULTIMEDIAINFO1)m_pvConfigurationData)->MMInfo1_Byte2); break; default: bResult = FALSE; break; } } else bResult = FALSE; if( bResult) * pusOEMId = usValue; else OutputDebugError(( "CATIMultimediaTable::GetOEMId() fails\n")); return( bResult); } /*^^* * GetATIProductId() * Purpose : Retrieves ATI Product Id from the Multimedia configuration table * * Inputs : PUSHORT pusProductId: pointer to return Product Id * * Outputs : BOOL, returns TRUE, if succeeded * Author : IKLEBANOV *^^*/ BOOL CATIMultimediaTable::GetATIProductId( PUSHORT pusProductId) { USHORT usValue; BOOL bResult = TRUE; if(( m_pvConfigurationData != NULL) && ( m_ulSize) && ( pusProductId != NULL)) { switch( m_ulRevision) { case 0: usValue = ( USHORT)((((( PATI_MULTIMEDIAINFO)m_pvConfigurationData)->MMInfo_Byte3) >> 4) & 0x0F); break; case 1: usValue = ( USHORT)((( PATI_MULTIMEDIAINFO1)m_pvConfigurationData)->MMInfo1_Byte2); break; default: bResult = FALSE; break; } } else bResult = FALSE; if( bResult) * pusProductId = usValue; else OutputDebugError(( "CATIMultimediaTable::GetVideoDecoderId() fails\n")); return( bResult); } /*^^* * GetOEMRevisionId() * Purpose : Retrieves OEM Revision Id from the Multimedia configuration table * * Inputs : PUSHORT pusOEMRevisionId : pointer to return OEM Revision Id * * Outputs : BOOL, returns TRUE, if succeeded * Author : IKLEBANOV *^^*/ BOOL CATIMultimediaTable::GetOEMRevisionId( PUSHORT pusOEMRevisionId) { USHORT usValue; BOOL bResult = TRUE; if(( m_pvConfigurationData != NULL) && ( m_ulSize) && ( pusOEMRevisionId != NULL)) { switch( m_ulRevision) { case 0: usValue = ( USHORT)((( PATI_MULTIMEDIAINFO)m_pvConfigurationData)->MMInfo_Byte5); break; case 1: usValue = ( USHORT)((((( PATI_MULTIMEDIAINFO1)m_pvConfigurationData)->MMInfo1_Byte1) >> 5) & 0x07); break; default: bResult = FALSE; break; } } else bResult = FALSE; if( bResult) * pusOEMRevisionId = usValue; else OutputDebugError(( "CATIMultimediaTable::GetVideoDecoderId() fails\n")); return( bResult); } /*^^* * IsATIProduct() * Purpose : Returnes ATI ownership * * Inputs : PUSHORT pusProductId: pointer to return ATI Product ownership * * Outputs : BOOL, returns TRUE, if succeeded * Author : IKLEBANOV *^^*/ BOOL CATIMultimediaTable::IsATIProduct( PBOOL pbATIProduct) { BOOL bATIOwnership; BOOL bResult = TRUE; if(( m_pvConfigurationData != NULL) && ( m_ulSize) && ( pbATIProduct != NULL)) { switch( m_ulRevision) { case 0: bATIOwnership = (( PATI_MULTIMEDIAINFO)m_pvConfigurationData)->MMInfo_Byte4 == OEM_ID_ATI; break; case 1: bATIOwnership = ( BOOL)(((( PATI_MULTIMEDIAINFO1)m_pvConfigurationData)->MMInfo1_Byte1) & 0x10); break; default: bResult = FALSE; break; } } else bResult = FALSE; if( bResult) * pbATIProduct = bATIOwnership; else OutputDebugError(( "CATIMultimediaTable::GetVideoDecoderId() fails\n")); return( bResult); } /*^^* * QueryGPIOProvider() * Purpose : queries the GPIOProvider for the pins supported and private interfaces * * Inputs : PDEVICE_OBJECT pDeviceObject : pointer to accosiated Device Object * GPIOINTERFACE * pGPIOInterface : pointer to GPIO interface * PGPIOControl pgpioAccessBlock : pointer to GPIO control structure * * Outputs : BOOL : retunrs TRUE, if the query function was carried on successfully * Author : IKLEBANOV *^^*/ BOOL CATIMultimediaTable::QueryGPIOProvider( PDEVICE_OBJECT pDeviceObject, GPIOINTERFACE * pGPIOInterface, PGPIOControl pgpioAccessBlock) { ENSURE { if(( pGPIOInterface->gpioOpen == NULL) || ( pGPIOInterface->gpioAccess == NULL) || ( pDeviceObject == NULL)) FAIL; pgpioAccessBlock->Status = GPIO_STATUS_NOERROR; pgpioAccessBlock->Command = GPIO_COMMAND_QUERY; pgpioAccessBlock->AsynchCompleteCallback = NULL; pgpioAccessBlock->Pins = NULL; if(( !NT_SUCCESS( pGPIOInterface->gpioOpen( pDeviceObject, TRUE, pgpioAccessBlock))) || ( pgpioAccessBlock->Status != GPIO_STATUS_NOERROR)) FAIL; return( TRUE); } END_ENSURE; return( FALSE); } /*^^* * GetDigitalAudioProperties() * Purpose : Gets Digital Audio support and information * Inputs : Pointer to Digital Audio Info structure * * Outputs : BOOL : returns TRUE * also sets the requested values into the input pointer * Author : TOM *^^*/ BOOL CATIMultimediaTable::GetDigialAudioConfiguration( PDIGITAL_AUD_INFO pInput) { BOOL bResult = FALSE; ENSURE { if (pInput == NULL) FAIL; #if 1 if (m_pvConfigurationData == NULL) FAIL; switch( m_ulRevision) { case 1: // Disable I2S in support for the time being - TL // pInput->bI2SInSupported = ( BOOL)(((( PATI_MULTIMEDIAINFO1)m_pvConfigurationData)->MMInfo1_Byte4) & 0x01); pInput->bI2SInSupported = 0; pInput->bI2SOutSupported = ( BOOL)(((( PATI_MULTIMEDIAINFO1)m_pvConfigurationData)->MMInfo1_Byte4) & 0x02); pInput->wI2S_DAC_Device = ( WORD)((((( PATI_MULTIMEDIAINFO1)m_pvConfigurationData)->MMInfo1_Byte4) & 0x1c) >> 2); pInput->bSPDIFSupported = ( BOOL)(((( PATI_MULTIMEDIAINFO1)m_pvConfigurationData)->MMInfo1_Byte4) & 0x20); pInput->wReference_Clock = ( WORD)((((( PATI_MULTIMEDIAINFO1)m_pvConfigurationData)->MMInfo1_Byte5) & 0xf0) >> 4); bResult = TRUE; break; default: bResult = FALSE; break; } #else pInput->bI2SInSupported = TRUE; pInput->bI2SOutSupported = TRUE; pInput->wI2S_DAC_Device = TDA1309_32; pInput->wReference_Clock = REF_295MHZ; pInput->bSPDIFSupported = TRUE; bResult = TRUE; #endif } END_ENSURE; return (bResult); } /*^^* * GetVideoInCrystalId() * Purpose : Retrieves Video in crystal ID from the Multimedia configuration table * * Inputs : PUSHORT pusVInCrystalId : pointer to return Video in crystal Id * * Outputs : BOOL, returns TRUE, if succeeded * Author : Paul *^^*/ BOOL CATIMultimediaTable::GetVideoInCrystalId( PUCHAR pucVInCrystalId) { UCHAR ucValue; BOOL bResult = TRUE; if(( m_pvConfigurationData != NULL) && ( m_ulSize) && ( pucVInCrystalId != NULL)) { switch( m_ulRevision) { case 0: ucValue = ( UCHAR)((((( PATI_MULTIMEDIAINFO)m_pvConfigurationData)->MMInfo_Byte2) & 0x18) >> 3); break; case 1: ucValue = ( UCHAR)((((( PATI_MULTIMEDIAINFO1)m_pvConfigurationData)->MMInfo1_Byte5) & 0xF0) >> 4); break; default: bResult = FALSE; break; } } else bResult = FALSE; if( bResult) * pucVInCrystalId = ucValue; else OutputDebugError(( "CATIMultimediaTable::GetVideoInCrystalId() fails\n")); return( bResult); }