msm_kms.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. /*
  2. * Copyright (c) 2016-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 __MSM_KMS_H__
  19. #define __MSM_KMS_H__
  20. #include <linux/clk.h>
  21. #include <linux/regulator/consumer.h>
  22. #include "msm_drv.h"
  23. #define MAX_PLANE 4
  24. /* As there are different display controller blocks depending on the
  25. * snapdragon version, the kms support is split out and the appropriate
  26. * implementation is loaded at runtime. The kms module is responsible
  27. * for constructing the appropriate planes/crtcs/encoders/connectors.
  28. */
  29. struct msm_kms_funcs {
  30. /* hw initialization: */
  31. int (*hw_init)(struct msm_kms *kms);
  32. /* irq handling: */
  33. void (*irq_preinstall)(struct msm_kms *kms);
  34. int (*irq_postinstall)(struct msm_kms *kms);
  35. void (*irq_uninstall)(struct msm_kms *kms);
  36. irqreturn_t (*irq)(struct msm_kms *kms);
  37. int (*enable_vblank)(struct msm_kms *kms, struct drm_crtc *crtc);
  38. void (*disable_vblank)(struct msm_kms *kms, struct drm_crtc *crtc);
  39. /* modeset, bracketing atomic_commit(): */
  40. void (*prepare_commit)(struct msm_kms *kms, struct drm_atomic_state *state);
  41. void (*commit)(struct msm_kms *kms, struct drm_atomic_state *state);
  42. void (*complete_commit)(struct msm_kms *kms, struct drm_atomic_state *state);
  43. /* functions to wait for atomic commit completed on each CRTC */
  44. void (*wait_for_crtc_commit_done)(struct msm_kms *kms,
  45. struct drm_crtc *crtc);
  46. /* get msm_format w/ optional format modifiers from drm_mode_fb_cmd2 */
  47. const struct msm_format *(*get_format)(struct msm_kms *kms,
  48. const uint32_t format,
  49. const uint64_t modifiers);
  50. /* do format checking on format modified through fb_cmd2 modifiers */
  51. int (*check_modified_format)(const struct msm_kms *kms,
  52. const struct msm_format *msm_fmt,
  53. const struct drm_mode_fb_cmd2 *cmd,
  54. struct drm_gem_object **bos);
  55. /* misc: */
  56. long (*round_pixclk)(struct msm_kms *kms, unsigned long rate,
  57. struct drm_encoder *encoder);
  58. int (*set_split_display)(struct msm_kms *kms,
  59. struct drm_encoder *encoder,
  60. struct drm_encoder *slave_encoder,
  61. bool is_cmd_mode);
  62. void (*set_encoder_mode)(struct msm_kms *kms,
  63. struct drm_encoder *encoder,
  64. bool cmd_mode);
  65. /* pm suspend/resume hooks */
  66. int (*pm_suspend)(struct device *dev);
  67. int (*pm_resume)(struct device *dev);
  68. /* cleanup: */
  69. void (*destroy)(struct msm_kms *kms);
  70. #ifdef CONFIG_DEBUG_FS
  71. /* debugfs: */
  72. int (*debugfs_init)(struct msm_kms *kms, struct drm_minor *minor);
  73. #endif
  74. };
  75. struct msm_kms {
  76. const struct msm_kms_funcs *funcs;
  77. /* irq number to be passed on to drm_irq_install */
  78. int irq;
  79. /* mapper-id used to request GEM buffer mapped for scanout: */
  80. struct msm_gem_address_space *aspace;
  81. };
  82. static inline void msm_kms_init(struct msm_kms *kms,
  83. const struct msm_kms_funcs *funcs)
  84. {
  85. kms->funcs = funcs;
  86. }
  87. struct msm_kms *mdp4_kms_init(struct drm_device *dev);
  88. struct msm_kms *mdp5_kms_init(struct drm_device *dev);
  89. struct msm_kms *dpu_kms_init(struct drm_device *dev);
  90. struct msm_mdss_funcs {
  91. int (*enable)(struct msm_mdss *mdss);
  92. int (*disable)(struct msm_mdss *mdss);
  93. void (*destroy)(struct drm_device *dev);
  94. };
  95. struct msm_mdss {
  96. struct drm_device *dev;
  97. const struct msm_mdss_funcs *funcs;
  98. };
  99. int mdp5_mdss_init(struct drm_device *dev);
  100. int dpu_mdss_init(struct drm_device *dev);
  101. #endif /* __MSM_KMS_H__ */