[PATCH 76/95] drm/amdgpu: Add ualink as separate ip block
Alex Deucher <[email protected]>
| Newsgroups | org.freedesktop.lists.amd-gfx |
|---|---|
| Message-ID | <[email protected]> |
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 715cc2e85105c..28841fdb3798f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c @@ -2456,8 +2456,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); @@ -2484,8 +2482,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 @@ -2769,8 +2765,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); @@ -2963,8 +2957,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 bc53d37534222..afcb5ef84bd48 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) @@ -1030,18 +1021,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); @@ -1084,9 +1073,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, @@ -5550,3 +5540,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 3c5bfdd3af5bb..3c043167f948e 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.h @@ -371,10 +371,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); @@ -387,4 +383,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 e3baef809cd11..fa6caf8e04b5e 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