346 lines
11 KiB
C
346 lines
11 KiB
C
/******************************************************************************
|
|
* name: cnvinfo.c
|
|
*
|
|
* description: Routines to convert old mga.inf format to the current
|
|
* revision
|
|
*
|
|
* designed: Christian Toutant
|
|
* last modified: $Author:
|
|
*
|
|
* version: $Id:
|
|
*
|
|
*
|
|
* char * mtxConvertMgaInf( char *)
|
|
*
|
|
******************************************************************************/
|
|
#include "switches.h"
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include "bind.h"
|
|
#include "defbind.h"
|
|
#include "defoldv.h"
|
|
|
|
/* Prototypes */
|
|
word findInfoPrec(header *hdr, word i);
|
|
void cnvBrdInfo_101(general_info *dst, general_info_101 *src);
|
|
word sizeOfBoard(header *hdr, word i);
|
|
char *convertRev101(char *dst, char *src);
|
|
char *mtxConvertMgaInf( char *inf );
|
|
|
|
#ifdef WINDOWS_NT
|
|
#if defined(ALLOC_PRAGMA)
|
|
#pragma alloc_text(PAGE,findInfoPrec)
|
|
#pragma alloc_text(PAGE,cnvBrdInfo_101)
|
|
#pragma alloc_text(PAGE,sizeOfBoard)
|
|
#pragma alloc_text(PAGE,convertRev101)
|
|
#pragma alloc_text(PAGE,mtxConvertMgaInf)
|
|
#endif
|
|
#endif /* #ifdef WINDOWS_NT */
|
|
|
|
extern char DefaultVidset[];
|
|
|
|
# define GENERAL_INFO(h, i) ( (general_info *) ( (char *)h + ((header *)h)->BoardPtr[i] ) )
|
|
# define GENERAL_INFO101(h, i) ( (general_info_101 *) ( (char *)h + ((header *)h)->BoardPtr[i] ) )
|
|
|
|
#ifdef WINDOWS_NT
|
|
extern ULONG ulNewInfoSize;
|
|
extern PVOID pMgaDeviceExtension;
|
|
|
|
PVOID AllocateSystemMemory(ULONG NumberOfBytes);
|
|
#endif /* #ifdef WINDOWS_NT */
|
|
|
|
/*----------------------------------------------------------------------------
|
|
| name: findInfoPrec
|
|
|
|
|
| description: check if a previous board pointer have the same offset
|
|
|
|
|
|
|
|
| designed: Christian Toutant, august 26, 1993
|
|
| last modified:
|
|
|
|
|
|
|
|
| parameters: header *hdr header for search
|
|
| word i current board pointer
|
|
| modifies: none
|
|
| calls:
|
|
| returns: word index of previous board whit the same offset
|
|
| or NUMBER_BOARD_MAX if no found.
|
|
|
|
|
-----------------------------------------------------------------------------*/
|
|
word findInfoPrec(header *hdr, word i)
|
|
{
|
|
word j;
|
|
for (j = 0; j < i; j++)
|
|
if (hdr->BoardPtr[i] == hdr->BoardPtr[j]) return j;
|
|
return NUMBER_BOARD_MAX;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
| name: cnvBrdInfo_101
|
|
|
|
|
| description: convert general_info ver 101 to general_info ver 102 (current)
|
|
|
|
|
|
|
|
| designed: Christian Toutant, august 26, 1993
|
|
| last modified:
|
|
|
|
|
|
|
|
| parameters: general_info *dst pointer to destination general_info (v.102)
|
|
| general_info_101 *src pointer to source general_info (v.101)
|
|
| modifies: none
|
|
| calls:
|
|
| returns: bool
|
|
|
|
|
|note : This function must be change when we pass to ver 103. The conversion
|
|
| will be from v. 101 to v. 103.
|
|
-----------------------------------------------------------------------------*/
|
|
void cnvBrdInfo_101(general_info *dst, general_info_101 *src)
|
|
{
|
|
word i, j;
|
|
Vidparm_101 *srcVidParm;
|
|
Vidparm *dstVidParm;
|
|
|
|
dst->MapAddress = src->MapAddress ;
|
|
dst->BitOperation8_16 = src->BitOperation8_16 ;
|
|
dst->DmaEnable = src->DmaEnable ;
|
|
dst->DmaChannel = src->DmaChannel ;
|
|
dst->DmaType = src->DmaType ;
|
|
dst->DmaXferWidth = src->DmaXferWidth ;
|
|
dst->NumVidparm = src->NumVidparm ;
|
|
strncpy(dst->MonitorName, src->MonitorName, 64);
|
|
for (i = 0; i < NUMBER_OF_RES; i++)
|
|
dst->MonitorSupport[i] = src->MonitorSupport[i];
|
|
|
|
srcVidParm = (Vidparm_101 *)(((char *)src) + sizeof(general_info_101));
|
|
dstVidParm = (Vidparm*)(((char *)dst) + sizeof(general_info));
|
|
for (i = 0; i < src->NumVidparm; i++)
|
|
{
|
|
dstVidParm[i].Resolution = srcVidParm[i].Resolution;
|
|
dstVidParm[i].PixWidth = srcVidParm[i].PixWidth;
|
|
|
|
for (j = 0; j < 3; j++)
|
|
{
|
|
dstVidParm[i].VidsetPar[j].PixClock = srcVidParm[i].VidsetPar[j].PixClock;
|
|
dstVidParm[i].VidsetPar[j].HDisp = srcVidParm[i].VidsetPar[j].HDisp ;
|
|
dstVidParm[i].VidsetPar[j].HFPorch = srcVidParm[i].VidsetPar[j].HFPorch ;
|
|
dstVidParm[i].VidsetPar[j].HSync = srcVidParm[i].VidsetPar[j].HSync ;
|
|
dstVidParm[i].VidsetPar[j].HBPorch = srcVidParm[i].VidsetPar[j].HBPorch ;
|
|
dstVidParm[i].VidsetPar[j].HOvscan = srcVidParm[i].VidsetPar[j].HOvscan ;
|
|
dstVidParm[i].VidsetPar[j].VDisp = srcVidParm[i].VidsetPar[j].VDisp ;
|
|
dstVidParm[i].VidsetPar[j].VFPorch = srcVidParm[i].VidsetPar[j].VFPorch ;
|
|
dstVidParm[i].VidsetPar[j].VSync = srcVidParm[i].VidsetPar[j].VSync ;
|
|
dstVidParm[i].VidsetPar[j].VBPorch = srcVidParm[i].VidsetPar[j].VBPorch ;
|
|
dstVidParm[i].VidsetPar[j].VOvscan = srcVidParm[i].VidsetPar[j].VOvscan ;
|
|
dstVidParm[i].VidsetPar[j].OvscanEnable = srcVidParm[i].VidsetPar[j].OvscanEnable;
|
|
dstVidParm[i].VidsetPar[j].InterlaceEnable= srcVidParm[i].VidsetPar[j].InterlaceEnable;
|
|
dstVidParm[i].VidsetPar[j].HsyncPol = 0;
|
|
dstVidParm[i].VidsetPar[j].VsyncPol = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
| name: sizeOfBoard
|
|
|
|
|
| description: calculate the size of memory for one board (without the
|
|
| size of the header).
|
|
|
|
|
|
|
|
| designed: Christian Toutant, august 26, 1993
|
|
| last modified:
|
|
|
|
|
|
|
|
| parameters: header *hdr header info
|
|
| word index of the board to calculate.
|
|
| modifies: none
|
|
| calls:
|
|
| returns: word size needed for the ith board or 0 if no
|
|
| board.
|
|
|
|
|
|note : This function must be change when we pass to ver 103. The size
|
|
| will be for v. 103.
|
|
|
|
|
-----------------------------------------------------------------------------*/
|
|
word sizeOfBoard(header *hdr, word i)
|
|
{
|
|
word sizeBoard, j;
|
|
|
|
/* if no board, return size of 0 */
|
|
if ( hdr->BoardPtr[i] == (short)-1 ) return 0;
|
|
|
|
/* if a board farther have the same address data, return the
|
|
good size only for the last one and 0 for the other
|
|
*/
|
|
for (j = i + 1 ; j < NUMBER_BOARD_MAX; j++)
|
|
if (hdr->BoardPtr[i] == hdr->BoardPtr[j]) return 0;
|
|
|
|
/* calculate the size of this board */
|
|
sizeBoard = sizeof(general_info);
|
|
|
|
|
|
sizeBoard += sizeof(Vidparm) * GENERAL_INFO101(hdr, i)->NumVidparm;
|
|
|
|
return sizeBoard;
|
|
}
|
|
|
|
|
|
/*----------------------------------------------------------------------------
|
|
| name: convertRev101
|
|
|
|
|
| description: convert from mga.inf v.101 to mga.inf v.102
|
|
|
|
|
|
|
|
| designed: Christian Toutant, august 26, 1993
|
|
| last modified:
|
|
|
|
|
|
|
|
| parameters: char *dst pointer to memory destination for new mga.inf
|
|
| enough must be allocated.
|
|
| char *src pointer to the mga.inf v.101
|
|
| modifies: none
|
|
| calls:
|
|
| returns: pointer to the destination mga.inf pointer
|
|
|
|
|
|note : This function must be change when we pass to ver 103. The conversion
|
|
| will be from v. 101 to v. 103.
|
|
|
|
|
-----------------------------------------------------------------------------*/
|
|
|
|
char *convertRev101(char *dst, char *src)
|
|
{
|
|
word i, j, brdPtr;
|
|
header *srcHdr, *dstHdr;
|
|
|
|
srcHdr = (header *)src;
|
|
dstHdr = (header *)dst;
|
|
brdPtr = sizeof(header);
|
|
|
|
for (i = 0; i < NUMBER_BOARD_MAX; i ++)
|
|
{
|
|
if (srcHdr->BoardPtr[i] == (short)-1)
|
|
dstHdr->BoardPtr[i] = -1;
|
|
else
|
|
{
|
|
if ( (j = findInfoPrec(srcHdr, i)) < NUMBER_BOARD_MAX )
|
|
dstHdr->BoardPtr[i] = dstHdr->BoardPtr[j];
|
|
else
|
|
{
|
|
dstHdr->BoardPtr[i] = brdPtr;
|
|
cnvBrdInfo_101( GENERAL_INFO(dstHdr, i),GENERAL_INFO101(srcHdr, i) );
|
|
brdPtr += sizeOfBoard(srcHdr, i);
|
|
}
|
|
}
|
|
}
|
|
return dst;
|
|
}
|
|
|
|
|
|
|
|
/*----------------------------------------------------------------------------
|
|
| name: mtxConvertMgaInf
|
|
|
|
|
| description: convert a old mga.inf definition to the current one.
|
|
| this function allocate memory for the new mga.inf and
|
|
| free the memory of the old one.
|
|
|
|
|
|
|
|
| designed: Christian Toutant, august 26, 1993
|
|
| last modified:
|
|
|
|
|
|
|
|
| parameters: char *inf pointer to the old mga.inf
|
|
| modifies: free memory pointed by inf.
|
|
| calls:
|
|
| returns: pointer to the new mga.inf or 0 if error in conversion.
|
|
| note: the memory pointer by inf is free also if an error
|
|
| occur.
|
|
|
|
|
-----------------------------------------------------------------------------*/
|
|
char *mtxConvertMgaInf( char *inf )
|
|
{
|
|
char *newInfo;
|
|
word size_newInfo, i;
|
|
word rev;
|
|
header *hdr = (header *)inf;
|
|
|
|
rev = hdr->Revision;
|
|
size_newInfo = sizeof(header);
|
|
for (i = 0; i < NUMBER_BOARD_MAX; i ++)
|
|
{
|
|
switch(rev)
|
|
{
|
|
case 101:
|
|
if (
|
|
(hdr->BoardPtr[i] != -1) &&
|
|
(GENERAL_INFO101(hdr, i)->NumVidparm < 0)
|
|
)
|
|
{
|
|
#ifndef WINDOWS_NT
|
|
/* In Windows NT, inf points to RequestPacket.InputBuffer:
|
|
don't free it! */
|
|
free ( inf );
|
|
#endif
|
|
return DefaultVidset;
|
|
}
|
|
|
|
size_newInfo += sizeOfBoard(hdr, i);
|
|
break;
|
|
|
|
default:
|
|
#ifndef WINDOWS_NT
|
|
/* In Windows NT, inf points to RequestPacket.InputBuffer:
|
|
don't free it! */
|
|
free( inf );
|
|
#endif
|
|
return DefaultVidset;
|
|
}
|
|
}
|
|
|
|
#ifdef WINDOWS_NT
|
|
if ((newInfo = (PUCHAR)AllocateSystemMemory(size_newInfo)) == (PUCHAR)NULL)
|
|
{
|
|
/* Not enough memory */
|
|
return DefaultVidset;
|
|
}
|
|
#else
|
|
if ( (newInfo = (char *)malloc(size_newInfo)) == (char *)0 )
|
|
{
|
|
/* Not enough memory */
|
|
free( inf );
|
|
return DefaultVidset;
|
|
}
|
|
#endif /* #ifdef WINDOWS_NT */
|
|
|
|
hdr = (header *)newInfo;
|
|
hdr->Revision = (short)VERSION_NUMBER;
|
|
strncpy(hdr->IdString, ((header *)inf)->IdString, 32);
|
|
|
|
switch(rev)
|
|
{
|
|
case 101:
|
|
newInfo = convertRev101(newInfo, inf);
|
|
break;
|
|
|
|
default:
|
|
#ifdef WINDOWS_NT
|
|
VideoPortReleaseBuffer(pMgaDeviceExtension, newInfo);
|
|
#else
|
|
free(newInfo);
|
|
#endif
|
|
return DefaultVidset;
|
|
break;
|
|
}
|
|
|
|
#ifdef WINDOWS_NT
|
|
/* We want to know the size of our new buffer in IOCTL_VIDEO_MTX_INITIALIZE_MGA */
|
|
ulNewInfoSize = (ULONG) size_newInfo;
|
|
#endif
|
|
|
|
#ifndef WINDOWS_NT
|
|
/* In Windows NT, inf points to RequestPacket.InputBuffer: don't free it! */
|
|
free ( inf );
|
|
#endif
|
|
|
|
return newInfo;
|
|
}
|