Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

283 lines
7.2 KiB

/****************************************************************************
*****************************************************************************
*
* ******************************************
* * Copyright (c) 1995, Cirrus Logic, Inc. *
* * All Rights Reserved *
* ******************************************
*
* PROJECT: Laguna I (CL-GD5462) -
*
* FILE: sync.c
*
* Initial AUTHOR: Benny Ng
* Major re-write: Noel VanHook
*
* DESCRIPTION:
* This module contains the implementation of DrvSynchronize()
* routine.
*
* MODULES:
* DrvSynchronize()
*
* REVISION HISTORY:
* 7/06/95 Benny Ng Initial version
*
* $Log: X:/log/laguna/nt35/displays/cl546x/sync.c $
*
* Rev 1.13 22 Apr 1997 11:06:36 noelv
* Removed frame buffer cache invalidate since FB cache is disabled.
*
* Rev 1.12 09 Apr 1997 10:50:06 SueS
* Changed sw_test_flag to pointer_switch.
*
* Rev 1.11 08 Apr 1997 12:32:00 einkauf
*
* add SYNC_W_3D to coordinate MCD/2D hw access
*
* Rev 1.10 04 Feb 1997 13:52:36 noelv
* Fixed typo.
*
* Rev 1.9 04 Feb 1997 10:50:56 noelv
* Added workaround for 5465 direct frame buffer readback bug.
*
* Rev 1.8 26 Nov 1996 10:45:48 SueS
* Changed WriteLogFile parameters for buffering.
*
* Rev 1.7 13 Nov 1996 17:05:34 SueS
* Changed WriteFile calls to WriteLogFile.
*
* Rev 1.6 20 Aug 1996 11:04:32 noelv
* Bugfix release from Frido 8-19-96
*
* Rev 1.1 15 Aug 1996 11:39:20 frido
* Added precompiled header.
*
* Rev 1.0 14 Aug 1996 17:16:32 frido
* Initial revision.
*
* Rev 1.5 07 Aug 1996 08:30:56 noelv
* added comments
*
* Rev 1.4 20 Mar 1996 16:09:44 noelv
*
* Updated data logging
*
* Rev 1.3 05 Mar 1996 11:59:18 noelv
* Frido version 19
*
* Rev 1.1 20 Jan 1996 01:11:38 frido
*
* Rev 1.6 15 Jan 1996 17:01:34 NOELV
*
* Rev 1.5 12 Jan 1996 10:54:30 NOELV
* Totally re-written.
*
* Rev 1.4 22 Sep 1995 10:24:58 NOELV
* Re-aranged the order of the tests.
*
* Rev 1.1 19 Sep 1995 16:31:02 NOELV
* Ported to rev AB.
*
* Rev 1.0 25 Jul 1995 11:23:22 NOELV
* Initial revision.
*
* Rev 1.1 07 Jul 1995 10:37:22 BENNYN
* Initial version
*
* Rev 1.0 06 Jul 1995 14:55:48 BENNYN
* Initial revision.
*
****************************************************************************
****************************************************************************/
/*----------------------------- INCLUDES ----------------------------------*/
#include "precomp.h"
/*----------------------------- DEFINES -----------------------------------*/
#define DBGDISP
#define MAX_CNT 0x7FFFFF
#define BLT_RDY_BIT 0x1L
#define BLT_FLAG_BIT 0x2L
#define WF_EMPTY_BIT 0x4L
#define BITS_CHK (BLT_RDY_BIT | BLT_FLAG_BIT | WF_EMPTY_BIT)
#define ENGINE_IDLE 0
#define SYNC_DBG_LEVEL 0
//
// If data logging is enabled, Prototype the logging files.
//
#if LOG_CALLS
void LogSync(
int acc,
PPDEV ppdev,
int count);
//
// If data logging is not enabled, compile out the calls.
//
#else
#define LogSync(acc, ppdev, count)
#endif
/****************************************************************************
* FUNCTION NAME: DrvSynchronize()
*
* REVISION HISTORY:
* 7/06/95 Benny Ng Initial version
****************************************************************************/
VOID DrvSynchronize(DHPDEV dhpdev,
RECTL *prcl)
{
PPDEV ppdev = (PPDEV) dhpdev;
SYNC_W_3D(ppdev);
//
// NOTE: We also call this function from within the driver.
// When we do, we don't bother to set prcl. If you need to use
// prcl here, you need to find where we call DrvSynchronize, and
// set prcl to a real value.
//
//
// Make the first chip test as fast as possible. If the chip
// is already idle, we want to return to NT as fast as possible.
//
if ( LLDR_SZ (grSTATUS) == ENGINE_IDLE)
{
LogSync(0, ppdev, 0);
}
//
// Alright, the chip isn't idle yet.
// Go into a wait loop.
//
else
{
ULONG ultmp;
LONG delaycnt = 1;
while (1)
{
ultmp = LLDR_SZ (grSTATUS);
if ((ultmp & BITS_CHK) == ENGINE_IDLE)
{
LogSync(0, ppdev, delaycnt);
break;
}
if (delaycnt++ >= MAX_CNT)
{
//
// The chip never went idle. This most likely means the chip
// is totally dead. In a checked build we will halt with a
// debug message.
// In a free build we will return to NT and hope for the best.
//
LogSync(1, ppdev, 0);
RIP("Chip failed to go idle in DrvSynchronize!\n");
break;
}
}
}
//
// We can skp this 'cause frame buffer caching is broken.
//
#if 0
#if DRIVER_5465
{
//
// The 5465 Rev AA and Rev AB have a bug.
// We must invalidate the frame buffer cache before direct
// frame buffer accesses will work correctly.
// We do this with two DWORD reads of the frame buffer,
// 8 QWORDS apart.
//
DWORD temp;
temp = * ((volatile DWORD *) (ppdev->pjScreen));
temp = * ((volatile DWORD *) (ppdev->pjScreen+64));
}
#endif
#endif
return;
}
// meant to be called only from .asm routines - .c routines use SYNC_W_3D macro
VOID Sync_w_3d_proc(PPDEV ppdev)
{
SYNC_W_3D(ppdev);
}
#if LOG_CALLS
// ============================================================================
//
// Everything from here down is for data logging and is not used in the
// production driver.
//
// ============================================================================
// ****************************************************************************
//
// LogPaint()
// This routine is called only from DrvPaint()
// Dump information to a file about what is going on in DrvPaint land.
//
// ****************************************************************************
void LogSync(
int acc,
PPDEV ppdev,
int count)
{
char buf[256];
int i;
#if ENABLE_LOG_SWITCH
if (pointer_switch == 0) return;
#endif
i = sprintf(buf,"DrvSync: ");
WriteLogFile(ppdev->pmfile, buf, i, ppdev->TxtBuff, &ppdev->TxtBuffIndex);
switch(acc)
{
case 0: // Accelerated
i = sprintf(buf,"Wait %d Idle ",count);
break;
case 1: // Punted
i = sprintf(buf, "Never idle ");
break;
default:
i = sprintf(buf, "PUNT unknown ");
break;
}
WriteLogFile(ppdev->pmfile, buf, i, ppdev->TxtBuff, &ppdev->TxtBuffIndex);
i = sprintf(buf,"\r\n");
WriteLogFile(ppdev->pmfile, buf, i, ppdev->TxtBuff, &ppdev->TxtBuffIndex);
}
#endif