[PATCH 2/2] drm/amdgpu: Add unique_id and serial_number for Arcturus v2
Alex Deucher
alexdeucher at gmail.com
Tue Jun 2 14:45:16 UTC 2020
On Tue, Jun 2, 2020 at 8:53 AM Kent Russell <kent.russell at amd.com> wrote:
>
> Add support for unique_id and serial_number, as these are now
> the same value, and will be for future ASICs as well.
>
> v2: Explicitly create unique_id only for VG10/20/ARC
>
> Signed-off-by: Kent Russell <kent.russell at amd.com>
> Change-Id: I3b036a38b19cd84025399b0706b2dad9b7aff713
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | 4 ++-
> drivers/gpu/drm/amd/powerplay/amdgpu_smu.c | 2 ++
> drivers/gpu/drm/amd/powerplay/arcturus_ppt.c | 32 +++++++++++++++++++
> .../gpu/drm/amd/powerplay/inc/amdgpu_smu.h | 1 +
> drivers/gpu/drm/amd/powerplay/smu_internal.h | 2 ++
> 5 files changed, 40 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
> index b0dff9ecfb88..b2cdc8a1268f 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
> @@ -1940,7 +1940,9 @@ static int default_attr_update(struct amdgpu_device *adev, struct amdgpu_device_
> if (adev->flags & AMD_IS_APU)
> *states = ATTR_STATE_UNSUPPORTED;
> } else if (DEVICE_ATTR_IS(unique_id)) {
> - if (!adev->unique_id)
> + if (asic_type != CHIP_VEGA10 &&
> + asic_type != CHIP_VEGA20 &&
> + asic_type != CHIP_ARCTURUS)
> *states = ATTR_STATE_UNSUPPORTED;
> } else if (DEVICE_ATTR_IS(pp_features)) {
> if (adev->flags & AMD_IS_APU || asic_type < CHIP_VEGA10)
> diff --git a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
> index 5294aa7cdde1..7946fd8444a3 100644
> --- a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
> +++ b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
> @@ -793,6 +793,8 @@ static int smu_late_init(void *handle)
> if (!smu->pm_enabled)
> return 0;
>
> + smu_set_unique_id(smu);
> +
> smu_handle_task(&adev->smu,
> smu->smu_dpm.dpm_level,
> AMD_PP_TASK_COMPLETE_INIT,
> diff --git a/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c b/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c
> index d66ac7457574..855e609650d9 100644
> --- a/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c
> +++ b/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c
> @@ -2262,6 +2262,37 @@ static void arcturus_i2c_eeprom_control_fini(struct i2c_adapter *control)
> i2c_del_adapter(control);
> }
>
> +static void arcturus_set_unique_id(struct smu_context *smu)
> +{
> + struct amdgpu_device *adev = smu->adev;
> + uint32_t top32, bottom32, smu_version, size;
> + char sn[16];
> + uint64_t id;
> +
> + if (smu_get_smc_version(smu, NULL, &smu_version)) {
> + pr_warn("Failed to get smu version, cannot get unique_id or serial_number\n");
> + return;
> + }
> +
> + /* PPSMC_MSG_ReadSerial* is supported by 54.23.0 and onwards */
> + if (smu_version < 0x361700) {
> + pr_warn("ReadSerial is only supported by PMFW 54.23.0 and onwards\n");
> + return;
> + }
> +
> + /* Get the SN to turn into a Unique ID */
> + smu_send_smc_msg(smu, SMU_MSG_ReadSerialNumTop32, &top32);
> + smu_send_smc_msg(smu, SMU_MSG_ReadSerialNumBottom32, &bottom32);
> +
> + id = ((uint64_t)bottom32 << 32) | top32;
> + adev->unique_id = id;
> + /* For Arcturus-and-later, unique_id == serial_number, so convert it to a
> + * 16-digit HEX string for convenience and backwards-compatibility
> + */
> + size = sprintf(sn, "%llx", id);
> + memcpy(adev->serial, &sn, size);
> +}
> +
> static bool arcturus_is_baco_supported(struct smu_context *smu)
> {
> struct amdgpu_device *adev = smu->adev;
> @@ -2416,6 +2447,7 @@ static const struct pptable_funcs arcturus_ppt_funcs = {
> .dpm_set_uvd_enable = arcturus_dpm_set_uvd_enable,
> .i2c_eeprom_init = arcturus_i2c_eeprom_control_init,
> .i2c_eeprom_fini = arcturus_i2c_eeprom_control_fini,
> + .set_unique_id = arcturus_set_unique_id,
> .init_microcode = smu_v11_0_init_microcode,
> .load_microcode = smu_v11_0_load_microcode,
> .init_smc_tables = smu_v11_0_init_smc_tables,
> diff --git a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
> index 5bb1ac821aeb..bfa5211de079 100644
> --- a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
> +++ b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
> @@ -495,6 +495,7 @@ struct pptable_funcs {
> int (*update_pcie_parameters)(struct smu_context *smu, uint32_t pcie_gen_cap, uint32_t pcie_width_cap);
> int (*i2c_eeprom_init)(struct i2c_adapter *control);
> void (*i2c_eeprom_fini)(struct i2c_adapter *control);
> + void (*set_unique_id)(struct smu_context *smu);
As I mentioned in my previous email, I think these functions would be
better worded as "get_unique_id" since we are fetching it from the
hardware not storing it to the hardware.
Alex
> int (*get_dpm_clock_table)(struct smu_context *smu, struct dpm_clocks *clock_table);
> int (*init_microcode)(struct smu_context *smu);
> int (*load_microcode)(struct smu_context *smu);
> diff --git a/drivers/gpu/drm/amd/powerplay/smu_internal.h b/drivers/gpu/drm/amd/powerplay/smu_internal.h
> index 6c59eeef2590..125d976215a6 100644
> --- a/drivers/gpu/drm/amd/powerplay/smu_internal.h
> +++ b/drivers/gpu/drm/amd/powerplay/smu_internal.h
> @@ -218,6 +218,8 @@ static inline int smu_send_smc_msg(struct smu_context *smu, enum smu_message_typ
> ((smu)->ppt_funcs->i2c_eeprom_init ? (smu)->ppt_funcs->i2c_eeprom_init((control)) : 0)
> #define smu_i2c_eeprom_fini(smu, control) \
> ((smu)->ppt_funcs->i2c_eeprom_fini ? (smu)->ppt_funcs->i2c_eeprom_fini((control)) : 0)
> +#define smu_set_unique_id(smu) \
> + ((smu)->ppt_funcs->set_unique_id ? (smu)->ppt_funcs->set_unique_id((smu)) : 0)
>
> #define smu_log_thermal_throttling(smu) \
> ((smu)->ppt_funcs->log_thermal_throttling_event ? (smu)->ppt_funcs->log_thermal_throttling_event((smu)) : 0)
> --
> 2.17.1
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
More information about the amd-gfx
mailing list