Re: [PATCH 1/2] drm/amdgpu: update the method to get fb_loc of memory training(V3)
[AMD Official Use Only - Internal Distribution Only] Hi Luben, What a brilliant thought! Concise and easy for eyes! Thanks so much! Rico From: Tuikov, Luben Sent: Thursday, December 19, 2019 11:10 To: Yin, Tianci (Rico) ; amd-gfx@lists.freedesktop.org Cc: Koenig, Christian ; Deucher, Alexander ; Zhang, Hawking ; Xu, Feifei ; Yuan, Xiaojie ; Long, Gang ; Wang, Kevin(Yang) Subject: Re: [PATCH 1/2] drm/amdgpu: update the method to get fb_loc of memory training(V3) On 2019-12-18 9:44 p.m., Tianci Yin wrote: > From: "Tianci.Yin" > > The method of getting fb_loc changed from parsing VBIOS to > taking certain offset from top of VRAM > > Change-Id: I053b42fdb1d822722fa7980b2cd9f86b3fdce539 > Signed-off-by: Tianci.Yin > --- > drivers/gpu/drm/amd/amdgpu/amdgpu.h | 3 +- > drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c | 2 +- > .../gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c | 38 ++- > .../gpu/drm/amd/amdgpu/amdgpu_atomfirmware.h | 2 +- > drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 13 ++- > drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 7 > drivers/gpu/drm/amd/include/atomfirmware.h| 14 --- > 7 files changed, 26 insertions(+), 53 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h > b/drivers/gpu/drm/amd/amdgpu/amdgpu.h > index a78a363b1d71..fa2cf8e7bc07 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h > @@ -642,9 +642,8 @@ struct amdgpu_fw_vram_usage { >struct amdgpu_bo *reserved_bo; >void *va; > > - /* Offset on the top of VRAM, used as c2p write buffer. > + /* GDDR6 training support flag. >*/ > - u64 mem_train_fb_loc; >bool mem_train_support; > }; > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c > b/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c > index 9ba80d828876..fdd52d86a4d7 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c > @@ -2022,7 +2022,7 @@ int amdgpu_atombios_init(struct amdgpu_device *adev) >if (adev->is_atom_fw) { >amdgpu_atomfirmware_scratch_regs_init(adev); >amdgpu_atomfirmware_allocate_fb_scratch(adev); > - ret = amdgpu_atomfirmware_get_mem_train_fb_loc(adev); > + ret = amdgpu_atomfirmware_get_mem_train_info(adev); >if (ret) { >DRM_ERROR("Failed to get mem train fb location.\n"); >return ret; > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c > b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c > index ff4eb96bdfb5..58f9d8c3a17a 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c > @@ -525,16 +525,12 @@ static int gddr6_mem_train_support(struct amdgpu_device > *adev) >return ret; > } > > -int amdgpu_atomfirmware_get_mem_train_fb_loc(struct amdgpu_device *adev) > +int amdgpu_atomfirmware_get_mem_train_info(struct amdgpu_device *adev) > { >struct atom_context *ctx = adev->mode_info.atom_context; > - unsigned char *bios = ctx->bios; > - struct vram_reserve_block *reserved_block; > - int index, block_number; > + int index; >uint8_t frev, crev; >uint16_t data_offset, size; > - uint32_t start_address_in_kb; > - uint64_t offset; >int ret; > >adev->fw_vram_usage.mem_train_support = false; > @@ -569,32 +565,6 @@ int amdgpu_atomfirmware_get_mem_train_fb_loc(struct > amdgpu_device *adev) >return -EINVAL; >} > > - reserved_block = (struct vram_reserve_block *) > - (bios + data_offset + sizeof(struct atom_common_table_header)); > - block_number = ((unsigned int)size - sizeof(struct > atom_common_table_header)) > - / sizeof(struct vram_reserve_block); > - reserved_block += (block_number > 0) ? block_number-1 : 0; > - DRM_DEBUG("block_number:0x%04x, last block: 0x%08xkb sz, %dkb fw, %dkb > drv.\n", > - block_number, > - le32_to_cpu(reserved_block->start_address_in_kb), > - le16_to_cpu(reserved_block->used_by_firmware_in_kb), > - le16_to_cpu(reserved_block->used_by_driver_in_kb)); > - if (reserved_block->used_by_firmware_in_kb > 0) { > - start_address_in_kb = > le32_to_cpu(reserved_block->start_address_in_kb); > - offset = (uint64_t)start_address_in_kb * ONE_KiB; > - if ((offset & (ONE_MiB - 1)) < (4 * ONE_KiB + 1) ) { > - offset -= ONE_MiB; > - } > - > - offset &= ~(ONE_MiB - 1); > - adev->fw_vram_usage.mem_train_fb_loc = offset; > - adev->fw_vram_usage.mem_train_support = true; > - DRM_DEBUG("mem_train_fb_loc:0x%09llx.\n", offset); > - ret = 0; > - } else { > -
Re: [PATCH 1/2] drm/amdgpu: update the method to get fb_loc of memory training(V3)
On 2019-12-18 9:44 p.m., Tianci Yin wrote: > From: "Tianci.Yin" > > The method of getting fb_loc changed from parsing VBIOS to > taking certain offset from top of VRAM > > Change-Id: I053b42fdb1d822722fa7980b2cd9f86b3fdce539 > Signed-off-by: Tianci.Yin > --- > drivers/gpu/drm/amd/amdgpu/amdgpu.h | 3 +- > drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c | 2 +- > .../gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c | 38 ++- > .../gpu/drm/amd/amdgpu/amdgpu_atomfirmware.h | 2 +- > drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 13 ++- > drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 7 > drivers/gpu/drm/amd/include/atomfirmware.h| 14 --- > 7 files changed, 26 insertions(+), 53 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h > b/drivers/gpu/drm/amd/amdgpu/amdgpu.h > index a78a363b1d71..fa2cf8e7bc07 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h > @@ -642,9 +642,8 @@ struct amdgpu_fw_vram_usage { > struct amdgpu_bo *reserved_bo; > void *va; > > - /* Offset on the top of VRAM, used as c2p write buffer. > + /* GDDR6 training support flag. > */ > - u64 mem_train_fb_loc; > bool mem_train_support; > }; > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c > b/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c > index 9ba80d828876..fdd52d86a4d7 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c > @@ -2022,7 +2022,7 @@ int amdgpu_atombios_init(struct amdgpu_device *adev) > if (adev->is_atom_fw) { > amdgpu_atomfirmware_scratch_regs_init(adev); > amdgpu_atomfirmware_allocate_fb_scratch(adev); > - ret = amdgpu_atomfirmware_get_mem_train_fb_loc(adev); > + ret = amdgpu_atomfirmware_get_mem_train_info(adev); > if (ret) { > DRM_ERROR("Failed to get mem train fb location.\n"); > return ret; > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c > b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c > index ff4eb96bdfb5..58f9d8c3a17a 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c > @@ -525,16 +525,12 @@ static int gddr6_mem_train_support(struct amdgpu_device > *adev) > return ret; > } > > -int amdgpu_atomfirmware_get_mem_train_fb_loc(struct amdgpu_device *adev) > +int amdgpu_atomfirmware_get_mem_train_info(struct amdgpu_device *adev) > { > struct atom_context *ctx = adev->mode_info.atom_context; > - unsigned char *bios = ctx->bios; > - struct vram_reserve_block *reserved_block; > - int index, block_number; > + int index; > uint8_t frev, crev; > uint16_t data_offset, size; > - uint32_t start_address_in_kb; > - uint64_t offset; > int ret; > > adev->fw_vram_usage.mem_train_support = false; > @@ -569,32 +565,6 @@ int amdgpu_atomfirmware_get_mem_train_fb_loc(struct > amdgpu_device *adev) > return -EINVAL; > } > > - reserved_block = (struct vram_reserve_block *) > - (bios + data_offset + sizeof(struct atom_common_table_header)); > - block_number = ((unsigned int)size - sizeof(struct > atom_common_table_header)) > - / sizeof(struct vram_reserve_block); > - reserved_block += (block_number > 0) ? block_number-1 : 0; > - DRM_DEBUG("block_number:0x%04x, last block: 0x%08xkb sz, %dkb fw, %dkb > drv.\n", > - block_number, > - le32_to_cpu(reserved_block->start_address_in_kb), > - le16_to_cpu(reserved_block->used_by_firmware_in_kb), > - le16_to_cpu(reserved_block->used_by_driver_in_kb)); > - if (reserved_block->used_by_firmware_in_kb > 0) { > - start_address_in_kb = > le32_to_cpu(reserved_block->start_address_in_kb); > - offset = (uint64_t)start_address_in_kb * ONE_KiB; > - if ((offset & (ONE_MiB - 1)) < (4 * ONE_KiB + 1) ) { > - offset -= ONE_MiB; > - } > - > - offset &= ~(ONE_MiB - 1); > - adev->fw_vram_usage.mem_train_fb_loc = offset; > - adev->fw_vram_usage.mem_train_support = true; > - DRM_DEBUG("mem_train_fb_loc:0x%09llx.\n", offset); > - ret = 0; > - } else { > - DRM_ERROR("used_by_firmware_in_kb is 0!\n"); > - ret = -EINVAL; > - } > - > - return ret; > + adev->fw_vram_usage.mem_train_support = true; > + return 0; > } > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.h > b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.h > index f871af5ea6f3..434fe2fa0089 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.h > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.h > @@ -31,7 +31,7 @@ void amdgpu_atomfirmware_scratch_regs_init(struct >
[PATCH 1/2] drm/amdgpu: update the method to get fb_loc of memory training(V3)
From: "Tianci.Yin" The method of getting fb_loc changed from parsing VBIOS to taking certain offset from top of VRAM Change-Id: I053b42fdb1d822722fa7980b2cd9f86b3fdce539 Signed-off-by: Tianci.Yin --- drivers/gpu/drm/amd/amdgpu/amdgpu.h | 3 +- drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c | 2 +- .../gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c | 38 ++- .../gpu/drm/amd/amdgpu/amdgpu_atomfirmware.h | 2 +- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 13 ++- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 7 drivers/gpu/drm/amd/include/atomfirmware.h| 14 --- 7 files changed, 26 insertions(+), 53 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index a78a363b1d71..fa2cf8e7bc07 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h @@ -642,9 +642,8 @@ struct amdgpu_fw_vram_usage { struct amdgpu_bo *reserved_bo; void *va; - /* Offset on the top of VRAM, used as c2p write buffer. + /* GDDR6 training support flag. */ - u64 mem_train_fb_loc; bool mem_train_support; }; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c index 9ba80d828876..fdd52d86a4d7 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c @@ -2022,7 +2022,7 @@ int amdgpu_atombios_init(struct amdgpu_device *adev) if (adev->is_atom_fw) { amdgpu_atomfirmware_scratch_regs_init(adev); amdgpu_atomfirmware_allocate_fb_scratch(adev); - ret = amdgpu_atomfirmware_get_mem_train_fb_loc(adev); + ret = amdgpu_atomfirmware_get_mem_train_info(adev); if (ret) { DRM_ERROR("Failed to get mem train fb location.\n"); return ret; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c index ff4eb96bdfb5..58f9d8c3a17a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c @@ -525,16 +525,12 @@ static int gddr6_mem_train_support(struct amdgpu_device *adev) return ret; } -int amdgpu_atomfirmware_get_mem_train_fb_loc(struct amdgpu_device *adev) +int amdgpu_atomfirmware_get_mem_train_info(struct amdgpu_device *adev) { struct atom_context *ctx = adev->mode_info.atom_context; - unsigned char *bios = ctx->bios; - struct vram_reserve_block *reserved_block; - int index, block_number; + int index; uint8_t frev, crev; uint16_t data_offset, size; - uint32_t start_address_in_kb; - uint64_t offset; int ret; adev->fw_vram_usage.mem_train_support = false; @@ -569,32 +565,6 @@ int amdgpu_atomfirmware_get_mem_train_fb_loc(struct amdgpu_device *adev) return -EINVAL; } - reserved_block = (struct vram_reserve_block *) - (bios + data_offset + sizeof(struct atom_common_table_header)); - block_number = ((unsigned int)size - sizeof(struct atom_common_table_header)) - / sizeof(struct vram_reserve_block); - reserved_block += (block_number > 0) ? block_number-1 : 0; - DRM_DEBUG("block_number:0x%04x, last block: 0x%08xkb sz, %dkb fw, %dkb drv.\n", - block_number, - le32_to_cpu(reserved_block->start_address_in_kb), - le16_to_cpu(reserved_block->used_by_firmware_in_kb), - le16_to_cpu(reserved_block->used_by_driver_in_kb)); - if (reserved_block->used_by_firmware_in_kb > 0) { - start_address_in_kb = le32_to_cpu(reserved_block->start_address_in_kb); - offset = (uint64_t)start_address_in_kb * ONE_KiB; - if ((offset & (ONE_MiB - 1)) < (4 * ONE_KiB + 1) ) { - offset -= ONE_MiB; - } - - offset &= ~(ONE_MiB - 1); - adev->fw_vram_usage.mem_train_fb_loc = offset; - adev->fw_vram_usage.mem_train_support = true; - DRM_DEBUG("mem_train_fb_loc:0x%09llx.\n", offset); - ret = 0; - } else { - DRM_ERROR("used_by_firmware_in_kb is 0!\n"); - ret = -EINVAL; - } - - return ret; + adev->fw_vram_usage.mem_train_support = true; + return 0; } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.h index f871af5ea6f3..434fe2fa0089 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.h @@ -31,7 +31,7 @@ void amdgpu_atomfirmware_scratch_regs_init(struct amdgpu_device *adev); int amdgpu_atomfirmware_allocate_fb_scratch(struct amdgpu_device *adev); int amdgpu_atomfirmware_get_vram_info(struct amdgpu_device *adev,