perfmon_fsl_booke.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. /* arch/powerpc/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/init.h>
  24. #include <linux/module.h>
  25. #include <linux/prctl.h>
  26. #include <asm/pgtable.h>
  27. #include <asm/uaccess.h>
  28. #include <asm/system.h>
  29. #include <asm/io.h>
  30. #include <asm/reg.h>
  31. #include <asm/xmon.h>
  32. #include <asm/pmc.h>
  33. static inline u32 get_pmlca(int ctr);
  34. static inline void set_pmlca(int ctr, u32 pmlca);
  35. static inline u32 get_pmlca(int ctr)
  36. {
  37. u32 pmlca;
  38. switch (ctr) {
  39. case 0:
  40. pmlca = mfpmr(PMRN_PMLCA0);
  41. break;
  42. case 1:
  43. pmlca = mfpmr(PMRN_PMLCA1);
  44. break;
  45. case 2:
  46. pmlca = mfpmr(PMRN_PMLCA2);
  47. break;
  48. case 3:
  49. pmlca = mfpmr(PMRN_PMLCA3);
  50. break;
  51. default:
  52. panic("Bad ctr number\n");
  53. }
  54. return pmlca;
  55. }
  56. static inline void set_pmlca(int ctr, u32 pmlca)
  57. {
  58. switch (ctr) {
  59. case 0:
  60. mtpmr(PMRN_PMLCA0, pmlca);
  61. break;
  62. case 1:
  63. mtpmr(PMRN_PMLCA1, pmlca);
  64. break;
  65. case 2:
  66. mtpmr(PMRN_PMLCA2, pmlca);
  67. break;
  68. case 3:
  69. mtpmr(PMRN_PMLCA3, pmlca);
  70. break;
  71. default:
  72. panic("Bad ctr number\n");
  73. }
  74. }
  75. void init_pmc_stop(int ctr)
  76. {
  77. u32 pmlca = (PMLCA_FC | PMLCA_FCS | PMLCA_FCU |
  78. PMLCA_FCM1 | PMLCA_FCM0);
  79. u32 pmlcb = 0;
  80. switch (ctr) {
  81. case 0:
  82. mtpmr(PMRN_PMLCA0, pmlca);
  83. mtpmr(PMRN_PMLCB0, pmlcb);
  84. break;
  85. case 1:
  86. mtpmr(PMRN_PMLCA1, pmlca);
  87. mtpmr(PMRN_PMLCB1, pmlcb);
  88. break;
  89. case 2:
  90. mtpmr(PMRN_PMLCA2, pmlca);
  91. mtpmr(PMRN_PMLCB2, pmlcb);
  92. break;
  93. case 3:
  94. mtpmr(PMRN_PMLCA3, pmlca);
  95. mtpmr(PMRN_PMLCB3, pmlcb);
  96. break;
  97. default:
  98. panic("Bad ctr number!\n");
  99. }
  100. }
  101. void set_pmc_event(int ctr, int event)
  102. {
  103. u32 pmlca;
  104. pmlca = get_pmlca(ctr);
  105. pmlca = (pmlca & ~PMLCA_EVENT_MASK) |
  106. ((event << PMLCA_EVENT_SHIFT) &
  107. PMLCA_EVENT_MASK);
  108. set_pmlca(ctr, pmlca);
  109. }
  110. void set_pmc_user_kernel(int ctr, int user, int kernel)
  111. {
  112. u32 pmlca;
  113. pmlca = get_pmlca(ctr);
  114. if(user)
  115. pmlca &= ~PMLCA_FCU;
  116. else
  117. pmlca |= PMLCA_FCU;
  118. if(kernel)
  119. pmlca &= ~PMLCA_FCS;
  120. else
  121. pmlca |= PMLCA_FCS;
  122. set_pmlca(ctr, pmlca);
  123. }
  124. void set_pmc_marked(int ctr, int mark0, int mark1)
  125. {
  126. u32 pmlca = get_pmlca(ctr);
  127. if(mark0)
  128. pmlca &= ~PMLCA_FCM0;
  129. else
  130. pmlca |= PMLCA_FCM0;
  131. if(mark1)
  132. pmlca &= ~PMLCA_FCM1;
  133. else
  134. pmlca |= PMLCA_FCM1;
  135. set_pmlca(ctr, pmlca);
  136. }
  137. void pmc_start_ctr(int ctr, int enable)
  138. {
  139. u32 pmlca = get_pmlca(ctr);
  140. pmlca &= ~PMLCA_FC;
  141. if (enable)
  142. pmlca |= PMLCA_CE;
  143. else
  144. pmlca &= ~PMLCA_CE;
  145. set_pmlca(ctr, pmlca);
  146. }
  147. void pmc_start_ctrs(int enable)
  148. {
  149. u32 pmgc0 = mfpmr(PMRN_PMGC0);
  150. pmgc0 &= ~PMGC0_FAC;
  151. pmgc0 |= PMGC0_FCECE;
  152. if (enable)
  153. pmgc0 |= PMGC0_PMIE;
  154. else
  155. pmgc0 &= ~PMGC0_PMIE;
  156. mtpmr(PMRN_PMGC0, pmgc0);
  157. }
  158. void pmc_stop_ctrs(void)
  159. {
  160. u32 pmgc0 = mfpmr(PMRN_PMGC0);
  161. pmgc0 |= PMGC0_FAC;
  162. pmgc0 &= ~(PMGC0_PMIE | PMGC0_FCECE);
  163. mtpmr(PMRN_PMGC0, pmgc0);
  164. }
  165. void dump_pmcs(void)
  166. {
  167. printk("pmgc0: %x\n", mfpmr(PMRN_PMGC0));
  168. printk("pmc\t\tpmlca\t\tpmlcb\n");
  169. printk("%8x\t%8x\t%8x\n", mfpmr(PMRN_PMC0),
  170. mfpmr(PMRN_PMLCA0), mfpmr(PMRN_PMLCB0));
  171. printk("%8x\t%8x\t%8x\n", mfpmr(PMRN_PMC1),
  172. mfpmr(PMRN_PMLCA1), mfpmr(PMRN_PMLCB1));
  173. printk("%8x\t%8x\t%8x\n", mfpmr(PMRN_PMC2),
  174. mfpmr(PMRN_PMLCA2), mfpmr(PMRN_PMLCB2));
  175. printk("%8x\t%8x\t%8x\n", mfpmr(PMRN_PMC3),
  176. mfpmr(PMRN_PMLCA3), mfpmr(PMRN_PMLCB3));
  177. }
  178. EXPORT_SYMBOL(init_pmc_stop);
  179. EXPORT_SYMBOL(set_pmc_event);
  180. EXPORT_SYMBOL(set_pmc_user_kernel);
  181. EXPORT_SYMBOL(set_pmc_marked);
  182. EXPORT_SYMBOL(pmc_start_ctr);
  183. EXPORT_SYMBOL(pmc_start_ctrs);
  184. EXPORT_SYMBOL(pmc_stop_ctrs);
  185. EXPORT_SYMBOL(dump_pmcs);