|
|
/******************************Module*Header*******************************\
* Module Name: debug.c * * Debug helper routines. * * Copyright (c) 1992-1995 Microsoft Corporation * \**************************************************************************/
#include "precomp.h"
#if DBG
////////////////////////////////////////////////////////////////////////////
// DEBUGGING INITIALIZATION CODE
//
// When you're bringing up your display for the first time, you can
// recompile with 'DebugLevel' set to 100. That will cause absolutely
// all DISPDBG messages to be displayed on the kernel debugger (this
// is known as the "PrintF Approach to Debugging" and is about the only
// viable method for debugging driver initialization code).
LONG DebugLevel = 0; // Set to '100' to debug initialization code
// (the default is '0')
////////////////////////////////////////////////////////////////////////////
LONG gcFifo = 0; // Number of currently free FIFO entries
#define LARGE_LOOP_COUNT 10000000
////////////////////////////////////////////////////////////////////////////
// Miscellaneous Driver Debug Routines
////////////////////////////////////////////////////////////////////////////
/*****************************************************************************
* * Routine Description: * * This function is variable-argument, level-sensitive debug print * routine. * If the specified debug level for the print statement is lower or equal * to the current debug level, the message will be printed. * * Arguments: * * DebugPrintLevel - Specifies at which debugging level the string should * be printed * * DebugMessage - Variable argument ascii c string * * Return Value: * * None. * ***************************************************************************/
VOID DebugPrint( LONG DebugPrintLevel, PCHAR DebugMessage, ... ) { va_list ap; #if TARGET_BUILD <= 351
char buffer[128]; #endif
va_start(ap, DebugMessage);
if (DebugPrintLevel <= DebugLevel) { #if TARGET_BUILD > 351
EngDebugPrint(STANDARD_DEBUG_PREFIX, DebugMessage, ap); EngDebugPrint("", "\n", ap); #else
vsprintf( buffer, DebugMessage, ap ); OutputDebugString( buffer ); OutputDebugString("\n"); #endif
}
va_end(ap);
} // DebugPrint()
/******************************Public*Routine******************************\
* VOID vCheckFifoWrite \**************************************************************************/
VOID vCheckFifoWrite() { gcFifo--; if (gcFifo < 0) { gcFifo = 0; RIP("Incorrect FIFO wait count"); } }
/******************************Public*Routine******************************\
* VOID vI32CheckFifoSpace \**************************************************************************/
VOID vI32CheckFifoSpace( PDEV* ppdev, VOID* pbase, LONG level) { LONG i;
ASSERTDD((level > 0) && (level <= 16), "Illegal wait level"); ASSERTDD((ppdev->iMachType == MACH_IO_32) || (ppdev->iMachType == MACH_MM_32), "Wrong Mach type!");
gcFifo = level;
for (i = LARGE_LOOP_COUNT; i != 0; i--) { if (!(I32_IW(pbase, EXT_FIFO_STATUS) & (0x10000L >> (level)))) return; // There are 'level' entries free
}
RIP("vI32CheckFifoSpace timeout -- The hardware is in a funky state."); }
/******************************Public*Routine******************************\
* VOID vM32CheckFifoSpace \**************************************************************************/
VOID vM32CheckFifoSpace( PDEV* ppdev, VOID* pbase, LONG level) { LONG i;
ASSERTDD((level > 0) && (level <= 16), "Illegal wait level"); ASSERTDD(ppdev->iMachType == MACH_MM_32, "Wrong Mach type!");
gcFifo = level;
for (i = LARGE_LOOP_COUNT; i != 0; i--) { if (!(M32_IW(pbase, EXT_FIFO_STATUS) & (0x10000L >> (level)))) return; // There are 'level' entries free
}
RIP("vM32CheckFifoSpace timeout -- The hardware is in a funky state."); }
/******************************Public*Routine******************************\
* VOID vM64CheckFifoSpace \**************************************************************************/
VOID vM64CheckFifoSpace( PDEV* ppdev, VOID* pbase, LONG level) { LONG i;
ASSERTDD((level > 0) && (level <= 16), "Illegal wait level"); ASSERTDD(ppdev->iMachType == MACH_MM_64, "Wrong Mach type!");
gcFifo = level;
for (i = LARGE_LOOP_COUNT; i != 0; i--) { if (!(M64_ID((pbase), FIFO_STAT) & (0x10000L >> (level)))) return; // There are 'level' entries free
}
RIP("vM64CheckFifoSpace timeout -- The hardware is in a funky state."); }
/******************************Public*Routine******************************\
* ULONG ulM64FastFifoCheck \**************************************************************************/
ULONG ulM64FastFifoCheck( PDEV* ppdev, VOID* pbase, LONG level, ULONG ulFifo) { LONG i; ULONG ulFree; LONG cFree;
ASSERTDD((level > 0) && (level <= 16), "Illegal wait level"); ASSERTDD(ppdev->iMachType == MACH_MM_64, "Wrong Mach type!");
i = LARGE_LOOP_COUNT; do { ulFifo = ~M64_ID((pbase), FIFO_STAT); // Invert bits
// Count the number of empty slots:
ulFree = ulFifo; cFree = 0; while (ulFree & 0x8000) { cFree++; ulFree <<= 1; }
// Break if we've been looping a zillion times:
if (--i == 0) { RIP("vM64CheckFifoSpace timeout -- The hardware is in a funky state."); break; }
} while (cFree < level);
gcFifo = cFree;
// Account for the slots we're about to use:
return(ulFifo << level); }
////////////////////////////////////////////////////////////////////////////
#endif // DBG
|