13d0407baSopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
23d0407baSopenharmony_ci/*
33d0407baSopenharmony_ci * Copyright (C) Fuzhou Rockchip Electronics Co.Ltd
43d0407baSopenharmony_ci * Author:Mark Yao <mark.yao@rock-chips.com>
53d0407baSopenharmony_ci *
63d0407baSopenharmony_ci * based on exynos_drm_drv.h
73d0407baSopenharmony_ci */
83d0407baSopenharmony_ci
93d0407baSopenharmony_ci#ifndef _ROCKCHIP_DRM_DRV_H
103d0407baSopenharmony_ci#define _ROCKCHIP_DRM_DRV_H
113d0407baSopenharmony_ci
123d0407baSopenharmony_ci#include <drm/drm_atomic_helper.h>
133d0407baSopenharmony_ci#include <drm/drm_dsc.h>
143d0407baSopenharmony_ci#include <drm/drm_fb_helper.h>
153d0407baSopenharmony_ci#include <drm/drm_fourcc.h>
163d0407baSopenharmony_ci#include <drm/drm_gem.h>
173d0407baSopenharmony_ci#include <uapi/drm/rockchip_drm.h>
183d0407baSopenharmony_ci#include <linux/module.h>
193d0407baSopenharmony_ci#include <linux/component.h>
203d0407baSopenharmony_ci
213d0407baSopenharmony_ci#include <soc/rockchip/rockchip_dmc.h>
223d0407baSopenharmony_ci
233d0407baSopenharmony_ci#include <drm/panel-simple.h>
243d0407baSopenharmony_ci
253d0407baSopenharmony_ci#include <drm/rockchip_drm_debugfs.h>
263d0407baSopenharmony_ci
273d0407baSopenharmony_ci#define ROCKCHIP_MAX_FB_BUFFER	3
283d0407baSopenharmony_ci#define ROCKCHIP_MAX_CONNECTOR	2
293d0407baSopenharmony_ci#define ROCKCHIP_MAX_CRTC	4
303d0407baSopenharmony_ci#define ROCKCHIP_MAX_LAYER	16
313d0407baSopenharmony_ci
323d0407baSopenharmony_ci
333d0407baSopenharmony_cistruct drm_device;
343d0407baSopenharmony_cistruct drm_connector;
353d0407baSopenharmony_cistruct iommu_domain;
363d0407baSopenharmony_ci
373d0407baSopenharmony_ci#define VOP_OUTPUT_IF_RGB	BIT(0)
383d0407baSopenharmony_ci#define VOP_OUTPUT_IF_BT1120	BIT(1)
393d0407baSopenharmony_ci#define VOP_OUTPUT_IF_BT656	BIT(2)
403d0407baSopenharmony_ci#define VOP_OUTPUT_IF_LVDS0	BIT(3)
413d0407baSopenharmony_ci#define VOP_OUTPUT_IF_LVDS1	BIT(4)
423d0407baSopenharmony_ci#define VOP_OUTPUT_IF_MIPI0	BIT(5)
433d0407baSopenharmony_ci#define VOP_OUTPUT_IF_MIPI1	BIT(6)
443d0407baSopenharmony_ci#define VOP_OUTPUT_IF_eDP0	BIT(7)
453d0407baSopenharmony_ci#define VOP_OUTPUT_IF_eDP1	BIT(8)
463d0407baSopenharmony_ci#define VOP_OUTPUT_IF_DP0	BIT(9)
473d0407baSopenharmony_ci#define VOP_OUTPUT_IF_DP1	BIT(10)
483d0407baSopenharmony_ci#define VOP_OUTPUT_IF_HDMI0	BIT(11)
493d0407baSopenharmony_ci#define VOP_OUTPUT_IF_HDMI1	BIT(12)
503d0407baSopenharmony_ci
513d0407baSopenharmony_ci#ifndef DRM_FORMAT_NV20
523d0407baSopenharmony_ci#define DRM_FORMAT_NV20		fourcc_code('N', 'V', '2', '0') /* 2x1 subsampled Cr:Cb plane */
533d0407baSopenharmony_ci#endif
543d0407baSopenharmony_ci
553d0407baSopenharmony_ci#ifndef DRM_FORMAT_NV30
563d0407baSopenharmony_ci#define DRM_FORMAT_NV30		fourcc_code('N', 'V', '3', '0') /* non-subsampled Cr:Cb plane */
573d0407baSopenharmony_ci#endif
583d0407baSopenharmony_ci
593d0407baSopenharmony_cistruct rockchip_drm_sub_dev {
603d0407baSopenharmony_ci	struct list_head list;
613d0407baSopenharmony_ci	struct drm_connector *connector;
623d0407baSopenharmony_ci	struct device_node *of_node;
633d0407baSopenharmony_ci	void (*loader_protect)(struct drm_encoder *encoder, bool on);
643d0407baSopenharmony_ci	void (*oob_hotplug_event)(struct drm_connector *connector);
653d0407baSopenharmony_ci};
663d0407baSopenharmony_ci
673d0407baSopenharmony_cistruct rockchip_sdr2hdr_state {
683d0407baSopenharmony_ci	int sdr2hdr_func;
693d0407baSopenharmony_ci
703d0407baSopenharmony_ci	bool bt1886eotf_pre_conv_en;
713d0407baSopenharmony_ci	bool rgb2rgb_pre_conv_en;
723d0407baSopenharmony_ci	bool rgb2rgb_pre_conv_mode;
733d0407baSopenharmony_ci	bool st2084oetf_pre_conv_en;
743d0407baSopenharmony_ci
753d0407baSopenharmony_ci	bool bt1886eotf_post_conv_en;
763d0407baSopenharmony_ci	bool rgb2rgb_post_conv_en;
773d0407baSopenharmony_ci	bool rgb2rgb_post_conv_mode;
783d0407baSopenharmony_ci	bool st2084oetf_post_conv_en;
793d0407baSopenharmony_ci};
803d0407baSopenharmony_ci
813d0407baSopenharmony_cistruct rockchip_hdr_state {
823d0407baSopenharmony_ci	bool pre_overlay;
833d0407baSopenharmony_ci	bool hdr2sdr_en;
843d0407baSopenharmony_ci	struct rockchip_sdr2hdr_state sdr2hdr_state;
853d0407baSopenharmony_ci};
863d0407baSopenharmony_ci
873d0407baSopenharmony_cistruct rockchip_bcsh_state {
883d0407baSopenharmony_ci	int brightness;
893d0407baSopenharmony_ci	int contrast;
903d0407baSopenharmony_ci	int saturation;
913d0407baSopenharmony_ci	int sin_hue;
923d0407baSopenharmony_ci	int cos_hue;
933d0407baSopenharmony_ci};
943d0407baSopenharmony_ci
953d0407baSopenharmony_cistruct rockchip_crtc {
963d0407baSopenharmony_ci	struct drm_crtc crtc;
973d0407baSopenharmony_ci#if defined(CONFIG_ROCKCHIP_DRM_DEBUG)
983d0407baSopenharmony_ci	/**
993d0407baSopenharmony_ci	 * @vop_dump_status the status of vop dump control
1003d0407baSopenharmony_ci	 * @vop_dump_list_head the list head of vop dump list
1013d0407baSopenharmony_ci	 * @vop_dump_list_init_flag init once
1023d0407baSopenharmony_ci	 * @vop_dump_times control the dump times
1033d0407baSopenharmony_ci	 * @frme_count the frame of dump buf
1043d0407baSopenharmony_ci	 */
1053d0407baSopenharmony_ci	enum vop_dump_status vop_dump_status;
1063d0407baSopenharmony_ci	struct list_head vop_dump_list_head;
1073d0407baSopenharmony_ci	bool vop_dump_list_init_flag;
1083d0407baSopenharmony_ci	int vop_dump_times;
1093d0407baSopenharmony_ci	int frame_count;
1103d0407baSopenharmony_ci#endif
1113d0407baSopenharmony_ci};
1123d0407baSopenharmony_ci
1133d0407baSopenharmony_cistruct rockchip_dsc_sink_cap {
1143d0407baSopenharmony_ci	/**
1153d0407baSopenharmony_ci	 * @slice_width: the number of pixel columns that comprise the slice width
1163d0407baSopenharmony_ci	 * @slice_height: the number of pixel rows that comprise the slice height
1173d0407baSopenharmony_ci	 * @block_pred: Does block prediction
1183d0407baSopenharmony_ci	 * @native_420: Does sink support DSC with 4:2:0 compression
1193d0407baSopenharmony_ci	 * @bpc_supported: compressed bpc supported by sink : 10, 12 or 16 bpc
1203d0407baSopenharmony_ci	 * @version_major: DSC major version
1213d0407baSopenharmony_ci	 * @version_minor: DSC minor version
1223d0407baSopenharmony_ci	 * @target_bits_per_pixel_x16: bits num after compress and multiply 16
1233d0407baSopenharmony_ci	 */
1243d0407baSopenharmony_ci	u16 slice_width;
1253d0407baSopenharmony_ci	u16 slice_height;
1263d0407baSopenharmony_ci	bool block_pred;
1273d0407baSopenharmony_ci	bool native_420;
1283d0407baSopenharmony_ci	u8 bpc_supported;
1293d0407baSopenharmony_ci	u8 version_major;
1303d0407baSopenharmony_ci	u8 version_minor;
1313d0407baSopenharmony_ci	u16 target_bits_per_pixel_x16;
1323d0407baSopenharmony_ci};
1333d0407baSopenharmony_ci
1343d0407baSopenharmony_cistruct rockchip_crtc_state {
1353d0407baSopenharmony_ci	struct drm_crtc_state base;
1363d0407baSopenharmony_ci	int output_type;
1373d0407baSopenharmony_ci	int output_mode;
1383d0407baSopenharmony_ci	int output_bpc;
1393d0407baSopenharmony_ci	int output_flags;
1403d0407baSopenharmony_ci	bool enable_afbc;
1413d0407baSopenharmony_ci	/**
1423d0407baSopenharmony_ci	 * @splice_mode: enabled when display a hdisplay > 4096 on rk3588
1433d0407baSopenharmony_ci	 */
1443d0407baSopenharmony_ci	bool splice_mode;
1453d0407baSopenharmony_ci
1463d0407baSopenharmony_ci	/**
1473d0407baSopenharmony_ci	 * @hold_mode: enabled when it's:
1483d0407baSopenharmony_ci	 * (1) mcu hold mode
1493d0407baSopenharmony_ci	 * (2) mipi dsi cmd mode
1503d0407baSopenharmony_ci	 * (3) edp psr mode
1513d0407baSopenharmony_ci	 */
1523d0407baSopenharmony_ci	bool hold_mode;
1533d0407baSopenharmony_ci
1543d0407baSopenharmony_ci	struct drm_tv_connector_state *tv_state;
1553d0407baSopenharmony_ci	int left_margin;
1563d0407baSopenharmony_ci	int right_margin;
1573d0407baSopenharmony_ci	int top_margin;
1583d0407baSopenharmony_ci	int bottom_margin;
1593d0407baSopenharmony_ci	int vdisplay;
1603d0407baSopenharmony_ci	int afbdc_win_format;
1613d0407baSopenharmony_ci	int afbdc_win_width;
1623d0407baSopenharmony_ci	int afbdc_win_height;
1633d0407baSopenharmony_ci	int afbdc_win_ptr;
1643d0407baSopenharmony_ci	int afbdc_win_id;
1653d0407baSopenharmony_ci	int afbdc_en;
1663d0407baSopenharmony_ci	int afbdc_win_vir_width;
1673d0407baSopenharmony_ci	int afbdc_win_xoffset;
1683d0407baSopenharmony_ci	int afbdc_win_yoffset;
1693d0407baSopenharmony_ci	int dsp_layer_sel;
1703d0407baSopenharmony_ci	u32 output_if;
1713d0407baSopenharmony_ci	u32 bus_format;
1723d0407baSopenharmony_ci	u32 bus_flags;
1733d0407baSopenharmony_ci	int yuv_overlay;
1743d0407baSopenharmony_ci	int post_r2y_en;
1753d0407baSopenharmony_ci	int post_y2r_en;
1763d0407baSopenharmony_ci	int post_csc_mode;
1773d0407baSopenharmony_ci	int bcsh_en;
1783d0407baSopenharmony_ci	int color_space;
1793d0407baSopenharmony_ci	int eotf;
1803d0407baSopenharmony_ci	u32 background;
1813d0407baSopenharmony_ci	u32 line_flag;
1823d0407baSopenharmony_ci	u8 mode_update;
1833d0407baSopenharmony_ci	u8 dsc_id;
1843d0407baSopenharmony_ci	u8 dsc_enable;
1853d0407baSopenharmony_ci
1863d0407baSopenharmony_ci	u8 dsc_slice_num;
1873d0407baSopenharmony_ci	u8 dsc_pixel_num;
1883d0407baSopenharmony_ci
1893d0407baSopenharmony_ci	u64 dsc_txp_clk_rate;
1903d0407baSopenharmony_ci	u64 dsc_pxl_clk_rate;
1913d0407baSopenharmony_ci	u64 dsc_cds_clk_rate;
1923d0407baSopenharmony_ci
1933d0407baSopenharmony_ci	struct drm_dsc_picture_parameter_set pps;
1943d0407baSopenharmony_ci	struct rockchip_dsc_sink_cap dsc_sink_cap;
1953d0407baSopenharmony_ci	struct rockchip_hdr_state hdr;
1963d0407baSopenharmony_ci};
1973d0407baSopenharmony_ci
1983d0407baSopenharmony_ci#define to_rockchip_crtc_state(s) \
1993d0407baSopenharmony_ci		container_of(s, struct rockchip_crtc_state, base)
2003d0407baSopenharmony_ci
2013d0407baSopenharmony_cistruct rockchip_drm_vcnt {
2023d0407baSopenharmony_ci	struct drm_pending_vblank_event *event;
2033d0407baSopenharmony_ci	__u32 sequence;
2043d0407baSopenharmony_ci	int pipe;
2053d0407baSopenharmony_ci};
2063d0407baSopenharmony_ci
2073d0407baSopenharmony_cistruct rockchip_logo {
2083d0407baSopenharmony_ci	dma_addr_t dma_addr;
2093d0407baSopenharmony_ci	void *kvaddr;
2103d0407baSopenharmony_ci	phys_addr_t start;
2113d0407baSopenharmony_ci	phys_addr_t size;
2123d0407baSopenharmony_ci	int count;
2133d0407baSopenharmony_ci};
2143d0407baSopenharmony_ci
2153d0407baSopenharmony_cistruct loader_cubic_lut {
2163d0407baSopenharmony_ci	bool enable;
2173d0407baSopenharmony_ci	u32 offset;
2183d0407baSopenharmony_ci};
2193d0407baSopenharmony_ci
2203d0407baSopenharmony_cistruct rockchip_drm_dsc_cap {
2213d0407baSopenharmony_ci	bool v_1p2;
2223d0407baSopenharmony_ci	bool native_420;
2233d0407baSopenharmony_ci	bool all_bpp;
2243d0407baSopenharmony_ci	u8 bpc_supported;
2253d0407baSopenharmony_ci	u8 max_slices;
2263d0407baSopenharmony_ci	u8 max_lanes;
2273d0407baSopenharmony_ci	u8 max_frl_rate_per_lane;
2283d0407baSopenharmony_ci	u8 total_chunk_kbytes;
2293d0407baSopenharmony_ci	int clk_per_slice;
2303d0407baSopenharmony_ci};
2313d0407baSopenharmony_ci
2323d0407baSopenharmony_cistruct ver_26_v0 {
2333d0407baSopenharmony_ci	u8 yuv422_12bit;
2343d0407baSopenharmony_ci	u8 support_2160p_60;
2353d0407baSopenharmony_ci	u8 global_dimming;
2363d0407baSopenharmony_ci	u8 dm_major_ver;
2373d0407baSopenharmony_ci	u8 dm_minor_ver;
2383d0407baSopenharmony_ci	u16 t_min_pq;
2393d0407baSopenharmony_ci	u16 t_max_pq;
2403d0407baSopenharmony_ci	u16 rx;
2413d0407baSopenharmony_ci	u16 ry;
2423d0407baSopenharmony_ci	u16 gx;
2433d0407baSopenharmony_ci	u16 gy;
2443d0407baSopenharmony_ci	u16 bx;
2453d0407baSopenharmony_ci	u16 by;
2463d0407baSopenharmony_ci	u16 wx;
2473d0407baSopenharmony_ci	u16 wy;
2483d0407baSopenharmony_ci} __packed;
2493d0407baSopenharmony_ci
2503d0407baSopenharmony_cistruct ver_15_v1 {
2513d0407baSopenharmony_ci	u8 yuv422_12bit;
2523d0407baSopenharmony_ci	u8 support_2160p_60;
2533d0407baSopenharmony_ci	u8 global_dimming;
2543d0407baSopenharmony_ci	u8 dm_version;
2553d0407baSopenharmony_ci	u8 colorimetry;
2563d0407baSopenharmony_ci	u8 t_max_lum;
2573d0407baSopenharmony_ci	u8 t_min_lum;
2583d0407baSopenharmony_ci	u8 rx;
2593d0407baSopenharmony_ci	u8 ry;
2603d0407baSopenharmony_ci	u8 gx;
2613d0407baSopenharmony_ci	u8 gy;
2623d0407baSopenharmony_ci	u8 bx;
2633d0407baSopenharmony_ci	u8 by;
2643d0407baSopenharmony_ci} __packed;
2653d0407baSopenharmony_ci
2663d0407baSopenharmony_cistruct ver_12_v1 {
2673d0407baSopenharmony_ci	u8 yuv422_12bit;
2683d0407baSopenharmony_ci	u8 support_2160p_60;
2693d0407baSopenharmony_ci	u8 global_dimming;
2703d0407baSopenharmony_ci	u8 dm_version;
2713d0407baSopenharmony_ci	u8 colorimetry;
2723d0407baSopenharmony_ci	u8 low_latency;
2733d0407baSopenharmony_ci	u8 t_max_lum;
2743d0407baSopenharmony_ci	u8 t_min_lum;
2753d0407baSopenharmony_ci	u8 unique_rx;
2763d0407baSopenharmony_ci	u8 unique_ry;
2773d0407baSopenharmony_ci	u8 unique_gx;
2783d0407baSopenharmony_ci	u8 unique_gy;
2793d0407baSopenharmony_ci	u8 unique_bx;
2803d0407baSopenharmony_ci	u8 unique_by;
2813d0407baSopenharmony_ci} __packed;
2823d0407baSopenharmony_ci
2833d0407baSopenharmony_cistruct ver_12_v2 {
2843d0407baSopenharmony_ci	u8 yuv422_12bit;
2853d0407baSopenharmony_ci	u8 backlt_ctrl;
2863d0407baSopenharmony_ci	u8 global_dimming;
2873d0407baSopenharmony_ci	u8 dm_version;
2883d0407baSopenharmony_ci	u8 backlt_min_luma;
2893d0407baSopenharmony_ci	u8 interface;
2903d0407baSopenharmony_ci	u8 yuv444_10b_12b;
2913d0407baSopenharmony_ci	u8 t_min_pq_v2;
2923d0407baSopenharmony_ci	u8 t_max_pq_v2;
2933d0407baSopenharmony_ci	u8 unique_rx;
2943d0407baSopenharmony_ci	u8 unique_ry;
2953d0407baSopenharmony_ci	u8 unique_gx;
2963d0407baSopenharmony_ci	u8 unique_gy;
2973d0407baSopenharmony_ci	u8 unique_bx;
2983d0407baSopenharmony_ci	u8 unique_by;
2993d0407baSopenharmony_ci} __packed;
3003d0407baSopenharmony_ci
3013d0407baSopenharmony_cistruct next_hdr_sink_data {
3023d0407baSopenharmony_ci	u8 version;
3033d0407baSopenharmony_ci	struct ver_26_v0 ver_26_v0;
3043d0407baSopenharmony_ci	struct ver_15_v1 ver_15_v1;
3053d0407baSopenharmony_ci	struct ver_12_v1 ver_12_v1;
3063d0407baSopenharmony_ci	struct ver_12_v2 ver_12_v2;
3073d0407baSopenharmony_ci} __packed;
3083d0407baSopenharmony_ci
3093d0407baSopenharmony_ci/*
3103d0407baSopenharmony_ci * Rockchip drm private crtc funcs.
3113d0407baSopenharmony_ci * @loader_protect: protect loader logo crtc's power
3123d0407baSopenharmony_ci * @enable_vblank: enable crtc vblank irq.
3133d0407baSopenharmony_ci * @disable_vblank: disable crtc vblank irq.
3143d0407baSopenharmony_ci * @bandwidth: report present crtc bandwidth consume.
3153d0407baSopenharmony_ci */
3163d0407baSopenharmony_cistruct rockchip_crtc_funcs {
3173d0407baSopenharmony_ci	int (*loader_protect)(struct drm_crtc *crtc, bool on);
3183d0407baSopenharmony_ci	int (*enable_vblank)(struct drm_crtc *crtc);
3193d0407baSopenharmony_ci	void (*disable_vblank)(struct drm_crtc *crtc);
3203d0407baSopenharmony_ci	size_t (*bandwidth)(struct drm_crtc *crtc,
3213d0407baSopenharmony_ci			    struct drm_crtc_state *crtc_state,
3223d0407baSopenharmony_ci			    struct dmcfreq_vop_info *vop_bw_info);
3233d0407baSopenharmony_ci	void (*cancel_pending_vblank)(struct drm_crtc *crtc,
3243d0407baSopenharmony_ci				      struct drm_file *file_priv);
3253d0407baSopenharmony_ci	int (*debugfs_init)(struct drm_minor *minor, struct drm_crtc *crtc);
3263d0407baSopenharmony_ci	int (*debugfs_dump)(struct drm_crtc *crtc, struct seq_file *s);
3273d0407baSopenharmony_ci	void (*regs_dump)(struct drm_crtc *crtc, struct seq_file *s);
3283d0407baSopenharmony_ci	enum drm_mode_status (*mode_valid)(struct drm_crtc *crtc,
3293d0407baSopenharmony_ci					   const struct drm_display_mode *mode,
3303d0407baSopenharmony_ci					   int output_type);
3313d0407baSopenharmony_ci	void (*crtc_close)(struct drm_crtc *crtc);
3323d0407baSopenharmony_ci	void (*crtc_send_mcu_cmd)(struct drm_crtc *crtc, u32 type, u32 value);
3333d0407baSopenharmony_ci	void (*te_handler)(struct drm_crtc *crtc);
3343d0407baSopenharmony_ci};
3353d0407baSopenharmony_ci
3363d0407baSopenharmony_cistruct rockchip_dclk_pll {
3373d0407baSopenharmony_ci	struct clk *pll;
3383d0407baSopenharmony_ci	unsigned int use_count;
3393d0407baSopenharmony_ci};
3403d0407baSopenharmony_ci
3413d0407baSopenharmony_ci/*
3423d0407baSopenharmony_ci * Rockchip drm private structure.
3433d0407baSopenharmony_ci *
3443d0407baSopenharmony_ci * @crtc: array of enabled CRTCs, used to map from "pipe" to drm_crtc.
3453d0407baSopenharmony_ci * @num_pipe: number of pipes for this device.
3463d0407baSopenharmony_ci * @mm_lock: protect drm_mm on multi-threads.
3473d0407baSopenharmony_ci */
3483d0407baSopenharmony_cistruct rockchip_drm_private {
3493d0407baSopenharmony_ci	struct rockchip_logo *logo;
3503d0407baSopenharmony_ci	struct drm_fb_helper *fbdev_helper;
3513d0407baSopenharmony_ci	struct drm_gem_object *fbdev_bo;
3523d0407baSopenharmony_ci	struct iommu_domain *domain;
3533d0407baSopenharmony_ci	struct gen_pool *secure_buffer_pool;
3543d0407baSopenharmony_ci	struct mutex mm_lock;
3553d0407baSopenharmony_ci	struct drm_mm mm;
3563d0407baSopenharmony_ci	struct list_head psr_list;
3573d0407baSopenharmony_ci	struct mutex psr_list_lock;
3583d0407baSopenharmony_ci	struct mutex commit_lock;
3593d0407baSopenharmony_ci
3603d0407baSopenharmony_ci	/* private crtc prop */
3613d0407baSopenharmony_ci	struct drm_property *soc_id_prop;
3623d0407baSopenharmony_ci	struct drm_property *port_id_prop;
3633d0407baSopenharmony_ci	struct drm_property *aclk_prop;
3643d0407baSopenharmony_ci	struct drm_property *bg_prop;
3653d0407baSopenharmony_ci	struct drm_property *line_flag_prop;
3663d0407baSopenharmony_ci
3673d0407baSopenharmony_ci	/* private plane prop */
3683d0407baSopenharmony_ci	struct drm_property *eotf_prop;
3693d0407baSopenharmony_ci	struct drm_property *color_space_prop;
3703d0407baSopenharmony_ci	struct drm_property *async_commit_prop;
3713d0407baSopenharmony_ci	struct drm_property *share_id_prop;
3723d0407baSopenharmony_ci
3733d0407baSopenharmony_ci	/* private connector prop */
3743d0407baSopenharmony_ci	struct drm_property *connector_id_prop;
3753d0407baSopenharmony_ci
3763d0407baSopenharmony_ci	const struct rockchip_crtc_funcs *crtc_funcs[ROCKCHIP_MAX_CRTC];
3773d0407baSopenharmony_ci
3783d0407baSopenharmony_ci	struct rockchip_dclk_pll default_pll;
3793d0407baSopenharmony_ci	struct rockchip_dclk_pll hdmi_pll;
3803d0407baSopenharmony_ci
3813d0407baSopenharmony_ci	/*
3823d0407baSopenharmony_ci	 * protect some shared overlay resource
3833d0407baSopenharmony_ci	 * OVL_LAYER_SEL/OVL_PORT_SEL
3843d0407baSopenharmony_ci	 */
3853d0407baSopenharmony_ci	struct mutex ovl_lock;
3863d0407baSopenharmony_ci
3873d0407baSopenharmony_ci	struct rockchip_drm_vcnt vcnt[ROCKCHIP_MAX_CRTC];
3883d0407baSopenharmony_ci	/**
3893d0407baSopenharmony_ci	 * @loader_protect
3903d0407baSopenharmony_ci	 * ignore restore_fbdev_mode_atomic when in logo on state
3913d0407baSopenharmony_ci	 */
3923d0407baSopenharmony_ci	bool loader_protect;
3933d0407baSopenharmony_ci
3943d0407baSopenharmony_ci	dma_addr_t cubic_lut_dma_addr;
3953d0407baSopenharmony_ci	void *cubic_lut_kvaddr;
3963d0407baSopenharmony_ci	struct loader_cubic_lut cubic_lut[ROCKCHIP_MAX_CRTC];
3973d0407baSopenharmony_ci};
3983d0407baSopenharmony_ci
3993d0407baSopenharmony_ciint rockchip_drm_dma_attach_device(struct drm_device *drm_dev,
4003d0407baSopenharmony_ci				   struct device *dev);
4013d0407baSopenharmony_civoid rockchip_drm_dma_detach_device(struct drm_device *drm_dev,
4023d0407baSopenharmony_ci				    struct device *dev);
4033d0407baSopenharmony_ciint rockchip_drm_wait_vact_end(struct drm_crtc *crtc, unsigned int mstimeout);
4043d0407baSopenharmony_ciint rockchip_register_crtc_funcs(struct drm_crtc *crtc,
4053d0407baSopenharmony_ci				 const struct rockchip_crtc_funcs *crtc_funcs);
4063d0407baSopenharmony_civoid rockchip_unregister_crtc_funcs(struct drm_crtc *crtc);
4073d0407baSopenharmony_ci
4083d0407baSopenharmony_civoid rockchip_drm_register_sub_dev(struct rockchip_drm_sub_dev *sub_dev);
4093d0407baSopenharmony_civoid rockchip_drm_unregister_sub_dev(struct rockchip_drm_sub_dev *sub_dev);
4103d0407baSopenharmony_cistruct rockchip_drm_sub_dev *rockchip_drm_get_sub_dev(struct device_node *node);
4113d0407baSopenharmony_ciint rockchip_drm_add_modes_noedid(struct drm_connector *connector);
4123d0407baSopenharmony_civoid rockchip_drm_te_handle(struct drm_crtc *crtc);
4133d0407baSopenharmony_civoid drm_mode_convert_to_split_mode(struct drm_display_mode *mode);
4143d0407baSopenharmony_civoid drm_mode_convert_to_origin_mode(struct drm_display_mode *mode);
4153d0407baSopenharmony_ci#if IS_ENABLED(CONFIG_DRM_ROCKCHIP)
4163d0407baSopenharmony_ciint rockchip_drm_get_sub_dev_type(void);
4173d0407baSopenharmony_ci#else
4183d0407baSopenharmony_cistatic inline int rockchip_drm_get_sub_dev_type(void)
4193d0407baSopenharmony_ci{
4203d0407baSopenharmony_ci	return DRM_MODE_CONNECTOR_Unknown;
4213d0407baSopenharmony_ci}
4223d0407baSopenharmony_ci#endif
4233d0407baSopenharmony_ci
4243d0407baSopenharmony_ciint rockchip_drm_endpoint_is_subdriver(struct device_node *ep);
4253d0407baSopenharmony_ciuint32_t rockchip_drm_of_find_possible_crtcs(struct drm_device *dev,
4263d0407baSopenharmony_ci					     struct device_node *port);
4273d0407baSopenharmony_ciuint32_t rockchip_drm_get_bpp(const struct drm_format_info *info);
4283d0407baSopenharmony_ciint rockchip_drm_get_yuv422_format(struct drm_connector *connector,
4293d0407baSopenharmony_ci				   struct edid *edid);
4303d0407baSopenharmony_ciint rockchip_drm_parse_cea_ext(struct rockchip_drm_dsc_cap *dsc_cap,
4313d0407baSopenharmony_ci			       u8 *max_frl_rate_per_lane, u8 *max_lanes,
4323d0407baSopenharmony_ci			       const struct edid *edid);
4333d0407baSopenharmony_ciint rockchip_drm_parse_next_hdr(struct next_hdr_sink_data *sink_data,
4343d0407baSopenharmony_ci				const struct edid *edid);
4353d0407baSopenharmony_ci
4363d0407baSopenharmony_ciextern struct platform_driver cdn_dp_driver;
4373d0407baSopenharmony_ciextern struct platform_driver dw_hdmi_rockchip_pltfm_driver;
4383d0407baSopenharmony_ciextern struct platform_driver dw_mipi_dsi_rockchip_driver;
4393d0407baSopenharmony_ciextern struct platform_driver dw_mipi_dsi2_rockchip_driver;
4403d0407baSopenharmony_ciextern struct platform_driver inno_hdmi_driver;
4413d0407baSopenharmony_ciextern struct platform_driver rockchip_dp_driver;
4423d0407baSopenharmony_ciextern struct platform_driver rockchip_lvds_driver;
4433d0407baSopenharmony_ciextern struct platform_driver vop_platform_driver;
4443d0407baSopenharmony_ciextern struct platform_driver vop2_platform_driver;
4453d0407baSopenharmony_ciextern struct platform_driver rk3066_hdmi_driver;
4463d0407baSopenharmony_ciextern struct platform_driver rockchip_rgb_driver;
4473d0407baSopenharmony_ciextern struct platform_driver dw_dp_driver;
4483d0407baSopenharmony_ciextern struct platform_driver vconn_platform_driver;
4493d0407baSopenharmony_ci#endif /* _ROCKCHIP_DRM_DRV_H_ */
450