xref: /linux/drivers/gpu/drm/i915/display/intel_bw.c (revision ee8f7484f99db9fb80ad15af412dbf03eeb9ff57)
1 // SPDX-License-Identifier: MIT
2 /*
3  * Copyright © 2019 Intel Corporation
4  */
5 
6 #include <drm/drm_atomic_state_helper.h>
7 #include <drm/drm_print.h>
8 #include <drm/intel/intel_pcode_regs.h>
9 
10 #include "intel_bw.h"
11 #include "intel_crtc.h"
12 #include "intel_de.h"
13 #include "intel_display_core.h"
14 #include "intel_display_regs.h"
15 #include "intel_display_types.h"
16 #include "intel_display_utils.h"
17 #include "intel_dram.h"
18 #include "intel_mchbar.h"
19 #include "intel_parent.h"
20 #include "skl_watermark.h"
21 
22 struct intel_bw_state {
23 	struct intel_global_state base;
24 
25 	/*
26 	 * Contains a bit mask, used to determine, whether correspondent
27 	 * pipe allows SAGV or not.
28 	 */
29 	u8 pipe_sagv_reject;
30 
31 	/*
32 	 * From MTL onwards, to lock a QGV point, punit expects the peak BW of
33 	 * the selected QGV point as the parameter in multiples of 100MB/s
34 	 */
35 	u16 qgv_point_peakbw;
36 
37 	/*
38 	 * Current QGV points mask, which restricts
39 	 * some particular SAGV states, not to confuse
40 	 * with pipe_sagv_mask.
41 	 */
42 	u16 qgv_points_mask;
43 
44 	unsigned int data_rate[I915_MAX_PIPES];
45 	u8 num_active_planes[I915_MAX_PIPES];
46 };
47 
48 /* Parameters for Qclk Geyserville (QGV) */
49 struct intel_qgv_point {
50 	u16 dclk, t_rp, t_rdpre, t_rc, t_ras, t_rcd;
51 };
52 
53 #define DEPROGBWPCLIMIT		60
54 
55 struct intel_psf_gv_point {
56 	u8 clk; /* clock in multiples of 16.6666 MHz */
57 };
58 
59 struct intel_qgv_info {
60 	struct intel_qgv_point points[I915_NUM_QGV_POINTS];
61 	struct intel_psf_gv_point psf_points[I915_NUM_PSF_GV_POINTS];
62 	u8 num_qgv_points;
63 	u8 num_psf_points;
64 	u8 t_bl;
65 	u8 max_numchannels;
66 	u8 channel_width;
67 	u8 deinterleave;
68 };
69 
70 static int dclk_freq_mhz(int ratio)
71 {
72 	/* multiple of 16.666 MHz (100/6) */
73 	return DIV_ROUND_CLOSEST(ratio * 100, 6);
74 }
75 
76 static int dg1_mchbar_read_qgv_point_info(struct intel_display *display,
77 					  struct intel_qgv_point *sp,
78 					  int point)
79 {
80 	u32 dclk_ratio;
81 	u32 val;
82 
83 	val = intel_mchbar_read(display, SA_PERF_STATUS_0_0_0_MCHBAR_PC);
84 	dclk_ratio = REG_FIELD_GET(DG1_QCLK_RATIO_MASK, val);
85 	if (val & DG1_QCLK_REFERENCE)
86 		dclk_ratio *= 6; /* 6 * 16.666 MHz = 100 MHz */
87 	else
88 		dclk_ratio *= 8; /* 8 * 16.666 MHz = 133 MHz */
89 
90 	val = intel_mchbar_read(display, SKL_MC_BIOS_DATA_0_0_0_MCHBAR_PCU);
91 	if (val & DG1_GEAR_TYPE)
92 		dclk_ratio *= 2;
93 
94 	sp->dclk = dclk_freq_mhz(dclk_ratio);
95 	if (sp->dclk == 0)
96 		return -EINVAL;
97 
98 	val = intel_mchbar_read(display, MCHBAR_CH0_CR_TC_PRE_0_0_0_MCHBAR);
99 	sp->t_rp = REG_FIELD_GET(DG1_DRAM_T_RP_MASK, val);
100 	sp->t_rdpre = REG_FIELD_GET(DG1_DRAM_T_RDPRE_MASK, val);
101 
102 	val = intel_mchbar_read(display, MCHBAR_CH0_CR_TC_PRE_0_0_0_MCHBAR_HIGH);
103 	sp->t_rcd = REG_FIELD_GET(DG1_DRAM_T_RCD_MASK, val);
104 	sp->t_ras = REG_FIELD_GET(DG1_DRAM_T_RAS_MASK, val);
105 
106 	sp->t_rc = sp->t_rp + sp->t_ras;
107 
108 	return 0;
109 }
110 
111 static int icl_pcode_read_qgv_point_info(struct intel_display *display,
112 					 struct intel_qgv_point *sp,
113 					 int point)
114 {
115 	u32 val = 0, val2 = 0;
116 	int ret;
117 
118 	ret = intel_parent_pcode_read(display, ICL_PCODE_MEM_SUBSYSYSTEM_INFO |
119 				      ICL_PCODE_MEM_SS_READ_QGV_POINT_INFO(point),
120 				      &val, &val2);
121 	if (ret)
122 		return ret;
123 
124 	sp->dclk = dclk_freq_mhz(val & 0xffff);
125 	sp->t_rp = (val & 0xff0000) >> 16;
126 	sp->t_rcd = (val & 0xff000000) >> 24;
127 
128 	sp->t_rdpre = val2 & 0xff;
129 	sp->t_ras = (val2 & 0xff00) >> 8;
130 
131 	sp->t_rc = sp->t_rp + sp->t_ras;
132 
133 	return 0;
134 }
135 
136 static int adls_pcode_read_psf_gv_point_info(struct intel_display *display,
137 					     struct intel_psf_gv_point *points)
138 {
139 	u32 val = 0;
140 	int ret;
141 	int i;
142 
143 	ret = intel_parent_pcode_read(display, ICL_PCODE_MEM_SUBSYSYSTEM_INFO |
144 				      ADL_PCODE_MEM_SS_READ_PSF_GV_INFO, &val, NULL);
145 	if (ret)
146 		return ret;
147 
148 	for (i = 0; i < I915_NUM_PSF_GV_POINTS; i++) {
149 		points[i].clk = val & 0xff;
150 		val >>= 8;
151 	}
152 
153 	return 0;
154 }
155 
156 static u16 icl_qgv_points_mask(struct intel_display *display)
157 {
158 	unsigned int num_psf_gv_points = display->bw.num_psf_gv_points;
159 	unsigned int num_qgv_points = display->bw.num_qgv_points;
160 	u16 qgv_points = 0, psf_points = 0;
161 
162 	/*
163 	 * We can _not_ use the whole ADLS_QGV_PT_MASK here, as PCode rejects
164 	 * it with failure if we try masking any unadvertised points.
165 	 * So need to operate only with those returned from PCode.
166 	 */
167 	if (num_qgv_points > 0)
168 		qgv_points = GENMASK(num_qgv_points - 1, 0);
169 
170 	if (num_psf_gv_points > 0)
171 		psf_points = GENMASK(num_psf_gv_points - 1, 0);
172 
173 	return ICL_PCODE_REQ_QGV_PT(qgv_points) | ADLS_PCODE_REQ_PSF_PT(psf_points);
174 }
175 
176 static bool is_sagv_enabled(struct intel_display *display, u16 points_mask)
177 {
178 	return !is_power_of_2(~points_mask & icl_qgv_points_mask(display) &
179 			      ICL_PCODE_REQ_QGV_PT_MASK);
180 }
181 
182 static int icl_pcode_restrict_qgv_points(struct intel_display *display,
183 					 u32 points_mask)
184 {
185 	int ret;
186 
187 	if (DISPLAY_VER(display) >= 14)
188 		return 0;
189 
190 	/* bspec says to keep retrying for at least 1 ms */
191 	ret = intel_parent_pcode_request(display, ICL_PCODE_SAGV_DE_MEM_SS_CONFIG,
192 					 points_mask,
193 					 ICL_PCODE_REP_QGV_MASK | ADLS_PCODE_REP_PSF_MASK,
194 					 ICL_PCODE_REP_QGV_SAFE | ADLS_PCODE_REP_PSF_SAFE,
195 					 1);
196 
197 	if (ret < 0) {
198 		drm_err(display->drm,
199 			"Failed to disable qgv points (0x%x) points: 0x%x\n",
200 			ret, points_mask);
201 		return ret;
202 	}
203 
204 	display->sagv.status = is_sagv_enabled(display, points_mask) ?
205 		I915_SAGV_ENABLED : I915_SAGV_DISABLED;
206 
207 	return 0;
208 }
209 
210 static int mtl_read_qgv_point_info(struct intel_display *display,
211 				   struct intel_qgv_point *sp, int point)
212 {
213 	u32 val, val2;
214 
215 	val = intel_de_read(display, MTL_MEM_SS_INFO_QGV_POINT_LOW(point));
216 	val2 = intel_de_read(display, MTL_MEM_SS_INFO_QGV_POINT_HIGH(point));
217 
218 	sp->dclk = dclk_freq_mhz(REG_FIELD_GET(MTL_DCLK_MASK, val));
219 	sp->t_rp = REG_FIELD_GET(MTL_TRP_MASK, val);
220 	sp->t_rcd = REG_FIELD_GET(MTL_TRCD_MASK, val);
221 
222 	sp->t_rdpre = REG_FIELD_GET(MTL_TRDPRE_MASK, val2);
223 	sp->t_ras = REG_FIELD_GET(MTL_TRAS_MASK, val2);
224 
225 	sp->t_rc = sp->t_rp + sp->t_ras;
226 
227 	return 0;
228 }
229 
230 static int
231 intel_read_qgv_point_info(struct intel_display *display,
232 			  struct intel_qgv_point *sp,
233 			  int point)
234 {
235 	if (DISPLAY_VER(display) >= 14)
236 		return mtl_read_qgv_point_info(display, sp, point);
237 	else if (display->platform.dg1)
238 		return dg1_mchbar_read_qgv_point_info(display, sp, point);
239 	else
240 		return icl_pcode_read_qgv_point_info(display, sp, point);
241 }
242 
243 static bool is_y_tile(struct intel_display *display)
244 {
245 	/* assume Y tile may be used if supported */
246 	return !HAS_4TILE(display);
247 }
248 
249 static int icl_get_qgv_points(struct intel_display *display,
250 			      const struct dram_info *dram_info,
251 			      struct intel_qgv_info *qi)
252 {
253 	int i, ret;
254 
255 	qi->num_qgv_points = dram_info->num_qgv_points;
256 	qi->num_psf_points = dram_info->num_psf_gv_points;
257 
258 	if (DISPLAY_VER(display) >= 14) {
259 		switch (dram_info->type) {
260 		case INTEL_DRAM_DDR4:
261 			qi->t_bl = 4;
262 			qi->max_numchannels = 2;
263 			qi->channel_width = 64;
264 			qi->deinterleave = 2;
265 			break;
266 		case INTEL_DRAM_DDR5:
267 			qi->t_bl = 8;
268 			qi->max_numchannels = 4;
269 			qi->channel_width = 32;
270 			qi->deinterleave = 2;
271 			break;
272 		case INTEL_DRAM_LPDDR4:
273 		case INTEL_DRAM_LPDDR5:
274 			qi->t_bl = 16;
275 			qi->max_numchannels = 8;
276 			qi->channel_width = 16;
277 			qi->deinterleave = 4;
278 			break;
279 		case INTEL_DRAM_GDDR:
280 		case INTEL_DRAM_GDDR_ECC:
281 			qi->channel_width = 32;
282 			break;
283 		default:
284 			MISSING_CASE(dram_info->type);
285 			return -EINVAL;
286 		}
287 	} else if (DISPLAY_VER(display) >= 12) {
288 		switch (dram_info->type) {
289 		case INTEL_DRAM_DDR4:
290 			qi->t_bl = is_y_tile(display) ? 8 : 4;
291 			qi->max_numchannels = 2;
292 			qi->channel_width = 64;
293 			qi->deinterleave = is_y_tile(display) ? 1 : 2;
294 			break;
295 		case INTEL_DRAM_DDR5:
296 			qi->t_bl = is_y_tile(display) ? 16 : 8;
297 			qi->max_numchannels = 4;
298 			qi->channel_width = 32;
299 			qi->deinterleave = is_y_tile(display) ? 1 : 2;
300 			break;
301 		case INTEL_DRAM_LPDDR4:
302 			if (display->platform.rocketlake) {
303 				qi->t_bl = 8;
304 				qi->max_numchannels = 4;
305 				qi->channel_width = 32;
306 				qi->deinterleave = 2;
307 				break;
308 			}
309 			fallthrough;
310 		case INTEL_DRAM_LPDDR5:
311 			qi->t_bl = 16;
312 			qi->max_numchannels = 8;
313 			qi->channel_width = 16;
314 			qi->deinterleave = is_y_tile(display) ? 2 : 4;
315 			break;
316 		default:
317 			qi->t_bl = 16;
318 			qi->max_numchannels = 1;
319 			break;
320 		}
321 	} else if (DISPLAY_VER(display) == 11) {
322 		qi->t_bl = dram_info->type == INTEL_DRAM_DDR4 ? 4 : 8;
323 		qi->max_numchannels = 1;
324 	}
325 
326 	if (drm_WARN_ON(display->drm,
327 			qi->num_qgv_points > ARRAY_SIZE(qi->points)))
328 		qi->num_qgv_points = ARRAY_SIZE(qi->points);
329 
330 	for (i = 0; i < qi->num_qgv_points; i++) {
331 		struct intel_qgv_point *sp = &qi->points[i];
332 
333 		ret = intel_read_qgv_point_info(display, sp, i);
334 		if (ret) {
335 			drm_dbg_kms(display->drm, "Could not read QGV %d info\n", i);
336 			return ret;
337 		}
338 
339 		drm_dbg_kms(display->drm,
340 			    "QGV %d: DCLK=%d tRP=%d tRDPRE=%d tRAS=%d tRCD=%d tRC=%d\n",
341 			    i, sp->dclk, sp->t_rp, sp->t_rdpre, sp->t_ras,
342 			    sp->t_rcd, sp->t_rc);
343 	}
344 
345 	if (qi->num_psf_points > 0) {
346 		ret = adls_pcode_read_psf_gv_point_info(display, qi->psf_points);
347 		if (ret) {
348 			drm_err(display->drm, "Failed to read PSF point data; PSF points will not be considered in bandwidth calculations.\n");
349 			qi->num_psf_points = 0;
350 		}
351 
352 		for (i = 0; i < qi->num_psf_points; i++)
353 			drm_dbg_kms(display->drm,
354 				    "PSF GV %d: CLK=%d\n",
355 				    i, qi->psf_points[i].clk);
356 	}
357 
358 	return 0;
359 }
360 
361 static int adl_calc_psf_bw(int clk)
362 {
363 	/*
364 	 * clk is multiples of 16.666MHz (100/6)
365 	 * According to BSpec PSF GV bandwidth is
366 	 * calculated as BW = 64 * clk * 16.666Mhz
367 	 */
368 	return DIV_ROUND_CLOSEST(64 * clk * 100, 6);
369 }
370 
371 static int icl_sagv_max_dclk(const struct intel_qgv_info *qi)
372 {
373 	u16 dclk = 0;
374 	int i;
375 
376 	for (i = 0; i < qi->num_qgv_points; i++)
377 		dclk = max(dclk, qi->points[i].dclk);
378 
379 	return dclk;
380 }
381 
382 /*
383  * Bandwidth parameters that are tied to the SoC (as opposed to struct
384  * intel_display_bw_params).
385  */
386 struct intel_soc_bw_params {
387 	u8 deprogbwlimit;
388 	u8 derating;
389 };
390 
391 static const struct intel_soc_bw_params icl_bw_params = {
392 	.deprogbwlimit = 25,
393 	.derating = 10,
394 };
395 
396 static const struct intel_soc_bw_params tgl_bw_params = {
397 	.deprogbwlimit = 34,
398 	.derating = 10,
399 };
400 
401 static const struct intel_soc_bw_params rkl_bw_params = {
402 	.deprogbwlimit = 20,
403 	.derating = 10,
404 };
405 
406 static const struct intel_soc_bw_params adl_s_bw_params = {
407 	.deprogbwlimit = 38,
408 	.derating = 10,
409 };
410 
411 static const struct intel_soc_bw_params adl_p_bw_params = {
412 	.deprogbwlimit = 38,
413 	.derating = 20,
414 };
415 
416 static const struct intel_soc_bw_params bmg_bw_params = {
417 	.deprogbwlimit = 53,
418 	.derating = 30,
419 };
420 
421 static const struct intel_soc_bw_params bmg_ecc_bw_params = {
422 	.deprogbwlimit = 53,
423 	.derating = 45,
424 };
425 
426 static const struct intel_soc_bw_params ptl_bw_params = {
427 	.deprogbwlimit = 65,
428 	.derating = 10,
429 };
430 
431 static const struct intel_soc_bw_params wcl_bw_params = {
432 	.deprogbwlimit = 22,
433 	.derating = 10,
434 };
435 
436 static const struct intel_soc_bw_params *get_soc_bw_params(struct intel_display *display,
437 							   const struct dram_info *dram_info)
438 {
439 	if (display->platform.icelake ||
440 	    display->platform.jasperlake ||
441 	    display->platform.elkhartlake)
442 		return &icl_bw_params;
443 	else if (display->platform.tigerlake ||
444 		 display->platform.dg1)
445 		return &tgl_bw_params;
446 	else if (display->platform.rocketlake)
447 		return &rkl_bw_params;
448 	else if (display->platform.alderlake_s ||
449 		 display->platform.meteorlake ||
450 		 display->platform.lunarlake)
451 		return &adl_s_bw_params;
452 	else if (display->platform.alderlake_p)
453 		return &adl_p_bw_params;
454 	else if (display->platform.battlemage &&
455 		 dram_info->type == INTEL_DRAM_GDDR_ECC)
456 		return &bmg_ecc_bw_params;
457 	else if (display->platform.battlemage)
458 		return &bmg_bw_params;
459 	else if (display->platform.pantherlake_wildcatlake)
460 		return &wcl_bw_params;
461 	else if (display->platform.pantherlake ||
462 		 display->platform.novalake)
463 		return &ptl_bw_params;
464 
465 	return NULL;
466 }
467 
468 /*
469  * Bandwidth parameters that are tied to the display IP (as opposed to struct
470  * intel_soc_bw_params).
471  */
472 struct intel_display_bw_params {
473 	u16 displayrtids;
474 	u8 deburst;
475 };
476 
477 static const struct intel_display_bw_params gen11_bw_params = {
478 	.deburst = 8,
479 	.displayrtids = 128,
480 };
481 
482 static const struct intel_display_bw_params gen12_bw_params = {
483 	.deburst = 16,
484 	.displayrtids = 256,
485 };
486 
487 static const struct intel_display_bw_params xelpdp_bw_params = {
488 	.deburst = 32,
489 	.displayrtids = 256,
490 };
491 
492 static const struct intel_display_bw_params *get_display_bw_params(struct intel_display *display)
493 {
494 	if (DISPLAY_VER(display) >= 14) {
495 		return &xelpdp_bw_params;
496 	} else if (DISPLAY_VER(display) >= 12) {
497 		/*
498 		 * RKL's SoC was based on ICL and the display, even though being
499 		 * gen12, had changes to the memory interface to match gen11's,
500 		 * consequently inheriting gen11's display-specific bandwidth
501 		 * parameters.
502 		 */
503 		if (display->platform.rocketlake)
504 			return &gen11_bw_params;
505 		else
506 			return &gen12_bw_params;
507 	} else if (DISPLAY_VER(display) == 11) {
508 		return &gen11_bw_params;
509 	}
510 
511 	return NULL;
512 }
513 
514 static int icl_get_bw_info(struct intel_display *display,
515 			   const struct dram_info *dram_info,
516 			   const struct intel_soc_bw_params *soc_bw_params,
517 			   const struct intel_display_bw_params *display_bw_params)
518 {
519 	struct intel_qgv_info qi = {};
520 	int num_channels = max_t(u8, 1, dram_info->num_channels);
521 	int ipqdepth, ipqdepthpch = 16;
522 	int dclk_max;
523 	int maxdebw;
524 	int num_groups = ARRAY_SIZE(display->bw.max);
525 	int i, ret;
526 
527 	ret = icl_get_qgv_points(display, dram_info, &qi);
528 	if (ret) {
529 		drm_dbg_kms(display->drm,
530 			    "Failed to get memory subsystem information, ignoring bandwidth limits");
531 		return ret;
532 	}
533 
534 	dclk_max = icl_sagv_max_dclk(&qi);
535 	maxdebw = min(soc_bw_params->deprogbwlimit * 1000, dclk_max * 16 * 6 / 10);
536 	ipqdepth = min(ipqdepthpch, display_bw_params->displayrtids / num_channels);
537 	qi.deinterleave = DIV_ROUND_UP(num_channels, is_y_tile(display) ? 4 : 2);
538 
539 	display->bw.num_qgv_points = qi.num_qgv_points;
540 	display->bw.num_psf_gv_points = qi.num_psf_points;
541 
542 	for (i = 0; i < num_groups; i++) {
543 		struct intel_bw_info *bi = &display->bw.max[i];
544 		int clpchgroup;
545 		int j;
546 
547 		clpchgroup = (display_bw_params->deburst * qi.deinterleave / num_channels) << i;
548 		bi->num_planes = (ipqdepth - clpchgroup) / clpchgroup + 1;
549 
550 		for (j = 0; j < qi.num_qgv_points; j++) {
551 			const struct intel_qgv_point *sp = &qi.points[j];
552 			int ct, bw;
553 
554 			/*
555 			 * Max row cycle time
556 			 *
557 			 * FIXME what is the logic behind the
558 			 * assumed burst length?
559 			 */
560 			ct = max_t(int, sp->t_rc, sp->t_rp + sp->t_rcd +
561 				   (clpchgroup - 1) * qi.t_bl + sp->t_rdpre);
562 			bw = sp->dclk * clpchgroup * 32 * num_channels / ct;
563 
564 			bi->deratedbw[j] = min(maxdebw,
565 					       bw * (100 - soc_bw_params->derating) / 100);
566 
567 			drm_dbg_kms(display->drm,
568 				    "BW%d / QGV %d: num_planes=%d deratedbw=%u\n",
569 				    i, j, bi->num_planes, bi->deratedbw[j]);
570 		}
571 	}
572 	/*
573 	 * In case if SAGV is disabled in BIOS, we always get 1
574 	 * SAGV point, but we can't send PCode commands to restrict it
575 	 * as it will fail and pointless anyway.
576 	 */
577 	if (qi.num_qgv_points == 1)
578 		display->sagv.status = I915_SAGV_NOT_CONTROLLED;
579 	else
580 		display->sagv.status = I915_SAGV_ENABLED;
581 
582 	return 0;
583 }
584 
585 static int tgl_peakbw(int num_channels, int channel_width, int dclk)
586 {
587 	return num_channels * (channel_width / 8) * dclk;
588 }
589 
590 static int tgl_get_bw_info(struct intel_display *display,
591 			   const struct dram_info *dram_info,
592 			   const struct intel_soc_bw_params *soc_bw_params,
593 			   const struct intel_display_bw_params *display_bw_params)
594 {
595 	struct intel_qgv_info qi = {};
596 	int num_channels = max_t(u8, 1, dram_info->num_channels);
597 	int ipqdepth, ipqdepthpch = 16;
598 	int maxdebw, peakbw;
599 	int clperchgroup;
600 	int num_groups = ARRAY_SIZE(display->bw.max);
601 	int i, ret;
602 
603 	ret = icl_get_qgv_points(display, dram_info, &qi);
604 	if (ret) {
605 		drm_dbg_kms(display->drm,
606 			    "Failed to get memory subsystem information, ignoring bandwidth limits");
607 		return ret;
608 	}
609 
610 	if (DISPLAY_VER(display) < 14 &&
611 	    (dram_info->type == INTEL_DRAM_LPDDR4 || dram_info->type == INTEL_DRAM_LPDDR5))
612 		num_channels *= 2;
613 
614 	if (num_channels < qi.max_numchannels && DISPLAY_VER(display) >= 12)
615 		qi.deinterleave = max(qi.deinterleave / 2, 1);
616 
617 	if (DISPLAY_VER(display) >= 12 && num_channels > qi.max_numchannels)
618 		drm_warn(display->drm, "Number of channels exceeds max number of channels.");
619 	if (qi.max_numchannels != 0)
620 		num_channels = min_t(u8, num_channels, qi.max_numchannels);
621 
622 	peakbw = tgl_peakbw(num_channels, qi.channel_width, icl_sagv_max_dclk(&qi));
623 	maxdebw = min(soc_bw_params->deprogbwlimit * 1000, peakbw * DEPROGBWPCLIMIT / 100);
624 
625 	ipqdepth = min(ipqdepthpch, display_bw_params->displayrtids / num_channels);
626 	/*
627 	 * clperchgroup = 4kpagespermempage * clperchperblock,
628 	 * clperchperblock = 8 / num_channels * interleave
629 	 */
630 	clperchgroup = 4 * (8 / num_channels) * qi.deinterleave;
631 
632 	display->bw.num_qgv_points = qi.num_qgv_points;
633 	display->bw.num_psf_gv_points = qi.num_psf_points;
634 
635 	display->bw.max[0].num_planes = U8_MAX;
636 
637 	for (i = 0; i < num_groups; i++) {
638 		struct intel_bw_info *bi = &display->bw.max[i];
639 		int clpchgroup;
640 		int j;
641 
642 		clpchgroup = (display_bw_params->deburst * qi.deinterleave / num_channels) << i;
643 
644 		if (i < num_groups - 1) {
645 			struct intel_bw_info *bi_next = &display->bw.max[i + 1];
646 
647 			if (clpchgroup < clperchgroup)
648 				bi_next->num_planes = (ipqdepth - clpchgroup) / clpchgroup;
649 			else
650 				bi_next->num_planes = 0;
651 		}
652 
653 		for (j = 0; j < qi.num_qgv_points; j++) {
654 			const struct intel_qgv_point *sp = &qi.points[j];
655 			int ct, bw;
656 
657 			/*
658 			 * Max row cycle time
659 			 *
660 			 * FIXME what is the logic behind the
661 			 * assumed burst length?
662 			 */
663 			ct = max_t(int, sp->t_rc, sp->t_rp + sp->t_rcd +
664 				   (clpchgroup - 1) * qi.t_bl + sp->t_rdpre);
665 			bw = sp->dclk * clpchgroup * 32 * num_channels / ct;
666 
667 			bi->deratedbw[j] = min(maxdebw,
668 					       bw * (100 - soc_bw_params->derating) / 100);
669 
670 			drm_dbg_kms(display->drm,
671 				    "BW%d / QGV %d: num_planes=%d deratedbw=%u\n",
672 				    i, j, bi->num_planes, bi->deratedbw[j]);
673 		}
674 	}
675 
676 	for (i = 0; i < qi.num_qgv_points; i++) {
677 		const struct intel_qgv_point *sp = &qi.points[i];
678 
679 		display->bw.peakbw[i] = tgl_peakbw(num_channels, qi.channel_width, sp->dclk);
680 
681 		drm_dbg_kms(display->drm, "QGV %d: peakbw=%u\n", i, display->bw.peakbw[i]);
682 	}
683 
684 	for (i = 0; i < qi.num_psf_points; i++) {
685 		const struct intel_psf_gv_point *sp = &qi.psf_points[i];
686 
687 		display->bw.psf_bw[i] = adl_calc_psf_bw(sp->clk);
688 
689 		drm_dbg_kms(display->drm, "PSF GV %d: bw=%u\n", i, display->bw.psf_bw[i]);
690 	}
691 
692 	/*
693 	 * In case if SAGV is disabled in BIOS, we always get 1
694 	 * SAGV point, but we can't send PCode commands to restrict it
695 	 * as it will fail and pointless anyway.
696 	 */
697 	if (qi.num_qgv_points == 1)
698 		display->sagv.status = I915_SAGV_NOT_CONTROLLED;
699 	else
700 		display->sagv.status = I915_SAGV_ENABLED;
701 
702 	return 0;
703 }
704 
705 static void dg2_get_bw_info(struct intel_display *display)
706 {
707 	int i;
708 
709 	display->bw.num_qgv_points = 1;
710 
711 	display->bw.max[0].num_planes = U8_MAX;
712 	display->bw.max[0].deratedbw[0] = display->platform.dg2_g11 ? 38000 : 50000;
713 
714 	drm_dbg_kms(display->drm,
715 		    "QGV 0: deratedbw=%u\n",
716 		    display->bw.max[0].deratedbw[0]);
717 
718 	/* Bandwidth does not depend on # of planes; set all groups the same */
719 	for (i = 1; i < ARRAY_SIZE(display->bw.max); i++)
720 		display->bw.max[i] = display->bw.max[0];
721 
722 	display->sagv.status = I915_SAGV_NOT_CONTROLLED;
723 }
724 
725 static int xe2_hpd_get_bw_info(struct intel_display *display,
726 			       const struct dram_info *dram_info,
727 			       const struct intel_soc_bw_params *soc_bw_params)
728 {
729 	struct intel_qgv_info qi = {};
730 	int num_channels = dram_info->num_channels;
731 	int peakbw, maxdebw;
732 	int ret, i;
733 
734 	ret = icl_get_qgv_points(display, dram_info, &qi);
735 	if (ret) {
736 		drm_dbg_kms(display->drm,
737 			    "Failed to get memory subsystem information, ignoring bandwidth limits");
738 		return ret;
739 	}
740 
741 	peakbw = tgl_peakbw(num_channels, qi.channel_width, icl_sagv_max_dclk(&qi));
742 	maxdebw = min(soc_bw_params->deprogbwlimit * 1000, peakbw * DEPROGBWPCLIMIT / 100);
743 
744 	display->bw.num_qgv_points = qi.num_qgv_points;
745 
746 	display->bw.max[0].num_planes = U8_MAX;
747 
748 	for (i = 0; i < qi.num_qgv_points; i++) {
749 		const struct intel_qgv_point *sp = &qi.points[i];
750 		int bw = tgl_peakbw(num_channels, qi.channel_width, sp->dclk);
751 
752 		display->bw.max[0].deratedbw[i] =
753 			min(maxdebw, (100 - soc_bw_params->derating) * bw / 100);
754 
755 		display->bw.peakbw[i] = bw;
756 
757 		drm_dbg_kms(display->drm, "QGV %d: deratedbw=%u peakbw=%u\n",
758 			    i, display->bw.max[0].deratedbw[i], display->bw.peakbw[i]);
759 	}
760 
761 	/* Bandwidth does not depend on # of planes; set all groups the same */
762 	for (i = 1; i < ARRAY_SIZE(display->bw.max); i++)
763 		display->bw.max[i] = display->bw.max[0];
764 
765 	/*
766 	 * Xe2_HPD should always have exactly two QGV points representing
767 	 * battery and plugged-in operation.
768 	 */
769 	drm_WARN_ON(display->drm, qi.num_qgv_points != 2);
770 	display->sagv.status = I915_SAGV_ENABLED;
771 
772 	return 0;
773 }
774 
775 static unsigned int icl_max_bw_index(struct intel_display *display,
776 				     int num_planes, int qgv_point)
777 {
778 	int i;
779 
780 	if (qgv_point >= display->bw.num_qgv_points)
781 		return UINT_MAX;
782 
783 	/*
784 	 * Let's return max bw for 0 planes
785 	 */
786 	num_planes = max(1, num_planes);
787 
788 	for (i = 0; i < ARRAY_SIZE(display->bw.max); i++) {
789 		const struct intel_bw_info *bi =
790 			&display->bw.max[i];
791 
792 		if (num_planes >= bi->num_planes)
793 			return i;
794 	}
795 
796 	return UINT_MAX;
797 }
798 
799 static unsigned int tgl_max_bw_index(struct intel_display *display,
800 				     int num_planes, int qgv_point)
801 {
802 	int i;
803 
804 	if (qgv_point >= display->bw.num_qgv_points)
805 		return UINT_MAX;
806 
807 	for (i = ARRAY_SIZE(display->bw.max) - 1; i >= 0; i--) {
808 		const struct intel_bw_info *bi =
809 			&display->bw.max[i];
810 
811 		if (num_planes <= bi->num_planes)
812 			return i;
813 	}
814 
815 	return UINT_MAX;
816 }
817 
818 static unsigned int adl_psf_bw(struct intel_display *display,
819 			       int psf_gv_point)
820 {
821 	return display->bw.psf_bw[psf_gv_point];
822 }
823 
824 static unsigned int icl_qgv_bw(struct intel_display *display,
825 			       int num_active_planes, int qgv_point)
826 {
827 	unsigned int idx;
828 
829 	if (DISPLAY_VER(display) >= 12)
830 		idx = tgl_max_bw_index(display, num_active_planes, qgv_point);
831 	else
832 		idx = icl_max_bw_index(display, num_active_planes, qgv_point);
833 
834 	if (idx >= ARRAY_SIZE(display->bw.max))
835 		return 0;
836 
837 	return display->bw.max[idx].deratedbw[qgv_point];
838 }
839 
840 void intel_bw_init_hw(struct intel_display *display)
841 {
842 	const struct dram_info *dram_info;
843 	const struct intel_soc_bw_params *soc_bw_params;
844 	const struct intel_display_bw_params *display_bw_params;
845 
846 	if (!HAS_DISPLAY(display))
847 		return;
848 
849 	dram_info = intel_dram_info(display);
850 	soc_bw_params = get_soc_bw_params(display, dram_info);
851 	display_bw_params = get_display_bw_params(display);
852 
853 	/*
854 	 * Starting with Xe3p_LPD, the hardware tells us whether memory has ECC
855 	 * enabled that would impact display bandwidth.  However, so far there
856 	 * are no instructions in Bspec on how to handle that case.  Let's
857 	 * complain if we ever find such a scenario.
858 	 */
859 	if (DISPLAY_VER(display) >= 35)
860 		drm_WARN_ON(display->drm, dram_info->ecc_impacting_de_bw);
861 
862 	if (DISPLAY_VERx100(display) >= 1401 && display->platform.dgfx) {
863 		xe2_hpd_get_bw_info(display, dram_info, soc_bw_params);
864 	} else if (display->platform.dg2) {
865 		dg2_get_bw_info(display);
866 	} else if (DISPLAY_VER(display) >= 12) {
867 		tgl_get_bw_info(display, dram_info, soc_bw_params, display_bw_params);
868 	} else if (DISPLAY_VER(display) == 11) {
869 		icl_get_bw_info(display, dram_info, soc_bw_params, display_bw_params);
870 	}
871 }
872 
873 static unsigned int intel_bw_num_active_planes(struct intel_display *display,
874 					       const struct intel_bw_state *bw_state)
875 {
876 	unsigned int num_active_planes = 0;
877 	enum pipe pipe;
878 
879 	for_each_pipe(display, pipe)
880 		num_active_planes += bw_state->num_active_planes[pipe];
881 
882 	return num_active_planes;
883 }
884 
885 static unsigned int intel_bw_data_rate(struct intel_display *display,
886 				       const struct intel_bw_state *bw_state)
887 {
888 	unsigned int data_rate = 0;
889 	enum pipe pipe;
890 
891 	for_each_pipe(display, pipe)
892 		data_rate += bw_state->data_rate[pipe];
893 
894 	if (DISPLAY_VER(display) >= 13 && intel_display_vtd_active(display))
895 		data_rate = DIV_ROUND_UP(data_rate * 105, 100);
896 
897 	return data_rate;
898 }
899 
900 struct intel_bw_state *to_intel_bw_state(struct intel_global_state *obj_state)
901 {
902 	return container_of(obj_state, struct intel_bw_state, base);
903 }
904 
905 struct intel_bw_state *
906 intel_atomic_get_old_bw_state(struct intel_atomic_state *state)
907 {
908 	struct intel_display *display = to_intel_display(state);
909 	struct intel_global_state *bw_state;
910 
911 	bw_state = intel_atomic_get_old_global_obj_state(state, &display->bw.obj);
912 
913 	return to_intel_bw_state(bw_state);
914 }
915 
916 struct intel_bw_state *
917 intel_atomic_get_new_bw_state(struct intel_atomic_state *state)
918 {
919 	struct intel_display *display = to_intel_display(state);
920 	struct intel_global_state *bw_state;
921 
922 	bw_state = intel_atomic_get_new_global_obj_state(state, &display->bw.obj);
923 
924 	return to_intel_bw_state(bw_state);
925 }
926 
927 struct intel_bw_state *
928 intel_atomic_get_bw_state(struct intel_atomic_state *state)
929 {
930 	struct intel_display *display = to_intel_display(state);
931 	struct intel_global_state *bw_state;
932 
933 	bw_state = intel_atomic_get_global_obj_state(state, &display->bw.obj);
934 	if (IS_ERR(bw_state))
935 		return ERR_CAST(bw_state);
936 
937 	return to_intel_bw_state(bw_state);
938 }
939 
940 static unsigned int icl_max_bw_qgv_point_mask(struct intel_display *display,
941 					      int num_active_planes)
942 {
943 	unsigned int num_qgv_points = display->bw.num_qgv_points;
944 	unsigned int max_bw_point = 0;
945 	unsigned int max_bw = 0;
946 	int i;
947 
948 	for (i = 0; i < num_qgv_points; i++) {
949 		unsigned int max_data_rate =
950 			icl_qgv_bw(display, num_active_planes, i);
951 
952 		/*
953 		 * We need to know which qgv point gives us
954 		 * maximum bandwidth in order to disable SAGV
955 		 * if we find that we exceed SAGV block time
956 		 * with watermarks. By that moment we already
957 		 * have those, as it is calculated earlier in
958 		 * intel_atomic_check,
959 		 */
960 		if (max_data_rate > max_bw) {
961 			max_bw_point = BIT(i);
962 			max_bw = max_data_rate;
963 		}
964 	}
965 
966 	return max_bw_point;
967 }
968 
969 static u16 icl_prepare_qgv_points_mask(struct intel_display *display,
970 				       unsigned int qgv_points,
971 				       unsigned int psf_points)
972 {
973 	return ~(ICL_PCODE_REQ_QGV_PT(qgv_points) |
974 		 ADLS_PCODE_REQ_PSF_PT(psf_points)) & icl_qgv_points_mask(display);
975 }
976 
977 static unsigned int icl_max_bw_psf_gv_point_mask(struct intel_display *display)
978 {
979 	unsigned int num_psf_gv_points = display->bw.num_psf_gv_points;
980 	unsigned int max_bw_point_mask = 0;
981 	unsigned int max_bw = 0;
982 	int i;
983 
984 	for (i = 0; i < num_psf_gv_points; i++) {
985 		unsigned int max_data_rate = adl_psf_bw(display, i);
986 
987 		if (max_data_rate > max_bw) {
988 			max_bw_point_mask = BIT(i);
989 			max_bw = max_data_rate;
990 		} else if (max_data_rate == max_bw) {
991 			max_bw_point_mask |= BIT(i);
992 		}
993 	}
994 
995 	return max_bw_point_mask;
996 }
997 
998 static void icl_force_disable_sagv(struct intel_display *display,
999 				   struct intel_bw_state *bw_state)
1000 {
1001 	unsigned int qgv_points = icl_max_bw_qgv_point_mask(display, 0);
1002 	unsigned int psf_points = icl_max_bw_psf_gv_point_mask(display);
1003 
1004 	bw_state->qgv_points_mask = icl_prepare_qgv_points_mask(display,
1005 								qgv_points,
1006 								psf_points);
1007 
1008 	drm_dbg_kms(display->drm, "Forcing SAGV disable: mask 0x%x\n",
1009 		    bw_state->qgv_points_mask);
1010 
1011 	icl_pcode_restrict_qgv_points(display, bw_state->qgv_points_mask);
1012 }
1013 
1014 void icl_sagv_pre_plane_update(struct intel_atomic_state *state)
1015 {
1016 	struct intel_display *display = to_intel_display(state);
1017 	const struct intel_bw_state *old_bw_state =
1018 		intel_atomic_get_old_bw_state(state);
1019 	const struct intel_bw_state *new_bw_state =
1020 		intel_atomic_get_new_bw_state(state);
1021 	u16 old_mask, new_mask;
1022 
1023 	if (!new_bw_state)
1024 		return;
1025 
1026 	old_mask = old_bw_state->qgv_points_mask;
1027 	new_mask = old_bw_state->qgv_points_mask | new_bw_state->qgv_points_mask;
1028 
1029 	if (old_mask == new_mask)
1030 		return;
1031 
1032 	WARN_ON(!new_bw_state->base.changed);
1033 
1034 	drm_dbg_kms(display->drm, "Restricting QGV points: 0x%x -> 0x%x\n",
1035 		    old_mask, new_mask);
1036 
1037 	/*
1038 	 * Restrict required qgv points before updating the configuration.
1039 	 * According to BSpec we can't mask and unmask qgv points at the same
1040 	 * time. Also masking should be done before updating the configuration
1041 	 * and unmasking afterwards.
1042 	 */
1043 	icl_pcode_restrict_qgv_points(display, new_mask);
1044 }
1045 
1046 void icl_sagv_post_plane_update(struct intel_atomic_state *state)
1047 {
1048 	struct intel_display *display = to_intel_display(state);
1049 	const struct intel_bw_state *old_bw_state =
1050 		intel_atomic_get_old_bw_state(state);
1051 	const struct intel_bw_state *new_bw_state =
1052 		intel_atomic_get_new_bw_state(state);
1053 	u16 old_mask, new_mask;
1054 
1055 	if (!new_bw_state)
1056 		return;
1057 
1058 	old_mask = old_bw_state->qgv_points_mask | new_bw_state->qgv_points_mask;
1059 	new_mask = new_bw_state->qgv_points_mask;
1060 
1061 	if (old_mask == new_mask)
1062 		return;
1063 
1064 	WARN_ON(!new_bw_state->base.changed);
1065 
1066 	drm_dbg_kms(display->drm, "Relaxing QGV points: 0x%x -> 0x%x\n",
1067 		    old_mask, new_mask);
1068 
1069 	/*
1070 	 * Allow required qgv points after updating the configuration.
1071 	 * According to BSpec we can't mask and unmask qgv points at the same
1072 	 * time. Also masking should be done before updating the configuration
1073 	 * and unmasking afterwards.
1074 	 */
1075 	icl_pcode_restrict_qgv_points(display, new_mask);
1076 }
1077 
1078 static int mtl_find_qgv_points(struct intel_display *display,
1079 			       unsigned int data_rate,
1080 			       unsigned int num_active_planes,
1081 			       struct intel_bw_state *new_bw_state)
1082 {
1083 	unsigned int best_rate = UINT_MAX;
1084 	unsigned int num_qgv_points = display->bw.num_qgv_points;
1085 	unsigned int qgv_peak_bw  = 0;
1086 	int i;
1087 	int ret;
1088 
1089 	ret = intel_atomic_lock_global_state(&new_bw_state->base);
1090 	if (ret)
1091 		return ret;
1092 
1093 	/*
1094 	 * If SAGV cannot be enabled, disable the pcode SAGV by passing all 1's
1095 	 * for qgv peak bw in PM Demand request. So assign UINT_MAX if SAGV is
1096 	 * not enabled. PM Demand code will clamp the value for the register
1097 	 */
1098 	if (!intel_bw_can_enable_sagv(display, new_bw_state)) {
1099 		new_bw_state->qgv_point_peakbw = U16_MAX;
1100 		drm_dbg_kms(display->drm, "No SAGV, use UINT_MAX as peak bw.");
1101 		return 0;
1102 	}
1103 
1104 	/*
1105 	 * Find the best QGV point by comparing the data_rate with max data rate
1106 	 * offered per plane group
1107 	 */
1108 	for (i = 0; i < num_qgv_points; i++) {
1109 		unsigned int max_data_rate =
1110 			icl_qgv_bw(display, num_active_planes, i);
1111 
1112 		if (max_data_rate < data_rate)
1113 			continue;
1114 
1115 		if (max_data_rate < best_rate) {
1116 			best_rate = max_data_rate;
1117 			qgv_peak_bw = display->bw.peakbw[i];
1118 		}
1119 
1120 		drm_dbg_kms(display->drm, "QGV point %d: max bw %d required %d qgv_peak_bw: %d\n",
1121 			    i, max_data_rate, data_rate, qgv_peak_bw);
1122 	}
1123 
1124 	drm_dbg_kms(display->drm, "Matching peaks QGV bw: %d for required data rate: %d\n",
1125 		    qgv_peak_bw, data_rate);
1126 
1127 	/*
1128 	 * The display configuration cannot be supported if no QGV point
1129 	 * satisfying the required data rate is found
1130 	 */
1131 	if (qgv_peak_bw == 0) {
1132 		drm_dbg_kms(display->drm, "No QGV points for bw %d for display configuration(%d active planes).\n",
1133 			    data_rate, num_active_planes);
1134 		return -EINVAL;
1135 	}
1136 
1137 	/* MTL PM DEMAND expects QGV BW parameter in multiples of 100 mbps */
1138 	new_bw_state->qgv_point_peakbw = qgv_peak_bw / 100;
1139 
1140 	return 0;
1141 }
1142 
1143 static int icl_find_qgv_points(struct intel_display *display,
1144 			       unsigned int data_rate,
1145 			       unsigned int num_active_planes,
1146 			       const struct intel_bw_state *old_bw_state,
1147 			       struct intel_bw_state *new_bw_state)
1148 {
1149 	unsigned int num_psf_gv_points = display->bw.num_psf_gv_points;
1150 	unsigned int num_qgv_points = display->bw.num_qgv_points;
1151 	u16 psf_points = 0;
1152 	u16 qgv_points = 0;
1153 	int i;
1154 	int ret;
1155 
1156 	ret = intel_atomic_lock_global_state(&new_bw_state->base);
1157 	if (ret)
1158 		return ret;
1159 
1160 	for (i = 0; i < num_qgv_points; i++) {
1161 		unsigned int max_data_rate = icl_qgv_bw(display,
1162 							num_active_planes, i);
1163 		if (max_data_rate >= data_rate)
1164 			qgv_points |= BIT(i);
1165 
1166 		drm_dbg_kms(display->drm, "QGV point %d: max bw %d required %d\n",
1167 			    i, max_data_rate, data_rate);
1168 	}
1169 
1170 	for (i = 0; i < num_psf_gv_points; i++) {
1171 		unsigned int max_data_rate = adl_psf_bw(display, i);
1172 
1173 		if (max_data_rate >= data_rate)
1174 			psf_points |= BIT(i);
1175 
1176 		drm_dbg_kms(display->drm, "PSF GV point %d: max bw %d"
1177 			    " required %d\n",
1178 			    i, max_data_rate, data_rate);
1179 	}
1180 
1181 	/*
1182 	 * BSpec states that we always should have at least one allowed point
1183 	 * left, so if we couldn't - simply reject the configuration for obvious
1184 	 * reasons.
1185 	 */
1186 	if (qgv_points == 0) {
1187 		drm_dbg_kms(display->drm, "No QGV points provide sufficient memory"
1188 			    " bandwidth %d for display configuration(%d active planes).\n",
1189 			    data_rate, num_active_planes);
1190 		return -EINVAL;
1191 	}
1192 
1193 	if (num_psf_gv_points > 0 && psf_points == 0) {
1194 		drm_dbg_kms(display->drm, "No PSF GV points provide sufficient memory"
1195 			    " bandwidth %d for display configuration(%d active planes).\n",
1196 			    data_rate, num_active_planes);
1197 		return -EINVAL;
1198 	}
1199 
1200 	/*
1201 	 * Leave only single point with highest bandwidth, if
1202 	 * we can't enable SAGV due to the increased memory latency it may
1203 	 * cause.
1204 	 */
1205 	if (!intel_bw_can_enable_sagv(display, new_bw_state)) {
1206 		qgv_points = icl_max_bw_qgv_point_mask(display, num_active_planes);
1207 		drm_dbg_kms(display->drm, "No SAGV, using single QGV point mask 0x%x\n",
1208 			    qgv_points);
1209 	}
1210 
1211 	/*
1212 	 * We store the ones which need to be masked as that is what PCode
1213 	 * actually accepts as a parameter.
1214 	 */
1215 	new_bw_state->qgv_points_mask = icl_prepare_qgv_points_mask(display,
1216 								    qgv_points,
1217 								    psf_points);
1218 	/*
1219 	 * If the actual mask had changed we need to make sure that
1220 	 * the commits are serialized(in case this is a nomodeset, nonblocking)
1221 	 */
1222 	if (new_bw_state->qgv_points_mask != old_bw_state->qgv_points_mask) {
1223 		ret = intel_atomic_serialize_global_state(&new_bw_state->base);
1224 		if (ret)
1225 			return ret;
1226 	}
1227 
1228 	return 0;
1229 }
1230 
1231 static int intel_bw_check_qgv_points(struct intel_display *display,
1232 				     const struct intel_bw_state *old_bw_state,
1233 				     struct intel_bw_state *new_bw_state)
1234 {
1235 	unsigned int data_rate = intel_bw_data_rate(display, new_bw_state);
1236 	unsigned int num_active_planes =
1237 			intel_bw_num_active_planes(display, new_bw_state);
1238 
1239 	data_rate = DIV_ROUND_UP(data_rate, 1000);
1240 
1241 	if (DISPLAY_VER(display) >= 14)
1242 		return mtl_find_qgv_points(display, data_rate, num_active_planes,
1243 					   new_bw_state);
1244 	else
1245 		return icl_find_qgv_points(display, data_rate, num_active_planes,
1246 					   old_bw_state, new_bw_state);
1247 }
1248 
1249 static int intel_bw_check_data_rate(struct intel_atomic_state *state, bool *changed)
1250 {
1251 	struct intel_display *display = to_intel_display(state);
1252 	const struct intel_crtc_state *new_crtc_state, *old_crtc_state;
1253 	struct intel_crtc *crtc;
1254 
1255 	for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state) {
1256 		unsigned int old_data_rate =
1257 			intel_crtc_bw_data_rate(old_crtc_state);
1258 		unsigned int new_data_rate =
1259 			intel_crtc_bw_data_rate(new_crtc_state);
1260 		unsigned int old_active_planes =
1261 			intel_crtc_bw_num_active_planes(old_crtc_state);
1262 		unsigned int new_active_planes =
1263 			intel_crtc_bw_num_active_planes(new_crtc_state);
1264 		struct intel_bw_state *new_bw_state;
1265 
1266 		/*
1267 		 * Avoid locking the bw state when
1268 		 * nothing significant has changed.
1269 		 */
1270 		if (old_data_rate == new_data_rate &&
1271 		    old_active_planes == new_active_planes)
1272 			continue;
1273 
1274 		new_bw_state = intel_atomic_get_bw_state(state);
1275 		if (IS_ERR(new_bw_state))
1276 			return PTR_ERR(new_bw_state);
1277 
1278 		new_bw_state->data_rate[crtc->pipe] = new_data_rate;
1279 		new_bw_state->num_active_planes[crtc->pipe] = new_active_planes;
1280 
1281 		*changed = true;
1282 
1283 		drm_dbg_kms(display->drm,
1284 			    "[CRTC:%d:%s] data rate %u num active planes %u\n",
1285 			    crtc->base.base.id, crtc->base.name,
1286 			    new_bw_state->data_rate[crtc->pipe],
1287 			    new_bw_state->num_active_planes[crtc->pipe]);
1288 	}
1289 
1290 	return 0;
1291 }
1292 
1293 static int intel_bw_check_sagv_mask(struct intel_atomic_state *state)
1294 {
1295 	struct intel_display *display = to_intel_display(state);
1296 	const struct intel_crtc_state *old_crtc_state;
1297 	const struct intel_crtc_state *new_crtc_state;
1298 	const struct intel_bw_state *old_bw_state = NULL;
1299 	struct intel_bw_state *new_bw_state = NULL;
1300 	struct intel_crtc *crtc;
1301 	int ret;
1302 
1303 	for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state) {
1304 		if (intel_crtc_can_enable_sagv(old_crtc_state) ==
1305 		    intel_crtc_can_enable_sagv(new_crtc_state))
1306 			continue;
1307 
1308 		new_bw_state = intel_atomic_get_bw_state(state);
1309 		if (IS_ERR(new_bw_state))
1310 			return PTR_ERR(new_bw_state);
1311 
1312 		old_bw_state = intel_atomic_get_old_bw_state(state);
1313 
1314 		if (intel_crtc_can_enable_sagv(new_crtc_state))
1315 			new_bw_state->pipe_sagv_reject &= ~BIT(crtc->pipe);
1316 		else
1317 			new_bw_state->pipe_sagv_reject |= BIT(crtc->pipe);
1318 	}
1319 
1320 	if (!new_bw_state)
1321 		return 0;
1322 
1323 	if (intel_bw_can_enable_sagv(display, new_bw_state) !=
1324 	    intel_bw_can_enable_sagv(display, old_bw_state)) {
1325 		ret = intel_atomic_serialize_global_state(&new_bw_state->base);
1326 		if (ret)
1327 			return ret;
1328 	} else if (new_bw_state->pipe_sagv_reject != old_bw_state->pipe_sagv_reject) {
1329 		ret = intel_atomic_lock_global_state(&new_bw_state->base);
1330 		if (ret)
1331 			return ret;
1332 	}
1333 
1334 	return 0;
1335 }
1336 
1337 int intel_bw_atomic_check(struct intel_atomic_state *state)
1338 {
1339 	struct intel_display *display = to_intel_display(state);
1340 	bool changed = false;
1341 	struct intel_bw_state *new_bw_state;
1342 	const struct intel_bw_state *old_bw_state;
1343 	int ret;
1344 
1345 	if (DISPLAY_VER(display) < 9)
1346 		return 0;
1347 
1348 	ret = intel_bw_check_sagv_mask(state);
1349 	if (ret)
1350 		return ret;
1351 
1352 	/* FIXME earlier gens need some checks too */
1353 	if (DISPLAY_VER(display) < 11)
1354 		return 0;
1355 
1356 	ret = intel_bw_check_data_rate(state, &changed);
1357 	if (ret)
1358 		return ret;
1359 
1360 	old_bw_state = intel_atomic_get_old_bw_state(state);
1361 	new_bw_state = intel_atomic_get_new_bw_state(state);
1362 
1363 	if (new_bw_state &&
1364 	    intel_bw_can_enable_sagv(display, old_bw_state) !=
1365 	    intel_bw_can_enable_sagv(display, new_bw_state))
1366 		changed = true;
1367 
1368 	/*
1369 	 * If none of our inputs (data rates, number of active
1370 	 * planes, SAGV yes/no) changed then nothing to do here.
1371 	 */
1372 	if (!changed)
1373 		return 0;
1374 
1375 	ret = intel_bw_check_qgv_points(display, old_bw_state, new_bw_state);
1376 	if (ret)
1377 		return ret;
1378 
1379 	return 0;
1380 }
1381 
1382 static void intel_bw_crtc_update(struct intel_bw_state *bw_state,
1383 				 const struct intel_crtc_state *crtc_state)
1384 {
1385 	struct intel_display *display = to_intel_display(crtc_state);
1386 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
1387 
1388 	bw_state->data_rate[crtc->pipe] =
1389 		intel_crtc_bw_data_rate(crtc_state);
1390 	bw_state->num_active_planes[crtc->pipe] =
1391 		intel_crtc_bw_num_active_planes(crtc_state);
1392 
1393 	drm_dbg_kms(display->drm, "pipe %c data rate %u num active planes %u\n",
1394 		    pipe_name(crtc->pipe),
1395 		    bw_state->data_rate[crtc->pipe],
1396 		    bw_state->num_active_planes[crtc->pipe]);
1397 }
1398 
1399 void intel_bw_update_hw_state(struct intel_display *display)
1400 {
1401 	struct intel_bw_state *bw_state =
1402 		to_intel_bw_state(display->bw.obj.state);
1403 	struct intel_crtc *crtc;
1404 
1405 	if (DISPLAY_VER(display) < 9)
1406 		return;
1407 
1408 	bw_state->pipe_sagv_reject = 0;
1409 
1410 	for_each_intel_crtc(display, crtc) {
1411 		const struct intel_crtc_state *crtc_state =
1412 			to_intel_crtc_state(crtc->base.state);
1413 		enum pipe pipe = crtc->pipe;
1414 
1415 		if (DISPLAY_VER(display) >= 11)
1416 			intel_bw_crtc_update(bw_state, crtc_state);
1417 
1418 		/* initially SAGV has been forced off */
1419 		bw_state->pipe_sagv_reject |= BIT(pipe);
1420 	}
1421 }
1422 
1423 void intel_bw_crtc_disable_noatomic(struct intel_crtc *crtc)
1424 {
1425 	struct intel_display *display = to_intel_display(crtc);
1426 	struct intel_bw_state *bw_state =
1427 		to_intel_bw_state(display->bw.obj.state);
1428 	enum pipe pipe = crtc->pipe;
1429 
1430 	if (DISPLAY_VER(display) < 9)
1431 		return;
1432 
1433 	bw_state->data_rate[pipe] = 0;
1434 	bw_state->num_active_planes[pipe] = 0;
1435 }
1436 
1437 static struct intel_global_state *
1438 intel_bw_duplicate_state(struct intel_global_obj *obj)
1439 {
1440 	struct intel_bw_state *state;
1441 
1442 	state = kmemdup(obj->state, sizeof(*state), GFP_KERNEL);
1443 	if (!state)
1444 		return NULL;
1445 
1446 	return &state->base;
1447 }
1448 
1449 static void intel_bw_destroy_state(struct intel_global_obj *obj,
1450 				   struct intel_global_state *state)
1451 {
1452 	kfree(state);
1453 }
1454 
1455 static const struct intel_global_state_funcs intel_bw_funcs = {
1456 	.atomic_duplicate_state = intel_bw_duplicate_state,
1457 	.atomic_destroy_state = intel_bw_destroy_state,
1458 };
1459 
1460 int intel_bw_init(struct intel_display *display)
1461 {
1462 	struct intel_bw_state *state;
1463 
1464 	state = kzalloc_obj(*state);
1465 	if (!state)
1466 		return -ENOMEM;
1467 
1468 	intel_atomic_global_obj_init(display, &display->bw.obj,
1469 				     &state->base, &intel_bw_funcs);
1470 
1471 	/*
1472 	 * Limit this only if we have SAGV. And for Display version 14 onwards
1473 	 * sagv is handled though pmdemand requests
1474 	 */
1475 	if (intel_has_sagv(display) && IS_DISPLAY_VER(display, 11, 13))
1476 		icl_force_disable_sagv(display, state);
1477 
1478 	return 0;
1479 }
1480 
1481 bool intel_bw_pmdemand_needs_update(struct intel_atomic_state *state)
1482 {
1483 	const struct intel_bw_state *new_bw_state, *old_bw_state;
1484 
1485 	new_bw_state = intel_atomic_get_new_bw_state(state);
1486 	old_bw_state = intel_atomic_get_old_bw_state(state);
1487 
1488 	if (new_bw_state &&
1489 	    new_bw_state->qgv_point_peakbw != old_bw_state->qgv_point_peakbw)
1490 		return true;
1491 
1492 	return false;
1493 }
1494 
1495 bool intel_bw_can_enable_sagv(struct intel_display *display,
1496 			      const struct intel_bw_state *bw_state)
1497 {
1498 	return bw_state->pipe_sagv_reject == 0;
1499 }
1500 
1501 int intel_bw_qgv_point_peakbw(const struct intel_bw_state *bw_state)
1502 {
1503 	return bw_state->qgv_point_peakbw;
1504 }
1505