arm_arch_timer.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright (C) 2012 ARM Ltd.
  4. */
  5. #ifndef __CLKSOURCE_ARM_ARCH_TIMER_H
  6. #define __CLKSOURCE_ARM_ARCH_TIMER_H
  7. #include <linux/bitops.h>
  8. #include <linux/timecounter.h>
  9. #include <linux/types.h>
  10. #define ARCH_TIMER_TYPE_CP15 BIT(0)
  11. #define ARCH_TIMER_TYPE_MEM BIT(1)
  12. #define ARCH_TIMER_CTRL_ENABLE (1 << 0)
  13. #define ARCH_TIMER_CTRL_IT_MASK (1 << 1)
  14. #define ARCH_TIMER_CTRL_IT_STAT (1 << 2)
  15. #define CNTHCTL_EL1PCTEN (1 << 0)
  16. #define CNTHCTL_EL1PCEN (1 << 1)
  17. #define CNTHCTL_EVNTEN (1 << 2)
  18. #define CNTHCTL_EVNTDIR (1 << 3)
  19. #define CNTHCTL_EVNTI (0xF << 4)
  20. #define CNTHCTL_ECV (1 << 12)
  21. enum arch_timer_reg {
  22. ARCH_TIMER_REG_CTRL,
  23. ARCH_TIMER_REG_CVAL,
  24. };
  25. enum arch_timer_ppi_nr {
  26. ARCH_TIMER_PHYS_SECURE_PPI,
  27. ARCH_TIMER_PHYS_NONSECURE_PPI,
  28. ARCH_TIMER_VIRT_PPI,
  29. ARCH_TIMER_HYP_PPI,
  30. ARCH_TIMER_HYP_VIRT_PPI,
  31. ARCH_TIMER_MAX_TIMER_PPI
  32. };
  33. enum arch_timer_spi_nr {
  34. ARCH_TIMER_PHYS_SPI,
  35. ARCH_TIMER_VIRT_SPI,
  36. ARCH_TIMER_MAX_TIMER_SPI
  37. };
  38. #define ARCH_TIMER_PHYS_ACCESS 0
  39. #define ARCH_TIMER_VIRT_ACCESS 1
  40. #define ARCH_TIMER_MEM_PHYS_ACCESS 2
  41. #define ARCH_TIMER_MEM_VIRT_ACCESS 3
  42. #define ARCH_TIMER_MEM_MAX_FRAMES 8
  43. #define ARCH_TIMER_USR_PCT_ACCESS_EN (1 << 0) /* physical counter */
  44. #define ARCH_TIMER_USR_VCT_ACCESS_EN (1 << 1) /* virtual counter */
  45. #define ARCH_TIMER_VIRT_EVT_EN (1 << 2)
  46. #define ARCH_TIMER_EVT_TRIGGER_SHIFT (4)
  47. #define ARCH_TIMER_EVT_TRIGGER_MASK (0xF << ARCH_TIMER_EVT_TRIGGER_SHIFT)
  48. #define ARCH_TIMER_USR_VT_ACCESS_EN (1 << 8) /* virtual timer registers */
  49. #define ARCH_TIMER_USR_PT_ACCESS_EN (1 << 9) /* physical timer registers */
  50. #define ARCH_TIMER_EVT_INTERVAL_SCALE (1 << 17) /* EVNTIS in the ARMv8 ARM */
  51. #define ARCH_TIMER_EVT_STREAM_PERIOD_US 100
  52. #define ARCH_TIMER_EVT_STREAM_FREQ \
  53. (USEC_PER_SEC / ARCH_TIMER_EVT_STREAM_PERIOD_US)
  54. struct arch_timer_kvm_info {
  55. struct timecounter timecounter;
  56. int virtual_irq;
  57. int physical_irq;
  58. };
  59. struct arch_timer_mem_frame {
  60. bool valid;
  61. phys_addr_t cntbase;
  62. size_t size;
  63. int phys_irq;
  64. int virt_irq;
  65. };
  66. struct arch_timer_mem {
  67. phys_addr_t cntctlbase;
  68. size_t size;
  69. struct arch_timer_mem_frame frame[ARCH_TIMER_MEM_MAX_FRAMES];
  70. };
  71. #ifdef CONFIG_ARM_ARCH_TIMER
  72. extern u32 arch_timer_get_rate(void);
  73. extern u64 (*arch_timer_read_counter)(void);
  74. extern struct arch_timer_kvm_info *arch_timer_get_kvm_info(void);
  75. extern bool arch_timer_evtstrm_available(void);
  76. #else
  77. static inline u32 arch_timer_get_rate(void)
  78. {
  79. return 0;
  80. }
  81. static inline u64 arch_timer_read_counter(void)
  82. {
  83. return 0;
  84. }
  85. static inline bool arch_timer_evtstrm_available(void)
  86. {
  87. return false;
  88. }
  89. #endif
  90. #endif