systracker_v2.h 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. #ifndef _SYSTRAKCER_H
  2. #define _SYSTRAKCER_H
  3. #include <linux/platform_device.h>
  4. #define BUS_DBG_CON (BUS_DBG_BASE + 0x0000)
  5. #define BUS_DBG_TIMER_CON0 (BUS_DBG_BASE + 0x0004)
  6. #define BUS_DBG_TIMER_CON1 (BUS_DBG_BASE + 0x0008)
  7. #define BUS_DBG_TIMER_R0 (BUS_DBG_BASE + 0x000C)
  8. #define BUS_DBG_TIMER_R1 (BUS_DBG_BASE + 0x0010)
  9. #define BUS_DBG_WP (BUS_DBG_BASE + 0x0014)
  10. #define BUS_DBG_WP_MASK (BUS_DBG_BASE + 0x0018)
  11. #define BUS_DBG_MON (BUS_DBG_BASE + 0x001C)
  12. #define BUS_DBG_AR_TRACK_L(__n) (BUS_DBG_BASE + 0x0100 + 8 * (__n))
  13. #define BUS_DBG_AR_TRACK_H(__n) (BUS_DBG_BASE + 0x0104 + 8 * (__n))
  14. #define BUS_DBG_AR_TRANS_TID(__n) (BUS_DBG_BASE + 0x0180 + 4 * (__n))
  15. #define BUS_DBG_AW_TRACK_L(__n) (BUS_DBG_BASE + 0x0200 + 8 * (__n))
  16. #define BUS_DBG_AW_TRACK_H(__n) (BUS_DBG_BASE + 0x0204 + 8 * (__n))
  17. #define BUS_DBG_AW_TRANS_TID(__n) (BUS_DBG_BASE + 0x0280 + 4 * (__n))
  18. #define BUS_DBG_BUS_MHZ (266)
  19. #define BUS_DBG_NUM_TRACKER (8)
  20. #define BUS_DBG_CON_BUS_DBG_EN (0x00000001)
  21. #define BUS_DBG_CON_TIMEOUT_EN (0x00000002)
  22. #define BUS_DBG_CON_SLV_ERR_EN (0x00000004)
  23. #define BUS_DBG_CON_WP_EN (0x00000008)
  24. #define BUS_DBG_CON_IRQ_AR_EN (0x00000010)
  25. #define BUS_DBG_CON_IRQ_AW_EN (0x00000020)
  26. #define BUS_DBG_CON_SW_RST_DN (0x00000040)
  27. /* more human-readable register name than above one */
  28. #define BUS_DBG_CON_IRQ_WP_EN (0x00000040)
  29. #define BUS_DBG_CON_IRQ_CLR (0x00000080)
  30. #define BUS_DBG_CON_IRQ_AR_STA0 (0x00000100)
  31. #define BUS_DBG_CON_IRQ_AW_STA0 (0x00000200)
  32. #define BUS_DBG_CON_IRQ_WP_STA (0x00000400)
  33. #define BUS_DBG_CON_WDT_RST_EN (0x00001000)
  34. #define BUS_DBG_CON_HALT_ON_EN (0x00002000)
  35. #define BUS_DBG_CON_BUS_OT_EN (0x00004000)
  36. #define BUS_DBG_CON_SW_RST (0x00010000)
  37. #define BUS_DBG_CON_IRQ_AR_STA1 (0x00100000)
  38. #define BUS_DBG_CON_IRQ_AW_STA1 (0x00200000)
  39. #define BUS_DBG_CON_TIMEOUT_CLR (0x00800000)
  40. /* detect all stages of timeout */
  41. #define BUS_DBG_CON_TIMEOUT (BUS_DBG_CON_IRQ_AR_STA0|BUS_DBG_CON_IRQ_AW_STA0| \
  42. BUS_DBG_CON_IRQ_AR_STA1|BUS_DBG_CON_IRQ_AW_STA1)
  43. #define BUS_DBG_CON_IRQ_EN (BUS_DBG_CON_IRQ_AR_EN | BUS_DBG_CON_IRQ_AW_EN | BUS_DBG_CON_IRQ_WP_EN)
  44. static inline unsigned int extract_n2mbits(unsigned int input, int n, int m)
  45. {
  46. /*
  47. * 1. ~0 = 1111 1111 1111 1111 1111 1111 1111 1111
  48. * 2. ~0 << (m - n + 1) = 1111 1111 1111 1111 1100 0000 0000 0000
  49. * // assuming we are extracting 14 bits, the +1 is added for inclusive selection
  50. * 3. ~(~0 << (m - n + 1)) = 0000 0000 0000 0000 0011 1111 1111 1111
  51. */
  52. int mask;
  53. if (n > m) {
  54. n = n + m;
  55. m = n - m;
  56. n = n - m;
  57. }
  58. mask = ~(~0 << (m - n + 1));
  59. return ((input >> n) & mask);
  60. }
  61. struct mt_systracker_driver {
  62. struct platform_driver driver;
  63. struct platform_device device;
  64. u32 support_2_stage_timeout;
  65. void (*reset_systracker)(void);
  66. int (*enable_watchpoint)(void);
  67. int (*disable_watchpoint)(void);
  68. int (*set_watchpoint_address)(unsigned int wp_phy_address);
  69. void (*enable_systracker)(void);
  70. void (*disable_systracker)(void);
  71. int (*test_systracker)(void);
  72. int (*systracker_probe)(struct platform_device *pdev);
  73. unsigned int (*systracker_timeout_value)(void);
  74. unsigned int (*systracker_timeout2_value)(void);
  75. int (*systracker_remove)(struct platform_device *pdev);
  76. int (*systracker_suspend)(struct platform_device *pdev, pm_message_t state);
  77. int (*systracker_resume)(struct platform_device *pdev);
  78. int (*systracker_hook_fault)(void);
  79. int (*systracker_test_init)(void);
  80. void (*systracker_test_cleanup)(void);
  81. void (*systracker_wp_test)(void);
  82. void (*systracker_read_timeout_test)(void);
  83. void (*systracker_write_timeout_test)(void);
  84. void (*systracker_withrecord_test)(void);
  85. void (*systracker_notimeout_test)(void);
  86. };
  87. struct systracker_entry_t {
  88. unsigned int dbg_con;
  89. unsigned int ar_track_l[BUS_DBG_NUM_TRACKER];
  90. unsigned int ar_track_h[BUS_DBG_NUM_TRACKER];
  91. unsigned int ar_trans_tid[BUS_DBG_NUM_TRACKER];
  92. unsigned int aw_track_l[BUS_DBG_NUM_TRACKER];
  93. unsigned int aw_track_h[BUS_DBG_NUM_TRACKER];
  94. unsigned int aw_trans_tid[BUS_DBG_NUM_TRACKER];
  95. };
  96. struct systracker_config_t {
  97. int state;
  98. int enable_timeout;
  99. int enable_slave_err;
  100. int enable_wp;
  101. int enable_irq;
  102. int timeout_ms;
  103. int timeout2_ms;
  104. int wp_phy_address;
  105. };
  106. extern int tracker_dump(char *buf);
  107. extern void dump_backtrace_entry_ramconsole_print(unsigned long where, unsigned long from, unsigned long frame);
  108. extern void dump_regs(const char *fmt, const char v1, const unsigned int reg, const unsigned int reg_val);
  109. extern struct mt_systracker_driver *get_mt_systracker_drv(void);
  110. extern void __iomem *BUS_DBG_BASE;
  111. extern int systracker_irq;
  112. extern struct systracker_config_t track_config;
  113. extern struct systracker_entry_t track_entry;
  114. extern unsigned int is_systracker_irq_registered;
  115. extern void save_entry(void);
  116. extern void aee_dump_backtrace(struct pt_regs *regs, struct task_struct *tsk);
  117. extern irqreturn_t systracker_isr(void);
  118. extern int systracker_watchpoint_enable(void);
  119. extern int systracker_set_watchpoint_addr(unsigned phy_addr);
  120. extern void systracker_reset(void);
  121. extern void systracker_enable(void);
  122. extern void systracker_disable(void);
  123. extern int systracker_handler(unsigned long addr, unsigned int fsr, struct pt_regs *regs);
  124. extern int systracker_probe(struct platform_device *pdev);
  125. extern int systracker_remove(struct platform_device *pdev);
  126. extern int systracker_suspend(struct platform_device *pdev, pm_message_t state);
  127. extern int systracker_resume(struct platform_device *pdev);
  128. extern void systracker_reset(void);
  129. extern void systracker_enable(void);
  130. extern void systracker_test_cleanup(void);
  131. /* #define SYSTRACKER_TEST_SUIT */ /* enable for driver poring test suit */
  132. /* #define TRACKER_DEBUG 0 */
  133. #endif