arm_arch_timer.h 2.5 KB

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