xref: /openbmc/linux/drivers/gpu/drm/msm/dp/dp_panel.h (revision 1c5f6051)
1c943b494SChandan Uddaraju /* SPDX-License-Identifier: GPL-2.0-only */
2c943b494SChandan Uddaraju /*
3c943b494SChandan Uddaraju  * Copyright (c) 2012-2020, The Linux Foundation. All rights reserved.
4c943b494SChandan Uddaraju  */
5c943b494SChandan Uddaraju 
6c943b494SChandan Uddaraju #ifndef _DP_PANEL_H_
7c943b494SChandan Uddaraju #define _DP_PANEL_H_
8c943b494SChandan Uddaraju 
9c943b494SChandan Uddaraju #include <drm/msm_drm.h>
10c943b494SChandan Uddaraju 
11c943b494SChandan Uddaraju #include "dp_aux.h"
12c943b494SChandan Uddaraju #include "dp_link.h"
13c943b494SChandan Uddaraju 
14c943b494SChandan Uddaraju struct edid;
15c943b494SChandan Uddaraju 
16c943b494SChandan Uddaraju #define DPRX_EXTENDED_DPCD_FIELD	0x2200
17c943b494SChandan Uddaraju 
188ede2eccSKuogee Hsieh #define DP_DOWNSTREAM_PORTS		4
198ede2eccSKuogee Hsieh #define DP_DOWNSTREAM_CAP_SIZE		4
208ede2eccSKuogee Hsieh 
21c943b494SChandan Uddaraju struct dp_display_mode {
22c943b494SChandan Uddaraju 	struct drm_display_mode drm_mode;
23c943b494SChandan Uddaraju 	u32 capabilities;
24c943b494SChandan Uddaraju 	u32 bpp;
25c943b494SChandan Uddaraju 	u32 h_active_low;
26c943b494SChandan Uddaraju 	u32 v_active_low;
27c943b494SChandan Uddaraju };
28c943b494SChandan Uddaraju 
29c943b494SChandan Uddaraju struct dp_panel_in {
30c943b494SChandan Uddaraju 	struct device *dev;
31c943b494SChandan Uddaraju 	struct drm_dp_aux *aux;
32c943b494SChandan Uddaraju 	struct dp_link *link;
33c943b494SChandan Uddaraju 	struct dp_catalog *catalog;
34c943b494SChandan Uddaraju };
35c943b494SChandan Uddaraju 
36*cd779808SVinod Polimera struct dp_panel_psr {
37*cd779808SVinod Polimera 	u8 version;
38*cd779808SVinod Polimera 	u8 capabilities;
39*cd779808SVinod Polimera };
40*cd779808SVinod Polimera 
41c943b494SChandan Uddaraju struct dp_panel {
42c943b494SChandan Uddaraju 	/* dpcd raw data */
43c943b494SChandan Uddaraju 	u8 dpcd[DP_RECEIVER_CAP_SIZE + 1];
448ede2eccSKuogee Hsieh 	u8 ds_cap_info[DP_DOWNSTREAM_PORTS * DP_DOWNSTREAM_CAP_SIZE];
458ede2eccSKuogee Hsieh 	u32 ds_port_cnt;
468ede2eccSKuogee Hsieh 	u32 dfp_present;
47c943b494SChandan Uddaraju 
48c943b494SChandan Uddaraju 	struct dp_link_info link_info;
49c943b494SChandan Uddaraju 	struct drm_dp_desc desc;
50c943b494SChandan Uddaraju 	struct edid *edid;
51c943b494SChandan Uddaraju 	struct drm_connector *connector;
52c943b494SChandan Uddaraju 	struct dp_display_mode dp_mode;
53*cd779808SVinod Polimera 	struct dp_panel_psr psr_cap;
54c943b494SChandan Uddaraju 	bool video_test;
55c943b494SChandan Uddaraju 
56c943b494SChandan Uddaraju 	u32 vic;
57c943b494SChandan Uddaraju 	u32 max_dp_lanes;
580e7f2705SKuogee Hsieh 	u32 max_dp_link_rate;
59c943b494SChandan Uddaraju 
60c943b494SChandan Uddaraju 	u32 max_bw_code;
61c943b494SChandan Uddaraju };
62c943b494SChandan Uddaraju 
63c943b494SChandan Uddaraju int dp_panel_init_panel_info(struct dp_panel *dp_panel);
64c943b494SChandan Uddaraju int dp_panel_deinit(struct dp_panel *dp_panel);
65c943b494SChandan Uddaraju int dp_panel_timing_cfg(struct dp_panel *dp_panel);
66c943b494SChandan Uddaraju void dp_panel_dump_regs(struct dp_panel *dp_panel);
67c943b494SChandan Uddaraju int dp_panel_read_sink_caps(struct dp_panel *dp_panel,
68c943b494SChandan Uddaraju 		struct drm_connector *connector);
69c943b494SChandan Uddaraju u32 dp_panel_get_mode_bpp(struct dp_panel *dp_panel, u32 mode_max_bpp,
70c943b494SChandan Uddaraju 			u32 mode_pclk_khz);
71c943b494SChandan Uddaraju int dp_panel_get_modes(struct dp_panel *dp_panel,
72ac31f338SDmitry Baryshkov 		struct drm_connector *connector);
73c943b494SChandan Uddaraju void dp_panel_handle_sink_request(struct dp_panel *dp_panel);
74c943b494SChandan Uddaraju void dp_panel_tpg_config(struct dp_panel *dp_panel, bool enable);
75c943b494SChandan Uddaraju 
76c943b494SChandan Uddaraju /**
77c943b494SChandan Uddaraju  * is_link_rate_valid() - validates the link rate
78c943b494SChandan Uddaraju  * @lane_rate: link rate requested by the sink
79c943b494SChandan Uddaraju  *
80c943b494SChandan Uddaraju  * Returns true if the requested link rate is supported.
81c943b494SChandan Uddaraju  */
is_link_rate_valid(u32 bw_code)82c943b494SChandan Uddaraju static inline bool is_link_rate_valid(u32 bw_code)
83c943b494SChandan Uddaraju {
84c943b494SChandan Uddaraju 	return (bw_code == DP_LINK_BW_1_62 ||
85c943b494SChandan Uddaraju 		bw_code == DP_LINK_BW_2_7 ||
86c943b494SChandan Uddaraju 		bw_code == DP_LINK_BW_5_4 ||
87c943b494SChandan Uddaraju 		bw_code == DP_LINK_BW_8_1);
88c943b494SChandan Uddaraju }
89c943b494SChandan Uddaraju 
90c943b494SChandan Uddaraju /**
91c943b494SChandan Uddaraju  * dp_link_is_lane_count_valid() - validates the lane count
92c943b494SChandan Uddaraju  * @lane_count: lane count requested by the sink
93c943b494SChandan Uddaraju  *
94c943b494SChandan Uddaraju  * Returns true if the requested lane count is supported.
95c943b494SChandan Uddaraju  */
is_lane_count_valid(u32 lane_count)96c943b494SChandan Uddaraju static inline bool is_lane_count_valid(u32 lane_count)
97c943b494SChandan Uddaraju {
98c943b494SChandan Uddaraju 	return (lane_count == 1 ||
99c943b494SChandan Uddaraju 		lane_count == 2 ||
100c943b494SChandan Uddaraju 		lane_count == 4);
101c943b494SChandan Uddaraju }
102c943b494SChandan Uddaraju 
103c943b494SChandan Uddaraju struct dp_panel *dp_panel_get(struct dp_panel_in *in);
104c943b494SChandan Uddaraju void dp_panel_put(struct dp_panel *dp_panel);
105c943b494SChandan Uddaraju #endif /* _DP_PANEL_H_ */
106