Hi, Applying this patch to amd-staging-drm-next, with checkpatch.pl enabled, generates the following output. Perhaps those issues should be address and fixed.
$git am ~/patches/tongliu01/\[PATCH]\ drm_amdgpu\:\ add\ vram\ reservation\ logic\ based\ on\ vram_usagebyfirmware_v2_2\ -\ Tong\ Liu01\ \<Tong.Liu01\@amd.com\>\ -\ 2022-11-08\ 0532.eml Applying: drm/amdgpu: add vram reservation logic based on vram_usagebyfirmware_v2_2 -:10: CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis #10: FILE: drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c:105: +static int amdgpu_atomfirmware_allocate_fb_v2_1(struct amdgpu_device *adev, + struct vram_usagebyfirmware_v2_1 *firmware_usage_v2_1, -:13: CHECK:PREFER_KERNEL_TYPES: Prefer kernel type 'u32' over 'uint32_t' #13: FILE: drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c:108: + uint32_t start_addr, fw_size, drv_size; -:20: CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis #20: FILE: drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c:115: + DRM_DEBUG("atom firmware v2_1 requested %08x %dkb fw %dkb drv\n", + start_addr, -:40: CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis #40: FILE: drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c:135: +static int amdgpu_atomfirmware_allocate_fb_v2_2(struct amdgpu_device *adev, + struct vram_usagebyfirmware_v2_2 *firmware_usage_v2_2, -:43: CHECK:PREFER_KERNEL_TYPES: Prefer kernel type 'u32' over 'uint32_t' #43: FILE: drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c:138: + uint32_t fw_start_addr, fw_size, drv_start_addr, drv_size; -:45: WARNING:LONG_LINE: line length of 88 exceeds 81 columns #45: FILE: drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c:140: + fw_start_addr = le32_to_cpu(firmware_usage_v2_2->fw_region_start_address_in_kb); -:48: WARNING:LONG_LINE: line length of 94 exceeds 81 columns #48: FILE: drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c:143: + drv_start_addr = le32_to_cpu(firmware_usage_v2_2->driver_region0_start_address_in_kb); -:49: WARNING:LONG_LINE: line length of 82 exceeds 81 columns #49: FILE: drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c:144: + drv_size = le32_to_cpu(firmware_usage_v2_2->used_by_driver_region0_in_kb); -:51: WARNING:LONG_LINE_STRING: line length of 86 exceeds 81 columns #51: FILE: drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c:146: + DRM_DEBUG("atom requested fw start at %08x %dkb and drv start at %08x %dkb\n", -:52: CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis #52: FILE: drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c:147: + DRM_DEBUG("atom requested fw start at %08x %dkb and drv start at %08x %dkb\n", + fw_start_addr, -:57: WARNING:LONG_LINE: line length of 82 exceeds 81 columns #57: FILE: drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c:152: + if ((fw_start_addr & (ATOM_VRAM_BLOCK_NEEDS_NO_RESERVATION << 30)) == 0) { -:64: WARNING:LONG_LINE: line length of 83 exceeds 81 columns #64: FILE: drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c:159: + if ((drv_start_addr & (ATOM_VRAM_BLOCK_NEEDS_NO_RESERVATION << 30)) == 0) { -:85: CHECK:PREFER_KERNEL_TYPES: Prefer kernel type 'u8' over 'uint8_t' #85: FILE: drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c:178: + uint8_t frev, crev; -:109: WARNING:LONG_LINE: line length of 90 exceeds 81 columns #109: FILE: drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c:181: + if (amdgpu_atom_parse_data_header(ctx, index, NULL, &frev, &crev, &data_offset)) { -:112: WARNING:LONG_LINE: line length of 94 exceeds 81 columns #112: FILE: drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c:184: + (struct vram_usagebyfirmware_v2_1 *)(ctx->bios + data_offset); -:114: CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis #114: FILE: drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c:186: + amdgpu_atomfirmware_allocate_fb_v2_1(adev, + firmware_usage_v2_1, -:118: WARNING:LONG_LINE: line length of 94 exceeds 81 columns #118: FILE: drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c:190: + (struct vram_usagebyfirmware_v2_2 *)(ctx->bios + data_offset); -:120: CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis #120: FILE: drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c:192: + amdgpu_atomfirmware_allocate_fb_v2_2(adev, + firmware_usage_v2_2, -:149: CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis #149: FILE: drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c:1595: + amdgpu_bo_free_kernel(&adev->mman.drv_vram_usage_reserved_bo, + NULL, NULL); -:168: CHECK:PREFER_KERNEL_TYPES: Prefer kernel type 'u64' over 'uint64_t' #168: FILE: drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c:1633: + uint64_t vram_size = adev->gmc.visible_vram_size; -:239: WARNING:LONG_LINE_COMMENT: line length of 113 exceeds 81 columns #239: FILE: drivers/gpu/drm/amd/include/atomfirmware.h:709: + VBIOS/PRE-OS always reserve a FB region at the top of frame buffer. driver should not write access that region. -:239: WARNING:BLOCK_COMMENT_STYLE: Block comments use * on subsequent lines #239: FILE: drivers/gpu/drm/amd/include/atomfirmware.h:709: +/* + VBIOS/PRE-OS always reserve a FB region at the top of frame buffer. driver should not write access that region. -:240: WARNING:LONG_LINE_COMMENT: line length of 112 exceeds 81 columns #240: FILE: drivers/gpu/drm/amd/include/atomfirmware.h:710: + driver can allocate their own reservation region as long as it does not overlap firwmare's reservation region. -:245: WARNING:LONG_LINE_COMMENT: line length of 132 exceeds 81 columns #245: FILE: drivers/gpu/drm/amd/include/atomfirmware.h:715: + update start_address_in_kb = total_mem_size_in_kb - used_by_firmware_in_kb; ( total_mem_size_in_kb = reg(CONFIG_MEMSIZE)<<10) -:248: WARNING:LONG_LINE_COMMENT: line length of 86 exceeds 81 columns #248: FILE: drivers/gpu/drm/amd/include/atomfirmware.h:718: + driver reservation start address = (start_address_in_kb - used_by_driver_in_kb) -:249: WARNING:LONG_LINE_COMMENT: line length of 102 exceeds 81 columns #249: FILE: drivers/gpu/drm/amd/include/atomfirmware.h:719: + Comment1[hchan]: There is only one reservation at the beginning of the FB reserved by Host driver. -:257: WARNING:LONG_LINE_COMMENT: line length of 87 exceeds 81 columns #257: FILE: drivers/gpu/drm/amd/include/atomfirmware.h:727: + driver reservation start address = (total_mem_size_in_kb - used_by_driver_in_kb) -:262: WARNING:LONG_LINE_COMMENT: line length of 99 exceeds 81 columns #262: FILE: drivers/gpu/drm/amd/include/atomfirmware.h:732: + VBIOS/UEFIGOP update used_by_firmware_in_kb = atom_firmware_Info_v3_3.fw_reserved_size_in_kb; -:263: WARNING:LONG_LINE_COMMENT: line length of 134 exceeds 81 columns #263: FILE: drivers/gpu/drm/amd/include/atomfirmware.h:733: + update start_address_in_kb = total_mem_size_in_kb - used_by_firmware_in_kb; ( total_mem_size_in_kb = reg(CONFIG_MEMSIZE)<<10 ) -:268: WARNING:LONG_LINE_COMMENT: line length of 86 exceeds 81 columns #268: FILE: drivers/gpu/drm/amd/include/atomfirmware.h:738: + driver reservation start address = (start_address_in_kb - used_by_driver_in_kb) -:271: WARNING:TYPO_SPELLING: 'dirver' may be misspelled - perhaps 'driver'? #271: FILE: drivers/gpu/drm/amd/include/atomfirmware.h:741: + dirver can allocate it reservation any place as long as it does overlap pre-OS FW reservation area ^^^^^^ -:271: WARNING:LONG_LINE_COMMENT: line length of 104 exceeds 81 columns #271: FILE: drivers/gpu/drm/amd/include/atomfirmware.h:741: + dirver can allocate it reservation any place as long as it does overlap pre-OS FW reservation area -:273: WARNING:LONG_LINE_COMMENT: line length of 94 exceeds 81 columns #273: FILE: drivers/gpu/drm/amd/include/atomfirmware.h:743: + driver set driver_region0_start_address_in_kb = driver reservation region start address -:274: WARNING:LONG_LINE_COMMENT: line length of 97 exceeds 81 columns #274: FILE: drivers/gpu/drm/amd/include/atomfirmware.h:744: + Comment2[hchan]: Host driver can set used_by_firmware_in_kb and start_address_in_kb to zero -:275: WARNING:LONG_LINE_COMMENT: line length of 83 exceeds 81 columns #275: FILE: drivers/gpu/drm/amd/include/atomfirmware.h:745: + as the reservation for VF as it doesn’t exist. And Host driver should also -:276: WARNING:LONG_LINE_COMMENT: line length of 83 exceeds 81 columns #276: FILE: drivers/gpu/drm/amd/include/atomfirmware.h:746: + update atom_firmware_Info table to remove the same VBIOS reservation as well. -:288: CHECK:PREFER_KERNEL_TYPES: Prefer kernel type 'u32' over 'uint32_t' #288: FILE: drivers/gpu/drm/amd/include/atomfirmware.h:754: + uint32_t start_address_in_kb; -:289: CHECK:PREFER_KERNEL_TYPES: Prefer kernel type 'u16' over 'uint16_t' #289: FILE: drivers/gpu/drm/amd/include/atomfirmware.h:755: + uint16_t used_by_firmware_in_kb; -:290: CHECK:PREFER_KERNEL_TYPES: Prefer kernel type 'u16' over 'uint16_t' #290: FILE: drivers/gpu/drm/amd/include/atomfirmware.h:756: + uint16_t used_by_driver_in_kb; -:295: CHECK:PREFER_KERNEL_TYPES: Prefer kernel type 'u32' over 'uint32_t' #295: FILE: drivers/gpu/drm/amd/include/atomfirmware.h:761: + uint32_t fw_region_start_address_in_kb; -:296: CHECK:PREFER_KERNEL_TYPES: Prefer kernel type 'u16' over 'uint16_t' #296: FILE: drivers/gpu/drm/amd/include/atomfirmware.h:762: + uint16_t used_by_firmware_in_kb; -:297: CHECK:PREFER_KERNEL_TYPES: Prefer kernel type 'u16' over 'uint16_t' #297: FILE: drivers/gpu/drm/amd/include/atomfirmware.h:763: + uint16_t reserved; -:298: CHECK:PREFER_KERNEL_TYPES: Prefer kernel type 'u32' over 'uint32_t' #298: FILE: drivers/gpu/drm/amd/include/atomfirmware.h:764: + uint32_t driver_region0_start_address_in_kb; -:299: CHECK:PREFER_KERNEL_TYPES: Prefer kernel type 'u32' over 'uint32_t' #299: FILE: drivers/gpu/drm/amd/include/atomfirmware.h:765: + uint32_t used_by_driver_region0_in_kb; -:300: CHECK:PREFER_KERNEL_TYPES: Prefer kernel type 'u32' over 'uint32_t' #300: FILE: drivers/gpu/drm/amd/include/atomfirmware.h:766: + uint32_t reserved32[7]; total: 0 errors, 25 warnings, 20 checks, 281 lines checked NOTE: For some of the reported defects, checkpatch may be able to mechanically convert to the typical style using --fix or --fix-inplace. Your patch has style problems, please review. NOTE: If any of the errors are false positives, please report them to the maintainer, see CHECKPATCH in MAINTAINERS. scripts/checkpatch.pl found problems with your patch. To disable its check, run your Git command as (unset GIT_CHECKPATCH; git ...) $_ Regards, Luben On 2022-11-08 09:04, Christian König wrote: > Yeah, I mean the code looks correct. > > It's just that style problems are usually pointed out by automated > checkers, especially things like dos line endings. > > So get that fixed and we can push it immediately. > > Thanks, > Christian. > > Am 08.11.22 um 14:49 schrieb Chang, HaiJun: >> [AMD Official Use Only - General] >> >> + Bokun to help addressing the coding style problem in MKM side. >> >> -----Original Message----- >> From: Koenig, Christian <christian.koe...@amd.com> >> Sent: Tuesday, November 8, 2022 8:53 PM >> To: Liu01, Tong (Esther) <tong.li...@amd.com>; amd-gfx@lists.freedesktop.org >> Cc: Quan, Evan <evan.q...@amd.com>; Chen, Horace <horace.c...@amd.com>; >> Tuikov, Luben <luben.tui...@amd.com>; Deucher, Alexander >> <alexander.deuc...@amd.com>; Xiao, Jack <jack.x...@amd.com>; Zhang, Hawking >> <hawking.zh...@amd.com>; Liu, Monk <monk....@amd.com>; Xu, Feifei >> <feifei...@amd.com>; Wang, Yang(Kevin) <kevinyang.w...@amd.com>; Chang, >> HaiJun <haijun.ch...@amd.com>; Sohail, Rashid <rashid.soh...@amd.com> >> Subject: Re: [PATCH] drm/amdgpu: add vram reservation logic based on >> vram_usagebyfirmware_v2_2 >> >> Hi Esther >> >> well there are a couple of things which you need to address before getting >> this merged. >> >> First of all the patch you send out uses dos line endings instead of the >> unix line endings. Not sure how you manage to do that, but please use "git >> send-email" instead to avoid that. >> >> Then your patch contains a bunch of white spaces after code warning which >> checkpatch.pl complains about (after ignoring the dos line ending warnings). >> So this was clearly not properly checked with checkpatch.pl. >> >> Then the kernel coding style usually says that with a multi line "if (" >> the next lines should start after the opening "(". In other words intend >> with tabs and the whitespaces. I'm not sure what editor you are using, but >> there are standard settings available for basically all large editors which >> does stuff like that automatically. Please try to use one of those. >> >> Regarding the casing of the values it's a good argument that you only move >> the code around, but the general coding style is just extremely >> questionable. The defines should use the lowest necessary integer type. >> But it's correct that this should probably be part of another patch. >> >> Regards, >> Christian. >> >> Am 08.11.22 um 11:40 schrieb Liu01, Tong (Esther): >>> [AMD Official Use Only - General] >>> >>> Hi @Koenig, Christian, >>> >>> Refined as your comment. By the way: >>> if ((start_addr & ATOM_VRAM_OPERATION_FLAGS_MASK) == >>> + (uint32_t)(ATOM_VRAM_BLOCK_SRIOV_MSG_SHARE_RESERVATION << >>> + ATOM_VRAM_OPERATION_FLAGS_SHIFT)) >>> >>> This part is the old code, I just move it out from the original function to >>> shrink the function size as your comment before. And now I just removed the >>> first uint32_t since if remove both will cause "warning: bitwise comparison >>> always evaluates to false". And I tested the code after removing the first >>> uint32_t, the code works well. Please review the new patch, thanks. >>> >>> Kind regards, >>> Esther >>> >>> -----Original Message----- >>> From: Tong Liu01 <tong.li...@amd.com> >>> Sent: 2022年11月8日星期二 下午6:33 >>> To: amd-gfx@lists.freedesktop.org >>> Cc: Quan, Evan <evan.q...@amd.com>; Chen, Horace >>> <horace.c...@amd.com>; Tuikov, Luben <luben.tui...@amd.com>; Koenig, >>> Christian <christian.koe...@amd.com>; Deucher, Alexander >>> <alexander.deuc...@amd.com>; Xiao, Jack <jack.x...@amd.com>; Zhang, >>> Hawking <hawking.zh...@amd.com>; Liu, Monk <monk....@amd.com>; Xu, >>> Feifei <feifei...@amd.com>; Wang, Yang(Kevin) >>> <kevinyang.w...@amd.com>; Liu01, Tong (Esther) <tong.li...@amd.com> >>> Subject: [PATCH] drm/amdgpu: add vram reservation logic based on >>> vram_usagebyfirmware_v2_2 >>> >>> Move TMR region from top of FB to 2MB for FFBM, so we need to reserve >>> TMR region firstly to make sure TMR can be allocated at 2MB >>> >>> Signed-off-by: Tong Liu01 <tong.li...@amd.com> >>> --- >>> .../gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c | 106 ++++++++++++++---- >>> drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 50 +++++++++ >>> drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 5 + >>> drivers/gpu/drm/amd/include/atomfirmware.h | 62 ++++++++-- >>> 4 files changed, 192 insertions(+), 31 deletions(-) >>> >>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c >>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c >>> index b81b77a9efa6..032dc2678d7c 100644 >>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c >>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c >>> @@ -101,39 +101,99 @@ void amdgpu_atomfirmware_scratch_regs_init(struct >>> amdgpu_device *adev) >>> } >>> } >>> >>> +static int amdgpu_atomfirmware_allocate_fb_v2_1(struct amdgpu_device *adev, >>> + struct vram_usagebyfirmware_v2_1 *firmware_usage_v2_1, >>> + int *usage_bytes) >>> +{ >>> + uint32_t start_addr, fw_size, drv_size; >>> + >>> + start_addr = le32_to_cpu(firmware_usage_v2_1->start_address_in_kb); >>> + fw_size = le16_to_cpu(firmware_usage_v2_1->used_by_firmware_in_kb); >>> + drv_size = le16_to_cpu(firmware_usage_v2_1->used_by_driver_in_kb); >>> + >>> + DRM_DEBUG("atom firmware v2_1 requested %08x %dkb fw %dkb drv\n", >>> + start_addr, >>> + fw_size, >>> + drv_size); >>> + >>> + if ((start_addr & ATOM_VRAM_OPERATION_FLAGS_MASK) == >>> + (uint32_t)(ATOM_VRAM_BLOCK_SRIOV_MSG_SHARE_RESERVATION << >>> + ATOM_VRAM_OPERATION_FLAGS_SHIFT)) { >>> + /* Firmware request VRAM reservation for SR-IOV */ >>> + adev->mman.fw_vram_usage_start_offset = (start_addr & >>> + (~ATOM_VRAM_OPERATION_FLAGS_MASK)) << 10; >>> + adev->mman.fw_vram_usage_size = fw_size << 10; >>> + /* Use the default scratch size */ >>> + *usage_bytes = 0; >>> + } else { >>> + *usage_bytes = drv_size << 10; >>> + } >>> + return 0; >>> +} >>> + >>> +static int amdgpu_atomfirmware_allocate_fb_v2_2(struct amdgpu_device *adev, >>> + struct vram_usagebyfirmware_v2_2 *firmware_usage_v2_2, >>> + int *usage_bytes) >>> +{ >>> + uint32_t fw_start_addr, fw_size, drv_start_addr, drv_size; >>> + >>> + fw_start_addr = >>> le32_to_cpu(firmware_usage_v2_2->fw_region_start_address_in_kb); >>> + fw_size = le16_to_cpu(firmware_usage_v2_2->used_by_firmware_in_kb); >>> + >>> + drv_start_addr = >>> le32_to_cpu(firmware_usage_v2_2->driver_region0_start_address_in_kb); >>> + drv_size = >>> +le32_to_cpu(firmware_usage_v2_2->used_by_driver_region0_in_kb); >>> + >>> + DRM_DEBUG("atom requested fw start at %08x %dkb and drv start at %08x >>> %dkb\n", >>> + fw_start_addr, >>> + fw_size, >>> + drv_start_addr, >>> + drv_size); >>> + >>> + if ((fw_start_addr & (ATOM_VRAM_BLOCK_NEEDS_NO_RESERVATION << 30)) == >>> 0) { >>> + /* Firmware request VRAM reservation for SR-IOV */ >>> + adev->mman.fw_vram_usage_start_offset = (fw_start_addr & >>> + (~ATOM_VRAM_OPERATION_FLAGS_MASK)) << 10; >>> + adev->mman.fw_vram_usage_size = fw_size << 10; >>> + } >>> + >>> + if ((drv_start_addr & (ATOM_VRAM_BLOCK_NEEDS_NO_RESERVATION << 30)) >>> == 0) { >>> + /* driver request VRAM reservation for SR-IOV */ >>> + adev->mman.drv_vram_usage_start_offset = (drv_start_addr & >>> + (~ATOM_VRAM_OPERATION_FLAGS_MASK)) << 10; >>> + adev->mman.drv_vram_usage_size = drv_size << 10; >>> + } >>> + >>> + *usage_bytes = 0; >>> + return 0; >>> +} >>> + >>> int amdgpu_atomfirmware_allocate_fb_scratch(struct amdgpu_device *adev) >>> { >>> struct atom_context *ctx = adev->mode_info.atom_context; >>> int index = >>> get_index_into_master_table(atom_master_list_of_data_tables_v2_1, >>> vram_usagebyfirmware); >>> - struct vram_usagebyfirmware_v2_1 *firmware_usage; >>> - uint32_t start_addr, size; >>> + struct vram_usagebyfirmware_v2_1 *firmware_usage_v2_1; >>> + struct vram_usagebyfirmware_v2_2 *firmware_usage_v2_2; >>> uint16_t data_offset; >>> + uint8_t frev, crev; >>> int usage_bytes = 0; >>> >>> - if (amdgpu_atom_parse_data_header(ctx, index, NULL, NULL, NULL, >>> &data_offset)) { >>> - firmware_usage = (struct vram_usagebyfirmware_v2_1 >>> *)(ctx->bios + data_offset); >>> - DRM_DEBUG("atom firmware requested %08x %dkb fw %dkb drv\n", >>> - le32_to_cpu(firmware_usage->start_address_in_kb), >>> - le16_to_cpu(firmware_usage->used_by_firmware_in_kb), >>> - le16_to_cpu(firmware_usage->used_by_driver_in_kb)); >>> - >>> - start_addr = le32_to_cpu(firmware_usage->start_address_in_kb); >>> - size = le16_to_cpu(firmware_usage->used_by_firmware_in_kb); >>> - >>> - if ((uint32_t)(start_addr & ATOM_VRAM_OPERATION_FLAGS_MASK) == >>> - >>> (uint32_t)(ATOM_VRAM_BLOCK_SRIOV_MSG_SHARE_RESERVATION << >>> - ATOM_VRAM_OPERATION_FLAGS_SHIFT)) { >>> - /* Firmware request VRAM reservation for SR-IOV */ >>> - adev->mman.fw_vram_usage_start_offset = (start_addr & >>> - (~ATOM_VRAM_OPERATION_FLAGS_MASK)) << 10; >>> - adev->mman.fw_vram_usage_size = size << 10; >>> - /* Use the default scratch size */ >>> - usage_bytes = 0; >>> - } else { >>> - usage_bytes = >>> le16_to_cpu(firmware_usage->used_by_driver_in_kb) << 10; >>> + if (amdgpu_atom_parse_data_header(ctx, index, NULL, &frev, &crev, >>> &data_offset)) { >>> + if (frev == 2 && crev == 1) { >>> + firmware_usage_v2_1 = >>> + (struct vram_usagebyfirmware_v2_1 >>> *)(ctx->bios + data_offset); >>> + amdgpu_atomfirmware_allocate_fb_v2_1(adev, >>> + firmware_usage_v2_1, >>> + &usage_bytes); >>> + } else if (frev >= 2 && crev >= 2) { >>> + firmware_usage_v2_2 = >>> + (struct vram_usagebyfirmware_v2_2 >>> *)(ctx->bios + data_offset); >>> + amdgpu_atomfirmware_allocate_fb_v2_2(adev, >>> + firmware_usage_v2_2, >>> + &usage_bytes); >>> } >>> } >>> + >>> ctx->scratch_size_bytes = 0; >>> if (usage_bytes == 0) >>> usage_bytes = 20 * 1024; >>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c >>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c >>> index 585460ab8dfd..4a73cb314086 100644 >>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c >>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c >>> @@ -1578,6 +1578,22 @@ static void amdgpu_ttm_fw_reserve_vram_fini(struct >>> amdgpu_device *adev) >>> NULL, &adev->mman.fw_vram_usage_va); >>> } >>> >>> +/* >>> + * Driver Reservation functions >>> + */ >>> +/** >>> + * amdgpu_ttm_drv_reserve_vram_fini - free drv reserved vram >>> + * >>> + * @adev: amdgpu_device pointer >>> + * >>> + * free drv reserved vram if it has been reserved. >>> + */ >>> +static void amdgpu_ttm_drv_reserve_vram_fini(struct amdgpu_device >>> +*adev) { >>> + amdgpu_bo_free_kernel(&adev->mman.drv_vram_usage_reserved_bo, >>> + NULL, NULL); >>> +} >>> + >>> /** >>> * amdgpu_ttm_fw_reserve_vram_init - create bo vram reservation from fw >>> * >>> @@ -1604,6 +1620,31 @@ static int amdgpu_ttm_fw_reserve_vram_init(struct >>> amdgpu_device *adev) >>> &adev->mman.fw_vram_usage_va); >>> } >>> >>> +/** >>> + * amdgpu_ttm_drv_reserve_vram_init - create bo vram reservation from >>> +driver >>> + * >>> + * @adev: amdgpu_device pointer >>> + * >>> + * create bo vram reservation from drv. >>> + */ >>> +static int amdgpu_ttm_drv_reserve_vram_init(struct amdgpu_device >>> +*adev) { >>> + uint64_t vram_size = adev->gmc.visible_vram_size; >>> + >>> + adev->mman.drv_vram_usage_reserved_bo = NULL; >>> + >>> + if (adev->mman.drv_vram_usage_size == 0 || >>> + adev->mman.drv_vram_usage_size > vram_size) >>> + return 0; >>> + >>> + return amdgpu_bo_create_kernel_at(adev, >>> + >>> adev->mman.drv_vram_usage_start_offset, >>> + adev->mman.drv_vram_usage_size, >>> + AMDGPU_GEM_DOMAIN_VRAM, >>> + >>> &adev->mman.drv_vram_usage_reserved_bo, >>> + NULL); >>> +} >>> + >>> /* >>> * Memoy training reservation functions >>> */ >>> @@ -1771,6 +1812,14 @@ int amdgpu_ttm_init(struct amdgpu_device *adev) >>> return r; >>> } >>> >>> + /* >>> + *The reserved vram for driver must be pinned to the specified >>> + *place on the VRAM, so reserve it early. >>> + */ >>> + r = amdgpu_ttm_drv_reserve_vram_init(adev); >>> + if (r) >>> + return r; >>> + >>> /* >>> * only NAVI10 and onwards ASIC support for IP discovery. >>> * If IP discovery enabled, a block of memory should be @@ -1896,6 >>> +1945,7 @@ void amdgpu_ttm_fini(struct amdgpu_device *adev) >>> amdgpu_bo_free_kernel(&adev->mman.sdma_access_bo, NULL, >>> &adev->mman.sdma_access_ptr); >>> amdgpu_ttm_fw_reserve_vram_fini(adev); >>> + amdgpu_ttm_drv_reserve_vram_fini(adev); >>> >>> if (drm_dev_enter(adev_to_drm(adev), &idx)) { >>> >>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h >>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h >>> index 9120ae80ef52..339838675b11 100644 >>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h >>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h >>> @@ -92,6 +92,11 @@ struct amdgpu_mman { >>> struct amdgpu_bo *fw_vram_usage_reserved_bo; >>> void *fw_vram_usage_va; >>> >>> + /* driver VRAM reservation */ >>> + u64 drv_vram_usage_start_offset; >>> + u64 drv_vram_usage_size; >>> + struct amdgpu_bo *drv_vram_usage_reserved_bo; >>> + >>> /* PAGE_SIZE'd BO for process memory r/w over SDMA. */ >>> struct amdgpu_bo *sdma_access_bo; >>> void *sdma_access_ptr; >>> diff --git a/drivers/gpu/drm/amd/include/atomfirmware.h >>> b/drivers/gpu/drm/amd/include/atomfirmware.h >>> index ff855cb21d3f..c0f56ae653f0 100644 >>> --- a/drivers/gpu/drm/amd/include/atomfirmware.h >>> +++ b/drivers/gpu/drm/amd/include/atomfirmware.h >>> @@ -705,20 +705,66 @@ struct atom_gpio_pin_lut_v2_1 }; >>> >>> >>> -/* >>> - >>> *************************************************************************** >>> - Data Table vram_usagebyfirmware structure >>> - >>> ********************************************************************** >>> ***** >>> +/* >>> + VBIOS/PRE-OS always reserve a FB region at the top of frame buffer. >>> driver should not write access that region. >>> + driver can allocate their own reservation region as long as it does not >>> overlap firwmare's reservation region. >>> + if( atom data table firmwareInfoTable version < 3.3) { //( pre-NV1X ) >>> + in this case, atom data table vram_usagebyfirmwareTable version always >>> <= 2.1 >>> + if( VBIOS/UEFI GOP is posted ) { >>> + VBIOS/UEFIGOP update used_by_firmware_in_kb = total reserved size by >>> VBIOS >>> + update start_address_in_kb = total_mem_size_in_kb - >>> used_by_firmware_in_kb; ( total_mem_size_in_kb = reg(CONFIG_MEMSIZE)<<10) >>> + driver can allocate driver reservation region under firmware >>> reservation, >>> + used_by_driver_in_kb = driver reservation size >>> + driver reservation start address = (start_address_in_kb - >>> used_by_driver_in_kb) >>> + Comment1[hchan]: There is only one reservation at the beginning of the >>> FB reserved by Host driver. >>> + Host driver would overwrite the table with the following >>> + used_by_firmware_in_kb = total reserved size for pf-vf info exchange >>> and >>> + set SRIOV_MSG_SHARE_RESERVATION mask start_address_in_kb = 0 >>> + } else { >>> + there is no VBIOS reservation region >>> + driver must allocate driver reservation region at top of FB. >>> + driver set used_by_driver_in_kb = driver reservation size >>> + driver reservation start address = (total_mem_size_in_kb - >>> used_by_driver_in_kb) >>> + same as Comment1 >>> + } >>> + } else { //( NV1X and after) >>> + if( VBIOS/UEFI GOP is posted ) { >>> + VBIOS/UEFIGOP update used_by_firmware_in_kb = >>> atom_firmware_Info_v3_3.fw_reserved_size_in_kb; >>> + update start_address_in_kb = total_mem_size_in_kb - >>> used_by_firmware_in_kb; ( total_mem_size_in_kb = reg(CONFIG_MEMSIZE)<<10 ) >>> + } >>> + if( vram_usagebyfirmwareTable version <= 2.1 ) { >>> + driver can allocate driver reservation region under firmware >>> reservation, >>> + driver set used_by_driver_in_kb = driver reservation size >>> + driver reservation start address = (start_address_in_kb - >>> used_by_driver_in_kb) >>> + same as Comment1 >>> + } else { >>> + dirver can allocate it reservation any place as long as it does >>> overlap pre-OS FW reservation area >>> + driver set used_by_driver_region0_in_kb = driver reservation size >>> + driver set driver_region0_start_address_in_kb = driver reservation >>> region start address >>> + Comment2[hchan]: Host driver can set used_by_firmware_in_kb and >>> start_address_in_kb to zero >>> + as the reservation for VF as it doesn’t exist. And Host driver >>> should also >>> + update atom_firmware_Info table to remove the same VBIOS reservation >>> as well. >>> + } >>> + } >>> */ >>> >>> struct vram_usagebyfirmware_v2_1 >>> { >>> - struct atom_common_table_header table_header; >>> - uint32_t start_address_in_kb; >>> - uint16_t used_by_firmware_in_kb; >>> - uint16_t used_by_driver_in_kb; >>> + struct atom_common_table_header table_header; >>> + uint32_t start_address_in_kb; >>> + uint16_t used_by_firmware_in_kb; >>> + uint16_t used_by_driver_in_kb; >>> }; >>> >>> +struct vram_usagebyfirmware_v2_2 { >>> + struct atom_common_table_header table_header; >>> + uint32_t fw_region_start_address_in_kb; >>> + uint16_t used_by_firmware_in_kb; >>> + uint16_t reserved; >>> + uint32_t driver_region0_start_address_in_kb; >>> + uint32_t used_by_driver_region0_in_kb; >>> + uint32_t reserved32[7]; >>> +}; >>> >>> /* >>> >>> ********************************************************************** >>> ***** >>> -- >>> 2.25.1 >