2025-04-27 07:49:33 -04:00

205 lines
5.5 KiB
C

/**************************************************************************\
$Header: o:\src/RCS/SXCI_NT.C 1.3 93/12/20 11:38:48 jyharbec Exp $
$Log: SXCI_NT.C $
* Revision 1.3 93/12/20 11:38:48 jyharbec
* Added VerifyAccessRanges in setmgasel.
*
* Revision 1.2 93/11/04 04:56:24 dlee
* Modified for Alpha
*
* Revision 1.1 93/08/27 12:37:38 jyharbec
* Initial revision
*
\**************************************************************************/
/*/****************************************************************************
* name: sxci_nt.c
*
* description: Initialization routines specific to Windows NT.
*
* designed:
* last modified: dlee
*
* version: 1.0
*
* parameters: -
* modifies: -
* calls: -
* returns: -
******************************************************************************/
#include "switches.h"
#include "video.h"
/*** Global variables ***/
SHORT wSelector;
extern PVOID pMgaDeviceExtension;
/*** Internal prototypes ***/
VOID _mtxSetSelector (SHORT wSel);
PVOID setmgasel (LONG *pBoardSel, LONG dwBaseAddress, SHORT wNumPages);
PVOID setmgaselNoV (LONG *pBoardSel, LONG dwBaseAddress, SHORT wNumPages);
PVOID getmgasel (void);
PVOID AllocateSystemMemory(ULONG NumberOfBytes);
BOOLEAN bConflictDetected(ULONG ulAddressToVerify);
#if defined(ALLOC_PRAGMA)
// #pragma alloc_text(PAGE,setmgasel)
// #pragma alloc_text(PAGE,getmgasel)
#pragma alloc_text(PAGE,_mtxSetSelector)
#pragma alloc_text(PAGE,AllocateSystemMemory)
#pragma alloc_text(PAGE,bConflictDetected)
#endif
//#if defined(ALLOC_PRAGMA)
// #pragma data_seg("PAGE")
//#endif
// Structure to be filled out and used by setmgasel. Just modify the
// 0xffffffff fields.
VIDEO_ACCESS_RANGE MgaSelAccessRange =
{0xffffffff, 0x00000000, 0xffffffff, 0, 0, 0};
/*-----------------------------------------------------
* setmgasel
*
* This function returns a far pointer to the physical address
*
* Return: (ptr) = 0 : No valid pointer
* (ptr) != 0 : Pointer to board
*-----------------------------------------------------*/
PVOID setmgasel (LONG *pBoardSel, LONG dwBaseAddress, SHORT wNumPages)
{
PHYSICAL_ADDRESS paTemp;
paTemp.HighPart = 0;
paTemp.LowPart = dwBaseAddress;
if (dwBaseAddress == 0xAC000)
{
MgaSelAccessRange.RangeShareable = 1;
}
else
{
MgaSelAccessRange.RangeShareable = 0;
}
MgaSelAccessRange.RangeStart.LowPart = dwBaseAddress;
MgaSelAccessRange.RangeLength = wNumPages * (4*1024);
if (VideoPortVerifyAccessRanges(pMgaDeviceExtension,
1,
&MgaSelAccessRange) == NO_ERROR)
{
return(VideoPortGetDeviceBase(pMgaDeviceExtension, paTemp,
wNumPages * (4*1024), 0));
}
else
{
return(NULL);
}
}
/*-----------------------------------------------------
* setmgaselNoV
*
* This function returns a far pointer to the physical address
*
* Return: (ptr) = 0 : No valid pointer
* (ptr) != 0 : Pointer to board
*-----------------------------------------------------*/
PVOID setmgaselNoV (LONG *pBoardSel, LONG dwBaseAddress, SHORT wNumPages)
{
PHYSICAL_ADDRESS paTemp;
paTemp.HighPart = 0;
paTemp.LowPart = dwBaseAddress;
return(VideoPortGetDeviceBase(pMgaDeviceExtension, paTemp,
wNumPages * (4*1024), 0));
}
/*-----------------------------------------------------
* getmgasel
*
* This function returns a far pointer to the physical address
*
* Return: (ptr) = 0 : No valid pointer
* (ptr) != 0 : Pointer to board
*-----------------------------------------------------*/
PVOID getmgasel (void)
{
return (NULL);
}
/*-----------------------------------------------------
* _mtxSetSelector
*
* This function gets a valid selector
*
* Return: nothing
*-----------------------------------------------------*/
void _mtxSetSelector (SHORT wSel)
{
wSelector = wSel;
}
/*--------------------------------------------------------------------------*\
| AllocateSystemMemory
|
|
|
\*--------------------------------------------------------------------------*/
PVOID AllocateSystemMemory(ULONG NumberOfBytes)
{
PVOID pBuf;
if(VideoPortAllocateBuffer(pMgaDeviceExtension, NumberOfBytes, &pBuf) == NO_ERROR)
return(pBuf);
else
return(NULL);
}
/*--------------------------------------------------------------------------*\
| bConflictDetected
|
| Checks to see if another driver has already mapped something at
| ulAddressToVerify
|
| Returns: TRUE if this area has already been mapped.
| FALSE otherwise.
\*--------------------------------------------------------------------------*/
BOOLEAN bConflictDetected(ULONG ulAddressToVerify)
{
VIDEO_ACCESS_RANGE varTemp;
varTemp.RangeStart.HighPart = 0;
varTemp.RangeStart.LowPart = ulAddressToVerify;
varTemp.RangeLength = 0x00004000;
varTemp.RangeInIoSpace = 0;
varTemp.RangeVisible = 0;
varTemp.RangeShareable = 1;
if (VideoPortVerifyAccessRanges(pMgaDeviceExtension, 1, &varTemp)
!= NO_ERROR)
{
VideoDebugPrint((1, "MGA.SYS!Someone is using 0x%x\n", ulAddressToVerify));
return(TRUE);
}
// No conflict, return false.
return(FALSE);
}