perfmon_fsl_booke.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. /* kernel/perfmon_fsl_booke.c
  2. * Freescale Book-E Performance Monitor code
  3. *
  4. * Author: Andy Fleming
  5. * Copyright (c) 2004 Freescale Semiconductor, Inc
  6. *
  7. * This program is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU General Public License
  9. * as published by the Free Software Foundation; either version
  10. * 2 of the License, or (at your option) any later version.
  11. */
  12. #include <linux/errno.h>
  13. #include <linux/sched.h>
  14. #include <linux/kernel.h>
  15. #include <linux/mm.h>
  16. #include <linux/stddef.h>
  17. #include <linux/unistd.h>
  18. #include <linux/ptrace.h>
  19. #include <linux/slab.h>
  20. #include <linux/user.h>
  21. #include <linux/a.out.h>
  22. #include <linux/interrupt.h>
  23. #include <linux/config.h>
  24. #include <linux/init.h>
  25. #include <linux/module.h>
  26. #include <linux/prctl.h>
  27. #include <asm/pgtable.h>
  28. #include <asm/uaccess.h>
  29. #include <asm/system.h>
  30. #include <asm/io.h>
  31. #include <asm/reg.h>
  32. #include <asm/xmon.h>
  33. #include <asm/perfmon.h>
  34. static inline u32 get_pmlca(int ctr);
  35. static inline void set_pmlca(int ctr, u32 pmlca);
  36. static inline u32 get_pmlca(int ctr)
  37. {
  38. u32 pmlca;
  39. switch (ctr) {
  40. case 0:
  41. pmlca = mfpmr(PMRN_PMLCA0);
  42. break;
  43. case 1:
  44. pmlca = mfpmr(PMRN_PMLCA1);
  45. break;
  46. case 2:
  47. pmlca = mfpmr(PMRN_PMLCA2);
  48. break;
  49. case 3:
  50. pmlca = mfpmr(PMRN_PMLCA3);
  51. break;
  52. default:
  53. panic("Bad ctr number\n");
  54. }
  55. return pmlca;
  56. }
  57. static inline void set_pmlca(int ctr, u32 pmlca)
  58. {
  59. switch (ctr) {
  60. case 0:
  61. mtpmr(PMRN_PMLCA0, pmlca);
  62. break;
  63. case 1:
  64. mtpmr(PMRN_PMLCA1, pmlca);
  65. break;
  66. case 2:
  67. mtpmr(PMRN_PMLCA2, pmlca);
  68. break;
  69. case 3:
  70. mtpmr(PMRN_PMLCA3, pmlca);
  71. break;
  72. default:
  73. panic("Bad ctr number\n");
  74. }
  75. }
  76. void init_pmc_stop(int ctr)
  77. {
  78. u32 pmlca = (PMLCA_FC | PMLCA_FCS | PMLCA_FCU |
  79. PMLCA_FCM1 | PMLCA_FCM0);
  80. u32 pmlcb = 0;
  81. switch (ctr) {
  82. case 0:
  83. mtpmr(PMRN_PMLCA0, pmlca);
  84. mtpmr(PMRN_PMLCB0, pmlcb);
  85. break;
  86. case 1:
  87. mtpmr(PMRN_PMLCA1, pmlca);
  88. mtpmr(PMRN_PMLCB1, pmlcb);
  89. break;
  90. case 2:
  91. mtpmr(PMRN_PMLCA2, pmlca);
  92. mtpmr(PMRN_PMLCB2, pmlcb);
  93. break;
  94. case 3:
  95. mtpmr(PMRN_PMLCA3, pmlca);
  96. mtpmr(PMRN_PMLCB3, pmlcb);
  97. break;
  98. default:
  99. panic("Bad ctr number!\n");
  100. }
  101. }
  102. void set_pmc_event(int ctr, int event)
  103. {
  104. u32 pmlca;
  105. pmlca = get_pmlca(ctr);
  106. pmlca = (pmlca & ~PMLCA_EVENT_MASK) |
  107. ((event << PMLCA_EVENT_SHIFT) &
  108. PMLCA_EVENT_MASK);
  109. set_pmlca(ctr, pmlca);
  110. }
  111. void set_pmc_user_kernel(int ctr, int user, int kernel)
  112. {
  113. u32 pmlca;
  114. pmlca = get_pmlca(ctr);
  115. if(user)
  116. pmlca &= ~PMLCA_FCU;
  117. else
  118. pmlca |= PMLCA_FCU;
  119. if(kernel)
  120. pmlca &= ~PMLCA_FCS;
  121. else
  122. pmlca |= PMLCA_FCS;
  123. set_pmlca(ctr, pmlca);
  124. }
  125. void set_pmc_marked(int ctr, int mark0, int mark1)
  126. {
  127. u32 pmlca = get_pmlca(ctr);
  128. if(mark0)
  129. pmlca &= ~PMLCA_FCM0;
  130. else
  131. pmlca |= PMLCA_FCM0;
  132. if(mark1)
  133. pmlca &= ~PMLCA_FCM1;
  134. else
  135. pmlca |= PMLCA_FCM1;
  136. set_pmlca(ctr, pmlca);
  137. }
  138. void pmc_start_ctr(int ctr, int enable)
  139. {
  140. u32 pmlca = get_pmlca(ctr);
  141. pmlca &= ~PMLCA_FC;
  142. if (enable)
  143. pmlca |= PMLCA_CE;
  144. else
  145. pmlca &= ~PMLCA_CE;
  146. set_pmlca(ctr, pmlca);
  147. }
  148. void pmc_start_ctrs(int enable)
  149. {
  150. u32 pmgc0 = mfpmr(PMRN_PMGC0);
  151. pmgc0 &= ~PMGC0_FAC;
  152. pmgc0 |= PMGC0_FCECE;
  153. if (enable)
  154. pmgc0 |= PMGC0_PMIE;
  155. else
  156. pmgc0 &= ~PMGC0_PMIE;
  157. mtpmr(PMRN_PMGC0, pmgc0);
  158. }
  159. void pmc_stop_ctrs(void)
  160. {
  161. u32 pmgc0 = mfpmr(PMRN_PMGC0);
  162. pmgc0 |= PMGC0_FAC;
  163. pmgc0 &= ~(PMGC0_PMIE | PMGC0_FCECE);
  164. mtpmr(PMRN_PMGC0, pmgc0);
  165. }
  166. void dump_pmcs(void)
  167. {
  168. printk("pmgc0: %x\n", mfpmr(PMRN_PMGC0));
  169. printk("pmc\t\tpmlca\t\tpmlcb\n");
  170. printk("%8x\t%8x\t%8x\n", mfpmr(PMRN_PMC0),
  171. mfpmr(PMRN_PMLCA0), mfpmr(PMRN_PMLCB0));
  172. printk("%8x\t%8x\t%8x\n", mfpmr(PMRN_PMC1),
  173. mfpmr(PMRN_PMLCA1), mfpmr(PMRN_PMLCB1));
  174. printk("%8x\t%8x\t%8x\n", mfpmr(PMRN_PMC2),
  175. mfpmr(PMRN_PMLCA2), mfpmr(PMRN_PMLCB2));
  176. printk("%8x\t%8x\t%8x\n", mfpmr(PMRN_PMC3),
  177. mfpmr(PMRN_PMLCA3), mfpmr(PMRN_PMLCB3));
  178. }
  179. EXPORT_SYMBOL(init_pmc_stop);
  180. EXPORT_SYMBOL(set_pmc_event);
  181. EXPORT_SYMBOL(set_pmc_user_kernel);
  182. EXPORT_SYMBOL(set_pmc_marked);
  183. EXPORT_SYMBOL(pmc_start_ctr);
  184. EXPORT_SYMBOL(pmc_start_ctrs);
  185. EXPORT_SYMBOL(pmc_stop_ctrs);
  186. EXPORT_SYMBOL(dump_pmcs);