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