tidss_dispc.h 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  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 <drm/drm_color_mgmt.h>
  9. #include "tidss_drv.h"
  10. struct dispc_device;
  11. struct drm_crtc_state;
  12. struct drm_plane_state;
  13. enum tidss_gamma_type { TIDSS_GAMMA_8BIT, TIDSS_GAMMA_10BIT };
  14. struct tidss_vp_feat {
  15. struct tidss_vp_color_feat {
  16. u32 gamma_size;
  17. enum tidss_gamma_type gamma_type;
  18. bool has_ctm;
  19. } color;
  20. };
  21. struct tidss_plane_feat {
  22. struct tidss_plane_color_feat {
  23. u32 encodings;
  24. u32 ranges;
  25. enum drm_color_encoding default_encoding;
  26. enum drm_color_range default_range;
  27. } color;
  28. struct tidss_plane_blend_feat {
  29. bool global_alpha;
  30. } blend;
  31. };
  32. struct dispc_features_scaling {
  33. u32 in_width_max_5tap_rgb;
  34. u32 in_width_max_3tap_rgb;
  35. u32 in_width_max_5tap_yuv;
  36. u32 in_width_max_3tap_yuv;
  37. u32 upscale_limit;
  38. u32 downscale_limit_5tap;
  39. u32 downscale_limit_3tap;
  40. u32 xinc_max;
  41. };
  42. struct dispc_vid_info {
  43. const char *name; /* Should match dt reg names */
  44. u32 hw_id;
  45. bool is_lite;
  46. };
  47. struct dispc_errata {
  48. bool i2000; /* DSS Does Not Support YUV Pixel Data Formats */
  49. };
  50. enum dispc_vp_bus_type {
  51. DISPC_VP_DPI, /* DPI output */
  52. DISPC_VP_OLDI_AM65X, /* OLDI (LVDS) output for AM65x DSS */
  53. DISPC_VP_INTERNAL, /* SoC internal routing */
  54. DISPC_VP_TIED_OFF, /* Tied off / Unavailable */
  55. DISPC_VP_MAX_BUS_TYPE,
  56. };
  57. enum dispc_dss_subrevision {
  58. DISPC_K2G,
  59. DISPC_AM625,
  60. DISPC_AM62L,
  61. DISPC_AM62A7,
  62. DISPC_AM65X,
  63. DISPC_J721E,
  64. };
  65. struct dispc_features {
  66. struct dispc_features_scaling scaling;
  67. enum dispc_dss_subrevision subrev;
  68. const char *common;
  69. const u16 *common_regs;
  70. u32 num_vps;
  71. const char *vp_name[TIDSS_MAX_PORTS]; /* Should match dt reg names */
  72. const char *ovr_name[TIDSS_MAX_PORTS]; /* Should match dt reg names */
  73. const char *vpclk_name[TIDSS_MAX_PORTS]; /* Should match dt clk names */
  74. const enum dispc_vp_bus_type vp_bus_type[TIDSS_MAX_PORTS];
  75. struct tidss_vp_feat vp_feat;
  76. u32 num_vids;
  77. struct dispc_vid_info vid_info[TIDSS_MAX_PLANES];
  78. u32 vid_order[TIDSS_MAX_PLANES];
  79. };
  80. extern const struct dispc_features dispc_k2g_feats;
  81. extern const struct dispc_features dispc_am625_feats;
  82. extern const struct dispc_features dispc_am62a7_feats;
  83. extern const struct dispc_features dispc_am62l_feats;
  84. extern const struct dispc_features dispc_am65x_feats;
  85. extern const struct dispc_features dispc_j721e_feats;
  86. int tidss_configure_oldi(struct tidss_device *tidss, u32 hw_videoport,
  87. u32 oldi_cfg);
  88. void tidss_disable_oldi(struct tidss_device *tidss, u32 hw_videoport);
  89. unsigned int dispc_pclk_diff(unsigned long rate, unsigned long real_rate);
  90. void dispc_set_irqenable(struct dispc_device *dispc, dispc_irq_t mask);
  91. dispc_irq_t dispc_read_and_clear_irqstatus(struct dispc_device *dispc);
  92. void dispc_ovr_set_plane(struct dispc_device *dispc, u32 hw_plane,
  93. u32 hw_videoport, u32 x, u32 y, u32 layer);
  94. void dispc_ovr_enable_layer(struct dispc_device *dispc,
  95. u32 hw_videoport, u32 layer, bool enable);
  96. void dispc_vp_prepare(struct dispc_device *dispc, u32 hw_videoport,
  97. const struct drm_crtc_state *state);
  98. void dispc_vp_enable(struct dispc_device *dispc, u32 hw_videoport);
  99. void dispc_vp_disable(struct dispc_device *dispc, u32 hw_videoport);
  100. void dispc_vp_unprepare(struct dispc_device *dispc, u32 hw_videoport);
  101. bool dispc_vp_go_busy(struct dispc_device *dispc, u32 hw_videoport);
  102. void dispc_vp_go(struct dispc_device *dispc, u32 hw_videoport);
  103. int dispc_vp_bus_check(struct dispc_device *dispc, u32 hw_videoport,
  104. const struct drm_crtc_state *state);
  105. enum drm_mode_status dispc_vp_mode_valid(struct dispc_device *dispc,
  106. u32 hw_videoport,
  107. const struct drm_display_mode *mode);
  108. int dispc_vp_enable_clk(struct dispc_device *dispc, u32 hw_videoport);
  109. void dispc_vp_disable_clk(struct dispc_device *dispc, u32 hw_videoport);
  110. int dispc_vp_set_clk_rate(struct dispc_device *dispc, u32 hw_videoport,
  111. unsigned long rate);
  112. void dispc_vp_setup(struct dispc_device *dispc, u32 hw_videoport,
  113. const struct drm_crtc_state *state, bool newmodeset);
  114. int dispc_runtime_suspend(struct dispc_device *dispc);
  115. int dispc_runtime_resume(struct dispc_device *dispc);
  116. int dispc_plane_check(struct dispc_device *dispc, u32 hw_plane,
  117. const struct drm_plane_state *state,
  118. u32 hw_videoport);
  119. void dispc_plane_setup(struct dispc_device *dispc, u32 hw_plane,
  120. const struct drm_plane_state *state,
  121. u32 hw_videoport);
  122. void dispc_plane_enable(struct dispc_device *dispc, u32 hw_plane, bool enable);
  123. const u32 *dispc_plane_formats(struct dispc_device *dispc, unsigned int *len);
  124. int dispc_init(struct tidss_device *tidss);
  125. void dispc_remove(struct tidss_device *tidss);
  126. #endif