pmu.c 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Cell Broadband Engine Performance Monitor
  4. *
  5. * (C) Copyright IBM Corporation 2001,2006
  6. *
  7. * Author:
  8. * David Erb ([email protected])
  9. * Kevin Corry ([email protected])
  10. */
  11. #include <linux/interrupt.h>
  12. #include <linux/irqdomain.h>
  13. #include <linux/types.h>
  14. #include <linux/export.h>
  15. #include <asm/io.h>
  16. #include <asm/irq_regs.h>
  17. #include <asm/machdep.h>
  18. #include <asm/pmc.h>
  19. #include <asm/reg.h>
  20. #include <asm/spu.h>
  21. #include <asm/cell-regs.h>
  22. #include "interrupt.h"
  23. /*
  24. * When writing to write-only mmio addresses, save a shadow copy. All of the
  25. * registers are 32-bit, but stored in the upper-half of a 64-bit field in
  26. * pmd_regs.
  27. */
  28. #define WRITE_WO_MMIO(reg, x) \
  29. do { \
  30. u32 _x = (x); \
  31. struct cbe_pmd_regs __iomem *pmd_regs; \
  32. struct cbe_pmd_shadow_regs *shadow_regs; \
  33. pmd_regs = cbe_get_cpu_pmd_regs(cpu); \
  34. shadow_regs = cbe_get_cpu_pmd_shadow_regs(cpu); \
  35. out_be64(&(pmd_regs->reg), (((u64)_x) << 32)); \
  36. shadow_regs->reg = _x; \
  37. } while (0)
  38. #define READ_SHADOW_REG(val, reg) \
  39. do { \
  40. struct cbe_pmd_shadow_regs *shadow_regs; \
  41. shadow_regs = cbe_get_cpu_pmd_shadow_regs(cpu); \
  42. (val) = shadow_regs->reg; \
  43. } while (0)
  44. #define READ_MMIO_UPPER32(val, reg) \
  45. do { \
  46. struct cbe_pmd_regs __iomem *pmd_regs; \
  47. pmd_regs = cbe_get_cpu_pmd_regs(cpu); \
  48. (val) = (u32)(in_be64(&pmd_regs->reg) >> 32); \
  49. } while (0)
  50. /*
  51. * Physical counter registers.
  52. * Each physical counter can act as one 32-bit counter or two 16-bit counters.
  53. */
  54. u32 cbe_read_phys_ctr(u32 cpu, u32 phys_ctr)
  55. {
  56. u32 val_in_latch, val = 0;
  57. if (phys_ctr < NR_PHYS_CTRS) {
  58. READ_SHADOW_REG(val_in_latch, counter_value_in_latch);
  59. /* Read the latch or the actual counter, whichever is newer. */
  60. if (val_in_latch & (1 << phys_ctr)) {
  61. READ_SHADOW_REG(val, pm_ctr[phys_ctr]);
  62. } else {
  63. READ_MMIO_UPPER32(val, pm_ctr[phys_ctr]);
  64. }
  65. }
  66. return val;
  67. }
  68. EXPORT_SYMBOL_GPL(cbe_read_phys_ctr);
  69. void cbe_write_phys_ctr(u32 cpu, u32 phys_ctr, u32 val)
  70. {
  71. struct cbe_pmd_shadow_regs *shadow_regs;
  72. u32 pm_ctrl;
  73. if (phys_ctr < NR_PHYS_CTRS) {
  74. /* Writing to a counter only writes to a hardware latch.
  75. * The new value is not propagated to the actual counter
  76. * until the performance monitor is enabled.
  77. */
  78. WRITE_WO_MMIO(pm_ctr[phys_ctr], val);
  79. pm_ctrl = cbe_read_pm(cpu, pm_control);
  80. if (pm_ctrl & CBE_PM_ENABLE_PERF_MON) {
  81. /* The counters are already active, so we need to
  82. * rewrite the pm_control register to "re-enable"
  83. * the PMU.
  84. */
  85. cbe_write_pm(cpu, pm_control, pm_ctrl);
  86. } else {
  87. shadow_regs = cbe_get_cpu_pmd_shadow_regs(cpu);
  88. shadow_regs->counter_value_in_latch |= (1 << phys_ctr);
  89. }
  90. }
  91. }
  92. EXPORT_SYMBOL_GPL(cbe_write_phys_ctr);
  93. /*
  94. * "Logical" counter registers.
  95. * These will read/write 16-bits or 32-bits depending on the
  96. * current size of the counter. Counters 4 - 7 are always 16-bit.
  97. */
  98. u32 cbe_read_ctr(u32 cpu, u32 ctr)
  99. {
  100. u32 val;
  101. u32 phys_ctr = ctr & (NR_PHYS_CTRS - 1);
  102. val = cbe_read_phys_ctr(cpu, phys_ctr);
  103. if (cbe_get_ctr_size(cpu, phys_ctr) == 16)
  104. val = (ctr < NR_PHYS_CTRS) ? (val >> 16) : (val & 0xffff);
  105. return val;
  106. }
  107. EXPORT_SYMBOL_GPL(cbe_read_ctr);
  108. void cbe_write_ctr(u32 cpu, u32 ctr, u32 val)
  109. {
  110. u32 phys_ctr;
  111. u32 phys_val;
  112. phys_ctr = ctr & (NR_PHYS_CTRS - 1);
  113. if (cbe_get_ctr_size(cpu, phys_ctr) == 16) {
  114. phys_val = cbe_read_phys_ctr(cpu, phys_ctr);
  115. if (ctr < NR_PHYS_CTRS)
  116. val = (val << 16) | (phys_val & 0xffff);
  117. else
  118. val = (val & 0xffff) | (phys_val & 0xffff0000);
  119. }
  120. cbe_write_phys_ctr(cpu, phys_ctr, val);
  121. }
  122. EXPORT_SYMBOL_GPL(cbe_write_ctr);
  123. /*
  124. * Counter-control registers.
  125. * Each "logical" counter has a corresponding control register.
  126. */
  127. u32 cbe_read_pm07_control(u32 cpu, u32 ctr)
  128. {
  129. u32 pm07_control = 0;
  130. if (ctr < NR_CTRS)
  131. READ_SHADOW_REG(pm07_control, pm07_control[ctr]);
  132. return pm07_control;
  133. }
  134. EXPORT_SYMBOL_GPL(cbe_read_pm07_control);
  135. void cbe_write_pm07_control(u32 cpu, u32 ctr, u32 val)
  136. {
  137. if (ctr < NR_CTRS)
  138. WRITE_WO_MMIO(pm07_control[ctr], val);
  139. }
  140. EXPORT_SYMBOL_GPL(cbe_write_pm07_control);
  141. /*
  142. * Other PMU control registers. Most of these are write-only.
  143. */
  144. u32 cbe_read_pm(u32 cpu, enum pm_reg_name reg)
  145. {
  146. u32 val = 0;
  147. switch (reg) {
  148. case group_control:
  149. READ_SHADOW_REG(val, group_control);
  150. break;
  151. case debug_bus_control:
  152. READ_SHADOW_REG(val, debug_bus_control);
  153. break;
  154. case trace_address:
  155. READ_MMIO_UPPER32(val, trace_address);
  156. break;
  157. case ext_tr_timer:
  158. READ_SHADOW_REG(val, ext_tr_timer);
  159. break;
  160. case pm_status:
  161. READ_MMIO_UPPER32(val, pm_status);
  162. break;
  163. case pm_control:
  164. READ_SHADOW_REG(val, pm_control);
  165. break;
  166. case pm_interval:
  167. READ_MMIO_UPPER32(val, pm_interval);
  168. break;
  169. case pm_start_stop:
  170. READ_SHADOW_REG(val, pm_start_stop);
  171. break;
  172. }
  173. return val;
  174. }
  175. EXPORT_SYMBOL_GPL(cbe_read_pm);
  176. void cbe_write_pm(u32 cpu, enum pm_reg_name reg, u32 val)
  177. {
  178. switch (reg) {
  179. case group_control:
  180. WRITE_WO_MMIO(group_control, val);
  181. break;
  182. case debug_bus_control:
  183. WRITE_WO_MMIO(debug_bus_control, val);
  184. break;
  185. case trace_address:
  186. WRITE_WO_MMIO(trace_address, val);
  187. break;
  188. case ext_tr_timer:
  189. WRITE_WO_MMIO(ext_tr_timer, val);
  190. break;
  191. case pm_status:
  192. WRITE_WO_MMIO(pm_status, val);
  193. break;
  194. case pm_control:
  195. WRITE_WO_MMIO(pm_control, val);
  196. break;
  197. case pm_interval:
  198. WRITE_WO_MMIO(pm_interval, val);
  199. break;
  200. case pm_start_stop:
  201. WRITE_WO_MMIO(pm_start_stop, val);
  202. break;
  203. }
  204. }
  205. EXPORT_SYMBOL_GPL(cbe_write_pm);
  206. /*
  207. * Get/set the size of a physical counter to either 16 or 32 bits.
  208. */
  209. u32 cbe_get_ctr_size(u32 cpu, u32 phys_ctr)
  210. {
  211. u32 pm_ctrl, size = 0;
  212. if (phys_ctr < NR_PHYS_CTRS) {
  213. pm_ctrl = cbe_read_pm(cpu, pm_control);
  214. size = (pm_ctrl & CBE_PM_16BIT_CTR(phys_ctr)) ? 16 : 32;
  215. }
  216. return size;
  217. }
  218. EXPORT_SYMBOL_GPL(cbe_get_ctr_size);
  219. void cbe_set_ctr_size(u32 cpu, u32 phys_ctr, u32 ctr_size)
  220. {
  221. u32 pm_ctrl;
  222. if (phys_ctr < NR_PHYS_CTRS) {
  223. pm_ctrl = cbe_read_pm(cpu, pm_control);
  224. switch (ctr_size) {
  225. case 16:
  226. pm_ctrl |= CBE_PM_16BIT_CTR(phys_ctr);
  227. break;
  228. case 32:
  229. pm_ctrl &= ~CBE_PM_16BIT_CTR(phys_ctr);
  230. break;
  231. }
  232. cbe_write_pm(cpu, pm_control, pm_ctrl);
  233. }
  234. }
  235. EXPORT_SYMBOL_GPL(cbe_set_ctr_size);
  236. /*
  237. * Enable/disable the entire performance monitoring unit.
  238. * When we enable the PMU, all pending writes to counters get committed.
  239. */
  240. void cbe_enable_pm(u32 cpu)
  241. {
  242. struct cbe_pmd_shadow_regs *shadow_regs;
  243. u32 pm_ctrl;
  244. shadow_regs = cbe_get_cpu_pmd_shadow_regs(cpu);
  245. shadow_regs->counter_value_in_latch = 0;
  246. pm_ctrl = cbe_read_pm(cpu, pm_control) | CBE_PM_ENABLE_PERF_MON;
  247. cbe_write_pm(cpu, pm_control, pm_ctrl);
  248. }
  249. EXPORT_SYMBOL_GPL(cbe_enable_pm);
  250. void cbe_disable_pm(u32 cpu)
  251. {
  252. u32 pm_ctrl;
  253. pm_ctrl = cbe_read_pm(cpu, pm_control) & ~CBE_PM_ENABLE_PERF_MON;
  254. cbe_write_pm(cpu, pm_control, pm_ctrl);
  255. }
  256. EXPORT_SYMBOL_GPL(cbe_disable_pm);
  257. /*
  258. * Reading from the trace_buffer.
  259. * The trace buffer is two 64-bit registers. Reading from
  260. * the second half automatically increments the trace_address.
  261. */
  262. void cbe_read_trace_buffer(u32 cpu, u64 *buf)
  263. {
  264. struct cbe_pmd_regs __iomem *pmd_regs = cbe_get_cpu_pmd_regs(cpu);
  265. *buf++ = in_be64(&pmd_regs->trace_buffer_0_63);
  266. *buf++ = in_be64(&pmd_regs->trace_buffer_64_127);
  267. }
  268. EXPORT_SYMBOL_GPL(cbe_read_trace_buffer);
  269. /*
  270. * Enabling/disabling interrupts for the entire performance monitoring unit.
  271. */
  272. u32 cbe_get_and_clear_pm_interrupts(u32 cpu)
  273. {
  274. /* Reading pm_status clears the interrupt bits. */
  275. return cbe_read_pm(cpu, pm_status);
  276. }
  277. EXPORT_SYMBOL_GPL(cbe_get_and_clear_pm_interrupts);
  278. void cbe_enable_pm_interrupts(u32 cpu, u32 thread, u32 mask)
  279. {
  280. /* Set which node and thread will handle the next interrupt. */
  281. iic_set_interrupt_routing(cpu, thread, 0);
  282. /* Enable the interrupt bits in the pm_status register. */
  283. if (mask)
  284. cbe_write_pm(cpu, pm_status, mask);
  285. }
  286. EXPORT_SYMBOL_GPL(cbe_enable_pm_interrupts);
  287. void cbe_disable_pm_interrupts(u32 cpu)
  288. {
  289. cbe_get_and_clear_pm_interrupts(cpu);
  290. cbe_write_pm(cpu, pm_status, 0);
  291. }
  292. EXPORT_SYMBOL_GPL(cbe_disable_pm_interrupts);
  293. static irqreturn_t cbe_pm_irq(int irq, void *dev_id)
  294. {
  295. perf_irq(get_irq_regs());
  296. return IRQ_HANDLED;
  297. }
  298. static int __init cbe_init_pm_irq(void)
  299. {
  300. unsigned int irq;
  301. int rc, node;
  302. for_each_online_node(node) {
  303. irq = irq_create_mapping(NULL, IIC_IRQ_IOEX_PMI |
  304. (node << IIC_IRQ_NODE_SHIFT));
  305. if (!irq) {
  306. printk("ERROR: Unable to allocate irq for node %d\n",
  307. node);
  308. return -EINVAL;
  309. }
  310. rc = request_irq(irq, cbe_pm_irq,
  311. 0, "cbe-pmu-0", NULL);
  312. if (rc) {
  313. printk("ERROR: Request for irq on node %d failed\n",
  314. node);
  315. return rc;
  316. }
  317. }
  318. return 0;
  319. }
  320. machine_arch_initcall(cell, cbe_init_pm_irq);
  321. void cbe_sync_irq(int node)
  322. {
  323. unsigned int irq;
  324. irq = irq_find_mapping(NULL,
  325. IIC_IRQ_IOEX_PMI
  326. | (node << IIC_IRQ_NODE_SHIFT));
  327. if (!irq) {
  328. printk(KERN_WARNING "ERROR, unable to get existing irq %d " \
  329. "for node %d\n", irq, node);
  330. return;
  331. }
  332. synchronize_irq(irq);
  333. }
  334. EXPORT_SYMBOL_GPL(cbe_sync_irq);