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