Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amdgpu: update the method to get fb_loc of memory training(V4)

The method of getting fb_loc changed from parsing VBIOS to
taking certain offset from top of VRAM

Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Tianci.Yin <tianci.yin@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Tianci.Yin and committed by
Alex Deucher
8d40002f 7eca4006

+23 -53
+1 -2
drivers/gpu/drm/amd/amdgpu/amdgpu.h
··· 636 636 struct amdgpu_bo *reserved_bo; 637 637 void *va; 638 638 639 - /* Offset on the top of VRAM, used as c2p write buffer. 639 + /* GDDR6 training support flag. 640 640 */ 641 - u64 mem_train_fb_loc; 642 641 bool mem_train_support; 643 642 }; 644 643
+1 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c
··· 2022 2022 if (adev->is_atom_fw) { 2023 2023 amdgpu_atomfirmware_scratch_regs_init(adev); 2024 2024 amdgpu_atomfirmware_allocate_fb_scratch(adev); 2025 - ret = amdgpu_atomfirmware_get_mem_train_fb_loc(adev); 2025 + ret = amdgpu_atomfirmware_get_mem_train_info(adev); 2026 2026 if (ret) { 2027 2027 DRM_ERROR("Failed to get mem train fb location.\n"); 2028 2028 return ret;
+4 -34
drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
··· 525 525 return ret; 526 526 } 527 527 528 - int amdgpu_atomfirmware_get_mem_train_fb_loc(struct amdgpu_device *adev) 528 + int amdgpu_atomfirmware_get_mem_train_info(struct amdgpu_device *adev) 529 529 { 530 530 struct atom_context *ctx = adev->mode_info.atom_context; 531 - unsigned char *bios = ctx->bios; 532 - struct vram_reserve_block *reserved_block; 533 - int index, block_number; 531 + int index; 534 532 uint8_t frev, crev; 535 533 uint16_t data_offset, size; 536 - uint32_t start_address_in_kb; 537 - uint64_t offset; 538 534 int ret; 539 535 540 536 adev->fw_vram_usage.mem_train_support = false; ··· 565 569 return -EINVAL; 566 570 } 567 571 568 - reserved_block = (struct vram_reserve_block *) 569 - (bios + data_offset + sizeof(struct atom_common_table_header)); 570 - block_number = ((unsigned int)size - sizeof(struct atom_common_table_header)) 571 - / sizeof(struct vram_reserve_block); 572 - reserved_block += (block_number > 0) ? block_number-1 : 0; 573 - DRM_DEBUG("block_number:0x%04x, last block: 0x%08xkb sz, %dkb fw, %dkb drv.\n", 574 - block_number, 575 - le32_to_cpu(reserved_block->start_address_in_kb), 576 - le16_to_cpu(reserved_block->used_by_firmware_in_kb), 577 - le16_to_cpu(reserved_block->used_by_driver_in_kb)); 578 - if (reserved_block->used_by_firmware_in_kb > 0) { 579 - start_address_in_kb = le32_to_cpu(reserved_block->start_address_in_kb); 580 - offset = (uint64_t)start_address_in_kb * ONE_KiB; 581 - if ((offset & (ONE_MiB - 1)) < (4 * ONE_KiB + 1) ) { 582 - offset -= ONE_MiB; 583 - } 584 - 585 - offset &= ~(ONE_MiB - 1); 586 - adev->fw_vram_usage.mem_train_fb_loc = offset; 587 - adev->fw_vram_usage.mem_train_support = true; 588 - DRM_DEBUG("mem_train_fb_loc:0x%09llx.\n", offset); 589 - ret = 0; 590 - } else { 591 - DRM_ERROR("used_by_firmware_in_kb is 0!\n"); 592 - ret = -EINVAL; 593 - } 594 - 595 - return ret; 572 + adev->fw_vram_usage.mem_train_support = true; 573 + return 0; 596 574 }
+1 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.h
··· 31 31 int amdgpu_atomfirmware_allocate_fb_scratch(struct amdgpu_device *adev); 32 32 int amdgpu_atomfirmware_get_vram_info(struct amdgpu_device *adev, 33 33 int *vram_width, int *vram_type, int *vram_vendor); 34 - int amdgpu_atomfirmware_get_mem_train_fb_loc(struct amdgpu_device *adev); 34 + int amdgpu_atomfirmware_get_mem_train_info(struct amdgpu_device *adev); 35 35 int amdgpu_atomfirmware_get_clock_info(struct amdgpu_device *adev); 36 36 int amdgpu_atomfirmware_get_gfx_info(struct amdgpu_device *adev); 37 37 bool amdgpu_atomfirmware_mem_ecc_supported(struct amdgpu_device *adev);
+9 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
··· 1720 1720 return 0; 1721 1721 } 1722 1722 1723 + static u64 amdgpu_ttm_training_get_c2p_offset(u64 vram_size) 1724 + { 1725 + if ((vram_size & (ONE_MiB - 1)) < (4 * ONE_KiB + 1) ) 1726 + vram_size -= ONE_MiB; 1727 + 1728 + return ALIGN(vram_size, ONE_MiB); 1729 + } 1730 + 1723 1731 /** 1724 1732 * amdgpu_ttm_training_reserve_vram_init - create bo vram reservation from memory training 1725 1733 * ··· 1746 1738 return 0; 1747 1739 } 1748 1740 1749 - ctx->c2p_train_data_offset = adev->fw_vram_usage.mem_train_fb_loc; 1741 + ctx->c2p_train_data_offset = amdgpu_ttm_training_get_c2p_offset(adev->gmc.mc_vram_size); 1750 1742 ctx->p2c_train_data_offset = (adev->gmc.mc_vram_size - GDDR6_MEM_TRAINING_OFFSET); 1751 1743 ctx->train_data_size = GDDR6_MEM_TRAINING_DATA_SIZE_IN_BYTES; 1752 1744
+7
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
··· 66 66 unsigned long offset; 67 67 }; 68 68 69 + /* Definitions for constance */ 70 + enum amdgpu_internal_constants 71 + { 72 + ONE_KiB = 0x400, 73 + ONE_MiB = 0x100000, 74 + }; 75 + 69 76 extern const struct ttm_mem_type_manager_func amdgpu_gtt_mgr_func; 70 77 extern const struct ttm_mem_type_manager_func amdgpu_vram_mgr_func; 71 78
-14
drivers/gpu/drm/amd/include/atomfirmware.h
··· 672 672 uint16_t used_by_driver_in_kb; 673 673 }; 674 674 675 - /* This is part of vram_usagebyfirmware_v2_1 */ 676 - struct vram_reserve_block 677 - { 678 - uint32_t start_address_in_kb; 679 - uint16_t used_by_firmware_in_kb; 680 - uint16_t used_by_driver_in_kb; 681 - }; 682 - 683 - /* Definitions for constance */ 684 - enum atomfirmware_internal_constants 685 - { 686 - ONE_KiB = 0x400, 687 - ONE_MiB = 0x100000, 688 - }; 689 675 690 676 /* 691 677 ***************************************************************************