From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jani Nikula Subject: Re: [PATCH v2 4/7] drm/i915: Try harder to get best m, n, p values with minimal error Date: Fri, 15 Nov 2013 09:19:17 +0200 Message-ID: <8738myi13e.fsf@intel.com> References: <1383990548-30737-1-git-send-email-shobhit.kumar@intel.com> <1383990548-30737-5-git-send-email-shobhit.kumar@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from mga03.intel.com (mga03.intel.com [143.182.124.21]) by gabe.freedesktop.org (Postfix) with ESMTP id 6EE6CFB612 for ; Thu, 14 Nov 2013 23:22:34 -0800 (PST) In-Reply-To: <1383990548-30737-5-git-send-email-shobhit.kumar@intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: intel-gfx-bounces@lists.freedesktop.org Errors-To: intel-gfx-bounces@lists.freedesktop.org To: Shobhit Kumar , intel-gfx Cc: vijayakumar.balakrishnan@intel.com, yogesh.mohan.marimuthu@intel.com List-Id: intel-gfx@lists.freedesktop.org On Sat, 09 Nov 2013, Shobhit Kumar wrote: > Basically check for both +ive and -ive deviation from target clock and > pick the one with minimal error. If we get a direct match, break from > loop to acheive some optimization. > > Signed-off-by: Vijayakumar Balakrishnan > Signed-off-by: Shobhit Kumar > --- > drivers/gpu/drm/i915/intel_dsi_pll.c | 26 ++++++++++++++++++-------- > 1 file changed, 18 insertions(+), 8 deletions(-) > > diff --git a/drivers/gpu/drm/i915/intel_dsi_pll.c b/drivers/gpu/drm/i915/intel_dsi_pll.c > index 9f3e6b0..16bc6b2 100644 > --- a/drivers/gpu/drm/i915/intel_dsi_pll.c > +++ b/drivers/gpu/drm/i915/intel_dsi_pll.c > @@ -243,22 +243,32 @@ static int dsi_calc_mnp(u32 dsi_clk, struct dsi_mnp *dsi_mnp) > ref_clk = 25000; > target_dsi_clk = dsi_clk; > error = 0xFFFFFFFF; > + tmp_error = 0xFFFFFFFF; > calc_m = 0; > calc_p = 0; > > for (m = 62; m <= 92; m++) { > for (p = 2; p <= 6; p++) { > - > + /* Find the optimal m and p divisors > + with minimal error +/- the required clock */ > calc_dsi_clk = (m * ref_clk) / p; > - if (calc_dsi_clk >= target_dsi_clk) { > - tmp_error = calc_dsi_clk - target_dsi_clk; > - if (tmp_error < error) { > - error = tmp_error; > - calc_m = m; > - calc_p = p; > - } > + if (calc_dsi_clk == target_dsi_clk) { > + calc_m = m; > + calc_p = p; > + error = 0; > + break; > + } else > + tmp_error = abs(target_dsi_clk - calc_dsi_clk); This is fragile, and only works because of the kernel's implementation of abs(). The substraction should be done with signed values. BR, Jani. > + > + if (tmp_error < error) { > + error = tmp_error; > + calc_m = m; > + calc_p = p; > } > } > + > + if (error == 0) > + break; > } > > m_seed = lfsr_converts[calc_m - 62]; > -- > 1.7.9.5 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/intel-gfx -- Jani Nikula, Intel Open Source Technology Center