Re: [PATCH 2/2] drm/amdgpu: enable UMSCH 4.0.6

2024-03-22 Thread Deucher, Alexander
[AMD Official Use Only - General]

Series is:
Acked-by: Alex Deucher 

From: amd-gfx  on behalf of Lang Yu 

Sent: Thursday, March 21, 2024 10:53 PM
To: amd-gfx@lists.freedesktop.org 
Cc: Yu, Lang ; Gopalakrishnan, Veerabadhran (Veera) 

Subject: [PATCH 2/2] drm/amdgpu: enable UMSCH 4.0.6

Share same codes with 4.0.5 and enable collaborate mode for VPE.

Signed-off-by: Lang Yu 
Reviewed-by: Veerabadhran Gopalakrishnan 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c |  1 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_umsch_mm.c  | 12 ++--
 drivers/gpu/drm/amd/amdgpu/umsch_mm_v4_0.c|  7 +--
 3 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c
index 3c407164837b..07c5fca06178 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c
@@ -2247,6 +2247,7 @@ static int amdgpu_discovery_set_umsch_mm_ip_blocks(struct 
amdgpu_device *adev)
 {
 switch (amdgpu_ip_version(adev, VCN_HWIP, 0)) {
 case IP_VERSION(4, 0, 5):
+   case IP_VERSION(4, 0, 6):
 if (amdgpu_umsch_mm & 0x1) {
 amdgpu_device_ip_block_add(adev, 
_mm_v4_0_ip_block);
 adev->enable_umsch_mm = true;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_umsch_mm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_umsch_mm.c
index 99210a3b1044..95f80b9131a8 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_umsch_mm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_umsch_mm.c
@@ -189,10 +189,13 @@ static void setup_vpe_queue(struct amdgpu_device *adev,
 mqd->rptr_val = 0;
 mqd->unmapped = 1;

+   if (adev->vpe.collaborate_mode)
+   memcpy(++mqd, test->mqd_data_cpu_addr, sizeof(struct MQD_INFO));
+
 qinfo->mqd_addr = test->mqd_data_gpu_addr;
 qinfo->csa_addr = test->ctx_data_gpu_addr +
 offsetof(struct umsch_mm_test_ctx_data, vpe_ctx_csa);
-   qinfo->doorbell_offset_0 = (adev->doorbell_index.vpe_ring + 1) << 1;
+   qinfo->doorbell_offset_0 = 0;
 qinfo->doorbell_offset_1 = 0;
 }

@@ -287,7 +290,10 @@ static int submit_vpe_queue(struct amdgpu_device *adev, 
struct umsch_mm_test *te
 ring[5] = 0;

 mqd->wptr_val = (6 << 2);
-   // 
WDOORBELL32(adev->umsch_mm.agdb_index[CONTEXT_PRIORITY_LEVEL_NORMAL], 
mqd->wptr_val);
+   if (adev->vpe.collaborate_mode)
+   (++mqd)->wptr_val = (6 << 2);
+
+   WDOORBELL32(adev->umsch_mm.agdb_index[CONTEXT_PRIORITY_LEVEL_NORMAL], 
mqd->wptr_val);

 for (i = 0; i < adev->usec_timeout; i++) {
 if (*fence == test_pattern)
@@ -571,6 +577,7 @@ int amdgpu_umsch_mm_init_microcode(struct amdgpu_umsch_mm 
*umsch)

 switch (amdgpu_ip_version(adev, VCN_HWIP, 0)) {
 case IP_VERSION(4, 0, 5):
+   case IP_VERSION(4, 0, 6):
 fw_name = "amdgpu/umsch_mm_4_0_0.bin";
 break;
 default:
@@ -750,6 +757,7 @@ static int umsch_mm_early_init(void *handle)

 switch (amdgpu_ip_version(adev, VCN_HWIP, 0)) {
 case IP_VERSION(4, 0, 5):
+   case IP_VERSION(4, 0, 6):
 umsch_mm_v4_0_set_funcs(>umsch_mm);
 break;
 default:
diff --git a/drivers/gpu/drm/amd/amdgpu/umsch_mm_v4_0.c 
b/drivers/gpu/drm/amd/amdgpu/umsch_mm_v4_0.c
index 8e7b763cfdb7..84368cf1e175 100644
--- a/drivers/gpu/drm/amd/amdgpu/umsch_mm_v4_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/umsch_mm_v4_0.c
@@ -60,7 +60,7 @@ static int umsch_mm_v4_0_load_microcode(struct 
amdgpu_umsch_mm *umsch)

 umsch->cmd_buf_curr_ptr = umsch->cmd_buf_ptr;

-   if (amdgpu_ip_version(adev, VCN_HWIP, 0) == IP_VERSION(4, 0, 5)) {
+   if (amdgpu_ip_version(adev, VCN_HWIP, 0) >= IP_VERSION(4, 0, 5)) {
 WREG32_SOC15(VCN, 0, regUVD_IPX_DLDO_CONFIG,
 1 << UVD_IPX_DLDO_CONFIG__ONO0_PWR_CONFIG__SHIFT);
 SOC15_WAIT_ON_RREG(VCN, 0, regUVD_IPX_DLDO_STATUS,
@@ -248,7 +248,7 @@ static int umsch_mm_v4_0_ring_stop(struct amdgpu_umsch_mm 
*umsch)
 data = REG_SET_FIELD(data, VCN_UMSCH_RB_DB_CTRL, EN, 0);
 WREG32_SOC15(VCN, 0, regVCN_UMSCH_RB_DB_CTRL, data);

-   if (amdgpu_ip_version(adev, VCN_HWIP, 0) == IP_VERSION(4, 0, 5)) {
+   if (amdgpu_ip_version(adev, VCN_HWIP, 0) >= IP_VERSION(4, 0, 5)) {
 WREG32_SOC15(VCN, 0, regUVD_IPX_DLDO_CONFIG,
 2 << UVD_IPX_DLDO_CONFIG__ONO0_PWR_CONFIG__SHIFT);
 SOC15_WAIT_ON_RREG(VCN, 0, regUVD_IPX_DLDO_STATUS,
@@ -271,6 +271,8 @@ static int umsch_mm_v4_0_set_hw_resources(struct 
amdgpu_umsch_mm *umsch)

 set_hw_resources.vmid_mask_mm_vcn = umsch->vmid_mask_mm_vcn;
 set_hw_resources.vmid_mask_mm_vpe = u

[PATCH 2/2] drm/amdgpu: enable UMSCH 4.0.6

2024-03-21 Thread Lang Yu
Share same codes with 4.0.5 and enable collaborate mode for VPE.

Signed-off-by: Lang Yu 
Reviewed-by: Veerabadhran Gopalakrishnan 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c |  1 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_umsch_mm.c  | 12 ++--
 drivers/gpu/drm/amd/amdgpu/umsch_mm_v4_0.c|  7 +--
 3 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c
index 3c407164837b..07c5fca06178 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c
@@ -2247,6 +2247,7 @@ static int amdgpu_discovery_set_umsch_mm_ip_blocks(struct 
amdgpu_device *adev)
 {
switch (amdgpu_ip_version(adev, VCN_HWIP, 0)) {
case IP_VERSION(4, 0, 5):
+   case IP_VERSION(4, 0, 6):
if (amdgpu_umsch_mm & 0x1) {
amdgpu_device_ip_block_add(adev, 
_mm_v4_0_ip_block);
adev->enable_umsch_mm = true;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_umsch_mm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_umsch_mm.c
index 99210a3b1044..95f80b9131a8 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_umsch_mm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_umsch_mm.c
@@ -189,10 +189,13 @@ static void setup_vpe_queue(struct amdgpu_device *adev,
mqd->rptr_val = 0;
mqd->unmapped = 1;
 
+   if (adev->vpe.collaborate_mode)
+   memcpy(++mqd, test->mqd_data_cpu_addr, sizeof(struct MQD_INFO));
+
qinfo->mqd_addr = test->mqd_data_gpu_addr;
qinfo->csa_addr = test->ctx_data_gpu_addr +
offsetof(struct umsch_mm_test_ctx_data, vpe_ctx_csa);
-   qinfo->doorbell_offset_0 = (adev->doorbell_index.vpe_ring + 1) << 1;
+   qinfo->doorbell_offset_0 = 0;
qinfo->doorbell_offset_1 = 0;
 }
 
@@ -287,7 +290,10 @@ static int submit_vpe_queue(struct amdgpu_device *adev, 
struct umsch_mm_test *te
ring[5] = 0;
 
mqd->wptr_val = (6 << 2);
-   // 
WDOORBELL32(adev->umsch_mm.agdb_index[CONTEXT_PRIORITY_LEVEL_NORMAL], 
mqd->wptr_val);
+   if (adev->vpe.collaborate_mode)
+   (++mqd)->wptr_val = (6 << 2);
+
+   WDOORBELL32(adev->umsch_mm.agdb_index[CONTEXT_PRIORITY_LEVEL_NORMAL], 
mqd->wptr_val);
 
for (i = 0; i < adev->usec_timeout; i++) {
if (*fence == test_pattern)
@@ -571,6 +577,7 @@ int amdgpu_umsch_mm_init_microcode(struct amdgpu_umsch_mm 
*umsch)
 
switch (amdgpu_ip_version(adev, VCN_HWIP, 0)) {
case IP_VERSION(4, 0, 5):
+   case IP_VERSION(4, 0, 6):
fw_name = "amdgpu/umsch_mm_4_0_0.bin";
break;
default:
@@ -750,6 +757,7 @@ static int umsch_mm_early_init(void *handle)
 
switch (amdgpu_ip_version(adev, VCN_HWIP, 0)) {
case IP_VERSION(4, 0, 5):
+   case IP_VERSION(4, 0, 6):
umsch_mm_v4_0_set_funcs(>umsch_mm);
break;
default:
diff --git a/drivers/gpu/drm/amd/amdgpu/umsch_mm_v4_0.c 
b/drivers/gpu/drm/amd/amdgpu/umsch_mm_v4_0.c
index 8e7b763cfdb7..84368cf1e175 100644
--- a/drivers/gpu/drm/amd/amdgpu/umsch_mm_v4_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/umsch_mm_v4_0.c
@@ -60,7 +60,7 @@ static int umsch_mm_v4_0_load_microcode(struct 
amdgpu_umsch_mm *umsch)
 
umsch->cmd_buf_curr_ptr = umsch->cmd_buf_ptr;
 
-   if (amdgpu_ip_version(adev, VCN_HWIP, 0) == IP_VERSION(4, 0, 5)) {
+   if (amdgpu_ip_version(adev, VCN_HWIP, 0) >= IP_VERSION(4, 0, 5)) {
WREG32_SOC15(VCN, 0, regUVD_IPX_DLDO_CONFIG,
1 << UVD_IPX_DLDO_CONFIG__ONO0_PWR_CONFIG__SHIFT);
SOC15_WAIT_ON_RREG(VCN, 0, regUVD_IPX_DLDO_STATUS,
@@ -248,7 +248,7 @@ static int umsch_mm_v4_0_ring_stop(struct amdgpu_umsch_mm 
*umsch)
data = REG_SET_FIELD(data, VCN_UMSCH_RB_DB_CTRL, EN, 0);
WREG32_SOC15(VCN, 0, regVCN_UMSCH_RB_DB_CTRL, data);
 
-   if (amdgpu_ip_version(adev, VCN_HWIP, 0) == IP_VERSION(4, 0, 5)) {
+   if (amdgpu_ip_version(adev, VCN_HWIP, 0) >= IP_VERSION(4, 0, 5)) {
WREG32_SOC15(VCN, 0, regUVD_IPX_DLDO_CONFIG,
2 << UVD_IPX_DLDO_CONFIG__ONO0_PWR_CONFIG__SHIFT);
SOC15_WAIT_ON_RREG(VCN, 0, regUVD_IPX_DLDO_STATUS,
@@ -271,6 +271,8 @@ static int umsch_mm_v4_0_set_hw_resources(struct 
amdgpu_umsch_mm *umsch)
 
set_hw_resources.vmid_mask_mm_vcn = umsch->vmid_mask_mm_vcn;
set_hw_resources.vmid_mask_mm_vpe = umsch->vmid_mask_mm_vpe;
+   set_hw_resources.collaboration_mask_vpe =
+   adev->vpe.collaborate_mode ? 0x3 : 0x0;
set_hw_resources.engine_mask = umsch->engine_mask;
 
set_hw_resources.vcn0_hqd_mask[0] = umsch->vcn0_hqd_mask;
@@ -346,6 +348,7 @@ static int umsch_mm_v4_0_add_queue(struct amdgpu_umsch_mm 
*umsch,
add_queue.h_queue = input_ptr->h_queue;
add_queue.vm_context_cntl = input_ptr->vm_context_cntl;