229 lines
5.9 KiB
C
229 lines
5.9 KiB
C
/******************************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
|
||
|