[Intel-gfx] [PATCH 1/2] Move watermark code from tests to tools

Daniel Vetter daniel.vetter at ffwll.ch
Mon Oct 27 15:09:31 CET 2014


They're now igt tests, and so if you blindly run lib/igt.cocci with
spatch on tests/*c they get mangled. Move them away, but still keep
them as noinst targets.

Signed-off-by: Daniel Vetter <daniel.vetter at intel.com>
---
 tests/.gitignore           |   2 -
 tests/Makefile.sources     |   2 -
 tests/ddi_compute_wrpll.c  | 626 ---------------------------------------------
 tests/skl_ddb_allocation.c | 424 ------------------------------
 tools/.gitignore           |   2 +
 tools/Makefile.sources     |   5 +
 tools/ddi_compute_wrpll.c  | 626 +++++++++++++++++++++++++++++++++++++++++++++
 tools/skl_ddb_allocation.c | 424 ++++++++++++++++++++++++++++++
 8 files changed, 1057 insertions(+), 1054 deletions(-)
 delete mode 100644 tests/ddi_compute_wrpll.c
 delete mode 100644 tests/skl_ddb_allocation.c
 create mode 100644 tools/ddi_compute_wrpll.c
 create mode 100644 tools/skl_ddb_allocation.c

diff --git a/tests/.gitignore b/tests/.gitignore
index 3b1fb8b3d44d..b8562b62cc14 100644
--- a/tests/.gitignore
+++ b/tests/.gitignore
@@ -3,7 +3,6 @@ core_get_client_auth
 core_getclient
 core_getstats
 core_getversion
-ddi_compute_wrpll
 drm_import_export
 drm_vma_limiter
 drm_vma_limiter_cached
@@ -149,6 +148,5 @@ prime_nv_test
 prime_self_import
 prime_udl
 single-tests.txt
-skl_ddb_allocation
 template
 testdisplay
diff --git a/tests/Makefile.sources b/tests/Makefile.sources
index 88bb854f5d13..7724a734bed0 100644
--- a/tests/Makefile.sources
+++ b/tests/Makefile.sources
@@ -1,8 +1,6 @@
 noinst_PROGRAMS = \
 	gem_alive \
 	gem_stress \
-	ddi_compute_wrpll \
-	skl_ddb_allocation \
 	$(TESTS_progs) \
 	$(TESTS_progs_M) \
 	$(HANG) \
diff --git a/tests/ddi_compute_wrpll.c b/tests/ddi_compute_wrpll.c
deleted file mode 100644
index 45c28e18c4ec..000000000000
--- a/tests/ddi_compute_wrpll.c
+++ /dev/null
@@ -1,626 +0,0 @@
-#include <stdio.h>
-#include <stdbool.h>
-#include <stdint.h>
-#include <stdlib.h>
-
-#include "intel_io.h"
-#include "drmtest.h"
-
-#define LC_FREQ 2700
-#define LC_FREQ_2K (LC_FREQ * 2000)
-
-#define P_MIN 2
-#define P_MAX 64
-#define P_INC 2
-
-/* Constraints for PLL good behavior */
-#define REF_MIN 48
-#define REF_MAX 400
-#define VCO_MIN 2400
-#define VCO_MAX 4800
-
-#define ABS_DIFF(a, b) ((a > b) ? (a - b) : (b - a))
-
-struct wrpll_rnp {
-	unsigned p, n2, r2;
-};
-
-static unsigned wrpll_get_budget_for_freq(int clock)
-{
-	unsigned budget;
-
-	switch (clock) {
-	case 25175000:
-	case 25200000:
-	case 27000000:
-	case 27027000:
-	case 37762500:
-	case 37800000:
-	case 40500000:
-	case 40541000:
-	case 54000000:
-	case 54054000:
-	case 59341000:
-	case 59400000:
-	case 72000000:
-	case 74176000:
-	case 74250000:
-	case 81000000:
-	case 81081000:
-	case 89012000:
-	case 89100000:
-	case 108000000:
-	case 108108000:
-	case 111264000:
-	case 111375000:
-	case 148352000:
-	case 148500000:
-	case 162000000:
-	case 162162000:
-	case 222525000:
-	case 222750000:
-	case 296703000:
-	case 297000000:
-		budget = 0;
-		break;
-	case 233500000:
-	case 245250000:
-	case 247750000:
-	case 253250000:
-	case 298000000:
-		budget = 1500;
-		break;
-	case 169128000:
-	case 169500000:
-	case 179500000:
-	case 202000000:
-		budget = 2000;
-		break;
-	case 256250000:
-	case 262500000:
-	case 270000000:
-	case 272500000:
-	case 273750000:
-	case 280750000:
-	case 281250000:
-	case 286000000:
-	case 291750000:
-		budget = 4000;
-		break;
-	case 267250000:
-	case 268500000:
-		budget = 5000;
-		break;
-	default:
-		budget = 1000;
-		break;
-	}
-
-	return budget;
-}
-
-static void wrpll_update_rnp(uint64_t freq2k, unsigned budget,
-			     unsigned r2, unsigned n2, unsigned p,
-			     struct wrpll_rnp *best)
-{
-	uint64_t a, b, c, d, diff, diff_best;
-
-	/* No best (r,n,p) yet */
-	if (best->p == 0) {
-		best->p = p;
-		best->n2 = n2;
-		best->r2 = r2;
-		return;
-	}
-
-	/*
-	 * Output clock is (LC_FREQ_2K / 2000) * N / (P * R), which compares to
-	 * freq2k.
-	 *
-	 * delta = 1e6 *
-	 *	   abs(freq2k - (LC_FREQ_2K * n2/(p * r2))) /
-	 *	   freq2k;
-	 *
-	 * and we would like delta <= budget.
-	 *
-	 * If the discrepancy is above the PPM-based budget, always prefer to
-	 * improve upon the previous solution.  However, if you're within the
-	 * budget, try to maximize Ref * VCO, that is N / (P * R^2).
-	 */
-	a = freq2k * budget * p * r2;
-	b = freq2k * budget * best->p * best->r2;
-	diff = ABS_DIFF((freq2k * p * r2), (LC_FREQ_2K * n2));
-	diff_best = ABS_DIFF((freq2k * best->p * best->r2),
-			     (LC_FREQ_2K * best->n2));
-	c = 1000000 * diff;
-	d = 1000000 * diff_best;
-
-	if (a < c && b < d) {
-		/* If both are above the budget, pick the closer */
-		if (best->p * best->r2 * diff < p * r2 * diff_best) {
-			best->p = p;
-			best->n2 = n2;
-			best->r2 = r2;
-		}
-	} else if (a >= c && b < d) {
-		/* If A is below the threshold but B is above it?  Update. */
-		best->p = p;
-		best->n2 = n2;
-		best->r2 = r2;
-	} else if (a >= c && b >= d) {
-		/* Both are below the limit, so pick the higher n2/(r2*r2) */
-		if (n2 * best->r2 * best->r2 > best->n2 * r2 * r2) {
-			best->p = p;
-			best->n2 = n2;
-			best->r2 = r2;
-		}
-	}
-	/* Otherwise a < c && b >= d, do nothing */
-}
-
-static void
-wrpll_compute_rnp(int clock /* in Hz */,
-		  unsigned *r2_out, unsigned *n2_out, unsigned *p_out)
-{
-	uint64_t freq2k;
-	unsigned p, n2, r2;
-	struct wrpll_rnp best = { 0, 0, 0 };
-	unsigned budget;
-
-	freq2k = clock / 100;
-
-	budget = wrpll_get_budget_for_freq(clock);
-
-	/* Special case handling for 540 pixel clock: bypass WR PLL entirely
-	 * and directly pass the LC PLL to it. */
-	if (freq2k == 5400000) {
-		*n2_out = 2;
-		*p_out = 1;
-		*r2_out = 2;
-		return;
-	}
-
-	/*
-	 * Ref = LC_FREQ / R, where Ref is the actual reference input seen by
-	 * the WR PLL.
-	 *
-	 * We want R so that REF_MIN <= Ref <= REF_MAX.
-	 * Injecting R2 = 2 * R gives:
-	 *   REF_MAX * r2 > LC_FREQ * 2 and
-	 *   REF_MIN * r2 < LC_FREQ * 2
-	 *
-	 * Which means the desired boundaries for r2 are:
-	 *  LC_FREQ * 2 / REF_MAX < r2 < LC_FREQ * 2 / REF_MIN
-	 *
-	 */
-        for (r2 = LC_FREQ * 2 / REF_MAX + 1;
-	     r2 <= LC_FREQ * 2 / REF_MIN;
-	     r2++) {
-
-		/*
-		 * VCO = N * Ref, that is: VCO = N * LC_FREQ / R
-		 *
-		 * Once again we want VCO_MIN <= VCO <= VCO_MAX.
-		 * Injecting R2 = 2 * R and N2 = 2 * N, we get:
-		 *   VCO_MAX * r2 > n2 * LC_FREQ and
-		 *   VCO_MIN * r2 < n2 * LC_FREQ)
-		 *
-		 * Which means the desired boundaries for n2 are:
-		 * VCO_MIN * r2 / LC_FREQ < n2 < VCO_MAX * r2 / LC_FREQ
-		 */
-		for (n2 = VCO_MIN * r2 / LC_FREQ + 1;
-		     n2 <= VCO_MAX * r2 / LC_FREQ;
-		     n2++) {
-
-			for (p = P_MIN; p <= P_MAX; p += P_INC)
-				wrpll_update_rnp(freq2k, budget,
-						 r2, n2, p, &best);
-		}
-	}
-
-	*n2_out = best.n2;
-	*p_out = best.p;
-	*r2_out = best.r2;
-}
-
-/* WRPLL clock dividers */
-struct wrpll_tmds_clock {
-	uint32_t clock;
-	uint16_t p;		/* Post divider */
-	uint16_t n2;		/* Feedback divider */
-	uint16_t r2;		/* Reference divider */
-};
-
-/* Table of matching values for WRPLL clocks programming for each frequency.
- * The code assumes this table is sorted. */
-static const struct wrpll_tmds_clock wrpll_tmds_clock_table[] = {
-	{19750000,	38,	25,	18},
-	{20000000,	48,	32,	18},
-	{21000000,	36,	21,	15},
-	{21912000,	42,	29,	17},
-	{22000000,	36,	22,	15},
-	{23000000,	36,	23,	15},
-	{23500000,	40,	40,	23},
-	{23750000,	26,	16,	14},
-	{24000000,	36,	24,	15},
-	{25000000,	36,	25,	15},
-	{25175000,	26,	40,	33},
-	{25200000,	30,	21,	15},
-	{26000000,	36,	26,	15},
-	{27000000,	30,	21,	14},
-	{27027000,	18,	100,	111},
-	{27500000,	30,	29,	19},
-	{28000000,	34,	30,	17},
-	{28320000,	26,	30,	22},
-	{28322000,	32,	42,	25},
-	{28750000,	24,	23,	18},
-	{29000000,	30,	29,	18},
-	{29750000,	32,	30,	17},
-	{30000000,	30,	25,	15},
-	{30750000,	30,	41,	24},
-	{31000000,	30,	31,	18},
-	{31500000,	30,	28,	16},
-	{32000000,	30,	32,	18},
-	{32500000,	28,	32,	19},
-	{33000000,	24,	22,	15},
-	{34000000,	28,	30,	17},
-	{35000000,	26,	32,	19},
-	{35500000,	24,	30,	19},
-	{36000000,	26,	26,	15},
-	{36750000,	26,	46,	26},
-	{37000000,	24,	23,	14},
-	{37762500,	22,	40,	26},
-	{37800000,	20,	21,	15},
-	{38000000,	24,	27,	16},
-	{38250000,	24,	34,	20},
-	{39000000,	24,	26,	15},
-	{40000000,	24,	32,	18},
-	{40500000,	20,	21,	14},
-	{40541000,	22,	147,	89},
-	{40750000,	18,	19,	14},
-	{41000000,	16,	17,	14},
-	{41500000,	22,	44,	26},
-	{41540000,	22,	44,	26},
-	{42000000,	18,	21,	15},
-	{42500000,	22,	45,	26},
-	{43000000,	20,	43,	27},
-	{43163000,	20,	24,	15},
-	{44000000,	18,	22,	15},
-	{44900000,	20,	108,	65},
-	{45000000,	20,	25,	15},
-	{45250000,	20,	52,	31},
-	{46000000,	18,	23,	15},
-	{46750000,	20,	45,	26},
-	{47000000,	20,	40,	23},
-	{48000000,	18,	24,	15},
-	{49000000,	18,	49,	30},
-	{49500000,	16,	22,	15},
-	{50000000,	18,	25,	15},
-	{50500000,	18,	32,	19},
-	{51000000,	18,	34,	20},
-	{52000000,	18,	26,	15},
-	{52406000,	14,	34,	25},
-	{53000000,	16,	22,	14},
-	{54000000,	16,	24,	15},
-	{54054000,	16,	173,	108},
-	{54500000,	14,	24,	17},
-	{55000000,	12,	22,	18},
-	{56000000,	14,	45,	31},
-	{56250000,	16,	25,	15},
-	{56750000,	14,	25,	17},
-	{57000000,	16,	27,	16},
-	{58000000,	16,	43,	25},
-	{58250000,	16,	38,	22},
-	{58750000,	16,	40,	23},
-	{59000000,	14,	26,	17},
-	{59341000,	14,	40,	26},
-	{59400000,	16,	44,	25},
-	{60000000,	16,	32,	18},
-	{60500000,	12,	39,	29},
-	{61000000,	14,	49,	31},
-	{62000000,	14,	37,	23},
-	{62250000,	14,	42,	26},
-	{63000000,	12,	21,	15},
-	{63500000,	14,	28,	17},
-	{64000000,	12,	27,	19},
-	{65000000,	14,	32,	19},
-	{65250000,	12,	29,	20},
-	{65500000,	12,	32,	22},
-	{66000000,	12,	22,	15},
-	{66667000,	14,	38,	22},
-	{66750000,	10,	21,	17},
-	{67000000,	14,	33,	19},
-	{67750000,	14,	58,	33},
-	{68000000,	14,	30,	17},
-	{68179000,	14,	46,	26},
-	{68250000,	14,	46,	26},
-	{69000000,	12,	23,	15},
-	{70000000,	12,	28,	18},
-	{71000000,	12,	30,	19},
-	{72000000,	12,	24,	15},
-	{73000000,	10,	23,	17},
-	{74000000,	12,	23,	14},
-	{74176000,	8,	100,	91},
-	{74250000,	10,	22,	16},
-	{74481000,	12,	43,	26},
-	{74500000,	10,	29,	21},
-	{75000000,	12,	25,	15},
-	{75250000,	10,	39,	28},
-	{76000000,	12,	27,	16},
-	{77000000,	12,	53,	31},
-	{78000000,	12,	26,	15},
-	{78750000,	12,	28,	16},
-	{79000000,	10,	38,	26},
-	{79500000,	10,	28,	19},
-	{80000000,	12,	32,	18},
-	{81000000,	10,	21,	14},
-	{81081000,	6,	100,	111},
-	{81624000,	8,	29,	24},
-	{82000000,	8,	17,	14},
-	{83000000,	10,	40,	26},
-	{83950000,	10,	28,	18},
-	{84000000,	10,	28,	18},
-	{84750000,	6,	16,	17},
-	{85000000,	6,	17,	18},
-	{85250000,	10,	30,	19},
-	{85750000,	10,	27,	17},
-	{86000000,	10,	43,	27},
-	{87000000,	10,	29,	18},
-	{88000000,	10,	44,	27},
-	{88500000,	10,	41,	25},
-	{89000000,	10,	28,	17},
-	{89012000,	6,	90,	91},
-	{89100000,	10,	33,	20},
-	{90000000,	10,	25,	15},
-	{91000000,	10,	32,	19},
-	{92000000,	10,	46,	27},
-	{93000000,	10,	31,	18},
-	{94000000,	10,	40,	23},
-	{94500000,	10,	28,	16},
-	{95000000,	10,	44,	25},
-	{95654000,	10,	39,	22},
-	{95750000,	10,	39,	22},
-	{96000000,	10,	32,	18},
-	{97000000,	8,	23,	16},
-	{97750000,	8,	42,	29},
-	{98000000,	8,	45,	31},
-	{99000000,	8,	22,	15},
-	{99750000,	8,	34,	23},
-	{100000000,	6,	20,	18},
-	{100500000,	6,	19,	17},
-	{101000000,	6,	37,	33},
-	{101250000,	8,	21,	14},
-	{102000000,	6,	17,	15},
-	{102250000,	6,	25,	22},
-	{103000000,	8,	29,	19},
-	{104000000,	8,	37,	24},
-	{105000000,	8,	28,	18},
-	{106000000,	8,	22,	14},
-	{107000000,	8,	46,	29},
-	{107214000,	8,	27,	17},
-	{108000000,	8,	24,	15},
-	{108108000,	8,	173,	108},
-	{109000000,	6,	23,	19},
-	{110000000,	6,	22,	18},
-	{110013000,	6,	22,	18},
-	{110250000,	8,	49,	30},
-	{110500000,	8,	36,	22},
-	{111000000,	8,	23,	14},
-	{111264000,	8,	150,	91},
-	{111375000,	8,	33,	20},
-	{112000000,	8,	63,	38},
-	{112500000,	8,	25,	15},
-	{113100000,	8,	57,	34},
-	{113309000,	8,	42,	25},
-	{114000000,	8,	27,	16},
-	{115000000,	6,	23,	18},
-	{116000000,	8,	43,	25},
-	{117000000,	8,	26,	15},
-	{117500000,	8,	40,	23},
-	{118000000,	6,	38,	29},
-	{119000000,	8,	30,	17},
-	{119500000,	8,	46,	26},
-	{119651000,	8,	39,	22},
-	{120000000,	8,	32,	18},
-	{121000000,	6,	39,	29},
-	{121250000,	6,	31,	23},
-	{121750000,	6,	23,	17},
-	{122000000,	6,	42,	31},
-	{122614000,	6,	30,	22},
-	{123000000,	6,	41,	30},
-	{123379000,	6,	37,	27},
-	{124000000,	6,	51,	37},
-	{125000000,	6,	25,	18},
-	{125250000,	4,	13,	14},
-	{125750000,	4,	27,	29},
-	{126000000,	6,	21,	15},
-	{127000000,	6,	24,	17},
-	{127250000,	6,	41,	29},
-	{128000000,	6,	27,	19},
-	{129000000,	6,	43,	30},
-	{129859000,	4,	25,	26},
-	{130000000,	6,	26,	18},
-	{130250000,	6,	42,	29},
-	{131000000,	6,	32,	22},
-	{131500000,	6,	38,	26},
-	{131850000,	6,	41,	28},
-	{132000000,	6,	22,	15},
-	{132750000,	6,	28,	19},
-	{133000000,	6,	34,	23},
-	{133330000,	6,	37,	25},
-	{134000000,	6,	61,	41},
-	{135000000,	6,	21,	14},
-	{135250000,	6,	167,	111},
-	{136000000,	6,	62,	41},
-	{137000000,	6,	35,	23},
-	{138000000,	6,	23,	15},
-	{138500000,	6,	40,	26},
-	{138750000,	6,	37,	24},
-	{139000000,	6,	34,	22},
-	{139050000,	6,	34,	22},
-	{139054000,	6,	34,	22},
-	{140000000,	6,	28,	18},
-	{141000000,	6,	36,	23},
-	{141500000,	6,	22,	14},
-	{142000000,	6,	30,	19},
-	{143000000,	6,	27,	17},
-	{143472000,	4,	17,	16},
-	{144000000,	6,	24,	15},
-	{145000000,	6,	29,	18},
-	{146000000,	6,	47,	29},
-	{146250000,	6,	26,	16},
-	{147000000,	6,	49,	30},
-	{147891000,	6,	23,	14},
-	{148000000,	6,	23,	14},
-	{148250000,	6,	28,	17},
-	{148352000,	4,	100,	91},
-	{148500000,	6,	33,	20},
-	{149000000,	6,	48,	29},
-	{150000000,	6,	25,	15},
-	{151000000,	4,	19,	17},
-	{152000000,	6,	27,	16},
-	{152280000,	6,	44,	26},
-	{153000000,	6,	34,	20},
-	{154000000,	6,	53,	31},
-	{155000000,	6,	31,	18},
-	{155250000,	6,	50,	29},
-	{155750000,	6,	45,	26},
-	{156000000,	6,	26,	15},
-	{157000000,	6,	61,	35},
-	{157500000,	6,	28,	16},
-	{158000000,	6,	65,	37},
-	{158250000,	6,	44,	25},
-	{159000000,	6,	53,	30},
-	{159500000,	6,	39,	22},
-	{160000000,	6,	32,	18},
-	{161000000,	4,	31,	26},
-	{162000000,	4,	18,	15},
-	{162162000,	4,	131,	109},
-	{162500000,	4,	53,	44},
-	{163000000,	4,	29,	24},
-	{164000000,	4,	17,	14},
-	{165000000,	4,	22,	18},
-	{166000000,	4,	32,	26},
-	{167000000,	4,	26,	21},
-	{168000000,	4,	46,	37},
-	{169000000,	4,	104,	83},
-	{169128000,	4,	64,	51},
-	{169500000,	4,	39,	31},
-	{170000000,	4,	34,	27},
-	{171000000,	4,	19,	15},
-	{172000000,	4,	51,	40},
-	{172750000,	4,	32,	25},
-	{172800000,	4,	32,	25},
-	{173000000,	4,	41,	32},
-	{174000000,	4,	49,	38},
-	{174787000,	4,	22,	17},
-	{175000000,	4,	35,	27},
-	{176000000,	4,	30,	23},
-	{177000000,	4,	38,	29},
-	{178000000,	4,	29,	22},
-	{178500000,	4,	37,	28},
-	{179000000,	4,	53,	40},
-	{179500000,	4,	73,	55},
-	{180000000,	4,	20,	15},
-	{181000000,	4,	55,	41},
-	{182000000,	4,	31,	23},
-	{183000000,	4,	42,	31},
-	{184000000,	4,	30,	22},
-	{184750000,	4,	26,	19},
-	{185000000,	4,	37,	27},
-	{186000000,	4,	51,	37},
-	{187000000,	4,	36,	26},
-	{188000000,	4,	32,	23},
-	{189000000,	4,	21,	15},
-	{190000000,	4,	38,	27},
-	{190960000,	4,	41,	29},
-	{191000000,	4,	41,	29},
-	{192000000,	4,	27,	19},
-	{192250000,	4,	37,	26},
-	{193000000,	4,	20,	14},
-	{193250000,	4,	53,	37},
-	{194000000,	4,	23,	16},
-	{194208000,	4,	23,	16},
-	{195000000,	4,	26,	18},
-	{196000000,	4,	45,	31},
-	{197000000,	4,	35,	24},
-	{197750000,	4,	41,	28},
-	{198000000,	4,	22,	15},
-	{198500000,	4,	25,	17},
-	{199000000,	4,	28,	19},
-	{200000000,	4,	37,	25},
-	{201000000,	4,	61,	41},
-	{202000000,	4,	112,	75},
-	{202500000,	4,	21,	14},
-	{203000000,	4,	146,	97},
-	{204000000,	4,	62,	41},
-	{204750000,	4,	44,	29},
-	{205000000,	4,	38,	25},
-	{206000000,	4,	29,	19},
-	{207000000,	4,	23,	15},
-	{207500000,	4,	40,	26},
-	{208000000,	4,	37,	24},
-	{208900000,	4,	48,	31},
-	{209000000,	4,	48,	31},
-	{209250000,	4,	31,	20},
-	{210000000,	4,	28,	18},
-	{211000000,	4,	25,	16},
-	{212000000,	4,	22,	14},
-	{213000000,	4,	30,	19},
-	{213750000,	4,	38,	24},
-	{214000000,	4,	46,	29},
-	{214750000,	4,	35,	22},
-	{215000000,	4,	43,	27},
-	{216000000,	4,	24,	15},
-	{217000000,	4,	37,	23},
-	{218000000,	4,	42,	26},
-	{218250000,	4,	42,	26},
-	{218750000,	4,	34,	21},
-	{219000000,	4,	47,	29},
-	{220000000,	4,	44,	27},
-	{220640000,	4,	49,	30},
-	{220750000,	4,	36,	22},
-	{221000000,	4,	36,	22},
-	{222000000,	4,	23,	14},
-	{222525000,	4,	150,	91},
-	{222750000,	4,	33,	20},
-	{227000000,	4,	37,	22},
-	{230250000,	4,	29,	17},
-	{233500000,	4,	38,	22},
-	{235000000,	4,	40,	23},
-	{238000000,	4,	30,	17},
-	{241500000,	2,	17,	19},
-	{245250000,	2,	20,	22},
-	{247750000,	2,	22,	24},
-	{253250000,	2,	15,	16},
-	{256250000,	2,	18,	19},
-	{262500000,	2,	31,	32},
-	{267250000,	2,	66,	67},
-	{268500000,	2,	94,	95},
-	{270000000,	2,	14,	14},
-	{272500000,	2,	77,	76},
-	{273750000,	2,	57,	56},
-	{280750000,	2,	24,	23},
-	{281250000,	2,	23,	22},
-	{286000000,	2,	17,	16},
-	{291750000,	2,	26,	24},
-	{296703000,	2,	100,	91},
-	{297000000,	2,	22,	20},
-	{298000000,	2,	21,	19},
-};
-
-int main(void)
-{
-	int i;
-
-	for (i = 0; i < ARRAY_SIZE(wrpll_tmds_clock_table); i++) {
-		const struct wrpll_tmds_clock *ref = &wrpll_tmds_clock_table[i];
-		unsigned r2, n2, p;
-
-		wrpll_compute_rnp(ref->clock, &r2, &n2, &p);
-		igt_fail_on_f(ref->r2 != r2 || ref->n2 != n2 || ref->p != p,
-			      "Computed value differs for %li Hz:\n""  Reference: (%u,%u,%u)\n""  Computed:  (%u,%u,%u)\n", (int64_t)ref->clock * 1000, ref->r2, ref->n2, ref->p, r2, n2, p);
-	}
-
-	return 0;
-}
diff --git a/tests/skl_ddb_allocation.c b/tests/skl_ddb_allocation.c
deleted file mode 100644
index 4d8e6d185ee7..000000000000
--- a/tests/skl_ddb_allocation.c
+++ /dev/null
@@ -1,424 +0,0 @@
-#include <stdint.h>
-#include <stdio.h>
-#include <stdbool.h>
-#include <stddef.h>
-#include <string.h>
-
-/**
- * container_of - cast a member of a structure out to the containing structure
- * @ptr:	the pointer to the member.
- * @type:	the type of the container struct this is embedded in.
- * @member:	the name of the member within the struct.
- *
- */
-#define container_of(ptr, type, member) ({			\
-	typeof( ((type *)0)->member ) *__mptr = (ptr);	\
-	(type *)( (char *)__mptr - offsetof(type,member) );})
-
-#define div_u64(a, b)	((a) / (b))
-
-/*
- * Stub a few defines/structures
- */
-
-#define I915_MAX_PIPES	3
-#define I915_MAX_PLANES	3
-#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
-
-#define for_each_pipe(p) for ((p) = 0; (p) < 3; (p)++)
-#define for_each_plane(pipe, p) for ((p) = 0; (p) < 3; (p)++)
-
-#define for_each_crtc(dev, crtc) \
-	for (int i = 0; i < 3 && (crtc = &crtcs[i].base); i++)
-
-#define for_each_intel_crtc(dev, intel_crtc) \
-	for (int i = 0; i < 3, intel_crtc = &crtcs[i]; i++)
-
-enum pipe {
-	PIPE_A,
-	PIPE_B,
-	PIPE_C,
-};
-
-enum plane {
-	PLANE_1,
-	PLANE_2,
-	PLANE_3,
-};
-
-#define pipe_name(p) ((p) + 'A')
-
-struct drm_device {
-	void *dev_private;
-};
-
-struct drm_i915_private {
-	struct drm_device *dev;
-};
-
-struct drm_crtc {
-	struct drm_device *dev;
-	bool active;
-};
-
-static bool intel_crtc_active(struct drm_crtc *crtc)
-{
-	return crtc->active;
-}
-
-struct intel_crtc {
-	struct drm_crtc base;
-	enum pipe pipe;
-};
-
-static int intel_num_planes(struct intel_crtc *crtc)
-{
-	return 3;
-}
-
-struct intel_crtc crtcs[I915_MAX_PIPES];
-
-#define to_intel_crtc(x) container_of(x, struct intel_crtc, base)
-
-/*
- * DDB code
- */
-
-struct intel_wm_config {
-	unsigned int num_pipes_active;
-};
-
-struct intel_plane_wm_parameters {
-	uint32_t horiz_pixels;
-	uint32_t vert_pixels;
-	uint8_t bytes_per_pixel;
-	bool enabled;
-	bool scaled;
-};
-
-struct skl_pipe_wm_parameters {
-	bool active;
-	uint32_t pipe_htotal;
-	uint32_t pixel_rate; /* in KHz */
-	struct intel_plane_wm_parameters plane[I915_MAX_PLANES];
-	struct intel_plane_wm_parameters cursor;
-};
-
-struct skl_ddb_entry {
-	uint16_t start, end;	/* in number of blocks. 'end' is exclusive */
-};
-
-static inline uint16_t skl_ddb_entry_size(const struct skl_ddb_entry *entry)
-{
-	/* end not set, clearly no allocation here. start can be 0 though */
-	if (entry->end == 0)
-		return 0;
-
-	return entry->end - entry->start;
-}
-
-static inline bool skl_ddb_entry_equal(const struct skl_ddb_entry *e1,
-				       const struct skl_ddb_entry *e2)
-{
-	if (e1->start == e2->start && e1->end == e2->end)
-		return true;
-
-	return false;
-}
-
-struct skl_ddb_allocation {
-	struct skl_ddb_entry plane[I915_MAX_PIPES][I915_MAX_PLANES];
-	struct skl_ddb_entry cursor[I915_MAX_PIPES];
-};
-
-/*
- * On gen9, we need to allocate Display Data Buffer (DDB) portions to the
- * different active planes.
- */
-
-#define SKL_DDB_SIZE		896	/* in blocks */
-
-static void
-skl_ddb_get_pipe_allocation_limits(struct drm_device *dev,
-				   struct drm_crtc *for_crtc,
-				   const struct intel_wm_config *config,
-				   const struct skl_pipe_wm_parameters *params,
-				   struct skl_ddb_entry *alloc /* out */)
-{
-	struct drm_crtc *crtc;
-	unsigned int pipe_size, ddb_size;
-	int nth_active_pipe;
-
-	if (!params->active) {
-		alloc->start = 0;
-		alloc->end = 0;
-		return;
-	}
-
-	ddb_size = SKL_DDB_SIZE;
-	ddb_size -= 4; /* 4 blocks for bypass path allocation */
-
-	nth_active_pipe = 0;
-	for_each_crtc(dev, crtc) {
-		if (!intel_crtc_active(crtc))
-			continue;
-
-		if (crtc == for_crtc)
-			break;
-
-		nth_active_pipe++;
-	}
-
-	pipe_size = ddb_size / config->num_pipes_active;
-	alloc->start = nth_active_pipe * ddb_size / config->num_pipes_active;
-	alloc->end = alloc->start + pipe_size;
-}
-
-static unsigned int skl_cursor_allocation(const struct intel_wm_config *config)
-{
-	if (config->num_pipes_active == 1)
-		return 32;
-
-	return 8;
-}
-
-static unsigned int
-skl_plane_relative_data_rate(const struct intel_plane_wm_parameters *p)
-{
-	return p->horiz_pixels * p->vert_pixels * p->bytes_per_pixel;
-}
-
-/*
- * We don't overflow 32 bits. Worst case is 3 planes enabled, each fetching
- * a 8192x4096 at 32bpp framebuffer:
- *   3 * 4096 * 8192  * 4 < 2^32
- */
-static unsigned int
-skl_get_total_relative_data_rate(struct intel_crtc *intel_crtc,
-				 const struct skl_pipe_wm_parameters *params)
-{
-	unsigned int total_data_rate = 0;
-	int plane;
-
-	for (plane = 0; plane < intel_num_planes(intel_crtc); plane++) {
-		const struct intel_plane_wm_parameters *p;
-
-		p = &params->plane[plane];
-		if (!p->enabled)
-			continue;
-
-		total_data_rate += skl_plane_relative_data_rate(p);
-	}
-
-	return total_data_rate;
-}
-
-static void
-skl_allocate_pipe_ddb(struct drm_crtc *crtc,
-		      const struct intel_wm_config *config,
-		      const struct skl_pipe_wm_parameters *params,
-		      struct skl_ddb_allocation *ddb /* out */)
-{
-	struct drm_device *dev = crtc->dev;
-	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
-	enum pipe pipe = intel_crtc->pipe;
-	struct skl_ddb_entry alloc;
-	uint16_t alloc_size, start, cursor_blocks;
-	uint16_t minimum[I915_MAX_PLANES];
-	unsigned int total_data_rate;
-	int plane;
-
-	skl_ddb_get_pipe_allocation_limits(dev, crtc, config, params, &alloc);
-	alloc_size = skl_ddb_entry_size(&alloc);
-	if (alloc_size == 0) {
-		memset(ddb->plane[pipe], 0, sizeof(ddb->plane[pipe]));
-		memset(&ddb->cursor[pipe], 0, sizeof(ddb->cursor[pipe]));
-		return;
-	}
-
-	cursor_blocks = skl_cursor_allocation(config);
-	ddb->cursor[pipe].start = alloc.end - cursor_blocks;
-	ddb->cursor[pipe].end = alloc.end;
-
-	alloc_size -= cursor_blocks;
-	alloc.end -= cursor_blocks;
-
-	/* 1. Allocate the mininum required blocks for each active plane */
-	for_each_plane(pipe, plane) {
-		const struct intel_plane_wm_parameters *p;
-
-		p = &params->plane[plane];
-		if (!p->enabled)
-			continue;
-
-		minimum[plane] = 8;
-		alloc_size -= minimum[plane];
-	}
-
-	/*
-	 * 2. Distribute the remaining space in proportion to the amount of
-	 * data each plane needs to fetch from memory.
-	 *
-	 * FIXME: we may not allocate every single block here.
-	 */
-	total_data_rate = skl_get_total_relative_data_rate(intel_crtc, params);
-
-	start = alloc.start;
-	for (plane = 0; plane < intel_num_planes(intel_crtc); plane++) {
-		const struct intel_plane_wm_parameters *p;
-		unsigned int data_rate;
-		uint16_t plane_blocks;
-
-		p = &params->plane[plane];
-		if (!p->enabled)
-			continue;
-
-		data_rate = skl_plane_relative_data_rate(p);
-
-		/*
-		 * promote the expression to 64 bits to avoid overflowing, the
-		 * result is < available as data_rate / total_data_rate < 1
-		 */
-		plane_blocks = minimum[plane];
-		plane_blocks += div_u64((uint64_t)alloc_size * data_rate,
-					total_data_rate);
-
-		ddb->plane[pipe][plane].start = start;
-		ddb->plane[pipe][plane].end = start + plane_blocks;
-
-		start += plane_blocks;
-	}
-
-}
-
-static void skl_ddb_check_entry(struct skl_ddb_entry *entry, int16_t *cursor)
-{
-
-	if (skl_ddb_entry_size(entry) == 0)
-		return;
-
-	/* check that ->start is the next available block */
-	if (entry->start < *cursor)
-		printf("error: allocation overlaps previous block\n");
-	else if (entry->start >= *cursor + 1)
-		printf("warning: allocation leaves a hole\n");
-
-	*cursor = entry->end;
-}
-
-static void skl_ddb_check_last_allocation(int16_t cursor)
-{
-	uint16_t last_offset = SKL_DDB_SIZE - 4;
-
-	if (cursor < last_offset)
-		printf("warning: %d blocks not allocated\n",
-		       last_offset - cursor);
-	else if (cursor > last_offset)
-		printf("error: allocation greater than available space\n");
-}
-
-static void skl_ddb_print(struct skl_ddb_allocation *ddb)
-{
-	struct skl_ddb_entry *entry;
-	enum pipe pipe;
-	int plane;
-	int16_t cursor = 0;
-
-	printf("%-15s%8s%8s%8s\n", "", "Start", "End", "Size");
-
-	for_each_pipe(pipe) {
-		printf("Pipe %c\n", pipe_name(pipe));
-
-		for_each_plane(pipe, plane) {
-			entry = &ddb->plane[pipe][plane];
-
-			printf("  Plane%-8d%8u%8u%8u\n", plane + 1,
-			       entry->start, entry->end,
-			       skl_ddb_entry_size(entry));
-
-			skl_ddb_check_entry(entry, &cursor);
-		}
-
-		entry = &ddb->cursor[pipe];
-		printf("  %-13s%8u%8u%8u\n", "Cursor", entry->start,
-		       entry->end, skl_ddb_entry_size(entry));
-
-		skl_ddb_check_entry(entry, &cursor);
-	}
-
-	skl_ddb_check_last_allocation(cursor);
-}
-
-static struct drm_device drm_device;
-static struct drm_i915_private drm_i915_private;
-
-static void init_stub(void)
-{
-	int i;
-
-	drm_device.dev_private = &drm_i915_private;
-	drm_i915_private.dev = &drm_device;
-
-	for (i = 0; i < I915_MAX_PIPES; i++) {
-		crtcs[i].base.dev = &drm_device;
-		crtcs[i].pipe = i;
-	}
-}
-
-struct wm_input {
-	struct intel_wm_config config;
-	struct skl_pipe_wm_parameters params[I915_MAX_PIPES];
-};
-
-static void wm_input_reset(struct wm_input *in)
-{
-	memset(in, 0, sizeof(*in));
-}
-
-static void wm_enable_plane(struct wm_input *in,
-			    enum pipe pipe, enum plane plane,
-			    uint32_t width, uint32_t height, int bpp)
-{
-	enum pipe i;
-
-	in->params[pipe].active = 1;
-
-	in->config.num_pipes_active = 0;
-	for_each_pipe(i)
-		if (in->params[i].active)
-			in->config.num_pipes_active++;
-
-	in->params[pipe].plane[plane].horiz_pixels = width;
-	in->params[pipe].plane[plane].vert_pixels = height;
-	in->params[pipe].plane[plane].bytes_per_pixel = bpp;
-	in->params[pipe].plane[plane].enabled = true;
-}
-
-static void skl_ddb_allocate(struct wm_input *in,
-			     struct skl_ddb_allocation *out)
-{
-	struct drm_crtc *crtc;
-
-	for_each_crtc(, crtc) {
-		enum pipe pipe = to_intel_crtc(crtc)->pipe;
-
-		skl_allocate_pipe_ddb(crtc,
-				      &in->config, &in->params[pipe], out);
-	}
-}
-
-int main(int argc, char **argv)
-{
-	struct wm_input in;
-	static struct skl_ddb_allocation ddb;
-
-	init_stub();
-
-	wm_input_reset(&in);
-	wm_enable_plane(&in, PIPE_A, PLANE_1, 1280, 1024, 4);
-	wm_enable_plane(&in, PIPE_A, PLANE_2,  100,  100, 4);
-	skl_ddb_allocate(&in, &ddb);
-	skl_ddb_print(&ddb);
-
-	return 0;
-}
diff --git a/tools/.gitignore b/tools/.gitignore
index cc87bbcc22e7..fc0426f241eb 100644
--- a/tools/.gitignore
+++ b/tools/.gitignore
@@ -1,4 +1,5 @@
 # Please keep sorted alphabetically
+ddi_compute_wrpll
 forcewaked
 intel_audio_dump
 intel_backlight
@@ -35,3 +36,4 @@ intel_reg_write
 intel_stepping
 intel_vga_read
 intel_vga_write
+skl_ddb_allocation
diff --git a/tools/Makefile.sources b/tools/Makefile.sources
index 6a73fa0a8fe0..48b89db09ec2 100644
--- a/tools/Makefile.sources
+++ b/tools/Makefile.sources
@@ -1,3 +1,8 @@
+noinst_PROGRAMS = \
+	ddi_compute_wrpll \
+	skl_ddb_allocation \
+	$(NULL)
+
 bin_PROGRAMS = 				\
 	intel_audio_dump 		\
 	intel_backlight 		\
diff --git a/tools/ddi_compute_wrpll.c b/tools/ddi_compute_wrpll.c
new file mode 100644
index 000000000000..45c28e18c4ec
--- /dev/null
+++ b/tools/ddi_compute_wrpll.c
@@ -0,0 +1,626 @@
+#include <stdio.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+#include "intel_io.h"
+#include "drmtest.h"
+
+#define LC_FREQ 2700
+#define LC_FREQ_2K (LC_FREQ * 2000)
+
+#define P_MIN 2
+#define P_MAX 64
+#define P_INC 2
+
+/* Constraints for PLL good behavior */
+#define REF_MIN 48
+#define REF_MAX 400
+#define VCO_MIN 2400
+#define VCO_MAX 4800
+
+#define ABS_DIFF(a, b) ((a > b) ? (a - b) : (b - a))
+
+struct wrpll_rnp {
+	unsigned p, n2, r2;
+};
+
+static unsigned wrpll_get_budget_for_freq(int clock)
+{
+	unsigned budget;
+
+	switch (clock) {
+	case 25175000:
+	case 25200000:
+	case 27000000:
+	case 27027000:
+	case 37762500:
+	case 37800000:
+	case 40500000:
+	case 40541000:
+	case 54000000:
+	case 54054000:
+	case 59341000:
+	case 59400000:
+	case 72000000:
+	case 74176000:
+	case 74250000:
+	case 81000000:
+	case 81081000:
+	case 89012000:
+	case 89100000:
+	case 108000000:
+	case 108108000:
+	case 111264000:
+	case 111375000:
+	case 148352000:
+	case 148500000:
+	case 162000000:
+	case 162162000:
+	case 222525000:
+	case 222750000:
+	case 296703000:
+	case 297000000:
+		budget = 0;
+		break;
+	case 233500000:
+	case 245250000:
+	case 247750000:
+	case 253250000:
+	case 298000000:
+		budget = 1500;
+		break;
+	case 169128000:
+	case 169500000:
+	case 179500000:
+	case 202000000:
+		budget = 2000;
+		break;
+	case 256250000:
+	case 262500000:
+	case 270000000:
+	case 272500000:
+	case 273750000:
+	case 280750000:
+	case 281250000:
+	case 286000000:
+	case 291750000:
+		budget = 4000;
+		break;
+	case 267250000:
+	case 268500000:
+		budget = 5000;
+		break;
+	default:
+		budget = 1000;
+		break;
+	}
+
+	return budget;
+}
+
+static void wrpll_update_rnp(uint64_t freq2k, unsigned budget,
+			     unsigned r2, unsigned n2, unsigned p,
+			     struct wrpll_rnp *best)
+{
+	uint64_t a, b, c, d, diff, diff_best;
+
+	/* No best (r,n,p) yet */
+	if (best->p == 0) {
+		best->p = p;
+		best->n2 = n2;
+		best->r2 = r2;
+		return;
+	}
+
+	/*
+	 * Output clock is (LC_FREQ_2K / 2000) * N / (P * R), which compares to
+	 * freq2k.
+	 *
+	 * delta = 1e6 *
+	 *	   abs(freq2k - (LC_FREQ_2K * n2/(p * r2))) /
+	 *	   freq2k;
+	 *
+	 * and we would like delta <= budget.
+	 *
+	 * If the discrepancy is above the PPM-based budget, always prefer to
+	 * improve upon the previous solution.  However, if you're within the
+	 * budget, try to maximize Ref * VCO, that is N / (P * R^2).
+	 */
+	a = freq2k * budget * p * r2;
+	b = freq2k * budget * best->p * best->r2;
+	diff = ABS_DIFF((freq2k * p * r2), (LC_FREQ_2K * n2));
+	diff_best = ABS_DIFF((freq2k * best->p * best->r2),
+			     (LC_FREQ_2K * best->n2));
+	c = 1000000 * diff;
+	d = 1000000 * diff_best;
+
+	if (a < c && b < d) {
+		/* If both are above the budget, pick the closer */
+		if (best->p * best->r2 * diff < p * r2 * diff_best) {
+			best->p = p;
+			best->n2 = n2;
+			best->r2 = r2;
+		}
+	} else if (a >= c && b < d) {
+		/* If A is below the threshold but B is above it?  Update. */
+		best->p = p;
+		best->n2 = n2;
+		best->r2 = r2;
+	} else if (a >= c && b >= d) {
+		/* Both are below the limit, so pick the higher n2/(r2*r2) */
+		if (n2 * best->r2 * best->r2 > best->n2 * r2 * r2) {
+			best->p = p;
+			best->n2 = n2;
+			best->r2 = r2;
+		}
+	}
+	/* Otherwise a < c && b >= d, do nothing */
+}
+
+static void
+wrpll_compute_rnp(int clock /* in Hz */,
+		  unsigned *r2_out, unsigned *n2_out, unsigned *p_out)
+{
+	uint64_t freq2k;
+	unsigned p, n2, r2;
+	struct wrpll_rnp best = { 0, 0, 0 };
+	unsigned budget;
+
+	freq2k = clock / 100;
+
+	budget = wrpll_get_budget_for_freq(clock);
+
+	/* Special case handling for 540 pixel clock: bypass WR PLL entirely
+	 * and directly pass the LC PLL to it. */
+	if (freq2k == 5400000) {
+		*n2_out = 2;
+		*p_out = 1;
+		*r2_out = 2;
+		return;
+	}
+
+	/*
+	 * Ref = LC_FREQ / R, where Ref is the actual reference input seen by
+	 * the WR PLL.
+	 *
+	 * We want R so that REF_MIN <= Ref <= REF_MAX.
+	 * Injecting R2 = 2 * R gives:
+	 *   REF_MAX * r2 > LC_FREQ * 2 and
+	 *   REF_MIN * r2 < LC_FREQ * 2
+	 *
+	 * Which means the desired boundaries for r2 are:
+	 *  LC_FREQ * 2 / REF_MAX < r2 < LC_FREQ * 2 / REF_MIN
+	 *
+	 */
+        for (r2 = LC_FREQ * 2 / REF_MAX + 1;
+	     r2 <= LC_FREQ * 2 / REF_MIN;
+	     r2++) {
+
+		/*
+		 * VCO = N * Ref, that is: VCO = N * LC_FREQ / R
+		 *
+		 * Once again we want VCO_MIN <= VCO <= VCO_MAX.
+		 * Injecting R2 = 2 * R and N2 = 2 * N, we get:
+		 *   VCO_MAX * r2 > n2 * LC_FREQ and
+		 *   VCO_MIN * r2 < n2 * LC_FREQ)
+		 *
+		 * Which means the desired boundaries for n2 are:
+		 * VCO_MIN * r2 / LC_FREQ < n2 < VCO_MAX * r2 / LC_FREQ
+		 */
+		for (n2 = VCO_MIN * r2 / LC_FREQ + 1;
+		     n2 <= VCO_MAX * r2 / LC_FREQ;
+		     n2++) {
+
+			for (p = P_MIN; p <= P_MAX; p += P_INC)
+				wrpll_update_rnp(freq2k, budget,
+						 r2, n2, p, &best);
+		}
+	}
+
+	*n2_out = best.n2;
+	*p_out = best.p;
+	*r2_out = best.r2;
+}
+
+/* WRPLL clock dividers */
+struct wrpll_tmds_clock {
+	uint32_t clock;
+	uint16_t p;		/* Post divider */
+	uint16_t n2;		/* Feedback divider */
+	uint16_t r2;		/* Reference divider */
+};
+
+/* Table of matching values for WRPLL clocks programming for each frequency.
+ * The code assumes this table is sorted. */
+static const struct wrpll_tmds_clock wrpll_tmds_clock_table[] = {
+	{19750000,	38,	25,	18},
+	{20000000,	48,	32,	18},
+	{21000000,	36,	21,	15},
+	{21912000,	42,	29,	17},
+	{22000000,	36,	22,	15},
+	{23000000,	36,	23,	15},
+	{23500000,	40,	40,	23},
+	{23750000,	26,	16,	14},
+	{24000000,	36,	24,	15},
+	{25000000,	36,	25,	15},
+	{25175000,	26,	40,	33},
+	{25200000,	30,	21,	15},
+	{26000000,	36,	26,	15},
+	{27000000,	30,	21,	14},
+	{27027000,	18,	100,	111},
+	{27500000,	30,	29,	19},
+	{28000000,	34,	30,	17},
+	{28320000,	26,	30,	22},
+	{28322000,	32,	42,	25},
+	{28750000,	24,	23,	18},
+	{29000000,	30,	29,	18},
+	{29750000,	32,	30,	17},
+	{30000000,	30,	25,	15},
+	{30750000,	30,	41,	24},
+	{31000000,	30,	31,	18},
+	{31500000,	30,	28,	16},
+	{32000000,	30,	32,	18},
+	{32500000,	28,	32,	19},
+	{33000000,	24,	22,	15},
+	{34000000,	28,	30,	17},
+	{35000000,	26,	32,	19},
+	{35500000,	24,	30,	19},
+	{36000000,	26,	26,	15},
+	{36750000,	26,	46,	26},
+	{37000000,	24,	23,	14},
+	{37762500,	22,	40,	26},
+	{37800000,	20,	21,	15},
+	{38000000,	24,	27,	16},
+	{38250000,	24,	34,	20},
+	{39000000,	24,	26,	15},
+	{40000000,	24,	32,	18},
+	{40500000,	20,	21,	14},
+	{40541000,	22,	147,	89},
+	{40750000,	18,	19,	14},
+	{41000000,	16,	17,	14},
+	{41500000,	22,	44,	26},
+	{41540000,	22,	44,	26},
+	{42000000,	18,	21,	15},
+	{42500000,	22,	45,	26},
+	{43000000,	20,	43,	27},
+	{43163000,	20,	24,	15},
+	{44000000,	18,	22,	15},
+	{44900000,	20,	108,	65},
+	{45000000,	20,	25,	15},
+	{45250000,	20,	52,	31},
+	{46000000,	18,	23,	15},
+	{46750000,	20,	45,	26},
+	{47000000,	20,	40,	23},
+	{48000000,	18,	24,	15},
+	{49000000,	18,	49,	30},
+	{49500000,	16,	22,	15},
+	{50000000,	18,	25,	15},
+	{50500000,	18,	32,	19},
+	{51000000,	18,	34,	20},
+	{52000000,	18,	26,	15},
+	{52406000,	14,	34,	25},
+	{53000000,	16,	22,	14},
+	{54000000,	16,	24,	15},
+	{54054000,	16,	173,	108},
+	{54500000,	14,	24,	17},
+	{55000000,	12,	22,	18},
+	{56000000,	14,	45,	31},
+	{56250000,	16,	25,	15},
+	{56750000,	14,	25,	17},
+	{57000000,	16,	27,	16},
+	{58000000,	16,	43,	25},
+	{58250000,	16,	38,	22},
+	{58750000,	16,	40,	23},
+	{59000000,	14,	26,	17},
+	{59341000,	14,	40,	26},
+	{59400000,	16,	44,	25},
+	{60000000,	16,	32,	18},
+	{60500000,	12,	39,	29},
+	{61000000,	14,	49,	31},
+	{62000000,	14,	37,	23},
+	{62250000,	14,	42,	26},
+	{63000000,	12,	21,	15},
+	{63500000,	14,	28,	17},
+	{64000000,	12,	27,	19},
+	{65000000,	14,	32,	19},
+	{65250000,	12,	29,	20},
+	{65500000,	12,	32,	22},
+	{66000000,	12,	22,	15},
+	{66667000,	14,	38,	22},
+	{66750000,	10,	21,	17},
+	{67000000,	14,	33,	19},
+	{67750000,	14,	58,	33},
+	{68000000,	14,	30,	17},
+	{68179000,	14,	46,	26},
+	{68250000,	14,	46,	26},
+	{69000000,	12,	23,	15},
+	{70000000,	12,	28,	18},
+	{71000000,	12,	30,	19},
+	{72000000,	12,	24,	15},
+	{73000000,	10,	23,	17},
+	{74000000,	12,	23,	14},
+	{74176000,	8,	100,	91},
+	{74250000,	10,	22,	16},
+	{74481000,	12,	43,	26},
+	{74500000,	10,	29,	21},
+	{75000000,	12,	25,	15},
+	{75250000,	10,	39,	28},
+	{76000000,	12,	27,	16},
+	{77000000,	12,	53,	31},
+	{78000000,	12,	26,	15},
+	{78750000,	12,	28,	16},
+	{79000000,	10,	38,	26},
+	{79500000,	10,	28,	19},
+	{80000000,	12,	32,	18},
+	{81000000,	10,	21,	14},
+	{81081000,	6,	100,	111},
+	{81624000,	8,	29,	24},
+	{82000000,	8,	17,	14},
+	{83000000,	10,	40,	26},
+	{83950000,	10,	28,	18},
+	{84000000,	10,	28,	18},
+	{84750000,	6,	16,	17},
+	{85000000,	6,	17,	18},
+	{85250000,	10,	30,	19},
+	{85750000,	10,	27,	17},
+	{86000000,	10,	43,	27},
+	{87000000,	10,	29,	18},
+	{88000000,	10,	44,	27},
+	{88500000,	10,	41,	25},
+	{89000000,	10,	28,	17},
+	{89012000,	6,	90,	91},
+	{89100000,	10,	33,	20},
+	{90000000,	10,	25,	15},
+	{91000000,	10,	32,	19},
+	{92000000,	10,	46,	27},
+	{93000000,	10,	31,	18},
+	{94000000,	10,	40,	23},
+	{94500000,	10,	28,	16},
+	{95000000,	10,	44,	25},
+	{95654000,	10,	39,	22},
+	{95750000,	10,	39,	22},
+	{96000000,	10,	32,	18},
+	{97000000,	8,	23,	16},
+	{97750000,	8,	42,	29},
+	{98000000,	8,	45,	31},
+	{99000000,	8,	22,	15},
+	{99750000,	8,	34,	23},
+	{100000000,	6,	20,	18},
+	{100500000,	6,	19,	17},
+	{101000000,	6,	37,	33},
+	{101250000,	8,	21,	14},
+	{102000000,	6,	17,	15},
+	{102250000,	6,	25,	22},
+	{103000000,	8,	29,	19},
+	{104000000,	8,	37,	24},
+	{105000000,	8,	28,	18},
+	{106000000,	8,	22,	14},
+	{107000000,	8,	46,	29},
+	{107214000,	8,	27,	17},
+	{108000000,	8,	24,	15},
+	{108108000,	8,	173,	108},
+	{109000000,	6,	23,	19},
+	{110000000,	6,	22,	18},
+	{110013000,	6,	22,	18},
+	{110250000,	8,	49,	30},
+	{110500000,	8,	36,	22},
+	{111000000,	8,	23,	14},
+	{111264000,	8,	150,	91},
+	{111375000,	8,	33,	20},
+	{112000000,	8,	63,	38},
+	{112500000,	8,	25,	15},
+	{113100000,	8,	57,	34},
+	{113309000,	8,	42,	25},
+	{114000000,	8,	27,	16},
+	{115000000,	6,	23,	18},
+	{116000000,	8,	43,	25},
+	{117000000,	8,	26,	15},
+	{117500000,	8,	40,	23},
+	{118000000,	6,	38,	29},
+	{119000000,	8,	30,	17},
+	{119500000,	8,	46,	26},
+	{119651000,	8,	39,	22},
+	{120000000,	8,	32,	18},
+	{121000000,	6,	39,	29},
+	{121250000,	6,	31,	23},
+	{121750000,	6,	23,	17},
+	{122000000,	6,	42,	31},
+	{122614000,	6,	30,	22},
+	{123000000,	6,	41,	30},
+	{123379000,	6,	37,	27},
+	{124000000,	6,	51,	37},
+	{125000000,	6,	25,	18},
+	{125250000,	4,	13,	14},
+	{125750000,	4,	27,	29},
+	{126000000,	6,	21,	15},
+	{127000000,	6,	24,	17},
+	{127250000,	6,	41,	29},
+	{128000000,	6,	27,	19},
+	{129000000,	6,	43,	30},
+	{129859000,	4,	25,	26},
+	{130000000,	6,	26,	18},
+	{130250000,	6,	42,	29},
+	{131000000,	6,	32,	22},
+	{131500000,	6,	38,	26},
+	{131850000,	6,	41,	28},
+	{132000000,	6,	22,	15},
+	{132750000,	6,	28,	19},
+	{133000000,	6,	34,	23},
+	{133330000,	6,	37,	25},
+	{134000000,	6,	61,	41},
+	{135000000,	6,	21,	14},
+	{135250000,	6,	167,	111},
+	{136000000,	6,	62,	41},
+	{137000000,	6,	35,	23},
+	{138000000,	6,	23,	15},
+	{138500000,	6,	40,	26},
+	{138750000,	6,	37,	24},
+	{139000000,	6,	34,	22},
+	{139050000,	6,	34,	22},
+	{139054000,	6,	34,	22},
+	{140000000,	6,	28,	18},
+	{141000000,	6,	36,	23},
+	{141500000,	6,	22,	14},
+	{142000000,	6,	30,	19},
+	{143000000,	6,	27,	17},
+	{143472000,	4,	17,	16},
+	{144000000,	6,	24,	15},
+	{145000000,	6,	29,	18},
+	{146000000,	6,	47,	29},
+	{146250000,	6,	26,	16},
+	{147000000,	6,	49,	30},
+	{147891000,	6,	23,	14},
+	{148000000,	6,	23,	14},
+	{148250000,	6,	28,	17},
+	{148352000,	4,	100,	91},
+	{148500000,	6,	33,	20},
+	{149000000,	6,	48,	29},
+	{150000000,	6,	25,	15},
+	{151000000,	4,	19,	17},
+	{152000000,	6,	27,	16},
+	{152280000,	6,	44,	26},
+	{153000000,	6,	34,	20},
+	{154000000,	6,	53,	31},
+	{155000000,	6,	31,	18},
+	{155250000,	6,	50,	29},
+	{155750000,	6,	45,	26},
+	{156000000,	6,	26,	15},
+	{157000000,	6,	61,	35},
+	{157500000,	6,	28,	16},
+	{158000000,	6,	65,	37},
+	{158250000,	6,	44,	25},
+	{159000000,	6,	53,	30},
+	{159500000,	6,	39,	22},
+	{160000000,	6,	32,	18},
+	{161000000,	4,	31,	26},
+	{162000000,	4,	18,	15},
+	{162162000,	4,	131,	109},
+	{162500000,	4,	53,	44},
+	{163000000,	4,	29,	24},
+	{164000000,	4,	17,	14},
+	{165000000,	4,	22,	18},
+	{166000000,	4,	32,	26},
+	{167000000,	4,	26,	21},
+	{168000000,	4,	46,	37},
+	{169000000,	4,	104,	83},
+	{169128000,	4,	64,	51},
+	{169500000,	4,	39,	31},
+	{170000000,	4,	34,	27},
+	{171000000,	4,	19,	15},
+	{172000000,	4,	51,	40},
+	{172750000,	4,	32,	25},
+	{172800000,	4,	32,	25},
+	{173000000,	4,	41,	32},
+	{174000000,	4,	49,	38},
+	{174787000,	4,	22,	17},
+	{175000000,	4,	35,	27},
+	{176000000,	4,	30,	23},
+	{177000000,	4,	38,	29},
+	{178000000,	4,	29,	22},
+	{178500000,	4,	37,	28},
+	{179000000,	4,	53,	40},
+	{179500000,	4,	73,	55},
+	{180000000,	4,	20,	15},
+	{181000000,	4,	55,	41},
+	{182000000,	4,	31,	23},
+	{183000000,	4,	42,	31},
+	{184000000,	4,	30,	22},
+	{184750000,	4,	26,	19},
+	{185000000,	4,	37,	27},
+	{186000000,	4,	51,	37},
+	{187000000,	4,	36,	26},
+	{188000000,	4,	32,	23},
+	{189000000,	4,	21,	15},
+	{190000000,	4,	38,	27},
+	{190960000,	4,	41,	29},
+	{191000000,	4,	41,	29},
+	{192000000,	4,	27,	19},
+	{192250000,	4,	37,	26},
+	{193000000,	4,	20,	14},
+	{193250000,	4,	53,	37},
+	{194000000,	4,	23,	16},
+	{194208000,	4,	23,	16},
+	{195000000,	4,	26,	18},
+	{196000000,	4,	45,	31},
+	{197000000,	4,	35,	24},
+	{197750000,	4,	41,	28},
+	{198000000,	4,	22,	15},
+	{198500000,	4,	25,	17},
+	{199000000,	4,	28,	19},
+	{200000000,	4,	37,	25},
+	{201000000,	4,	61,	41},
+	{202000000,	4,	112,	75},
+	{202500000,	4,	21,	14},
+	{203000000,	4,	146,	97},
+	{204000000,	4,	62,	41},
+	{204750000,	4,	44,	29},
+	{205000000,	4,	38,	25},
+	{206000000,	4,	29,	19},
+	{207000000,	4,	23,	15},
+	{207500000,	4,	40,	26},
+	{208000000,	4,	37,	24},
+	{208900000,	4,	48,	31},
+	{209000000,	4,	48,	31},
+	{209250000,	4,	31,	20},
+	{210000000,	4,	28,	18},
+	{211000000,	4,	25,	16},
+	{212000000,	4,	22,	14},
+	{213000000,	4,	30,	19},
+	{213750000,	4,	38,	24},
+	{214000000,	4,	46,	29},
+	{214750000,	4,	35,	22},
+	{215000000,	4,	43,	27},
+	{216000000,	4,	24,	15},
+	{217000000,	4,	37,	23},
+	{218000000,	4,	42,	26},
+	{218250000,	4,	42,	26},
+	{218750000,	4,	34,	21},
+	{219000000,	4,	47,	29},
+	{220000000,	4,	44,	27},
+	{220640000,	4,	49,	30},
+	{220750000,	4,	36,	22},
+	{221000000,	4,	36,	22},
+	{222000000,	4,	23,	14},
+	{222525000,	4,	150,	91},
+	{222750000,	4,	33,	20},
+	{227000000,	4,	37,	22},
+	{230250000,	4,	29,	17},
+	{233500000,	4,	38,	22},
+	{235000000,	4,	40,	23},
+	{238000000,	4,	30,	17},
+	{241500000,	2,	17,	19},
+	{245250000,	2,	20,	22},
+	{247750000,	2,	22,	24},
+	{253250000,	2,	15,	16},
+	{256250000,	2,	18,	19},
+	{262500000,	2,	31,	32},
+	{267250000,	2,	66,	67},
+	{268500000,	2,	94,	95},
+	{270000000,	2,	14,	14},
+	{272500000,	2,	77,	76},
+	{273750000,	2,	57,	56},
+	{280750000,	2,	24,	23},
+	{281250000,	2,	23,	22},
+	{286000000,	2,	17,	16},
+	{291750000,	2,	26,	24},
+	{296703000,	2,	100,	91},
+	{297000000,	2,	22,	20},
+	{298000000,	2,	21,	19},
+};
+
+int main(void)
+{
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(wrpll_tmds_clock_table); i++) {
+		const struct wrpll_tmds_clock *ref = &wrpll_tmds_clock_table[i];
+		unsigned r2, n2, p;
+
+		wrpll_compute_rnp(ref->clock, &r2, &n2, &p);
+		igt_fail_on_f(ref->r2 != r2 || ref->n2 != n2 || ref->p != p,
+			      "Computed value differs for %li Hz:\n""  Reference: (%u,%u,%u)\n""  Computed:  (%u,%u,%u)\n", (int64_t)ref->clock * 1000, ref->r2, ref->n2, ref->p, r2, n2, p);
+	}
+
+	return 0;
+}
diff --git a/tools/skl_ddb_allocation.c b/tools/skl_ddb_allocation.c
new file mode 100644
index 000000000000..4d8e6d185ee7
--- /dev/null
+++ b/tools/skl_ddb_allocation.c
@@ -0,0 +1,424 @@
+#include <stdint.h>
+#include <stdio.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <string.h>
+
+/**
+ * container_of - cast a member of a structure out to the containing structure
+ * @ptr:	the pointer to the member.
+ * @type:	the type of the container struct this is embedded in.
+ * @member:	the name of the member within the struct.
+ *
+ */
+#define container_of(ptr, type, member) ({			\
+	typeof( ((type *)0)->member ) *__mptr = (ptr);	\
+	(type *)( (char *)__mptr - offsetof(type,member) );})
+
+#define div_u64(a, b)	((a) / (b))
+
+/*
+ * Stub a few defines/structures
+ */
+
+#define I915_MAX_PIPES	3
+#define I915_MAX_PLANES	3
+#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
+
+#define for_each_pipe(p) for ((p) = 0; (p) < 3; (p)++)
+#define for_each_plane(pipe, p) for ((p) = 0; (p) < 3; (p)++)
+
+#define for_each_crtc(dev, crtc) \
+	for (int i = 0; i < 3 && (crtc = &crtcs[i].base); i++)
+
+#define for_each_intel_crtc(dev, intel_crtc) \
+	for (int i = 0; i < 3, intel_crtc = &crtcs[i]; i++)
+
+enum pipe {
+	PIPE_A,
+	PIPE_B,
+	PIPE_C,
+};
+
+enum plane {
+	PLANE_1,
+	PLANE_2,
+	PLANE_3,
+};
+
+#define pipe_name(p) ((p) + 'A')
+
+struct drm_device {
+	void *dev_private;
+};
+
+struct drm_i915_private {
+	struct drm_device *dev;
+};
+
+struct drm_crtc {
+	struct drm_device *dev;
+	bool active;
+};
+
+static bool intel_crtc_active(struct drm_crtc *crtc)
+{
+	return crtc->active;
+}
+
+struct intel_crtc {
+	struct drm_crtc base;
+	enum pipe pipe;
+};
+
+static int intel_num_planes(struct intel_crtc *crtc)
+{
+	return 3;
+}
+
+struct intel_crtc crtcs[I915_MAX_PIPES];
+
+#define to_intel_crtc(x) container_of(x, struct intel_crtc, base)
+
+/*
+ * DDB code
+ */
+
+struct intel_wm_config {
+	unsigned int num_pipes_active;
+};
+
+struct intel_plane_wm_parameters {
+	uint32_t horiz_pixels;
+	uint32_t vert_pixels;
+	uint8_t bytes_per_pixel;
+	bool enabled;
+	bool scaled;
+};
+
+struct skl_pipe_wm_parameters {
+	bool active;
+	uint32_t pipe_htotal;
+	uint32_t pixel_rate; /* in KHz */
+	struct intel_plane_wm_parameters plane[I915_MAX_PLANES];
+	struct intel_plane_wm_parameters cursor;
+};
+
+struct skl_ddb_entry {
+	uint16_t start, end;	/* in number of blocks. 'end' is exclusive */
+};
+
+static inline uint16_t skl_ddb_entry_size(const struct skl_ddb_entry *entry)
+{
+	/* end not set, clearly no allocation here. start can be 0 though */
+	if (entry->end == 0)
+		return 0;
+
+	return entry->end - entry->start;
+}
+
+static inline bool skl_ddb_entry_equal(const struct skl_ddb_entry *e1,
+				       const struct skl_ddb_entry *e2)
+{
+	if (e1->start == e2->start && e1->end == e2->end)
+		return true;
+
+	return false;
+}
+
+struct skl_ddb_allocation {
+	struct skl_ddb_entry plane[I915_MAX_PIPES][I915_MAX_PLANES];
+	struct skl_ddb_entry cursor[I915_MAX_PIPES];
+};
+
+/*
+ * On gen9, we need to allocate Display Data Buffer (DDB) portions to the
+ * different active planes.
+ */
+
+#define SKL_DDB_SIZE		896	/* in blocks */
+
+static void
+skl_ddb_get_pipe_allocation_limits(struct drm_device *dev,
+				   struct drm_crtc *for_crtc,
+				   const struct intel_wm_config *config,
+				   const struct skl_pipe_wm_parameters *params,
+				   struct skl_ddb_entry *alloc /* out */)
+{
+	struct drm_crtc *crtc;
+	unsigned int pipe_size, ddb_size;
+	int nth_active_pipe;
+
+	if (!params->active) {
+		alloc->start = 0;
+		alloc->end = 0;
+		return;
+	}
+
+	ddb_size = SKL_DDB_SIZE;
+	ddb_size -= 4; /* 4 blocks for bypass path allocation */
+
+	nth_active_pipe = 0;
+	for_each_crtc(dev, crtc) {
+		if (!intel_crtc_active(crtc))
+			continue;
+
+		if (crtc == for_crtc)
+			break;
+
+		nth_active_pipe++;
+	}
+
+	pipe_size = ddb_size / config->num_pipes_active;
+	alloc->start = nth_active_pipe * ddb_size / config->num_pipes_active;
+	alloc->end = alloc->start + pipe_size;
+}
+
+static unsigned int skl_cursor_allocation(const struct intel_wm_config *config)
+{
+	if (config->num_pipes_active == 1)
+		return 32;
+
+	return 8;
+}
+
+static unsigned int
+skl_plane_relative_data_rate(const struct intel_plane_wm_parameters *p)
+{
+	return p->horiz_pixels * p->vert_pixels * p->bytes_per_pixel;
+}
+
+/*
+ * We don't overflow 32 bits. Worst case is 3 planes enabled, each fetching
+ * a 8192x4096 at 32bpp framebuffer:
+ *   3 * 4096 * 8192  * 4 < 2^32
+ */
+static unsigned int
+skl_get_total_relative_data_rate(struct intel_crtc *intel_crtc,
+				 const struct skl_pipe_wm_parameters *params)
+{
+	unsigned int total_data_rate = 0;
+	int plane;
+
+	for (plane = 0; plane < intel_num_planes(intel_crtc); plane++) {
+		const struct intel_plane_wm_parameters *p;
+
+		p = &params->plane[plane];
+		if (!p->enabled)
+			continue;
+
+		total_data_rate += skl_plane_relative_data_rate(p);
+	}
+
+	return total_data_rate;
+}
+
+static void
+skl_allocate_pipe_ddb(struct drm_crtc *crtc,
+		      const struct intel_wm_config *config,
+		      const struct skl_pipe_wm_parameters *params,
+		      struct skl_ddb_allocation *ddb /* out */)
+{
+	struct drm_device *dev = crtc->dev;
+	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
+	enum pipe pipe = intel_crtc->pipe;
+	struct skl_ddb_entry alloc;
+	uint16_t alloc_size, start, cursor_blocks;
+	uint16_t minimum[I915_MAX_PLANES];
+	unsigned int total_data_rate;
+	int plane;
+
+	skl_ddb_get_pipe_allocation_limits(dev, crtc, config, params, &alloc);
+	alloc_size = skl_ddb_entry_size(&alloc);
+	if (alloc_size == 0) {
+		memset(ddb->plane[pipe], 0, sizeof(ddb->plane[pipe]));
+		memset(&ddb->cursor[pipe], 0, sizeof(ddb->cursor[pipe]));
+		return;
+	}
+
+	cursor_blocks = skl_cursor_allocation(config);
+	ddb->cursor[pipe].start = alloc.end - cursor_blocks;
+	ddb->cursor[pipe].end = alloc.end;
+
+	alloc_size -= cursor_blocks;
+	alloc.end -= cursor_blocks;
+
+	/* 1. Allocate the mininum required blocks for each active plane */
+	for_each_plane(pipe, plane) {
+		const struct intel_plane_wm_parameters *p;
+
+		p = &params->plane[plane];
+		if (!p->enabled)
+			continue;
+
+		minimum[plane] = 8;
+		alloc_size -= minimum[plane];
+	}
+
+	/*
+	 * 2. Distribute the remaining space in proportion to the amount of
+	 * data each plane needs to fetch from memory.
+	 *
+	 * FIXME: we may not allocate every single block here.
+	 */
+	total_data_rate = skl_get_total_relative_data_rate(intel_crtc, params);
+
+	start = alloc.start;
+	for (plane = 0; plane < intel_num_planes(intel_crtc); plane++) {
+		const struct intel_plane_wm_parameters *p;
+		unsigned int data_rate;
+		uint16_t plane_blocks;
+
+		p = &params->plane[plane];
+		if (!p->enabled)
+			continue;
+
+		data_rate = skl_plane_relative_data_rate(p);
+
+		/*
+		 * promote the expression to 64 bits to avoid overflowing, the
+		 * result is < available as data_rate / total_data_rate < 1
+		 */
+		plane_blocks = minimum[plane];
+		plane_blocks += div_u64((uint64_t)alloc_size * data_rate,
+					total_data_rate);
+
+		ddb->plane[pipe][plane].start = start;
+		ddb->plane[pipe][plane].end = start + plane_blocks;
+
+		start += plane_blocks;
+	}
+
+}
+
+static void skl_ddb_check_entry(struct skl_ddb_entry *entry, int16_t *cursor)
+{
+
+	if (skl_ddb_entry_size(entry) == 0)
+		return;
+
+	/* check that ->start is the next available block */
+	if (entry->start < *cursor)
+		printf("error: allocation overlaps previous block\n");
+	else if (entry->start >= *cursor + 1)
+		printf("warning: allocation leaves a hole\n");
+
+	*cursor = entry->end;
+}
+
+static void skl_ddb_check_last_allocation(int16_t cursor)
+{
+	uint16_t last_offset = SKL_DDB_SIZE - 4;
+
+	if (cursor < last_offset)
+		printf("warning: %d blocks not allocated\n",
+		       last_offset - cursor);
+	else if (cursor > last_offset)
+		printf("error: allocation greater than available space\n");
+}
+
+static void skl_ddb_print(struct skl_ddb_allocation *ddb)
+{
+	struct skl_ddb_entry *entry;
+	enum pipe pipe;
+	int plane;
+	int16_t cursor = 0;
+
+	printf("%-15s%8s%8s%8s\n", "", "Start", "End", "Size");
+
+	for_each_pipe(pipe) {
+		printf("Pipe %c\n", pipe_name(pipe));
+
+		for_each_plane(pipe, plane) {
+			entry = &ddb->plane[pipe][plane];
+
+			printf("  Plane%-8d%8u%8u%8u\n", plane + 1,
+			       entry->start, entry->end,
+			       skl_ddb_entry_size(entry));
+
+			skl_ddb_check_entry(entry, &cursor);
+		}
+
+		entry = &ddb->cursor[pipe];
+		printf("  %-13s%8u%8u%8u\n", "Cursor", entry->start,
+		       entry->end, skl_ddb_entry_size(entry));
+
+		skl_ddb_check_entry(entry, &cursor);
+	}
+
+	skl_ddb_check_last_allocation(cursor);
+}
+
+static struct drm_device drm_device;
+static struct drm_i915_private drm_i915_private;
+
+static void init_stub(void)
+{
+	int i;
+
+	drm_device.dev_private = &drm_i915_private;
+	drm_i915_private.dev = &drm_device;
+
+	for (i = 0; i < I915_MAX_PIPES; i++) {
+		crtcs[i].base.dev = &drm_device;
+		crtcs[i].pipe = i;
+	}
+}
+
+struct wm_input {
+	struct intel_wm_config config;
+	struct skl_pipe_wm_parameters params[I915_MAX_PIPES];
+};
+
+static void wm_input_reset(struct wm_input *in)
+{
+	memset(in, 0, sizeof(*in));
+}
+
+static void wm_enable_plane(struct wm_input *in,
+			    enum pipe pipe, enum plane plane,
+			    uint32_t width, uint32_t height, int bpp)
+{
+	enum pipe i;
+
+	in->params[pipe].active = 1;
+
+	in->config.num_pipes_active = 0;
+	for_each_pipe(i)
+		if (in->params[i].active)
+			in->config.num_pipes_active++;
+
+	in->params[pipe].plane[plane].horiz_pixels = width;
+	in->params[pipe].plane[plane].vert_pixels = height;
+	in->params[pipe].plane[plane].bytes_per_pixel = bpp;
+	in->params[pipe].plane[plane].enabled = true;
+}
+
+static void skl_ddb_allocate(struct wm_input *in,
+			     struct skl_ddb_allocation *out)
+{
+	struct drm_crtc *crtc;
+
+	for_each_crtc(, crtc) {
+		enum pipe pipe = to_intel_crtc(crtc)->pipe;
+
+		skl_allocate_pipe_ddb(crtc,
+				      &in->config, &in->params[pipe], out);
+	}
+}
+
+int main(int argc, char **argv)
+{
+	struct wm_input in;
+	static struct skl_ddb_allocation ddb;
+
+	init_stub();
+
+	wm_input_reset(&in);
+	wm_enable_plane(&in, PIPE_A, PLANE_1, 1280, 1024, 4);
+	wm_enable_plane(&in, PIPE_A, PLANE_2,  100,  100, 4);
+	skl_ddb_allocate(&in, &ddb);
+	skl_ddb_print(&ddb);
+
+	return 0;
+}
-- 
2.1.1




More information about the Intel-gfx mailing list