1. Added enum amd_sriov_crit_region_version to support multi versions
2. Added logic in SRIOV mailbox to regonize crit_region version during
   req_gpu_init_data

Signed-off-by: Ellen Pan <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c    |  3 ++-
 drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h    |  4 ++++
 drivers/gpu/drm/amd/amdgpu/amdgv_sriovmsg.h |  5 +++++
 drivers/gpu/drm/amd/amdgpu/mxgpu_nv.c       | 23 ++++++++++++++-------
 4 files changed, 27 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
index e95adf0407a0..3a6b0e1084d7 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
@@ -150,7 +150,8 @@ void amdgpu_virt_request_init_data(struct amdgpu_device 
*adev)
                virt->ops->req_init_data(adev);
 
        if (adev->virt.req_init_data_ver > 0)
-               DRM_INFO("host supports REQ_INIT_DATA handshake\n");
+               DRM_INFO("host supports REQ_INIT_DATA handshake of 
critical_region_version %d\n",
+                                adev->virt.req_init_data_ver);
        else
                DRM_WARN("host doesn't support REQ_INIT_DATA handshake\n");
 }
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h
index d1172c8e58c4..2a0627596bd2 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h
@@ -289,6 +289,10 @@ struct amdgpu_virt {
        bool ras_init_done;
        uint32_t reg_access;
 
+       /* critical regions v2 */
+       uint32_t init_data_header_offset;
+       uint32_t init_data_header_size_kb;
+
        /* vf2pf message */
        struct delayed_work vf2pf_work;
        uint32_t vf2pf_update_interval_ms;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgv_sriovmsg.h 
b/drivers/gpu/drm/amd/amdgpu/amdgv_sriovmsg.h
index 3b35154e2df6..b53caab5b706 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgv_sriovmsg.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgv_sriovmsg.h
@@ -65,6 +65,11 @@
        (AMD_SRIOV_MSG_VBIOS_SIZE_KB_V1 + AMD_SRIOV_MSG_DATAEXCHANGE_SIZE_KB_V1 
+ \
         AMD_SRIOV_MSG_RAS_TELEMETRY_SIZE_KB_V1)
 
+enum amd_sriov_crit_region_version {
+       GPU_CRIT_REGION_V1 = 1,
+       GPU_CRIT_REGION_V2 = 2,
+};
+
 /*
  * PF2VF history log:
  * v1 defined in amdgim
diff --git a/drivers/gpu/drm/amd/amdgpu/mxgpu_nv.c 
b/drivers/gpu/drm/amd/amdgpu/mxgpu_nv.c
index e5282a5d05d9..5f7ae3763b60 100644
--- a/drivers/gpu/drm/amd/amdgpu/mxgpu_nv.c
+++ b/drivers/gpu/drm/amd/amdgpu/mxgpu_nv.c
@@ -222,12 +222,20 @@ static int xgpu_nv_send_access_requests_with_param(struct 
amdgpu_device *adev,
                                adev->virt.req_init_data_ver = 0;
                } else {
                        if (req == IDH_REQ_GPU_INIT_DATA) {
-                               adev->virt.req_init_data_ver =
-                                       RREG32_NO_KIQ(mmMAILBOX_MSGBUF_RCV_DW1);
-
-                               /* assume V1 in case host doesn't set version 
number */
-                               if (adev->virt.req_init_data_ver < 1)
-                                       adev->virt.req_init_data_ver = 1;
+                               switch 
(RREG32_NO_KIQ(mmMAILBOX_MSGBUF_RCV_DW1)) {
+                               case GPU_CRIT_REGION_V2:
+                                       adev->virt.req_init_data_ver = 
GPU_CRIT_REGION_V2;
+                                       adev->virt.init_data_header_offset =
+                                               
RREG32_NO_KIQ(mmMAILBOX_MSGBUF_RCV_DW2);
+                                       adev->virt.init_data_header_size_kb =
+                                               
RREG32_NO_KIQ(mmMAILBOX_MSGBUF_RCV_DW3);
+                                       break;
+                               default:
+                                       adev->virt.req_init_data_ver = 
GPU_CRIT_REGION_V1;
+                                       adev->virt.init_data_header_offset = -1;
+                                       adev->virt.init_data_header_size_kb = 0;
+                                       break;
+                               }
                        }
                }
 
@@ -285,7 +293,8 @@ static int xgpu_nv_release_full_gpu_access(struct 
amdgpu_device *adev,
 
 static int xgpu_nv_request_init_data(struct amdgpu_device *adev)
 {
-       return xgpu_nv_send_access_requests(adev, IDH_REQ_GPU_INIT_DATA);
+       return xgpu_nv_send_access_requests_with_param(adev, 
IDH_REQ_GPU_INIT_DATA,
+                       0, GPU_CRIT_REGION_V2, 0);
 }
 
 static int xgpu_nv_mailbox_ack_irq(struct amdgpu_device *adev,
-- 
2.34.1

Reply via email to