|
|
/****************************************************************************
***************************************************************************** * * ****************************************** * * Copyright (c) 1995, Cirrus Logic, Inc. * * * All Rights Reserved * * ****************************************** * * PROJECT: Laguna I (CL-GD5462) - * * FILE: escape.c * * AUTHOR: Benny Ng * * DESCRIPTION: * This module Handles escapes * * MODULES: * DrvEscape() * * REVISION HISTORY: * 11/16/95 Benny Ng Initial version * * $Log: X:/log/laguna/nt35/displays/cl546x/ESCAPE.C $ * * Rev 1.14 Dec 10 1997 13:32:12 frido * Merged from 1.62 branch. * * Rev 1.13.1.0 Nov 10 1997 11:34:08 phyang * Added 5 escape functions for utilities to update registry values. * * Rev 1.13 10 Sep 1997 10:40:36 noelv * Modified QUERYESCSUPPORT to only return TRUE for escapes we actually suppor * It was returning TRUE all the time. * * Rev 1.12 20 Aug 1997 15:49:42 bennyn * * Added IS_CIRRUS_DRIVER escape support * **************************************************************************** ****************************************************************************/
/*----------------------------- INCLUDES ----------------------------------*/ #include "precomp.h"
#include "clioctl.h"
/*----------------------------- DEFINES -----------------------------------*/ //#define DBGBRK
#define ESC_DBG_LVL 1
#if 0 // MCD not working good
#if ( DRIVER_5465 && !defined(WINNT_VER35) )
#define CLMCD_ESCAPE_SUPPORTED
#endif
#endif// 0 MCD not working good
#ifdef CLMCD_ESCAPE_SUPPORTED
// #define CLMCDDLLNAME "CLMCD.DLL"
// #define CLMCDINITFUNCNAME "CLMCDInit"
MCDRVGETENTRYPOINTSFUNC CLMCDInit(PPDEV ppdev);
#endif // def CLMCD_ESCAPE_SUPPORTED
/*--------------------- STATIC FUNCTION PROTOTYPES ------------------------*/
/*--------------------------- ENUMERATIONS --------------------------------*/
/*----------------------------- TYPEDEFS ----------------------------------*/
#ifdef CLMCD_ESCAPE_SUPPORTED
typedef BOOL (*MCDRVGETENTRYPOINTSFUNC)(MCDSURFACE *pMCDSurface, MCDDRIVER *pMCDDriver); typedef POFMHDL (*ALLOCOFFSCNMEMFUNC)(PPDEV ppdev, PSIZEL surf, ULONG alignflag, POFM_CALLBACK pcallback); typedef BOOL (*FREEOFFSCNMEMFUNC)(PPDEV ppdev, OFMHDL *hdl); //typedef MCDRVGETENTRYPOINTSFUNC (*CLMCDINITFUNC)(PPDEV);
#endif // def CLMCD_ESCAPE_SUPPORTED
/*-------------------------- STATIC VARIABLES -----------------------------*/
/****************************************************************************
* FUNCTION NAME: DrvEscape() * * DESCRIPTION: Driver escape entry point. * * REVISION HISTORY: * 11/16/95 Benny Ng Initial version ****************************************************************************/ ULONG APIENTRY DrvEscape(SURFOBJ *pso, ULONG iEsc, ULONG cjIn, PVOID pvIn, ULONG cjOut, PVOID pvOut)
{ PPDEV ppdev = (PPDEV) pso->dhpdev; DWORD returnedDataLength = 0; ULONG retval = FALSE;
PMMREG_ACCESS pInMRAccess; PMMREG_ACCESS pMRAccess; BYTE *pbAddr; WORD *pwAddr; DWORD *pdwAddr;
DISPDBG((ESC_DBG_LVL, "DrvEscape-Entry.\n"));
switch (iEsc) {
//
// Prior to using an Escape, an application will ask us
// if we support it first. Return TRUE if we can handle
// the requested escape.
//
case QUERYESCSUPPORT: { DISPDBG((ESC_DBG_LVL, "DrvEscape: QUERY_ESCAPE_SUPPORTED. " "Requested escape is 0x%X.\n", *((ULONG *)pvIn) ));
switch ( *((ULONG *)pvIn) ) { case QUERYESCSUPPORT: case IS_CIRRUS_DRIVER: case GET_VIDEO_MEM_SIZE: case CRTC_READ: case GET_BIOS_VERSION: case GET_PCI_VEN_DEV_ID: case GET_EDID_DATA: #ifdef CLMCD_ESCAPE_SUPPORTED // OpenGL MCD Interface
case MCDFUNCS: #endif
case CIRRUS_ESCAPE_FUNCTION: #if (!(WINNT_VER35)) && DRIVER_5465 // NT 4.0+ and 5465+
case ID_LGPM_SETHWMODULESTATE: case ID_LGPM_GETHWMODULESTATE: #endif
case BIOS_CALL_REQUEST: case GET_CL_MMAP_ADDR: DISPDBG((ESC_DBG_LVL, "DrvEscape: We support the requested escape.\n")); retval = TRUE;
default: DISPDBG((ESC_DBG_LVL, "DrvEscape: We DO NOT support the requested escape.\n")); retval = FALSE; } break;
}; // case QUERYESCSUPPORT
case SET_AGPDATASTREAMING: { DISPDBG((ESC_DBG_LVL, "DrvEscape: SET_AGPDATASTREAMING.\n")); retval = FALSE; if (cjIn == sizeof(BYTE)) { if (DEVICE_IO_CTRL(ppdev->hDriver, IOCTL_SET_AGPDATASTREAMING, pvIn, sizeof(BYTE), NULL, 0, &returnedDataLength, NULL)) { retval = TRUE; }; }; break; } // end case SET_AGPDATASTREAMING
case SET_DDCCONTROLFLAG: { DISPDBG((ESC_DBG_LVL, "DrvEscape: SET_DDCCONTROLFLAG.\n")); retval = FALSE; if (cjIn == sizeof(DWORD)) { if (DEVICE_IO_CTRL(ppdev->hDriver, IOCTL_SET_DDCCONTROLFLAG, pvIn, sizeof(DWORD), NULL, 0, &returnedDataLength, NULL)) { retval = TRUE; }; }; break; } // end case SET_DDCCONTROLFLAG
case SET_NONDDCMONITOR_DATA: { DISPDBG((ESC_DBG_LVL, "DrvEscape: SET_NONDDCMONITOR_DATA.\n")); retval = FALSE; if (cjIn == 128) { if (DEVICE_IO_CTRL(ppdev->hDriver, IOCTL_SET_NONDDCMONITOR_DATA, pvIn, 128, NULL, 0, &returnedDataLength, NULL)) { retval = TRUE; }; }; break; } // end case SET_NONDDCMONITOR_DATA
case SET_NONDDCMONITOR_BRAND: { DISPDBG((ESC_DBG_LVL, "DrvEscape: SET_NONDDCMONITOR_BRAND.\n")); retval = FALSE; if (cjIn > 0) { if (DEVICE_IO_CTRL(ppdev->hDriver, IOCTL_SET_NONDDCMONITOR_BRAND, pvIn, cjIn, NULL, 0, &returnedDataLength, NULL)) { retval = TRUE; }; }; break; } // end case SET_NONDDCMONITOR_BRAND
case SET_NONDDCMONITOR_MODEL: { DISPDBG((ESC_DBG_LVL, "DrvEscape: SET_NONDDCMONITOR_MODEL.\n")); retval = FALSE; if (cjIn > 0) { if (DEVICE_IO_CTRL(ppdev->hDriver, IOCTL_SET_NONDDCMONITOR_MODEL, pvIn, cjIn, NULL, 0, &returnedDataLength, NULL)) { retval = TRUE; }; }; break; } // end case SET_NONDDCMONITOR_MODEL
case IS_CIRRUS_DRIVER: { DISPDBG((ESC_DBG_LVL, "DrvEscape: IS_CIRRUS_DRIVER.\n")); retval = TRUE; break; } // end case IS_CIRRUS_DRIVER
case GET_VIDEO_MEM_SIZE: { BYTE btmp; PBYTE pOut = (PBYTE) pvOut;
DISPDBG((ESC_DBG_LVL, "DrvEscape: GET_VIDEO_MEM_SIZE.\n")); if (cjOut == sizeof(BYTE)) { btmp = ppdev->lTotalMem/0x10000; *pOut = btmp; retval = TRUE; }; break; } // end case GET_VIDEO_MEM_SIZE
case CRTC_READ: { BYTE bindex; PBYTE pMMReg = (PBYTE) ppdev->pLgREGS_real; PBYTE pIn = (PBYTE) pvIn; PBYTE pOut = (PBYTE) pvOut;
DISPDBG((ESC_DBG_LVL, "DrvEscape: CRTC_READ.\n")); if ((cjIn == sizeof(BYTE)) && (cjOut == sizeof(BYTE))) { bindex = (*pIn) * 4; pMMReg = pMMReg + bindex; *pOut = *pMMReg; retval = TRUE; }; break; } // end case CRTC_READ
case GET_BIOS_VERSION: { DISPDBG((ESC_DBG_LVL, "DrvEscape: GET_BIOS_VERSION.\n")); if (cjOut == sizeof(WORD)) { if (DEVICE_IO_CTRL(ppdev->hDriver, IOCTL_GET_BIOS_VERSION, NULL, 0, pvOut, sizeof(WORD), &returnedDataLength, NULL)) { retval = TRUE; }; }; break; } // end case GET_BIOS_VERSION
case GET_PCI_VEN_DEV_ID: { ULONG ultmp; PULONG pOut = (PULONG) pvOut;
DISPDBG((ESC_DBG_LVL, "DrvEscape: GET_PCI_VEN_DEV_ID.\n")); if (cjOut == sizeof(DWORD)) { ultmp = ppdev->dwLgVenID; ultmp = (ultmp << 16) | (ppdev->dwLgDevID & 0xFFFF); *pOut = ultmp; retval = TRUE; }; break; } // end case GET_PCI_VEN_DEV_ID
case GET_EDID_DATA: { DISPDBG((ESC_DBG_LVL, "DrvEscape: GET_EDID_DATA.\n")); if (cjOut == 132) { if (DEVICE_IO_CTRL(ppdev->hDriver, IOCTL_GET_EDID_DATA, NULL, 0, pvOut, 132, &returnedDataLength, NULL)) { retval = TRUE; }; }; break; } // end case GET_EDID_DATA
#ifdef CLMCD_ESCAPE_SUPPORTED
// OpenGL Mini-Client Driver Interface
case MCDFUNCS: { DISPDBG((ESC_DBG_LVL, "DrvEscape-MCDFUNC start\n")); if (!ppdev->hMCD) { WCHAR uDllName[50]; UCHAR dllName[50]; ULONG nameSize;
{ HANDLE hCLMCD;
// // load and initialize the dll containing MCD support for display driver
// EngMultiByteToUnicodeN(uDllName, sizeof(uDllName), &nameSize,
// CLMCDDLLNAME, sizeof(CLMCDDLLNAME));
//
// if (hCLMCD = EngLoadImage(uDllName))
{
// CLMCDINITFUNC pCLMCDInit = EngFindImageProcAddress(hCLMCD,
// (LPSTR)CLMCDINITFUNCNAME);
// if (pCLMCDInit)
{
// Enable 3D engine - if enable fails, don't continue loading MCD dll
if (LgPM_SetHwModuleState(ppdev, MOD_3D, ENABLE)) {
DRVENABLEDATA temp;
// MCD dispdriver dll init returns ptr to MCDrvGetEntryPoints,
// which is passed to init proc for MCD helper lib a few lines down...
// MCDRVGETENTRYPOINTSFUNC pMCDGetEntryPoints = (*pCLMCDInit)(ppdev);
MCDRVGETENTRYPOINTSFUNC pMCDGetEntryPoints = CLMCDInit(ppdev);
ppdev->pAllocOffScnMem = AllocOffScnMem; ppdev->pFreeOffScnMem = FreeOffScnMem;
// after MCD display driver dll loaded, load MCD helper lib (MSFT supplied)
EngMultiByteToUnicodeN(uDllName, sizeof(uDllName), &nameSize, MCDENGDLLNAME, sizeof(MCDENGDLLNAME));
if (ppdev->hMCD = EngLoadImage(uDllName)) { MCDENGINITFUNC pMCDEngInit = EngFindImageProcAddress(ppdev->hMCD, (LPSTR)MCDENGINITFUNCNAME);
if (pMCDEngInit) { (*pMCDEngInit)(pso, pMCDGetEntryPoints); ppdev->pMCDFilterFunc = EngFindImageProcAddress(ppdev->hMCD, (LPSTR)MCDENGESCFILTERNAME);
} }
} } } }
}
if (ppdev->pMCDFilterFunc) { #ifdef DBGBRK
DBGBREAKPOINT(); #endif
if ((*ppdev->pMCDFilterFunc)(pso, iEsc, cjIn, pvIn, cjOut, pvOut, &retval)) { DISPDBG((ESC_DBG_LVL, "DrvEscape-MCDFilterFunc SUCCESS, retval=%x\n",retval)); return retval; } DISPDBG((ESC_DBG_LVL, "DrvEscape-MCDFilterFunc FAILED\n")); } } break; #endif // def CLMCD_ESCAPE_SUPPORTED
case CIRRUS_ESCAPE_FUNCTION: { DISPDBG((ESC_DBG_LVL, "DrvEscape: CIRRUS_ESCAPE_FUNCTION.\n")); if ((cjIn == sizeof(VIDEO_X86_BIOS_ARGUMENTS)) && (cjOut == sizeof(VIDEO_X86_BIOS_ARGUMENTS))) { VIDEO_POWER_MANAGEMENT inPM; BOOL bCallFail = FALSE;
VIDEO_X86_BIOS_ARGUMENTS *pinregs = (VIDEO_X86_BIOS_ARGUMENTS *) pvIn; VIDEO_X86_BIOS_ARGUMENTS *poutregs = (VIDEO_X86_BIOS_ARGUMENTS *) pvOut;
poutregs->Eax = 0x014F; poutregs->Ebx = pinregs->Ebx; poutregs->Ecx = pinregs->Ecx; if (pinregs->Eax == 0x4F10) { if (pinregs->Ebx == 0x0001) inPM.PowerState = VideoPowerOn; else if (pinregs->Ebx == 0x0101) inPM.PowerState = VideoPowerStandBy; else if (pinregs->Ebx == 0x0201) inPM.PowerState = VideoPowerSuspend; else if (pinregs->Ebx == 0x0401) inPM.PowerState = VideoPowerOff; else bCallFail = TRUE;
if (!bCallFail) { if (DEVICE_IO_CTRL(ppdev->hDriver, IOCTL_VIDEO_SET_POWER_MANAGEMENT, &inPM, sizeof(VIDEO_POWER_MANAGEMENT), NULL, 0, &returnedDataLength, NULL)) { poutregs->Eax = 0x004F; retval = TRUE; }; }; // endif (!bCallFail)
}; // endif (pinregs->Eax == 0x4F10)
};
break; }; // case CIRRUS_ESCAPE_FUNCTION
#if (!(WINNT_VER35)) && DRIVER_5465 // NT 4.0+ and 5465+
case ID_LGPM_SETHWMODULESTATE: { ULONG state; DISPDBG((ESC_DBG_LVL, "DrvEscape: ID_LGPM_SETHWMODULESTATE.\n"));
if (ppdev->dwLgDevID >= CL_GD5465) { if ((cjIn == sizeof(LGPM_IN_STRUCT)) && (cjOut == sizeof(LGPM_OUT_STRUCT))) { LGPM_IN_STRUCT *pIn = (LGPM_IN_STRUCT *) pvIn; LGPM_OUT_STRUCT *pOut = (LGPM_OUT_STRUCT *) pvOut;
retval = TRUE;
pOut->status = FALSE; pOut->retval = 0;
pOut->status = LgPM_SetHwModuleState(ppdev, pIn->arg1, pIn->arg2); }; }; // endif (ppdev->dwLgDevID >= CL_GD5465)
break; }; // case ID_LGPM_SETHWMODULESTATE
#endif
#if (!(WINNT_VER35)) && DRIVER_5465 // NT 4.0+ and 5465+
case ID_LGPM_GETHWMODULESTATE: { ULONG state; DISPDBG((ESC_DBG_LVL, "DrvEscape: ID_LGPM_GETHWMODULESTATE.\n"));
if (ppdev->dwLgDevID >= CL_GD5465) { if ((cjIn == sizeof(LGPM_IN_STRUCT)) && (cjOut == sizeof(LGPM_OUT_STRUCT))) { LGPM_IN_STRUCT *pIn = (LGPM_IN_STRUCT *) pvIn; LGPM_OUT_STRUCT *pOut = (LGPM_OUT_STRUCT *) pvOut;
retval = TRUE;
pOut->status = FALSE; pOut->retval = 0;
pOut->status = LgPM_GetHwModuleState(ppdev, pIn->arg1, &state); pOut->retval = state; };
}; // endif (ppdev->dwLgDevID >= CL_GD5465)
break; }; // case ID_LGPM_GETHWMODULESTATE
#endif
case BIOS_CALL_REQUEST: { if ((cjIn == sizeof(VIDEO_X86_BIOS_ARGUMENTS)) && (cjOut == sizeof(VIDEO_X86_BIOS_ARGUMENTS))) { if (DEVICE_IO_CTRL(ppdev->hDriver, IOCTL_CL_BIOS, pvIn, cjIn, pvOut, cjOut, &returnedDataLength, NULL)) retval = TRUE; };
DISPDBG((ESC_DBG_LVL, "DrvEscape-BIOS_CALL_REQUEST\n"));
#ifdef DBGBRK
DbgBreakPoint(); #endif
break; }; // end case BIOS_CALL_REQUEST
case GET_CL_MMAP_ADDR: { DISPDBG((ESC_DBG_LVL, "DrvEscape: GET_CL_MMAP_ADDR.\n")); if ((cjIn != sizeof(MMREG_ACCESS)) || (cjOut != sizeof(MMREG_ACCESS))) break;
pInMRAccess = (MMREG_ACCESS *) pvIn; pMRAccess = (MMREG_ACCESS *) pvOut;
pMRAccess->Offset = pInMRAccess->Offset; pMRAccess->ReadVal = pInMRAccess->ReadVal; pMRAccess->WriteVal = pInMRAccess->WriteVal; pMRAccess->RdWrFlag = pInMRAccess->RdWrFlag; pMRAccess->AccessType = pInMRAccess->AccessType;
pbAddr = (BYTE *) ppdev->pLgREGS; pbAddr = pbAddr + pMRAccess->Offset;
if (pMRAccess->RdWrFlag == READ_OPR) // Read operation
{ pMRAccess->WriteVal = 0; retval = TRUE;
if (pMRAccess->AccessType == BYTE_ACCESS) { pMRAccess->ReadVal = (*pbAddr) & 0xFF; } else if (pMRAccess->AccessType == WORD_ACCESS) { pwAddr = (WORD *)pbAddr; pMRAccess->ReadVal = (*pwAddr) & 0xFFFF; } else if (pMRAccess->AccessType == DWORD_ACCESS) { pdwAddr = (DWORD *)pbAddr; pMRAccess->ReadVal = *pdwAddr; } else { pMRAccess->ReadVal = 0; retval = FALSE; }; } else if (pMRAccess->RdWrFlag == WRITE_OPR) // Write operation
{ retval = TRUE;
if (pMRAccess->AccessType == BYTE_ACCESS) { pMRAccess->ReadVal = (*pbAddr) & 0xFF; *pbAddr = (BYTE) (pMRAccess->WriteVal & 0xFF); } else if (pMRAccess->AccessType == WORD_ACCESS) { pwAddr = (WORD *)pbAddr; pMRAccess->ReadVal = (*pwAddr) & 0xFFFF; *pwAddr = (WORD) (pMRAccess->WriteVal & 0xFFFF); } else if (pMRAccess->AccessType == DWORD_ACCESS) { pdwAddr = (DWORD *)pbAddr; pMRAccess->ReadVal = *pdwAddr; *pdwAddr = pMRAccess->WriteVal; } else { pMRAccess->ReadVal = 0; pMRAccess->WriteVal = 0; retval = FALSE; }; };
DISPDBG((ESC_DBG_LVL, "DrvEscape-GET_CL_MMAP_ADDR\n")); DISPDBG((ESC_DBG_LVL, "DrvEscape-rd=%x, wr=%x\n", pMRAccess->ReadVal, pMRAccess->WriteVal)); #ifdef DBGBRK
DbgBreakPoint(); #endif
break; }; // IOCTL_CL_GET_MMAP_ADDR
default:
DISPDBG((ESC_DBG_LVL, "DrvEscape: default - Escape not handled.\n")); DISPDBG((ESC_DBG_LVL, "DrvEscape: Requested escape is 0x%X.\n",iEsc )); DISPDBG((ESC_DBG_LVL, "DrvEscape: Returning FALSE.\n"));
retval = FALSE; break;
}; // end switch
DISPDBG((ESC_DBG_LVL, "DrvEscape-Exit.\n"));
return (retval); }
|