windows-nt/Source/XPSP1/NT/drivers/video/ms/cirrus/mini/callback.c
2020-09-26 16:20:57 +08:00

728 lines
17 KiB
C

/*++
Copyright (c) 1996-1997 Microsoft Corporation.
Copyright (c) 1996-1997 Cirrus Logic, Inc.,
Module Name:
C A L L B A C K . C
Abstract:
This routine contains various callback routines. e.g.,
- Gamma correction information from the following NT 4.0 registry.
Registry subdirectory : System\CurrentControlSet\Services\cirrus\Device0
Keys : "G Gamma", and "G Contrast"
- Callback routines for the DDC and Non-DDC monitors.
- IBM specific callback routine to get rid of 1024x768x16bpp 85Hz.
Registry subdirectory : System\CurrentControlSet\Services\cirrus\Device0
Keys : "OemModeOff"
Environment:
Kernel mode only
Notes:
*
* chu01 12-16-96 : Color correction start coding.
* chu02 03-26-97 : Get rid of 1024x768x16bpp ( Mode 0x74 ) 85H for IBM only.
*
*
--*/
//---------------------------------------------------------------------------
// HEADER FILES
//---------------------------------------------------------------------------
//#include <ntddk.h>
#include <dderror.h>
#include <devioctl.h>
#include <miniport.h> // I added
#include "clmini.h"
#include <ntddvdeo.h>
#include <video.h>
#include "cirrus.h"
extern UCHAR EDIDBuffer[] ;
//---------------------------------------------------------------------------
// FUNCTION PROTOTYPE
//---------------------------------------------------------------------------
VP_STATUS
VgaGetGammaFactor(
PHW_DEVICE_EXTENSION HwDeviceExtension,
PGAMMA_VALUE value,
ULONG ValueLength,
PULONG OutputSize
);
VP_STATUS
VgaGetContrastFactor(
PHW_DEVICE_EXTENSION HwDeviceExtension,
PCONTRAST_VALUE value,
ULONG ValueLength,
PULONG OutputSize
);
VP_STATUS GetGammaKeyInfoFromReg(
PHW_DEVICE_EXTENSION HwDeviceExtension
) ;
VP_STATUS GetContrastKeyInfoFromReg(
PHW_DEVICE_EXTENSION HwDeviceExtension
) ;
VP_STATUS GetGammaCorrectInfoCallBack (
PVOID HwDeviceExtension,
PVOID Context,
PWSTR ValueName,
PVOID ValueData,
ULONG ValueLength
) ;
VP_STATUS
CirrusDDC2BRegistryCallback(
PVOID HwDeviceExtension,
PVOID Context,
PWSTR ValueName,
PVOID ValueData,
ULONG ValueLength
);
VP_STATUS
CirrusNonDDCRegistryCallback(
PVOID HwDeviceExtension,
PVOID Context,
PWSTR ValueName,
PVOID ValueData,
ULONG ValueLength
);
BOOLEAN
IOCallback(
PHW_DEVICE_EXTENSION HwDeviceExtension
) ;
VP_STATUS
CirrusGetDeviceDataCallback(
PVOID HwDeviceExtension,
PVOID Context,
VIDEO_DEVICE_DATA_TYPE DeviceDataType,
PVOID Identifier,
ULONG IdentifierLength,
PVOID ConfigurationData,
ULONG ConfigurationDataLength,
PVOID ComponentInformation,
ULONG ComponentInformationLength
);
// chu02
VP_STATUS
GetOemModeOffInfoCallBack (
PVOID HwDeviceExtension,
PVOID Context,
PWSTR ValueName,
PVOID ValueData,
ULONG ValueLength
);
#if defined(ALLOC_PRAGMA)
#pragma alloc_text(PAGE,GetGammaKeyInfoFromReg)
#pragma alloc_text(PAGE,GetContrastKeyInfoFromReg)
#pragma alloc_text(PAGE,GetGammaCorrectInfoCallBack)
#pragma alloc_text(PAGE,VgaGetGammaFactor)
#pragma alloc_text(PAGE,VgaGetContrastFactor)
#pragma alloc_text(PAGE,CirrusDDC2BRegistryCallback)
#pragma alloc_text(PAGE,CirrusNonDDCRegistryCallback)
#pragma alloc_text(PAGE,CirrusGetDeviceDataCallback)
#pragma alloc_text(PAGE,GetOemModeOffInfoCallBack) // chu02
#endif
UCHAR GammaInfo[4] ;
UCHAR ModesExclude[4] ; // chu02
OEMMODE_EXCLUDE ModeExclude = { 0, 0, 1 } ; // chu02
//---------------------------------------------------------------------------
//
// Function: Get Gamma factor
//
// Input:
// None
//
// Output:
// NO_ERROR: successful; otherwise: fail
//
//---------------------------------------------------------------------------
VP_STATUS VgaGetGammaFactor(
PHW_DEVICE_EXTENSION HwDeviceExtension,
PGAMMA_VALUE value,
ULONG ValueLength,
PULONG OutputSize
)
{
VP_STATUS status ;
int i ;
VideoDebugPrint((2, "VgaGetGammaFactor\n")) ;
if ( ValueLength < (*OutputSize = sizeof(PGAMMA_VALUE)) )
return ERROR_INSUFFICIENT_BUFFER;
status = GetGammaKeyInfoFromReg(HwDeviceExtension) ;
if (status == NO_ERROR)
{
for (i = 0; i < 4; i++)
value->value[i] = GammaInfo[i] ;
}
else if (status == ERROR_INVALID_PARAMETER)
{
//
// If no subkey exists, we assign the default value. Otherwise the
// system would fail.
//
for (i = 0; i < 4; i++)
value->value[i] = 0x7f ;
status = NO_ERROR ;
}
VideoDebugPrint((1, "Gamma value = %lx\n", *value)) ;
return status ;
} // VgaGetGammaFactor
//---------------------------------------------------------------------------
//
// Function: Get Contrast factor
//
// Input:
// None
//
// Output:
// NO_ERROR: successful; otherwise: fail
//
//---------------------------------------------------------------------------
VP_STATUS VgaGetContrastFactor(
PHW_DEVICE_EXTENSION HwDeviceExtension,
PCONTRAST_VALUE value,
ULONG ValueLength,
PULONG OutputSize
)
{
VP_STATUS status ;
int i ;
VideoDebugPrint((2, "VgaGetContrastFactor\n")) ;
if ( ValueLength < (*OutputSize = sizeof(PCONTRAST_VALUE)) ) {
return ERROR_INSUFFICIENT_BUFFER;
}
status = GetContrastKeyInfoFromReg(HwDeviceExtension) ;
if (status == NO_ERROR)
{
for (i = 0; i < 4; i++)
value->value[i] = GammaInfo[i] ;
}
else if (status == ERROR_INVALID_PARAMETER)
{
//
// If no subkey exists, we assign the default value. Otherwise the
// system would fail.
//
for (i = 0; i < 4; i++)
value->value[i] = 0x80 ;
status = NO_ERROR ;
}
VideoDebugPrint((1, "Contrast value = %lx\n", *value)) ;
return status ;
} // VgaGetContrastFactor
//---------------------------------------------------------------------------
//
// Function: Get Gamma Key information from data registry.
//
// Input:
// None
//
// Output:
// NO_ERROR: successful; otherwise: fail
//
//---------------------------------------------------------------------------
VP_STATUS GetGammaKeyInfoFromReg(
PHW_DEVICE_EXTENSION HwDeviceExtension
)
{
VP_STATUS status ;
VideoDebugPrint((2, "GetGammaKeyInfoFromReg\n")) ;
status = VideoPortGetRegistryParameters(HwDeviceExtension,
L"G Gamma",
FALSE,
GetGammaCorrectInfoCallBack,
NULL) ;
if (status != NO_ERROR)
{
VideoDebugPrint((1, "Fail to access Gamma key info from registry\n"));
}
return status ;
} // GetGammaKeyInfoFromReg
//---------------------------------------------------------------------------
//
// Function: Get Contrast Key information from data registry.
//
// Input:
// None
//
// Output:
// NO_ERROR: successful; otherwise: fail
//
//---------------------------------------------------------------------------
VP_STATUS GetContrastKeyInfoFromReg(
PHW_DEVICE_EXTENSION HwDeviceExtension
)
{
VP_STATUS status ;
VideoDebugPrint((2, "GetContrastKeyInfoFromReg\n")) ;
status = VideoPortGetRegistryParameters(HwDeviceExtension,
L"G Contrast",
FALSE,
GetGammaCorrectInfoCallBack,
NULL) ;
if (status != NO_ERROR)
{
VideoDebugPrint((1, "Fail to access Contrast key info from registry\n"));
}
return status ;
} // GetContrastKeyInfoFromReg
//---------------------------------------------------------------------------
//
// Function: Get Gamma coorrection information from data registry.
//
// Input:
// None
//
// Output:
// NO_ERROR: successful ; otherwise: fail
//
//---------------------------------------------------------------------------
VP_STATUS
GetGammaCorrectInfoCallBack (
PVOID HwDeviceExtension,
PVOID Context,
PWSTR ValueName,
PVOID ValueData,
ULONG ValueLength
)
/*++
Routine Description:
This routine get the desired info from data registry.
Arguments:
HwDeviceExtension - Supplies a pointer to the miniport's device extension.
Context - Context value passed to the get registry paramters routine.
ValueName - Name of the value requested.
ValueData - Pointer to the requested data.
ValueLength - Length of the requested data.
Return Value:
returns NO_ERROR if the paramter was TRUE.
returns ERROR_INVALID_PARAMETER otherwise.
--*/
{
VideoDebugPrint((2, "GetGammaCorrectInfoCallBack\n"));
if (ValueLength == 0x04)
{
VideoPortMoveMemory (GammaInfo, ValueData, ValueLength) ;
return NO_ERROR ;
}
else
{
return ERROR_INVALID_PARAMETER ;
}
} // GetGammaCorrectInfoCallBack
//---------------------------------------------------------------------------
//
// Function:
//
// Input:
// None
//
// Output:
// NO_ERROR: successful ; otherwise: fail
//
//---------------------------------------------------------------------------
VP_STATUS
CirrusDDC2BRegistryCallback(
PVOID HwDeviceExtension,
PVOID Context,
PWSTR ValueName,
PVOID ValueData,
ULONG ValueLength
)
/*++
Routine Description:
This routine determines if the alternate register set was requested via
the registry.
Arguments:
HwDeviceExtension - Supplies a pointer to the miniport's device extension.
Context - Context value passed to the get registry paramters routine.
ValueName - Name of the value requested.
ValueData - Pointer to the requested data.
ValueLength - Length of the requested data.
Return Value:
returns NO_ERROR if the paramter was TRUE.
returns ERROR_INVALID_PARAMETER otherwise.
--*/
{
PULONG pManuID = (PULONG)&EDIDBuffer[8];
if (ValueLength &&
((*((PULONG)ValueData)) == *pManuID)) {
return NO_ERROR;
} else {
return ERROR_INVALID_PARAMETER;
}
} // CirrusDDC2BRegistryCallback
//---------------------------------------------------------------------------
//
// Function:
// CirrusNonDDCRegistryCallback
//
// Input:
// None
//
// Output:
// NO_ERROR: successful ; otherwise: fail
//
//---------------------------------------------------------------------------
VP_STATUS
CirrusNonDDCRegistryCallback(
PVOID HwDeviceExtension,
PVOID Context,
PWSTR ValueName,
PVOID ValueData,
ULONG ValueLength
)
/*++
Routine Description:
This routine determines if the alternate register set was requested via
the registry.
Arguments:
HwDeviceExtension - Supplies a pointer to the miniport's device extension.
Context - Context value passed to the get registry paramters routine.
ValueName - Name of the value requested.
ValueData - Pointer to the requested data.
ValueLength - Length of the requested data.
Return Value:
returns NO_ERROR if the paramter was TRUE.
returns ERROR_INVALID_PARAMETER otherwise.
--*/
{
if(ValueLength &&
ValueLength == 128 )
{
VideoPortMoveMemory(EDIDBuffer, ValueData, ValueLength);
return NO_ERROR;
}
else
return ERROR_INVALID_PARAMETER;
} // CirrusNonDDCRegistryCallback
//---------------------------------------------------------------------------
//
// Function:
// Perform an IO operation during display enable.
//
// Input:
// HwDeviceExtension - Pointer to the miniport driver's device extension.
//
// Output:
// The routine always returns TRUE.
//
//---------------------------------------------------------------------------
BOOLEAN
IOCallback(
PHW_DEVICE_EXTENSION HwDeviceExtension
)
{
ULONG InputStatusReg;
//
// Figure out if color/mono switchable registers are at 3BX or 3DX.
//
if (VideoPortReadPortUchar (HwDeviceExtension->IOAddress +
MISC_OUTPUT_REG_READ_PORT) & 0x01)
InputStatusReg = INPUT_STATUS_1_COLOR;
else
InputStatusReg = INPUT_STATUS_1_MONO;
//
// Guarantee that the display is in display mode
//
while (0x1 & VideoPortReadPortUchar(HwDeviceExtension->IOAddress
+ InputStatusReg));
//
// Perform the IO operation
//
VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
HwDeviceExtension->DEPort,
HwDeviceExtension->DEValue);
return TRUE;
} // IOCallback
// chu02
//---------------------------------------------------------------------------
//
// Function: Get rid of one mode, specific to IBM only
// - 1024x768x16bpp, 85Hz ( mode 0x74 )
//
// Input:
// None
//
// Output:
// NO_ERROR: successful ; otherwise: fail
//
//---------------------------------------------------------------------------
VP_STATUS
GetOemModeOffInfoCallBack (
PVOID HwDeviceExtension,
PVOID Context,
PWSTR ValueName,
PVOID ValueData,
ULONG ValueLength
)
/*++
Routine Description:
This routine get the desired info from data registry.
Arguments:
HwDeviceExtension - Supplies a pointer to the miniport's device extension.
Context - Context value passed to the get registry paramters routine.
ValueName - Name of the value requested.
ValueData - Pointer to the requested data.
ValueLength - Length of the requested data.
Return Value:
returns NO_ERROR if the paramter was TRUE.
returns ERROR_INVALID_PARAMETER otherwise.
--*/
{
VideoDebugPrint((2, "GetOemModeOffInfoCallBack\n"));
if (ValueLength == 0x04)
{
VideoPortMoveMemory (ModesExclude, ValueData, ValueLength) ;
ModeExclude.refresh = (UCHAR)ModesExclude[0] ;
ModeExclude.mode = (UCHAR)ModesExclude[1] ;
return NO_ERROR ;
}
else
{
return ERROR_INVALID_PARAMETER ;
}
} // GetOemModeOffInfoCallBack
//---------------------------------------------------------------------------
//
// Function:
// Callback routine for the VideoPortGetDeviceData function.
//
// Input:
// HwDeviceExtension - Pointer to the miniport drivers device extension.
// Context - Context value passed to the VideoPortGetDeviceData function.
// DeviceDataType - The type of data that was requested in
// VideoPortGetDeviceData.
// Identifier - Pointer to a string that contains the name of the device,
// as setup by the ROM or ntdetect.
// IdentifierLength - Length of the Identifier string.
// ConfigurationData - Pointer to the configuration data for the device or
// BUS.
// ConfigurationDataLength - Length of the data in the configurationData
// field.
// ComponentInformation - Undefined.
// ComponentInformationLength - Undefined.
//
// Output:
// Returns NO_ERROR if the function completed properly.
// Returns ERROR_DEV_NOT_EXIST if we did not find the device.
// Returns ERROR_INVALID_PARAMETER otherwise.
//
//---------------------------------------------------------------------------
VP_STATUS
CirrusGetDeviceDataCallback(
PVOID HwDeviceExtension,
PVOID Context,
VIDEO_DEVICE_DATA_TYPE DeviceDataType,
PVOID Identifier,
ULONG IdentifierLength,
PVOID ConfigurationData,
ULONG ConfigurationDataLength,
PVOID ComponentInformation,
ULONG ComponentInformationLength
)
/*++
Routine Description:
Arguments:
HwDeviceExtension - Pointer to the miniport drivers device extension.
Context - Context value passed to the VideoPortGetDeviceData function.
DeviceDataType - The type of data that was requested in
VideoPortGetDeviceData.
Identifier - Pointer to a string that contains the name of the device,
as setup by the ROM or ntdetect.
IdentifierLength - Length of the Identifier string.
ConfigurationData - Pointer to the configuration data for the device or
BUS.
ConfigurationDataLength - Length of the data in the configurationData
field.
ComponentInformation - Undefined.
ComponentInformationLength - Undefined.
Return Value:
Returns NO_ERROR if the function completed properly.
Returns ERROR_DEV_NOT_EXIST if we did not find the device.
Returns ERROR_INVALID_PARAMETER otherwise.
--*/
{
PWCHAR identifier = Identifier;
PVIDEO_PORT_CONFIG_INFO ConfigInfo = (PVIDEO_PORT_CONFIG_INFO) Context;
PHW_DEVICE_EXTENSION hwDeviceExtension = HwDeviceExtension;
switch (DeviceDataType) {
case VpMachineData:
//
// The caller assumes no-error mean that this machine was found, and
// then memory mapped IO will be disabled.
//
// All other machine types must return an error.
//
if (VideoPortCompareMemory(L"TRICORDES",
Identifier,
sizeof(L"TRICORDES")) ==
sizeof(L"TRICORDES"))
{
return NO_ERROR;
}
break;
default:
VideoDebugPrint((2, "Cirrus: callback has bad device type\n"));
}
return ERROR_INVALID_PARAMETER;
} // CirrusGetDeviceDataCallback