[PATCH 2/2] drm/amdgpu: Add unique_id and serial_number for Arcturus
Russell, Kent
Kent.Russell at amd.com
Mon Jun 1 17:39:21 UTC 2020
[AMD Public Use]
> -----Original Message-----
> From: Alex Deucher <alexdeucher at gmail.com>
> Sent: Monday, June 1, 2020 1:35 PM
> To: Russell, Kent <Kent.Russell at amd.com>
> Cc: amd-gfx list <amd-gfx at lists.freedesktop.org>
> Subject: Re: [PATCH 2/2] drm/amdgpu: Add unique_id and serial_number for
> Arcturus
>
> On Mon, Jun 1, 2020 at 1:28 PM 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.
> >
> > Signed-off-by: Kent Russell <kent.russell at amd.com>
> > Change-Id: I3b036a38b19cd84025399b0706b2dad9b7aff713
> > ---
> > drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | 2 +-
> > 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, 38 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..9136d9022c51 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
> > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
> > @@ -1940,7 +1940,7 @@ 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)
>
> Will this work properly on navi and APUs as well?
It will, but it's not implemented yet. Currently it will just be an empty sysfs file.
>
> > *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);
> > 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)
> >
>
> I would call this get_unique_id() since it's fetching the id from the hw rather
> than setting it. Same comment for the device specific functions above.
>
> > #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://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Flist
> > s.freedesktop.org%2Fmailman%2Flistinfo%2Famd-
> gfx&data=02%7C01%7Cke
> >
> nt.russell%40amd.com%7Cdd77d3b285a04b19a3c108d80652189f%7C3dd896
> 1fe488
> >
> 4e608e11a82d994e183d%7C0%7C0%7C637266296955676858&sdata=Uq
> sOnA7TwH
> > OpbvyyqfeJm3yveVpgaLnN4sF0Q7lOCJo%3D&reserved=0
More information about the amd-gfx
mailing list