[PATCH] drm/amdgpu: Add Unique Identifier sysfs file unique_id v2

Alex Deucher alexdeucher at gmail.com
Fri May 17 18:37:35 UTC 2019


On Fri, May 17, 2019 at 2:31 PM Russell, Kent <Kent.Russell at amd.com> wrote:
>
> Add a file that provides a Unique ID for the GPU.
> This will persist across machines and is guaranteed to be unique.
> This is only available for GFX9 and newer, so older ASICs will not
> have this file in the sysfs pool
>
> v2: Store it in adev for ASICs that don't have a hwmgr
>
> Change-Id: I3c673f78efcc5bf93ca58d65edbe39fc3a86b42a
> Signed-off-by: Kent Russell <kent.russell at amd.com>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu.h           |  2 ++
>  drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c        | 32 +++++++++++++++++++
>  .../drm/amd/powerplay/hwmgr/vega10_hwmgr.c    |  9 ++++++
>  .../drm/amd/powerplay/hwmgr/vega12_hwmgr.c    | 10 ++++++
>  .../drm/amd/powerplay/hwmgr/vega20_hwmgr.c    | 10 ++++++
>  5 files changed, 63 insertions(+)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> index 96394ef3fae3..d355e9a09ad1 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> @@ -960,6 +960,8 @@ struct amdgpu_device {
>         long                            sdma_timeout;
>         long                            video_timeout;
>         long                            compute_timeout;
> +
> +       uint64_t                        unique_id;
>  };
>
>  static inline struct amdgpu_device *amdgpu_ttm_adev(struct ttm_bo_device *bdev)
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
> index adba9ea03e63..a73e1903d29b 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
> @@ -1368,6 +1368,29 @@ static ssize_t amdgpu_get_pcie_bw(struct device *dev,
>                         count0, count1, pcie_get_mps(adev->pdev));
>  }
>
> +/**
> + * DOC: unique_id
> + *
> + * The amdgpu driver provides a sysfs API for providing a unique ID for the GPU
> + * The file unique_id is used for this.
> + * This will provide a Unique ID that will persist from machine to machine
> + *
> + * NOTE: This will only work for GFX9 and newer. This file will be absent
> + * on unsupported ASICs (GFX8 and older)
> + */
> +static ssize_t amdgpu_get_unique_id(struct device *dev,
> +               struct device_attribute *attr,
> +               char *buf)
> +{
> +       struct drm_device *ddev = dev_get_drvdata(dev);
> +       struct amdgpu_device *adev = ddev->dev_private;
> +
> +       if (adev->unique_id)
> +               return snprintf(buf, PAGE_SIZE, "%016llx\n", adev->unique_id);
> +
> +       return 0;
> +}
> +
>  static DEVICE_ATTR(power_dpm_state, S_IRUGO | S_IWUSR, amdgpu_get_dpm_state, amdgpu_set_dpm_state);
>  static DEVICE_ATTR(power_dpm_force_performance_level, S_IRUGO | S_IWUSR,
>                    amdgpu_get_dpm_forced_performance_level,
> @@ -1418,6 +1441,7 @@ static DEVICE_ATTR(pcie_bw, S_IRUGO, amdgpu_get_pcie_bw, NULL);
>  static DEVICE_ATTR(ppfeatures, S_IRUGO | S_IWUSR,
>                 amdgpu_get_ppfeature_status,
>                 amdgpu_set_ppfeature_status);
> +static DEVICE_ATTR(unique_id, S_IRUGO, amdgpu_get_unique_id, NULL);
>
>  static ssize_t amdgpu_hwmon_show_temp(struct device *dev,
>                                       struct device_attribute *attr,
> @@ -2814,6 +2838,12 @@ int amdgpu_pm_sysfs_init(struct amdgpu_device *adev)
>                         return ret;
>                 }
>         }
> +       if (adev->unique_id)
> +               ret = device_create_file(adev->dev, &dev_attr_unique_id);
> +       if (ret) {
> +               DRM_ERROR("failed to create device file unique_id\n");
> +               return ret;
> +       }
>         ret = amdgpu_debugfs_pm_init(adev);
>         if (ret) {
>                 DRM_ERROR("Failed to register debugfs file for dpm!\n");
> @@ -2875,6 +2905,8 @@ void amdgpu_pm_sysfs_fini(struct amdgpu_device *adev)
>                 device_remove_file(adev->dev, &dev_attr_mem_busy_percent);
>         if (!(adev->flags & AMD_IS_APU))
>                 device_remove_file(adev->dev, &dev_attr_pcie_bw);
> +       if (adev->unique_id)
> +               device_remove_file(adev->dev, &dev_attr_unique_id);
>         if ((adev->asic_type >= CHIP_VEGA10) &&
>             !(adev->flags & AMD_IS_APU))
>                 device_remove_file(adev->dev, &dev_attr_ppfeatures);
> diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c
> index 9585ba51d853..ce6aeb5a0362 100644
> --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c
> +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c
> @@ -356,6 +356,7 @@ static void vega10_init_dpm_defaults(struct pp_hwmgr *hwmgr)
>         struct vega10_hwmgr *data = hwmgr->backend;
>         int i;
>         uint32_t sub_vendor_id, hw_revision;
> +       uint32_t top32, bottom32;
>         struct amdgpu_device *adev = hwmgr->adev;
>
>         vega10_initialize_power_tune_defaults(hwmgr);
> @@ -499,6 +500,14 @@ static void vega10_init_dpm_defaults(struct pp_hwmgr *hwmgr)
>                 (hw_revision == 0) &&
>                 (sub_vendor_id != 0x1002))
>                 data->smu_features[GNLD_PCC_LIMIT].supported = true;
> +
> +       /* Get the SN to turn into a Unique ID */
> +       smum_send_msg_to_smc(hwmgr, PPSMC_MSG_ReadSerialNumTop32);
> +       top32 = smum_get_argument(hwmgr);
> +       smum_send_msg_to_smc(hwmgr, PPSMC_MSG_ReadSerialNumBottom32);
> +       bottom32 = smum_get_argument(hwmgr);
> +
> +       adev->unique_id = ((uint64_t)bottom32 << 32) | top32;

Seems like top and bottom should be reversed.  Same for the others
below.  But I guess that is what the existing code does.  Might be
worth double checking with the SMU team to make sure we are doing it
right and it's not just a bug in the old code.  With that confirmed:
Reviewed-by: Alex Deucher <alexander.deucher at amd.com>


>  }
>
>  #ifdef PPLIB_VEGA10_EVV_SUPPORT
> diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.c
> index 1a909dda37c7..efb6d3762feb 100644
> --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.c
> +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.c
> @@ -289,6 +289,8 @@ static int vega12_set_features_platform_caps(struct pp_hwmgr *hwmgr)
>  static void vega12_init_dpm_defaults(struct pp_hwmgr *hwmgr)
>  {
>         struct vega12_hwmgr *data = (struct vega12_hwmgr *)(hwmgr->backend);
> +       struct amdgpu_device *adev = hwmgr->adev;
> +       uint32_t top32, bottom32;
>         int i;
>
>         data->smu_features[GNLD_DPM_PREFETCHER].smu_feature_id =
> @@ -353,6 +355,14 @@ static void vega12_init_dpm_defaults(struct pp_hwmgr *hwmgr)
>                         ((data->registry_data.disallowed_features >> i) & 1) ?
>                         false : true;
>         }
> +
> +       /* Get the SN to turn into a Unique ID */
> +       smum_send_msg_to_smc(hwmgr, PPSMC_MSG_ReadSerialNumTop32);
> +       top32 = smum_get_argument(hwmgr);
> +       smum_send_msg_to_smc(hwmgr, PPSMC_MSG_ReadSerialNumBottom32);
> +       bottom32 = smum_get_argument(hwmgr);
> +
> +       adev->unique_id = ((uint64_t)bottom32 << 32) | top32;
>  }
>
>  static int vega12_set_private_data_based_on_pptable(struct pp_hwmgr *hwmgr)
> diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c
> index d18f34d4a51e..f27c6fbb192e 100644
> --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c
> +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c
> @@ -324,6 +324,8 @@ static int vega20_set_features_platform_caps(struct pp_hwmgr *hwmgr)
>  static void vega20_init_dpm_defaults(struct pp_hwmgr *hwmgr)
>  {
>         struct vega20_hwmgr *data = (struct vega20_hwmgr *)(hwmgr->backend);
> +       struct amdgpu_device *adev = hwmgr->adev;
> +       uint32_t top32, bottom32;
>         int i;
>
>         data->smu_features[GNLD_DPM_PREFETCHER].smu_feature_id =
> @@ -393,6 +395,14 @@ static void vega20_init_dpm_defaults(struct pp_hwmgr *hwmgr)
>                         ((data->registry_data.disallowed_features >> i) & 1) ?
>                         false : true;
>         }
> +
> +       /* Get the SN to turn into a Unique ID */
> +       smum_send_msg_to_smc(hwmgr, PPSMC_MSG_ReadSerialNumTop32);
> +       top32 = smum_get_argument(hwmgr);
> +       smum_send_msg_to_smc(hwmgr, PPSMC_MSG_ReadSerialNumBottom32);
> +       bottom32 = smum_get_argument(hwmgr);
> +
> +       adev->unique_id = ((uint64_t)bottom32 << 32) | top32;
>  }
>
>  static int vega20_set_private_data_based_on_pptable(struct pp_hwmgr *hwmgr)
> --
> 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