xref: /linux/drivers/gpu/drm/i915/display/skl_prefill.c (revision 24f171c7e145f43b9f187578e89b0982ce87e54c)
1*ba470a99SVille Syrjälä // SPDX-License-Identifier: MIT
2*ba470a99SVille Syrjälä /*
3*ba470a99SVille Syrjälä  * Copyright © 2025 Intel Corporation
4*ba470a99SVille Syrjälä  */
5*ba470a99SVille Syrjälä 
6*ba470a99SVille Syrjälä #include <linux/debugfs.h>
7*ba470a99SVille Syrjälä 
8*ba470a99SVille Syrjälä #include <drm/drm_print.h>
9*ba470a99SVille Syrjälä 
10*ba470a99SVille Syrjälä #include "intel_cdclk.h"
11*ba470a99SVille Syrjälä #include "intel_display_core.h"
12*ba470a99SVille Syrjälä #include "intel_display_types.h"
13*ba470a99SVille Syrjälä #include "intel_vblank.h"
14*ba470a99SVille Syrjälä #include "intel_vdsc.h"
15*ba470a99SVille Syrjälä #include "skl_prefill.h"
16*ba470a99SVille Syrjälä #include "skl_scaler.h"
17*ba470a99SVille Syrjälä #include "skl_watermark.h"
18*ba470a99SVille Syrjälä 
19*ba470a99SVille Syrjälä static unsigned int prefill_usecs_to_lines(const struct intel_crtc_state *crtc_state,
20*ba470a99SVille Syrjälä 					   unsigned int usecs)
21*ba470a99SVille Syrjälä {
22*ba470a99SVille Syrjälä 	const struct drm_display_mode *pipe_mode = &crtc_state->hw.pipe_mode;
23*ba470a99SVille Syrjälä 
24*ba470a99SVille Syrjälä 	return DIV_ROUND_UP_ULL(mul_u32_u32(pipe_mode->crtc_clock, usecs << 16),
25*ba470a99SVille Syrjälä 				pipe_mode->crtc_htotal * 1000);
26*ba470a99SVille Syrjälä }
27*ba470a99SVille Syrjälä 
28*ba470a99SVille Syrjälä static void prefill_init(struct skl_prefill_ctx *ctx,
29*ba470a99SVille Syrjälä 			 const struct intel_crtc_state *crtc_state)
30*ba470a99SVille Syrjälä {
31*ba470a99SVille Syrjälä 	memset(ctx, 0, sizeof(*ctx));
32*ba470a99SVille Syrjälä 
33*ba470a99SVille Syrjälä 	ctx->prefill.fixed = crtc_state->framestart_delay << 16;
34*ba470a99SVille Syrjälä 
35*ba470a99SVille Syrjälä 	/* 20 usec for translation walks/etc. */
36*ba470a99SVille Syrjälä 	ctx->prefill.fixed += prefill_usecs_to_lines(crtc_state, 20);
37*ba470a99SVille Syrjälä 
38*ba470a99SVille Syrjälä 	ctx->prefill.dsc = intel_vdsc_prefill_lines(crtc_state);
39*ba470a99SVille Syrjälä }
40*ba470a99SVille Syrjälä 
41*ba470a99SVille Syrjälä static void prefill_init_nocdclk_worst(struct skl_prefill_ctx *ctx,
42*ba470a99SVille Syrjälä 				       const struct intel_crtc_state *crtc_state)
43*ba470a99SVille Syrjälä {
44*ba470a99SVille Syrjälä 	prefill_init(ctx, crtc_state);
45*ba470a99SVille Syrjälä 
46*ba470a99SVille Syrjälä 	ctx->prefill.wm0 = skl_wm0_prefill_lines_worst(crtc_state);
47*ba470a99SVille Syrjälä 	ctx->prefill.scaler_1st = skl_scaler_1st_prefill_lines_worst(crtc_state);
48*ba470a99SVille Syrjälä 	ctx->prefill.scaler_2nd = skl_scaler_2nd_prefill_lines_worst(crtc_state);
49*ba470a99SVille Syrjälä 
50*ba470a99SVille Syrjälä 	ctx->adj.scaler_1st = skl_scaler_1st_prefill_adjustment_worst(crtc_state);
51*ba470a99SVille Syrjälä 	ctx->adj.scaler_2nd = skl_scaler_2nd_prefill_adjustment_worst(crtc_state);
52*ba470a99SVille Syrjälä }
53*ba470a99SVille Syrjälä 
54*ba470a99SVille Syrjälä static void prefill_init_nocdclk(struct skl_prefill_ctx *ctx,
55*ba470a99SVille Syrjälä 				 const struct intel_crtc_state *crtc_state)
56*ba470a99SVille Syrjälä {
57*ba470a99SVille Syrjälä 	prefill_init(ctx, crtc_state);
58*ba470a99SVille Syrjälä 
59*ba470a99SVille Syrjälä 	ctx->prefill.wm0 = skl_wm0_prefill_lines(crtc_state);
60*ba470a99SVille Syrjälä 	ctx->prefill.scaler_1st = skl_scaler_1st_prefill_lines(crtc_state);
61*ba470a99SVille Syrjälä 	ctx->prefill.scaler_2nd = skl_scaler_2nd_prefill_lines(crtc_state);
62*ba470a99SVille Syrjälä 
63*ba470a99SVille Syrjälä 	ctx->adj.scaler_1st = skl_scaler_1st_prefill_adjustment(crtc_state);
64*ba470a99SVille Syrjälä 	ctx->adj.scaler_2nd = skl_scaler_2nd_prefill_adjustment(crtc_state);
65*ba470a99SVille Syrjälä }
66*ba470a99SVille Syrjälä 
67*ba470a99SVille Syrjälä static unsigned int prefill_adjust(unsigned int value, unsigned int factor)
68*ba470a99SVille Syrjälä {
69*ba470a99SVille Syrjälä 	return DIV_ROUND_UP_ULL(mul_u32_u32(value, factor), 0x10000);
70*ba470a99SVille Syrjälä }
71*ba470a99SVille Syrjälä 
72*ba470a99SVille Syrjälä static unsigned int prefill_lines_nocdclk(const struct skl_prefill_ctx *ctx)
73*ba470a99SVille Syrjälä {
74*ba470a99SVille Syrjälä 	unsigned int prefill = 0;
75*ba470a99SVille Syrjälä 
76*ba470a99SVille Syrjälä 	prefill += ctx->prefill.dsc;
77*ba470a99SVille Syrjälä 	prefill = prefill_adjust(prefill, ctx->adj.scaler_2nd);
78*ba470a99SVille Syrjälä 
79*ba470a99SVille Syrjälä 	prefill += ctx->prefill.scaler_2nd;
80*ba470a99SVille Syrjälä 	prefill = prefill_adjust(prefill, ctx->adj.scaler_1st);
81*ba470a99SVille Syrjälä 
82*ba470a99SVille Syrjälä 	prefill += ctx->prefill.scaler_1st;
83*ba470a99SVille Syrjälä 	prefill += ctx->prefill.wm0;
84*ba470a99SVille Syrjälä 
85*ba470a99SVille Syrjälä 	return prefill;
86*ba470a99SVille Syrjälä }
87*ba470a99SVille Syrjälä 
88*ba470a99SVille Syrjälä static unsigned int prefill_lines_cdclk(const struct skl_prefill_ctx *ctx)
89*ba470a99SVille Syrjälä {
90*ba470a99SVille Syrjälä 	return prefill_adjust(prefill_lines_nocdclk(ctx), ctx->adj.cdclk);
91*ba470a99SVille Syrjälä }
92*ba470a99SVille Syrjälä 
93*ba470a99SVille Syrjälä static unsigned int prefill_lines_full(const struct skl_prefill_ctx *ctx)
94*ba470a99SVille Syrjälä {
95*ba470a99SVille Syrjälä 	return ctx->prefill.fixed + prefill_lines_cdclk(ctx);
96*ba470a99SVille Syrjälä }
97*ba470a99SVille Syrjälä 
98*ba470a99SVille Syrjälä void skl_prefill_init_worst(struct skl_prefill_ctx *ctx,
99*ba470a99SVille Syrjälä 			    const struct intel_crtc_state *crtc_state)
100*ba470a99SVille Syrjälä {
101*ba470a99SVille Syrjälä 	prefill_init_nocdclk_worst(ctx, crtc_state);
102*ba470a99SVille Syrjälä 
103*ba470a99SVille Syrjälä 	ctx->adj.cdclk = intel_cdclk_prefill_adjustment_worst(crtc_state);
104*ba470a99SVille Syrjälä 
105*ba470a99SVille Syrjälä 	ctx->prefill.full = prefill_lines_full(ctx);
106*ba470a99SVille Syrjälä }
107*ba470a99SVille Syrjälä 
108*ba470a99SVille Syrjälä void skl_prefill_init(struct skl_prefill_ctx *ctx,
109*ba470a99SVille Syrjälä 		      const struct intel_crtc_state *crtc_state)
110*ba470a99SVille Syrjälä {
111*ba470a99SVille Syrjälä 	prefill_init_nocdclk(ctx, crtc_state);
112*ba470a99SVille Syrjälä 
113*ba470a99SVille Syrjälä 	ctx->adj.cdclk = intel_cdclk_prefill_adjustment(crtc_state);
114*ba470a99SVille Syrjälä 
115*ba470a99SVille Syrjälä 	ctx->prefill.full = prefill_lines_full(ctx);
116*ba470a99SVille Syrjälä }
117*ba470a99SVille Syrjälä 
118*ba470a99SVille Syrjälä static unsigned int prefill_lines_with_latency(const struct skl_prefill_ctx *ctx,
119*ba470a99SVille Syrjälä 					       const struct intel_crtc_state *crtc_state,
120*ba470a99SVille Syrjälä 					       unsigned int latency_us)
121*ba470a99SVille Syrjälä {
122*ba470a99SVille Syrjälä 	return ctx->prefill.full + prefill_usecs_to_lines(crtc_state, latency_us);
123*ba470a99SVille Syrjälä }
124*ba470a99SVille Syrjälä 
125*ba470a99SVille Syrjälä int skl_prefill_min_guardband(const struct skl_prefill_ctx *ctx,
126*ba470a99SVille Syrjälä 			      const struct intel_crtc_state *crtc_state,
127*ba470a99SVille Syrjälä 			      unsigned int latency_us)
128*ba470a99SVille Syrjälä {
129*ba470a99SVille Syrjälä 	unsigned int prefill = prefill_lines_with_latency(ctx, crtc_state, latency_us);
130*ba470a99SVille Syrjälä 
131*ba470a99SVille Syrjälä 	return DIV_ROUND_UP(prefill, 0x10000);
132*ba470a99SVille Syrjälä }
133*ba470a99SVille Syrjälä 
134*ba470a99SVille Syrjälä static unsigned int prefill_guardband(const struct intel_crtc_state *crtc_state)
135*ba470a99SVille Syrjälä {
136*ba470a99SVille Syrjälä 	return intel_crtc_vblank_length(crtc_state) << 16;
137*ba470a99SVille Syrjälä }
138*ba470a99SVille Syrjälä 
139*ba470a99SVille Syrjälä bool skl_prefill_vblank_too_short(const struct skl_prefill_ctx *ctx,
140*ba470a99SVille Syrjälä 				  const struct intel_crtc_state *crtc_state,
141*ba470a99SVille Syrjälä 				  unsigned int latency_us)
142*ba470a99SVille Syrjälä {
143*ba470a99SVille Syrjälä 	unsigned int guardband = prefill_guardband(crtc_state);
144*ba470a99SVille Syrjälä 	unsigned int prefill = prefill_lines_with_latency(ctx, crtc_state, latency_us);
145*ba470a99SVille Syrjälä 
146*ba470a99SVille Syrjälä 	return guardband < prefill;
147*ba470a99SVille Syrjälä }
148*ba470a99SVille Syrjälä 
149*ba470a99SVille Syrjälä int skl_prefill_min_cdclk(const struct skl_prefill_ctx *ctx,
150*ba470a99SVille Syrjälä 			  const struct intel_crtc_state *crtc_state)
151*ba470a99SVille Syrjälä {
152*ba470a99SVille Syrjälä 	unsigned int prefill_unadjusted = prefill_lines_nocdclk(ctx);
153*ba470a99SVille Syrjälä 	unsigned int prefill_available = prefill_guardband(crtc_state) - ctx->prefill.fixed;
154*ba470a99SVille Syrjälä 
155*ba470a99SVille Syrjälä 	return intel_cdclk_min_cdclk_for_prefill(crtc_state, prefill_unadjusted,
156*ba470a99SVille Syrjälä 						 prefill_available);
157*ba470a99SVille Syrjälä }
158