drm/amd/display: Add DCN3 CLK_MGR
[linux-2.6-block.git] / drivers / gpu / drm / amd / display / dc / dce / dce_clock_source.h
CommitLineData
4562236b
HW
1/* Copyright 2012-15 Advanced Micro Devices, Inc.
2 *
3 * Permission is hereby granted, free of charge, to any person obtaining a
4 * copy of this software and associated documentation files (the "Software"),
5 * to deal in the Software without restriction, including without limitation
6 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
7 * and/or sell copies of the Software, and to permit persons to whom the
8 * Software is furnished to do so, subject to the following conditions:
9 *
10 * The above copyright notice and this permission notice shall be included in
11 * all copies or substantial portions of the Software.
12 *
13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
16 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
17 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
18 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
19 * OTHER DEALINGS IN THE SOFTWARE.
20 *
21 * Authors: AMD
22 *
23 */
24
25#ifndef __DC_CLOCK_SOURCE_DCE_H__
26#define __DC_CLOCK_SOURCE_DCE_H__
27
28#include "../inc/clock_source.h"
29
30#define TO_DCE110_CLK_SRC(clk_src)\
31 container_of(clk_src, struct dce110_clk_src, base)
32
33#define CS_COMMON_REG_LIST_DCE_100_110(id) \
34 SRI(RESYNC_CNTL, PIXCLK, id), \
35 SRI(PLL_CNTL, BPHYC_PLL, id)
36
37#define CS_COMMON_REG_LIST_DCE_80(id) \
38 SRI(RESYNC_CNTL, PIXCLK, id), \
39 SRI(PLL_CNTL, DCCG_PLL, id)
40
41#define CS_COMMON_REG_LIST_DCE_112(id) \
42 SRI(PIXCLK_RESYNC_CNTL, PHYPLL, id)
43
ae799430 44
4562236b
HW
45#define CS_SF(reg_name, field_name, post_fix)\
46 .field_name = reg_name ## __ ## field_name ## post_fix
47
48#define CS_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(mask_sh)\
49 CS_SF(PLL_CNTL, PLL_REF_DIV_SRC, mask_sh),\
50 CS_SF(PIXCLK1_RESYNC_CNTL, DCCG_DEEP_COLOR_CNTL1, mask_sh),\
51 CS_SF(PLL_POST_DIV, PLL_POST_DIV_PIXCLK, mask_sh),\
ae799430 52 CS_SF(PLL_REF_DIV, PLL_REF_DIV, mask_sh)
4562236b
HW
53
54#define CS_COMMON_MASK_SH_LIST_DCE_112(mask_sh)\
55 CS_SF(PHYPLLA_PIXCLK_RESYNC_CNTL, PHYPLLA_DCCG_DEEP_COLOR_CNTL, mask_sh),\
ae799430 56 CS_SF(PHYPLLA_PIXCLK_RESYNC_CNTL, PHYPLLA_PIXCLK_DOUBLE_RATE_ENABLE, mask_sh)
4562236b 57
fcee01b9
HW
58#define CS_COMMON_REG_LIST_DCN2_0(index, pllid) \
59 SRI(PIXCLK_RESYNC_CNTL, PHYPLL, pllid),\
60 SRII(PHASE, DP_DTO, 0),\
61 SRII(PHASE, DP_DTO, 1),\
62 SRII(PHASE, DP_DTO, 2),\
63 SRII(PHASE, DP_DTO, 3),\
64 SRII(PHASE, DP_DTO, 4),\
65 SRII(PHASE, DP_DTO, 5),\
66 SRII(MODULO, DP_DTO, 0),\
67 SRII(MODULO, DP_DTO, 1),\
68 SRII(MODULO, DP_DTO, 2),\
69 SRII(MODULO, DP_DTO, 3),\
70 SRII(MODULO, DP_DTO, 4),\
71 SRII(MODULO, DP_DTO, 5),\
72 SRII(PIXEL_RATE_CNTL, OTG, 0),\
73 SRII(PIXEL_RATE_CNTL, OTG, 1),\
74 SRII(PIXEL_RATE_CNTL, OTG, 2),\
75 SRII(PIXEL_RATE_CNTL, OTG, 3),\
76 SRII(PIXEL_RATE_CNTL, OTG, 4),\
77 SRII(PIXEL_RATE_CNTL, OTG, 5)
fcee01b9 78
ff54ecb0
BL
79#define CS_COMMON_REG_LIST_DCN2_1(index, pllid) \
80 SRI(PIXCLK_RESYNC_CNTL, PHYPLL, pllid),\
81 SRII(PHASE, DP_DTO, 0),\
82 SRII(PHASE, DP_DTO, 1),\
83 SRII(PHASE, DP_DTO, 2),\
84 SRII(PHASE, DP_DTO, 3),\
85 SRII(MODULO, DP_DTO, 0),\
86 SRII(MODULO, DP_DTO, 1),\
87 SRII(MODULO, DP_DTO, 2),\
88 SRII(MODULO, DP_DTO, 3),\
89 SRII(PIXEL_RATE_CNTL, OTG, 0),\
90 SRII(PIXEL_RATE_CNTL, OTG, 1),\
91 SRII(PIXEL_RATE_CNTL, OTG, 2),\
92 SRII(PIXEL_RATE_CNTL, OTG, 3)
ff54ecb0 93
4d55b0dd
BL
94#if defined(CONFIG_DRM_AMD_DC_DCN3_0)
95#define CS_COMMON_REG_LIST_DCN3_0(index, pllid) \
96 SRI(PIXCLK_RESYNC_CNTL, PHYPLL, pllid),\
97 SRII(PHASE, DP_DTO, 0),\
98 SRII(PHASE, DP_DTO, 1),\
99 SRII(PHASE, DP_DTO, 2),\
100 SRII(PHASE, DP_DTO, 3),\
101 SRII(MODULO, DP_DTO, 0),\
102 SRII(MODULO, DP_DTO, 1),\
103 SRII(MODULO, DP_DTO, 2),\
104 SRII(MODULO, DP_DTO, 3),\
105 SRII(PIXEL_RATE_CNTL, OTG, 0),\
106 SRII(PIXEL_RATE_CNTL, OTG, 1),\
107 SRII(PIXEL_RATE_CNTL, OTG, 2),\
108 SRII(PIXEL_RATE_CNTL, OTG, 3)
109#endif
110
fcee01b9
HW
111#define CS_COMMON_MASK_SH_LIST_DCN2_0(mask_sh)\
112 CS_SF(DP_DTO0_PHASE, DP_DTO0_PHASE, mask_sh),\
113 CS_SF(DP_DTO0_MODULO, DP_DTO0_MODULO, mask_sh),\
114 CS_SF(PHYPLLA_PIXCLK_RESYNC_CNTL, PHYPLLA_DCCG_DEEP_COLOR_CNTL, mask_sh),\
115 CS_SF(OTG0_PIXEL_RATE_CNTL, DP_DTO0_ENABLE, mask_sh)
fcee01b9 116
b86a1aa3 117#if defined(CONFIG_DRM_AMD_DC_DCN)
391e20d8 118
ff5ef992
AD
119#define CS_COMMON_REG_LIST_DCN1_0(index, pllid) \
120 SRI(PIXCLK_RESYNC_CNTL, PHYPLL, pllid),\
121 SRII(PHASE, DP_DTO, 0),\
122 SRII(PHASE, DP_DTO, 1),\
123 SRII(PHASE, DP_DTO, 2),\
124 SRII(PHASE, DP_DTO, 3),\
125 SRII(MODULO, DP_DTO, 0),\
126 SRII(MODULO, DP_DTO, 1),\
127 SRII(MODULO, DP_DTO, 2),\
128 SRII(MODULO, DP_DTO, 3),\
129 SRII(PIXEL_RATE_CNTL, OTG, 0), \
130 SRII(PIXEL_RATE_CNTL, OTG, 1), \
131 SRII(PIXEL_RATE_CNTL, OTG, 2), \
132 SRII(PIXEL_RATE_CNTL, OTG, 3)
133
134#define CS_COMMON_MASK_SH_LIST_DCN1_0(mask_sh)\
391e20d8
DD
135 CS_SF(DP_DTO0_PHASE, DP_DTO0_PHASE, mask_sh),\
136 CS_SF(DP_DTO0_MODULO, DP_DTO0_MODULO, mask_sh),\
ff5ef992
AD
137 CS_SF(PHYPLLA_PIXCLK_RESYNC_CNTL, PHYPLLA_DCCG_DEEP_COLOR_CNTL, mask_sh),\
138 CS_SF(OTG0_PIXEL_RATE_CNTL, DP_DTO0_ENABLE, mask_sh)
ff5ef992 139
391e20d8
DD
140#endif
141
4562236b
HW
142#define CS_REG_FIELD_LIST(type) \
143 type PLL_REF_DIV_SRC; \
144 type DCCG_DEEP_COLOR_CNTL1; \
145 type PHYPLLA_DCCG_DEEP_COLOR_CNTL; \
146 type PHYPLLA_PIXCLK_DOUBLE_RATE_ENABLE; \
147 type PLL_POST_DIV_PIXCLK; \
148 type PLL_REF_DIV; \
391e20d8
DD
149 type DP_DTO0_PHASE; \
150 type DP_DTO0_MODULO; \
ae799430 151 type DP_DTO0_ENABLE;
4562236b
HW
152
153struct dce110_clk_src_shift {
154 CS_REG_FIELD_LIST(uint8_t)
155};
156
157struct dce110_clk_src_mask{
158 CS_REG_FIELD_LIST(uint32_t)
159};
160
161struct dce110_clk_src_regs {
162 uint32_t RESYNC_CNTL;
163 uint32_t PIXCLK_RESYNC_CNTL;
164 uint32_t PLL_CNTL;
c89a58cd
TC
165
166 /* below are for DTO.
167 * todo: should probably use different struct to not waste space
168 */
641106d3
DL
169 uint32_t PHASE[MAX_PIPES];
170 uint32_t MODULO[MAX_PIPES];
171 uint32_t PIXEL_RATE_CNTL[MAX_PIPES];
4562236b
HW
172};
173
174struct dce110_clk_src {
175 struct clock_source base;
176 const struct dce110_clk_src_regs *regs;
177 const struct dce110_clk_src_mask *cs_mask;
178 const struct dce110_clk_src_shift *cs_shift;
179 struct dc_bios *bios;
180
181 struct spread_spectrum_data *dp_ss_params;
182 uint32_t dp_ss_params_cnt;
183 struct spread_spectrum_data *hdmi_ss_params;
184 uint32_t hdmi_ss_params_cnt;
185 struct spread_spectrum_data *dvi_ss_params;
186 uint32_t dvi_ss_params_cnt;
11c3ee48
AD
187 struct spread_spectrum_data *lvds_ss_params;
188 uint32_t lvds_ss_params_cnt;
4562236b
HW
189
190 uint32_t ext_clk_khz;
191 uint32_t ref_freq_khz;
192
193 struct calc_pll_clock_source calc_pll;
194 struct calc_pll_clock_source calc_pll_hdmi;
195};
196
197bool dce110_clk_src_construct(
198 struct dce110_clk_src *clk_src,
199 struct dc_context *ctx,
200 struct dc_bios *bios,
201 enum clock_source_id,
202 const struct dce110_clk_src_regs *regs,
203 const struct dce110_clk_src_shift *cs_shift,
204 const struct dce110_clk_src_mask *cs_mask);
205
b07971d4
DL
206bool dce112_clk_src_construct(
207 struct dce110_clk_src *clk_src,
208 struct dc_context *ctx,
209 struct dc_bios *bios,
210 enum clock_source_id id,
211 const struct dce110_clk_src_regs *regs,
212 const struct dce110_clk_src_shift *cs_shift,
213 const struct dce110_clk_src_mask *cs_mask);
214
fcee01b9
HW
215bool dcn20_clk_src_construct(
216 struct dce110_clk_src *clk_src,
217 struct dc_context *ctx,
218 struct dc_bios *bios,
219 enum clock_source_id id,
220 const struct dce110_clk_src_regs *regs,
221 const struct dce110_clk_src_shift *cs_shift,
222 const struct dce110_clk_src_mask *cs_mask);
fcee01b9 223
4d55b0dd
BL
224#if defined(CONFIG_DRM_AMD_DC_DCN3_0)
225bool dcn3_clk_src_construct(
226 struct dce110_clk_src *clk_src,
227 struct dc_context *ctx,
228 struct dc_bios *bios,
229 enum clock_source_id id,
230 const struct dce110_clk_src_regs *regs,
231 const struct dce110_clk_src_shift *cs_shift,
232 const struct dce110_clk_src_mask *cs_mask);
233#endif
234
235/* this table is use to find *1.001 and /1.001 pixel rates from non-precise pixel rate */
236struct pixel_rate_range_table_entry {
237 unsigned int range_min_khz;
238 unsigned int range_max_khz;
239 unsigned int target_pixel_rate_khz;
240 unsigned short mult_factor;
241 unsigned short div_factor;
242};
243
244#if defined(CONFIG_DRM_AMD_DC_DCN3_0)
245extern const struct pixel_rate_range_table_entry video_optimized_pixel_rates[];
246const struct pixel_rate_range_table_entry *look_up_in_video_optimized_rate_tlb(
247 unsigned int pixel_rate_khz);
248#endif
4562236b 249#endif