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