Linux Audio

Check our new training course

Loading...
  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
 44
 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),\
 52	CS_SF(PLL_REF_DIV, PLL_REF_DIV, mask_sh)
 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),\
 56	CS_SF(PHYPLLA_PIXCLK_RESYNC_CNTL, PHYPLLA_PIXCLK_DOUBLE_RATE_ENABLE, mask_sh)
 57
 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)
 78
 79#define CS_COMMON_REG_LIST_DCN201(index, pllid) \
 80		SRI(PIXCLK_RESYNC_CNTL, PHYPLL, pllid),\
 81		SRII(PHASE, DP_DTO, 0),\
 82		SRII(PHASE, DP_DTO, 1),\
 83		SRII(MODULO, DP_DTO, 0),\
 84		SRII(MODULO, DP_DTO, 1),\
 85		SRII(PIXEL_RATE_CNTL, OTG, 0),\
 86		SRII(PIXEL_RATE_CNTL, OTG, 1)
 87
 88#define CS_COMMON_REG_LIST_DCN2_1(index, pllid) \
 89		SRI(PIXCLK_RESYNC_CNTL, PHYPLL, pllid),\
 90		SRII(PHASE, DP_DTO, 0),\
 91		SRII(PHASE, DP_DTO, 1),\
 92		SRII(PHASE, DP_DTO, 2),\
 93		SRII(PHASE, DP_DTO, 3),\
 94		SRII(MODULO, DP_DTO, 0),\
 95		SRII(MODULO, DP_DTO, 1),\
 96		SRII(MODULO, DP_DTO, 2),\
 97		SRII(MODULO, DP_DTO, 3),\
 98		SRII(PIXEL_RATE_CNTL, OTG, 0),\
 99		SRII(PIXEL_RATE_CNTL, OTG, 1),\
100		SRII(PIXEL_RATE_CNTL, OTG, 2),\
101		SRII(PIXEL_RATE_CNTL, OTG, 3)
102
103#define CS_COMMON_REG_LIST_DCN3_0(index, pllid) \
104		SRI(PIXCLK_RESYNC_CNTL, PHYPLL, pllid),\
105		SRII(PHASE, DP_DTO, 0),\
106		SRII(PHASE, DP_DTO, 1),\
107		SRII(PHASE, DP_DTO, 2),\
108		SRII(PHASE, DP_DTO, 3),\
109		SRII(MODULO, DP_DTO, 0),\
110		SRII(MODULO, DP_DTO, 1),\
111		SRII(MODULO, DP_DTO, 2),\
112		SRII(MODULO, DP_DTO, 3),\
113		SRII(PIXEL_RATE_CNTL, OTG, 0),\
114		SRII(PIXEL_RATE_CNTL, OTG, 1),\
115		SRII(PIXEL_RATE_CNTL, OTG, 2),\
116		SRII(PIXEL_RATE_CNTL, OTG, 3)
117
118#define CS_COMMON_REG_LIST_DCN3_01(index, pllid) \
119		SRI(PIXCLK_RESYNC_CNTL, PHYPLL, pllid),\
120		SRII(PHASE, DP_DTO, 0),\
121		SRII(PHASE, DP_DTO, 1),\
122		SRII(PHASE, DP_DTO, 2),\
123		SRII(PHASE, DP_DTO, 3),\
124		SRII(MODULO, DP_DTO, 0),\
125		SRII(MODULO, DP_DTO, 1),\
126		SRII(MODULO, DP_DTO, 2),\
127		SRII(MODULO, DP_DTO, 3),\
128		SRII(PIXEL_RATE_CNTL, OTG, 0),\
129		SRII(PIXEL_RATE_CNTL, OTG, 1),\
130		SRII(PIXEL_RATE_CNTL, OTG, 2),\
131		SRII(PIXEL_RATE_CNTL, OTG, 3)
132
133#define CS_COMMON_REG_LIST_DCN3_02(index, pllid) \
134		SRI(PIXCLK_RESYNC_CNTL, PHYPLL, pllid),\
135		SRII(PHASE, DP_DTO, 0),\
136		SRII(PHASE, DP_DTO, 1),\
137		SRII(PHASE, DP_DTO, 2),\
138		SRII(PHASE, DP_DTO, 3),\
139		SRII(PHASE, DP_DTO, 4),\
140		SRII(MODULO, DP_DTO, 0),\
141		SRII(MODULO, DP_DTO, 1),\
142		SRII(MODULO, DP_DTO, 2),\
143		SRII(MODULO, DP_DTO, 3),\
144		SRII(MODULO, DP_DTO, 4),\
145		SRII(PIXEL_RATE_CNTL, OTG, 0),\
146		SRII(PIXEL_RATE_CNTL, OTG, 1),\
147		SRII(PIXEL_RATE_CNTL, OTG, 2),\
148		SRII(PIXEL_RATE_CNTL, OTG, 3),\
149		SRII(PIXEL_RATE_CNTL, OTG, 4)
150
151#define CS_COMMON_REG_LIST_DCN3_03(index, pllid) \
152		SRI(PIXCLK_RESYNC_CNTL, PHYPLL, pllid),\
153		SRII(PHASE, DP_DTO, 0),\
154		SRII(PHASE, DP_DTO, 1),\
155		SRII(MODULO, DP_DTO, 0),\
156		SRII(MODULO, DP_DTO, 1),\
157		SRII(PIXEL_RATE_CNTL, OTG, 0),\
158		SRII(PIXEL_RATE_CNTL, OTG, 1)
159
160#define CS_COMMON_MASK_SH_LIST_DCN2_0(mask_sh)\
161	CS_SF(DP_DTO0_PHASE, DP_DTO0_PHASE, mask_sh),\
162	CS_SF(DP_DTO0_MODULO, DP_DTO0_MODULO, mask_sh),\
163	CS_SF(PHYPLLA_PIXCLK_RESYNC_CNTL, PHYPLLA_DCCG_DEEP_COLOR_CNTL, mask_sh),\
164	CS_SF(OTG0_PIXEL_RATE_CNTL, DP_DTO0_ENABLE, mask_sh)
165
166#define CS_COMMON_MASK_SH_LIST_DCN3_1_4(mask_sh)\
167	CS_COMMON_MASK_SH_LIST_DCN2_0(mask_sh),\
168	CS_SF(OTG0_PIXEL_RATE_CNTL, PIPE0_DTO_SRC_SEL, mask_sh),
169
170#define CS_COMMON_MASK_SH_LIST_DCN3_2(mask_sh)\
171	CS_COMMON_MASK_SH_LIST_DCN2_0(mask_sh),\
172	CS_SF(OTG0_PIXEL_RATE_CNTL, PIPE0_DTO_SRC_SEL, mask_sh)
173
174#define CS_COMMON_REG_LIST_DCN1_0(index, pllid) \
175		SRI(PIXCLK_RESYNC_CNTL, PHYPLL, pllid),\
176		SRII(PHASE, DP_DTO, 0),\
177		SRII(PHASE, DP_DTO, 1),\
178		SRII(PHASE, DP_DTO, 2),\
179		SRII(PHASE, DP_DTO, 3),\
180		SRII(MODULO, DP_DTO, 0),\
181		SRII(MODULO, DP_DTO, 1),\
182		SRII(MODULO, DP_DTO, 2),\
183		SRII(MODULO, DP_DTO, 3),\
184		SRII(PIXEL_RATE_CNTL, OTG, 0), \
185		SRII(PIXEL_RATE_CNTL, OTG, 1), \
186		SRII(PIXEL_RATE_CNTL, OTG, 2), \
187		SRII(PIXEL_RATE_CNTL, OTG, 3)
188
189#define CS_COMMON_MASK_SH_LIST_DCN1_0(mask_sh)\
190	CS_SF(DP_DTO0_PHASE, DP_DTO0_PHASE, mask_sh),\
191	CS_SF(DP_DTO0_MODULO, DP_DTO0_MODULO, mask_sh),\
192	CS_SF(PHYPLLA_PIXCLK_RESYNC_CNTL, PHYPLLA_DCCG_DEEP_COLOR_CNTL, mask_sh),\
193	CS_SF(OTG0_PIXEL_RATE_CNTL, DP_DTO0_ENABLE, mask_sh)
194
195
196#define CS_REG_FIELD_LIST(type) \
197	type PLL_REF_DIV_SRC; \
198	type DCCG_DEEP_COLOR_CNTL1; \
199	type PHYPLLA_DCCG_DEEP_COLOR_CNTL; \
200	type PHYPLLA_PIXCLK_DOUBLE_RATE_ENABLE; \
201	type PLL_POST_DIV_PIXCLK; \
202	type PLL_REF_DIV; \
203	type DP_DTO0_PHASE; \
204	type DP_DTO0_MODULO; \
205	type DP_DTO0_ENABLE;
206
207#define CS_REG_FIELD_LIST_DCN32(type) \
208	type PIPE0_DTO_SRC_SEL;
209
210struct dce110_clk_src_shift {
211	CS_REG_FIELD_LIST(uint8_t)
212	CS_REG_FIELD_LIST_DCN32(uint8_t)
213};
214
215struct dce110_clk_src_mask{
216	CS_REG_FIELD_LIST(uint32_t)
217	CS_REG_FIELD_LIST_DCN32(uint32_t)
218};
219
220struct dce110_clk_src_regs {
221	uint32_t RESYNC_CNTL;
222	uint32_t PIXCLK_RESYNC_CNTL;
223	uint32_t PLL_CNTL;
224
225	/* below are for DTO.
226	 * todo: should probably use different struct to not waste space
227	 */
228	uint32_t PHASE[MAX_PIPES];
229	uint32_t MODULO[MAX_PIPES];
230	uint32_t PIXEL_RATE_CNTL[MAX_PIPES];
231};
232
233struct dce110_clk_src {
234	struct clock_source base;
235	const struct dce110_clk_src_regs *regs;
236	const struct dce110_clk_src_mask *cs_mask;
237	const struct dce110_clk_src_shift *cs_shift;
238	struct dc_bios *bios;
239
240	struct spread_spectrum_data *dp_ss_params;
241	uint32_t dp_ss_params_cnt;
242	struct spread_spectrum_data *hdmi_ss_params;
243	uint32_t hdmi_ss_params_cnt;
244	struct spread_spectrum_data *dvi_ss_params;
245	uint32_t dvi_ss_params_cnt;
246	struct spread_spectrum_data *lvds_ss_params;
247	uint32_t lvds_ss_params_cnt;
248
249	uint32_t ext_clk_khz;
250	uint32_t ref_freq_khz;
251
252	struct calc_pll_clock_source calc_pll;
253	struct calc_pll_clock_source calc_pll_hdmi;
254};
255
256bool dce110_clk_src_construct(
257	struct dce110_clk_src *clk_src,
258	struct dc_context *ctx,
259	struct dc_bios *bios,
260	enum clock_source_id,
261	const struct dce110_clk_src_regs *regs,
262	const struct dce110_clk_src_shift *cs_shift,
263	const struct dce110_clk_src_mask *cs_mask);
264
265bool dce112_clk_src_construct(
266	struct dce110_clk_src *clk_src,
267	struct dc_context *ctx,
268	struct dc_bios *bios,
269	enum clock_source_id id,
270	const struct dce110_clk_src_regs *regs,
271	const struct dce110_clk_src_shift *cs_shift,
272	const struct dce110_clk_src_mask *cs_mask);
273
274bool dcn20_clk_src_construct(
275	struct dce110_clk_src *clk_src,
276	struct dc_context *ctx,
277	struct dc_bios *bios,
278	enum clock_source_id id,
279	const struct dce110_clk_src_regs *regs,
280	const struct dce110_clk_src_shift *cs_shift,
281	const struct dce110_clk_src_mask *cs_mask);
282
283bool dcn3_clk_src_construct(
284	struct dce110_clk_src *clk_src,
285	struct dc_context *ctx,
286	struct dc_bios *bios,
287	enum clock_source_id id,
288	const struct dce110_clk_src_regs *regs,
289	const struct dce110_clk_src_shift *cs_shift,
290	const struct dce110_clk_src_mask *cs_mask);
291
292bool dcn301_clk_src_construct(
293	struct dce110_clk_src *clk_src,
294	struct dc_context *ctx,
295	struct dc_bios *bios,
296	enum clock_source_id id,
297	const struct dce110_clk_src_regs *regs,
298	const struct dce110_clk_src_shift *cs_shift,
299	const struct dce110_clk_src_mask *cs_mask);
300
301bool dcn31_clk_src_construct(
302	struct dce110_clk_src *clk_src,
303	struct dc_context *ctx,
304	struct dc_bios *bios,
305	enum clock_source_id id,
306	const struct dce110_clk_src_regs *regs,
307	const struct dce110_clk_src_shift *cs_shift,
308	const struct dce110_clk_src_mask *cs_mask);
309
310/* this table is use to find *1.001 and /1.001 pixel rates from non-precise pixel rate */
311struct pixel_rate_range_table_entry {
312	unsigned int range_min_khz;
313	unsigned int range_max_khz;
314	unsigned int target_pixel_rate_khz;
315	unsigned short mult_factor;
316	unsigned short div_factor;
317};
318
319extern const struct pixel_rate_range_table_entry video_optimized_pixel_rates[];
320const struct pixel_rate_range_table_entry *look_up_in_video_optimized_rate_tlb(
321		unsigned int pixel_rate_khz);
322
323#endif