summaryrefslogtreecommitdiff
path: root/tools/skl_compute_wrpll.c
diff options
context:
space:
mode:
authorDamien Lespiau <damien.lespiau@intel.com>2015-06-25 17:38:19 +0100
committerDamien Lespiau <damien.lespiau@intel.com>2015-06-25 17:49:34 +0100
commitde774ed31e678da3f0fe0a51c4c1165161ee399a (patch)
treeedc08cc1f8632762f111bf4a4356c75a777a40e0 /tools/skl_compute_wrpll.c
parent26336385ac1f32ce2a0160558d08af9d090c4286 (diff)
skl_compute_wrpll: Don't try other dividers if we find a 0 central freq deviation
Paulo suggested that we could short-circuit the search for a good divider if we find a 0 deviation of the DCO frequency from the central frequency. Out of the 373 test frequencies, 34 hit that fast path. Suggested-by: Paulo Zanoni <paulo.r.zanoni@intel.com> Signed-off-by: Damien Lespiau <damien.lespiau@intel.com>
Diffstat (limited to 'tools/skl_compute_wrpll.c')
-rw-r--r--tools/skl_compute_wrpll.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/tools/skl_compute_wrpll.c b/tools/skl_compute_wrpll.c
index 1cc2343a..9245724c 100644
--- a/tools/skl_compute_wrpll.c
+++ b/tools/skl_compute_wrpll.c
@@ -274,7 +274,12 @@ static void skl_wrpll_context_init(struct skl_wrpll_context *ctx)
#define SKL_MAX_PDEVIATION 100
#define SKL_MAX_NDEVIATION 600
-static void skl_wrpll_try_divider(struct skl_wrpll_context *ctx,
+
+/*
+ * Returns true if we're sure to have found the definitive divider (ie
+ * deviation == 0).
+ */
+static bool skl_wrpll_try_divider(struct skl_wrpll_context *ctx,
uint64_t central_freq,
uint64_t dco_freq,
unsigned int divider)
@@ -297,6 +302,10 @@ static void skl_wrpll_try_divider(struct skl_wrpll_context *ctx,
found = true;
#endif
}
+
+ /* we can't improve a 0 deviation */
+ if (deviation == 0)
+ return true;
/* negative deviation */
} else if (deviation < SKL_MAX_NDEVIATION &&
deviation < ctx->min_deviation) {
@@ -315,6 +324,8 @@ static void skl_wrpll_try_divider(struct skl_wrpll_context *ctx,
printf("dco_freq: %"PRIu64", dco_central_freq %"PRIu64"\n",
dco_freq, central_freq);
}
+
+ return false;
}
static void skl_wrpll_get_multipliers(unsigned int p,
@@ -433,13 +444,15 @@ skl_ddi_calculate_wrpll2(int clock /* in Hz */,
unsigned int p = dividers[d].list[i];
uint64_t dco_freq = p * afe_clock;
- skl_wrpll_try_divider(&ctx,
- dco_central_freq[dco],
- dco_freq,
- p);
+ if (skl_wrpll_try_divider(&ctx,
+ dco_central_freq[dco],
+ dco_freq,
+ p))
+ goto skip_remaining_dividers;
}
}
+skip_remaining_dividers:
/*
* If a solution is found with an even divider, prefer
* this one.