Files
2026-07-30 11:19:44 +05:30

261 lines
9.7 KiB
C

/* ftlUtilP.h - generic ftl utility private header */
/*
* Copyright (c) 2012 Wind River Systems, Inc.
*
* The right to copy, distribute, modify or otherwise make use
* of this software may be licensed only pursuant to the terms
* of an applicable Wind River license agreement.
*/
/*
modification history
--------------------
--------------------
01d,04sep13,jxu turned off debug.
01c,20jun13,jxu supported finer control over the debug log
01b,30nov12,jxu added endian conversion macros.
01a,10aug12,jxu written.
*/
#ifndef __INCftlUtilPh
#define __INCftlUtilPh
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/* includes */
#include <private/ftl/ftlOsIf.h>
/* defines */
/*
* as a convention, ftl saves data on flash in little endian order becuase
* the first platform it get ready to run is little endian.
*/
#define SWAP16(var16) ((((var16) & 0x00FF) << 8) | \
(((var16) & 0xFF00) >> 8))
#define SWAP32(var32) ((SWAP16((var32) & 0x0000FFFF) << 16) | \
(SWAP16(((var32) & 0xFFFF0000) >> 16)))
#define SWAP64(var64) ((SWAP32((var64) & 0x00000000FFFFFFFF) << 32) | \
(SWAP32(((var64) & 0xFFFFFFFF00000000) >> 32)))
#if _BYTE_ORDER ==_LITTLE_ENDIAN
#define FTL_TO_FLASH_LE16(var) (var) /* nothing to do */
#define FTL_TO_FLASH_LE32(var) (var) /* nothing to do */
#define FTL_TO_FLASH_LE64(var) (var) /* nothing to do */
#define FLASH_LE16_TO_FTL(var) (var) /* nothing to do */
#define FLASH_LE32_TO_FTL(var) (var) /* nothing to do */
#define FLASH_LE64_TO_FTL(var) (var) /* nothing to do */
#else
#define FTL_TO_FLASH_LE16(var) SWAP16(var)
#define FTL_TO_FLASH_LE32(var) SWAP32(var)
#define FTL_TO_FLASH_LE64(var) SWAP64(var)
#define FLASH_LE16_TO_FTL(var) SWAP16(var)
#define FLASH_LE32_TO_FTL(var) SWAP32(var)
#define FLASH_LE64_TO_FTL(var) SWAP64(var)
#endif /* #if _BYTE_ORDER ==_LITTLE_ENDIAN */
#define FTL16(var) FLASH_LE16_TO_FTL(var)
#define FTL32(var) FLASH_LE32_TO_FTL(var)
#define FTL64(var) FLASH_LE64_TO_FTL(var)
#define FLASH16(var) FTL_TO_FLASH_LE16(var)
#define FLASH32(var) FTL_TO_FLASH_LE32(var)
#define FLASH64(var) FTL_TO_FLASH_LE64(var)
/* CRC */
#define FTL_INITIAL_CRC32 0xffffffff /* Initial 32 bit FCS value */
#define FTL_GOOD_CRC32 0xdebb20e3 /* Good final 32 bit FCS value */
/* fbio bitmap related helper definitions */
#define BPB 8 /* bits per byte */
#define BMP_SHIFT 3 /* shift of a byte */
#define BMP_MASK ((BPB)- 1)
#ifdef notyet
#define RAW_TO_FTL_ADDR(addr64, ftlAddr) do { \
ftlAddr.offset = (addr64) & 0xFFFF; \
ftlAddr.pageno = ((addr64) >> 16) & 0xFFFF; \
ftlAddr.blkNo = ((addr64) >> 32 & 0xFFFFFFFF); \
}while(0)
#define FTL_TO_RAW_ADDR(addr64, ftlAddr) do { \
addr64 = (ftlAddr.offset & 0xFFFF) | \
((ftlAddr.pageNo & 0xFFFF) << 16) | \
((ftlAddr.blkNo & 0xFFFFFFFF) << 32); \
}while(0)
#endif
/*
* the size of bitmap which tracks the status of each page of a cached
* block, whether the page presents in cache or not.
*/
#define BLK_BMP_SIZE(nPages) ((nPages) >> BMP_SHIFT)
/* AVL library does not provide the function for initializing a avl tree */
#define AVL_INIT(pTree) do { \
pTree = NULL; \
}while(0)
/* helper macros for operating flags */
#define IS_FLAG_SET(flags, flag) (((flags) & (flag)) == (flag))
#define SET_FLAG(flags, flag) ((flags) |= (flag))
#define CLEAR_FLAG(flags, flag) ((flags) &= (~(flag)))
/*
* helper macro for iterating a doubly linked list. Note it is not
* circular linked list.
*/
#define FTL_DLL_FOREACH(pNode, list) \
for (((pNode) = (DLL_FIRST ((list)))); \
((pNode) != NULL); \
((pNode) = (DLL_NEXT ((pNode)))))
#define FTL_DLL_FOREACH_INVERSE(pNode, list) \
for (((pNode) = (DLL_LAST ((list)))); \
((pNode) != NULL); \
((pNode) = (DLL_PREVIOUS ((pNode)))))
#define FTL_TEST
/* #define FTL_DEBUG */
#ifdef FTL_DEBUG
#define DBG_QUIET 0x1 /* quiet */
#define DBG_MUST 0x2 /* always print */
#define DBG_BUG 0x4 /* fatal error */
#define DBG_FATAL 0x8 /* fatal error */
#define DBG_ERROR 0x10 /* normal error */
#define DBG_WARN 0x20 /* warning */
#define DBG_FLOW 0x40 /* monitor where i am */
#define DBG_INFO 0x80 /* informative message for debug */
#define DBG_MASK 0x7F /* */
#define DEBUG_MON (DBG_BUG | DBG_FATAL | DBG_ERROR | DBG_WARN)
/* monitored debug set */
#define DEBUG_DEF (DBG_MUST | DBG_FATAL | DBG_ERROR | DBG_WARN)
/* default debug set */
#define DEBUG_CFG (DBG_INFO)
/* configurable debug set */
#define DEBUG_SET (DEBUG_DEF | DEBUG_CFG)
/*
* the highest bit the level controls whether to print the msg for a
* module, and the lower bits gives the type of the msg
*/
#define DEBUG_ON (0x1U << 31)
#define DBG_LEVEL(dbgOn, level) (((dbgOn != 0)? DEBUG_ON : 0) | (level))
#define DEBUG_ENABLED(level) (((((level) & DEBUG_ON) != 0) && \
(((level) & (DEBUG_SET)) != 0)) || \
(((level) & DEBUG_DEF) != 0))
#ifdef obsolete
#define FTL_DBG_PRINTF(level, format, args...) do { \
if(DEBUG_ENABLED(level)) \
{ \
dbgLogMonitor (level); \
printf ("TID(0x%lx): %d: %s:" format, \
(long)taskIdCurrent, __LINE__, __FUNCTION__, \
## args); \
} \
}while(0)
#else
#define FTL_DBG_PRINTF(level, format, args...) do { \
if(DEBUG_ENABLED(level)) \
{ \
dbgPrintf (level, "TID(0x%lx): %d: %s:" format, \
(long)taskIdCurrent, __LINE__, __FUNCTION__, \
## args); \
} \
}while(0)
#endif
/* logMsg is preferred to avoid msg interveling */
#define FTL_DBG_MSG (level, msg, a1, a2, a3, a4, a5, a6) do { \
if(DEBUG_ENABLED (level)) { \
dbgLogMonitor (level); \
logMsg("%d:%s: "msg, \
(_Vx_usr_arg_t)__LINE__, \
(_Vx_usr_arg_t)__FUNCTION__, \
(_Vx_usr_arg_t)var1, \
(_Vx_usr_arg_t)var2, \
(_Vx_usr_arg_t)var3, \
(_Vx_usr_arg_t)var4); \
} \
}while(0)
#define FTL_DBG(level, format, args...) \
FTL_DBG_PRINTF(DEBUG_ON | level, format, ## args)
#define FTL_DBG_I_AM_HERE() FTL_DBG_PRINTF(DBG_FLOW, "I'm here!\n")
#define FTL_PARAM_CHECK_RETURN(var, value, retVal) do { \
if ((var) == (value)) return ((retVal)); \
}while(0)
#define FTL_DBG_ATOMIC32_SET(cnt, value) FTL_ATOMIC32_SET(cnt, value)
#define FTL_DBG_ATOMIC32_ADD(cnt, value) FTL_ATOMIC32_ADD(cnt, value)
#define FTL_DBG_ATOMIC32_SUB(cnt, value) FTL_ATOMIC32_SUB(cnt, value)
#define FTL_DBG_ATOMIC64_SET(cnt, value) FTL_ATOMIC64_SET(cnt, value)
#define FTL_DBG_ATOMIC64_ADD(cnt, value) FTL_ATOMIC64_ADD(cnt, value)
#define FTL_DBG_ATOMIC64_SUB(cnt, value) FTL_ATOMIC64_SUB(cnt, value)
#define FTL_DBG_VAR_SET(var, value) ((var) = (value))
#define FTL_DBG_VAR_ADD(var, value) ((var) += (value))
#define FTL_DBG_VAR_SUB(var, value) ((var) -= (value))
#else /* !FTL_DEBUG */
#define FTL_PARAM_CHECK_RETURN(var, value, retVal) /* nothing */
#define FTL_DBG_I_AM_HERE() /* nothing */
#define FTL_DBG_MSG(level, format, a1, a2, a3, a4, a5, a6) /* nothing */
#define FTL_DBG_PRINTF(level, format, args...) /* nothing */
#define FTL_DBG FTL_DBG_PRINTF
#define FTL_DBG_ATOMIC32_SET(cnt, value) /* nothing */
#define FTL_DBG_ATOMIC32_ADD(cnt, value) /* nothing */
#define FTL_DBG_ATOMIC32_SUB(cnt, value) /* nothing */
#define FTL_DBG_ATOMIC64_SET(cnt, value) /* nothing */
#define FTL_DBG_ATOMIC64_ADD(cnt, value) /* nothing */
#define FTL_DBG_ATOMIC64_SUB(cnt, value) /* nothing */
#define FTL_DBG_VAR_SET(var, value) /* nothing */
#define FTL_DBG_VAR_ADD(var, value) /* nothing */
#define FTL_DBG_VAR_SUB(var, value) /* nothing */
#endif /* #ifdef FTL_DEBUG */
/* forward declarations */
_ftl_inline BOOL bmpTest (UINT8 * addr, UINT32 bitPos);
_ftl_inline BOOL bmpIsAllClear (UINT8 * addr, UINT32 length);
_ftl_inline void bmpSet (UINT8 * addr, UINT32 bitPos);
_ftl_inline void bmpClear (UINT8 * addr, UINT32 bitPos);
_ftl_inline int bmpFfsLsb (UINT8 * addr, UINT32 length);
_ftl_inline int bmpFfsLsbHint (UINT8 * addr, UINT32 length, UINT32 hintPos);
UINT32 ftlChkSum (const char * data, UINT32 crcIn, size_t size);
UINT32 ftlCrc32 (const char * data, UINT32 crcIn, size_t size);
UINT8 ftlCrc8 (const char * data, size_t size);
#ifdef FTL_DEBUG
int dbgLogMonitor (unsigned logLevel);
int dbgPrintf (unsigned logLevel, const char * fmt, ...);
int dbgLogDump (const char * pFileName);
#endif
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* __INCftlUtilPh */