/*
	Copyright (c) 2002, Thomas Kurschel


	Part of Radeon driver
		
	Extended debugging functions
*/


#ifndef __DEBUG_EXT_H__
#define __DEBUG_EXT_H__

// this is a dprintf wrapper
//
// there are three kinds of messages:
//  flow: used to trace execution
//  info: tells things that are important but not an error
//  error: used if something has gone wrong
//
// common usage is 
//  SHOW_{FLOW,INFO,ERROR}( seriousness, format string, parameters... );
//  SHOW_{FLOW,INFO,ERROR}0( seriousness, string );
//
// with
//  seriousness: the smaller the more serious (0..3)
//  format string, parameters: normal printf stuff
//
// to specify the module that created the message you have
// to define a string called
//  DEBUG_MSG_PREFIX
// you dynamically speficify the maximum seriousness level by defining 
// the following variables/macros
//  debug_level_flow
//  debug_level_info
//  debug_level_error
//
// you _can_ statically specify the maximum seriuosness level by defining
//  DEBUG_MAX_LEVEL_FLOW
//  DEBUG_MAX_LEVEL_INFO
//  DEBUG_MAX_LEVEL_ERRROR
//
// you _can_ ask to delay execution after each printed message 
// by defining the duration (in ms) via
//  DEBUG_WAIT_ON_MSG (for flow and info)
//  DEBUG_WAIT_ON_ERROR (for error)

#ifdef DEBUG_WAIT_ON_MSG
#define DEBUG_WAIT snooze( DEBUG_WAIT_ON_MSG );
#else
#define DEBUG_WAIT 
#endif

#ifdef DEBUG_WAIT_ON_ERROR
#define DEBUG_WAIT_ERROR snooze( DEBUG_WAIT_ON_ERROR );
#else
#define DEBUG_WAIT_ERROR
#endif

#ifndef DEBUG_MAX_LEVEL_FLOW
#define DEBUG_MAX_LEVEL_FLOW 4
#endif

#ifndef DEBUG_MAX_LEVEL_INFO
#define DEBUG_MAX_LEVEL_INFO 4
#endif

#ifndef DEBUG_MAX_LEVEL_ERROR
#define DEBUG_MAX_LEVEL_ERROR 4
#endif

#ifndef DEBUG_MSG_PREFIX
#error you need to define DEBUG_MSG_PREFIX with the module name
#endif

#define FUNC_NAME DEBUG_MSG_PREFIX, __FUNCTION__

#define SHOW_FLOW(seriousness, format, param...) \
	do { if( seriousness <= debug_level_flow && seriousness <= DEBUG_MAX_LEVEL_FLOW ) { \
		dprintf( "%s%s: "format"\n", FUNC_NAME, param ); DEBUG_WAIT \
	}} while( 0 )

#define SHOW_FLOW0(seriousness, format) \
	do { if( seriousness <= debug_level_flow && seriousness <= DEBUG_MAX_LEVEL_FLOW ) { \
		dprintf( "%s%s: "format"\n", FUNC_NAME); DEBUG_WAIT \
	}} while( 0 )

#define SHOW_INFO(seriousness, format, param...) \
	do { if( seriousness <= debug_level_info && seriousness <= DEBUG_MAX_LEVEL_INFO ) { \
		dprintf( "%s%s: "format"\n", FUNC_NAME, param ); DEBUG_WAIT \
	}} while( 0 )

#define SHOW_INFO0(seriousness, format) \
	do { if( seriousness <= debug_level_info && seriousness <= DEBUG_MAX_LEVEL_INFO ) { \
		dprintf( "%s%s: "format"\n", FUNC_NAME); DEBUG_WAIT \
	}} while( 0 )

#define SHOW_ERROR(seriousness, format, param...) \
	do { if( seriousness <= debug_level_error && seriousness <= DEBUG_MAX_LEVEL_ERROR ) { \
		dprintf( "%s%s: "format"\n", FUNC_NAME, param ); DEBUG_WAIT_ERROR \
	}} while( 0 )

#define SHOW_ERROR0(seriousness, format) \
	do { if( seriousness <= debug_level_error && seriousness <= DEBUG_MAX_LEVEL_ERROR ) { \
		dprintf( "%s%s: "format"\n", FUNC_NAME); DEBUG_WAIT_ERROR \
	}} while( 0 )

#endif