0001
0002
0003
0004
0005
0006 #include <drm/drm_atomic_state_helper.h>
0007
0008 #include "i915_reg.h"
0009 #include "i915_utils.h"
0010 #include "intel_atomic.h"
0011 #include "intel_bw.h"
0012 #include "intel_cdclk.h"
0013 #include "intel_display_types.h"
0014 #include "intel_mchbar_regs.h"
0015 #include "intel_pcode.h"
0016 #include "intel_pm.h"
0017
0018
0019 struct intel_qgv_point {
0020 u16 dclk, t_rp, t_rdpre, t_rc, t_ras, t_rcd;
0021 };
0022
0023 struct intel_psf_gv_point {
0024 u8 clk;
0025 };
0026
0027 struct intel_qgv_info {
0028 struct intel_qgv_point points[I915_NUM_QGV_POINTS];
0029 struct intel_psf_gv_point psf_points[I915_NUM_PSF_GV_POINTS];
0030 u8 num_points;
0031 u8 num_psf_points;
0032 u8 t_bl;
0033 u8 max_numchannels;
0034 u8 channel_width;
0035 u8 deinterleave;
0036 };
0037
0038 static int dg1_mchbar_read_qgv_point_info(struct drm_i915_private *dev_priv,
0039 struct intel_qgv_point *sp,
0040 int point)
0041 {
0042 u32 dclk_ratio, dclk_reference;
0043 u32 val;
0044
0045 val = intel_uncore_read(&dev_priv->uncore, SA_PERF_STATUS_0_0_0_MCHBAR_PC);
0046 dclk_ratio = REG_FIELD_GET(DG1_QCLK_RATIO_MASK, val);
0047 if (val & DG1_QCLK_REFERENCE)
0048 dclk_reference = 6;
0049 else
0050 dclk_reference = 8;
0051 sp->dclk = DIV_ROUND_UP((16667 * dclk_ratio * dclk_reference) + 500, 1000);
0052
0053 val = intel_uncore_read(&dev_priv->uncore, SKL_MC_BIOS_DATA_0_0_0_MCHBAR_PCU);
0054 if (val & DG1_GEAR_TYPE)
0055 sp->dclk *= 2;
0056
0057 if (sp->dclk == 0)
0058 return -EINVAL;
0059
0060 val = intel_uncore_read(&dev_priv->uncore, MCHBAR_CH0_CR_TC_PRE_0_0_0_MCHBAR);
0061 sp->t_rp = REG_FIELD_GET(DG1_DRAM_T_RP_MASK, val);
0062 sp->t_rdpre = REG_FIELD_GET(DG1_DRAM_T_RDPRE_MASK, val);
0063
0064 val = intel_uncore_read(&dev_priv->uncore, MCHBAR_CH0_CR_TC_PRE_0_0_0_MCHBAR_HIGH);
0065 sp->t_rcd = REG_FIELD_GET(DG1_DRAM_T_RCD_MASK, val);
0066 sp->t_ras = REG_FIELD_GET(DG1_DRAM_T_RAS_MASK, val);
0067
0068 sp->t_rc = sp->t_rp + sp->t_ras;
0069
0070 return 0;
0071 }
0072
0073 static int icl_pcode_read_qgv_point_info(struct drm_i915_private *dev_priv,
0074 struct intel_qgv_point *sp,
0075 int point)
0076 {
0077 u32 val = 0, val2 = 0;
0078 u16 dclk;
0079 int ret;
0080
0081 ret = snb_pcode_read(&dev_priv->uncore, ICL_PCODE_MEM_SUBSYSYSTEM_INFO |
0082 ICL_PCODE_MEM_SS_READ_QGV_POINT_INFO(point),
0083 &val, &val2);
0084 if (ret)
0085 return ret;
0086
0087 dclk = val & 0xffff;
0088 sp->dclk = DIV_ROUND_UP((16667 * dclk) + (DISPLAY_VER(dev_priv) > 11 ? 500 : 0), 1000);
0089 sp->t_rp = (val & 0xff0000) >> 16;
0090 sp->t_rcd = (val & 0xff000000) >> 24;
0091
0092 sp->t_rdpre = val2 & 0xff;
0093 sp->t_ras = (val2 & 0xff00) >> 8;
0094
0095 sp->t_rc = sp->t_rp + sp->t_ras;
0096
0097 return 0;
0098 }
0099
0100 static int adls_pcode_read_psf_gv_point_info(struct drm_i915_private *dev_priv,
0101 struct intel_psf_gv_point *points)
0102 {
0103 u32 val = 0;
0104 int ret;
0105 int i;
0106
0107 ret = snb_pcode_read(&dev_priv->uncore, ICL_PCODE_MEM_SUBSYSYSTEM_INFO |
0108 ADL_PCODE_MEM_SS_READ_PSF_GV_INFO, &val, NULL);
0109 if (ret)
0110 return ret;
0111
0112 for (i = 0; i < I915_NUM_PSF_GV_POINTS; i++) {
0113 points[i].clk = val & 0xff;
0114 val >>= 8;
0115 }
0116
0117 return 0;
0118 }
0119
0120 int icl_pcode_restrict_qgv_points(struct drm_i915_private *dev_priv,
0121 u32 points_mask)
0122 {
0123 int ret;
0124
0125
0126 ret = skl_pcode_request(&dev_priv->uncore, ICL_PCODE_SAGV_DE_MEM_SS_CONFIG,
0127 points_mask,
0128 ICL_PCODE_REP_QGV_MASK | ADLS_PCODE_REP_PSF_MASK,
0129 ICL_PCODE_REP_QGV_SAFE | ADLS_PCODE_REP_PSF_SAFE,
0130 1);
0131
0132 if (ret < 0) {
0133 drm_err(&dev_priv->drm, "Failed to disable qgv points (%d) points: 0x%x\n", ret, points_mask);
0134 return ret;
0135 }
0136
0137 return 0;
0138 }
0139
0140 static int icl_get_qgv_points(struct drm_i915_private *dev_priv,
0141 struct intel_qgv_info *qi,
0142 bool is_y_tile)
0143 {
0144 const struct dram_info *dram_info = &dev_priv->dram_info;
0145 int i, ret;
0146
0147 qi->num_points = dram_info->num_qgv_points;
0148 qi->num_psf_points = dram_info->num_psf_gv_points;
0149
0150 if (DISPLAY_VER(dev_priv) >= 12)
0151 switch (dram_info->type) {
0152 case INTEL_DRAM_DDR4:
0153 qi->t_bl = is_y_tile ? 8 : 4;
0154 qi->max_numchannels = 2;
0155 qi->channel_width = 64;
0156 qi->deinterleave = is_y_tile ? 1 : 2;
0157 break;
0158 case INTEL_DRAM_DDR5:
0159 qi->t_bl = is_y_tile ? 16 : 8;
0160 qi->max_numchannels = 4;
0161 qi->channel_width = 32;
0162 qi->deinterleave = is_y_tile ? 1 : 2;
0163 break;
0164 case INTEL_DRAM_LPDDR4:
0165 if (IS_ROCKETLAKE(dev_priv)) {
0166 qi->t_bl = 8;
0167 qi->max_numchannels = 4;
0168 qi->channel_width = 32;
0169 qi->deinterleave = 2;
0170 break;
0171 }
0172 fallthrough;
0173 case INTEL_DRAM_LPDDR5:
0174 qi->t_bl = 16;
0175 qi->max_numchannels = 8;
0176 qi->channel_width = 16;
0177 qi->deinterleave = is_y_tile ? 2 : 4;
0178 break;
0179 default:
0180 qi->t_bl = 16;
0181 qi->max_numchannels = 1;
0182 break;
0183 }
0184 else if (DISPLAY_VER(dev_priv) == 11) {
0185 qi->t_bl = dev_priv->dram_info.type == INTEL_DRAM_DDR4 ? 4 : 8;
0186 qi->max_numchannels = 1;
0187 }
0188
0189 if (drm_WARN_ON(&dev_priv->drm,
0190 qi->num_points > ARRAY_SIZE(qi->points)))
0191 qi->num_points = ARRAY_SIZE(qi->points);
0192
0193 for (i = 0; i < qi->num_points; i++) {
0194 struct intel_qgv_point *sp = &qi->points[i];
0195
0196 if (IS_DG1(dev_priv))
0197 ret = dg1_mchbar_read_qgv_point_info(dev_priv, sp, i);
0198 else
0199 ret = icl_pcode_read_qgv_point_info(dev_priv, sp, i);
0200
0201 if (ret)
0202 return ret;
0203
0204 drm_dbg_kms(&dev_priv->drm,
0205 "QGV %d: DCLK=%d tRP=%d tRDPRE=%d tRAS=%d tRCD=%d tRC=%d\n",
0206 i, sp->dclk, sp->t_rp, sp->t_rdpre, sp->t_ras,
0207 sp->t_rcd, sp->t_rc);
0208 }
0209
0210 if (qi->num_psf_points > 0) {
0211 ret = adls_pcode_read_psf_gv_point_info(dev_priv, qi->psf_points);
0212 if (ret) {
0213 drm_err(&dev_priv->drm, "Failed to read PSF point data; PSF points will not be considered in bandwidth calculations.\n");
0214 qi->num_psf_points = 0;
0215 }
0216
0217 for (i = 0; i < qi->num_psf_points; i++)
0218 drm_dbg_kms(&dev_priv->drm,
0219 "PSF GV %d: CLK=%d \n",
0220 i, qi->psf_points[i].clk);
0221 }
0222
0223 return 0;
0224 }
0225
0226 static int adl_calc_psf_bw(int clk)
0227 {
0228
0229
0230
0231
0232
0233 return DIV_ROUND_CLOSEST(64 * clk * 100, 6);
0234 }
0235
0236 static int icl_sagv_max_dclk(const struct intel_qgv_info *qi)
0237 {
0238 u16 dclk = 0;
0239 int i;
0240
0241 for (i = 0; i < qi->num_points; i++)
0242 dclk = max(dclk, qi->points[i].dclk);
0243
0244 return dclk;
0245 }
0246
0247 struct intel_sa_info {
0248 u16 displayrtids;
0249 u8 deburst, deprogbwlimit, derating;
0250 };
0251
0252 static const struct intel_sa_info icl_sa_info = {
0253 .deburst = 8,
0254 .deprogbwlimit = 25,
0255 .displayrtids = 128,
0256 .derating = 10,
0257 };
0258
0259 static const struct intel_sa_info tgl_sa_info = {
0260 .deburst = 16,
0261 .deprogbwlimit = 34,
0262 .displayrtids = 256,
0263 .derating = 10,
0264 };
0265
0266 static const struct intel_sa_info rkl_sa_info = {
0267 .deburst = 8,
0268 .deprogbwlimit = 20,
0269 .displayrtids = 128,
0270 .derating = 10,
0271 };
0272
0273 static const struct intel_sa_info adls_sa_info = {
0274 .deburst = 16,
0275 .deprogbwlimit = 38,
0276 .displayrtids = 256,
0277 .derating = 10,
0278 };
0279
0280 static const struct intel_sa_info adlp_sa_info = {
0281 .deburst = 16,
0282 .deprogbwlimit = 38,
0283 .displayrtids = 256,
0284 .derating = 20,
0285 };
0286
0287 static int icl_get_bw_info(struct drm_i915_private *dev_priv, const struct intel_sa_info *sa)
0288 {
0289 struct intel_qgv_info qi = {};
0290 bool is_y_tile = true;
0291 int num_channels = max_t(u8, 1, dev_priv->dram_info.num_channels);
0292 int ipqdepth, ipqdepthpch = 16;
0293 int dclk_max;
0294 int maxdebw;
0295 int num_groups = ARRAY_SIZE(dev_priv->max_bw);
0296 int i, ret;
0297
0298 ret = icl_get_qgv_points(dev_priv, &qi, is_y_tile);
0299 if (ret) {
0300 drm_dbg_kms(&dev_priv->drm,
0301 "Failed to get memory subsystem information, ignoring bandwidth limits");
0302 return ret;
0303 }
0304
0305 dclk_max = icl_sagv_max_dclk(&qi);
0306 maxdebw = min(sa->deprogbwlimit * 1000, dclk_max * 16 * 6 / 10);
0307 ipqdepth = min(ipqdepthpch, sa->displayrtids / num_channels);
0308 qi.deinterleave = DIV_ROUND_UP(num_channels, is_y_tile ? 4 : 2);
0309
0310 for (i = 0; i < num_groups; i++) {
0311 struct intel_bw_info *bi = &dev_priv->max_bw[i];
0312 int clpchgroup;
0313 int j;
0314
0315 clpchgroup = (sa->deburst * qi.deinterleave / num_channels) << i;
0316 bi->num_planes = (ipqdepth - clpchgroup) / clpchgroup + 1;
0317
0318 bi->num_qgv_points = qi.num_points;
0319 bi->num_psf_gv_points = qi.num_psf_points;
0320
0321 for (j = 0; j < qi.num_points; j++) {
0322 const struct intel_qgv_point *sp = &qi.points[j];
0323 int ct, bw;
0324
0325
0326
0327
0328
0329
0330
0331 ct = max_t(int, sp->t_rc, sp->t_rp + sp->t_rcd +
0332 (clpchgroup - 1) * qi.t_bl + sp->t_rdpre);
0333 bw = DIV_ROUND_UP(sp->dclk * clpchgroup * 32 * num_channels, ct);
0334
0335 bi->deratedbw[j] = min(maxdebw,
0336 bw * (100 - sa->derating) / 100);
0337
0338 drm_dbg_kms(&dev_priv->drm,
0339 "BW%d / QGV %d: num_planes=%d deratedbw=%u\n",
0340 i, j, bi->num_planes, bi->deratedbw[j]);
0341 }
0342 }
0343
0344
0345
0346
0347
0348 if (qi.num_points == 1)
0349 dev_priv->sagv_status = I915_SAGV_NOT_CONTROLLED;
0350 else
0351 dev_priv->sagv_status = I915_SAGV_ENABLED;
0352
0353 return 0;
0354 }
0355
0356 static int tgl_get_bw_info(struct drm_i915_private *dev_priv, const struct intel_sa_info *sa)
0357 {
0358 struct intel_qgv_info qi = {};
0359 const struct dram_info *dram_info = &dev_priv->dram_info;
0360 bool is_y_tile = true;
0361 int num_channels = max_t(u8, 1, dev_priv->dram_info.num_channels);
0362 int ipqdepth, ipqdepthpch = 16;
0363 int dclk_max;
0364 int maxdebw, peakbw;
0365 int clperchgroup;
0366 int num_groups = ARRAY_SIZE(dev_priv->max_bw);
0367 int i, ret;
0368
0369 ret = icl_get_qgv_points(dev_priv, &qi, is_y_tile);
0370 if (ret) {
0371 drm_dbg_kms(&dev_priv->drm,
0372 "Failed to get memory subsystem information, ignoring bandwidth limits");
0373 return ret;
0374 }
0375
0376 if (dram_info->type == INTEL_DRAM_LPDDR4 || dram_info->type == INTEL_DRAM_LPDDR5)
0377 num_channels *= 2;
0378
0379 qi.deinterleave = qi.deinterleave ? : DIV_ROUND_UP(num_channels, is_y_tile ? 4 : 2);
0380
0381 if (num_channels < qi.max_numchannels && DISPLAY_VER(dev_priv) >= 12)
0382 qi.deinterleave = max(DIV_ROUND_UP(qi.deinterleave, 2), 1);
0383
0384 if (DISPLAY_VER(dev_priv) > 11 && num_channels > qi.max_numchannels)
0385 drm_warn(&dev_priv->drm, "Number of channels exceeds max number of channels.");
0386 if (qi.max_numchannels != 0)
0387 num_channels = min_t(u8, num_channels, qi.max_numchannels);
0388
0389 dclk_max = icl_sagv_max_dclk(&qi);
0390
0391 peakbw = num_channels * DIV_ROUND_UP(qi.channel_width, 8) * dclk_max;
0392 maxdebw = min(sa->deprogbwlimit * 1000, peakbw * 6 / 10);
0393
0394 ipqdepth = min(ipqdepthpch, sa->displayrtids / num_channels);
0395
0396
0397
0398
0399 clperchgroup = 4 * DIV_ROUND_UP(8, num_channels) * qi.deinterleave;
0400
0401 for (i = 0; i < num_groups; i++) {
0402 struct intel_bw_info *bi = &dev_priv->max_bw[i];
0403 struct intel_bw_info *bi_next;
0404 int clpchgroup;
0405 int j;
0406
0407 clpchgroup = (sa->deburst * qi.deinterleave / num_channels) << i;
0408
0409 if (i < num_groups - 1) {
0410 bi_next = &dev_priv->max_bw[i + 1];
0411
0412 if (clpchgroup < clperchgroup)
0413 bi_next->num_planes = (ipqdepth - clpchgroup) /
0414 clpchgroup + 1;
0415 else
0416 bi_next->num_planes = 0;
0417 }
0418
0419 bi->num_qgv_points = qi.num_points;
0420 bi->num_psf_gv_points = qi.num_psf_points;
0421
0422 for (j = 0; j < qi.num_points; j++) {
0423 const struct intel_qgv_point *sp = &qi.points[j];
0424 int ct, bw;
0425
0426
0427
0428
0429
0430
0431
0432 ct = max_t(int, sp->t_rc, sp->t_rp + sp->t_rcd +
0433 (clpchgroup - 1) * qi.t_bl + sp->t_rdpre);
0434 bw = DIV_ROUND_UP(sp->dclk * clpchgroup * 32 * num_channels, ct);
0435
0436 bi->deratedbw[j] = min(maxdebw,
0437 bw * (100 - sa->derating) / 100);
0438
0439 drm_dbg_kms(&dev_priv->drm,
0440 "BW%d / QGV %d: num_planes=%d deratedbw=%u\n",
0441 i, j, bi->num_planes, bi->deratedbw[j]);
0442 }
0443
0444 for (j = 0; j < qi.num_psf_points; j++) {
0445 const struct intel_psf_gv_point *sp = &qi.psf_points[j];
0446
0447 bi->psf_bw[j] = adl_calc_psf_bw(sp->clk);
0448
0449 drm_dbg_kms(&dev_priv->drm,
0450 "BW%d / PSF GV %d: num_planes=%d bw=%u\n",
0451 i, j, bi->num_planes, bi->psf_bw[j]);
0452 }
0453 }
0454
0455
0456
0457
0458
0459
0460 if (qi.num_points == 1)
0461 dev_priv->sagv_status = I915_SAGV_NOT_CONTROLLED;
0462 else
0463 dev_priv->sagv_status = I915_SAGV_ENABLED;
0464
0465 return 0;
0466 }
0467
0468 static void dg2_get_bw_info(struct drm_i915_private *i915)
0469 {
0470 unsigned int deratedbw = IS_DG2_G11(i915) ? 38000 : 50000;
0471 int num_groups = ARRAY_SIZE(i915->max_bw);
0472 int i;
0473
0474
0475
0476
0477
0478
0479
0480
0481 for (i = 0; i < num_groups; i++) {
0482 struct intel_bw_info *bi = &i915->max_bw[i];
0483
0484 bi->num_planes = 1;
0485
0486 bi->num_qgv_points = 1;
0487 bi->deratedbw[0] = deratedbw;
0488 }
0489
0490 i915->sagv_status = I915_SAGV_NOT_CONTROLLED;
0491 }
0492
0493 static unsigned int icl_max_bw(struct drm_i915_private *dev_priv,
0494 int num_planes, int qgv_point)
0495 {
0496 int i;
0497
0498
0499
0500
0501 num_planes = max(1, num_planes);
0502
0503 for (i = 0; i < ARRAY_SIZE(dev_priv->max_bw); i++) {
0504 const struct intel_bw_info *bi =
0505 &dev_priv->max_bw[i];
0506
0507
0508
0509
0510
0511 if (qgv_point >= bi->num_qgv_points)
0512 return UINT_MAX;
0513
0514 if (num_planes >= bi->num_planes)
0515 return bi->deratedbw[qgv_point];
0516 }
0517
0518 return 0;
0519 }
0520
0521 static unsigned int tgl_max_bw(struct drm_i915_private *dev_priv,
0522 int num_planes, int qgv_point)
0523 {
0524 int i;
0525
0526
0527
0528
0529 num_planes = max(1, num_planes);
0530
0531 for (i = ARRAY_SIZE(dev_priv->max_bw) - 1; i >= 0; i--) {
0532 const struct intel_bw_info *bi =
0533 &dev_priv->max_bw[i];
0534
0535
0536
0537
0538
0539 if (qgv_point >= bi->num_qgv_points)
0540 return UINT_MAX;
0541
0542 if (num_planes <= bi->num_planes)
0543 return bi->deratedbw[qgv_point];
0544 }
0545
0546 return dev_priv->max_bw[0].deratedbw[qgv_point];
0547 }
0548
0549 static unsigned int adl_psf_bw(struct drm_i915_private *dev_priv,
0550 int psf_gv_point)
0551 {
0552 const struct intel_bw_info *bi =
0553 &dev_priv->max_bw[0];
0554
0555 return bi->psf_bw[psf_gv_point];
0556 }
0557
0558 void intel_bw_init_hw(struct drm_i915_private *dev_priv)
0559 {
0560 if (!HAS_DISPLAY(dev_priv))
0561 return;
0562
0563 if (IS_DG2(dev_priv))
0564 dg2_get_bw_info(dev_priv);
0565 else if (IS_ALDERLAKE_P(dev_priv))
0566 tgl_get_bw_info(dev_priv, &adlp_sa_info);
0567 else if (IS_ALDERLAKE_S(dev_priv))
0568 tgl_get_bw_info(dev_priv, &adls_sa_info);
0569 else if (IS_ROCKETLAKE(dev_priv))
0570 tgl_get_bw_info(dev_priv, &rkl_sa_info);
0571 else if (DISPLAY_VER(dev_priv) == 12)
0572 tgl_get_bw_info(dev_priv, &tgl_sa_info);
0573 else if (DISPLAY_VER(dev_priv) == 11)
0574 icl_get_bw_info(dev_priv, &icl_sa_info);
0575 }
0576
0577 static unsigned int intel_bw_crtc_num_active_planes(const struct intel_crtc_state *crtc_state)
0578 {
0579
0580
0581
0582
0583 return hweight8(crtc_state->active_planes & ~BIT(PLANE_CURSOR));
0584 }
0585
0586 static unsigned int intel_bw_crtc_data_rate(const struct intel_crtc_state *crtc_state)
0587 {
0588 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
0589 struct drm_i915_private *i915 = to_i915(crtc->base.dev);
0590 unsigned int data_rate = 0;
0591 enum plane_id plane_id;
0592
0593 for_each_plane_id_on_crtc(crtc, plane_id) {
0594
0595
0596
0597
0598 if (plane_id == PLANE_CURSOR)
0599 continue;
0600
0601 data_rate += crtc_state->data_rate[plane_id];
0602
0603 if (DISPLAY_VER(i915) < 11)
0604 data_rate += crtc_state->data_rate_y[plane_id];
0605 }
0606
0607 return data_rate;
0608 }
0609
0610
0611 static int intel_bw_crtc_min_cdclk(const struct intel_crtc_state *crtc_state)
0612 {
0613 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
0614 struct drm_i915_private *i915 = to_i915(crtc->base.dev);
0615
0616 if (DISPLAY_VER(i915) < 12)
0617 return 0;
0618
0619 return DIV_ROUND_UP_ULL(mul_u32_u32(intel_bw_crtc_data_rate(crtc_state), 10), 512);
0620 }
0621
0622 void intel_bw_crtc_update(struct intel_bw_state *bw_state,
0623 const struct intel_crtc_state *crtc_state)
0624 {
0625 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
0626 struct drm_i915_private *i915 = to_i915(crtc->base.dev);
0627
0628 bw_state->data_rate[crtc->pipe] =
0629 intel_bw_crtc_data_rate(crtc_state);
0630 bw_state->num_active_planes[crtc->pipe] =
0631 intel_bw_crtc_num_active_planes(crtc_state);
0632
0633 drm_dbg_kms(&i915->drm, "pipe %c data rate %u num active planes %u\n",
0634 pipe_name(crtc->pipe),
0635 bw_state->data_rate[crtc->pipe],
0636 bw_state->num_active_planes[crtc->pipe]);
0637 }
0638
0639 static unsigned int intel_bw_num_active_planes(struct drm_i915_private *dev_priv,
0640 const struct intel_bw_state *bw_state)
0641 {
0642 unsigned int num_active_planes = 0;
0643 enum pipe pipe;
0644
0645 for_each_pipe(dev_priv, pipe)
0646 num_active_planes += bw_state->num_active_planes[pipe];
0647
0648 return num_active_planes;
0649 }
0650
0651 static unsigned int intel_bw_data_rate(struct drm_i915_private *dev_priv,
0652 const struct intel_bw_state *bw_state)
0653 {
0654 unsigned int data_rate = 0;
0655 enum pipe pipe;
0656
0657 for_each_pipe(dev_priv, pipe)
0658 data_rate += bw_state->data_rate[pipe];
0659
0660 if (DISPLAY_VER(dev_priv) >= 13 && i915_vtd_active(dev_priv))
0661 data_rate = DIV_ROUND_UP(data_rate * 105, 100);
0662
0663 return data_rate;
0664 }
0665
0666 struct intel_bw_state *
0667 intel_atomic_get_old_bw_state(struct intel_atomic_state *state)
0668 {
0669 struct drm_i915_private *dev_priv = to_i915(state->base.dev);
0670 struct intel_global_state *bw_state;
0671
0672 bw_state = intel_atomic_get_old_global_obj_state(state, &dev_priv->bw_obj);
0673
0674 return to_intel_bw_state(bw_state);
0675 }
0676
0677 struct intel_bw_state *
0678 intel_atomic_get_new_bw_state(struct intel_atomic_state *state)
0679 {
0680 struct drm_i915_private *dev_priv = to_i915(state->base.dev);
0681 struct intel_global_state *bw_state;
0682
0683 bw_state = intel_atomic_get_new_global_obj_state(state, &dev_priv->bw_obj);
0684
0685 return to_intel_bw_state(bw_state);
0686 }
0687
0688 struct intel_bw_state *
0689 intel_atomic_get_bw_state(struct intel_atomic_state *state)
0690 {
0691 struct drm_i915_private *dev_priv = to_i915(state->base.dev);
0692 struct intel_global_state *bw_state;
0693
0694 bw_state = intel_atomic_get_global_obj_state(state, &dev_priv->bw_obj);
0695 if (IS_ERR(bw_state))
0696 return ERR_CAST(bw_state);
0697
0698 return to_intel_bw_state(bw_state);
0699 }
0700
0701 static bool intel_bw_state_changed(struct drm_i915_private *i915,
0702 const struct intel_bw_state *old_bw_state,
0703 const struct intel_bw_state *new_bw_state)
0704 {
0705 enum pipe pipe;
0706
0707 for_each_pipe(i915, pipe) {
0708 const struct intel_dbuf_bw *old_crtc_bw =
0709 &old_bw_state->dbuf_bw[pipe];
0710 const struct intel_dbuf_bw *new_crtc_bw =
0711 &new_bw_state->dbuf_bw[pipe];
0712 enum dbuf_slice slice;
0713
0714 for_each_dbuf_slice(i915, slice) {
0715 if (old_crtc_bw->max_bw[slice] != new_crtc_bw->max_bw[slice] ||
0716 old_crtc_bw->active_planes[slice] != new_crtc_bw->active_planes[slice])
0717 return true;
0718 }
0719
0720 if (old_bw_state->min_cdclk[pipe] != new_bw_state->min_cdclk[pipe])
0721 return true;
0722 }
0723
0724 return false;
0725 }
0726
0727 static void skl_plane_calc_dbuf_bw(struct intel_bw_state *bw_state,
0728 struct intel_crtc *crtc,
0729 enum plane_id plane_id,
0730 const struct skl_ddb_entry *ddb,
0731 unsigned int data_rate)
0732 {
0733 struct drm_i915_private *i915 = to_i915(crtc->base.dev);
0734 struct intel_dbuf_bw *crtc_bw = &bw_state->dbuf_bw[crtc->pipe];
0735 unsigned int dbuf_mask = skl_ddb_dbuf_slice_mask(i915, ddb);
0736 enum dbuf_slice slice;
0737
0738
0739
0740
0741
0742 for_each_dbuf_slice_in_mask(i915, slice, dbuf_mask) {
0743 crtc_bw->max_bw[slice] = max(crtc_bw->max_bw[slice], data_rate);
0744 crtc_bw->active_planes[slice] |= BIT(plane_id);
0745 }
0746 }
0747
0748 static void skl_crtc_calc_dbuf_bw(struct intel_bw_state *bw_state,
0749 const struct intel_crtc_state *crtc_state)
0750 {
0751 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
0752 struct drm_i915_private *i915 = to_i915(crtc->base.dev);
0753 struct intel_dbuf_bw *crtc_bw = &bw_state->dbuf_bw[crtc->pipe];
0754 enum plane_id plane_id;
0755
0756 memset(crtc_bw, 0, sizeof(*crtc_bw));
0757
0758 if (!crtc_state->hw.active)
0759 return;
0760
0761 for_each_plane_id_on_crtc(crtc, plane_id) {
0762
0763
0764
0765
0766 if (plane_id == PLANE_CURSOR)
0767 continue;
0768
0769 skl_plane_calc_dbuf_bw(bw_state, crtc, plane_id,
0770 &crtc_state->wm.skl.plane_ddb[plane_id],
0771 crtc_state->data_rate[plane_id]);
0772
0773 if (DISPLAY_VER(i915) < 11)
0774 skl_plane_calc_dbuf_bw(bw_state, crtc, plane_id,
0775 &crtc_state->wm.skl.plane_ddb_y[plane_id],
0776 crtc_state->data_rate[plane_id]);
0777 }
0778 }
0779
0780
0781 static int
0782 intel_bw_dbuf_min_cdclk(struct drm_i915_private *i915,
0783 const struct intel_bw_state *bw_state)
0784 {
0785 unsigned int total_max_bw = 0;
0786 enum dbuf_slice slice;
0787
0788 for_each_dbuf_slice(i915, slice) {
0789 int num_active_planes = 0;
0790 unsigned int max_bw = 0;
0791 enum pipe pipe;
0792
0793
0794
0795
0796
0797 for_each_pipe(i915, pipe) {
0798 const struct intel_dbuf_bw *crtc_bw = &bw_state->dbuf_bw[pipe];
0799
0800 max_bw = max(crtc_bw->max_bw[slice], max_bw);
0801 num_active_planes += hweight8(crtc_bw->active_planes[slice]);
0802 }
0803 max_bw *= num_active_planes;
0804
0805 total_max_bw = max(total_max_bw, max_bw);
0806 }
0807
0808 return DIV_ROUND_UP(total_max_bw, 64);
0809 }
0810
0811 int intel_bw_min_cdclk(struct drm_i915_private *i915,
0812 const struct intel_bw_state *bw_state)
0813 {
0814 enum pipe pipe;
0815 int min_cdclk;
0816
0817 min_cdclk = intel_bw_dbuf_min_cdclk(i915, bw_state);
0818
0819 for_each_pipe(i915, pipe)
0820 min_cdclk = max(bw_state->min_cdclk[pipe], min_cdclk);
0821
0822 return min_cdclk;
0823 }
0824
0825 int intel_bw_calc_min_cdclk(struct intel_atomic_state *state,
0826 bool *need_cdclk_calc)
0827 {
0828 struct drm_i915_private *dev_priv = to_i915(state->base.dev);
0829 struct intel_bw_state *new_bw_state = NULL;
0830 const struct intel_bw_state *old_bw_state = NULL;
0831 const struct intel_cdclk_state *cdclk_state;
0832 const struct intel_crtc_state *crtc_state;
0833 int old_min_cdclk, new_min_cdclk;
0834 struct intel_crtc *crtc;
0835 int i;
0836
0837 if (DISPLAY_VER(dev_priv) < 9)
0838 return 0;
0839
0840 for_each_new_intel_crtc_in_state(state, crtc, crtc_state, i) {
0841 new_bw_state = intel_atomic_get_bw_state(state);
0842 if (IS_ERR(new_bw_state))
0843 return PTR_ERR(new_bw_state);
0844
0845 old_bw_state = intel_atomic_get_old_bw_state(state);
0846
0847 skl_crtc_calc_dbuf_bw(new_bw_state, crtc_state);
0848
0849 new_bw_state->min_cdclk[crtc->pipe] =
0850 intel_bw_crtc_min_cdclk(crtc_state);
0851 }
0852
0853 if (!old_bw_state)
0854 return 0;
0855
0856 if (intel_bw_state_changed(dev_priv, old_bw_state, new_bw_state)) {
0857 int ret = intel_atomic_lock_global_state(&new_bw_state->base);
0858 if (ret)
0859 return ret;
0860 }
0861
0862 old_min_cdclk = intel_bw_min_cdclk(dev_priv, old_bw_state);
0863 new_min_cdclk = intel_bw_min_cdclk(dev_priv, new_bw_state);
0864
0865
0866
0867
0868
0869
0870
0871
0872
0873 if (new_min_cdclk <= old_min_cdclk)
0874 return 0;
0875
0876 cdclk_state = intel_atomic_get_cdclk_state(state);
0877 if (IS_ERR(cdclk_state))
0878 return PTR_ERR(cdclk_state);
0879
0880
0881
0882
0883
0884
0885
0886
0887
0888 if (new_min_cdclk <= cdclk_state->bw_min_cdclk)
0889 return 0;
0890
0891 drm_dbg_kms(&dev_priv->drm,
0892 "new bandwidth min cdclk (%d kHz) > old min cdclk (%d kHz)\n",
0893 new_min_cdclk, cdclk_state->bw_min_cdclk);
0894 *need_cdclk_calc = true;
0895
0896 return 0;
0897 }
0898
0899 static u16 icl_qgv_points_mask(struct drm_i915_private *i915)
0900 {
0901 unsigned int num_psf_gv_points = i915->max_bw[0].num_psf_gv_points;
0902 unsigned int num_qgv_points = i915->max_bw[0].num_qgv_points;
0903 u16 qgv_points = 0, psf_points = 0;
0904
0905
0906
0907
0908
0909
0910 if (num_qgv_points > 0)
0911 qgv_points = GENMASK(num_qgv_points - 1, 0);
0912
0913 if (num_psf_gv_points > 0)
0914 psf_points = GENMASK(num_psf_gv_points - 1, 0);
0915
0916 return ICL_PCODE_REQ_QGV_PT(qgv_points) | ADLS_PCODE_REQ_PSF_PT(psf_points);
0917 }
0918
0919 static int intel_bw_check_data_rate(struct intel_atomic_state *state, bool *changed)
0920 {
0921 struct drm_i915_private *i915 = to_i915(state->base.dev);
0922 const struct intel_crtc_state *new_crtc_state, *old_crtc_state;
0923 struct intel_crtc *crtc;
0924 int i;
0925
0926 for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
0927 new_crtc_state, i) {
0928 unsigned int old_data_rate =
0929 intel_bw_crtc_data_rate(old_crtc_state);
0930 unsigned int new_data_rate =
0931 intel_bw_crtc_data_rate(new_crtc_state);
0932 unsigned int old_active_planes =
0933 intel_bw_crtc_num_active_planes(old_crtc_state);
0934 unsigned int new_active_planes =
0935 intel_bw_crtc_num_active_planes(new_crtc_state);
0936 struct intel_bw_state *new_bw_state;
0937
0938
0939
0940
0941
0942 if (old_data_rate == new_data_rate &&
0943 old_active_planes == new_active_planes)
0944 continue;
0945
0946 new_bw_state = intel_atomic_get_bw_state(state);
0947 if (IS_ERR(new_bw_state))
0948 return PTR_ERR(new_bw_state);
0949
0950 new_bw_state->data_rate[crtc->pipe] = new_data_rate;
0951 new_bw_state->num_active_planes[crtc->pipe] = new_active_planes;
0952
0953 *changed = true;
0954
0955 drm_dbg_kms(&i915->drm,
0956 "[CRTC:%d:%s] data rate %u num active planes %u\n",
0957 crtc->base.base.id, crtc->base.name,
0958 new_bw_state->data_rate[crtc->pipe],
0959 new_bw_state->num_active_planes[crtc->pipe]);
0960 }
0961
0962 return 0;
0963 }
0964
0965 int intel_bw_atomic_check(struct intel_atomic_state *state)
0966 {
0967 struct drm_i915_private *dev_priv = to_i915(state->base.dev);
0968 const struct intel_bw_state *old_bw_state;
0969 struct intel_bw_state *new_bw_state;
0970 unsigned int data_rate;
0971 unsigned int num_active_planes;
0972 int i, ret;
0973 u16 qgv_points = 0, psf_points = 0;
0974 unsigned int max_bw_point = 0, max_bw = 0;
0975 unsigned int num_qgv_points = dev_priv->max_bw[0].num_qgv_points;
0976 unsigned int num_psf_gv_points = dev_priv->max_bw[0].num_psf_gv_points;
0977 bool changed = false;
0978
0979
0980 if (DISPLAY_VER(dev_priv) < 11)
0981 return 0;
0982
0983 ret = intel_bw_check_data_rate(state, &changed);
0984 if (ret)
0985 return ret;
0986
0987 old_bw_state = intel_atomic_get_old_bw_state(state);
0988 new_bw_state = intel_atomic_get_new_bw_state(state);
0989
0990 if (new_bw_state &&
0991 intel_can_enable_sagv(dev_priv, old_bw_state) !=
0992 intel_can_enable_sagv(dev_priv, new_bw_state))
0993 changed = true;
0994
0995
0996
0997
0998
0999 if (!changed)
1000 return 0;
1001
1002 ret = intel_atomic_lock_global_state(&new_bw_state->base);
1003 if (ret)
1004 return ret;
1005
1006 data_rate = intel_bw_data_rate(dev_priv, new_bw_state);
1007 data_rate = DIV_ROUND_UP(data_rate, 1000);
1008
1009 num_active_planes = intel_bw_num_active_planes(dev_priv, new_bw_state);
1010
1011 for (i = 0; i < num_qgv_points; i++) {
1012 unsigned int max_data_rate;
1013
1014 if (DISPLAY_VER(dev_priv) > 11)
1015 max_data_rate = tgl_max_bw(dev_priv, num_active_planes, i);
1016 else
1017 max_data_rate = icl_max_bw(dev_priv, num_active_planes, i);
1018
1019
1020
1021
1022
1023
1024
1025
1026 if (max_data_rate > max_bw) {
1027 max_bw_point = i;
1028 max_bw = max_data_rate;
1029 }
1030 if (max_data_rate >= data_rate)
1031 qgv_points |= BIT(i);
1032
1033 drm_dbg_kms(&dev_priv->drm, "QGV point %d: max bw %d required %d\n",
1034 i, max_data_rate, data_rate);
1035 }
1036
1037 for (i = 0; i < num_psf_gv_points; i++) {
1038 unsigned int max_data_rate = adl_psf_bw(dev_priv, i);
1039
1040 if (max_data_rate >= data_rate)
1041 psf_points |= BIT(i);
1042
1043 drm_dbg_kms(&dev_priv->drm, "PSF GV point %d: max bw %d"
1044 " required %d\n",
1045 i, max_data_rate, data_rate);
1046 }
1047
1048
1049
1050
1051
1052
1053 if (qgv_points == 0) {
1054 drm_dbg_kms(&dev_priv->drm, "No QGV points provide sufficient memory"
1055 " bandwidth %d for display configuration(%d active planes).\n",
1056 data_rate, num_active_planes);
1057 return -EINVAL;
1058 }
1059
1060 if (num_psf_gv_points > 0 && psf_points == 0) {
1061 drm_dbg_kms(&dev_priv->drm, "No PSF GV points provide sufficient memory"
1062 " bandwidth %d for display configuration(%d active planes).\n",
1063 data_rate, num_active_planes);
1064 return -EINVAL;
1065 }
1066
1067
1068
1069
1070
1071
1072 if (!intel_can_enable_sagv(dev_priv, new_bw_state)) {
1073 qgv_points = BIT(max_bw_point);
1074 drm_dbg_kms(&dev_priv->drm, "No SAGV, using single QGV point %d\n",
1075 max_bw_point);
1076 }
1077
1078
1079
1080
1081
1082 new_bw_state->qgv_points_mask =
1083 ~(ICL_PCODE_REQ_QGV_PT(qgv_points) |
1084 ADLS_PCODE_REQ_PSF_PT(psf_points)) &
1085 icl_qgv_points_mask(dev_priv);
1086
1087
1088
1089
1090
1091 if (new_bw_state->qgv_points_mask != old_bw_state->qgv_points_mask) {
1092 ret = intel_atomic_serialize_global_state(&new_bw_state->base);
1093 if (ret)
1094 return ret;
1095 }
1096
1097 return 0;
1098 }
1099
1100 static struct intel_global_state *
1101 intel_bw_duplicate_state(struct intel_global_obj *obj)
1102 {
1103 struct intel_bw_state *state;
1104
1105 state = kmemdup(obj->state, sizeof(*state), GFP_KERNEL);
1106 if (!state)
1107 return NULL;
1108
1109 return &state->base;
1110 }
1111
1112 static void intel_bw_destroy_state(struct intel_global_obj *obj,
1113 struct intel_global_state *state)
1114 {
1115 kfree(state);
1116 }
1117
1118 static const struct intel_global_state_funcs intel_bw_funcs = {
1119 .atomic_duplicate_state = intel_bw_duplicate_state,
1120 .atomic_destroy_state = intel_bw_destroy_state,
1121 };
1122
1123 int intel_bw_init(struct drm_i915_private *dev_priv)
1124 {
1125 struct intel_bw_state *state;
1126
1127 state = kzalloc(sizeof(*state), GFP_KERNEL);
1128 if (!state)
1129 return -ENOMEM;
1130
1131 intel_atomic_global_obj_init(dev_priv, &dev_priv->bw_obj,
1132 &state->base, &intel_bw_funcs);
1133
1134 return 0;
1135 }