drm/amdgpu: Send Message to SMU on aldebaran passthrough for sbr handling
authorsashank saye <sashank.saye@amd.com>
Fri, 17 Dec 2021 12:50:09 +0000 (07:50 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 28 Dec 2021 21:03:19 +0000 (16:03 -0500)
For Aldebaran chip passthrough case we need to intimate SMU
about special handling for SBR.On older chips we send
LightSBR to SMU, enabling the same for Aldebaran. Slight
difference, compared to previous chips, is on Aldebaran, SMU
would do a heavy reset on SBR. Hence, the word Heavy
instead of Light SBR is used for SMU to differentiate.

Reviewed by: Shaoyun.liu <Shaoyun.liu@amd.com>
Signed-off-by: sashank saye <sashank.saye@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
drivers/gpu/drm/amd/pm/inc/aldebaran_ppsmc.h
drivers/gpu/drm/amd/pm/inc/amdgpu_smu.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
drivers/gpu/drm/amd/pm/swsmu/smu13/aldebaran_ppt.c

index ce820ee2e2e6f9cac7a2fe04f41e180dc7fcc7c5..5250c5bbbd76c3a930317c06cfec7b4b1d1112d7 100644 (file)
@@ -2619,11 +2619,10 @@ static int amdgpu_device_ip_late_init(struct amdgpu_device *adev)
        if (r)
                DRM_ERROR("enable mgpu fan boost failed (%d).\n", r);
 
-       /* For XGMI + passthrough configuration on arcturus, enable light SBR */
-       if (adev->asic_type == CHIP_ARCTURUS &&
-           amdgpu_passthrough(adev) &&
-           adev->gmc.xgmi.num_physical_nodes > 1)
-               smu_set_light_sbr(&adev->smu, true);
+       /* For passthrough configuration on arcturus and aldebaran, enable special handling SBR */
+       if (amdgpu_passthrough(adev) && ((adev->asic_type == CHIP_ARCTURUS && adev->gmc.xgmi.num_physical_nodes > 1)||
+                              adev->asic_type == CHIP_ALDEBARAN ))
+               smu_handle_passthrough_sbr(&adev->smu, true);
 
        if (adev->gmc.xgmi.num_physical_nodes > 1) {
                mutex_lock(&mgpu_info.mutex);
index 35fa0d8e92dd3a67e0ae540386410195b3ede64f..ab66a4b9e438191c3eb6284c155becd538058072 100644 (file)
 
 #define PPSMC_MSG_GfxDriverResetRecovery       0x42
 #define PPSMC_MSG_BoardPowerCalibration        0x43
-#define PPSMC_Message_Count                    0x44
+#define PPSMC_MSG_HeavySBR                      0x45
+#define PPSMC_Message_Count                    0x46
+
 
 //PPSMC Reset Types
 #define PPSMC_RESET_TYPE_WARM_RESET              0x00
index 2b9b9a7ba97a2d954612a4531f8b9ac13087b7a7..ba7565bc8104904f4d21ef2c82ed4ebd735b9508 100644 (file)
@@ -1257,9 +1257,9 @@ struct pptable_funcs {
        int (*set_fine_grain_gfx_freq_parameters)(struct smu_context *smu);
 
        /**
-        * @set_light_sbr:  Set light sbr mode for the SMU.
+        * @smu_handle_passthrough_sbr:  Send message to SMU about special handling for SBR.
         */
-       int (*set_light_sbr)(struct smu_context *smu, bool enable);
+       int (*smu_handle_passthrough_sbr)(struct smu_context *smu, bool enable);
 
        /**
         * @wait_for_event:  Wait for events from SMU.
@@ -1415,7 +1415,7 @@ int smu_allow_xgmi_power_down(struct smu_context *smu, bool en);
 
 int smu_get_status_gfxoff(struct amdgpu_device *adev, uint32_t *value);
 
-int smu_set_light_sbr(struct smu_context *smu, bool enable);
+int smu_handle_passthrough_sbr(struct smu_context *smu, bool enable);
 
 int smu_wait_for_event(struct amdgpu_device *adev, enum smu_event_type event,
                       uint64_t event_arg);
index 18b862a90fbe5c8857686b35acc0616f8c27aa87..ff8a0bcbd2907f37c0a1ce066af06ef0d5982f43 100644 (file)
        __SMU_DUMMY_MAP(BoardPowerCalibration),   \
        __SMU_DUMMY_MAP(RequestGfxclk),           \
        __SMU_DUMMY_MAP(ForceGfxVid),             \
-       __SMU_DUMMY_MAP(UnforceGfxVid),
+       __SMU_DUMMY_MAP(UnforceGfxVid),           \
+       __SMU_DUMMY_MAP(HeavySBR),
 
 #undef __SMU_DUMMY_MAP
 #define __SMU_DUMMY_MAP(type)  SMU_MSG_##type
index 2d422e6a9feb9d23b631170e9eb186416f643cb1..acb3be29209684f7d67c5d9ee4704a3a0e931052 100644 (file)
@@ -312,7 +312,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);
+int smu_v11_0_handle_passthrough_sbr(struct smu_context *smu, bool enable);
 
 int smu_v11_0_restore_user_od_settings(struct smu_context *smu);
 
index af98fa140d83c02caaf81ca2da93c4b198a21b04..76f95e8ada4c43f02bacce50f6e6b200b5b5549b 100644 (file)
@@ -3058,13 +3058,13 @@ static int smu_gfx_state_change_set(void *handle,
        return ret;
 }
 
-int smu_set_light_sbr(struct smu_context *smu, bool enable)
+int smu_handle_passthrough_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);
+       if (smu->ppt_funcs->smu_handle_passthrough_sbr)
+               ret = smu->ppt_funcs->smu_handle_passthrough_sbr(smu, enable);
        mutex_unlock(&smu->mutex);
 
        return ret;
index 58bc387fb2795bc4f59c1b47409e56df5150423a..505d2fb94fd936052937b6e45cb938bce2791b9d 100644 (file)
@@ -2472,7 +2472,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,
+       .smu_handle_passthrough_sbr = smu_v11_0_handle_passthrough_sbr,
        .set_mp1_state = smu_cmn_set_mp1_state,
 };
 
index 28b7c0562b99ec7ea6a4a013cd39efea511a1955..4e9e2cf398591f7dba0f4cc4180162ccc5303138 100644 (file)
@@ -1724,7 +1724,7 @@ 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 smu_v11_0_handle_passthrough_sbr(struct smu_context *smu, bool enable)
 {
        int ret = 0;
 
index 7433a051e795d2a28f08d6d89a3f37f7790156fb..0e60d63ba94f1829589eba8cd1096775df86c81a 100644 (file)
@@ -141,6 +141,7 @@ static const struct cmn2asic_msg_mapping aldebaran_message_map[SMU_MSG_MAX_COUNT
        MSG_MAP(SetUclkDpmMode,                      PPSMC_MSG_SetUclkDpmMode,                  0),
        MSG_MAP(GfxDriverResetRecovery,              PPSMC_MSG_GfxDriverResetRecovery,          0),
        MSG_MAP(BoardPowerCalibration,               PPSMC_MSG_BoardPowerCalibration,           0),
+       MSG_MAP(HeavySBR,                            PPSMC_MSG_HeavySBR,                        0),
 };
 
 static const struct cmn2asic_mapping aldebaran_clk_map[SMU_CLK_COUNT] = {
@@ -1912,6 +1913,14 @@ out:
        return ret;
 }
 
+static int aldebaran_smu_handle_passthrough_sbr(struct smu_context *smu, bool enable)
+{
+       int ret = 0;
+       ret =  smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_HeavySBR, enable ? 1 : 0, NULL);
+
+       return ret;
+}
+
 static bool aldebaran_is_mode1_reset_supported(struct smu_context *smu)
 {
 #if 0
@@ -2021,6 +2030,7 @@ static const struct pptable_funcs aldebaran_ppt_funcs = {
        .get_gpu_metrics = aldebaran_get_gpu_metrics,
        .mode1_reset_is_support = aldebaran_is_mode1_reset_supported,
        .mode2_reset_is_support = aldebaran_is_mode2_reset_supported,
+       .smu_handle_passthrough_sbr = aldebaran_smu_handle_passthrough_sbr,
        .mode1_reset = aldebaran_mode1_reset,
        .set_mp1_state = aldebaran_set_mp1_state,
        .mode2_reset = aldebaran_mode2_reset,