time.rs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. use log::{debug, info};
  2. use crate::{
  3. driver::open_firmware::fdt::open_firmware_fdt_driver,
  4. time::{clocksource::HZ, TimeArch},
  5. };
  6. pub struct RiscV64TimeArch;
  7. /// 这个是系统jiffies时钟源的固有频率(不是调频之后的)
  8. pub const CLOCK_TICK_RATE: u32 = HZ as u32 * 1000000;
  9. static mut TIME_FREQ: usize = 0;
  10. /// 获取CPU的time寄存器频率
  11. ///
  12. /// todo: 支持从acpi中获取
  13. fn init_time_freq() {
  14. debug!("init_time_freq: init");
  15. let fdt = open_firmware_fdt_driver().fdt_ref();
  16. if fdt.is_err() {
  17. panic!("init_time_freq: failed to get fdt");
  18. }
  19. debug!("init_time_freq: get fdt");
  20. let fdt = fdt.unwrap();
  21. let cpu_node = fdt.find_node("/cpus");
  22. if cpu_node.is_none() {
  23. panic!("init_time_freq: failed to find /cpus node");
  24. }
  25. let cpu_node = cpu_node.unwrap();
  26. let time_freq = cpu_node
  27. .property("timebase-frequency")
  28. .map(|prop| prop.as_usize())
  29. .flatten();
  30. if time_freq.is_none() {
  31. panic!("init_time_freq: failed to get timebase-frequency");
  32. }
  33. let time_freq: usize = time_freq.unwrap();
  34. info!("init_time_freq: timebase-frequency: {}", time_freq);
  35. unsafe {
  36. TIME_FREQ = time_freq;
  37. }
  38. }
  39. pub fn time_init() {
  40. // 初始化cpu time register频率
  41. init_time_freq();
  42. }
  43. impl TimeArch for RiscV64TimeArch {
  44. fn get_cycles() -> usize {
  45. riscv::register::time::read()
  46. }
  47. fn cal_expire_cycles(ns: usize) -> usize {
  48. Self::get_cycles() + ns * unsafe { TIME_FREQ } / 1000000000
  49. }
  50. /// 将CPU的时钟周期数转换为纳秒
  51. #[inline(always)]
  52. fn cycles2ns(cycles: usize) -> usize {
  53. if unsafe { TIME_FREQ == 0 } {
  54. return 0;
  55. }
  56. cycles * 1000000000 / unsafe { TIME_FREQ }
  57. }
  58. }
  59. pub fn riscv_time_base_freq() -> usize {
  60. unsafe { TIME_FREQ }
  61. }