[PATCH 1/2] drm/amdgpu: update the method to get fb_loc of memory training(V4)
Alex Deucher
alexdeucher at gmail.com
Fri Dec 20 15:27:55 UTC 2019
On Thu, Dec 19, 2019 at 9:00 PM Yin, Tianci (Rico) <Tianci.Yin at amd.com> wrote:
>
> [AMD Official Use Only - Internal Distribution Only]
>
>
> Hi Luben,
>
> May I have your Review-by?
>
Series is:
Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
> Thanks a lot!
> Rico
> ________________________________
> From: Tuikov, Luben <Luben.Tuikov at amd.com>
> Sent: Friday, December 20, 2019 3:47
> To: Yin, Tianci (Rico) <Tianci.Yin at amd.com>; amd-gfx at lists.freedesktop.org <amd-gfx at lists.freedesktop.org>
> Cc: Koenig, Christian <Christian.Koenig at amd.com>; Deucher, Alexander <Alexander.Deucher at amd.com>; Zhang, Hawking <Hawking.Zhang at amd.com>; Xu, Feifei <Feifei.Xu at amd.com>; Yuan, Xiaojie <Xiaojie.Yuan at amd.com>; Long, Gang <Gang.Long at amd.com>; Wang, Kevin(Yang) <Kevin1.Wang at amd.com>
> 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" <tianci.yin at amd.com>
> >
> > 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 <tianci.yin at amd.com>
> > ---
> > 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,
> > int *vram_width, int *vram_type, int *vram_vendor);
> > -int amdgpu_atomfirmware_get_mem_train_fb_loc(struct amdgpu_device *adev);
> > +int amdgpu_atomfirmware_get_mem_train_info(struct amdgpu_device *adev);
> > int amdgpu_atomfirmware_get_clock_info(struct amdgpu_device *adev);
> > int amdgpu_atomfirmware_get_gfx_info(struct amdgpu_device *adev);
> > bool amdgpu_atomfirmware_mem_ecc_supported(struct amdgpu_device *adev);
> > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> > index 2ff63d0414c9..1515413fd356 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> > @@ -1687,6 +1687,14 @@ static int amdgpu_ttm_training_reserve_vram_fini(struct amdgpu_device *adev)
> > return 0;
> > }
> >
> > +static u64 amdgpu_ttm_training_get_c2p_offset(u64 vram_size)
> > +{
> > + if ((vram_size & (ONE_MiB - 1)) < (4 * ONE_KiB + 1) )
> > + vram_size -= ONE_MiB;
> > +
> > + return ALIGN(vram_size, ONE_MiB);
> > +}
> > +
> > /**
> > * amdgpu_ttm_training_reserve_vram_init - create bo vram reservation from memory training
> > *
> > @@ -1705,7 +1713,7 @@ 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 = amdgpu_ttm_training_get_c2p_offset(adev->gmc.mc_vram_size);
> > 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 = 0x100000,
> > +};
> > +
> > 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 = 0x100000,
> > -};
> >
> > /*
> > ***************************************************************************
> >
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
More information about the amd-gfx
mailing list