Re: [PATCH 1/2] drm/amdgpu: update the method to get fb_loc of memory training(V4)
[AMD Official Use Only - Internal Distribution Only] Thank you very much for your review! From: Tuikov, Luben Sent: Saturday, December 21, 2019 5:52 To: Alex Deucher ; Yin, Tianci (Rico) Cc: amd-gfx@lists.freedesktop.org ; Long, Gang ; Xu, Feifei ; Wang, Kevin(Yang) ; Deucher, Alexander ; Zhang, Hawking ; Koenig, Christian ; Yuan, Xiaojie Subject: Re: [PATCH 1/2] drm/amdgpu: update the method to get fb_loc of memory training(V4) On 2019-12-20 10:27 a.m., Alex Deucher wrote: > On Thu, Dec 19, 2019 at 9:00 PM Yin, Tianci (Rico) wrote: >> >> [AMD Official Use Only - Internal Distribution Only] >> >> >> Hi Luben, >> >> May I have your Review-by? >> If you'd like--it's completely up to you. If you choose to, like Alex's below. Regards, Luben > > Series is: > Reviewed-by: Alex Deucher > >> Thanks a lot! >> Rico >> >> From: Tuikov, Luben >> Sent: Friday, December 20, 2019 3:47 >> 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(V4) >> >> Yep! That's perfect--good job! >> >> Regards, >> Luben >> >> On 2019-12-19 04:16, 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 | 10 - >>> drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 7 >>> drivers/gpu/drm/amd/include/atomfirmware.h| 14 --- >>> 7 files changed, 23 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; >>> -
Re: [PATCH 1/2] drm/amdgpu: update the method to get fb_loc of memory training(V4)
On 2019-12-20 10:27 a.m., Alex Deucher wrote: > On Thu, Dec 19, 2019 at 9:00 PM Yin, Tianci (Rico) wrote: >> >> [AMD Official Use Only - Internal Distribution Only] >> >> >> Hi Luben, >> >> May I have your Review-by? >> If you'd like--it's completely up to you. If you choose to, like Alex's below. Regards, Luben > > Series is: > Reviewed-by: Alex Deucher > >> Thanks a lot! >> Rico >> >> From: Tuikov, Luben >> Sent: Friday, December 20, 2019 3:47 >> 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(V4) >> >> Yep! That's perfect--good job! >> >> Regards, >> Luben >> >> On 2019-12-19 04:16, 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 | 10 - >>> drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 7 >>> drivers/gpu/drm/amd/include/atomfirmware.h| 14 --- >>> 7 files changed, 23 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 = >>>
Re: [PATCH 1/2] drm/amdgpu: update the method to get fb_loc of memory training(V4)
On Thu, Dec 19, 2019 at 9:00 PM Yin, Tianci (Rico) wrote: > > [AMD Official Use Only - Internal Distribution Only] > > > Hi Luben, > > May I have your Review-by? > Series is: Reviewed-by: Alex Deucher > Thanks a lot! > Rico > > From: Tuikov, Luben > Sent: Friday, December 20, 2019 3:47 > 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(V4) > > Yep! That's perfect--good job! > > Regards, > Luben > > On 2019-12-19 04:16, 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 | 10 - > > drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 7 > > drivers/gpu/drm/amd/include/atomfirmware.h| 14 --- > > 7 files changed, 23 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) ) { > > -
Re: [PATCH 1/2] drm/amdgpu: update the method to get fb_loc of memory training(V4)
[AMD Official Use Only - Internal Distribution Only] Hi Luben, May I have your Review-by? Thanks a lot! Rico From: Tuikov, Luben Sent: Friday, December 20, 2019 3:47 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(V4) Yep! That's perfect--good job! Regards, Luben On 2019-12-19 04:16, 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 | 10 - > drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 7 > drivers/gpu/drm/amd/include/atomfirmware.h| 14 --- > 7 files changed, 23 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(V4)
Yep! That's perfect--good job! Regards, Luben On 2019-12-19 04:16, 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 | 10 - > drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 7 > drivers/gpu/drm/amd/include/atomfirmware.h| 14 --- > 7 files changed, 23 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
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 { > -
[PATCH 1/2] drm/amdgpu: update the method to get fb_loc of memory training(V4)
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 | 10 - drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 7 drivers/gpu/drm/amd/include/atomfirmware.h| 14 --- 7 files changed, 23 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,
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 >
Re: [PATCH 1/2] drm/amdgpu: update the method to get fb_loc of memory training(V2)
[AMD Official Use Only - Internal Distribution Only] Hi Luben, Thank you very much for your suggestion and detailed explanation! Patch has been refined, please help review. Rico From: Tuikov, Luben Sent: Thursday, December 19, 2019 4:14 To: Yin, Tianci (Rico) ; Wang, Kevin(Yang) ; amd-gfx@lists.freedesktop.org Cc: Koenig, Christian ; Deucher, Alexander ; Zhang, Hawking ; Xu, Feifei ; Yuan, Xiaojie ; Long, Gang Subject: Re: [PATCH 1/2] drm/amdgpu: update the method to get fb_loc of memory training(V2) On 2019-12-18 4:14 a.m., Yin, Tianci (Rico) wrote: > Hi Kevin, > > You mean like this? It's a bit lengthy. > - ctx->c2p_train_data_offset &= ~(ONE_MiB - 1); > + ctx->c2p_train_data_offset = ALIGN(ctx->c2p_train_data_offset, ONE_MiB); > > - ctx->c2p_train_data_offset = adev->fw_vram_usage.mem_train_fb_loc; > + ctx->c2p_train_data_offset = adev->gmc.mc_vram_size; > + if ((ctx->c2p_train_data_offset & (ONE_MiB - 1)) < (4 * ONE_KiB + 1) > ) { > + ctx->c2p_train_data_offset -= ONE_MiB; > + } > + ctx->c2p_train_data_offset &= ~(ONE_MiB - 1); Using the macro ALIGN() is a good practice. Usually when calculating a quantity, such as the one above, you'd use a working variable, say 'a', and after you're done with the calculation, you'd then assign it to the variable which needs it. Something like this: a = adev->gmc.mc_vram_size; if ((a & (ONE_MiB - 1)) < (4 * ONE_KiB + 1)) a -= ONE_MiB; ctx->c2p_train_data_offset = ALIGN(a, ONE_MiB); The easiest way to see this is, imagine, if all this calculation was offloaded to a dedicated function, f(), to do: ctx->c2p_train_data_offset = f(adev->gmc.mc_vram_size); Now, by using the working variable 'a', you've shown this abstraction just the same. (By using the working variable 'a', you've shown to the reader,that this calculation is abstracted, and could be relocated to a function.) Regards, Luben P.S. The compiler is probably already doing this, and not working directly on the ctx->c2p_train_data_offs, but assigns a final result, as explicitly shown above. The above is to make it easy for humans to read and understand the code. Hope this helps. > > *[kevin]:* > *i'd like to use the marco ALIGN() to simple above code.* > *anyway, the patch Reviewed-by: Kevin Wang * > > ctx->p2c_train_data_offset = (adev->gmc.mc_vram_size - > GDDR6_MEM_TRAINING_OFFSET); > ctx->train_data_size = GDDR6_MEM_TRAINING_DATA_SIZE_IN_BYTES; > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h > b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h > index f1ebd424510c..19eb3e8456c7 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h > @@ -66,6 +66,13 @@ struct amdgpu_copy_mem { > unsigned long offset; > }; > > +/* Definitions for constance */ > +enum amdgpu_internal_constants > +{ > + ONE_KiB = 0x400, > + ONE_MiB = 0x10, > +}; > + > extern const struct ttm_mem_type_manager_func amdgpu_gtt_mgr_func; > extern const struct ttm_mem_type_manager_func amdgpu_vram_mgr_func; > > diff --git a/drivers/gpu/drm/amd/include/atomfirmware.h > b/drivers/gpu/drm/amd/include/atomfirmware.h > index dd7cbc00a0aa..70146518174c 100644 > --- a/drivers/gpu/drm/amd/include/atomfirmware.h > +++ b/drivers/gpu/drm/amd/include/atomfirmware.h > @@ -672,20 +672,6 @@ struct vram_usagebyfirmware_v2_1 >uint16_t used_by_driver_in_kb; > }; > > -/* This is part of vram_usagebyfirmware_v2_1 */ > -struct vram_reserve_block > -{ > - uint32_t start_address_in_kb; > - uint16_t used_by_firmware_in_kb; > - uint16_t used_by_driver_in_kb; > -}; > - > -/* Definitions for constance */ > -enum atomfirmware_internal_constants > -{ > - ONE_KiB = 0x400, > - ONE_MiB = 0x10, > -}; > > /* >*** > -- > 2.17.1 > ___ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx
[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,
Re: [PATCH 1/2] drm/amdgpu: update the method to get fb_loc of memory training(V2)
On 2019-12-18 4:14 a.m., Yin, Tianci (Rico) wrote: > Hi Kevin, > > You mean like this? It's a bit lengthy. > - ctx->c2p_train_data_offset &= ~(ONE_MiB - 1); > + ctx->c2p_train_data_offset = ALIGN(ctx->c2p_train_data_offset, ONE_MiB); > > - ctx->c2p_train_data_offset = adev->fw_vram_usage.mem_train_fb_loc; > + ctx->c2p_train_data_offset = adev->gmc.mc_vram_size; > + if ((ctx->c2p_train_data_offset & (ONE_MiB - 1)) < (4 * ONE_KiB + 1) > ) { > + ctx->c2p_train_data_offset -= ONE_MiB; > + } > + ctx->c2p_train_data_offset &= ~(ONE_MiB - 1); Using the macro ALIGN() is a good practice. Usually when calculating a quantity, such as the one above, you'd use a working variable, say 'a', and after you're done with the calculation, you'd then assign it to the variable which needs it. Something like this: a = adev->gmc.mc_vram_size; if ((a & (ONE_MiB - 1)) < (4 * ONE_KiB + 1)) a -= ONE_MiB; ctx->c2p_train_data_offset = ALIGN(a, ONE_MiB); The easiest way to see this is, imagine, if all this calculation was offloaded to a dedicated function, f(), to do: ctx->c2p_train_data_offset = f(adev->gmc.mc_vram_size); Now, by using the working variable 'a', you've shown this abstraction just the same. (By using the working variable 'a', you've shown to the reader,that this calculation is abstracted, and could be relocated to a function.) Regards, Luben P.S. The compiler is probably already doing this, and not working directly on the ctx->c2p_train_data_offs, but assigns a final result, as explicitly shown above. The above is to make it easy for humans to read and understand the code. Hope this helps. > > *[kevin]:* > *i'd like to use the marco ALIGN() to simple above code.* > *anyway, the patch Reviewed-by: Kevin Wang * > > ctx->p2c_train_data_offset = (adev->gmc.mc_vram_size - > GDDR6_MEM_TRAINING_OFFSET); > ctx->train_data_size = GDDR6_MEM_TRAINING_DATA_SIZE_IN_BYTES; > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h > b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h > index f1ebd424510c..19eb3e8456c7 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h > @@ -66,6 +66,13 @@ struct amdgpu_copy_mem { > unsigned long offset; > }; > > +/* Definitions for constance */ > +enum amdgpu_internal_constants > +{ > + ONE_KiB = 0x400, > + ONE_MiB = 0x10, > +}; > + > extern const struct ttm_mem_type_manager_func amdgpu_gtt_mgr_func; > extern const struct ttm_mem_type_manager_func amdgpu_vram_mgr_func; > > diff --git a/drivers/gpu/drm/amd/include/atomfirmware.h > b/drivers/gpu/drm/amd/include/atomfirmware.h > index dd7cbc00a0aa..70146518174c 100644 > --- a/drivers/gpu/drm/amd/include/atomfirmware.h > +++ b/drivers/gpu/drm/amd/include/atomfirmware.h > @@ -672,20 +672,6 @@ struct vram_usagebyfirmware_v2_1 > uint16_t used_by_driver_in_kb; > }; > > -/* This is part of vram_usagebyfirmware_v2_1 */ > -struct vram_reserve_block > -{ > - uint32_t start_address_in_kb; > - uint16_t used_by_firmware_in_kb; > - uint16_t used_by_driver_in_kb; > -}; > - > -/* Definitions for constance */ > -enum atomfirmware_internal_constants > -{ > - ONE_KiB = 0x400, > - ONE_MiB = 0x10, > -}; > > /* > *** > -- > 2.17.1 > ___ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx
Re: [PATCH 1/2] drm/amdgpu: update the method to get fb_loc of memory training(V2)
Hi Kevin, You mean like this? It's a bit lengthy. - ctx->c2p_train_data_offset &= ~(ONE_MiB - 1); + ctx->c2p_train_data_offset = ALIGN(ctx->c2p_train_data_offset, ONE_MiB); Rico From: Wang, Kevin(Yang) Sent: Wednesday, December 18, 2019 16:56 To: Yin, Tianci (Rico) ; amd-gfx@lists.freedesktop.org Cc: Tuikov, Luben ; Koenig, Christian ; Deucher, Alexander ; Zhang, Hawking ; Xu, Feifei ; Yuan, Xiaojie ; Long, Gang Subject: Re: [PATCH 1/2] drm/amdgpu: update the method to get fb_loc of memory training(V2) [AMD Official Use Only - Internal Distribution Only] comment inline. From: Tianci Yin Sent: Wednesday, December 18, 2019 4:50 PM To: amd-gfx@lists.freedesktop.org Cc: Tuikov, Luben ; Koenig, Christian ; Deucher, Alexander ; Zhang, Hawking ; Xu, Feifei ; Yuan, Xiaojie ; Long, Gang ; Wang, Kevin(Yang) ; Yin, Tianci (Rico) Subject: [PATCH 1/2] drm/amdgpu: update the method to get fb_loc of memory training(V2) From: "Tianci.Yin" The method of getting fb_loc changed from parsing VBIOS to taking certain offset from top of VRAM Change-Id: I053b42fdb1d822722fa7980b2cd9f86b3fdce539 --- 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 | 6 ++- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 7 drivers/gpu/drm/amd/include/atomfirmware.h| 14 --- 7 files changed, 19 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; -
Re: [PATCH 1/2] drm/amdgpu: update the method to get fb_loc of memory training(V2)
[AMD Official Use Only - Internal Distribution Only] comment inline. From: Tianci Yin Sent: Wednesday, December 18, 2019 4:50 PM To: amd-gfx@lists.freedesktop.org Cc: Tuikov, Luben ; Koenig, Christian ; Deucher, Alexander ; Zhang, Hawking ; Xu, Feifei ; Yuan, Xiaojie ; Long, Gang ; Wang, Kevin(Yang) ; Yin, Tianci (Rico) Subject: [PATCH 1/2] drm/amdgpu: update the method to get fb_loc of memory training(V2) From: "Tianci.Yin" The method of getting fb_loc changed from parsing VBIOS to taking certain offset from top of VRAM Change-Id: I053b42fdb1d822722fa7980b2cd9f86b3fdce539 --- 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 | 6 ++- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 7 drivers/gpu/drm/amd/include/atomfirmware.h| 14 --- 7 files changed, 19 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
Re: [PATCH 1/2] drm/amdgpu: update the method to get fb_loc of memory training
Hi Kevin, Thanks very much! I have rename the amdgpu_atomfirmware_get_mem_train_fb_loc function to amdgpu_atomfirmware_get_mem_train_info, please review again. Rico From: Wang, Kevin(Yang) Sent: Wednesday, December 18, 2019 13:32 To: Yin, Tianci (Rico) ; amd-gfx@lists.freedesktop.org Cc: Tuikov, Luben ; Koenig, Christian ; Deucher, Alexander ; Zhang, Hawking ; Xu, Feifei ; Yuan, Xiaojie ; Long, Gang Subject: Re: [PATCH 1/2] drm/amdgpu: update the method to get fb_loc of memory training [AMD Official Use Only - Internal Distribution Only] From: Tianci Yin Sent: Wednesday, December 18, 2019 10:21 AM To: amd-gfx@lists.freedesktop.org Cc: Tuikov, Luben ; Koenig, Christian ; Deucher, Alexander ; Zhang, Hawking ; Xu, Feifei ; Yuan, Xiaojie ; Long, Gang ; Wang, Kevin(Yang) ; Yin, Tianci (Rico) Subject: [PATCH 1/2] drm/amdgpu: update the method to get fb_loc of memory training From: "Tianci.Yin" The method of getting fb_loc changed from parsing VBIOS to taking certain offset from top of VRAM Change-Id: I053b42fdb1d822722fa7980b2cd9f86b3fdce539 --- drivers/gpu/drm/amd/amdgpu/amdgpu.h | 3 +- .../gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c | 36 ++- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 6 +++- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 7 drivers/gpu/drm/amd/include/atomfirmware.h| 14 5 files changed, 16 insertions(+), 50 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_atomfirmware.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c index ff4eb96bdfb5..009cb0b03d13 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c @@ -528,13 +528,9 @@ static int gddr6_mem_train_support(struct amdgpu_device *adev) int amdgpu_atomfirmware_get_mem_train_fb_loc(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) [kevin]: this function is not return any address after change, i think we'd better to rename this function to another is well. the code can be merge to function gddr6_mem_train_support(). 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_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c index 2ff63d0414c9..ce5cb854bdb9 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c @@ -1705,7 +1705,11 @@ static int amdgpu_ttm_training_reserve_vram_init(struct amdgpu_device
[PATCH 1/2] drm/amdgpu: update the method to get fb_loc of memory training(V2)
From: "Tianci.Yin" The method of getting fb_loc changed from parsing VBIOS to taking certain offset from top of VRAM Change-Id: I053b42fdb1d822722fa7980b2cd9f86b3fdce539 --- 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 | 6 ++- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 7 drivers/gpu/drm/amd/include/atomfirmware.h| 14 --- 7 files changed, 19 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, int *vram_width, int
Re: [PATCH 1/2] drm/amdgpu: update the method to get fb_loc of memory training
[AMD Official Use Only - Internal Distribution Only] From: Tianci Yin Sent: Wednesday, December 18, 2019 10:21 AM To: amd-gfx@lists.freedesktop.org Cc: Tuikov, Luben ; Koenig, Christian ; Deucher, Alexander ; Zhang, Hawking ; Xu, Feifei ; Yuan, Xiaojie ; Long, Gang ; Wang, Kevin(Yang) ; Yin, Tianci (Rico) Subject: [PATCH 1/2] drm/amdgpu: update the method to get fb_loc of memory training From: "Tianci.Yin" The method of getting fb_loc changed from parsing VBIOS to taking certain offset from top of VRAM Change-Id: I053b42fdb1d822722fa7980b2cd9f86b3fdce539 --- drivers/gpu/drm/amd/amdgpu/amdgpu.h | 3 +- .../gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c | 36 ++- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 6 +++- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 7 drivers/gpu/drm/amd/include/atomfirmware.h| 14 5 files changed, 16 insertions(+), 50 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_atomfirmware.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c index ff4eb96bdfb5..009cb0b03d13 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c @@ -528,13 +528,9 @@ static int gddr6_mem_train_support(struct amdgpu_device *adev) int amdgpu_atomfirmware_get_mem_train_fb_loc(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) [kevin]: this function is not return any address after change, i think we'd better to rename this function to another is well. the code can be merge to function gddr6_mem_train_support(). 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_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c index 2ff63d0414c9..ce5cb854bdb9 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c @@ -1705,7 +1705,11 @@ static int amdgpu_ttm_training_reserve_vram_init(struct amdgpu_device *adev) return 0; } - ctx->c2p_train_data_offset = adev->fw_vram_usage.mem_train_fb_loc; + ctx->c2p_train_data_offset = adev->gmc.mc_vram_size; + if ((ctx->c2p_train_data_offset & (ONE_MiB - 1)) < (4 * ONE_KiB + 1) ) { + ctx->c2p_train_data_offset -= ONE_MiB; + } + ctx->c2p_train_data_offset &= ~(ONE_MiB - 1); ctx->p2c_train_data_offset = (adev->gmc.mc_vram_size - GDDR6_MEM_TRAINING_OFFSET); ctx->train_data_size =
[PATCH 1/2] drm/amdgpu: update the method to get fb_loc of memory training
From: "Tianci.Yin" The method of getting fb_loc changed from parsing VBIOS to taking certain offset from top of VRAM Change-Id: I053b42fdb1d822722fa7980b2cd9f86b3fdce539 --- drivers/gpu/drm/amd/amdgpu/amdgpu.h | 3 +- .../gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c | 36 ++- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 6 +++- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 7 drivers/gpu/drm/amd/include/atomfirmware.h| 14 5 files changed, 16 insertions(+), 50 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_atomfirmware.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c index ff4eb96bdfb5..009cb0b03d13 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c @@ -528,13 +528,9 @@ static int gddr6_mem_train_support(struct amdgpu_device *adev) int amdgpu_atomfirmware_get_mem_train_fb_loc(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_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c index 2ff63d0414c9..ce5cb854bdb9 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c @@ -1705,7 +1705,11 @@ static int amdgpu_ttm_training_reserve_vram_init(struct amdgpu_device *adev) return 0; } - ctx->c2p_train_data_offset = adev->fw_vram_usage.mem_train_fb_loc; + ctx->c2p_train_data_offset = adev->gmc.mc_vram_size; + if ((ctx->c2p_train_data_offset & (ONE_MiB - 1)) < (4 * ONE_KiB + 1) ) { + ctx->c2p_train_data_offset -= ONE_MiB; + } + ctx->c2p_train_data_offset &= ~(ONE_MiB - 1); ctx->p2c_train_data_offset = (adev->gmc.mc_vram_size - GDDR6_MEM_TRAINING_OFFSET); ctx->train_data_size = GDDR6_MEM_TRAINING_DATA_SIZE_IN_BYTES; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h index f1ebd424510c..19eb3e8456c7 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h @@ -66,6 +66,13 @@ struct amdgpu_copy_mem { unsigned long offset; }; +/* Definitions for constance */ +enum amdgpu_internal_constants +{ + ONE_KiB = 0x400, + ONE_MiB = 0x10, +}; + extern const struct ttm_mem_type_manager_func amdgpu_gtt_mgr_func; extern const struct ttm_mem_type_manager_func amdgpu_vram_mgr_func; diff --git
[PATCH 1/2] drm/amdgpu: update the method to get fb_loc of memory training
From: "Tianci.Yin" The method of getting fb_loc changed from parsing VBIOS to taking certain offset from top of VRAM Change-Id: I053b42fdb1d822722fa7980b2cd9f86b3fdce539 --- drivers/gpu/drm/amd/amdgpu/amdgpu.h | 3 +- .../gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c | 36 ++- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 6 +++- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 7 drivers/gpu/drm/amd/include/atomfirmware.h| 14 5 files changed, 16 insertions(+), 50 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_atomfirmware.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c index ff4eb96bdfb5..009cb0b03d13 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c @@ -528,13 +528,9 @@ static int gddr6_mem_train_support(struct amdgpu_device *adev) int amdgpu_atomfirmware_get_mem_train_fb_loc(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_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c index 2ff63d0414c9..ce5cb854bdb9 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c @@ -1705,7 +1705,11 @@ static int amdgpu_ttm_training_reserve_vram_init(struct amdgpu_device *adev) return 0; } - ctx->c2p_train_data_offset = adev->fw_vram_usage.mem_train_fb_loc; + ctx->c2p_train_data_offset = adev->gmc.mc_vram_size; + if ((ctx->c2p_train_data_offset & (ONE_MiB - 1)) < (4 * ONE_KiB + 1) ) { + ctx->c2p_train_data_offset -= ONE_MiB; + } + ctx->c2p_train_data_offset &= ~(ONE_MiB - 1); ctx->p2c_train_data_offset = (adev->gmc.mc_vram_size - GDDR6_MEM_TRAINING_OFFSET); ctx->train_data_size = GDDR6_MEM_TRAINING_DATA_SIZE_IN_BYTES; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h index f1ebd424510c..19eb3e8456c7 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h @@ -66,6 +66,13 @@ struct amdgpu_copy_mem { unsigned long offset; }; +/* Definitions for constance */ +enum amdgpu_internal_constants +{ + ONE_KiB = 0x400, + ONE_MiB = 0x10, +}; + extern const struct ttm_mem_type_manager_func amdgpu_gtt_mgr_func; extern const struct ttm_mem_type_manager_func amdgpu_vram_mgr_func; diff --git