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
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
|
|
|