Re: [PATCH 1/2] drm/amdgpu: update the method to get fb_loc of memory training(V3)

2019-12-19 Thread Yin, Tianci (Rico)
[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)

2019-12-18 Thread Luben Tuikov
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)

2019-12-18 Thread Tianci Yin
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,