From: Felix Kuehling <[email protected]>

Query the initial UALink configuration info from PSP at driver
initialization time.

Signed-off-by: Felix Kuehling <[email protected]>
Reviewed-by: Mukul Joshi <[email protected]>
Signed-off-by: Alex Deucher <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c | 30 ++++++++++++++++++++++
 drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.h |  3 +++
 drivers/gpu/drm/amd/amdgpu/soc_v1_0.c      |  5 ++++
 3 files changed, 38 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c
index d91365399c767..41d39f828dfec 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c
@@ -29,6 +29,36 @@
 #include <linux/sysfs.h>
 #include <linux/string.h>
 
+int amdgpu_ualink_init(struct amdgpu_device *adev)
+{
+       int r;
+
+       r = psp_ual_get_interface_version(&adev->psp, &adev->ualink.psp_if_ver);
+       if (r) {
+               adev->ualink.psp_if_ver = 0xffffffff;
+               dev_err(adev->dev,
+                       "UALink interface version detection failed: %d", r);
+               return r;
+       }
+       dev_info(adev->dev, "Found UALink interface version 0x%x\n",
+                adev->ualink.psp_if_ver);
+
+       /* Query initial configuration from ASP */
+       r = psp_ual_query_info(&adev->psp, adev->ualink.psp_if_ver,
+                              adev->ualink.info);
+       if (r) {
+               dev_err(adev->dev,
+                       "Failed to query initial UALink config: %d\n", r);
+               return r;
+       }
+
+       return 0;
+}
+
+void amdgpu_ualink_fini(struct amdgpu_device *adev)
+{
+       /* empty */
+}
 
 /****************************************************************************
  * UALink info and configuration in sysfs
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.h
index 3882f29ccdae0..318e49ec0de4a 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.h
@@ -133,6 +133,7 @@ struct amdgpu_ualink_connection {
 };
 
 struct amdgpu_ualink_mgr {
+       u32 psp_if_ver;
        struct amdgpu_ualink_info *info;
        struct amdgpu_ualink_ppod_setup *setup;
        struct amdgpu_ualink_vpod_config *config;
@@ -166,6 +167,8 @@ struct amdgpu_ualink_mgr {
 
 int amdgpu_ualink_sysfs_init(struct amdgpu_device *adev);
 void amdgpu_ualink_sysfs_fini(struct amdgpu_device *adev);
+int amdgpu_ualink_init(struct amdgpu_device *adev);
+void amdgpu_ualink_fini(struct amdgpu_device *adev);
 int amdgpu_ualink_manager_start(struct amdgpu_device *adev);
 void amdgpu_ualink_manager_stop(struct amdgpu_device *adev);
 #endif
diff --git a/drivers/gpu/drm/amd/amdgpu/soc_v1_0.c 
b/drivers/gpu/drm/amd/amdgpu/soc_v1_0.c
index d5f945617f488..84cdb09f731e5 100644
--- a/drivers/gpu/drm/amd/amdgpu/soc_v1_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/soc_v1_0.c
@@ -439,6 +439,9 @@ static int soc_v1_0_common_late_init(struct amdgpu_ip_block 
*ip_block)
         */
        adev->nbio.funcs->enable_doorbell_selfring_aperture(adev, true);
 
+       /* Depends on PSP being initialized */
+       amdgpu_ualink_init(adev);
+
        return 0;
 }
 
@@ -472,6 +475,8 @@ static int soc_v1_0_common_hw_fini(struct amdgpu_ip_block 
*ip_block)
 {
        struct amdgpu_device *adev = ip_block->adev;
 
+       amdgpu_ualink_fini(adev);
+
        adev->nbio.funcs->enable_doorbell_aperture(adev, false);
        adev->nbio.funcs->enable_doorbell_selfring_aperture(adev, false);
 
-- 
2.55.0

Reply via email to