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
v3: Change set_unique_id to get_unique_id for clarity

Signed-off-by: Kent Russell <kent.russ...@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..847502faca90 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_get_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..df7b408319f7 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_get_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,
+       .get_unique_id = arcturus_get_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..13fc5773ba45 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 (*get_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..c9440c978402 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_get_unique_id(smu) \
+               ((smu)->ppt_funcs->get_unique_id ? 
(smu)->ppt_funcs->get_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@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to