2007-06-21 16:34:08 +08:00
/*
2009-09-24 14:11:24 +00:00
* header file for hardware trace functions
2007-06-21 16:34:08 +08:00
*
2009-09-24 14:11:24 +00:00
* Copyright 2007 - 2008 Analog Devices Inc .
*
* Licensed under the GPL - 2 or later .
2007-06-21 16:34:08 +08:00
*/
# ifndef _BLACKFIN_TRACE_
# define _BLACKFIN_TRACE_
2007-07-25 11:03:28 +08:00
/* Normally, we use ON, but you can't turn on software expansion until
* interrupts subsystem is ready
*/
# define BFIN_TRACE_INIT ((CONFIG_DEBUG_BFIN_HWTRACE_COMPRESSION << 4) | 0x03)
# ifdef CONFIG_DEBUG_BFIN_HWTRACE_EXPAND
# define BFIN_TRACE_ON (BFIN_TRACE_INIT | (CONFIG_DEBUG_BFIN_HWTRACE_EXPAND << 2))
# else
# define BFIN_TRACE_ON (BFIN_TRACE_INIT)
# endif
2007-06-21 16:34:08 +08:00
# ifndef __ASSEMBLY__
2007-07-25 11:03:28 +08:00
extern unsigned long trace_buff_offset ;
extern unsigned long software_trace_buff [ ] ;
2010-03-11 19:26:38 +00:00
# if defined(CONFIG_DEBUG_VERBOSE)
2010-03-11 16:24:18 +00:00
extern void decode_address ( char * buf , unsigned long address ) ;
2010-03-15 17:42:07 +00:00
extern bool get_instruction ( unsigned int * val , unsigned short * address ) ;
2010-03-11 19:26:38 +00:00
# else
2010-03-15 17:42:07 +00:00
static inline void decode_address ( char * buf , unsigned long address ) { }
static inline bool get_instruction ( unsigned int * val , unsigned short * address ) { return false ; }
2010-03-11 19:26:38 +00:00
# endif
2007-07-25 11:03:28 +08:00
2007-06-21 16:34:08 +08:00
/* Trace Macros for C files */
2007-07-25 11:03:28 +08:00
# ifdef CONFIG_DEBUG_BFIN_HWTRACE_ON
2009-09-28 09:23:05 +00:00
# define trace_buffer_init() bfin_write_TBUFCTL(BFIN_TRACE_INIT)
2007-06-21 16:34:08 +08:00
# define trace_buffer_save(x) \
2007-07-25 11:03:28 +08:00
do { \
( x ) = bfin_read_TBUFCTL ( ) ; \
bfin_write_TBUFCTL ( ( x ) & ~ TBUFEN ) ; \
} while ( 0 )
2007-06-21 16:34:08 +08:00
# define trace_buffer_restore(x) \
2007-07-25 11:03:28 +08:00
do { \
bfin_write_TBUFCTL ( ( x ) ) ; \
} while ( 0 )
# else /* DEBUG_BFIN_HWTRACE_ON */
# define trace_buffer_save(x)
# define trace_buffer_restore(x)
# endif /* CONFIG_DEBUG_BFIN_HWTRACE_ON */
2007-06-21 16:34:08 +08:00
# else
/* Trace Macros for Assembly files */
2007-07-25 11:03:28 +08:00
# ifdef CONFIG_DEBUG_BFIN_HWTRACE_ON
2007-06-21 16:34:08 +08:00
# define trace_buffer_stop(preg, dreg) \
preg . L = LO ( TBUFCTL ) ; \
preg . H = HI ( TBUFCTL ) ; \
dreg = 0x1 ; \
[ preg ] = dreg ;
2007-07-25 11:03:28 +08:00
# define trace_buffer_init(preg, dreg) \
preg . L = LO ( TBUFCTL ) ; \
preg . H = HI ( TBUFCTL ) ; \
dreg = BFIN_TRACE_INIT ; \
2007-06-21 16:34:08 +08:00
[ preg ] = dreg ;
2008-02-02 15:47:24 +08:00
# define trace_buffer_save(preg, dreg) \
preg . L = LO ( TBUFCTL ) ; \
preg . H = HI ( TBUFCTL ) ; \
dreg = [ preg ] ; \
2008-04-23 07:17:34 +08:00
[ - - sp ] = dreg ; \
2008-02-02 15:47:24 +08:00
dreg = 0x1 ; \
[ preg ] = dreg ;
# define trace_buffer_restore(preg, dreg) \
preg . L = LO ( TBUFCTL ) ; \
preg . H = HI ( TBUFCTL ) ; \
2008-04-23 07:17:34 +08:00
dreg = [ sp + + ] ; \
2008-02-02 15:47:24 +08:00
[ preg ] = dreg ;
2007-07-25 11:03:28 +08:00
# else /* CONFIG_DEBUG_BFIN_HWTRACE_ON */
# define trace_buffer_stop(preg, dreg)
# define trace_buffer_init(preg, dreg)
2008-02-02 15:47:24 +08:00
# define trace_buffer_save(preg, dreg)
# define trace_buffer_restore(preg, dreg)
2007-07-25 11:03:28 +08:00
# endif /* CONFIG_DEBUG_BFIN_HWTRACE_ON */
2007-06-21 16:34:08 +08:00
# ifdef CONFIG_DEBUG_BFIN_NO_KERN_HWTRACE
2008-02-02 15:47:24 +08:00
# define DEBUG_HWTRACE_SAVE(preg, dreg) trace_buffer_save(preg, dreg)
# define DEBUG_HWTRACE_RESTORE(preg, dreg) trace_buffer_restore(preg, dreg)
2007-06-21 16:34:08 +08:00
# else
2008-02-02 15:47:24 +08:00
# define DEBUG_HWTRACE_SAVE(preg, dreg)
# define DEBUG_HWTRACE_RESTORE(preg, dreg)
2007-06-21 16:34:08 +08:00
# endif
# endif /* __ASSEMBLY__ */
# endif /* _BLACKFIN_TRACE_ */