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