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.
229 lines
6.1 KiB
229 lines
6.1 KiB
/******************************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
|
|
|