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