windows-nt/Source/XPSP1/NT/drivers/video/matrox/mga/mini/getcfg.c
2020-09-26 16:20:57 +08:00

243 lines
8.1 KiB
C

/*/****************************************************************************
* name: GetMGAConfiguration
*
* description: This function will read the strappings of the specified MGA
* device from the Titan DSTi1-0 registers (with the PATCH).
* Also this function will return a DAC id and some other
* relevent informations.
*
* designed: Bart Simpson, february 10, 1993
* last modified: $Author: ctoutant $, $Date: 94/06/14 13:05:50 $
*
* version: $Id: GETCFG.C 1.17 94/06/14 13:05:50 ctoutant Exp $
*
* parameters: _Far BYTE *pMGA, DWORD* DST1, DWORD* DST0, DWORD* Info
* modifies: *DST1, *DST0, *Info
* calls: -
* returns: DST0, DST1, Info
*
*
* NOTE: DST1, DST0 are in Titan format.
*
* Info is 0x uuuu uuuu uuuu uuuu uuuu uuuu uuuu dddd
*
* dddd : 2 MSB are DAC extended id
* 2 LSB are DAC DUBIC id
*
* 0000 : BT481
* 0100 : BT482
* 1000 : ATT
* 1100 : Sierra
*
* 0001 : ViewPoint
*
* 0010 : BT484
* 0110 : BT485
*
* 0111 : PX2085
*
* 0011 : Chameleon
*
******************************************************************************/
#define DEBUG_OUTPUT 0
#include "switches.h"
#include "g3dstd.h"
#include "caddi.h"
#include "def.h"
#include "mga.h"
#include "global.h"
#include "proto.h"
#include "mgai.h"
#if DEBUG_OUTPUT
extern VOID printf();
#endif
#ifdef WINDOWS_NT
#if defined(ALLOC_PRAGMA)
#pragma alloc_text(PAGE,GetMGAConfiguration)
#endif
#if defined(ALLOC_PRAGMA)
#pragma data_seg("PAGE")
#endif
#include "video.h"
#endif /* #ifdef WINDOWS_NT */
VOID GetMGAConfiguration(volatile BYTE _Far *pDevice, DWORD *DST0, DWORD *DST1, DWORD *Info)
{
DWORD TmpDword;
BYTE reg0, TmpByte, TmpByte1, TmpByte2, FifoCount;
BYTE DacDetected;
static DWORD DST0Cache, DST1Cache, InfoCache;
static BOOL CacheFlag=FALSE;
if (0)
{
*DST0 = DST0Cache;
*DST1 = DST1Cache;
*Info = InfoCache;
}
else
{
{ DWORD Opmode, SrcPage;
/*** Apply the patch procedure to get the straps in the DST1 and DST0 ***/
/** Wait until the FIFO is empty, Then we're sure that the Titan
*** is ready to process the DATA transfers.
**/
FifoCount = 0;
while (FifoCount < 32)
mgaReadBYTE(*(pDevice + TITAN_OFFSET+TITAN_FIFOSTATUS),FifoCount);
/* Wait for the drawing engine to be idle */
mgaPollBYTE(*(pDevice + TITAN_OFFSET + TITAN_STATUS + 2),0x00,0x01);
mgaReadDWORD(*(pDevice + TITAN_OFFSET + TITAN_OPMODE), Opmode);
mgaReadDWORD(*(pDevice + TITAN_OFFSET + TITAN_SRCPAGE), SrcPage);
mgaWriteDWORD(*(pDevice + TITAN_OFFSET + TITAN_OPMODE), Opmode & ~((DWORD)TITAN_FBM_M | (DWORD)TITAN_PSEUDODMA_M));
mgaWriteDWORD(*(pDevice + TITAN_OFFSET + TITAN_MCTLWTST), 0xffffffff);
mgaWriteDWORD(*(pDevice + TITAN_OFFSET + TITAN_SRCPAGE), 0x00f80000);
mgaReadDWORD(*(pDevice + SRC_WIN_OFFSET), TmpDword);
mgaReadDWORD(*(pDevice + SRC_WIN_OFFSET), TmpDword);
mgaReadDWORD(*(pDevice + SRC_WIN_OFFSET), TmpDword);
mgaReadDWORD(*(pDevice + SRC_WIN_OFFSET), TmpDword);
mgaReadDWORD(*(pDevice + SRC_WIN_OFFSET), TmpDword);
mgaReadDWORD(*(pDevice + SRC_WIN_OFFSET), TmpDword);
mgaReadDWORD(*(pDevice + SRC_WIN_OFFSET), TmpDword);
mgaReadDWORD(*(pDevice + SRC_WIN_OFFSET), TmpDword);
TmpDword = TmpDword;
mgaReadDWORD(*(pDevice + TITAN_OFFSET + TITAN_DST0), (*DST0));
mgaReadDWORD(*(pDevice + TITAN_OFFSET + TITAN_DST1), (*DST1));
/*** Reset Opmode with pseudo-dma off first and then to its previous state ***/
mgaWriteDWORD(*(pDevice + TITAN_OFFSET + TITAN_OPMODE), Opmode & ~((DWORD)TITAN_PSEUDODMA_M));
mgaWriteDWORD(*(pDevice + TITAN_OFFSET + TITAN_OPMODE), Opmode);
mgaWriteDWORD(*(pDevice + TITAN_OFFSET + TITAN_MCTLWTST), GetMGAMctlwtst(*DST0, *DST1));
mgaWriteDWORD(*(pDevice + TITAN_OFFSET + TITAN_SRCPAGE), SrcPage);
}
#if DEBUG_OUTPUT
printf ("DST0=%lx, DST1=%lx\n", *DST0, *DST1);
#endif
/** Because the Titan DSTi0-1 spec has changed after the binding
*** developpement (i.e. the rambank[0] bit has moved from bit 0 of DST0
*** to bit 3 of DST1) we duplicate the DST1[3] to DST0[24] because the
*** binding has nothing to do with the new VGA BANK 0 bit
**/
/*** Clear bit rambank 0 ***/
(*DST0) &= ~((DWORD)0x1 << TITAN_DST0_RAMBANK_A);
/*** DUPLICATE ***/
(*DST0) |= ((((*DST1) & (DWORD)TITAN_DST1_RAMBANK0_M) >> TITAN_DST1_RAMBANK0_A) << TITAN_DST0_RAMBANK_A);
/***** DETECT DAC TYPE *****/
mgaReadBYTE(*(pDevice + RAMDAC_OFFSET + VPOINT_INDEX), TmpByte2);
mgaWriteBYTE(*(pDevice + RAMDAC_OFFSET + VPOINT_INDEX),VPOINT_ID);
mgaReadBYTE(*(pDevice + RAMDAC_OFFSET + VPOINT_DATA), TmpByte);
if (TmpByte == 0x20)
DacDetected = (BYTE)Info_Dac_ViewPoint;
else
{
mgaWriteBYTE(*(pDevice + RAMDAC_OFFSET + VPOINT_INDEX),TmpByte2);
mgaWriteBYTE(*(pDevice + RAMDAC_OFFSET + TVP3026_INDEX),TVP3026_ID);
mgaReadBYTE(*(pDevice + RAMDAC_OFFSET + TVP3026_DATA), TmpByte);
if (TmpByte == 0x26)
DacDetected = (BYTE)Info_Dac_TVP3026;
else
{
mgaWriteBYTE(*(pDevice + RAMDAC_OFFSET + BT485_WADR_PAL), 0x00);
mgaWriteBYTE(*(pDevice + RAMDAC_OFFSET + BT485_PIX_RD_MSK), 0xff);
mgaReadBYTE(*(pDevice + RAMDAC_OFFSET + BT485_STATUS), TmpByte);
if ((TmpByte & (BYTE)ATT20C505_ID_M) == (BYTE)ATT20C505_ID)
DacDetected = (BYTE)Info_Dac_ATT2050;
else
{
/*** BEN TEST SPECIAL NE VEUT PAS ENTRER DANS CE IF ***/
if ((TmpByte & (BYTE)BT485_ID_M) == (BYTE)0x77)
/* if ((TmpByte & (BYTE)BT485_ID_M) == (BYTE)BT485_ID) */
DacDetected = (BYTE)Info_Dac_BT485;
else
if ((TmpByte & (BYTE)BT484_ID_M) == (BYTE)BT484_ID)
DacDetected = (BYTE)Info_Dac_BT484;
else
{
mgaWriteBYTE(*(pDevice + RAMDAC_OFFSET + BT485_CUR_XLOW),0x00);
mgaWriteBYTE(*(pDevice + RAMDAC_OFFSET + BT485_WADR_OVL),0x55);
mgaReadBYTE(*(pDevice + RAMDAC_OFFSET + BT485_CUR_XLOW), TmpByte);
if (TmpByte == 0x55)
DacDetected = (BYTE)Info_Dac_BT482; /* SIERRA */
else
{
/*** Procedure to detect CL_PX2085 ***/
mgaWriteBYTE(*(pDevice + RAMDAC_OFFSET + BT485_CMD_REG0),0x82);
/*** Set index register ***/
mgaReadBYTE(*(pDevice + RAMDAC_OFFSET + BT485_STATUS),TmpByte2);
TmpByte = TmpByte2 & 0x0f;
TmpByte |= 0x40;
mgaWriteBYTE(*(pDevice + RAMDAC_OFFSET + BT485_STATUS),TmpByte);
mgaReadBYTE(*(pDevice + RAMDAC_OFFSET + BT485_CMD_REG0),reg0);
mgaWriteBYTE(*(pDevice + RAMDAC_OFFSET + BT485_CMD_REG0),0x02);
/*** Set direct register ***/
mgaReadBYTE(*(pDevice + RAMDAC_OFFSET + BT485_STATUS),TmpByte1);
TmpByte = TmpByte & 0x0f;
mgaWriteBYTE(*(pDevice + RAMDAC_OFFSET + BT485_STATUS),TmpByte);
mgaReadBYTE(*(pDevice + RAMDAC_OFFSET + BT485_CMD_REG0),TmpByte);
mgaWriteBYTE(*(pDevice + RAMDAC_OFFSET + BT485_STATUS),TmpByte1);
mgaWriteBYTE(*(pDevice + RAMDAC_OFFSET + BT485_CMD_REG0),reg0);
mgaWriteBYTE(*(pDevice + RAMDAC_OFFSET + BT485_STATUS),TmpByte2);
if(TmpByte == 0x82)
DacDetected = (BYTE)Info_Dac_PX2085;
else
DacDetected = (BYTE)Info_Dac_BT485; /* other DAC same as BT485 */
}
}
}
}
}
*Info = (DWORD)DacDetected;
DST0Cache = *DST0;
DST1Cache = *DST1;
InfoCache = *Info;
CacheFlag = TRUE;
}
}