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