:::::: :::::: Manual check reason: "low confidence static check first_new_problem: drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn31/display_rq_dlg_calc_31.c:709:34: sparse: sparse: dubious: !x & y" ::::::
CC: [email protected] BCC: [email protected] CC: [email protected] TO: Alex Deucher <[email protected]> CC: Nicholas Kazlauskas <[email protected]> tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master head: d717180e7f9775d468f415c10a4a474640146001 commit: 8fe44c080a53ac0ccbe88053a2e40f9acca33091 drm/amdgpu/display: fold DRM_AMD_DC_DCN3_1 into DRM_AMD_DC_DCN date: 12 months ago :::::: branch date: 2 hours ago :::::: commit date: 12 months ago config: i386-allmodconfig (https://download.01.org/0day-ci/archive/20220606/[email protected]/config) compiler: gcc-11 (Debian 11.3.0-1) 11.3.0 reproduce: # apt-get install sparse # sparse version: v0.6.4-18-g56afb504-dirty # https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=8fe44c080a53ac0ccbe88053a2e40f9acca33091 git remote add linus https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git git fetch --no-tags linus master git checkout 8fe44c080a53ac0ccbe88053a2e40f9acca33091 # save the config file mkdir build_dir && cp config build_dir/.config make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir ARCH=i386 SHELL=/bin/bash drivers/ samples// If you fix the issue, kindly add following tag where applicable Reported-by: kernel test robot <[email protected]> sparse warnings: (new ones prefixed by >>) >> drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn31/display_rq_dlg_calc_31.c:709:34: >> sparse: sparse: dubious: !x & y vim +709 drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn31/display_rq_dlg_calc_31.c 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 385 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 386 static void get_meta_and_pte_attr( 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 387 struct display_mode_lib *mode_lib, 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 388 display_data_rq_dlg_params_st *rq_dlg_param, 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 389 display_data_rq_misc_params_st *rq_misc_param, 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 390 display_data_rq_sizing_params_st *rq_sizing_param, 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 391 unsigned int vp_width, 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 392 unsigned int vp_height, 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 393 unsigned int data_pitch, 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 394 unsigned int meta_pitch, 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 395 unsigned int source_format, 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 396 unsigned int tiling, 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 397 unsigned int macro_tile_size, 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 398 unsigned int source_scan, 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 399 unsigned int hostvm_enable, 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 400 unsigned int is_chroma, 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 401 unsigned int surface_height) 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 402 { 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 403 bool surf_linear = (tiling == dm_sw_linear); 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 404 bool surf_vert = (source_scan == dm_vert); 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 405 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 406 unsigned int bytes_per_element; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 407 unsigned int bytes_per_element_y; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 408 unsigned int bytes_per_element_c; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 409 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 410 unsigned int blk256_width = 0; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 411 unsigned int blk256_height = 0; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 412 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 413 unsigned int blk256_width_y = 0; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 414 unsigned int blk256_height_y = 0; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 415 unsigned int blk256_width_c = 0; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 416 unsigned int blk256_height_c = 0; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 417 unsigned int log2_bytes_per_element; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 418 unsigned int log2_blk256_width; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 419 unsigned int log2_blk256_height; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 420 unsigned int blk_bytes; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 421 unsigned int log2_blk_bytes; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 422 unsigned int log2_blk_height; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 423 unsigned int log2_blk_width; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 424 unsigned int log2_meta_req_bytes; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 425 unsigned int log2_meta_req_height; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 426 unsigned int log2_meta_req_width; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 427 unsigned int meta_req_width; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 428 unsigned int meta_req_height; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 429 unsigned int log2_meta_row_height; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 430 unsigned int meta_row_width_ub; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 431 unsigned int log2_meta_chunk_bytes; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 432 unsigned int log2_meta_chunk_height; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 433 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 434 //full sized meta chunk width in unit of data elements 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 435 unsigned int log2_meta_chunk_width; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 436 unsigned int log2_min_meta_chunk_bytes; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 437 unsigned int min_meta_chunk_width; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 438 unsigned int meta_chunk_width; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 439 unsigned int meta_chunk_per_row_int; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 440 unsigned int meta_row_remainder; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 441 unsigned int meta_chunk_threshold; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 442 unsigned int meta_blk_height; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 443 unsigned int meta_surface_bytes; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 444 unsigned int vmpg_bytes; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 445 unsigned int meta_pte_req_per_frame_ub; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 446 unsigned int meta_pte_bytes_per_frame_ub; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 447 const unsigned int log2_vmpg_bytes = dml_log2(mode_lib->soc.gpuvm_min_page_size_bytes); 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 448 const bool dual_plane_en = is_dual_plane((enum source_format_class) (source_format)); 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 449 const unsigned int dpte_buf_in_pte_reqs = 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 450 dual_plane_en ? (is_chroma ? mode_lib->ip.dpte_buffer_size_in_pte_reqs_chroma : mode_lib->ip.dpte_buffer_size_in_pte_reqs_luma) : (mode_lib->ip.dpte_buffer_size_in_pte_reqs_luma 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 451 + mode_lib->ip.dpte_buffer_size_in_pte_reqs_chroma); 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 452 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 453 unsigned int log2_vmpg_height = 0; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 454 unsigned int log2_vmpg_width = 0; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 455 unsigned int log2_dpte_req_height_ptes = 0; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 456 unsigned int log2_dpte_req_height = 0; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 457 unsigned int log2_dpte_req_width = 0; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 458 unsigned int log2_dpte_row_height_linear = 0; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 459 unsigned int log2_dpte_row_height = 0; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 460 unsigned int log2_dpte_group_width = 0; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 461 unsigned int dpte_row_width_ub = 0; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 462 unsigned int dpte_req_height = 0; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 463 unsigned int dpte_req_width = 0; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 464 unsigned int dpte_group_width = 0; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 465 unsigned int log2_dpte_group_bytes = 0; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 466 unsigned int log2_dpte_group_length = 0; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 467 double byte_per_pixel_det_y; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 468 double byte_per_pixel_det_c; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 469 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 470 CalculateBytePerPixelAnd256BBlockSizes( 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 471 (enum source_format_class) (source_format), 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 472 (enum dm_swizzle_mode) (tiling), 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 473 &bytes_per_element_y, 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 474 &bytes_per_element_c, 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 475 &byte_per_pixel_det_y, 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 476 &byte_per_pixel_det_c, 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 477 &blk256_height_y, 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 478 &blk256_height_c, 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 479 &blk256_width_y, 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 480 &blk256_width_c); 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 481 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 482 if (!is_chroma) { 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 483 blk256_width = blk256_width_y; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 484 blk256_height = blk256_height_y; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 485 bytes_per_element = bytes_per_element_y; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 486 } else { 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 487 blk256_width = blk256_width_c; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 488 blk256_height = blk256_height_c; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 489 bytes_per_element = bytes_per_element_c; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 490 } 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 491 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 492 log2_bytes_per_element = dml_log2(bytes_per_element); 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 493 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 494 dml_print("DML_DLG: %s: surf_linear = %d\n", __func__, surf_linear); 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 495 dml_print("DML_DLG: %s: surf_vert = %d\n", __func__, surf_vert); 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 496 dml_print("DML_DLG: %s: blk256_width = %d\n", __func__, blk256_width); 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 497 dml_print("DML_DLG: %s: blk256_height = %d\n", __func__, blk256_height); 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 498 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 499 log2_blk256_width = dml_log2((double) blk256_width); 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 500 log2_blk256_height = dml_log2((double) blk256_height); 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 501 blk_bytes = surf_linear ? 256 : get_blk_size_bytes((enum source_macro_tile_size) macro_tile_size); 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 502 log2_blk_bytes = dml_log2((double) blk_bytes); 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 503 log2_blk_height = 0; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 504 log2_blk_width = 0; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 505 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 506 // remember log rule 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 507 // "+" in log is multiply 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 508 // "-" in log is divide 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 509 // "/2" is like square root 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 510 // blk is vertical biased 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 511 if (tiling != dm_sw_linear) 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 512 log2_blk_height = log2_blk256_height + dml_ceil((double) (log2_blk_bytes - 8) / 2.0, 1); 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 513 else 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 514 log2_blk_height = 0; // blk height of 1 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 515 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 516 log2_blk_width = log2_blk_bytes - log2_bytes_per_element - log2_blk_height; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 517 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 518 if (!surf_vert) { 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 519 int unsigned temp; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 520 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 521 temp = dml_round_to_multiple(vp_width - 1, blk256_width, 1) + blk256_width; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 522 if (data_pitch < blk256_width) { 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 523 dml_print("WARNING: DML_DLG: %s: swath_size calculation ignoring data_pitch=%u < blk256_width=%u\n", __func__, data_pitch, blk256_width); 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 524 } else { 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 525 if (temp > data_pitch) { 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 526 if (data_pitch >= vp_width) 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 527 temp = data_pitch; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 528 else 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 529 dml_print("WARNING: DML_DLG: %s: swath_size calculation ignoring data_pitch=%u < vp_width=%u\n", __func__, data_pitch, vp_width); 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 530 } 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 531 } 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 532 rq_dlg_param->swath_width_ub = temp; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 533 rq_dlg_param->req_per_swath_ub = temp >> log2_blk256_width; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 534 } else { 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 535 int unsigned temp; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 536 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 537 temp = dml_round_to_multiple(vp_height - 1, blk256_height, 1) + blk256_height; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 538 if (surface_height < blk256_height) { 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 539 dml_print("WARNING: DML_DLG: %s swath_size calculation ignored surface_height=%u < blk256_height=%u\n", __func__, surface_height, blk256_height); 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 540 } else { 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 541 if (temp > surface_height) { 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 542 if (surface_height >= vp_height) 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 543 temp = surface_height; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 544 else 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 545 dml_print("WARNING: DML_DLG: %s swath_size calculation ignored surface_height=%u < vp_height=%u\n", __func__, surface_height, vp_height); 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 546 } 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 547 } 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 548 rq_dlg_param->swath_width_ub = temp; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 549 rq_dlg_param->req_per_swath_ub = temp >> log2_blk256_height; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 550 } 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 551 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 552 if (!surf_vert) 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 553 rq_misc_param->full_swath_bytes = rq_dlg_param->swath_width_ub * blk256_height * bytes_per_element; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 554 else 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 555 rq_misc_param->full_swath_bytes = rq_dlg_param->swath_width_ub * blk256_width * bytes_per_element; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 556 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 557 rq_misc_param->blk256_height = blk256_height; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 558 rq_misc_param->blk256_width = blk256_width; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 559 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 560 // ------- 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 561 // meta 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 562 // ------- 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 563 log2_meta_req_bytes = 6; // meta request is 64b and is 8x8byte meta element 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 564 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 565 // each 64b meta request for dcn is 8x8 meta elements and 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 566 // a meta element covers one 256b block of the the data surface. 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 567 log2_meta_req_height = log2_blk256_height + 3; // meta req is 8x8 byte, each byte represent 1 blk256 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 568 log2_meta_req_width = log2_meta_req_bytes + 8 - log2_bytes_per_element - log2_meta_req_height; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 569 meta_req_width = 1 << log2_meta_req_width; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 570 meta_req_height = 1 << log2_meta_req_height; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 571 log2_meta_row_height = 0; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 572 meta_row_width_ub = 0; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 573 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 574 // the dimensions of a meta row are meta_row_width x meta_row_height in elements. 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 575 // calculate upper bound of the meta_row_width 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 576 if (!surf_vert) { 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 577 log2_meta_row_height = log2_meta_req_height; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 578 meta_row_width_ub = dml_round_to_multiple(vp_width - 1, meta_req_width, 1) + meta_req_width; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 579 rq_dlg_param->meta_req_per_row_ub = meta_row_width_ub / meta_req_width; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 580 } else { 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 581 log2_meta_row_height = log2_meta_req_width; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 582 meta_row_width_ub = dml_round_to_multiple(vp_height - 1, meta_req_height, 1) + meta_req_height; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 583 rq_dlg_param->meta_req_per_row_ub = meta_row_width_ub / meta_req_height; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 584 } 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 585 rq_dlg_param->meta_bytes_per_row_ub = rq_dlg_param->meta_req_per_row_ub * 64; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 586 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 587 rq_dlg_param->meta_row_height = 1 << log2_meta_row_height; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 588 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 589 log2_meta_chunk_bytes = dml_log2(rq_sizing_param->meta_chunk_bytes); 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 590 log2_meta_chunk_height = log2_meta_row_height; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 591 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 592 //full sized meta chunk width in unit of data elements 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 593 log2_meta_chunk_width = log2_meta_chunk_bytes + 8 - log2_bytes_per_element - log2_meta_chunk_height; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 594 log2_min_meta_chunk_bytes = dml_log2(rq_sizing_param->min_meta_chunk_bytes); 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 595 min_meta_chunk_width = 1 << (log2_min_meta_chunk_bytes + 8 - log2_bytes_per_element - log2_meta_chunk_height); 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 596 meta_chunk_width = 1 << log2_meta_chunk_width; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 597 meta_chunk_per_row_int = (unsigned int) (meta_row_width_ub / meta_chunk_width); 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 598 meta_row_remainder = meta_row_width_ub % meta_chunk_width; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 599 meta_chunk_threshold = 0; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 600 meta_blk_height = blk256_height * 64; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 601 meta_surface_bytes = meta_pitch * (dml_round_to_multiple(vp_height - 1, meta_blk_height, 1) + meta_blk_height) * bytes_per_element / 256; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 602 vmpg_bytes = mode_lib->soc.gpuvm_min_page_size_bytes; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 603 meta_pte_req_per_frame_ub = (dml_round_to_multiple(meta_surface_bytes - vmpg_bytes, 8 * vmpg_bytes, 1) + 8 * vmpg_bytes) / (8 * vmpg_bytes); 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 604 meta_pte_bytes_per_frame_ub = meta_pte_req_per_frame_ub * 64; //64B mpte request 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 605 rq_dlg_param->meta_pte_bytes_per_frame_ub = meta_pte_bytes_per_frame_ub; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 606 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 607 dml_print("DML_DLG: %s: meta_blk_height = %d\n", __func__, meta_blk_height); 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 608 dml_print("DML_DLG: %s: meta_surface_bytes = %d\n", __func__, meta_surface_bytes); 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 609 dml_print("DML_DLG: %s: meta_pte_req_per_frame_ub = %d\n", __func__, meta_pte_req_per_frame_ub); 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 610 dml_print("DML_DLG: %s: meta_pte_bytes_per_frame_ub = %d\n", __func__, meta_pte_bytes_per_frame_ub); 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 611 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 612 if (!surf_vert) 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 613 meta_chunk_threshold = 2 * min_meta_chunk_width - meta_req_width; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 614 else 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 615 meta_chunk_threshold = 2 * min_meta_chunk_width - meta_req_height; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 616 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 617 if (meta_row_remainder <= meta_chunk_threshold) 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 618 rq_dlg_param->meta_chunks_per_row_ub = meta_chunk_per_row_int + 1; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 619 else 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 620 rq_dlg_param->meta_chunks_per_row_ub = meta_chunk_per_row_int + 2; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 621 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 622 // ------ 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 623 // dpte 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 624 // ------ 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 625 if (surf_linear) { 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 626 log2_vmpg_height = 0; // one line high 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 627 } else { 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 628 log2_vmpg_height = (log2_vmpg_bytes - 8) / 2 + log2_blk256_height; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 629 } 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 630 log2_vmpg_width = log2_vmpg_bytes - log2_bytes_per_element - log2_vmpg_height; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 631 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 632 // only 3 possible shapes for dpte request in dimensions of ptes: 8x1, 4x2, 2x4. 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 633 if (surf_linear) { //one 64B PTE request returns 8 PTEs 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 634 log2_dpte_req_height_ptes = 0; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 635 log2_dpte_req_width = log2_vmpg_width + 3; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 636 log2_dpte_req_height = 0; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 637 } else if (log2_blk_bytes == 12) { //4KB tile means 4kB page size 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 638 //one 64B req gives 8x1 PTEs for 4KB tile 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 639 log2_dpte_req_height_ptes = 0; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 640 log2_dpte_req_width = log2_blk_width + 3; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 641 log2_dpte_req_height = log2_blk_height + 0; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 642 } else if ((log2_blk_bytes >= 16) && (log2_vmpg_bytes == 12)) { // tile block >= 64KB 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 643 //two 64B reqs of 2x4 PTEs give 16 PTEs to cover 64KB 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 644 log2_dpte_req_height_ptes = 4; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 645 log2_dpte_req_width = log2_blk256_width + 4; // log2_64KB_width 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 646 log2_dpte_req_height = log2_blk256_height + 4; // log2_64KB_height 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 647 } else { //64KB page size and must 64KB tile block 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 648 //one 64B req gives 8x1 PTEs for 64KB tile 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 649 log2_dpte_req_height_ptes = 0; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 650 log2_dpte_req_width = log2_blk_width + 3; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 651 log2_dpte_req_height = log2_blk_height + 0; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 652 } 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 653 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 654 // The dpte request dimensions in data elements is dpte_req_width x dpte_req_height 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 655 // log2_vmpg_width is how much 1 pte represent, now calculating how much a 64b pte req represent 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 656 // That depends on the pte shape (i.e. 8x1, 4x2, 2x4) 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 657 //log2_dpte_req_height = log2_vmpg_height + log2_dpte_req_height_ptes; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 658 //log2_dpte_req_width = log2_vmpg_width + log2_dpte_req_width_ptes; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 659 dpte_req_height = 1 << log2_dpte_req_height; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 660 dpte_req_width = 1 << log2_dpte_req_width; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 661 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 662 // calculate pitch dpte row buffer can hold 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 663 // round the result down to a power of two. 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 664 if (surf_linear) { 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 665 unsigned int dpte_row_height; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 666 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 667 log2_dpte_row_height_linear = dml_floor(dml_log2(dpte_buf_in_pte_reqs * dpte_req_width / data_pitch), 1); 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 668 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 669 dml_print("DML_DLG: %s: is_chroma = %d\n", __func__, is_chroma); 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 670 dml_print("DML_DLG: %s: dpte_buf_in_pte_reqs = %d\n", __func__, dpte_buf_in_pte_reqs); 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 671 dml_print("DML_DLG: %s: log2_dpte_row_height_linear = %d\n", __func__, log2_dpte_row_height_linear); 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 672 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 673 ASSERT(log2_dpte_row_height_linear >= 3); 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 674 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 675 if (log2_dpte_row_height_linear > 7) 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 676 log2_dpte_row_height_linear = 7; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 677 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 678 log2_dpte_row_height = log2_dpte_row_height_linear; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 679 // For linear, the dpte row is pitch dependent and the pte requests wrap at the pitch boundary. 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 680 // the dpte_row_width_ub is the upper bound of data_pitch*dpte_row_height in elements with this unique buffering. 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 681 dpte_row_height = 1 << log2_dpte_row_height; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 682 dpte_row_width_ub = dml_round_to_multiple(data_pitch * dpte_row_height - 1, dpte_req_width, 1) + dpte_req_width; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 683 rq_dlg_param->dpte_req_per_row_ub = dpte_row_width_ub / dpte_req_width; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 684 } else { 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 685 // the upper bound of the dpte_row_width without dependency on viewport position follows. 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 686 // for tiled mode, row height is the same as req height and row store up to vp size upper bound 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 687 if (!surf_vert) { 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 688 log2_dpte_row_height = log2_dpte_req_height; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 689 dpte_row_width_ub = dml_round_to_multiple(vp_width - 1, dpte_req_width, 1) + dpte_req_width; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 690 rq_dlg_param->dpte_req_per_row_ub = dpte_row_width_ub / dpte_req_width; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 691 } else { 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 692 log2_dpte_row_height = (log2_blk_width < log2_dpte_req_width) ? log2_blk_width : log2_dpte_req_width; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 693 dpte_row_width_ub = dml_round_to_multiple(vp_height - 1, dpte_req_height, 1) + dpte_req_height; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 694 rq_dlg_param->dpte_req_per_row_ub = dpte_row_width_ub / dpte_req_height; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 695 } 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 696 } 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 697 if (log2_blk_bytes >= 16 && log2_vmpg_bytes == 12) // tile block >= 64KB 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 698 rq_dlg_param->dpte_bytes_per_row_ub = rq_dlg_param->dpte_req_per_row_ub * 128; //2*64B dpte request 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 699 else 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 700 rq_dlg_param->dpte_bytes_per_row_ub = rq_dlg_param->dpte_req_per_row_ub * 64; //64B dpte request 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 701 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 702 rq_dlg_param->dpte_row_height = 1 << log2_dpte_row_height; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 703 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 704 // the dpte_group_bytes is reduced for the specific case of vertical 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 705 // access of a tile surface that has dpte request of 8x1 ptes. 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 706 if (hostvm_enable) 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 707 rq_sizing_param->dpte_group_bytes = 512; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 708 else { 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 @709 if (!surf_linear & (log2_dpte_req_height_ptes == 0) & surf_vert) //reduced, in this case, will have page fault within a group 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 710 rq_sizing_param->dpte_group_bytes = 512; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 711 else 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 712 rq_sizing_param->dpte_group_bytes = 2048; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 713 } 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 714 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 715 //since pte request size is 64byte, the number of data pte requests per full sized group is as follows. 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 716 log2_dpte_group_bytes = dml_log2(rq_sizing_param->dpte_group_bytes); 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 717 log2_dpte_group_length = log2_dpte_group_bytes - 6; //length in 64b requests 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 718 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 719 // full sized data pte group width in elements 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 720 if (!surf_vert) 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 721 log2_dpte_group_width = log2_dpte_group_length + log2_dpte_req_width; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 722 else 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 723 log2_dpte_group_width = log2_dpte_group_length + log2_dpte_req_height; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 724 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 725 //But if the tile block >=64KB and the page size is 4KB, then each dPTE request is 2*64B 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 726 if ((log2_blk_bytes >= 16) && (log2_vmpg_bytes == 12)) // tile block >= 64KB 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 727 log2_dpte_group_width = log2_dpte_group_width - 1; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 728 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 729 dpte_group_width = 1 << log2_dpte_group_width; 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 730 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 731 // since dpte groups are only aligned to dpte_req_width and not dpte_group_width, 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 732 // the upper bound for the dpte groups per row is as follows. 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 733 rq_dlg_param->dpte_groups_per_row_ub = dml_ceil((double) dpte_row_width_ub / dpte_group_width, 1); 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 734 } 74458c081fcfb0 Nicholas Kazlauskas 2021-05-19 735 :::::: The code at line 709 was first introduced by commit :::::: 74458c081fcfb0423877e630de2746daefdb16e4 drm/amd/display: Add DCN3.1 DML calculation support :::::: TO: Nicholas Kazlauskas <[email protected]> :::::: CC: Alex Deucher <[email protected]> -- 0-DAY CI Kernel Test Service https://01.org/lkp _______________________________________________ kbuild mailing list -- [email protected] To unsubscribe send an email to [email protected]
