RE: [PATCH 2/2] drm/amdgpu: Add unique_id and serial_number for Arcturus v2

2020-06-02 Thread Russell, Kent
[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

2020-06-02 Thread Alex Deucher
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

2020-06-02 Thread Kent Russell
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