drm/amd/pm: Add LightSBR SMU MSG support
authorshaoyunl <shaoyun.liu@amd.com>
Wed, 10 Mar 2021 17:03:37 +0000 (12:03 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 24 Mar 2021 03:25:43 +0000 (23:25 -0400)
This new MSG provide the interface for driver to enable/disable the Light Secondary Bus Reset
support from SMU. When enabled, SMU will only do minimum NBIO response to the SBR request and
leave the real HW reset to be handled by driver later. When disabled (default state),SMU will
pass the request to PSP for a HW reset

Signed-off-by: shaoyunl <shaoyun.liu@amd.com>
Reviewed-by: Evan Quan <evan.quan@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/pm/inc/amdgpu_smu.h
drivers/gpu/drm/amd/pm/inc/arcturus_ppsmc.h
drivers/gpu/drm/amd/pm/inc/smu_types.h
drivers/gpu/drm/amd/pm/inc/smu_v11_0.h
drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c
drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c

index c02ffbd1df763780e11e8397aa33f6b8076738ae..5ac683fd074963dc2437f2b446522271160d58a0 100644 (file)
@@ -1153,6 +1153,11 @@ struct pptable_funcs {
         *                                      parameters to defaults.
         */
        int (*set_fine_grain_gfx_freq_parameters)(struct smu_context *smu);
+
+       /**
+        * @set_light_sbr:  Set light sbr mode for the SMU.
+        */
+       int (*set_light_sbr)(struct smu_context *smu, bool enable);
 };
 
 typedef enum {
@@ -1356,5 +1361,7 @@ ssize_t smu_sys_get_gpu_metrics(void *handle, void **table);
 int smu_enable_mgpu_fan_boost(void *handle);
 int smu_gfx_state_change_set(struct smu_context *smu, uint32_t state);
 
+int smu_set_light_sbr(struct smu_context *smu, bool enable);
+
 #endif
 #endif
index 79afb132164ead8ef485028b4abb931689090d4e..45f5d29bc70574662c1380c15ab2a16049396335 100644 (file)
 #define PPSMC_MSG_ReadSerialNumTop32            0x40
 #define PPSMC_MSG_ReadSerialNumBottom32                 0x41
 
+/* paramater for MSG_LightSBR
+ * 1 -- Enable light secondary bus reset, only do nbio respond without further handling,
+ *      leave driver to handle the real reset
+ * 0 -- Disable LightSBR, default behavior, SMU will pass the reset to PSP
+ */
+#define PPSMC_MSG_LightSBR                      0x42
+
 typedef uint32_t PPSMC_Result;
 typedef uint32_t PPSMC_Msg;
 #pragma pack(pop)
index e9a0bda98fd75d43c0addf753916bffab736b6ba..5bfb60f41dd422b92d685aea3db2c0a2df1f0c73 100644 (file)
        __SMU_DUMMY_MAP(EnableDeterminism),             \
        __SMU_DUMMY_MAP(DisableDeterminism),            \
        __SMU_DUMMY_MAP(SetUclkDpmMode),                \
+       __SMU_DUMMY_MAP(LightSBR),                      \
 
 #undef __SMU_DUMMY_MAP
 #define __SMU_DUMMY_MAP(type)  SMU_MSG_##type
index bf570a7af6a76eb81821972cd3871a298e8ee342..907e0967a9e814912aaa278ac5da1a5878cecfe6 100644 (file)
@@ -295,5 +295,7 @@ int smu_v11_0_deep_sleep_control(struct smu_context *smu,
 
 void smu_v11_0_interrupt_work(struct smu_context *smu);
 
+int smu_v11_0_set_light_sbr(struct smu_context *smu, bool enable);
+
 #endif
 #endif
index 6a6fafc115881e398ad596f3f88b3a08362bfe48..1202b9e7d0f9653a6f27d38eda33c5015dee2a1a 100644 (file)
@@ -2972,6 +2972,19 @@ int smu_gfx_state_change_set(struct smu_context *smu, uint32_t state)
        return ret;
 }
 
+int smu_set_light_sbr(struct smu_context *smu, bool enable)
+{
+       int ret = 0;
+
+       mutex_lock(&smu->mutex);
+       if (smu->ppt_funcs->set_light_sbr)
+               ret = smu->ppt_funcs->set_light_sbr(smu, enable);
+       mutex_unlock(&smu->mutex);
+
+       return ret;
+}
+
+
 static const struct amd_pm_funcs swsmu_pm_funcs = {
        /* export for sysfs */
        .set_fan_control_mode    = smu_pp_set_fan_control_mode,
index f76d1b8aeeccdd7155d7ad81d3fee7ade91d13b1..f82dd8a5c7737f2bca8e5e2463a8ecb4f26f562a 100644 (file)
@@ -142,6 +142,7 @@ static const struct cmn2asic_msg_mapping arcturus_message_map[SMU_MSG_MAX_COUNT]
        MSG_MAP(GmiPwrDnControl,                     PPSMC_MSG_GmiPwrDnControl,                 0),
        MSG_MAP(ReadSerialNumTop32,                  PPSMC_MSG_ReadSerialNumTop32,              1),
        MSG_MAP(ReadSerialNumBottom32,               PPSMC_MSG_ReadSerialNumBottom32,           1),
+       MSG_MAP(LightSBR,                            PPSMC_MSG_LightSBR,                        0),
 };
 
 static const struct cmn2asic_mapping arcturus_clk_map[SMU_CLK_COUNT] = {
@@ -2363,6 +2364,7 @@ static const struct pptable_funcs arcturus_ppt_funcs = {
        .deep_sleep_control = smu_v11_0_deep_sleep_control,
        .get_fan_parameters = arcturus_get_fan_parameters,
        .interrupt_work = smu_v11_0_interrupt_work,
+       .set_light_sbr = smu_v11_0_set_light_sbr,
 };
 
 void arcturus_set_ppt_funcs(struct smu_context *smu)
index 97acb04e1b5aae1ff7f67e0242c29cd263036b5f..635bd5da21333c46692fb3cbd59ad1c00bff5614 100644 (file)
@@ -1603,6 +1603,16 @@ int smu_v11_0_mode1_reset(struct smu_context *smu)
        return ret;
 }
 
+int smu_v11_0_set_light_sbr(struct smu_context *smu, bool enable)
+{
+       int ret = 0;
+
+       ret =  smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_LightSBR, enable ? 1 : 0, NULL);
+
+       return ret;
+}
+
+
 int smu_v11_0_get_dpm_ultimate_freq(struct smu_context *smu, enum smu_clk_type clk_type,
                                                 uint32_t *min, uint32_t *max)
 {