284 lines
7.2 KiB
C
284 lines
7.2 KiB
C
/****************************************************************************
|
||
*****************************************************************************
|
||
*
|
||
* ******************************************
|
||
* * 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
|
||
|