sde_hw_uidle.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Copyright (c) 2021-2022, 2024 Qualcomm Innovation Center, Inc. All rights reserved.
  4. * Copyright (c) 2018-2021, The Linux Foundation. All rights reserved.
  5. *
  6. */
  7. #ifndef _SDE_HW_UIDLE_H
  8. #define _SDE_HW_UIDLE_H
  9. #include "sde_hw_catalog.h"
  10. #include "sde_hw_mdss.h"
  11. #include "sde_hw_util.h"
  12. struct sde_hw_uidle;
  13. #define FAL10_DANGER_SHFT 0
  14. #define FAL10_EXIT_DANGER_SHFT 4
  15. #define FAL10_EXIT_CNT_SHFT 16
  16. #define FAL10_DANGER_MSK GENMASK(2, FAL10_DANGER_SHFT)
  17. #define FAL10_EXIT_DANGER_MSK GENMASK(6, FAL10_EXIT_DANGER_SHFT)
  18. #define FAL10_EXIT_CNT_MSK GENMASK(23, FAL10_EXIT_CNT_SHFT)
  19. #define SDE_UIDLE_WD_GRANULARITY 1
  20. #define SDE_UIDLE_WD_HEART_BEAT 0
  21. #define SDE_UIDLE_WD_LOAD_VAL 18
  22. enum sde_uidle_state {
  23. UIDLE_STATE_DISABLE = 0,
  24. UIDLE_STATE_FAL1_ONLY,
  25. UIDLE_STATE_FAL1_FAL10,
  26. UIDLE_STATE_ENABLE_MAX,
  27. };
  28. struct sde_uidle_ctl_cfg {
  29. u32 fal10_exit_cnt;
  30. u32 fal10_exit_danger;
  31. u32 fal10_danger;
  32. bool fal10_override;
  33. enum sde_uidle_state uidle_state;
  34. };
  35. struct sde_uidle_wd_cfg {
  36. u32 granularity;
  37. u32 heart_beat;
  38. u32 load_value;
  39. bool clear;
  40. bool enable;
  41. };
  42. struct sde_uidle_cntr {
  43. u32 fal1_gate_cntr;
  44. u32 fal10_gate_cntr;
  45. u32 fal_wait_gate_cntr;
  46. u32 fal1_num_transitions_cntr;
  47. u32 fal10_num_transitions_cntr;
  48. u32 min_gate_cntr;
  49. u32 max_gate_cntr;
  50. };
  51. struct sde_uidle_status {
  52. u32 uidle_danger_status_0;
  53. u32 uidle_danger_status_1;
  54. u32 uidle_safe_status_0;
  55. u32 uidle_safe_status_1;
  56. u32 uidle_idle_status_0;
  57. u32 uidle_idle_status_1;
  58. u32 uidle_fal_status_0;
  59. u32 uidle_fal_status_1;
  60. u32 uidle_status;
  61. u32 uidle_en_fal10;
  62. };
  63. struct sde_hw_uidle_ops {
  64. /**
  65. * set_uidle_ctl - set uidle global config
  66. * @uidle: uidle context driver
  67. * @cfg: uidle global config
  68. */
  69. void (*set_uidle_ctl)(struct sde_hw_uidle *uidle,
  70. struct sde_uidle_ctl_cfg *cfg);
  71. /**
  72. * setup_wd_timer - set uidle watchdog timer
  73. * @uidle: uidle context driver
  74. * @cfg: uidle wd timer config
  75. */
  76. void (*setup_wd_timer)(struct sde_hw_uidle *uidle,
  77. struct sde_uidle_wd_cfg *cfg);
  78. /**
  79. * uidle_setup_cntr - set uidle perf counters
  80. * @uidle: uidle context driver
  81. * @enable: true to enable the counters
  82. */
  83. void (*uidle_setup_cntr)(struct sde_hw_uidle *uidle,
  84. bool enable);
  85. /**
  86. * uidle_get_cntr - get uidle perf counters
  87. * @uidle: uidle context driver
  88. * @cntr: pointer to return the counters
  89. */
  90. void (*uidle_get_cntr)(struct sde_hw_uidle *uidle,
  91. struct sde_uidle_cntr *cntr);
  92. /**
  93. * uidle_get_status - get uidle status
  94. * @uidle: uidle context driver
  95. * @status: pointer to return the status of uidle
  96. */
  97. void (*uidle_get_status)(struct sde_hw_uidle *uidle,
  98. struct sde_uidle_status *status);
  99. /**
  100. * active_override_enable - enable/disable qactive signal override
  101. * @uidle: uidle context driver
  102. * @enable: enable/disable
  103. */
  104. void (*active_override_enable)(struct sde_hw_uidle *uidle,
  105. bool enable);
  106. /**
  107. * uidle_fal10_overrride - enable/disable fal10 override
  108. * @uidle: uidle context driver
  109. * @enable: enable/disable
  110. */
  111. void (*uidle_fal10_override)(struct sde_hw_uidle *uidle, bool enable);
  112. };
  113. struct sde_hw_uidle {
  114. /* base */
  115. struct sde_hw_blk_reg_map hw;
  116. /* uidle */
  117. const struct sde_uidle_cfg *cap;
  118. /* ops */
  119. struct sde_hw_uidle_ops ops;
  120. /*
  121. * uidle is common across all displays, lock to serialize access.
  122. * must be taken by client before using any ops
  123. */
  124. struct mutex uidle_lock;
  125. enum sde_uidle idx;
  126. };
  127. struct sde_hw_uidle *sde_hw_uidle_init(enum sde_uidle idx,
  128. void __iomem *addr, unsigned long len,
  129. struct sde_mdss_cfg *m);
  130. #endif /*_SDE_HW_UIDLE_H */