sbi_timer.h 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. /*
  2. * SPDX-License-Identifier: BSD-2-Clause
  3. *
  4. * Copyright (c) 2019 Western Digital Corporation or its affiliates.
  5. *
  6. * Authors:
  7. * Anup Patel <anup.patel@wdc.com>
  8. */
  9. #ifndef __SBI_TIMER_H__
  10. #define __SBI_TIMER_H__
  11. #include <sbi/sbi_types.h>
  12. /** Timer hardware device */
  13. struct sbi_timer_device {
  14. /** Name of the timer operations */
  15. char name[32];
  16. /** Frequency of timer in HZ */
  17. unsigned long timer_freq;
  18. /** Get free-running timer value */
  19. u64 (*timer_value)(void);
  20. /** Start timer event for current HART */
  21. void (*timer_event_start)(u64 next_event);
  22. /** Stop timer event for current HART */
  23. void (*timer_event_stop)(void);
  24. };
  25. struct sbi_scratch;
  26. /** Generic delay loop of desired granularity */
  27. void sbi_timer_delay_loop(ulong units, u64 unit_freq,
  28. void (*delay_fn)(void *), void *opaque);
  29. /** Provide delay in terms of milliseconds */
  30. static inline void sbi_timer_mdelay(ulong msecs)
  31. {
  32. sbi_timer_delay_loop(msecs, 1000, NULL, NULL);
  33. }
  34. /** Provide delay in terms of microseconds */
  35. static inline void sbi_timer_udelay(ulong usecs)
  36. {
  37. sbi_timer_delay_loop(usecs, 1000000, NULL, NULL);
  38. }
  39. /** Get timer value for current HART */
  40. u64 sbi_timer_value(void);
  41. /** Get virtualized timer value for current HART */
  42. u64 sbi_timer_virt_value(void);
  43. /** Get timer delta value for current HART */
  44. u64 sbi_timer_get_delta(void);
  45. /** Set timer delta value for current HART */
  46. void sbi_timer_set_delta(ulong delta);
  47. /** Set upper 32-bits of timer delta value for current HART */
  48. void sbi_timer_set_delta_upper(ulong delta_upper);
  49. /** Start timer event for current HART */
  50. void sbi_timer_event_start(u64 next_event);
  51. /** Process timer event for current HART */
  52. void sbi_timer_process(void);
  53. /** Get current timer device */
  54. const struct sbi_timer_device *sbi_timer_get_device(void);
  55. /** Register timer device */
  56. void sbi_timer_set_device(const struct sbi_timer_device *dev);
  57. /* Initialize timer */
  58. int sbi_timer_init(struct sbi_scratch *scratch, bool cold_boot);
  59. /* Exit timer */
  60. void sbi_timer_exit(struct sbi_scratch *scratch);
  61. #endif