dpu_kms.h 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. /*
  2. * Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
  3. * Copyright (C) 2013 Red Hat
  4. * Author: Rob Clark <robdclark@gmail.com>
  5. *
  6. * This program is free software; you can redistribute it and/or modify it
  7. * under the terms of the GNU General Public License version 2 as published by
  8. * the Free Software Foundation.
  9. *
  10. * This program is distributed in the hope that it will be useful, but WITHOUT
  11. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  12. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  13. * more details.
  14. *
  15. * You should have received a copy of the GNU General Public License along with
  16. * this program. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18. #ifndef __DPU_KMS_H__
  19. #define __DPU_KMS_H__
  20. #include "msm_drv.h"
  21. #include "msm_kms.h"
  22. #include "msm_mmu.h"
  23. #include "msm_gem.h"
  24. #include "dpu_dbg.h"
  25. #include "dpu_hw_catalog.h"
  26. #include "dpu_hw_ctl.h"
  27. #include "dpu_hw_lm.h"
  28. #include "dpu_hw_interrupts.h"
  29. #include "dpu_hw_top.h"
  30. #include "dpu_rm.h"
  31. #include "dpu_power_handle.h"
  32. #include "dpu_irq.h"
  33. #include "dpu_core_perf.h"
  34. #define DRMID(x) ((x) ? (x)->base.id : -1)
  35. /**
  36. * DPU_DEBUG - macro for kms/plane/crtc/encoder/connector logs
  37. * @fmt: Pointer to format string
  38. */
  39. #define DPU_DEBUG(fmt, ...) \
  40. do { \
  41. if (unlikely(drm_debug & DRM_UT_KMS)) \
  42. DRM_DEBUG(fmt, ##__VA_ARGS__); \
  43. else \
  44. pr_debug(fmt, ##__VA_ARGS__); \
  45. } while (0)
  46. /**
  47. * DPU_DEBUG_DRIVER - macro for hardware driver logging
  48. * @fmt: Pointer to format string
  49. */
  50. #define DPU_DEBUG_DRIVER(fmt, ...) \
  51. do { \
  52. if (unlikely(drm_debug & DRM_UT_DRIVER)) \
  53. DRM_ERROR(fmt, ##__VA_ARGS__); \
  54. else \
  55. pr_debug(fmt, ##__VA_ARGS__); \
  56. } while (0)
  57. #define DPU_ERROR(fmt, ...) pr_err("[dpu error]" fmt, ##__VA_ARGS__)
  58. /**
  59. * ktime_compare_safe - compare two ktime structures
  60. * This macro is similar to the standard ktime_compare() function, but
  61. * attempts to also handle ktime overflows.
  62. * @A: First ktime value
  63. * @B: Second ktime value
  64. * Returns: -1 if A < B, 0 if A == B, 1 if A > B
  65. */
  66. #define ktime_compare_safe(A, B) \
  67. ktime_compare(ktime_sub((A), (B)), ktime_set(0, 0))
  68. #define DPU_NAME_SIZE 12
  69. /* timeout in frames waiting for frame done */
  70. #define DPU_FRAME_DONE_TIMEOUT 60
  71. /*
  72. * struct dpu_irq_callback - IRQ callback handlers
  73. * @list: list to callback
  74. * @func: intr handler
  75. * @arg: argument for the handler
  76. */
  77. struct dpu_irq_callback {
  78. struct list_head list;
  79. void (*func)(void *arg, int irq_idx);
  80. void *arg;
  81. };
  82. /**
  83. * struct dpu_irq: IRQ structure contains callback registration info
  84. * @total_irq: total number of irq_idx obtained from HW interrupts mapping
  85. * @irq_cb_tbl: array of IRQ callbacks setting
  86. * @enable_counts array of IRQ enable counts
  87. * @cb_lock: callback lock
  88. * @debugfs_file: debugfs file for irq statistics
  89. */
  90. struct dpu_irq {
  91. u32 total_irqs;
  92. struct list_head *irq_cb_tbl;
  93. atomic_t *enable_counts;
  94. atomic_t *irq_counts;
  95. spinlock_t cb_lock;
  96. struct dentry *debugfs_file;
  97. };
  98. struct dpu_kms {
  99. struct msm_kms base;
  100. struct drm_device *dev;
  101. int core_rev;
  102. struct dpu_mdss_cfg *catalog;
  103. struct dpu_power_handle phandle;
  104. struct dpu_power_client *core_client;
  105. struct dpu_power_event *power_event;
  106. /* directory entry for debugfs */
  107. struct dentry *debugfs_root;
  108. struct dentry *debugfs_danger;
  109. struct dentry *debugfs_vbif;
  110. /* io/register spaces: */
  111. void __iomem *mmio, *vbif[VBIF_MAX], *reg_dma;
  112. unsigned long mmio_len, vbif_len[VBIF_MAX], reg_dma_len;
  113. struct regulator *vdd;
  114. struct regulator *mmagic;
  115. struct regulator *venus;
  116. struct dpu_hw_intr *hw_intr;
  117. struct dpu_irq irq_obj;
  118. struct dpu_core_perf perf;
  119. /* saved atomic state during system suspend */
  120. struct drm_atomic_state *suspend_state;
  121. bool suspend_block;
  122. struct dpu_rm rm;
  123. bool rm_init;
  124. struct dpu_hw_vbif *hw_vbif[VBIF_MAX];
  125. struct dpu_hw_mdp *hw_mdp;
  126. bool has_danger_ctrl;
  127. struct platform_device *pdev;
  128. bool rpm_enabled;
  129. struct dss_module_power mp;
  130. };
  131. struct vsync_info {
  132. u32 frame_count;
  133. u32 line_count;
  134. };
  135. #define to_dpu_kms(x) container_of(x, struct dpu_kms, base)
  136. /* get struct msm_kms * from drm_device * */
  137. #define ddev_to_msm_kms(D) ((D) && (D)->dev_private ? \
  138. ((struct msm_drm_private *)((D)->dev_private))->kms : NULL)
  139. /**
  140. * dpu_kms_is_suspend_state - whether or not the system is pm suspended
  141. * @dev: Pointer to drm device
  142. * Return: Suspend status
  143. */
  144. static inline bool dpu_kms_is_suspend_state(struct drm_device *dev)
  145. {
  146. if (!ddev_to_msm_kms(dev))
  147. return false;
  148. return to_dpu_kms(ddev_to_msm_kms(dev))->suspend_state != NULL;
  149. }
  150. /**
  151. * dpu_kms_is_suspend_blocked - whether or not commits are blocked due to pm
  152. * suspend status
  153. * @dev: Pointer to drm device
  154. * Return: True if commits should be rejected due to pm suspend
  155. */
  156. static inline bool dpu_kms_is_suspend_blocked(struct drm_device *dev)
  157. {
  158. if (!dpu_kms_is_suspend_state(dev))
  159. return false;
  160. return to_dpu_kms(ddev_to_msm_kms(dev))->suspend_block;
  161. }
  162. /**
  163. * Debugfs functions - extra helper functions for debugfs support
  164. *
  165. * Main debugfs documentation is located at,
  166. *
  167. * Documentation/filesystems/debugfs.txt
  168. *
  169. * @dpu_debugfs_setup_regset32: Initialize data for dpu_debugfs_create_regset32
  170. * @dpu_debugfs_create_regset32: Create 32-bit register dump file
  171. * @dpu_debugfs_get_root: Get root dentry for DPU_KMS's debugfs node
  172. */
  173. /**
  174. * Companion structure for dpu_debugfs_create_regset32. Do not initialize the
  175. * members of this structure explicitly; use dpu_debugfs_setup_regset32 instead.
  176. */
  177. struct dpu_debugfs_regset32 {
  178. uint32_t offset;
  179. uint32_t blk_len;
  180. struct dpu_kms *dpu_kms;
  181. };
  182. /**
  183. * dpu_debugfs_setup_regset32 - Initialize register block definition for debugfs
  184. * This function is meant to initialize dpu_debugfs_regset32 structures for use
  185. * with dpu_debugfs_create_regset32.
  186. * @regset: opaque register definition structure
  187. * @offset: sub-block offset
  188. * @length: sub-block length, in bytes
  189. * @dpu_kms: pointer to dpu kms structure
  190. */
  191. void dpu_debugfs_setup_regset32(struct dpu_debugfs_regset32 *regset,
  192. uint32_t offset, uint32_t length, struct dpu_kms *dpu_kms);
  193. /**
  194. * dpu_debugfs_create_regset32 - Create register read back file for debugfs
  195. *
  196. * This function is almost identical to the standard debugfs_create_regset32()
  197. * function, with the main difference being that a list of register
  198. * names/offsets do not need to be provided. The 'read' function simply outputs
  199. * sequential register values over a specified range.
  200. *
  201. * Similar to the related debugfs_create_regset32 API, the structure pointed to
  202. * by regset needs to persist for the lifetime of the created file. The calling
  203. * code is responsible for initialization/management of this structure.
  204. *
  205. * The structure pointed to by regset is meant to be opaque. Please use
  206. * dpu_debugfs_setup_regset32 to initialize it.
  207. *
  208. * @name: File name within debugfs
  209. * @mode: File mode within debugfs
  210. * @parent: Parent directory entry within debugfs, can be NULL
  211. * @regset: Pointer to persistent register block definition
  212. *
  213. * Return: dentry pointer for newly created file, use either debugfs_remove()
  214. * or debugfs_remove_recursive() (on a parent directory) to remove the
  215. * file
  216. */
  217. void *dpu_debugfs_create_regset32(const char *name, umode_t mode,
  218. void *parent, struct dpu_debugfs_regset32 *regset);
  219. /**
  220. * dpu_debugfs_get_root - Return root directory entry for KMS's debugfs
  221. *
  222. * The return value should be passed as the 'parent' argument to subsequent
  223. * debugfs create calls.
  224. *
  225. * @dpu_kms: Pointer to DPU's KMS structure
  226. *
  227. * Return: dentry pointer for DPU's debugfs location
  228. */
  229. void *dpu_debugfs_get_root(struct dpu_kms *dpu_kms);
  230. /**
  231. * DPU info management functions
  232. * These functions/definitions allow for building up a 'dpu_info' structure
  233. * containing one or more "key=value\n" entries.
  234. */
  235. #define DPU_KMS_INFO_MAX_SIZE 4096
  236. /**
  237. * Vblank enable/disable functions
  238. */
  239. int dpu_enable_vblank(struct msm_kms *kms, struct drm_crtc *crtc);
  240. void dpu_disable_vblank(struct msm_kms *kms, struct drm_crtc *crtc);
  241. void dpu_kms_encoder_enable(struct drm_encoder *encoder);
  242. /**
  243. * dpu_kms_get_clk_rate() - get the clock rate
  244. * @dpu_kms: poiner to dpu_kms structure
  245. * @clock_name: clock name to get the rate
  246. *
  247. * Return: current clock rate
  248. */
  249. u64 dpu_kms_get_clk_rate(struct dpu_kms *dpu_kms, char *clock_name);
  250. #endif /* __dpu_kms_H__ */