[PATCH 09/95] drm/amdgpu: Query initial UALink config from PSP
Alex Deucher <[email protected]>
| Newsgroups | org.freedesktop.lists.amd-gfx |
|---|---|
| Message-ID | <[email protected]> |
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 f5ff9f1e9ce0c..69d3f430f1f6a 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 f2be71232813d..1cdf670673573 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.h @@ -129,6 +129,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; @@ -162,6 +163,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