/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */
/*
 * Copyright (c) 2023 MediaTek Inc.
 */

#ifndef _MSTAR_DEBUG_H_
#define _MSTAR_DEBUG_H_
#if 1
typedef enum
{
	EN_DEBUG_LEVEL_DISABLE=0,
	EN_DEBUG_LEVEL_ERROR=0x01,
	EN_DEBUG_LEVEL_INFO=0x02,
	EN_DEBUG_LEVEL_TRACE=0x04,
	EN_DEBUG_LEVEL_DEBUG=0x08,
	EN_DEBUG_LEVEL_BOOTTIME=0x10,
	EN_DEBUG_LEVEL_INVALID=0x1000,
	EN_DEBUG_LEVEL_MAX=EN_DEBUG_LEVEL_INVALID
}EN_DEBUG_LEVEL;

typedef enum
{
	EN_DEBUG_MODULE_DISABLE=0,
	EN_DEBUG_MODULE_UPGRADE=(0x01<<0),
	EN_DEBUG_MODULE_FAT=(0x01<<1),
	EN_DEBUG_MODULE_ALL=0xFFFFFFFF
}EN_DEBUG_MODULE;

extern EN_DEBUG_LEVEL dbgLevel;
extern EN_DEBUG_MODULE dbgModule;
#endif

#define DEFAULT_DEBUG_LEVEL (EN_DEBUG_LEVEL_INFO+EN_DEBUG_LEVEL_ERROR)
#define DEFAULT_DEBUG_MODULE (EN_DEBUG_MODULE_ALL)

#if CONFIG_MINIUBOOT
#define UBOOT_ERRDUMP(msg...)
#define UBOOT_ERROR(msg...)  \
	do{\
		printf("\033[0;31m[ERROR] %s:%d: \033[0m",__FUNCTION__,__LINE__);\
		printf(msg);\
	}while(0)
#define UBOOT_INFO(msg...)	printf(msg)
#define UBOOT_TRACE(msg...)
#define UBOOT_DEBUG(msg...)
#define UBOOT_DUMP(addr, size)
#define UBOOT_BOOTTIME(msg...)
#else
#define UBOOT_ERROR(msg...)\
	do{\
		if(dbgLevel&EN_DEBUG_LEVEL_ERROR) \
		{ \
			printf("\033[0;31m[ERROR] %s:%d: \033[0m",__FUNCTION__,__LINE__);\
			printf(msg);\
		} \
	}while(0)

#define UBOOT_INFO(msg...)\
	do{\
		if(dbgLevel&EN_DEBUG_LEVEL_INFO) \
		{ \
			printf(msg);\
		} \
	}while(0)

#define UBOOT_BOOTTIME(msg...)\
	do{\
		if(dbgLevel&EN_DEBUG_LEVEL_BOOTTIME) \
		{ \
			printf(msg);\
		} \
	}while(0)

#if 1
#define UBOOT_TRACE(msg...)\
	do{\
		if(dbgLevel&EN_DEBUG_LEVEL_TRACE) \
		{ \
			printf("\033[0;32m[TRACE] %s \033[0m",__FUNCTION__);\
			printf(msg);\
		} \
	}while(0)

#else
	do{\
		if(dbgLevel&EN_DEBUG_LEVEL_TRACE) \
		{ \
			if(dbgModule&module) \
			{\
				printf("\033[0;32m[TRACE]%s\033[0m",__FUNCTION__);\
				printf(msg);\
			}\
		} \
	}while(0)

#define UBOOT_TRACE(msg...)   _UBOOT_TRACE(EN_DEBUG_MODULE_ALL,msg)

#endif

#if 1
#define UBOOT_DEBUG(msg...)\
	do{\
		if(dbgLevel&EN_DEBUG_LEVEL_DEBUG) \
		{ \
			printf("\033[0;34m[DEBUG] %s:%d: \033[0m",__FUNCTION__,__LINE__);\
			printf(msg);\
		} \
	}while(0)

#else
#define _UBOOT_DEBUG(module, msg...)\
	do{\
		if(dbgLevel&EN_DEBUG_LEVEL_DEBUG) \
		{ \
			if(dbgModule&module) \
			{ \
				printf("\033[0;34m[DEBUG]%s:%d:\033[0m",__FUNCTION__,__LINE__);\
				printf(msg);\
			} \
		} \
	}while(0)

#define UBOOT_DEBUG(msg...)   _UBOOT_DEBUG(EN_DEBUG_MODULE_ALL,msg)
#endif

#define UBOOT_DUMP(addr, size)\
	do{\
		if(dbgLevel&EN_DEBUG_LEVEL_DEBUG) \
		{ \
			printf("\033[0;34m[DUMP] %s:%d:\033[0m\n",__FUNCTION__,__LINE__);\
			_dump(addr,size);\
		} \
	}while(0)

#define UBOOT_ERRDUMP(addr, size)\
			do{\
				if(dbgLevel&EN_DEBUG_LEVEL_ERROR) \
				{ \
					printf("\033[0;31m[DUMP] %s:%d:\033[0m\n",__FUNCTION__,__LINE__);\
					_dump(addr,size);\
				} \
			}while(0)

#if 0
int do_set_debugging_message_level(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
int do_initDebugLevel(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
void _dump(unsigned int addr, unsigned int size);
#endif

#endif
#endif
