From: Lijo Lazar <[email protected]>

Manage ualink lifecycle as a separate IP block. For now, use GC version
to add specific ualink ip block.

Signed-off-by: Lijo Lazar <[email protected]>
Acked-by: Felix Kuehling <[email protected]>
Signed-off-by: Alex Deucher <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c    |  8 ----
 drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c | 21 +++++++++
 drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c    | 44 +++++++++++--------
 drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.h    |  6 +--
 drivers/gpu/drm/amd/include/amd_shared.h      |  2 +
 5 files changed, 50 insertions(+), 31 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index 02c4d6956d6e2..44091ac12fa9c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -2459,8 +2459,6 @@ static int amdgpu_device_ip_init(struct amdgpu_device 
*adev)
                }
        }
 
-       amdgpu_ualink_mgr_sw_init(adev);
-
        if (amdgpu_sriov_vf(adev))
                amdgpu_virt_init_data_exchange(adev);
 
@@ -2487,8 +2485,6 @@ static int amdgpu_device_ip_init(struct amdgpu_device 
*adev)
        if (r)
                goto init_failed;
 
-       amdgpu_ualink_mgr_hw_init(adev);
-
        /*
         * retired pages will be loaded from eeprom and reserved here,
         * it should be called after amdgpu_device_ip_hw_init_phase2  since
@@ -2772,8 +2768,6 @@ static int amdgpu_device_ip_late_init(struct 
amdgpu_device *adev)
                adev->ip_blocks[i].status.late_initialized = true;
        }
 
-       amdgpu_ualink_mgr_late_init(adev);
-
        r = amdgpu_ras_late_init(adev);
        if (r) {
                dev_err(adev->dev, "amdgpu_ras_late_init failed %d", r);
@@ -2966,8 +2960,6 @@ static int amdgpu_device_ip_fini(struct amdgpu_device 
*adev)
 
        amdgpu_amdkfd_device_fini_sw(adev);
 
-       amdgpu_ualink_mgr_sw_fini(adev);
-
        for (i = adev->num_ip_blocks - 1; i >= 0; i--) {
                if (!adev->ip_blocks[i].status.sw)
                        continue;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c
index 81c3cdba4caf5..7710a8ed3d44d 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c
@@ -26,6 +26,7 @@
 
 #include "amdgpu.h"
 #include "amdgpu_discovery.h"
+#include "amdgpu_ualink.h"
 #include "soc15_hw_ip.h"
 #include "discovery.h"
 #include "amdgpu_ras.h"
@@ -3359,6 +3360,22 @@ static int amdgpu_discovery_set_isp_ip_blocks(struct 
amdgpu_device *adev)
        return 0;
 }
 
+static int amdgpu_discovery_set_ualink_ip_blocks(struct amdgpu_device *adev)
+{
+       /* TODO: no dedicated IP discovery version for UALink yet; key off the
+        * GC IP version for now.
+        */
+       switch (amdgpu_ip_version(adev, GC_HWIP, 0)) {
+       case IP_VERSION(12, 1, 0):
+               amdgpu_device_ip_block_add(adev, &ualink_v1_0_ip_block);
+               break;
+       default:
+               break;
+       }
+
+       return 0;
+}
+
 int amdgpu_discovery_set_ip_blocks(struct amdgpu_device *adev)
 {
        int r;
@@ -4008,6 +4025,10 @@ int amdgpu_discovery_set_ip_blocks(struct amdgpu_device 
*adev)
                return r;
 
        r = amdgpu_discovery_set_isp_ip_blocks(adev);
+       if (r)
+               return r;
+
+       r = amdgpu_discovery_set_ualink_ip_blocks(adev);
        if (r)
                return r;
        return 0;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c
index d24bd447c93cd..2772d99233615 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c
@@ -80,17 +80,6 @@ static int amdgpu_ualink_drm_client_create(struct 
amdgpu_device *adev)
        return 0;
 }
 
-static bool amdgpu_ualink_supported(struct amdgpu_device *adev)
-{
-       if (!amdgpu_device_ip_get_ip_block(adev, AMD_IP_BLOCK_TYPE_PSP))
-               return false;
-
-       if (amdgpu_ip_version(adev, MP0_HWIP, 0) != IP_VERSION(15, 0, 8))
-               return false;
-
-       return true;
-}
-
 static void amdgpu_ualink_object_fini(struct amdgpu_device *adev)
 {
        if (!adev->ualink.info)
@@ -106,8 +95,9 @@ static void amdgpu_ualink_object_fini(struct amdgpu_device 
*adev)
        adev->ualink.info = NULL;
 }
 
-int amdgpu_ualink_mgr_hw_init(struct amdgpu_device *adev)
+static int ualink_ip_hw_init(struct amdgpu_ip_block *ip_block)
 {
+       struct amdgpu_device *adev = ip_block->adev;
        int r;
 
        if (!adev->ualink.info)
@@ -142,8 +132,9 @@ int amdgpu_ualink_mgr_hw_init(struct amdgpu_device *adev)
        return 0;
 }
 
-int amdgpu_ualink_mgr_late_init(struct amdgpu_device *adev)
+static int ualink_ip_late_init(struct amdgpu_ip_block *ip_block)
 {
+       struct amdgpu_device *adev = ip_block->adev;
        int r;
 
        if (adev->ualink.mgr_state != AMDGPU_UALINK_INIT_HW)
@@ -1059,18 +1050,16 @@ static const struct kobj_type 
ualink_station_config_ktype = {
        .sysfs_ops = &kobj_sysfs_ops
 };
 
-int amdgpu_ualink_mgr_sw_init(struct amdgpu_device *adev)
+static int ualink_ip_sw_init(struct amdgpu_ip_block *ip_block)
 {
        int r;
 
        struct amdgpu_ualink_station_config *stations;
        struct amdgpu_ualink_vpod_config *vpod_config;
        struct amdgpu_ualink_ppod_setup *ppod_setup;
+       struct amdgpu_device *adev = ip_block->adev;
        struct amdgpu_ualink_info *info;
 
-       if (!amdgpu_ualink_supported(adev))
-               return 0;
-
        info = kzalloc(sizeof(*info), GFP_KERNEL);
        ppod_setup = kzalloc(sizeof(*ppod_setup), GFP_KERNEL);
        vpod_config = kzalloc(sizeof(*vpod_config), GFP_KERNEL);
@@ -1113,9 +1102,10 @@ int amdgpu_ualink_mgr_sw_init(struct amdgpu_device *adev)
        return 0;
 }
 
-void amdgpu_ualink_mgr_sw_fini(struct amdgpu_device *adev)
+static int ualink_ip_sw_fini(struct amdgpu_ip_block *ip_block)
 {
-       amdgpu_ualink_object_fini(adev);
+       amdgpu_ualink_object_fini(ip_block->adev);
+       return 0;
 }
 
 static int ualink_kobj_add(struct kobject *kobj, struct kobject *parent,
@@ -5599,3 +5589,19 @@ int amdgpu_ualink_init_interrupt(struct amdgpu_device 
*adev)
        return r;
 }
 
+const struct amd_ip_funcs ualink_ip_funcs = {
+       .name = "ualink",
+       .late_init = ualink_ip_late_init,
+       .sw_init = ualink_ip_sw_init,
+       .sw_fini = ualink_ip_sw_fini,
+       .hw_init = ualink_ip_hw_init,
+};
+
+const struct amdgpu_ip_block_version ualink_v1_0_ip_block = {
+       .type = AMD_IP_BLOCK_TYPE_UALINK,
+       .major = 1,
+       .minor = 0,
+       .rev = 0,
+       .funcs = &ualink_ip_funcs,
+};
+
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.h
index 90116ed532d16..64ebdf943aa72 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.h
@@ -375,10 +375,6 @@ void amdgpu_ualink_sw_fini(struct amdgpu_device *adev);
 
 int ualink_send_hello(struct amdgpu_device *adev, u32 remote_accel_id);
 
-int amdgpu_ualink_mgr_sw_init(struct amdgpu_device *adev);
-void amdgpu_ualink_mgr_sw_fini(struct amdgpu_device *adev);
-int amdgpu_ualink_mgr_hw_init(struct amdgpu_device *adev);
-int amdgpu_ualink_mgr_late_init(struct amdgpu_device *adev);
 
 int amdgpu_ualink_sysfs_init(struct amdgpu_device *adev);
 void amdgpu_ualink_sysfs_fini(struct amdgpu_device *adev);
@@ -391,4 +387,6 @@ int amdgpu_ualink_import_handle(struct drm_device *dev,
                                const struct amdgpu_ualink_handle 
*ualink_handle,
                                int *fd_out);
 void amdgpu_ualink_revoke_exported_memory(struct amdgpu_bo *bo);
+
+extern const struct amdgpu_ip_block_version ualink_v1_0_ip_block;
 #endif
diff --git a/drivers/gpu/drm/amd/include/amd_shared.h 
b/drivers/gpu/drm/amd/include/amd_shared.h
index 7e29fe312ac69..e81ce9d790097 100644
--- a/drivers/gpu/drm/amd/include/amd_shared.h
+++ b/drivers/gpu/drm/amd/include/amd_shared.h
@@ -90,6 +90,7 @@ enum amd_apu_flags {
 * @AMD_IP_BLOCK_TYPE_UMSCH_MM: User Mode Scheduler for Multimedia
 * @AMD_IP_BLOCK_TYPE_ISP: Image Signal Processor
 * @AMD_IP_BLOCK_TYPE_RAS: Reliability, Availability, Serviceability
+* @AMD_IP_BLOCK_TYPE_UALINK: Ultra Accelerator Link
 * @AMD_IP_BLOCK_TYPE_NUM: Total number of IP block types
 */
 enum amd_ip_block_type {
@@ -111,6 +112,7 @@ enum amd_ip_block_type {
        AMD_IP_BLOCK_TYPE_UMSCH_MM,
        AMD_IP_BLOCK_TYPE_ISP,
        AMD_IP_BLOCK_TYPE_RAS,
+       AMD_IP_BLOCK_TYPE_UALINK,
        AMD_IP_BLOCK_TYPE_NUM,
 };
 
-- 
2.55.0

Reply via email to