tidss_dispc.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Copyright (C) 2018 Texas Instruments Incorporated - https://www.ti.com/
  4. * Author: Tomi Valkeinen <tomi.valkeinen@ti.com>
  5. */
  6. #ifndef __TIDSS_DISPC_H__
  7. #define __TIDSS_DISPC_H__
  8. #include "tidss_drv.h"
  9. struct dispc_device;
  10. struct drm_crtc_state;
  11. enum tidss_gamma_type { TIDSS_GAMMA_8BIT, TIDSS_GAMMA_10BIT };
  12. struct tidss_vp_feat {
  13. struct tidss_vp_color_feat {
  14. u32 gamma_size;
  15. enum tidss_gamma_type gamma_type;
  16. bool has_ctm;
  17. } color;
  18. };
  19. struct tidss_plane_feat {
  20. struct tidss_plane_color_feat {
  21. u32 encodings;
  22. u32 ranges;
  23. enum drm_color_encoding default_encoding;
  24. enum drm_color_range default_range;
  25. } color;
  26. struct tidss_plane_blend_feat {
  27. bool global_alpha;
  28. } blend;
  29. };
  30. struct dispc_features_scaling {
  31. u32 in_width_max_5tap_rgb;
  32. u32 in_width_max_3tap_rgb;
  33. u32 in_width_max_5tap_yuv;
  34. u32 in_width_max_3tap_yuv;
  35. u32 upscale_limit;
  36. u32 downscale_limit_5tap;
  37. u32 downscale_limit_3tap;
  38. u32 xinc_max;
  39. };
  40. struct dispc_errata {
  41. bool i2000; /* DSS Does Not Support YUV Pixel Data Formats */
  42. };
  43. enum dispc_vp_bus_type {
  44. DISPC_VP_DPI, /* DPI output */
  45. DISPC_VP_OLDI, /* OLDI (LVDS) output */
  46. DISPC_VP_INTERNAL, /* SoC internal routing */
  47. DISPC_VP_TIED_OFF, /* Tied off / Unavailable */
  48. DISPC_VP_MAX_BUS_TYPE,
  49. };
  50. enum dispc_dss_subrevision {
  51. DISPC_K2G,
  52. DISPC_AM625,
  53. DISPC_AM62A7,
  54. DISPC_AM65X,
  55. DISPC_J721E,
  56. };
  57. struct dispc_features {
  58. int min_pclk_khz;
  59. int max_pclk_khz[DISPC_VP_MAX_BUS_TYPE];
  60. struct dispc_features_scaling scaling;
  61. enum dispc_dss_subrevision subrev;
  62. const char *common;
  63. const u16 *common_regs;
  64. u32 num_vps;
  65. const char *vp_name[TIDSS_MAX_PORTS]; /* Should match dt reg names */
  66. const char *ovr_name[TIDSS_MAX_PORTS]; /* Should match dt reg names */
  67. const char *vpclk_name[TIDSS_MAX_PORTS]; /* Should match dt clk names */
  68. const enum dispc_vp_bus_type vp_bus_type[TIDSS_MAX_PORTS];
  69. struct tidss_vp_feat vp_feat;
  70. u32 num_planes;
  71. const char *vid_name[TIDSS_MAX_PLANES]; /* Should match dt reg names */
  72. bool vid_lite[TIDSS_MAX_PLANES];
  73. u32 vid_order[TIDSS_MAX_PLANES];
  74. };
  75. extern const struct dispc_features dispc_k2g_feats;
  76. extern const struct dispc_features dispc_am625_feats;
  77. extern const struct dispc_features dispc_am62a7_feats;
  78. extern const struct dispc_features dispc_am65x_feats;
  79. extern const struct dispc_features dispc_j721e_feats;
  80. void dispc_set_irqenable(struct dispc_device *dispc, dispc_irq_t mask);
  81. dispc_irq_t dispc_read_and_clear_irqstatus(struct dispc_device *dispc);
  82. void dispc_ovr_set_plane(struct dispc_device *dispc, u32 hw_plane,
  83. u32 hw_videoport, u32 x, u32 y, u32 layer);
  84. void dispc_ovr_enable_layer(struct dispc_device *dispc,
  85. u32 hw_videoport, u32 layer, bool enable);
  86. void dispc_vp_prepare(struct dispc_device *dispc, u32 hw_videoport,
  87. const struct drm_crtc_state *state);
  88. void dispc_vp_enable(struct dispc_device *dispc, u32 hw_videoport,
  89. const struct drm_crtc_state *state);
  90. void dispc_vp_disable(struct dispc_device *dispc, u32 hw_videoport);
  91. void dispc_vp_unprepare(struct dispc_device *dispc, u32 hw_videoport);
  92. bool dispc_vp_go_busy(struct dispc_device *dispc, u32 hw_videoport);
  93. void dispc_vp_go(struct dispc_device *dispc, u32 hw_videoport);
  94. int dispc_vp_bus_check(struct dispc_device *dispc, u32 hw_videoport,
  95. const struct drm_crtc_state *state);
  96. enum drm_mode_status dispc_vp_mode_valid(struct dispc_device *dispc,
  97. u32 hw_videoport,
  98. const struct drm_display_mode *mode);
  99. int dispc_vp_enable_clk(struct dispc_device *dispc, u32 hw_videoport);
  100. void dispc_vp_disable_clk(struct dispc_device *dispc, u32 hw_videoport);
  101. int dispc_vp_set_clk_rate(struct dispc_device *dispc, u32 hw_videoport,
  102. unsigned long rate);
  103. void dispc_vp_setup(struct dispc_device *dispc, u32 hw_videoport,
  104. const struct drm_crtc_state *state, bool newmodeset);
  105. int dispc_runtime_suspend(struct dispc_device *dispc);
  106. int dispc_runtime_resume(struct dispc_device *dispc);
  107. int dispc_plane_check(struct dispc_device *dispc, u32 hw_plane,
  108. const struct drm_plane_state *state,
  109. u32 hw_videoport);
  110. void dispc_plane_setup(struct dispc_device *dispc, u32 hw_plane,
  111. const struct drm_plane_state *state,
  112. u32 hw_videoport);
  113. void dispc_plane_enable(struct dispc_device *dispc, u32 hw_plane, bool enable);
  114. const u32 *dispc_plane_formats(struct dispc_device *dispc, unsigned int *len);
  115. int dispc_init(struct tidss_device *tidss);
  116. void dispc_remove(struct tidss_device *tidss);
  117. #endif