RE: [PATCH 2/2] drm/amdgpu: Add unique_id and serial_number for Arcturus v2
[AMD Public Use] > -Original Message- > From: Alex Deucher > Sent: Tuesday, June 2, 2020 10:45 AM > To: Russell, Kent > Cc: amd-gfx list > Subject: Re: [PATCH 2/2] drm/amdgpu: Add unique_id and serial_number for > Arcturus v2 > > On Tue, Jun 2, 2020 at 8:53 AM Kent Russell 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 > > 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 @@ > >
Re: [PATCH 2/2] drm/amdgpu: Add unique_id and serial_number for Arcturus v2
On Tue, Jun 2, 2020 at 8:53 AM Kent Russell 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 > 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,
[PATCH 2/2] drm/amdgpu: Add unique_id and serial_number for Arcturus v2
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 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); 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