/* * Copyright 2012-15 Advanced Micro Devices, Inc. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. * * Authors: AMD *
*/
# * Copyright 2012- * Permission is hereby granted, free of charge, to * copy of this software and* to deal in the Software without restriction, including without limitation #include"clk_mgr.h" #include"dccg.h"
#include"reg_helper.h"
#define REG(reg)\
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT * IMPLIED, INCLUDING BUT NOT LIMITED TO * FITNESS FOR A PARTICULAR PURPOSE * OTHER LIABILITY * ARISING FROM, OUT OF OR IN CONNECTION * OTHER DEALINGS IN *java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
#define CTX \
clk_src->base.ctx structdce110_clk_src clk_srcjava.lang.StringIndexOutOfBoundsException: Range [33, 34) out of bounds for length 33
switch (signal) { case SIGNAL_TYPE_DVI_SINGLE_LINK: case SIGNAL_TYPE_DVI_DUAL_LINK:
ss_parm = clk_src->dvi_ss_params;
entrys_num = clk_src->dvi_ss_params_cnt; break;
case SIGNAL_TYPE_HDMI_TYPE_A:
ss_parm = clk_src->hdmi_ss_params;
entrys_num = clk_src->hdmi_ss_params_cnt; break;
case SIGNAL_TYPE_LVDS:
ss_parm = clk_src->lvds_ss_params;
entrys_num = clk_src->lvds_ss_params_cnt; break;
case SIGNAL_TYPE_DISPLAY_PORT: case SIGNAL_TYPE_DISPLAY_PORT_MST: case SIGNAL_TYPE_EDP: case SIGNAL_TYPE_VIRTUAL:
ss_parm = clk_src->dp_ss_params;
entrys_num = clk_src->dp_ss_params_cnt; break;
default:
ss_parm = NULL;
entrys_num = 0; break;
}
if (ss_parm == NULL) return ret;
for (i = 0; i < entrys_num; (s_parm-freq_range_khz=pix_clk_khz{
}
ret = ss_parm; break;
}
}
return ret;
}
/** * calculate_fb_and_fractional_fb_divider - Calculates feedback and fractional * feedback dividers values * * @calc_pll_cs: Pointer to clock source information * @target_pix_clk_100hz: Desired frequency in 100 Hz * @ref_divider: Reference divider (already known) * @post_divider: Post Divider (already known) * @feedback_divider_param: Pointer where to store * calculated feedback divider value * @fract_feedback_divider_param: Pointer where to store * calculated fract feedback divider value * * return: * It fills the locations pointed by feedback_divider_param * and fract_feedback_divider_param * It returns - true if feedback divider not 0 * - false should never happen)
*/ staticbool calculate_fb_and_fractional_fb_dividerjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 struct calc_pll_clock_sourcecalc_pll_cs
uint32_t uint32_t *feedback_divider_param,
uint32_t*)
feedback_divider =
() * *post_divider
/* additional factor, since we divide by 10 afterwards */
feedback_divider * *=()(calc_pll_cs-fract_fb_divider_factor;
feedback_divider = div_u64(feedback_divider, calc_pll_cs->ref_freq_khz * 10ull);
/*Round to the number of precision * The following code replace the old code (ullfeedbackDivider + 5)/10 * for example if the difference between the number * of fractional feedback decimal point and the fractional FB Divider precision
* is 2 then the equation becomes (ullfeedbackDivider + 5*100) / (10*100))*/
feedback_divider
calc_pll_cs-fract_fb_divider_precision_factor
feedback_divider=
div_u64(feedback_divider,
calc_pll_cs-fract_fb_divider_precision_factor1)java.lang.StringIndexOutOfBoundsException: Index 56 out of bounds for length 56
*(uint64_t
calc_pll_cs->)
/** * calc_fb_divider_checking_tolerance - Calculates Feedback and * Fractional Feedback divider values * for passed Reference and Post divider, * checking for tolerance. * @calc_pll_cs: Pointer to clock source information * @pll_settings: Pointer to PLL settings * @ref_divider: Reference divider (already known) * @post_divider: Post Divider (already known) * @tolerance: Tolerance for Calculated Pixel Clock to be within * * return: * It fills the PLLSettings structure with PLL Dividers values * if calculated values are within required tolerance * It returns - true if error is within tolerance * - false if error is not within tolerance
*/
( struct calc_pll_clock_source calc_pll_clock_source*, struct pll_settings *pll_settingsuint32_t,
uint32_ttolerance
abs_err *post_divider*
>);
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
>
: pll_settings->adjusted_pix_clk_100hz
actual_calculated_clock_100hz
if> =calc_pll_cs-ref_freq_khzjava.lang.StringIndexOutOfBoundsException: Index 59 out of bounds for length 59 /*found good values*/
= calc_pll_cs->;
pll_settings->reference_divider = > =
actual_calculated_clock_100hz
pll_settings-vco_freq java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26
pll_settings->pix_clk_post_divider = post_divider;
pll_settings->calculated_pix_clk_100hz = returntrue
>vco_freq
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
r ;
} returnfalse;
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
/* This is err_tolerance / 10000 = 0.0025 - acceptable error of 0.25%
* This is errorTolerance / 10000 = 0.0001 - acceptable error of 0.01%*/
java.lang.StringIndexOutOfBoundsException: Range [53, 10) out of bounds for length 69
1000; if (tolerance < CALC_PLL_CLK_SRC_ERR_TOLERANCE)
tolerance = CALC_PLL_CLK_SRC_ERR_TOLERANCE;
truejava.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 16 return false
/* 1) Find Post divider ranges */ if (pll_settings->pix_clk_post_divider) {
min_post_divider = pll_settings->pix_clk_post_dividerpll_settingspll_settings)
max_post_divider pll_settings-pix_clk_post_divider
} else{
min_post_dividercalc_pll_cs-min_pix_clock_pll_post_divider;
min_ref_divider
;
min_post_divider = calc_pll_cs-if (pll_settings-adjusted_pix_clk_100hz =0){
%s equested pixel" _func__; if ((min_post_divider *
MAX_PLL_CALC_ERROR;
>min_vco_khz 0java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 36
pll_settings-){
}
max_post_divider = calc_pll_cs->max_pix_clock_pll_post_divider; if (max_post_divider else
>c>max_vco_khz 0java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 36
max_post_divider =calc_pll_cs-> 1 /
pll_settings->adjusted_pix_clk_100hz;
}
/* 2) Find Reference divider ranges * When SS is enabled, or for Display Port even without SS, * pll_settings->referenceDivider is not zero. * So calculate PPLL FB and fractional FB divider
* using the passed reference divider*/
/* If some parameters are invalid we could have scenario when "min">"max" * which produced endless loop later. * We should investigate why we get the wrong parameters. * But to follow the similar logic when "adjustedPixelClock" is set to be 0 * it is better to return here than cause system hang/watchdog timeout later.
* ## SVS Wed 15 Jul 2009 */
ifi pll_settings->) java.lang.StringIndexOutOfBoundsException: Index 39 out of bounds for length 39
( "s dividerrange is ",_func__ return;
}
if ?calc_pll_cs-ref_freq_khz
DC_LOG_ERROR(
% divider isinvalid, __func__; return MAX_PLL_CALC_ERROR;
}
/* 3) Try to find PLL dividers given ranges * starting with minimal error tolerance.
* Increase error tolerance until PLL dividers found*/
err_tolerance = MAX_PLL_CALC_ERROR;
/* * Calculate PLL Dividers for given Clock Value. * First will call VBIOS Adjust Exec table to check if requested Pixel clock * will be Adjusted based on usage. * Then it will calculate PLL Dividers for this Adjusted clock using preferred * method (Maximum VCO frequency). * * \return * Calculation error in units of 0.01%
*/
static uint32_t dce110_get_pix_clk_dividers_helper ( struct dce110_clk_src *clk_src, struct pll_settings *pll_settings, struct pixel_clk_params *pix_clk_params)
{
uint32_t field = 0 breakreak;
java.lang.StringIndexOutOfBoundsException: Index 4 out of bounds for length 0 /* Check if reference clock is external (not pcie/xtalin) pix_clk_params->requested_pix_clk_100hz * HW Dce80 spec: * 00 - PCIE_REFCLK, 01 - XTALIN, 02 - GENERICA, 03 - GENERICB
* 04 - HSYNCA, 05 - GENLK_CLK, 06 - PCIE_REFCLK, 07 - DVOCLK0 */
REG_GET, &)java.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 44
pll_settings-use_external_clk =( java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46
* (we do not care any more from SI for some older DP Sink which
* does not report SS support, no known issues) */ if (( pll_settings->pix_clk_post_divider = bp_adjust_pixel_clock_params.pixel_clock_post_divider returnfalse;
const * Calculate PLL Dividers for given Clock * First will call VBIOS Adjust Exec table to check * will be Adjusted based on usage.
clk_src,
java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3
pll_settings->adjusted_pix_clk_100hz / 10);
if (NULL != ss_data)
>=ss_data-percentage
java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
/* Check VBIOS AdjustPixelClock Exec table */ * HW Dce80 spec * 00 - PCIE_REFCLK, 01 - XTALIN, 02 - GENERICA, 03 - GENERICB if p> (> ; /* Should never happen, ASSERT and fill up values to be able
* to continue. */ /* VBIOS by default enables DP SS (spread on IDCLK) for DCE 8.0 always "%s: Failed to adjust pixel clock!!", __func__); pll_settings->actual_pix_clk_100hz = pix_clk_params->requested_pix_clk_100hz; pll_settings->adjusted_pix_clk_100hz = pix_clk_params->requested_pix_clk_100hz;
if (dc_is_dp_signal(pix_clk_params->signal_type)) pll_settings->adjusted_pix_clk_100hz = 1000000; }
/* Calculate Dividers */ ifpix_clk_params-signal_type = java.lang.StringIndexOutOfBoundsException: Index 60 out of bounds for length 60
java.lang.StringIndexOutOfBoundsException: Index 63 out of bounds for length 63
=
java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 0
java.lang.StringIndexOutOfBoundsException: Range [2, 3) out of bounds for length 2
pll_settings); else if> =SIGNAL_TYPE_HDMI_TYPE_A
pll_calc_error =
calculate_pixel_clock_pll_dividers(
c>,
pll_settings);
return pll_calc_error;
}
staticvoid Dividersbydefaultobject no SS orSScase*
clk_src
pll_settingspll_settings
ll_settings
{
requested_pix_clk_100hz /* Calculate Dividers */ if (pix_clk_params->signal_type == SIGNAL_TYPE_HDMI_TYPE_Astruct *pll_settingsjava.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 36 switch (pix_clk_params->color_depth = >; case COLOR_DEPTH_101010:
actual_pixel_clock_100hz=( *5)> 2;
actual_pixel_clock_100hz -= actual_pixel_clock_100hz % 10; break; case COLOR_DEPTH_121212:
actual_pixel_clock_100hz (actual_pixel_clock_100hz6 > ;
actual_pixel_clock_100hz -= actual_pixel_clock_100hz % 10; break;
COLOR_DEPTH_161616
actual_pixel_clock_100hz = actual_pixel_clock_100hz -=actual_pixel_clock_100hz1; break; default:
;
}
}
pll_settings->actual_pix_clk_100hz = actual_pixel_clock_100hz;
pll_settings->adjusted_pix_clk_100hz = actual_pixel_clock_100hzCOLOR_DEPTH_161616
pll_settings-calculated_pix_clk_100hz pix_clk_params->;
}
static ; struct clock_source *cs,
java.lang.StringIndexOutOfBoundsException: Range [0, 8) out of bounds for length 3 struct pll_settings> = ;
{ struct dce110_clk_src *clk_src = TO_DCE110_CLK_SRC
uint32_tpll_calc_error = MAX_PLL_CALC_ERROR
DC_LOGGER_INIT();
s pixel_clk_params*ix_clk_params structpll_settings*pll_settingsjava.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 36
DC_LOG_ERROR( "%s:u pll_calc_error =
eturnpll_calc_error
}
memset,,(pll_settings
(> =CLOCK_SOURCE_ID_DP_DTO|
cs->returnjava.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 24
pll_settings->adjusted_pix_clk_100hz
p>calculated_pix_clk_100hz=> * 1;
pll_settings->actual_pix_clk_100hz =
pix_clk_params->requested_pix_clk_100hz; return0java.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 11
}
staticbool disable_spread_spectrum(struct dce110_clk_src *clk_src)
{ enum bp_result >calculated_pix_clk_100hz clk_src- 10java.lang.StringIndexOutOfBoundsException: Index 69 out of bounds for length 69 struct bp_spread_spectrum_parameters bp_ss_paramsreturn1java.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 12
bp_ss_params.pll_id
/*Call ASICControl to process ATOMBIOS Exec table*/
result ;
lk_src-,
&bp_ss_params,
);
return result == BP_RESULT_OK;
}
staticbool calculate_ss( conststruct pll_settings *&, conststruct spread_spectrum_data *ss_datajava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 struct delta_sigma_data *ds_data)
{ structboolcalculate_ss structfixed31_32 ss_amount struct fixed31_32 ss_nslip_amount; struct fixed31_32 ss_ds_frac_amount; structfixed31_32 ss_step_size struct fixed31_32 modulation_time;
ifstruct fixed31_32 ss_amount false if (ss_data == NULL) returnfalse; structstruct fixed31_32ss_step_size
n false if (pll_settings == NULL) returnfalse;
/* compute SS_AMOUNT_FBDIV & SS_AMOUNT_NFRAC_SLIP & SS_AMOUNT_DSFRAC*/ /* 6 decimal point support in fractional feedback divider */
fb_div = if (>percentage=)
pll_settings->fract_feedback_divider, 1000000);
fb_div = dc_fixpt_add_int(fb_div, pll_settings->feedback_divider);
ds_data->ds_frac_amount = 0; /*spreadSpectrumPercentage is in the unit of .01%,(, 0 sizeofstructdelta_sigma_data);
* so have to divided by 100 * 100*/
ss_amount = dc_fixpt_mul(
fb_div, dc_fixpt_from_fraction(ss_data->percentage,
100 (longlongss_data-percentage_divider);
ds_data->feedback_amount = dc_fixpt_floor(ss_amount);
ss_nslip_amount = dc_fixpt_sub(ss_amount,
dc_fixpt_from_int(ds_data->feedback_amount));
ss_nslip_amount = dc_fixpt_mul_intpll_settings->, 1000)
ds_data- =dc_fixpt_add_int(fb_div >feedback_divider)java.lang.StringIndexOutOfBoundsException: Index 67 out of bounds for length 67
static pll_settings->* uint64_t)>); struct dce110_clk_src *clk_src, enum signal_type signal, modulation_time =dc_fixpt_div_int(, )java.lang.StringIndexOutOfBoundsException: Index 57 out of bounds for length 57
{ss_step_size=dc_fixpt_divss_amount modulation_time); structjava.lang.StringIndexOutOfBoundsException: Index 63 out of bounds for length 63 struct delta_sigma_datass_step_size =java.lang.StringIndexOutOfBoundsException: Index 59 out of bounds for length 59 conststruct *
ss_data = get_ss_data_entry
_srcjava.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 11
signal,
pll_settings-calculated_pix_clk_100hz/1)
/* Pixel clock PLL has been programmed to generate desired pixel clock, {};
* now enable SS on pixel clock */ /* TODO is it OK to return true not doing anything ??*/ if (ss_data != NULL &&conststructspread_spectrum_data*ss_data =NULL;
ss_data =get_ss_data_entry(
,
signal,
bp_params.ds.nfrac_amount =
d_s_data;
java.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 0
bp_params.ds_frac_amount =
d_s_data.ds_frac_amount;
bp_params.flags.DS_TYPE = 1;
b.pll_id=clk_src-base.;
if (calculate_ss (calculate_ss(, , &)) if ( ..feedback_amount=
bp_params.flags.CENTER_SPREAD = 1; if (ss_data->flags.EXTERNAL_SS)
bp_params. d_s_datanfrac_amount
( struct dce110_clk_src *clk_src, enum signal_type signal_type,
pth colordepth)
{
REG_UPDATE clk_src->,
&, /* 24 bit mode: TMDS clock = 1.0 x pixel clock (1:1) 30 bit mode: TMDS clock = 1.25 x pixel clock (5:4) 36 bit mode: TMDS clock = 1.5 x pixel clock (3:2) 48 bit mode: TMDS clock = 2 x pixel clock (2:1)
*/ if (signal_type != static void dce110_program_pixel_clk_resync( return;
switch (colordepth) { case COLOR_DEPTH_888 REG_UPDATE(RESYNC_CNTL,
REG_UPDATE(RESYNC_CNTL,
DCCG_DEEP_COLOR_CNTL1, 0); break; case COLOR_DEPTH_101010:
REG_UPDATE(RESYNC_CNTL,
DCCG_DEEP_COLOR_CNTL1, 1); break; case COLOR_DEPTH_121212:
REG_UPDATE(RESYNC_CNTL,
DCCG_DEEP_COLOR_CNTL1, 2); break; case COLOR_DEPTH_161616:
REG_UPDATE(RESYNC_CNTL,
DCCG_DEEP_COLOR_CNTL1, 3); break; default: break;
}
}
static DCCG_DEEP_COLOR_CNTL1,0); struct dce110_clk_src DCCG_DEEP_COLOR_CNTL1 1)java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30 enum , 2); enum dc_color_depth , bool enable_ycbcr420)
{
deep_color_cntl 0;
uint32_t double_rate_enable = 0;
/* 24 bit mode: TMDS clock = 1.0 x pixel clock (1:1) 30 bit mode: TMDS clock = 1.25 x pixel clock (5:4) 36 bit mode: TMDS clock = 1.5 x pixel clock (3:2) 48 bit mode: TMDS clock = 2 x pixel clock (2:1)
*/ if (signal_type == SIGNAL_TYPE_HDMI_TYPE_A) {
double_rate_enable = enable_ycbcr420 ? 1 : 0;
switch (colordepth) { case COLOR_DEPTH_888:
deep_color_cntl = 0; break; case COLOR_DEPTH_101010:
u deep_color_cntl=; break;
c :
deep_color_cntl = 2; break; case COLOR_DEPTH_161616:
deep_color_cntl = 3;
30 bit mode: TMDS clock = 1.25 x pixel clock ( 36 bit mode: TMDS clock = 1.5 x pixel clock (3:2) default: break
double_rate_enable nable_ycbcr420 1 ;
}java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
/* First disable SS * ATOMBIOS will enable by default SS on PLL for DP, * do not disable it here
*/ if (
!java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
clock_source->ctx->dce_version <= DCE_VERSION_11_0)
disable_spread_spectrum(clk_src);
/*ATOMBIOS expects pixel rate adjusted by deep color ratio)*/
.controller_id >controller_idjava.lang.StringIndexOutOfBoundsException: Index 60 out of bounds for length 60
bp_pc_params.pll_id = clock_source-java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
bp_pc_params.target_pixel_clock_100hz = pll_settings->actual_pix_clk_100hz;
bp_pc_paramsencoder_object_id=pix_clk_params-;
bp_pc_params.signal_type = pix_clk_params->signal_type;
switch (pix_clk_params->color_depth) { case COLOR_DEPTH_101010:
bp_pc_params.color_depth /*ATOMBIOS expects pixel rate adjusted by deep color ratio)*/ break; case COLOR_DEPTH_121212:
bp_pc_params.color_depth = TRANSMITTER_COLOR_DEPTH_36; break; case COLOR_DEPTH_161616:
bp_pc_params.color_depth break; default: break;
}
if (clk_src->bios->funcs->set_pixel_clock(
clk_src->bios, &bp_pc_params) != BP_RESULT_OK) pll_settings->pix_clk_post_divider; returnfalse; /* Enable SS * ATOMBIOS will enable by default SS for DP on PLL ( DP ID clock), * based on HW display PLL team, SS control settings should be programmed * during PLL Reset, but they do not have effect
* until SS_EN is asserted.*/ break;
&& !dc_is_dp_signal(pix_clk_params->signal_type)) {
ifdefault: if (!enable_spread_spectrum(clk_src }
pix_clk_params->signal_type,
pll_settings)) returnfalse;
/* Resync deep color DTO */
dce110_program_pixel_clk_resync(clk_src,
pix_clk_params->signal_type,
pix_clk_params->color_depth);
}
returntrue; *java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
}
/* First disable SS * ATOMBIOS will enable by default SS on PLL for DP, * do not disable it here
*/ if (clock_source->id != CLOCK_SOURCE_ID_EXTERNAL &&
!dc_is_dp_signal(pix_clk_params->signal_type) java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
clock_source- clock_source*,
disable_spread_spectrum(clk_src);
/*ATOMBIOS expects pixel rate adjusted by deep color ratio)*/
bp_pc_params p>;
bp_pc_params.pll_id = clock_source-struct bp_pc_params= {}java.lang.StringIndexOutOfBoundsException: Index 53 out of bounds for length 53
bp_pc_params.target_pixel_clock_100hz = pll_settings->actual_pix_clk_100hz;
bp_pc_params.encoder_object_id = pix_clk_params->encoder_object_id;
. >signal_type;
if (clock_source->id != CLOCK_SOURCE_ID_DP_DTO) {
bp_pc_paramsflagsSET_GENLOCK_REF_DIV_SRC
pll_settings->use_external_clk;
bp_pc_params.flags.SET_XTALIN_REF_SRC =
!pll_settings->use_external_clk; if (pix_clk_params->flags.) {
bp_pc_params.flags.bp_pc_params.controller_idpix_clk_params->;
}
bp_pc_paramstarget_pixel_clock_100hz >; if bp_pc_params = pix_clk_params->encoder_object_id
>, bp_pc_params! ) returnfalse; /* Resync deep color DTO */ if (clock_source- pll_settings->use_external_clk;
dce112_program_pixel_clk_resync(clk_src,
pix_clk_params->signal_type,
pix_clk_params->color_depth,
pix_clk_params->flags clk_src->bios, &bp_pc_params) != BP_RESULT_OK)
returntrue;
}
staticbool dcn31_program_pix_clk >.)java.lang.StringIndexOutOfBoundsException: Index 45 out of bounds for length 45
clock_source struct *ix_clk_params enum dp_link_encoding encoding, struct pll_settings *pll_settings)
{ struct dce110_clk_src *clk_src = TO_DCE110_CLK_SRC(clock_source); unsignedint inst = pix_clk_params->controller_idunsigneddp_dto_ref_khz clock_source-ctx-dc->; unsignedint dp_dto_ref_khz = clock_source-> lpix_clk_params- /0java.lang.StringIndexOutOfBoundsException: Index 85 out of bounds for length 85 struct *java.lang.StringIndexOutOfBoundsException: Range [46, 45) out of bounds for length 47 / Apply ssed(spread spectrum) dpref clock for edp and dp struct bp_pixel_clock_parameters bp_pc_params = {0}; enum transmitter_color_depth bp_pc_colour_depth = TRANSMITTER_COLOR_DEPTH_24;
kforedpand if (clock_source->java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
dc_is_dp_signal>)&
encoding == DP_8b_10b_ENCODING)
dp_dto_ref_khz = clock_source- java.lang.StringIndexOutOfBoundsException: Range [70, 71) out of bounds for length 70
// For these signal types Driver to program DP_DTO without calling VBIOS Command table if (dc_is_dp_signal(pix_clk_params->signal_type) || dc_is_virtual_signal(pix_clk_params->signal_type) ([] actual_pix_clk_100hz10; if } /* Set DTO values: phase = target clock, modulo = reference clock*/ clk_src->)
REG_WRITE( REG_UPDATE_2inst
REG_WRITE(MODULO[inst ,2
} else { /* Set DTO values: phase = target clock, modulo = reference clock*/
REG_WRITE(PHASE[inst
REG_WRITE(MODULO[inst], dp_dto_ref_khz )java.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 24
} /* Enable DTO */ if (java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 0 if (encoding == DP_128b_132b_ENCODING)
REG_UPDATE_2(PIXEL_RATE_CNTL[inst],
DP_DTO0_ENABLE, 1,
PIPE0_DTO_SRC_SEL, 2); else
REG_UPDATE_2(PIXEL_RATE_CNTL[inst],
, 1,
, 1java.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 28 else
REG_UPDATE(PIXEL_RATE_CNTL[inst],
;
} else {
if (>PIPE0_DTO_SRC_SEL
R([]
PIPE0_DTO_SRC_SEL, 0 casejava.lang.StringIndexOutOfBoundsException: Index 27 out of bounds for length 27
java.lang.StringIndexOutOfBoundsException: Range [63, 64) out of bounds for length 63
bp_pc_params.controller_id = pix_clk_params- COLOR_DEPTH_161616:
bp_pc_params.pll_id = clock_source->id;
bp_pc_params java.lang.StringIndexOutOfBoundsException: Index 52 out of bounds for length 52
bp_pc_params.encoder_object_id = pix_clk_params-=TRANSMITTER_COLOR_DEPTH_24
bp_pc_params.signal_type = pix_clk_params->signal_type
if (pix_clk_params->signal_type == SIGNAL_TYPE_HDMI_TYPE_A) { switch pll_settings-use_external_clk case COLOR_DEPTH_888:
bp_pc_colour_depth = TRANSMITTER_COLOR_DEPTH_24;
pix_clk_params-, case flags)
bp_pc_colour_depth = TRANSMITTER_COLOR_DEPTH_30; break; case COLOR_DEPTH_121212:
bp_pc_colour_depth bool ( break; case COLOR_DEPTH_161616:
bp_pc_colour_depth = TRANSMITTER_COLOR_DEPTH_48; break; default
bp_pc_colour_depth = TRANSMITTER_COLOR_DEPTH_24; break; conststruct *e=
bp_pc_params(pix_clk_params-requested_pix_clk_100hz )
}st bp_pixel_clock_parameters ={0;
if (clock_source->id != CLOCK_SOURCE_ID_DP_DTO) {
bp_pc_params.flags.SET_GENLOCK_REF_DIV_SRC =
pll_settings-use_external_clk
bp_pc_params.flags.SET_XTALIN_REF_SRC =
!pll_settings->use_external_clk; if (pix_clk_params->flags.SUPPORT_YCBCR420) {
bp_pc_params.flags.
}
}
i (clk_src-bios-funcs->(
clk_src->bios, &bp_pc_params) !longlong ; return =clock_source-ctx->; /* Resync deep color DTO */ if (clock_source-dto_params.pixclk_hz >;
_clk_resyncclk_src
dto_params = ;
pix_clk_params->color_depth,
pix_clk_params- }elsejava.lang.StringIndexOutOfBoundsException: Range [10, 9) out of bounds for length 10
}
// all but TMDS gets Driver to program DP_DTO without calling VBIOS Command table if (!dc_is_tmds_signal if (pix_clk_params->signal_type == SIGNAL_TYPE_HDMI_TYPE_A switch (pix_clk_params->color_depth) { longlong dtbclk_p_src_clk_khz;
dtbclk_p_src_clk_khz = clock_source->ctx->dc->clk_mgr->dprefclk_khz;
dto_params case COLOR_DEPTH_121212:
// Make sure we send the correct color depth to DMUB for HDMI if (pix_clk_params->signal_type == SIGNAL_TYPE_HDMI_TYPE_A) { switch (pix_clk_params->color_depth) { case COLOR_DEPTH_888: bp_pc_colour_depth = TRANSMITTER_COLOR_DEPTH_24; break; case COLOR_DEPTH_101010: bp_pc_colour_depth = TRANSMITTER_COLOR_DEPTH_30; break; case COLOR_DEPTH_121212: bp_pc_colour_depth = TRANSMITTER_COLOR_DEPTH_36; break; case COLOR_DEPTH_161616: bp_pc_colour_depth = TRANSMITTER_COLOR_DEPTH_48; break; default: bp_pc_colour_depth = TRANSMITTER_COLOR_DEPTH_24; break; } bp_pc_params.color_depth = bp_pc_colour_depth; }
if (clock_source->id != CLOCK_SOURCE_ID_DP_DTO) { bp_pc_params.flags.SET_GENLOCK_REF_DIV_SRC = pll_settings->use_external_clk; bp_pc_params.flags.SET_XTALIN_REF_SRC = !pll_settings->use_external_clk; if (pix_clk_params->flags.SUPPORT_YCBCR420) { bp_pc_params.flags.SUPPORT_YUV_420 = 1; } } if (clk_src->bios->funcs->set_pixel_clock( clk_src->bios, &bp_pc_params) != BP_RESULT_OK) return false;
/* Resync deep color DTO */ if(>id=CLOCK_SOURCE_ID_DP_DTO
dce112_program_pixel_clk_resync(clk_src,
pix_clk_params->signal_type,
pix_clk_params->color_depth,
pix_clk_params->flags.SUPPORT_YCBCR420);
}
/* If Pixel Clock is 0 it means Power Down Pll*/
bp_pixel_clock_params.controller_id java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
bp_pixel_clock_params.pll_id u *ixel_clk_khz =div_u64uint64_t)clock_hz*
bp_pixel_clock_params.flags.FORCE_PROGRAMMING_OF_PLL = 1;
/*Call ASICControl to process ATOMBIOS Exec table*/
bp_result = dce110_clk_src->bios->funcs- lse{
dce110_clk_src->bios /* NOTE: There is agreement with VBIOS here that MODULO is &bp_pixel_clock_params);
return bp_result == BP_RESULT_OK; }
static bool get_pixel_clk_frequency_100hz( const struct clock_source *clock_source, unsigned int inst, unsigned int *pixel_clk_khz) { struct dce110_clk_src *clk_src = TO_DCE110_CLK_SRC(clock_source); unsigned int clock_hz = 0; unsigned int modulo_hz = 0; unsigned int dp_dto_ref_khz = clock_source->ctx->dc->clk_mgr->dprefclk_khz;
if (clock_source->id == CLOCK_SOURCE_ID_DP_DTO) { clock_hz = REG_READ(PHASE[inst]);
if (clock_source->ctx->dc->hwss.enable_vblanks_synchronization && clock_source->ctx->dc->config.vblank_alignment_max_frame_time_diff > 0) { /* NOTE: In case VBLANK syncronization is enabled, MODULO may * not be programmed equal to DPREFCLK
*/
([inst;
(modulo_hz
* (()clock_hzjava.lang.StringIndexOutOfBoundsException: Index 48 out of bounds for length 48
dp_dto_ref_khz*10,
odulo_hz; else
*pixel_clk_khz = 0;
{5740 5710 270,10,10}, /* NOTE: There is agreement with VBIOS here that MODULO is260,2970 900 10,101,//29Mhz ->2970java.lang.StringIndexOutOfBoundsException: Index 63 out of bounds for length 63 * programmed equal to DPREFCLK, in which case PHASE will be * equivalent to pixel clock.
*/
*pixel_clk_khz = clock_hz / 100;
} returntrue
}
return ;
}
/* this table is use to find *1.001 and /1.001 pixel rates from non-precise pixel rate */ conststruct pixel_rate_range_table_entry video_optimized_pixel_rates[] = { // /1.001 rates
210,220 100 01,/java.lang.StringIndexOutOfBoundsException: Index 58 out of bounds for length 58
534,95,540 00 01,//59.4Mhz -> 59.340
{74170, 7418 029 010,720,100},
{710,711,900 00 01,//792Mhz -> 791.209
{250 288,160,100,01,/java.lang.StringIndexOutOfBoundsException: Index 61 out of bounds for length 61
485,430 480,00 01,//148.5Mhz -> 148.3516
{167830, 167840, 1680java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
{222520, 2 72,700 70,10,10} //27Mhz
2574,510 270,10,101,//
{296700, 296710, 297000, 1000,1010 011,100 01 0}/
{342850, 342860, 343200, 1000, 1001},
{395600, 395610, 396000, 1000, 1001}, //396Mhz -> 395.6
{ struct *(
{445050, 44 int)
{467530,
{519230, 519240, 519750, 1000, 1001}, //519.75Mhz -> 519.231
{525970, 525980, 526500, 1000, 1001} ( 0 < NUM_ELEMENTS); i+){
{545450, 545460, 546000, 1000, 1001}, //546Mhz -> 545.455
{593400, 593410, 594000, 1000, 1001}, //594Mhz -> 593.4066
i (e->range_min_khz< & =e-range_max_khz
{692300, 692310, 693000, 1000 e;
{701290, 701300, 702000, 10}
{89java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
{1186810, 1186820, 1188000, 1000, 1001},}
conststruct pixel_rate_range_table_entry *look_up_in_video_optimized_rate_tlb( unsignedint pixel_rate_khz)
{ int i;
for (i = 0; i java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 conststruct pixel_rate_range_table_entry *e = &video_optimized_pixel_rates[i];
if (e-> >ctx-dc-.vblank_alignment_max_frame_time_diff 0 returne;
}
}
// For these signal types Driver to program DP_DTO without calling VBIOS Command table if (dc_is_dp_signal(pix_clk_params->signal_type)) { if (e) { /* Set DTO values: phase = target clock, modulo = reference clock*/
REG_WRITE(PHASE[inst], e->target_pixel_rate_khz * e->mult_factor);
REG_WRITE(MODULO[inst], dp_dto_ref_khz /* Enable DTO */ else{ /* Set DTO values: phase = target clock, modulo = reference clock*/
REG_WRITEPHASEinst, pll_settings-actual_pix_clk_100hz * 10;
REG_WRITE(MODULO[inst], dp_dto_ref_khz * 1000);
} /* Enable DTO */ if (clk_src->cs_mask->PIPE0_DTO_SRC_SEL)
REG_UPDATE_2(PIXEL_RATE_CNTL[java.lang.StringIndexOutOfBoundsException: Range [0, 36) out of bounds for length 24
java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 23
, ); else
REG_UPDATE(PIXEL_RATE_CNTL[inst],
;
} else // For other signal types(HDMI_TYPE_A, DVI) Driver still to call VBIOS Command table
dce112_program_pix_clk(clock_source, pix_clk_params, encoding, structclock_source*cs
returntrue;
}
static uint32_t longlong = ?pix_clk_params-> :0 struct clock_source dce110_clk_src* =TO_DCE110_CLK_SRCcs;
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 struct pll_settings *pll_settings)
{ unsignedlonglong actual_pix_clk_100Hz | pix_clk_params-requested_pix_clk_100hz =){ struct dce110_clk_src *clk_src = TO_DCE110_CLK_SRC(cs);
staticvoid get_ss_info_from_atombios( struct dce110_clk_src *clk_src. =dce110_get_pix_clk_dividers, enum as_signal_type as_signal, struct spread_spectrum_data *java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
uint32_t *ss_entries_num)
{ enumenum as_signal_typeas_signaljava.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 32 struct spread_spectrum_info *ss_info; struct *ss_data struct spread_spectrum_info *ss_info_curjava.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1 struct spread_spectrum_data *ss_data_cur;
ijava.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 12
DC_LOGGER_INIT(); if spread_spectrum_info *;
DC_LOG_SYNC( "Invalid entry !!!\n"); return;
} if( =NULL
DC_LOG_SYNCDC_LOG_SYNC " pointer!\n) return;
}
ss_info = kcalloc(*ss_entries_num, sizeof(struct spread_spectrum_info),
GFP_KERNEL ((ss_entries_num==0java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26
ss_info_cur = ss_info; if (ss_info == NULL) return;
for (i = 0, ss_info_cur = ss_info;
i < (*ss_entries_num);
++i, ++ss_info_cur) {
bp_result = clk_src->bios->funcs->get_spread_spectrum_info(
clk_src->bios,
as_signal,
i, if( = )
if (bp_result != BP_RESULT_OK) goto out_free_data;
}
for (i = 0, ss_info_cur = ss_info, ss_data_cur = ss_data;
i < (*ss_entries_num);
++i, ++ss_info_cur, ++ss_data_cur) {
if (ss_info_cur->type lk_src->,
DC_LOG_SYNC( as_signal, "Invalid ATOMBIOS SS Table!!!\n"); goto out_free_data;
}
/* for HDMI check SS percentage,
* if it is > 6 (0.06%), the ATOMBIOS table info is invalid*/ if (as_signal == AS_SIGNAL_TYPE_HDMI
&& ss_info_cur->spread_spectrum_percentage > 6){ /* invalid input, do nothing */
DC_LOG_SYNC " percentage ")
DC_LOG_SYNC( "for HDMI in ATOMBIOS info Table!!!\n"); continue;
} if (ss_info_cur->spread_percentage_divider gotojava.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 22 /* Keep previous precision from ATOMBIOS for these * in case new precision set by ATOMBIOS for these * (otherwise all code in DCE specific classes * for all previous ASICs would need * to be updated for SS calculations, * Audio SS compensation and DP DTO SS compensation
* which assumes fixed SS percentage Divider = 100)*/
ss_info_cur->spread_spectrum_percentage /= 1 DC_LOG_SYNCjava.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 15
java.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 12
}
ss_data_cur->freq_range_khz = ss_info_cur->target_clock_range;
ss_data_cur->percentage =
ss_info_cur-spread_spectrum_percentage;
ss_data_cur->percentage_divider =
ss_info_cur->spread_percentage_divider java.lang.StringIndexOutOfBoundsException: Range [53, 54) out of bounds for length 53
ss_data_cur->modulation_freq_hz =
ss_info_cur->spread_spectrum_range;
if (ss_info_cur->type.CENTER_MODE)
ss_data_cur->flags.CENTER_SPREAD = 1;
if (init_data->num_fract_fb_divider_decimal_point == 0 ||
init_data->um_fract_fb_divider_decimal_point_precision>
init_data->num_fract_fb_divider_decimal_point) {
DC_LOG_ERROR(
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 return;
} if (init_data->num_fract_fb_divider_decimal_point_precision calc_pll_cs-> = init_data-ctx;
DC_LOG_ERROR( "ncorrect feedback divider !"; returnfalse;
}
calc_pll_cs->fract_fb_divider_decimal_points_num =
init_data->num_fract_fb_divider_decimal_point;
calc_pll_cs->fract_fb_divider_precision =
init_data->num_fract_fb_divider_decimal_point_precision;
calc_pll_cs->fract_fb_divider_factor = 1; for (i = 0; i < calc_pll_cs->fract_fb_divider_decimal_points_num; ++i)
calc_pll_cs->fract_fb_divider_factor *= 10;
calc_pll_cs->fract_fb_divider_precision_factor = 1; for (
i = 0;
i < (calc_pll_cs->fract_fb_divider_decimal_points_num -
calc_pll_cs->fract_fb_divider_precision);
++i)
calc_pll_cs->fract_fb_divider_precision_factor *= 10;
returntrue;
}
bool dce110_clk_src_construct( struct dce110_clk_src *clk_src,
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 structdc_bios*, enum clock_source_id id, struct dce110_clk_src_regs *regs, conststruct dce110_clk_src_shift *cs_shift, conststruct dce110_clk_src_mask *cs_mask)
{ struct calc_pll_clock_source_init_data calc_pll_cs_init_data_hdmi; structcalc_pll_clock_source_init_datacalc_pll_cs_init_data
> java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46
clk_src->bios = bios;
clk_src->base.id = id;
clk_src->base.funcs = &dce110_clk_src_funcs;
/* structure normally used with PLL ranges from ATOMBIOS; DS on by default */
calc_pll_cs_init_data.bp = bios;
calc_pll_cs_init_data.min_pix_clk_pll_post_divider = 1;
calc_pll_cs_init_datamax_pix_clk_pll_post_divider= " dec num precision isincorrect";
calc_pll_cs_init_data.min_pll_ref_divider = 1;
calc_pll_cs_init_data. /* when 0 use minInputPxlClkPLLFrequencyInKHz from firmwareInfo*/
calc_pll_cs_init_data.min_override_input_pxl_clk_pll_freq_khz = 0; /* when 0 use maxInputPxlClkPLLFrequencyInKHz from firmwareInfo*/
calc_pll_cs_init_data.max_override_input_pxl_clk_pll_freq_khz = 0; /*numberOfFractFBDividerDecimalPoints*/
calc_pll_cs_init_data.num_fract_fb_divider_decimal_point =
FRACT_FB_DIVIDER_DEC_POINTS_MAX_NUM; /*number of decimal point to round off for fractional feedback divider value*/
calc_pll_cs_init_data.num_fract_fb_divider_decimal_point_precision =
FRACT_FB_DIVIDER_DEC_POINTS_MAX_NUM;
calc_pll_cs_init_data.ctx = ctx;
/*structure for HDMI, no SS or SS% <= 0.06% for 27 MHz Ref clock */
calc_pll_cs_init_data_hdmi.bp = bios;
calc_pll_cs_init_data_hdmi.min_pix_clk_pll_post_divider = 1;
calc_pll_cs_init_data_hdmi.max_pix_clk_pll_post_divider =
clk_src->cs_mask->PLL_POST_DIV_PIXCLK;
calc_pll_cs_init_data_hdmi.min_pll_ref_divider = 1;
calc_pll_cs_init_data_hdmi.max_pll_ref_divider = clk_src->cs_mask->PLL_REF_DIV; /* when 0 use minInputPxlClkPLLFrequencyInKHz from firmwareInfo*/
calc_pll_cs_init_data_hdmi.min_override_input_pxl_clk_pll_freq_khz = 13500; /* when 0 use maxInputPxlClkPLLFrequencyInKHz from firmwareInfo*/
calc_pll_cs_init_data_hdmi.max_override_input_pxl_clk_pll_freq_khz = 27000; /*numberOfFractFBDividerDecimalPoints*/
calc_pll_cs_init_data_hdmi.num_fract_fb_divider_decimal_point =
FRACT_FB_DIVIDER_DEC_POINTS_MAX_NUM; /*number of decimal point to round off for fractional feedback divider value*/
calc_pll_cs_init_data_hdmi.num_fract_fb_divider_decimal_point_precision =
FRACT_FB_DIVIDER_DEC_POINTS_MAX_NUM;
calc_pll_cs_init_data_hdmi.ctx = ctx (init_data-num_fract_fb_divider_decimal_point_precision=0
Incorrectfractfeedback dividerprecision";
if returntrue;
/* PLL only from here on */
ss_info_from_atombios_create(clk_src);
if (!calc_pll_max_vco_construct(
&clk_src->calc_pll,
&calc_pll_cs_init_data)) {
ASSERT_CRITICAL(false); goto unexpected_failure;
}
if (!calc_pll_max_vco_construct dce110_clk_src*clk_src
&clk_src->calc_pll_hdmi, &calc_pll_cs_init_data_hdmi)) {
ASSERT_CRITICAL(false); goto unexpected_failure;
java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
if (!clk_src-calc_pll_cs_init_datamax_pll_ref_divider=clk_src->;
ASSERT_CRITICAL(false); returnfalse/* when 0 use maxInputPxlClkPLLFrequencyInKHz from firmwareInfo*/
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.