arm_arch_timer.h 2.6 KB

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