1 /* 2 * (C) Copyright 2008-2017 Fuzhou Rockchip Electronics Co., Ltd 3 * 4 * SPDX-License-Identifier: GPL-2.0+ 5 */ 6 7 #ifndef _ROCKCHIP_DISPLAY_H 8 #define _ROCKCHIP_DISPLAY_H 9 10 #include <bmp_layout.h> 11 #include <drm_modes.h> 12 #include <edid.h> 13 #include <dm/ofnode.h> 14 15 /* 16 * major: IP major vertion, used for IP structure 17 * minor: big feature change under same structure 18 */ 19 #define VOP_VERSION(major, minor) ((major) << 8 | (minor)) 20 #define VOP_MAJOR(version) ((version) >> 8) 21 #define VOP_MINOR(version) ((version) & 0xff) 22 23 #define VOP_VERSION_RK3568 VOP_VERSION(0x40, 0x15) 24 #define VOP_VERSION_RK3588 VOP_VERSION(0x40, 0x17) 25 26 #define ROCKCHIP_OUTPUT_DUAL_CHANNEL_LEFT_RIGHT_MODE BIT(0) 27 #define ROCKCHIP_OUTPUT_DUAL_CHANNEL_ODD_EVEN_MODE BIT(1) 28 #define ROCKCHIP_OUTPUT_DATA_SWAP BIT(2) 29 #define ROCKCHIP_OUTPUT_MIPI_DS_MODE BIT(3) 30 31 #define ROCKCHIP_DSC_PPS_SIZE_BYTE 88 32 33 enum data_format { 34 ROCKCHIP_FMT_ARGB8888 = 0, 35 ROCKCHIP_FMT_RGB888, 36 ROCKCHIP_FMT_RGB565, 37 ROCKCHIP_FMT_YUV420SP = 4, 38 ROCKCHIP_FMT_YUV422SP, 39 ROCKCHIP_FMT_YUV444SP, 40 }; 41 42 enum display_mode { 43 ROCKCHIP_DISPLAY_FULLSCREEN, 44 ROCKCHIP_DISPLAY_CENTER, 45 }; 46 47 enum rockchip_cmd_type { 48 CMD_TYPE_DEFAULT, 49 CMD_TYPE_SPI, 50 CMD_TYPE_MCU 51 }; 52 53 enum rockchip_mcu_cmd { 54 MCU_WRCMD = 0, 55 MCU_WRDATA, 56 MCU_SETBYPASS, 57 }; 58 59 /* 60 * display output interface supported by rockchip lcdc 61 */ 62 #define ROCKCHIP_OUT_MODE_P888 0 63 #define ROCKCHIP_OUT_MODE_BT1120 0 64 #define ROCKCHIP_OUT_MODE_P666 1 65 #define ROCKCHIP_OUT_MODE_P565 2 66 #define ROCKCHIP_OUT_MODE_BT656 5 67 #define ROCKCHIP_OUT_MODE_S888 8 68 #define ROCKCHIP_OUT_MODE_S888_DUMMY 12 69 #define ROCKCHIP_OUT_MODE_YUV420 14 70 /* for use special outface */ 71 #define ROCKCHIP_OUT_MODE_AAAA 15 72 73 #define VOP_OUTPUT_IF_RGB BIT(0) 74 #define VOP_OUTPUT_IF_BT1120 BIT(1) 75 #define VOP_OUTPUT_IF_BT656 BIT(2) 76 #define VOP_OUTPUT_IF_LVDS0 BIT(3) 77 #define VOP_OUTPUT_IF_LVDS1 BIT(4) 78 #define VOP_OUTPUT_IF_MIPI0 BIT(5) 79 #define VOP_OUTPUT_IF_MIPI1 BIT(6) 80 #define VOP_OUTPUT_IF_eDP0 BIT(7) 81 #define VOP_OUTPUT_IF_eDP1 BIT(8) 82 #define VOP_OUTPUT_IF_DP0 BIT(9) 83 #define VOP_OUTPUT_IF_DP1 BIT(10) 84 #define VOP_OUTPUT_IF_HDMI0 BIT(11) 85 #define VOP_OUTPUT_IF_HDMI1 BIT(12) 86 87 struct rockchip_mcu_timing { 88 int mcu_pix_total; 89 int mcu_cs_pst; 90 int mcu_cs_pend; 91 int mcu_rw_pst; 92 int mcu_rw_pend; 93 int mcu_hold_mode; 94 }; 95 96 struct vop_rect { 97 int width; 98 int height; 99 }; 100 101 struct rockchip_dsc_sink_cap { 102 /** 103 * @slice_width: the number of pixel columns that comprise the slice width 104 * @slice_height: the number of pixel rows that comprise the slice height 105 * @block_pred: Does block prediction 106 * @native_420: Does sink support DSC with 4:2:0 compression 107 * @bpc_supported: compressed bpc supported by sink : 10, 12 or 16 bpc 108 * @version_major: DSC major version 109 * @version_minor: DSC minor version 110 * @target_bits_per_pixel_x16: bits num after compress and multiply 16 111 */ 112 u16 slice_width; 113 u16 slice_height; 114 bool block_pred; 115 bool native_420; 116 u8 bpc_supported; 117 u8 version_major; 118 u8 version_minor; 119 u16 target_bits_per_pixel_x16; 120 }; 121 122 struct display_rect { 123 int x; 124 int y; 125 int w; 126 int h; 127 }; 128 129 struct bcsh_state { 130 int brightness; 131 int contrast; 132 int saturation; 133 int sin_hue; 134 int cos_hue; 135 }; 136 137 struct crtc_state { 138 struct udevice *dev; 139 struct rockchip_crtc *crtc; 140 void *private; 141 ofnode node; 142 struct device_node *ports_node; /* if (ports_node) it's vop2; */ 143 int crtc_id; 144 145 int format; 146 u32 dma_addr; 147 int ymirror; 148 int rb_swap; 149 int xvir; 150 int post_csc_mode; 151 struct display_rect src_rect; 152 struct display_rect crtc_rect; 153 struct display_rect right_src_rect; 154 struct display_rect right_crtc_rect; 155 bool yuv_overlay; 156 bool post_r2y_en; 157 bool post_y2r_en; 158 bool bcsh_en; 159 bool splice_mode; 160 u8 splice_crtc_id; 161 struct rockchip_mcu_timing mcu_timing; 162 u32 dual_channel_swap; 163 u32 feature; 164 struct vop_rect max_output; 165 }; 166 167 struct panel_state { 168 struct rockchip_panel *panel; 169 170 ofnode dsp_lut_node; 171 }; 172 173 struct overscan { 174 int left_margin; 175 int right_margin; 176 int top_margin; 177 int bottom_margin; 178 }; 179 180 struct connector_state { 181 struct udevice *dev; 182 const struct rockchip_connector *connector; 183 struct rockchip_bridge *bridge; 184 struct rockchip_phy *phy; 185 ofnode node; 186 187 void *private; 188 189 struct drm_display_mode mode; 190 struct overscan overscan; 191 u8 edid[EDID_SIZE * 4]; 192 int bus_format; 193 int output_mode; 194 int type; 195 int output_if; 196 int output_flags; 197 int color_space; 198 int dsc_enable; 199 unsigned int bpc; 200 201 /** 202 * @hold_mode: enabled when it's: 203 * (1) mcu hold mode 204 * (2) mipi dsi cmd mode 205 * (3) edp psr mode 206 */ 207 bool hold_mode; 208 209 struct base2_disp_info *disp_info; /* disp_info from baseparameter 2.0 */ 210 211 u8 dsc_id; 212 u8 dsc_slice_num; 213 u8 dsc_pixel_num; 214 u64 dsc_txp_clk; 215 u64 dsc_pxl_clk; 216 u64 dsc_cds_clk; 217 struct rockchip_dsc_sink_cap dsc_sink_cap; 218 219 struct { 220 u32 *lut; 221 int size; 222 } gamma; 223 }; 224 225 struct logo_info { 226 int mode; 227 char *mem; 228 bool ymirror; 229 u32 offset; 230 u32 width; 231 int height; 232 u32 bpp; 233 }; 234 235 struct rockchip_logo_cache { 236 struct list_head head; 237 char name[20]; 238 struct logo_info logo; 239 }; 240 241 struct display_state { 242 struct list_head head; 243 244 const void *blob; 245 ofnode node; 246 247 struct crtc_state crtc_state; 248 struct connector_state conn_state; 249 struct panel_state panel_state; 250 251 char ulogo_name[30]; 252 char klogo_name[30]; 253 254 struct logo_info logo; 255 int logo_mode; 256 int charge_logo_mode; 257 void *mem_base; 258 int mem_size; 259 260 int enable; 261 int is_init; 262 int is_enable; 263 bool force_output; 264 struct drm_display_mode force_mode; 265 u32 force_bus_format; 266 }; 267 268 static inline struct rockchip_panel *state_get_panel(struct display_state *s) 269 { 270 struct panel_state *panel_state = &s->panel_state; 271 272 return panel_state->panel; 273 } 274 275 int drm_mode_vrefresh(const struct drm_display_mode *mode); 276 int display_send_mcu_cmd(struct display_state *state, u32 type, u32 val); 277 bool drm_mode_is_420(const struct drm_display_info *display, 278 struct drm_display_mode *mode); 279 struct base2_disp_info *rockchip_get_disp_info(int type, int id); 280 281 void drm_mode_max_resolution_filter(struct hdmi_edid_data *edid_data, 282 struct vop_rect *max_output); 283 unsigned long get_cubic_lut_buffer(int crtc_id); 284 285 #endif 286