ivpu_hw.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright (C) 2020-2025 Intel Corporation
  4. */
  5. #ifndef __IVPU_HW_H__
  6. #define __IVPU_HW_H__
  7. #include "ivpu_drv.h"
  8. #include "ivpu_hw_btrs.h"
  9. #include "ivpu_hw_ip.h"
  10. struct ivpu_addr_range {
  11. resource_size_t start;
  12. resource_size_t end;
  13. };
  14. struct ivpu_hw_info {
  15. struct {
  16. bool (*btrs_irq_handler)(struct ivpu_device *vdev, int irq);
  17. bool (*ip_irq_handler)(struct ivpu_device *vdev, int irq);
  18. } irq;
  19. struct {
  20. struct ivpu_addr_range runtime;
  21. struct ivpu_addr_range global;
  22. struct ivpu_addr_range user;
  23. struct ivpu_addr_range shave;
  24. struct ivpu_addr_range dma;
  25. } ranges;
  26. struct {
  27. u8 min_ratio;
  28. u8 max_ratio;
  29. /*
  30. * Pll ratio for the efficiency frequency. The VPU has optimum
  31. * performance to power ratio at this frequency.
  32. */
  33. u8 pn_ratio;
  34. u32 profiling_freq;
  35. } pll;
  36. struct {
  37. u32 grace_period[VPU_HWS_NUM_PRIORITY_BANDS];
  38. u32 process_quantum[VPU_HWS_NUM_PRIORITY_BANDS];
  39. u32 process_grace_period[VPU_HWS_NUM_PRIORITY_BANDS];
  40. } hws;
  41. u32 tile_fuse;
  42. u32 sku;
  43. u16 config;
  44. int dma_bits;
  45. ktime_t d0i3_entry_host_ts;
  46. u64 d0i3_entry_vpu_ts;
  47. atomic_t firewall_irq_counter;
  48. };
  49. int ivpu_hw_init(struct ivpu_device *vdev);
  50. int ivpu_hw_range_init(struct ivpu_device *vdev, struct ivpu_addr_range *range, u64 start,
  51. u64 size);
  52. int ivpu_hw_power_up(struct ivpu_device *vdev);
  53. int ivpu_hw_power_down(struct ivpu_device *vdev);
  54. int ivpu_hw_reset(struct ivpu_device *vdev);
  55. int ivpu_hw_boot_fw(struct ivpu_device *vdev);
  56. void ivpu_hw_profiling_freq_drive(struct ivpu_device *vdev, bool enable);
  57. void ivpu_irq_handlers_init(struct ivpu_device *vdev);
  58. void ivpu_hw_irq_enable(struct ivpu_device *vdev);
  59. void ivpu_hw_irq_disable(struct ivpu_device *vdev);
  60. irqreturn_t ivpu_hw_irq_handler(int irq, void *ptr);
  61. bool ivpu_hw_uses_ecc_mca_signal(struct ivpu_device *vdev);
  62. static inline u32 ivpu_hw_btrs_irq_handler(struct ivpu_device *vdev, int irq)
  63. {
  64. return vdev->hw->irq.btrs_irq_handler(vdev, irq);
  65. }
  66. static inline u32 ivpu_hw_ip_irq_handler(struct ivpu_device *vdev, int irq)
  67. {
  68. return vdev->hw->irq.ip_irq_handler(vdev, irq);
  69. }
  70. static inline u64 ivpu_hw_range_size(const struct ivpu_addr_range *range)
  71. {
  72. return range->end - range->start;
  73. }
  74. static inline u32 ivpu_hw_dpu_max_freq_get(struct ivpu_device *vdev)
  75. {
  76. return ivpu_hw_btrs_dpu_max_freq_get(vdev);
  77. }
  78. static inline u32 ivpu_hw_dpu_freq_get(struct ivpu_device *vdev)
  79. {
  80. return ivpu_hw_btrs_dpu_freq_get(vdev);
  81. }
  82. static inline void ivpu_hw_irq_clear(struct ivpu_device *vdev)
  83. {
  84. ivpu_hw_ip_irq_clear(vdev);
  85. }
  86. static inline u32 ivpu_hw_profiling_freq_get(struct ivpu_device *vdev)
  87. {
  88. return vdev->hw->pll.profiling_freq;
  89. }
  90. static inline void ivpu_hw_diagnose_failure(struct ivpu_device *vdev)
  91. {
  92. ivpu_hw_ip_diagnose_failure(vdev);
  93. ivpu_hw_btrs_diagnose_failure(vdev);
  94. }
  95. static inline u32 ivpu_hw_telemetry_offset_get(struct ivpu_device *vdev)
  96. {
  97. return ivpu_hw_btrs_telemetry_offset_get(vdev);
  98. }
  99. static inline u32 ivpu_hw_telemetry_size_get(struct ivpu_device *vdev)
  100. {
  101. return ivpu_hw_btrs_telemetry_size_get(vdev);
  102. }
  103. static inline u32 ivpu_hw_telemetry_enable_get(struct ivpu_device *vdev)
  104. {
  105. return ivpu_hw_btrs_telemetry_enable_get(vdev);
  106. }
  107. static inline bool ivpu_hw_is_idle(struct ivpu_device *vdev)
  108. {
  109. return ivpu_hw_btrs_is_idle(vdev);
  110. }
  111. static inline int ivpu_hw_wait_for_idle(struct ivpu_device *vdev)
  112. {
  113. return ivpu_hw_btrs_wait_for_idle(vdev);
  114. }
  115. static inline void ivpu_hw_ipc_tx_set(struct ivpu_device *vdev, u32 vpu_addr)
  116. {
  117. ivpu_hw_ip_ipc_tx_set(vdev, vpu_addr);
  118. }
  119. static inline void ivpu_hw_db_set(struct ivpu_device *vdev, u32 db_id)
  120. {
  121. ivpu_hw_ip_db_set(vdev, db_id);
  122. }
  123. static inline u32 ivpu_hw_ipc_rx_addr_get(struct ivpu_device *vdev)
  124. {
  125. return ivpu_hw_ip_ipc_rx_addr_get(vdev);
  126. }
  127. static inline u32 ivpu_hw_ipc_rx_count_get(struct ivpu_device *vdev)
  128. {
  129. return ivpu_hw_ip_ipc_rx_count_get(vdev);
  130. }
  131. #endif /* __IVPU_HW_H__ */