Commit 380604e2 authored by Ken Chalmers's avatar Ken Chalmers Committed by Alex Deucher

drm/amd/display: Use 100 Hz precision for pipe pixel clocks

[Why]
Users would like more accurate pixel clocks, especially for fractional
"TV" frame rates like 59.94 Hz.

[How]
Store and communicate pixel clocks with 100 Hz accuracy from
dc_crtc_timing through to BIOS command table setpixelclock call.
Signed-off-by: default avatarKen Chalmers <ken.chalmers@amd.com>
Reviewed-by: default avatarCharlene Liu <Charlene.Liu@amd.com>
Acked-by: default avatarLeo Li <sunpeng.li@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 43995f8f
...@@ -2580,7 +2580,7 @@ get_output_color_space(const struct dc_crtc_timing *dc_crtc_timing) ...@@ -2580,7 +2580,7 @@ get_output_color_space(const struct dc_crtc_timing *dc_crtc_timing)
* according to HDMI spec, we use YCbCr709 and YCbCr601 * according to HDMI spec, we use YCbCr709 and YCbCr601
* respectively * respectively
*/ */
if (dc_crtc_timing->pix_clk_khz > 27030) { if (dc_crtc_timing->pix_clk_100hz > 270300) {
if (dc_crtc_timing->flags.Y_ONLY) if (dc_crtc_timing->flags.Y_ONLY)
color_space = color_space =
COLOR_SPACE_YCBCR709_LIMITED; COLOR_SPACE_YCBCR709_LIMITED;
...@@ -2623,7 +2623,7 @@ static void adjust_colour_depth_from_display_info(struct dc_crtc_timing *timing_ ...@@ -2623,7 +2623,7 @@ static void adjust_colour_depth_from_display_info(struct dc_crtc_timing *timing_
if (timing_out->display_color_depth <= COLOR_DEPTH_888) if (timing_out->display_color_depth <= COLOR_DEPTH_888)
return; return;
do { do {
normalized_clk = timing_out->pix_clk_khz; normalized_clk = timing_out->pix_clk_100hz / 10;
/* YCbCr 4:2:0 requires additional adjustment of 1/2 */ /* YCbCr 4:2:0 requires additional adjustment of 1/2 */
if (timing_out->pixel_encoding == PIXEL_ENCODING_YCBCR420) if (timing_out->pixel_encoding == PIXEL_ENCODING_YCBCR420)
normalized_clk /= 2; normalized_clk /= 2;
...@@ -2704,7 +2704,7 @@ fill_stream_properties_from_drm_display_mode(struct dc_stream_state *stream, ...@@ -2704,7 +2704,7 @@ fill_stream_properties_from_drm_display_mode(struct dc_stream_state *stream,
mode_in->crtc_vsync_start - mode_in->crtc_vdisplay; mode_in->crtc_vsync_start - mode_in->crtc_vdisplay;
timing_out->v_sync_width = timing_out->v_sync_width =
mode_in->crtc_vsync_end - mode_in->crtc_vsync_start; mode_in->crtc_vsync_end - mode_in->crtc_vsync_start;
timing_out->pix_clk_khz = mode_in->crtc_clock; timing_out->pix_clk_100hz = mode_in->crtc_clock * 10;
timing_out->aspect_ratio = get_aspect_ratio(mode_in); timing_out->aspect_ratio = get_aspect_ratio(mode_in);
stream->output_color_space = get_output_color_space(timing_out); stream->output_color_space = get_output_color_space(timing_out);
...@@ -2832,7 +2832,7 @@ static void set_master_stream(struct dc_stream_state *stream_set[], ...@@ -2832,7 +2832,7 @@ static void set_master_stream(struct dc_stream_state *stream_set[],
if (stream_set[j] && stream_set[j]->triggered_crtc_reset.enabled) { if (stream_set[j] && stream_set[j]->triggered_crtc_reset.enabled) {
int refresh_rate = 0; int refresh_rate = 0;
refresh_rate = (stream_set[j]->timing.pix_clk_khz*1000)/ refresh_rate = (stream_set[j]->timing.pix_clk_100hz*100)/
(stream_set[j]->timing.h_total*stream_set[j]->timing.v_total); (stream_set[j]->timing.h_total*stream_set[j]->timing.v_total);
if (refresh_rate > highest_rfr) { if (refresh_rate > highest_rfr) {
highest_rfr = refresh_rate; highest_rfr = refresh_rate;
......
...@@ -205,7 +205,7 @@ bool dm_helpers_dp_mst_write_payload_allocation_table( ...@@ -205,7 +205,7 @@ bool dm_helpers_dp_mst_write_payload_allocation_table(
mst_port = aconnector->port; mst_port = aconnector->port;
if (enable) { if (enable) {
clock = stream->timing.pix_clk_khz; clock = stream->timing.pix_clk_100hz / 10;
switch (stream->timing.display_color_depth) { switch (stream->timing.display_color_depth) {
......
...@@ -964,9 +964,9 @@ static enum bp_result set_pixel_clock_v3( ...@@ -964,9 +964,9 @@ static enum bp_result set_pixel_clock_v3(
allocation.sPCLKInput.ucPostDiv = allocation.sPCLKInput.ucPostDiv =
(uint8_t)bp_params->pixel_clock_post_divider; (uint8_t)bp_params->pixel_clock_post_divider;
/* We need to convert from KHz units into 10KHz units */ /* We need to convert from 100Hz units into 10KHz units */
allocation.sPCLKInput.usPixelClock = allocation.sPCLKInput.usPixelClock =
cpu_to_le16((uint16_t)(bp_params->target_pixel_clock / 10)); cpu_to_le16((uint16_t)(bp_params->target_pixel_clock_100hz / 100));
params = (PIXEL_CLOCK_PARAMETERS_V3 *)&allocation.sPCLKInput; params = (PIXEL_CLOCK_PARAMETERS_V3 *)&allocation.sPCLKInput;
params->ucTransmitterId = params->ucTransmitterId =
...@@ -1042,9 +1042,9 @@ static enum bp_result set_pixel_clock_v5( ...@@ -1042,9 +1042,9 @@ static enum bp_result set_pixel_clock_v5(
(uint8_t)bp->cmd_helper->encoder_mode_bp_to_atom( (uint8_t)bp->cmd_helper->encoder_mode_bp_to_atom(
bp_params->signal_type, false); bp_params->signal_type, false);
/* We need to convert from KHz units into 10KHz units */ /* We need to convert from 100Hz units into 10KHz units */
clk.sPCLKInput.usPixelClock = clk.sPCLKInput.usPixelClock =
cpu_to_le16((uint16_t)(bp_params->target_pixel_clock / 10)); cpu_to_le16((uint16_t)(bp_params->target_pixel_clock_100hz / 100));
if (bp_params->flags.FORCE_PROGRAMMING_OF_PLL) if (bp_params->flags.FORCE_PROGRAMMING_OF_PLL)
clk.sPCLKInput.ucMiscInfo |= clk.sPCLKInput.ucMiscInfo |=
...@@ -1118,9 +1118,9 @@ static enum bp_result set_pixel_clock_v6( ...@@ -1118,9 +1118,9 @@ static enum bp_result set_pixel_clock_v6(
(uint8_t) bp->cmd_helper->encoder_mode_bp_to_atom( (uint8_t) bp->cmd_helper->encoder_mode_bp_to_atom(
bp_params->signal_type, false); bp_params->signal_type, false);
/* We need to convert from KHz units into 10KHz units */ /* We need to convert from 100 Hz units into 10KHz units */
clk.sPCLKInput.ulCrtcPclkFreq.ulPixelClock = clk.sPCLKInput.ulCrtcPclkFreq.ulPixelClock =
cpu_to_le32(bp_params->target_pixel_clock / 10); cpu_to_le32(bp_params->target_pixel_clock_100hz / 100);
if (bp_params->flags.FORCE_PROGRAMMING_OF_PLL) { if (bp_params->flags.FORCE_PROGRAMMING_OF_PLL) {
clk.sPCLKInput.ucMiscInfo |= clk.sPCLKInput.ucMiscInfo |=
...@@ -1182,8 +1182,7 @@ static enum bp_result set_pixel_clock_v7( ...@@ -1182,8 +1182,7 @@ static enum bp_result set_pixel_clock_v7(
clk.ucTransmitterID = bp->cmd_helper->encoder_id_to_atom(dal_graphics_object_id_get_encoder_id(bp_params->encoder_object_id)); clk.ucTransmitterID = bp->cmd_helper->encoder_id_to_atom(dal_graphics_object_id_get_encoder_id(bp_params->encoder_object_id));
clk.ucEncoderMode = (uint8_t) bp->cmd_helper->encoder_mode_bp_to_atom(bp_params->signal_type, false); clk.ucEncoderMode = (uint8_t) bp->cmd_helper->encoder_mode_bp_to_atom(bp_params->signal_type, false);
/* We need to convert from KHz units into 10KHz units */ clk.ulPixelClock = cpu_to_le32(bp_params->target_pixel_clock_100hz);
clk.ulPixelClock = cpu_to_le32(bp_params->target_pixel_clock * 10);
clk.ucDeepColorRatio = (uint8_t) bp->cmd_helper->transmitter_color_depth_to_atom(bp_params->color_depth); clk.ucDeepColorRatio = (uint8_t) bp->cmd_helper->transmitter_color_depth_to_atom(bp_params->color_depth);
...@@ -2164,7 +2163,7 @@ static enum bp_result program_clock_v5( ...@@ -2164,7 +2163,7 @@ static enum bp_result program_clock_v5(
/* We need to convert from KHz units into 10KHz units */ /* We need to convert from KHz units into 10KHz units */
params.sPCLKInput.ucPpll = (uint8_t) atom_pll_id; params.sPCLKInput.ucPpll = (uint8_t) atom_pll_id;
params.sPCLKInput.usPixelClock = params.sPCLKInput.usPixelClock =
cpu_to_le16((uint16_t) (bp_params->target_pixel_clock / 10)); cpu_to_le16((uint16_t) (bp_params->target_pixel_clock_100hz / 100));
params.sPCLKInput.ucCRTC = (uint8_t) ATOM_CRTC_INVALID; params.sPCLKInput.ucCRTC = (uint8_t) ATOM_CRTC_INVALID;
if (bp_params->flags.SET_EXTERNAL_REF_DIV_SRC) if (bp_params->flags.SET_EXTERNAL_REF_DIV_SRC)
...@@ -2196,7 +2195,7 @@ static enum bp_result program_clock_v6( ...@@ -2196,7 +2195,7 @@ static enum bp_result program_clock_v6(
/* We need to convert from KHz units into 10KHz units */ /* We need to convert from KHz units into 10KHz units */
params.sPCLKInput.ucPpll = (uint8_t)atom_pll_id; params.sPCLKInput.ucPpll = (uint8_t)atom_pll_id;
params.sPCLKInput.ulDispEngClkFreq = params.sPCLKInput.ulDispEngClkFreq =
cpu_to_le32(bp_params->target_pixel_clock / 10); cpu_to_le32(bp_params->target_pixel_clock_100hz / 100);
if (bp_params->flags.SET_EXTERNAL_REF_DIV_SRC) if (bp_params->flags.SET_EXTERNAL_REF_DIV_SRC)
params.sPCLKInput.ucMiscInfo |= PIXEL_CLOCK_MISC_REF_DIV_SRC; params.sPCLKInput.ucMiscInfo |= PIXEL_CLOCK_MISC_REF_DIV_SRC;
......
...@@ -301,9 +301,7 @@ static enum bp_result set_pixel_clock_v7( ...@@ -301,9 +301,7 @@ static enum bp_result set_pixel_clock_v7(
cmd_helper->encoder_mode_bp_to_atom( cmd_helper->encoder_mode_bp_to_atom(
bp_params->signal_type, false); bp_params->signal_type, false);
/* We need to convert from KHz units into 10KHz units */ clk.pixclk_100hz = cpu_to_le32(bp_params->target_pixel_clock_100hz);
clk.pixclk_100hz = cpu_to_le32(bp_params->target_pixel_clock *
10);
clk.deep_color_ratio = clk.deep_color_ratio =
(uint8_t) bp->cmd_helper-> (uint8_t) bp->cmd_helper->
...@@ -311,7 +309,7 @@ static enum bp_result set_pixel_clock_v7( ...@@ -311,7 +309,7 @@ static enum bp_result set_pixel_clock_v7(
bp_params->color_depth); bp_params->color_depth);
DC_LOG_BIOS("%s:program display clock = %d"\ DC_LOG_BIOS("%s:program display clock = %d"\
"colorDepth = %d\n", __func__,\ "colorDepth = %d\n", __func__,\
bp_params->target_pixel_clock, bp_params->color_depth); bp_params->target_pixel_clock_100hz, bp_params->color_depth);
if (bp_params->flags.FORCE_PROGRAMMING_OF_PLL) if (bp_params->flags.FORCE_PROGRAMMING_OF_PLL)
clk.miscinfo |= PIXEL_CLOCK_V7_MISC_FORCE_PROG_PPLL; clk.miscinfo |= PIXEL_CLOCK_V7_MISC_FORCE_PROG_PPLL;
......
...@@ -2792,7 +2792,7 @@ static void populate_initial_data( ...@@ -2792,7 +2792,7 @@ static void populate_initial_data(
data->lpt_en[num_displays + 4] = false; data->lpt_en[num_displays + 4] = false;
data->h_total[num_displays + 4] = bw_int_to_fixed(pipe[i].stream->timing.h_total); data->h_total[num_displays + 4] = bw_int_to_fixed(pipe[i].stream->timing.h_total);
data->v_total[num_displays + 4] = bw_int_to_fixed(pipe[i].stream->timing.v_total); data->v_total[num_displays + 4] = bw_int_to_fixed(pipe[i].stream->timing.v_total);
data->pixel_rate[num_displays + 4] = bw_frc_to_fixed(pipe[i].stream->timing.pix_clk_khz, 1000); data->pixel_rate[num_displays + 4] = bw_frc_to_fixed(pipe[i].stream->timing.pix_clk_100hz, 10000);
data->src_width[num_displays + 4] = bw_int_to_fixed(pipe[i].plane_res.scl_data.viewport.width); data->src_width[num_displays + 4] = bw_int_to_fixed(pipe[i].plane_res.scl_data.viewport.width);
data->pitch_in_pixels[num_displays + 4] = data->src_width[num_displays + 4]; data->pitch_in_pixels[num_displays + 4] = data->src_width[num_displays + 4];
data->src_height[num_displays + 4] = bw_int_to_fixed(pipe[i].plane_res.scl_data.viewport.height); data->src_height[num_displays + 4] = bw_int_to_fixed(pipe[i].plane_res.scl_data.viewport.height);
...@@ -2881,7 +2881,7 @@ static void populate_initial_data( ...@@ -2881,7 +2881,7 @@ static void populate_initial_data(
/* Pipes without underlay after */ /* Pipes without underlay after */
for (i = 0; i < pipe_count; i++) { for (i = 0; i < pipe_count; i++) {
unsigned int pixel_clock_khz; unsigned int pixel_clock_100hz;
if (!pipe[i].stream || pipe[i].bottom_pipe) if (!pipe[i].stream || pipe[i].bottom_pipe)
continue; continue;
...@@ -2890,10 +2890,10 @@ static void populate_initial_data( ...@@ -2890,10 +2890,10 @@ static void populate_initial_data(
data->lpt_en[num_displays + 4] = false; data->lpt_en[num_displays + 4] = false;
data->h_total[num_displays + 4] = bw_int_to_fixed(pipe[i].stream->timing.h_total); data->h_total[num_displays + 4] = bw_int_to_fixed(pipe[i].stream->timing.h_total);
data->v_total[num_displays + 4] = bw_int_to_fixed(pipe[i].stream->timing.v_total); data->v_total[num_displays + 4] = bw_int_to_fixed(pipe[i].stream->timing.v_total);
pixel_clock_khz = pipe[i].stream->timing.pix_clk_khz; pixel_clock_100hz = pipe[i].stream->timing.pix_clk_100hz;
if (pipe[i].stream->timing.timing_3d_format == TIMING_3D_FORMAT_HW_FRAME_PACKING) if (pipe[i].stream->timing.timing_3d_format == TIMING_3D_FORMAT_HW_FRAME_PACKING)
pixel_clock_khz *= 2; pixel_clock_100hz *= 2;
data->pixel_rate[num_displays + 4] = bw_frc_to_fixed(pixel_clock_khz, 1000); data->pixel_rate[num_displays + 4] = bw_frc_to_fixed(pixel_clock_100hz, 10000);
if (pipe[i].plane_state) { if (pipe[i].plane_state) {
data->src_width[num_displays + 4] = bw_int_to_fixed(pipe[i].plane_res.scl_data.viewport.width); data->src_width[num_displays + 4] = bw_int_to_fixed(pipe[i].plane_res.scl_data.viewport.width);
data->pitch_in_pixels[num_displays + 4] = data->src_width[num_displays + 4]; data->pitch_in_pixels[num_displays + 4] = data->src_width[num_displays + 4];
......
...@@ -416,7 +416,7 @@ static void pipe_ctx_to_e2e_pipe_params ( ...@@ -416,7 +416,7 @@ static void pipe_ctx_to_e2e_pipe_params (
- pipe->stream->timing.v_addressable - pipe->stream->timing.v_addressable
- pipe->stream->timing.v_border_bottom - pipe->stream->timing.v_border_bottom
- pipe->stream->timing.v_border_top; - pipe->stream->timing.v_border_top;
input->dest.pixel_rate_mhz = pipe->stream->timing.pix_clk_khz/1000.0; input->dest.pixel_rate_mhz = pipe->stream->timing.pix_clk_100hz/10000.0;
input->dest.vstartup_start = pipe->pipe_dlg_param.vstartup_start; input->dest.vstartup_start = pipe->pipe_dlg_param.vstartup_start;
input->dest.vupdate_offset = pipe->pipe_dlg_param.vupdate_offset; input->dest.vupdate_offset = pipe->pipe_dlg_param.vupdate_offset;
input->dest.vupdate_offset = pipe->pipe_dlg_param.vupdate_offset; input->dest.vupdate_offset = pipe->pipe_dlg_param.vupdate_offset;
...@@ -663,9 +663,9 @@ static void hack_disable_optional_pipe_split(struct dcn_bw_internal_vars *v) ...@@ -663,9 +663,9 @@ static void hack_disable_optional_pipe_split(struct dcn_bw_internal_vars *v)
} }
static void hack_force_pipe_split(struct dcn_bw_internal_vars *v, static void hack_force_pipe_split(struct dcn_bw_internal_vars *v,
unsigned int pixel_rate_khz) unsigned int pixel_rate_100hz)
{ {
float pixel_rate_mhz = pixel_rate_khz / 1000; float pixel_rate_mhz = pixel_rate_100hz / 10000;
/* /*
* force enabling pipe split by lower dpp clock for DPM0 to just * force enabling pipe split by lower dpp clock for DPM0 to just
...@@ -688,7 +688,7 @@ static void hack_bounding_box(struct dcn_bw_internal_vars *v, ...@@ -688,7 +688,7 @@ static void hack_bounding_box(struct dcn_bw_internal_vars *v,
if (context->stream_count == 1 && if (context->stream_count == 1 &&
dbg->force_single_disp_pipe_split) dbg->force_single_disp_pipe_split)
hack_force_pipe_split(v, context->streams[0]->timing.pix_clk_khz); hack_force_pipe_split(v, context->streams[0]->timing.pix_clk_100hz);
} }
bool dcn_validate_bandwidth( bool dcn_validate_bandwidth(
...@@ -845,7 +845,7 @@ bool dcn_validate_bandwidth( ...@@ -845,7 +845,7 @@ bool dcn_validate_bandwidth(
v->v_sync_plus_back_porch[input_idx] = pipe->stream->timing.v_total v->v_sync_plus_back_porch[input_idx] = pipe->stream->timing.v_total
- v->vactive[input_idx] - v->vactive[input_idx]
- pipe->stream->timing.v_front_porch; - pipe->stream->timing.v_front_porch;
v->pixel_clock[input_idx] = pipe->stream->timing.pix_clk_khz/1000.0; v->pixel_clock[input_idx] = pipe->stream->timing.pix_clk_100hz/10000.0;
if (pipe->stream->timing.timing_3d_format == TIMING_3D_FORMAT_HW_FRAME_PACKING) if (pipe->stream->timing.timing_3d_format == TIMING_3D_FORMAT_HW_FRAME_PACKING)
v->pixel_clock[input_idx] *= 2; v->pixel_clock[input_idx] *= 2;
if (!pipe->plane_state) { if (!pipe->plane_state) {
......
...@@ -1079,7 +1079,7 @@ static enum dc_status dc_commit_state_no_check(struct dc *dc, struct dc_state *c ...@@ -1079,7 +1079,7 @@ static enum dc_status dc_commit_state_no_check(struct dc *dc, struct dc_state *c
context->streams[i]->timing.v_addressable, context->streams[i]->timing.v_addressable,
context->streams[i]->timing.h_total, context->streams[i]->timing.h_total,
context->streams[i]->timing.v_total, context->streams[i]->timing.v_total,
context->streams[i]->timing.pix_clk_khz); context->streams[i]->timing.pix_clk_100hz / 10);
} }
dc_enable_stereo(dc, context, dc_streams, context->stream_count); dc_enable_stereo(dc, context, dc_streams, context->stream_count);
......
...@@ -1934,7 +1934,7 @@ static void enable_link_hdmi(struct pipe_ctx *pipe_ctx) ...@@ -1934,7 +1934,7 @@ static void enable_link_hdmi(struct pipe_ctx *pipe_ctx)
&& (stream->timing.v_addressable == 480); && (stream->timing.v_addressable == 480);
if (stream->phy_pix_clk == 0) if (stream->phy_pix_clk == 0)
stream->phy_pix_clk = stream->timing.pix_clk_khz; stream->phy_pix_clk = stream->timing.pix_clk_100hz / 10;
if (stream->phy_pix_clk > 340000) if (stream->phy_pix_clk > 340000)
is_over_340mhz = true; is_over_340mhz = true;
...@@ -1988,7 +1988,7 @@ static void enable_link_lvds(struct pipe_ctx *pipe_ctx) ...@@ -1988,7 +1988,7 @@ static void enable_link_lvds(struct pipe_ctx *pipe_ctx)
struct dc_link *link = stream->link; struct dc_link *link = stream->link;
if (stream->phy_pix_clk == 0) if (stream->phy_pix_clk == 0)
stream->phy_pix_clk = stream->timing.pix_clk_khz; stream->phy_pix_clk = stream->timing.pix_clk_100hz / 10;
memset(&stream->link->cur_link_settings, 0, memset(&stream->link->cur_link_settings, 0,
sizeof(struct dc_link_settings)); sizeof(struct dc_link_settings));
...@@ -2063,7 +2063,7 @@ static bool dp_active_dongle_validate_timing( ...@@ -2063,7 +2063,7 @@ static bool dp_active_dongle_validate_timing(
const struct dc_crtc_timing *timing, const struct dc_crtc_timing *timing,
const struct dpcd_caps *dpcd_caps) const struct dpcd_caps *dpcd_caps)
{ {
unsigned int required_pix_clk = timing->pix_clk_khz; unsigned int required_pix_clk_100hz = timing->pix_clk_100hz;
const struct dc_dongle_caps *dongle_caps = &dpcd_caps->dongle_caps; const struct dc_dongle_caps *dongle_caps = &dpcd_caps->dongle_caps;
switch (dpcd_caps->dongle_type) { switch (dpcd_caps->dongle_type) {
...@@ -2103,9 +2103,9 @@ static bool dp_active_dongle_validate_timing( ...@@ -2103,9 +2103,9 @@ static bool dp_active_dongle_validate_timing(
/* Check Color Depth and Pixel Clock */ /* Check Color Depth and Pixel Clock */
if (timing->pixel_encoding == PIXEL_ENCODING_YCBCR420) if (timing->pixel_encoding == PIXEL_ENCODING_YCBCR420)
required_pix_clk /= 2; required_pix_clk_100hz /= 2;
else if (timing->pixel_encoding == PIXEL_ENCODING_YCBCR422) else if (timing->pixel_encoding == PIXEL_ENCODING_YCBCR422)
required_pix_clk = required_pix_clk * 2 / 3; required_pix_clk_100hz = required_pix_clk_100hz * 2 / 3;
switch (timing->display_color_depth) { switch (timing->display_color_depth) {
case COLOR_DEPTH_666: case COLOR_DEPTH_666:
...@@ -2115,12 +2115,12 @@ static bool dp_active_dongle_validate_timing( ...@@ -2115,12 +2115,12 @@ static bool dp_active_dongle_validate_timing(
case COLOR_DEPTH_101010: case COLOR_DEPTH_101010:
if (dongle_caps->dp_hdmi_max_bpc < 10) if (dongle_caps->dp_hdmi_max_bpc < 10)
return false; return false;
required_pix_clk = required_pix_clk * 10 / 8; required_pix_clk_100hz = required_pix_clk_100hz * 10 / 8;
break; break;
case COLOR_DEPTH_121212: case COLOR_DEPTH_121212:
if (dongle_caps->dp_hdmi_max_bpc < 12) if (dongle_caps->dp_hdmi_max_bpc < 12)
return false; return false;
required_pix_clk = required_pix_clk * 12 / 8; required_pix_clk_100hz = required_pix_clk_100hz * 12 / 8;
break; break;
case COLOR_DEPTH_141414: case COLOR_DEPTH_141414:
...@@ -2130,7 +2130,7 @@ static bool dp_active_dongle_validate_timing( ...@@ -2130,7 +2130,7 @@ static bool dp_active_dongle_validate_timing(
return false; return false;
} }
if (required_pix_clk > dongle_caps->dp_hdmi_max_pixel_clk) if (required_pix_clk_100hz > (dongle_caps->dp_hdmi_max_pixel_clk * 10))
return false; return false;
return true; return true;
...@@ -2141,7 +2141,7 @@ enum dc_status dc_link_validate_mode_timing( ...@@ -2141,7 +2141,7 @@ enum dc_status dc_link_validate_mode_timing(
struct dc_link *link, struct dc_link *link,
const struct dc_crtc_timing *timing) const struct dc_crtc_timing *timing)
{ {
uint32_t max_pix_clk = stream->link->dongle_max_pix_clk; uint32_t max_pix_clk = stream->link->dongle_max_pix_clk * 10;
struct dpcd_caps *dpcd_caps = &link->dpcd_caps; struct dpcd_caps *dpcd_caps = &link->dpcd_caps;
/* A hack to avoid failing any modes for EDID override feature on /* A hack to avoid failing any modes for EDID override feature on
...@@ -2151,7 +2151,7 @@ enum dc_status dc_link_validate_mode_timing( ...@@ -2151,7 +2151,7 @@ enum dc_status dc_link_validate_mode_timing(
return DC_OK; return DC_OK;
/* Passive Dongle */ /* Passive Dongle */
if (0 != max_pix_clk && timing->pix_clk_khz > max_pix_clk) if (0 != max_pix_clk && timing->pix_clk_100hz > max_pix_clk)
return DC_EXCEED_DONGLE_CAP; return DC_EXCEED_DONGLE_CAP;
/* Active Dongle*/ /* Active Dongle*/
...@@ -2301,7 +2301,7 @@ static struct fixed31_32 get_pbn_from_timing(struct pipe_ctx *pipe_ctx) ...@@ -2301,7 +2301,7 @@ static struct fixed31_32 get_pbn_from_timing(struct pipe_ctx *pipe_ctx)
uint32_t denominator; uint32_t denominator;
bpc = get_color_depth(pipe_ctx->stream_res.pix_clk_params.color_depth); bpc = get_color_depth(pipe_ctx->stream_res.pix_clk_params.color_depth);
kbps = pipe_ctx->stream_res.pix_clk_params.requested_pix_clk * bpc * 3; kbps = pipe_ctx->stream_res.pix_clk_params.requested_pix_clk_100hz / 10 * bpc * 3;
/* /*
* margin 5300ppm + 300ppm ~ 0.6% as per spec, factor is 1.006 * margin 5300ppm + 300ppm ~ 0.6% as per spec, factor is 1.006
......
...@@ -1542,7 +1542,7 @@ static uint32_t bandwidth_in_kbps_from_timing( ...@@ -1542,7 +1542,7 @@ static uint32_t bandwidth_in_kbps_from_timing(
ASSERT(bits_per_channel != 0); ASSERT(bits_per_channel != 0);
kbps = timing->pix_clk_khz; kbps = timing->pix_clk_100hz / 10;
kbps *= bits_per_channel; kbps *= bits_per_channel;
if (timing->flags.Y_ONLY != 1) { if (timing->flags.Y_ONLY != 1) {
...@@ -1584,7 +1584,7 @@ bool dp_validate_mode_timing( ...@@ -1584,7 +1584,7 @@ bool dp_validate_mode_timing(
const struct dc_link_settings *link_setting; const struct dc_link_settings *link_setting;
/*always DP fail safe mode*/ /*always DP fail safe mode*/
if (timing->pix_clk_khz == (uint32_t) 25175 && if ((timing->pix_clk_100hz / 10) == (uint32_t) 25175 &&
timing->h_addressable == (uint32_t) 640 && timing->h_addressable == (uint32_t) 640 &&
timing->v_addressable == (uint32_t) 480) timing->v_addressable == (uint32_t) 480)
return true; return true;
......
...@@ -74,8 +74,8 @@ void dp_enable_link_phy( ...@@ -74,8 +74,8 @@ void dp_enable_link_phy(
if (pipes[i].clock_source != NULL && if (pipes[i].clock_source != NULL &&
pipes[i].clock_source->id != CLOCK_SOURCE_ID_DP_DTO) { pipes[i].clock_source->id != CLOCK_SOURCE_ID_DP_DTO) {
pipes[i].clock_source = dp_cs; pipes[i].clock_source = dp_cs;
pipes[i].stream_res.pix_clk_params.requested_pix_clk = pipes[i].stream_res.pix_clk_params.requested_pix_clk_100hz =
pipes[i].stream->timing.pix_clk_khz; pipes[i].stream->timing.pix_clk_100hz;
pipes[i].clock_source->funcs->program_pix_clk( pipes[i].clock_source->funcs->program_pix_clk(
pipes[i].clock_source, pipes[i].clock_source,
&pipes[i].stream_res.pix_clk_params, &pipes[i].stream_res.pix_clk_params,
......
...@@ -355,8 +355,8 @@ bool resource_are_streams_timing_synchronizable( ...@@ -355,8 +355,8 @@ bool resource_are_streams_timing_synchronizable(
!= stream2->timing.v_addressable) != stream2->timing.v_addressable)
return false; return false;
if (stream1->timing.pix_clk_khz if (stream1->timing.pix_clk_100hz
!= stream2->timing.pix_clk_khz) != stream2->timing.pix_clk_100hz)
return false; return false;
if (stream1->clamping.c_depth != stream2->clamping.c_depth) if (stream1->clamping.c_depth != stream2->clamping.c_depth)
...@@ -1759,7 +1759,7 @@ static struct dc_stream_state *find_pll_sharable_stream( ...@@ -1759,7 +1759,7 @@ static struct dc_stream_state *find_pll_sharable_stream(
static int get_norm_pix_clk(const struct dc_crtc_timing *timing) static int get_norm_pix_clk(const struct dc_crtc_timing *timing)
{ {
uint32_t pix_clk = timing->pix_clk_khz; uint32_t pix_clk = timing->pix_clk_100hz;
uint32_t normalized_pix_clk = pix_clk; uint32_t normalized_pix_clk = pix_clk;
if (timing->pixel_encoding == PIXEL_ENCODING_YCBCR420) if (timing->pixel_encoding == PIXEL_ENCODING_YCBCR420)
...@@ -1791,10 +1791,10 @@ static void calculate_phy_pix_clks(struct dc_stream_state *stream) ...@@ -1791,10 +1791,10 @@ static void calculate_phy_pix_clks(struct dc_stream_state *stream)
/* update actual pixel clock on all streams */ /* update actual pixel clock on all streams */
if (dc_is_hdmi_signal(stream->signal)) if (dc_is_hdmi_signal(stream->signal))
stream->phy_pix_clk = get_norm_pix_clk( stream->phy_pix_clk = get_norm_pix_clk(
&stream->timing); &stream->timing) / 10;
else else
stream->phy_pix_clk = stream->phy_pix_clk =
stream->timing.pix_clk_khz; stream->timing.pix_clk_100hz / 10;
if (stream->timing.timing_3d_format == TIMING_3D_FORMAT_HW_FRAME_PACKING) if (stream->timing.timing_3d_format == TIMING_3D_FORMAT_HW_FRAME_PACKING)
stream->phy_pix_clk *= 2; stream->phy_pix_clk *= 2;
......
...@@ -44,7 +44,7 @@ void update_stream_signal(struct dc_stream_state *stream, struct dc_sink *sink) ...@@ -44,7 +44,7 @@ void update_stream_signal(struct dc_stream_state *stream, struct dc_sink *sink)
if (dc_is_dvi_signal(stream->signal)) { if (dc_is_dvi_signal(stream->signal)) {
if (stream->ctx->dc->caps.dual_link_dvi && if (stream->ctx->dc->caps.dual_link_dvi &&
stream->timing.pix_clk_khz > TMDS_MAX_PIXEL_CLOCK && (stream->timing.pix_clk_100hz / 10) > TMDS_MAX_PIXEL_CLOCK &&
sink->sink_signal != SIGNAL_TYPE_DVI_SINGLE_LINK) sink->sink_signal != SIGNAL_TYPE_DVI_SINGLE_LINK)
stream->signal = SIGNAL_TYPE_DVI_DUAL_LINK; stream->signal = SIGNAL_TYPE_DVI_DUAL_LINK;
else else
...@@ -339,7 +339,7 @@ void dc_stream_log(const struct dc *dc, const struct dc_stream_state *stream) ...@@ -339,7 +339,7 @@ void dc_stream_log(const struct dc *dc, const struct dc_stream_state *stream)
stream->output_color_space); stream->output_color_space);
DC_LOG_DC( DC_LOG_DC(
"\tpix_clk_khz: %d, h_total: %d, v_total: %d, pixelencoder:%d, displaycolorDepth:%d\n", "\tpix_clk_khz: %d, h_total: %d, v_total: %d, pixelencoder:%d, displaycolorDepth:%d\n",
stream->timing.pix_clk_khz, stream->timing.pix_clk_100hz / 10,
stream->timing.h_total, stream->timing.h_total,
stream->timing.v_total, stream->timing.v_total,
stream->timing.pixel_encoding, stream->timing.pixel_encoding,
......
...@@ -730,7 +730,7 @@ struct dc_crtc_timing { ...@@ -730,7 +730,7 @@ struct dc_crtc_timing {
uint32_t v_front_porch; uint32_t v_front_porch;
uint32_t v_sync_width; uint32_t v_sync_width;
uint32_t pix_clk_khz; uint32_t pix_clk_100hz;
uint32_t vic; uint32_t vic;
uint32_t hdmi_vic; uint32_t hdmi_vic;
......
...@@ -194,8 +194,8 @@ static uint32_t get_max_pixel_clock_for_all_paths(struct dc_state *context) ...@@ -194,8 +194,8 @@ static uint32_t get_max_pixel_clock_for_all_paths(struct dc_state *context)
if (pipe_ctx->top_pipe) if (pipe_ctx->top_pipe)
continue; continue;
if (pipe_ctx->stream_res.pix_clk_params.requested_pix_clk > max_pix_clk) if (pipe_ctx->stream_res.pix_clk_params.requested_pix_clk_100hz / 10 > max_pix_clk)
max_pix_clk = pipe_ctx->stream_res.pix_clk_params.requested_pix_clk; max_pix_clk = pipe_ctx->stream_res.pix_clk_params.requested_pix_clk_100hz / 10;
/* raise clock state for HBR3/2 if required. Confirmed with HW DCE/DPCS /* raise clock state for HBR3/2 if required. Confirmed with HW DCE/DPCS
* logic for HBR3 still needs Nominal (0.8V) on VDDC rail * logic for HBR3 still needs Nominal (0.8V) on VDDC rail
...@@ -257,7 +257,7 @@ static int dce_set_clock( ...@@ -257,7 +257,7 @@ static int dce_set_clock(
clk_mgr_dce->dentist_vco_freq_khz / 64); clk_mgr_dce->dentist_vco_freq_khz / 64);
/* Prepare to program display clock*/ /* Prepare to program display clock*/
pxl_clk_params.target_pixel_clock = requested_clk_khz; pxl_clk_params.target_pixel_clock_100hz = requested_clk_khz * 10;
pxl_clk_params.pll_id = CLOCK_SOURCE_ID_DFS; pxl_clk_params.pll_id = CLOCK_SOURCE_ID_DFS;
if (clk_mgr_dce->dfs_bypass_active) if (clk_mgr_dce->dfs_bypass_active)
...@@ -494,7 +494,7 @@ void dce110_fill_display_configs( ...@@ -494,7 +494,7 @@ void dce110_fill_display_configs(
stream->link->cur_link_settings.link_spread; stream->link->cur_link_settings.link_spread;
cfg->sym_clock = stream->phy_pix_clk; cfg->sym_clock = stream->phy_pix_clk;
/* Round v_refresh*/ /* Round v_refresh*/
cfg->v_refresh = stream->timing.pix_clk_khz * 1000; cfg->v_refresh = stream->timing.pix_clk_100hz * 100;
cfg->v_refresh /= stream->timing.h_total; cfg->v_refresh /= stream->timing.h_total;
cfg->v_refresh = (cfg->v_refresh + stream->timing.v_total / 2) cfg->v_refresh = (cfg->v_refresh + stream->timing.v_total / 2)
/ stream->timing.v_total; / stream->timing.v_total;
...@@ -518,7 +518,7 @@ static uint32_t dce110_get_min_vblank_time_us(const struct dc_state *context) ...@@ -518,7 +518,7 @@ static uint32_t dce110_get_min_vblank_time_us(const struct dc_state *context)
- stream->timing.v_addressable); - stream->timing.v_addressable);
vertical_blank_time = vertical_blank_in_pixels vertical_blank_time = vertical_blank_in_pixels
* 1000 / stream->timing.pix_clk_khz; * 10000 / stream->timing.pix_clk_100hz;
if (min_vertical_blank_time > vertical_blank_time) if (min_vertical_blank_time > vertical_blank_time)
min_vertical_blank_time = vertical_blank_time; min_vertical_blank_time = vertical_blank_time;
...@@ -612,7 +612,7 @@ static void dce11_pplib_apply_display_requirements( ...@@ -612,7 +612,7 @@ static void dce11_pplib_apply_display_requirements(
pp_display_cfg->crtc_index = pp_display_cfg->crtc_index =
pp_display_cfg->disp_configs[0].pipe_idx; pp_display_cfg->disp_configs[0].pipe_idx;
pp_display_cfg->line_time_in_us = timing->h_total * 1000 / timing->pix_clk_khz; pp_display_cfg->line_time_in_us = timing->h_total * 10000 / timing->pix_clk_100hz;
} }
if (memcmp(&dc->current_state->pp_display_cfg, pp_display_cfg, sizeof(*pp_display_cfg)) != 0) if (memcmp(&dc->current_state->pp_display_cfg, pp_display_cfg, sizeof(*pp_display_cfg)) != 0)
......
...@@ -599,12 +599,12 @@ bool dce110_link_encoder_validate_dvi_output( ...@@ -599,12 +599,12 @@ bool dce110_link_encoder_validate_dvi_output(
if ((connector_signal == SIGNAL_TYPE_DVI_SINGLE_LINK || if ((connector_signal == SIGNAL_TYPE_DVI_SINGLE_LINK ||
connector_signal == SIGNAL_TYPE_HDMI_TYPE_A) && connector_signal == SIGNAL_TYPE_HDMI_TYPE_A) &&
signal != SIGNAL_TYPE_HDMI_TYPE_A && signal != SIGNAL_TYPE_HDMI_TYPE_A &&
crtc_timing->pix_clk_khz > TMDS_MAX_PIXEL_CLOCK) crtc_timing->pix_clk_100hz > (TMDS_MAX_PIXEL_CLOCK * 10))
return false; return false;
if (crtc_timing->pix_clk_khz < TMDS_MIN_PIXEL_CLOCK) if (crtc_timing->pix_clk_100hz < (TMDS_MIN_PIXEL_CLOCK * 10))
return false; return false;
if (crtc_timing->pix_clk_khz > max_pixel_clock) if (crtc_timing->pix_clk_100hz > (max_pixel_clock * 10))
return false; return false;
/* DVI supports 6/8bpp single-link and 10/16bpp dual-link */ /* DVI supports 6/8bpp single-link and 10/16bpp dual-link */
......
...@@ -662,7 +662,7 @@ static void dce110_stream_encoder_dvi_set_stream_attribute( ...@@ -662,7 +662,7 @@ static void dce110_stream_encoder_dvi_set_stream_attribute(
cntl.signal = is_dual_link ? cntl.signal = is_dual_link ?
SIGNAL_TYPE_DVI_DUAL_LINK : SIGNAL_TYPE_DVI_SINGLE_LINK; SIGNAL_TYPE_DVI_DUAL_LINK : SIGNAL_TYPE_DVI_SINGLE_LINK;
cntl.enable_dp_audio = false; cntl.enable_dp_audio = false;
cntl.pixel_clock = crtc_timing->pix_clk_khz; cntl.pixel_clock = crtc_timing->pix_clk_100hz / 10;
cntl.lanes_number = (is_dual_link) ? LANE_COUNT_EIGHT : LANE_COUNT_FOUR; cntl.lanes_number = (is_dual_link) ? LANE_COUNT_EIGHT : LANE_COUNT_FOUR;
if (enc110->base.bp->funcs->encoder_control( if (enc110->base.bp->funcs->encoder_control(
...@@ -686,7 +686,7 @@ static void dce110_stream_encoder_lvds_set_stream_attribute( ...@@ -686,7 +686,7 @@ static void dce110_stream_encoder_lvds_set_stream_attribute(
cntl.engine_id = enc110->base.id; cntl.engine_id = enc110->base.id;
cntl.signal = SIGNAL_TYPE_LVDS; cntl.signal = SIGNAL_TYPE_LVDS;
cntl.enable_dp_audio = false; cntl.enable_dp_audio = false;
cntl.pixel_clock = crtc_timing->pix_clk_khz; cntl.pixel_clock = crtc_timing->pix_clk_100hz / 10;
cntl.lanes_number = LANE_COUNT_FOUR; cntl.lanes_number = LANE_COUNT_FOUR;
if (enc110->base.bp->funcs->encoder_control( if (enc110->base.bp->funcs->encoder_control(
......
...@@ -1074,7 +1074,7 @@ void dce110_unblank_stream(struct pipe_ctx *pipe_ctx, ...@@ -1074,7 +1074,7 @@ void dce110_unblank_stream(struct pipe_ctx *pipe_ctx,
/* only 3 items below are used by unblank */ /* only 3 items below are used by unblank */
params.pixel_clk_khz = params.pixel_clk_khz =
pipe_ctx->stream->timing.pix_clk_khz; pipe_ctx->stream->timing.pix_clk_100hz / 10;
params.link_settings.link_rate = link_settings->link_rate; params.link_settings.link_rate = link_settings->link_rate;
if (dc_is_dp_signal(pipe_ctx->stream->signal)) if (dc_is_dp_signal(pipe_ctx->stream->signal))
...@@ -1160,27 +1160,27 @@ static void build_audio_output( ...@@ -1160,27 +1160,27 @@ static void build_audio_output(
stream->timing.flags.INTERLACE; stream->timing.flags.INTERLACE;
audio_output->crtc_info.refresh_rate = audio_output->crtc_info.refresh_rate =
(stream->timing.pix_clk_khz*1000)/ (stream->timing.pix_clk_100hz*10000)/
(stream->timing.h_total*stream->timing.v_total); (stream->timing.h_total*stream->timing.v_total);
audio_output->crtc_info.color_depth = audio_output->crtc_info.color_depth =
stream->timing.display_color_depth; stream->timing.display_color_depth;
audio_output->crtc_info.requested_pixel_clock = audio_output->crtc_info.requested_pixel_clock =
pipe_ctx->stream_res.pix_clk_params.requested_pix_clk; pipe_ctx->stream_res.pix_clk_params.requested_pix_clk_100hz / 10;
audio_output->crtc_info.calculated_pixel_clock = audio_output->crtc_info.calculated_pixel_clock =
pipe_ctx->stream_res.pix_clk_params.requested_pix_clk; pipe_ctx->stream_res.pix_clk_params.requested_pix_clk_100hz / 10;
/*for HDMI, audio ACR is with deep color ratio factor*/ /*for HDMI, audio ACR is with deep color ratio factor*/
if (dc_is_hdmi_signal(pipe_ctx->stream->signal) && if (dc_is_hdmi_signal(pipe_ctx->stream->signal) &&
audio_output->crtc_info.requested_pixel_clock == audio_output->crtc_info.requested_pixel_clock ==
stream->timing.pix_clk_khz) { (stream->timing.pix_clk_100hz / 10)) {
if (pipe_ctx->stream_res.pix_clk_params.pixel_encoding == PIXEL_ENCODING_YCBCR420) { if (pipe_ctx->stream_res.pix_clk_params.pixel_encoding == PIXEL_ENCODING_YCBCR420) {
audio_output->crtc_info.requested_pixel_clock = audio_output->crtc_info.requested_pixel_clock =
audio_output->crtc_info.requested_pixel_clock/2; audio_output->crtc_info.requested_pixel_clock/2;
audio_output->crtc_info.calculated_pixel_clock = audio_output->crtc_info.calculated_pixel_clock =
pipe_ctx->stream_res.pix_clk_params.requested_pix_clk/2; pipe_ctx->stream_res.pix_clk_params.requested_pix_clk_100hz/20;
} }
} }
...@@ -1621,8 +1621,8 @@ static uint32_t compute_pstate_blackout_duration( ...@@ -1621,8 +1621,8 @@ static uint32_t compute_pstate_blackout_duration(
pstate_blackout_duration_ns = 1000 * blackout_duration.value >> 24; pstate_blackout_duration_ns = 1000 * blackout_duration.value >> 24;
total_dest_line_time_ns = 1000000UL * total_dest_line_time_ns = 1000000UL *
stream->timing.h_total / (stream->timing.h_total * 10) /
stream->timing.pix_clk_khz + stream->timing.pix_clk_100hz +
pstate_blackout_duration_ns; pstate_blackout_duration_ns;
return total_dest_line_time_ns; return total_dest_line_time_ns;
...@@ -2567,7 +2567,7 @@ static void dce110_apply_ctx_for_surface( ...@@ -2567,7 +2567,7 @@ static void dce110_apply_ctx_for_surface(
pipe_ctx->plane_res.mi, pipe_ctx->plane_res.mi,
pipe_ctx->stream->timing.h_total, pipe_ctx->stream->timing.h_total,
pipe_ctx->stream->timing.v_total, pipe_ctx->stream->timing.v_total,
pipe_ctx->stream->timing.pix_clk_khz, pipe_ctx->stream->timing.pix_clk_100hz / 10,
context->stream_count); context->stream_count);
dce110_program_front_end_for_pipe(dc, pipe_ctx); dce110_program_front_end_for_pipe(dc, pipe_ctx);
...@@ -2622,7 +2622,7 @@ void dce110_set_cursor_position(struct pipe_ctx *pipe_ctx) ...@@ -2622,7 +2622,7 @@ void dce110_set_cursor_position(struct pipe_ctx *pipe_ctx)
struct input_pixel_processor *ipp = pipe_ctx->plane_res.ipp; struct input_pixel_processor *ipp = pipe_ctx->plane_res.ipp;
struct mem_input *mi = pipe_ctx->plane_res.mi; struct mem_input *mi = pipe_ctx->plane_res.mi;
struct dc_cursor_mi_param param = { struct dc_cursor_mi_param param = {
.pixel_clk_khz = pipe_ctx->stream->timing.pix_clk_khz, .pixel_clk_khz = pipe_ctx->stream->timing.pix_clk_100hz / 10,
.ref_clk_khz = pipe_ctx->stream->ctx->dc->res_pool->ref_clock_inKhz, .ref_clk_khz = pipe_ctx->stream->ctx->dc->res_pool->ref_clock_inKhz,
.viewport = pipe_ctx->plane_res.scl_data.viewport, .viewport = pipe_ctx->plane_res.scl_data.viewport,
.h_scale_ratio = pipe_ctx->plane_res.scl_data.ratios.horz, .h_scale_ratio = pipe_ctx->plane_res.scl_data.ratios.horz,
......
...@@ -779,7 +779,7 @@ static void get_pixel_clock_parameters( ...@@ -779,7 +779,7 @@ static void get_pixel_clock_parameters(
* the pixel clock normalization for hdmi up to here instead of doing it * the pixel clock normalization for hdmi up to here instead of doing it
* in pll_adjust_pix_clk * in pll_adjust_pix_clk
*/ */
pixel_clk_params->requested_pix_clk = stream->timing.pix_clk_khz; pixel_clk_params->requested_pix_clk_100hz = stream->timing.pix_clk_100hz;
pixel_clk_params->encoder_object_id = stream->link->link_enc->id; pixel_clk_params->encoder_object_id = stream->link->link_enc->id;
pixel_clk_params->signal_type = pipe_ctx->stream->signal; pixel_clk_params->signal_type = pipe_ctx->stream->signal;
pixel_clk_params->controller_id = pipe_ctx->stream_res.tg->inst + 1; pixel_clk_params->controller_id = pipe_ctx->stream_res.tg->inst + 1;
...@@ -797,10 +797,10 @@ static void get_pixel_clock_parameters( ...@@ -797,10 +797,10 @@ static void get_pixel_clock_parameters(
pixel_clk_params->color_depth = COLOR_DEPTH_888; pixel_clk_params->color_depth = COLOR_DEPTH_888;
} }
if (stream->timing.pixel_encoding == PIXEL_ENCODING_YCBCR420) { if (stream->timing.pixel_encoding == PIXEL_ENCODING_YCBCR420) {
pixel_clk_params->requested_pix_clk = pixel_clk_params->requested_pix_clk / 2; pixel_clk_params->requested_pix_clk_100hz = pixel_clk_params->requested_pix_clk_100hz / 2;
} }
if (stream->timing.timing_3d_format == TIMING_3D_FORMAT_HW_FRAME_PACKING) if (stream->timing.timing_3d_format == TIMING_3D_FORMAT_HW_FRAME_PACKING)
pixel_clk_params->requested_pix_clk *= 2; pixel_clk_params->requested_pix_clk_100hz *= 2;
} }
...@@ -874,7 +874,7 @@ static bool dce110_validate_bandwidth( ...@@ -874,7 +874,7 @@ static bool dce110_validate_bandwidth(
__func__, __func__,
context->streams[0]->timing.h_addressable, context->streams[0]->timing.h_addressable,
context->streams[0]->timing.v_addressable, context->streams[0]->timing.v_addressable,
context->streams[0]->timing.pix_clk_khz); context->streams[0]->timing.pix_clk_100hz / 10);
if (memcmp(&dc->current_state->bw.dce, if (memcmp(&dc->current_state->bw.dce,
&context->bw.dce, sizeof(context->bw.dce))) { &context->bw.dce, sizeof(context->bw.dce))) {
...@@ -1055,7 +1055,7 @@ static struct pipe_ctx *dce110_acquire_underlay( ...@@ -1055,7 +1055,7 @@ static struct pipe_ctx *dce110_acquire_underlay(
pipe_ctx->plane_res.mi->funcs->allocate_mem_input(pipe_ctx->plane_res.mi, pipe_ctx->plane_res.mi->funcs->allocate_mem_input(pipe_ctx->plane_res.mi,
stream->timing.h_total, stream->timing.h_total,
stream->timing.v_total, stream->timing.v_total,
stream->timing.pix_clk_khz, stream->timing.pix_clk_100hz / 10,
context->stream_count); context->stream_count);
color_space_to_black_color(dc, color_space_to_black_color(dc,
......
...@@ -84,17 +84,17 @@ static const struct dce110_timing_generator_offsets reg_offsets[] = { ...@@ -84,17 +84,17 @@ static const struct dce110_timing_generator_offsets reg_offsets[] = {
#define DCP_REG(reg) (reg + tg110->offsets.dcp) #define DCP_REG(reg) (reg + tg110->offsets.dcp)
#define DMIF_REG(reg) (reg + tg110->offsets.dmif) #define DMIF_REG(reg) (reg + tg110->offsets.dmif)
static void program_pix_dur(struct timing_generator *tg, uint32_t pix_clk_khz) static void program_pix_dur(struct timing_generator *tg, uint32_t pix_clk_100hz)
{ {
uint64_t pix_dur; uint64_t pix_dur;
uint32_t addr = mmDMIF_PG0_DPG_PIPE_ARBITRATION_CONTROL1 uint32_t addr = mmDMIF_PG0_DPG_PIPE_ARBITRATION_CONTROL1
+ DCE110TG_FROM_TG(tg)->offsets.dmif; + DCE110TG_FROM_TG(tg)->offsets.dmif;
uint32_t value = dm_read_reg(tg->ctx, addr); uint32_t value = dm_read_reg(tg->ctx, addr);
if (pix_clk_khz == 0) if (pix_clk_100hz == 0)
return; return;
pix_dur = 1000000000 / pix_clk_khz; pix_dur = 10000000000ull / pix_clk_100hz;
set_reg_field_value( set_reg_field_value(
value, value,
...@@ -110,7 +110,7 @@ static void program_timing(struct timing_generator *tg, ...@@ -110,7 +110,7 @@ static void program_timing(struct timing_generator *tg,
bool use_vbios) bool use_vbios)
{ {
if (!use_vbios) if (!use_vbios)
program_pix_dur(tg, timing->pix_clk_khz); program_pix_dur(tg, timing->pix_clk_100hz);
dce110_tg_program_timing(tg, timing, use_vbios); dce110_tg_program_timing(tg, timing, use_vbios);
} }
......
...@@ -2655,7 +2655,7 @@ static void dcn10_set_cursor_position(struct pipe_ctx *pipe_ctx) ...@@ -2655,7 +2655,7 @@ static void dcn10_set_cursor_position(struct pipe_ctx *pipe_ctx)
struct hubp *hubp = pipe_ctx->plane_res.hubp; struct hubp *hubp = pipe_ctx->plane_res.hubp;
struct dpp *dpp = pipe_ctx->plane_res.dpp; struct dpp *dpp = pipe_ctx->plane_res.dpp;
struct dc_cursor_mi_param param = { struct dc_cursor_mi_param param = {
.pixel_clk_khz = pipe_ctx->stream->timing.pix_clk_khz, .pixel_clk_khz = pipe_ctx->stream->timing.pix_clk_100hz / 10,
.ref_clk_khz = pipe_ctx->stream->ctx->dc->res_pool->ref_clock_inKhz, .ref_clk_khz = pipe_ctx->stream->ctx->dc->res_pool->ref_clock_inKhz,
.viewport = pipe_ctx->plane_res.scl_data.viewport, .viewport = pipe_ctx->plane_res.scl_data.viewport,
.h_scale_ratio = pipe_ctx->plane_res.scl_data.ratios.horz, .h_scale_ratio = pipe_ctx->plane_res.scl_data.ratios.horz,
......
...@@ -429,7 +429,7 @@ static unsigned int dcn10_get_otg_states(struct dc *dc, char *pBuf, unsigned int ...@@ -429,7 +429,7 @@ static unsigned int dcn10_get_otg_states(struct dc *dc, char *pBuf, unsigned int
int pix_clk = 0; int pix_clk = 0;
optc1_read_otg_state(DCN10TG_FROM_TG(tg), &s); optc1_read_otg_state(DCN10TG_FROM_TG(tg), &s);
pix_clk = dc->current_state->res_ctx.pipe_ctx[i].stream_res.pix_clk_params.requested_pix_clk; pix_clk = dc->current_state->res_ctx.pipe_ctx[i].stream_res.pix_clk_params.requested_pix_clk_100hz / 10;
//only print if OTG master is enabled //only print if OTG master is enabled
if (s.otg_enabled & 1) { if (s.otg_enabled & 1) {
......
...@@ -543,12 +543,12 @@ bool dcn10_link_encoder_validate_dvi_output( ...@@ -543,12 +543,12 @@ bool dcn10_link_encoder_validate_dvi_output(
if ((connector_signal == SIGNAL_TYPE_DVI_SINGLE_LINK || if ((connector_signal == SIGNAL_TYPE_DVI_SINGLE_LINK ||
connector_signal == SIGNAL_TYPE_HDMI_TYPE_A) && connector_signal == SIGNAL_TYPE_HDMI_TYPE_A) &&
signal != SIGNAL_TYPE_HDMI_TYPE_A && signal != SIGNAL_TYPE_HDMI_TYPE_A &&
crtc_timing->pix_clk_khz > TMDS_MAX_PIXEL_CLOCK) crtc_timing->pix_clk_100hz > (TMDS_MAX_PIXEL_CLOCK * 10))
return false; return false;
if (crtc_timing->pix_clk_khz < TMDS_MIN_PIXEL_CLOCK) if (crtc_timing->pix_clk_100hz < (TMDS_MIN_PIXEL_CLOCK * 10))
return false; return false;
if (crtc_timing->pix_clk_khz > max_pixel_clock) if (crtc_timing->pix_clk_100hz > (max_pixel_clock * 10))
return false; return false;
/* DVI supports 6/8bpp single-link and 10/16bpp dual-link */ /* DVI supports 6/8bpp single-link and 10/16bpp dual-link */
...@@ -571,7 +571,7 @@ bool dcn10_link_encoder_validate_dvi_output( ...@@ -571,7 +571,7 @@ bool dcn10_link_encoder_validate_dvi_output(
static bool dcn10_link_encoder_validate_hdmi_output( static bool dcn10_link_encoder_validate_hdmi_output(
const struct dcn10_link_encoder *enc10, const struct dcn10_link_encoder *enc10,
const struct dc_crtc_timing *crtc_timing, const struct dc_crtc_timing *crtc_timing,
int adjusted_pix_clk_khz) int adjusted_pix_clk_100hz)
{ {
enum dc_color_depth max_deep_color = enum dc_color_depth max_deep_color =
enc10->base.features.max_hdmi_deep_color; enc10->base.features.max_hdmi_deep_color;
...@@ -581,11 +581,11 @@ static bool dcn10_link_encoder_validate_hdmi_output( ...@@ -581,11 +581,11 @@ static bool dcn10_link_encoder_validate_hdmi_output(
if (crtc_timing->display_color_depth < COLOR_DEPTH_888) if (crtc_timing->display_color_depth < COLOR_DEPTH_888)
return false; return false;
if (adjusted_pix_clk_khz < TMDS_MIN_PIXEL_CLOCK) if (adjusted_pix_clk_100hz < (TMDS_MIN_PIXEL_CLOCK * 10))
return false; return false;
if ((adjusted_pix_clk_khz == 0) || if ((adjusted_pix_clk_100hz == 0) ||
(adjusted_pix_clk_khz > enc10->base.features.max_hdmi_pixel_clock)) (adjusted_pix_clk_100hz > (enc10->base.features.max_hdmi_pixel_clock * 10)))
return false; return false;
/* DCE11 HW does not support 420 */ /* DCE11 HW does not support 420 */
...@@ -594,7 +594,7 @@ static bool dcn10_link_encoder_validate_hdmi_output( ...@@ -594,7 +594,7 @@ static bool dcn10_link_encoder_validate_hdmi_output(
return false; return false;
if (!enc10->base.features.flags.bits.HDMI_6GB_EN && if (!enc10->base.features.flags.bits.HDMI_6GB_EN &&
adjusted_pix_clk_khz >= 300000) adjusted_pix_clk_100hz >= 3000000)
return false; return false;
if (enc10->base.ctx->dc->debug.hdmi20_disable && if (enc10->base.ctx->dc->debug.hdmi20_disable &&
crtc_timing->pixel_encoding == PIXEL_ENCODING_YCBCR420) crtc_timing->pixel_encoding == PIXEL_ENCODING_YCBCR420)
...@@ -746,7 +746,7 @@ bool dcn10_link_encoder_validate_output_with_stream( ...@@ -746,7 +746,7 @@ bool dcn10_link_encoder_validate_output_with_stream(
is_valid = dcn10_link_encoder_validate_hdmi_output( is_valid = dcn10_link_encoder_validate_hdmi_output(
enc10, enc10,
&stream->timing, &stream->timing,
stream->phy_pix_clk); stream->phy_pix_clk * 10);
break; break;
case SIGNAL_TYPE_DISPLAY_PORT: case SIGNAL_TYPE_DISPLAY_PORT:
case SIGNAL_TYPE_DISPLAY_PORT_MST: case SIGNAL_TYPE_DISPLAY_PORT_MST:
......
...@@ -126,7 +126,7 @@ void optc1_program_vline_interrupt( ...@@ -126,7 +126,7 @@ void optc1_program_vline_interrupt(
struct optc *optc1 = DCN10TG_FROM_TG(optc); struct optc *optc1 = DCN10TG_FROM_TG(optc);
unsigned long long req_delta_tens_of_usec = div64_u64((vsync_delta + 9999), 10000); unsigned long long req_delta_tens_of_usec = div64_u64((vsync_delta + 9999), 10000);
unsigned long long pix_clk_hundreds_khz = div64_u64((dc_crtc_timing->pix_clk_khz + 99), 100); unsigned long long pix_clk_hundreds_khz = div64_u64((dc_crtc_timing->pix_clk_100hz + 999), 1000);
uint32_t req_delta_lines = (uint32_t) div64_u64( uint32_t req_delta_lines = (uint32_t) div64_u64(
(req_delta_tens_of_usec * pix_clk_hundreds_khz + dc_crtc_timing->h_total - 1), (req_delta_tens_of_usec * pix_clk_hundreds_khz + dc_crtc_timing->h_total - 1),
dc_crtc_timing->h_total); dc_crtc_timing->h_total);
......
...@@ -974,7 +974,7 @@ static void get_pixel_clock_parameters( ...@@ -974,7 +974,7 @@ static void get_pixel_clock_parameters(
struct pixel_clk_params *pixel_clk_params) struct pixel_clk_params *pixel_clk_params)
{ {
const struct dc_stream_state *stream = pipe_ctx->stream; const struct dc_stream_state *stream = pipe_ctx->stream;
pixel_clk_params->requested_pix_clk = stream->timing.pix_clk_khz; pixel_clk_params->requested_pix_clk_100hz = stream->timing.pix_clk_100hz;
pixel_clk_params->encoder_object_id = stream->link->link_enc->id; pixel_clk_params->encoder_object_id = stream->link->link_enc->id;
pixel_clk_params->signal_type = pipe_ctx->stream->signal; pixel_clk_params->signal_type = pipe_ctx->stream->signal;
pixel_clk_params->controller_id = pipe_ctx->stream_res.tg->inst + 1; pixel_clk_params->controller_id = pipe_ctx->stream_res.tg->inst + 1;
...@@ -991,9 +991,9 @@ static void get_pixel_clock_parameters( ...@@ -991,9 +991,9 @@ static void get_pixel_clock_parameters(
pixel_clk_params->color_depth = COLOR_DEPTH_888; pixel_clk_params->color_depth = COLOR_DEPTH_888;
if (stream->timing.pixel_encoding == PIXEL_ENCODING_YCBCR420) if (stream->timing.pixel_encoding == PIXEL_ENCODING_YCBCR420)
pixel_clk_params->requested_pix_clk /= 2; pixel_clk_params->requested_pix_clk_100hz /= 2;
if (stream->timing.timing_3d_format == TIMING_3D_FORMAT_HW_FRAME_PACKING) if (stream->timing.timing_3d_format == TIMING_3D_FORMAT_HW_FRAME_PACKING)
pixel_clk_params->requested_pix_clk *= 2; pixel_clk_params->requested_pix_clk_100hz *= 2;
} }
......
...@@ -594,7 +594,7 @@ void enc1_stream_encoder_dvi_set_stream_attribute( ...@@ -594,7 +594,7 @@ void enc1_stream_encoder_dvi_set_stream_attribute(
cntl.signal = is_dual_link ? cntl.signal = is_dual_link ?
SIGNAL_TYPE_DVI_DUAL_LINK : SIGNAL_TYPE_DVI_SINGLE_LINK; SIGNAL_TYPE_DVI_DUAL_LINK : SIGNAL_TYPE_DVI_SINGLE_LINK;
cntl.enable_dp_audio = false; cntl.enable_dp_audio = false;
cntl.pixel_clock = crtc_timing->pix_clk_khz; cntl.pixel_clock = crtc_timing->pix_clk_100hz / 10;
cntl.lanes_number = (is_dual_link) ? LANE_COUNT_EIGHT : LANE_COUNT_FOUR; cntl.lanes_number = (is_dual_link) ? LANE_COUNT_EIGHT : LANE_COUNT_FOUR;
if (enc1->base.bp->funcs->encoder_control( if (enc1->base.bp->funcs->encoder_control(
......
...@@ -78,7 +78,7 @@ struct csdp_ref_clk_ds_params { ...@@ -78,7 +78,7 @@ struct csdp_ref_clk_ds_params {
}; };
struct pixel_clk_params { struct pixel_clk_params {
uint32_t requested_pix_clk; /* in KHz */ uint32_t requested_pix_clk_100hz;
/*> Requested Pixel Clock /*> Requested Pixel Clock
* (based on Video Timing standard used for requested mode)*/ * (based on Video Timing standard used for requested mode)*/
uint32_t requested_sym_clk; /* in KHz */ uint32_t requested_sym_clk; /* in KHz */
...@@ -104,9 +104,9 @@ struct pixel_clk_params { ...@@ -104,9 +104,9 @@ struct pixel_clk_params {
* with actually calculated Clock and reference Crystal frequency * with actually calculated Clock and reference Crystal frequency
*/ */
struct pll_settings { struct pll_settings {
uint32_t actual_pix_clk; uint32_t actual_pix_clk_100hz;
uint32_t adjusted_pix_clk; uint32_t adjusted_pix_clk_100hz;
uint32_t calculated_pix_clk; uint32_t calculated_pix_clk_100hz;
uint32_t vco_freq; uint32_t vco_freq;
uint32_t reference_freq; uint32_t reference_freq;
uint32_t reference_divider; uint32_t reference_divider;
......
...@@ -211,8 +211,8 @@ struct bp_pixel_clock_parameters { ...@@ -211,8 +211,8 @@ struct bp_pixel_clock_parameters {
/* signal_type -> Encoder Mode - needed by VBIOS Exec table */ /* signal_type -> Encoder Mode - needed by VBIOS Exec table */
enum signal_type signal_type; enum signal_type signal_type;
/* Adjusted Pixel Clock (after VBIOS exec table) /* Adjusted Pixel Clock (after VBIOS exec table)
* that becomes Target Pixel Clock (KHz) */ * that becomes Target Pixel Clock (100 Hz units) */
uint32_t target_pixel_clock; uint32_t target_pixel_clock_100hz;
/* Calculated Reference divider of Display PLL */ /* Calculated Reference divider of Display PLL */
uint32_t reference_divider; uint32_t reference_divider;
/* Calculated Feedback divider of Display PLL */ /* Calculated Feedback divider of Display PLL */
......
...@@ -108,8 +108,8 @@ static unsigned int calc_duration_in_us_from_v_total( ...@@ -108,8 +108,8 @@ static unsigned int calc_duration_in_us_from_v_total(
{ {
unsigned int duration_in_us = unsigned int duration_in_us =
(unsigned int)(div64_u64(((unsigned long long)(v_total) (unsigned int)(div64_u64(((unsigned long long)(v_total)
* 1000) * stream->timing.h_total, * 10000) * stream->timing.h_total,
stream->timing.pix_clk_khz)); stream->timing.pix_clk_100hz));
return duration_in_us; return duration_in_us;
} }
...@@ -126,7 +126,7 @@ static unsigned int calc_v_total_from_refresh( ...@@ -126,7 +126,7 @@ static unsigned int calc_v_total_from_refresh(
refresh_in_uhz))); refresh_in_uhz)));
v_total = div64_u64(div64_u64(((unsigned long long)( v_total = div64_u64(div64_u64(((unsigned long long)(
frame_duration_in_ns) * stream->timing.pix_clk_khz), frame_duration_in_ns) * (stream->timing.pix_clk_100hz / 10)),
stream->timing.h_total), 1000000); stream->timing.h_total), 1000000);
/* v_total cannot be less than nominal */ /* v_total cannot be less than nominal */
...@@ -152,7 +152,7 @@ static unsigned int calc_v_total_from_duration( ...@@ -152,7 +152,7 @@ static unsigned int calc_v_total_from_duration(
duration_in_us = vrr->max_duration_in_us; duration_in_us = vrr->max_duration_in_us;
v_total = div64_u64(div64_u64(((unsigned long long)( v_total = div64_u64(div64_u64(((unsigned long long)(
duration_in_us) * stream->timing.pix_clk_khz), duration_in_us) * (stream->timing.pix_clk_100hz / 10)),
stream->timing.h_total), 1000); stream->timing.h_total), 1000);
/* v_total cannot be less than nominal */ /* v_total cannot be less than nominal */
...@@ -227,7 +227,7 @@ static void update_v_total_for_static_ramp( ...@@ -227,7 +227,7 @@ static void update_v_total_for_static_ramp(
} }
v_total = div64_u64(div64_u64(((unsigned long long)( v_total = div64_u64(div64_u64(((unsigned long long)(
current_duration_in_us) * stream->timing.pix_clk_khz), current_duration_in_us) * (stream->timing.pix_clk_100hz / 10)),
stream->timing.h_total), 1000); stream->timing.h_total), 1000);
in_out_vrr->adjust.v_total_min = v_total; in_out_vrr->adjust.v_total_min = v_total;
...@@ -972,7 +972,7 @@ unsigned long long mod_freesync_calc_nominal_field_rate( ...@@ -972,7 +972,7 @@ unsigned long long mod_freesync_calc_nominal_field_rate(
unsigned long long nominal_field_rate_in_uhz = 0; unsigned long long nominal_field_rate_in_uhz = 0;
/* Calculate nominal field rate for stream */ /* Calculate nominal field rate for stream */
nominal_field_rate_in_uhz = stream->timing.pix_clk_khz; nominal_field_rate_in_uhz = stream->timing.pix_clk_100hz / 10;
nominal_field_rate_in_uhz *= 1000ULL * 1000ULL * 1000ULL; nominal_field_rate_in_uhz *= 1000ULL * 1000ULL * 1000ULL;
nominal_field_rate_in_uhz = div_u64(nominal_field_rate_in_uhz, nominal_field_rate_in_uhz = div_u64(nominal_field_rate_in_uhz,
stream->timing.h_total); stream->timing.h_total);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment