op_model_v6.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. /**
  2. * @file op_model_v6.c
  3. * ARM11 Performance Monitor Driver
  4. *
  5. * Based on op_model_xscale.c
  6. *
  7. * @remark Copyright 2000-2004 Deepak Saxena <dsaxena@mvista.com>
  8. * @remark Copyright 2000-2004 MontaVista Software Inc
  9. * @remark Copyright 2004 Dave Jiang <dave.jiang@intel.com>
  10. * @remark Copyright 2004 Intel Corporation
  11. * @remark Copyright 2004 Zwane Mwaikambo <zwane@arm.linux.org.uk>
  12. * @remark Copyright 2004 OProfile Authors
  13. *
  14. * @remark Read the file COPYING
  15. *
  16. * @author Tony Lindgren <tony@atomide.com>
  17. */
  18. /* #define DEBUG */
  19. #include <linux/types.h>
  20. #include <linux/errno.h>
  21. #include <linux/err.h>
  22. #include <linux/sched.h>
  23. #include <linux/oprofile.h>
  24. #include <linux/interrupt.h>
  25. #include <asm/irq.h>
  26. #include <asm/system.h>
  27. #include <asm/pmu.h>
  28. #include "op_counter.h"
  29. #include "op_arm_model.h"
  30. #include "op_model_arm11_core.h"
  31. static const struct pmu_irqs *pmu_irqs;
  32. static void armv6_pmu_stop(void)
  33. {
  34. arm11_stop_pmu();
  35. arm11_release_interrupts(pmu_irqs->irqs, pmu_irqs->num_irqs);
  36. release_pmu(pmu_irqs);
  37. pmu_irqs = NULL;
  38. }
  39. static int armv6_pmu_start(void)
  40. {
  41. int ret;
  42. pmu_irqs = reserve_pmu();
  43. if (IS_ERR(pmu_irqs)) {
  44. ret = PTR_ERR(pmu_irqs);
  45. goto out;
  46. }
  47. ret = arm11_request_interrupts(pmu_irqs->irqs, pmu_irqs->num_irqs);
  48. if (ret >= 0) {
  49. ret = arm11_start_pmu();
  50. } else {
  51. release_pmu(pmu_irqs);
  52. pmu_irqs = NULL;
  53. }
  54. out:
  55. return ret;
  56. }
  57. static int armv6_detect_pmu(void)
  58. {
  59. return 0;
  60. }
  61. struct op_arm_model_spec op_armv6_spec = {
  62. .init = armv6_detect_pmu,
  63. .num_counters = 3,
  64. .setup_ctrs = arm11_setup_pmu,
  65. .start = armv6_pmu_start,
  66. .stop = armv6_pmu_stop,
  67. .name = "arm/armv6",
  68. };