1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
|
/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
* only version 2 as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#ifndef __DP_UTIL_H__
#define __DP_UTIL_H__
#include "mdss_dp.h"
/* DP_TX Registers */
#define DP_HW_VERSION (0x00000000)
#define DP_SW_RESET (0x00000010)
#define DP_PHY_CTRL (0x00000014)
#define DP_CLK_CTRL (0x00000018)
#define DP_CLK_ACTIVE (0x0000001C)
#define DP_INTR_STATUS (0x00000020)
#define DP_INTR_STATUS2 (0x00000024)
#define DP_INTR_STATUS3 (0x00000028)
#define DP_DP_HPD_CTRL (0x00000200)
#define DP_DP_HPD_INT_STATUS (0x00000204)
#define DP_DP_HPD_INT_ACK (0x00000208)
#define DP_DP_HPD_INT_MASK (0x0000020C)
#define DP_DP_HPD_REFTIMER (0x00000218)
#define DP_DP_HPD_EVENT_TIME_0 (0x0000021C)
#define DP_DP_HPD_EVENT_TIME_1 (0x00000220)
#define DP_AUX_CTRL (0x00000230)
#define DP_AUX_DATA (0x00000234)
#define DP_AUX_TRANS_CTRL (0x00000238)
#define DP_AUX_TIMEOUT_COUNT (0x0000023C)
#define DP_AUX_LIMITS (0x00000240)
#define DP_AUX_STATUS (0x00000244)
#define DP_DPCD_CP_IRQ (0x201)
#define DP_DPCD_RXSTATUS (0x69493)
#define DP_INTERRUPT_TRANS_NUM (0x000002A0)
#define DP_MAINLINK_CTRL (0x00000400)
#define DP_STATE_CTRL (0x00000404)
#define DP_CONFIGURATION_CTRL (0x00000408)
#define DP_SOFTWARE_MVID (0x00000410)
#define DP_SOFTWARE_NVID (0x00000418)
#define DP_TOTAL_HOR_VER (0x0000041C)
#define DP_START_HOR_VER_FROM_SYNC (0x00000420)
#define DP_HSYNC_VSYNC_WIDTH_POLARITY (0x00000424)
#define DP_ACTIVE_HOR_VER (0x00000428)
#define DP_MISC1_MISC0 (0x0000042C)
#define DP_VALID_BOUNDARY (0x00000430)
#define DP_VALID_BOUNDARY_2 (0x00000434)
#define DP_LOGICAL2PHYSCIAL_LANE_MAPPING (0x00000438)
#define DP_MAINLINK_READY (0x00000440)
#define DP_MAINLINK_LEVELS (0x00000444)
#define DP_TU (0x0000044C)
#define DP_HBR2_COMPLIANCE_SCRAMBLER_RESET (0x00000454)
#define DP_TEST_80BIT_CUSTOM_PATTERN_REG0 (0x000004C0)
#define DP_TEST_80BIT_CUSTOM_PATTERN_REG1 (0x000004C4)
#define DP_TEST_80BIT_CUSTOM_PATTERN_REG2 (0x000004C8)
#define MMSS_DP_MISC1_MISC0 (0x0000042C)
#define MMSS_DP_AUDIO_TIMING_GEN (0x00000480)
#define MMSS_DP_AUDIO_TIMING_RBR_32 (0x00000484)
#define MMSS_DP_AUDIO_TIMING_HBR_32 (0x00000488)
#define MMSS_DP_AUDIO_TIMING_RBR_44 (0x0000048C)
#define MMSS_DP_AUDIO_TIMING_HBR_44 (0x00000490)
#define MMSS_DP_AUDIO_TIMING_RBR_48 (0x00000494)
#define MMSS_DP_AUDIO_TIMING_HBR_48 (0x00000498)
#define MMSS_DP_PSR_CRC_RG (0x00000554)
#define MMSS_DP_PSR_CRC_B (0x00000558)
#define MMSS_DP_AUDIO_CFG (0x00000600)
#define MMSS_DP_AUDIO_STATUS (0x00000604)
#define MMSS_DP_AUDIO_PKT_CTRL (0x00000608)
#define MMSS_DP_AUDIO_PKT_CTRL2 (0x0000060C)
#define MMSS_DP_AUDIO_ACR_CTRL (0x00000610)
#define MMSS_DP_AUDIO_CTRL_RESET (0x00000614)
#define MMSS_DP_SDP_CFG (0x00000628)
#define MMSS_DP_SDP_CFG2 (0x0000062C)
#define MMSS_DP_AUDIO_TIMESTAMP_0 (0x00000630)
#define MMSS_DP_AUDIO_TIMESTAMP_1 (0x00000634)
#define MMSS_DP_AUDIO_STREAM_0 (0x00000640)
#define MMSS_DP_AUDIO_STREAM_1 (0x00000644)
#define MMSS_DP_EXTENSION_0 (0x00000650)
#define MMSS_DP_EXTENSION_1 (0x00000654)
#define MMSS_DP_EXTENSION_2 (0x00000658)
#define MMSS_DP_EXTENSION_3 (0x0000065C)
#define MMSS_DP_EXTENSION_4 (0x00000660)
#define MMSS_DP_EXTENSION_5 (0x00000664)
#define MMSS_DP_EXTENSION_6 (0x00000668)
#define MMSS_DP_EXTENSION_7 (0x0000066C)
#define MMSS_DP_EXTENSION_8 (0x00000670)
#define MMSS_DP_EXTENSION_9 (0x00000674)
#define MMSS_DP_AUDIO_COPYMANAGEMENT_0 (0x00000678)
#define MMSS_DP_AUDIO_COPYMANAGEMENT_1 (0x0000067C)
#define MMSS_DP_AUDIO_COPYMANAGEMENT_2 (0x00000680)
#define MMSS_DP_AUDIO_COPYMANAGEMENT_3 (0x00000684)
#define MMSS_DP_AUDIO_COPYMANAGEMENT_4 (0x00000688)
#define MMSS_DP_AUDIO_COPYMANAGEMENT_5 (0x0000068C)
#define MMSS_DP_AUDIO_ISRC_0 (0x00000690)
#define MMSS_DP_AUDIO_ISRC_1 (0x00000694)
#define MMSS_DP_AUDIO_ISRC_2 (0x00000698)
#define MMSS_DP_AUDIO_ISRC_3 (0x0000069C)
#define MMSS_DP_AUDIO_ISRC_4 (0x000006A0)
#define MMSS_DP_AUDIO_ISRC_5 (0x000006A4)
#define MMSS_DP_AUDIO_INFOFRAME_0 (0x000006A8)
#define MMSS_DP_AUDIO_INFOFRAME_1 (0x000006AC)
#define MMSS_DP_AUDIO_INFOFRAME_2 (0x000006B0)
#define MMSS_DP_GENERIC0_0 (0x00000700)
#define MMSS_DP_GENERIC0_1 (0x00000704)
#define MMSS_DP_GENERIC0_2 (0x00000708)
#define MMSS_DP_GENERIC0_3 (0x0000070C)
#define MMSS_DP_GENERIC0_4 (0x00000710)
#define MMSS_DP_GENERIC0_5 (0x00000714)
#define MMSS_DP_GENERIC0_6 (0x00000718)
#define MMSS_DP_GENERIC0_7 (0x0000071C)
#define MMSS_DP_GENERIC0_8 (0x00000720)
#define MMSS_DP_GENERIC0_9 (0x00000724)
#define MMSS_DP_GENERIC1_0 (0x00000728)
#define MMSS_DP_GENERIC1_1 (0x0000072C)
#define MMSS_DP_GENERIC1_2 (0x00000730)
#define MMSS_DP_GENERIC1_3 (0x00000734)
#define MMSS_DP_GENERIC1_4 (0x00000738)
#define MMSS_DP_GENERIC1_5 (0x0000073C)
#define MMSS_DP_GENERIC1_6 (0x00000740)
#define MMSS_DP_GENERIC1_7 (0x00000744)
#define MMSS_DP_GENERIC1_8 (0x00000748)
#define MMSS_DP_GENERIC1_9 (0x0000074C)
#define MMSS_DP_TIMING_ENGINE_EN (0x00000A10)
/*DP PHY Register offsets */
#define DP_PHY_REVISION_ID0 (0x00000000)
#define DP_PHY_REVISION_ID1 (0x00000004)
#define DP_PHY_REVISION_ID2 (0x00000008)
#define DP_PHY_REVISION_ID3 (0x0000000C)
#define DP_PHY_CFG (0x00000010)
#define DP_PHY_PD_CTL (0x00000014)
#define DP_PHY_MODE (0x00000018)
#define DP_PHY_AUX_CFG0 (0x0000001C)
#define DP_PHY_AUX_CFG1 (0x00000020)
#define DP_PHY_AUX_CFG2 (0x00000024)
#define DP_PHY_AUX_CFG3 (0x00000028)
#define DP_PHY_AUX_CFG4 (0x0000002C)
#define DP_PHY_AUX_CFG5 (0x00000030)
#define DP_PHY_AUX_CFG6 (0x00000034)
#define DP_PHY_AUX_CFG7 (0x00000038)
#define DP_PHY_AUX_CFG8 (0x0000003C)
#define DP_PHY_AUX_CFG9 (0x00000040)
#define DP_PHY_AUX_INTERRUPT_MASK (0x00000044)
#define DP_PHY_AUX_INTERRUPT_CLEAR (0x00000048)
#define DP_PHY_AUX_INTERRUPT_STATUS (0x000000B8)
#define DP_PHY_SPARE0 0x00A8
#define QSERDES_TX0_OFFSET 0x0400
#define QSERDES_TX1_OFFSET 0x0800
#define TXn_TX_EMP_POST1_LVL 0x000C
#define TXn_TX_DRV_LVL 0x001C
#define TCSR_USB3_DP_PHYMODE 0x48
#define EDID_START_ADDRESS 0x50
/* DP MMSS_CC registers */
#define MMSS_DP_LINK_CMD_RCGR 0x0000
#define MMSS_DP_LINK_CFG_RCGR 0x0004
#define MMSS_DP_PIXEL_M 0x0048
#define MMSS_DP_PIXEL_N 0x004C
/* DP HDCP 1.3 registers */
#define DP_HDCP_CTRL (0x0A0)
#define DP_HDCP_STATUS (0x0A4)
#define DP_HDCP_SW_UPPER_AKSV (0x298)
#define DP_HDCP_SW_LOWER_AKSV (0x29C)
#define DP_HDCP_ENTROPY_CTRL0 (0x750)
#define DP_HDCP_ENTROPY_CTRL1 (0x75C)
#define DP_HDCP_SHA_STATUS (0x0C8)
#define DP_HDCP_RCVPORT_DATA2_0 (0x0B0)
#define DP_HDCP_RCVPORT_DATA3 (0x2A4)
#define DP_HDCP_RCVPORT_DATA4 (0x2A8)
#define DP_HDCP_RCVPORT_DATA5 (0x0C0)
#define DP_HDCP_RCVPORT_DATA6 (0x0C4)
#define HDCP_SEC_DP_TZ_HV_HLOS_HDCP_SHA_CTRL (0x024)
#define HDCP_SEC_DP_TZ_HV_HLOS_HDCP_SHA_DATA (0x028)
#define HDCP_SEC_DP_TZ_HV_HLOS_HDCP_RCVPORT_DATA0 (0x004)
#define HDCP_SEC_DP_TZ_HV_HLOS_HDCP_RCVPORT_DATA1 (0x008)
#define HDCP_SEC_DP_TZ_HV_HLOS_HDCP_RCVPORT_DATA7 (0x00C)
#define HDCP_SEC_DP_TZ_HV_HLOS_HDCP_RCVPORT_DATA8 (0x010)
#define HDCP_SEC_DP_TZ_HV_HLOS_HDCP_RCVPORT_DATA9 (0x014)
#define HDCP_SEC_DP_TZ_HV_HLOS_HDCP_RCVPORT_DATA10 (0x018)
#define HDCP_SEC_DP_TZ_HV_HLOS_HDCP_RCVPORT_DATA11 (0x01C)
#define HDCP_SEC_DP_TZ_HV_HLOS_HDCP_RCVPORT_DATA12 (0x020)
struct edp_cmd {
char read; /* 1 == read, 0 == write */
char i2c; /* 1 == i2c cmd, 0 == native cmd */
u32 addr; /* 20 bits */
char *datap;
char *out_buf;
int len; /* len to be tx OR len to be rx for read */
char next; /* next command */
};
struct dp_vc_tu_mapping_table {
u32 vic;
u8 lanes;
u8 lrate; /* DP_LINK_RATE -> 162(6), 270(10), 540(20) */
u8 bpp;
u8 valid_boundary_link;
u16 delay_start_link;
bool boundary_moderation_en;
u8 valid_lower_boundary_link;
u8 upper_boundary_count;
u8 lower_boundary_count;
u8 tu_size_minus1;
};
static const struct dp_vc_tu_mapping_table tu_table[] = {
{HDMI_VFRMT_640x480p60_4_3, 4, 06, 24,
0x07, 0x0056, false, 0x00, 0x00, 0x00, 0x3b},
{HDMI_VFRMT_640x480p60_4_3, 2, 06, 24,
0x0e, 0x004f, false, 0x00, 0x00, 0x00, 0x3b},
{HDMI_VFRMT_640x480p60_4_3, 1, 06, 24,
0x15, 0x0039, false, 0x00, 0x00, 0x00, 0x2c},
{HDMI_VFRMT_720x480p60_4_3, 1, 06, 24,
0x13, 0x0038, true, 0x12, 0x0c, 0x0b, 0x24},
{HDMI_VFRMT_720x480p60_16_9, 1, 06, 24,
0x13, 0x0038, true, 0x12, 0x0c, 0x0b, 0x24},
{HDMI_VFRMT_1280x720p60_16_9, 4, 06, 24,
0x0c, 0x0020, false, 0x00, 0x00, 0x00, 0x1f},
{HDMI_VFRMT_1280x720p60_16_9, 2, 06, 24,
0x16, 0x0015, false, 0x00, 0x00, 0x00, 0x1f},
{HDMI_VFRMT_1280x720p60_16_9, 1, 10, 24,
0x21, 0x001a, false, 0x00, 0x00, 0x00, 0x27},
{HDMI_VFRMT_1920x1080p60_16_9, 4, 06, 24,
0x16, 0x000f, false, 0x00, 0x00, 0x00, 0x1f},
{HDMI_VFRMT_1920x1080p60_16_9, 4, 10, 24,
0x21, 0x0013, false, 0x21, 0x8, 0x1, 0x26},
{HDMI_VFRMT_1920x1080p60_16_9, 2, 10, 24,
0x21, 0x0011, false, 0x00, 0x00, 0x00, 0x27},
{HDMI_VFRMT_1920x1080p60_16_9, 1, 20, 24,
0x21, 0x001a, false, 0x00, 0x00, 0x00, 0x27},
{HDMI_VFRMT_3840x2160p24_16_9, 4, 10, 24,
0x21, 0x000c, false, 0x00, 0x00, 0x00, 0x27},
{HDMI_VFRMT_3840x2160p30_16_9, 4, 10, 24,
0x21, 0x000c, false, 0x00, 0x00, 0x00, 0x27},
{HDMI_VFRMT_3840x2160p60_16_9, 4, 20, 24,
0x21, 0x000c, false, 0x00, 0x00, 0x00, 0x27},
{HDMI_VFRMT_4096x2160p24_256_135, 4, 10, 24,
0x21, 0x000c, false, 0x00, 0x00, 0x00, 0x27},
{HDMI_VFRMT_4096x2160p30_256_135, 4, 10, 24,
0x21, 0x000c, false, 0x00, 0x00, 0x00, 0x27},
{HDMI_VFRMT_4096x2160p60_256_135, 4, 20, 24,
0x21, 0x000c, false, 0x00, 0x00, 0x00, 0x27},
{HDMI_EVFRMT_4096x2160p24_16_9, 4, 10, 24,
0x21, 0x000c, false, 0x00, 0x00, 0x00, 0x27},
};
static inline struct mdss_dp_phy_cfg *mdss_dp_phy_aux_get_config(
struct mdss_dp_drv_pdata *dp, enum dp_phy_aux_config_type cfg_type)
{
return &dp->aux_cfg[cfg_type];
}
static inline u32 mdss_dp_phy_aux_get_config_cnt(
struct mdss_dp_drv_pdata *dp, enum dp_phy_aux_config_type cfg_type)
{
return dp->aux_cfg[cfg_type].cfg_cnt;
}
void mdss_dp_aux_set_limits(struct dss_io_data *ctrl_io);
int dp_aux_read(void *ep, struct edp_cmd *cmds);
int dp_aux_write(void *ep, struct edp_cmd *cmd);
void mdss_dp_state_ctrl(struct dss_io_data *ctrl_io, u32 data);
u32 mdss_dp_get_ctrl_hw_version(struct dss_io_data *ctrl_io);
u32 mdss_dp_get_phy_hw_version(struct dss_io_data *phy_io);
void mdss_dp_ctrl_reset(struct dss_io_data *ctrl_io);
void mdss_dp_aux_reset(struct dss_io_data *ctrl_io);
void mdss_dp_mainlink_reset(struct dss_io_data *ctrl_io);
void mdss_dp_phy_reset(struct dss_io_data *ctrl_io);
void mdss_dp_switch_usb3_phy_to_dp_mode(struct dss_io_data *tcsr_reg_io);
void mdss_dp_assert_phy_reset(struct dss_io_data *ctrl_io, bool assert);
void mdss_dp_setup_tr_unit(struct dss_io_data *ctrl_io, u8 link_rate,
u8 ln_cnt, u32 res, struct mdss_panel_info *pinfo);
void mdss_dp_config_misc(struct mdss_dp_drv_pdata *dp, u32 bd, u32 cc);
void mdss_dp_phy_aux_setup(struct mdss_dp_drv_pdata *dp);
void mdss_dp_phy_aux_update_config(struct mdss_dp_drv_pdata *dp,
enum dp_phy_aux_config_type config_type);
void mdss_dp_hpd_configure(struct dss_io_data *ctrl_io, bool enable);
void mdss_dp_aux_ctrl(struct dss_io_data *ctrl_io, bool enable);
void mdss_dp_mainlink_ctrl(struct dss_io_data *ctrl_io, bool enable);
void mdss_dp_ctrl_lane_mapping(struct dss_io_data *ctrl_io, char *l_map);
bool mdss_dp_mainlink_ready(struct mdss_dp_drv_pdata *dp);
void mdss_dp_timing_cfg(struct dss_io_data *ctrl_io,
struct mdss_panel_info *pinfo);
void mdss_dp_configuration_ctrl(struct dss_io_data *ctrl_io, u32 data);
void mdss_dp_state_ctrl(struct dss_io_data *ctrl_io, u32 data);
int mdss_dp_irq_setup(struct mdss_dp_drv_pdata *dp_drv);
void mdss_dp_irq_enable(struct mdss_dp_drv_pdata *dp_drv);
void mdss_dp_irq_disable(struct mdss_dp_drv_pdata *dp_drv);
void mdss_dp_sw_config_msa(struct mdss_dp_drv_pdata *dp);
void mdss_dp_usbpd_ext_capabilities(struct usbpd_dp_capabilities *dp_cap);
void mdss_dp_usbpd_ext_dp_status(struct usbpd_dp_status *dp_status);
u32 mdss_dp_usbpd_gen_config_pkt(struct mdss_dp_drv_pdata *dp);
void mdss_dp_phy_share_lane_config(struct dss_io_data *phy_io,
u8 orientation, u8 ln_cnt, u32 phy_reg_offset);
void mdss_dp_config_audio_acr_ctrl(struct dss_io_data *ctrl_io,
char link_rate);
void mdss_dp_audio_setup_sdps(struct dss_io_data *ctrl_io, u32 num_of_channels);
void mdss_dp_audio_enable(struct dss_io_data *ctrl_io, bool enable);
void mdss_dp_audio_select_core(struct dss_io_data *ctrl_io);
void mdss_dp_audio_set_sample_rate(struct dss_io_data *ctrl_io,
char dp_link_rate, uint32_t audio_freq);
void mdss_dp_set_safe_to_exit_level(struct dss_io_data *ctrl_io,
uint32_t lane_cnt);
int mdss_dp_aux_read_rx_status(struct mdss_dp_drv_pdata *dp, u8 *rx_status);
void mdss_dp_phy_send_test_pattern(struct mdss_dp_drv_pdata *dp);
void mdss_dp_config_ctl_frame_crc(struct mdss_dp_drv_pdata *dp, bool enable);
int mdss_dp_read_ctl_frame_crc(struct mdss_dp_drv_pdata *dp);
#endif /* __DP_UTIL_H__ */
|