Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amd/pm: add smu ras driver framework

add functions to get smu ras driver

Signed-off-by: Gangliang Xie <ganglxie@amd.com>
Signed-off-by: Yang Wang <kevinyang.wang@amd.com>
Reviewed-by: Tao Zhou <tao.zhou1@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Gangliang Xie and committed by
Alex Deucher
f5346a17 77dbd7c0

+49
+1
drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h
··· 620 620 621 621 /* Disable/Enable uniras switch */ 622 622 bool uniras_enabled; 623 + const struct ras_smu_drv *ras_smu_drv; 623 624 }; 624 625 625 626 struct ras_fs_data {
+7
drivers/gpu/drm/amd/pm/amdgpu_dpm.c
··· 2122 2122 2123 2123 return ret; 2124 2124 } 2125 + 2126 + const struct ras_smu_drv *amdgpu_dpm_get_ras_smu_driver(struct amdgpu_device *adev) 2127 + { 2128 + void *pp_handle = adev->powerplay.pp_handle; 2129 + 2130 + return smu_get_ras_smu_driver(pp_handle); 2131 + }
+1
drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h
··· 612 612 bool amdgpu_dpm_reset_vcn_is_supported(struct amdgpu_device *adev); 613 613 bool amdgpu_dpm_is_temp_metrics_supported(struct amdgpu_device *adev, 614 614 enum smu_temp_metric_type type); 615 + const struct ras_smu_drv *amdgpu_dpm_get_ras_smu_driver(struct amdgpu_device *adev); 615 616 616 617 #endif
+11
drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
··· 2803 2803 .funcs = &smu_ip_funcs, 2804 2804 }; 2805 2805 2806 + const struct ras_smu_drv *smu_get_ras_smu_driver(void *handle) 2807 + { 2808 + struct smu_context *smu = (struct smu_context *)handle; 2809 + const struct ras_smu_drv *tmp = NULL; 2810 + int ret; 2811 + 2812 + ret = smu_get_ras_smu_drv(smu, &tmp); 2813 + 2814 + return ret ? NULL : tmp; 2815 + } 2816 + 2806 2817 static int smu_load_microcode(void *handle) 2807 2818 { 2808 2819 struct smu_context *smu = handle;
+7
drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h
··· 1531 1531 int (*ras_send_msg)(struct smu_context *smu, 1532 1532 enum smu_message_type msg, uint32_t param, uint32_t *read_arg); 1533 1533 1534 + 1535 + /** 1536 + * @get_ras_smu_drv: Get RAS smu driver interface 1537 + * Return: ras_smu_drv * 1538 + */ 1539 + int (*get_ras_smu_drv)(struct smu_context *smu, const struct ras_smu_drv **ras_smu_drv); 1534 1540 }; 1535 1541 1536 1542 typedef enum { ··· 1801 1795 int level); 1802 1796 ssize_t smu_get_pm_policy_info(struct smu_context *smu, 1803 1797 enum pp_pm_policy p_type, char *sysbuf); 1798 + const struct ras_smu_drv *smu_get_ras_smu_driver(void *handle); 1804 1799 1805 1800 int amdgpu_smu_ras_send_msg(struct amdgpu_device *adev, enum smu_message_type msg, 1806 1801 uint32_t param, uint32_t *readarg);
+21
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c
··· 3905 3905 == IP_VERSION(13, 0, 12)) ? &smu_v13_0_12_temp_funcs : NULL; 3906 3906 } 3907 3907 3908 + static int smu_v13_0_6_get_ras_smu_drv(struct smu_context *smu, const struct ras_smu_drv **ras_smu_drv) 3909 + { 3910 + if (!ras_smu_drv) 3911 + return -EINVAL; 3912 + 3913 + if (amdgpu_sriov_vf(smu->adev)) 3914 + return -EOPNOTSUPP; 3915 + 3916 + switch (amdgpu_ip_version(smu->adev, MP1_HWIP, 0)) { 3917 + case IP_VERSION(13, 0, 12): 3918 + *ras_smu_drv = &smu_v13_0_12_ras_smu_drv; 3919 + break; 3920 + default: 3921 + *ras_smu_drv = NULL; 3922 + break; 3923 + } 3924 + 3925 + return 0; 3926 + } 3927 + 3908 3928 static const struct pptable_funcs smu_v13_0_6_ppt_funcs = { 3909 3929 /* init dpm */ 3910 3930 .get_allowed_feature_mask = smu_v13_0_6_get_allowed_feature_mask, ··· 3984 3964 .dpm_reset_vcn = smu_v13_0_6_reset_vcn, 3985 3965 .post_init = smu_v13_0_6_post_init, 3986 3966 .ras_send_msg = smu_v13_0_6_ras_send_msg, 3967 + .get_ras_smu_drv = smu_v13_0_6_get_ras_smu_drv, 3987 3968 }; 3988 3969 3989 3970 void smu_v13_0_6_set_ppt_funcs(struct smu_context *smu)
+1
drivers/gpu/drm/amd/pm/swsmu/smu_internal.h
··· 100 100 #define smu_is_asic_wbrf_supported(smu) smu_ppt_funcs(is_asic_wbrf_supported, false, smu) 101 101 #define smu_enable_uclk_shadow(smu, enable) smu_ppt_funcs(enable_uclk_shadow, 0, smu, enable) 102 102 #define smu_set_wbrf_exclusion_ranges(smu, freq_band_range) smu_ppt_funcs(set_wbrf_exclusion_ranges, -EOPNOTSUPP, smu, freq_band_range) 103 + #define smu_get_ras_smu_drv(smu, ras_smu_drv) smu_ppt_funcs(get_ras_smu_drv, -EOPNOTSUPP, smu, ras_smu_drv) 103 104 104 105 #endif 105 106 #endif