/* Error in pplib. Provide default values. */
                        return true;
                }
-       } else if (adev->smu.funcs && adev->smu.funcs->get_clock_by_type) {
+       } else if (adev->smu.ppt_funcs && adev->smu.ppt_funcs->get_clock_by_type) {
                if (smu_get_clock_by_type(&adev->smu,
                                          dc_to_pp_clock_type(clk_type),
                                          &pp_clks)) {
                        validation_clks.memory_max_clock = 80000;
                        validation_clks.level = 0;
                }
-       } else if (adev->smu.funcs && adev->smu.funcs->get_max_high_clocks) {
+       } else if (adev->smu.ppt_funcs && adev->smu.ppt_funcs->get_max_high_clocks) {
                if (smu_get_max_high_clocks(&adev->smu, &validation_clks)) {
                        DRM_INFO("DM_PPLIB: Warning: using default validation clocks!\n");
                        validation_clks.engine_max_clock = 72000;
                ret = adev->powerplay.pp_funcs->display_clock_voltage_request(
                        adev->powerplay.pp_handle,
                        &pp_clock_request);
-       else if (adev->smu.funcs &&
-                adev->smu.funcs->display_clock_voltage_request)
+       else if (adev->smu.ppt_funcs &&
+                adev->smu.ppt_funcs->display_clock_voltage_request)
                ret = smu_display_clock_voltage_request(&adev->smu,
                                                        &pp_clock_request);
        if (ret)
                ret = adev->powerplay.pp_funcs->get_current_clocks(
                        adev->powerplay.pp_handle,
                        &pp_clk_info);
-       else if (adev->smu.funcs)
+       else if (adev->smu.ppt_funcs)
                ret = smu_get_current_clocks(&adev->smu, &pp_clk_info);
        if (ret)
                return false;
 
        if (pp_funcs && pp_funcs->notify_smu_enable_pwe)
                pp_funcs->notify_smu_enable_pwe(pp_handle);
-       else if (adev->smu.funcs)
+       else if (adev->smu.ppt_funcs)
                smu_notify_smu_enable_pwe(&adev->smu);
 }
 
        struct amdgpu_device *adev = ctx->driver_context;
        struct smu_context *smu = &adev->smu;
 
-       if (!smu->funcs)
+       if (!smu->ppt_funcs)
                return PP_SMU_RESULT_UNSUPPORTED;
 
-       /* 0: successful or smu.funcs->set_azalia_d3_pme = NULL;  1: fail */
+       /* 0: successful or smu.ppt_funcs->set_azalia_d3_pme = NULL;  1: fail */
        if (smu_set_azalia_d3_pme(smu))
                return PP_SMU_RESULT_FAIL;
 
        struct amdgpu_device *adev = ctx->driver_context;
        struct smu_context *smu = &adev->smu;
 
-       if (!smu->funcs)
+       if (!smu->ppt_funcs)
                return PP_SMU_RESULT_UNSUPPORTED;
 
-       /* 0: successful or smu.funcs->set_display_count = NULL;  1: fail */
+       /* 0: successful or smu.ppt_funcs->set_display_count = NULL;  1: fail */
        if (smu_set_display_count(smu, count))
                return PP_SMU_RESULT_FAIL;
 
        struct amdgpu_device *adev = ctx->driver_context;
        struct smu_context *smu = &adev->smu;
 
-       if (!smu->funcs)
+       if (!smu->ppt_funcs)
                return PP_SMU_RESULT_UNSUPPORTED;
 
-       /* 0: successful or smu.funcs->set_deep_sleep_dcefclk = NULL;1: fail */
+       /* 0: successful or smu.ppt_funcs->set_deep_sleep_dcefclk = NULL;1: fail */
        if (smu_set_deep_sleep_dcefclk(smu, mhz))
                return PP_SMU_RESULT_FAIL;
 
        struct smu_context *smu = &adev->smu;
        struct pp_display_clock_request clock_req;
 
-       if (!smu->funcs)
+       if (!smu->ppt_funcs)
                return PP_SMU_RESULT_UNSUPPORTED;
 
        clock_req.clock_type = amd_pp_dcef_clock;
        clock_req.clock_freq_in_khz = mhz * 1000;
 
-       /* 0: successful or smu.funcs->display_clock_voltage_request = NULL
+       /* 0: successful or smu.ppt_funcs->display_clock_voltage_request = NULL
         * 1: fail
         */
        if (smu_display_clock_voltage_request(smu, &clock_req))
        struct smu_context *smu = &adev->smu;
        struct pp_display_clock_request clock_req;
 
-       if (!smu->funcs)
+       if (!smu->ppt_funcs)
                return PP_SMU_RESULT_UNSUPPORTED;
 
        clock_req.clock_type = amd_pp_mem_clock;
        clock_req.clock_freq_in_khz = mhz * 1000;
 
-       /* 0: successful or smu.funcs->display_clock_voltage_request = NULL
+       /* 0: successful or smu.ppt_funcs->display_clock_voltage_request = NULL
         * 1: fail
         */
        if (smu_display_clock_voltage_request(smu, &clock_req))
        struct smu_context *smu = &adev->smu;
        struct pp_display_clock_request clock_req;
 
-       if (!smu->funcs)
+       if (!smu->ppt_funcs)
                return PP_SMU_RESULT_UNSUPPORTED;
 
        switch (clock_id) {
        }
        clock_req.clock_freq_in_khz = mhz * 1000;
 
-       /* 0: successful or smu.funcs->display_clock_voltage_request = NULL
+       /* 0: successful or smu.ppt_funcs->display_clock_voltage_request = NULL
         * 1: fail
         */
        if (smu_display_clock_voltage_request(smu, &clock_req))
        struct amdgpu_device *adev = ctx->driver_context;
        struct smu_context *smu = &adev->smu;
 
-       if (!smu->funcs)
+       if (!smu->ppt_funcs)
                return PP_SMU_RESULT_UNSUPPORTED;
 
-       if (!smu->funcs->get_max_sustainable_clocks_by_dc)
+       if (!smu->ppt_funcs->get_max_sustainable_clocks_by_dc)
                return PP_SMU_RESULT_UNSUPPORTED;
 
        if (!smu_get_max_sustainable_clocks_by_dc(smu, max_clocks))
                        wm_with_clock_ranges.wm_mcif_clocks_ranges;
        int32_t i;
 
-       if (!smu->funcs)
+       if (!smu->ppt_funcs)
                return PP_SMU_RESULT_UNSUPPORTED;
 
        wm_with_clock_ranges.num_wm_dmif_sets = ranges->num_reader_wm_sets;
 
 #include "smu_v12_0.h"
 #include "atom.h"
 #include "amd_pcie.h"
+#include "vega20_ppt.h"
+#include "arcturus_ppt.h"
+#include "navi10_ppt.h"
+#include "renoir_ppt.h"
 
 #undef __SMU_DUMMY_MAP
 #define __SMU_DUMMY_MAP(type)  #type
 
        switch (adev->asic_type) {
        case CHIP_VEGA20:
+               vega20_set_ppt_funcs(smu);
+               break;
        case CHIP_NAVI10:
        case CHIP_NAVI14:
        case CHIP_NAVI12:
+               navi10_set_ppt_funcs(smu);
+               break;
        case CHIP_ARCTURUS:
-               if (adev->pm.pp_feature & PP_OVERDRIVE_MASK)
-                       smu->od_enabled = true;
-               smu_v11_0_set_smu_funcs(smu);
+               arcturus_set_ppt_funcs(smu);
                break;
        case CHIP_RENOIR:
-               if (adev->pm.pp_feature & PP_OVERDRIVE_MASK)
-                       smu->od_enabled = true;
-               smu_v12_0_set_smu_funcs(smu);
+               renoir_set_ppt_funcs(smu);
                break;
        default:
                return -EINVAL;
        }
 
+       if (adev->pm.pp_feature & PP_OVERDRIVE_MASK)
+               smu->od_enabled = true;
+
        return 0;
 }
 
 
        if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP) {
                if (adev->asic_type < CHIP_NAVI10) {
-                       if (smu->funcs->load_microcode) {
-                               ret = smu->funcs->load_microcode(smu);
+                       if (smu->ppt_funcs->load_microcode) {
+                               ret = smu->ppt_funcs->load_microcode(smu);
                                if (ret)
                                        return ret;
                        }
                }
        }
 
-       if (smu->funcs->check_fw_status) {
-               ret = smu->funcs->check_fw_status(smu);
+       if (smu->ppt_funcs->check_fw_status) {
+               ret = smu->ppt_funcs->check_fw_status(smu);
                if (ret)
                        pr_err("SMC is not ready\n");
        }
 
        mutex_lock(&smu->mutex);
 
-       if (smu->funcs->set_deep_sleep_dcefclk)
-               smu->funcs->set_deep_sleep_dcefclk(smu,
+       if (smu->ppt_funcs->set_deep_sleep_dcefclk)
+               smu->ppt_funcs->set_deep_sleep_dcefclk(smu,
                                display_config->min_dcef_deep_sleep_set_clk / 100);
 
        for (index = 0; index < display_config->num_path_including_non_display; index++) {
 
        mutex_lock(&smu->mutex);
 
-       if (smu->funcs->load_microcode)
-               ret = smu->funcs->load_microcode(smu);
+       if (smu->ppt_funcs->load_microcode)
+               ret = smu->ppt_funcs->load_microcode(smu);
 
        mutex_unlock(&smu->mutex);
 
 
        mutex_lock(&smu->mutex);
 
-       if (smu->funcs->check_fw_status)
-               ret = smu->funcs->check_fw_status(smu);
+       if (smu->ppt_funcs->check_fw_status)
+               ret = smu->ppt_funcs->check_fw_status(smu);
 
        mutex_unlock(&smu->mutex);
 
 
        mutex_lock(&smu->mutex);
 
-       if (smu->funcs->set_gfx_cgpg)
-               ret = smu->funcs->set_gfx_cgpg(smu, enabled);
+       if (smu->ppt_funcs->set_gfx_cgpg)
+               ret = smu->ppt_funcs->set_gfx_cgpg(smu, enabled);
 
        mutex_unlock(&smu->mutex);
 
 
        mutex_lock(&smu->mutex);
 
-       if (smu->funcs->set_fan_speed_rpm)
-               ret = smu->funcs->set_fan_speed_rpm(smu, speed);
+       if (smu->ppt_funcs->set_fan_speed_rpm)
+               ret = smu->ppt_funcs->set_fan_speed_rpm(smu, speed);
 
        mutex_unlock(&smu->mutex);
 
 
        mutex_lock(&smu->mutex);
 
-       if (smu->funcs->set_power_limit)
-               ret = smu->funcs->set_power_limit(smu, limit);
+       if (smu->ppt_funcs->set_power_limit)
+               ret = smu->ppt_funcs->set_power_limit(smu, limit);
 
        mutex_unlock(&smu->mutex);
 
 
        mutex_lock(&smu->mutex);
 
-       if (smu->funcs->get_fan_control_mode)
-               ret = smu->funcs->get_fan_control_mode(smu);
+       if (smu->ppt_funcs->get_fan_control_mode)
+               ret = smu->ppt_funcs->get_fan_control_mode(smu);
 
        mutex_unlock(&smu->mutex);
 
 
        mutex_lock(&smu->mutex);
 
-       if (smu->funcs->set_fan_control_mode)
-               ret = smu->funcs->set_fan_control_mode(smu, value);
+       if (smu->ppt_funcs->set_fan_control_mode)
+               ret = smu->ppt_funcs->set_fan_control_mode(smu, value);
 
        mutex_unlock(&smu->mutex);
 
 
        mutex_lock(&smu->mutex);
 
-       if (smu->funcs->set_fan_speed_percent)
-               ret = smu->funcs->set_fan_speed_percent(smu, speed);
+       if (smu->ppt_funcs->set_fan_speed_percent)
+               ret = smu->ppt_funcs->set_fan_speed_percent(smu, speed);
 
        mutex_unlock(&smu->mutex);
 
 
        mutex_lock(&smu->mutex);
 
-       if (smu->funcs->set_deep_sleep_dcefclk)
-               ret = smu->funcs->set_deep_sleep_dcefclk(smu, clk);
+       if (smu->ppt_funcs->set_deep_sleep_dcefclk)
+               ret = smu->ppt_funcs->set_deep_sleep_dcefclk(smu, clk);
 
        mutex_unlock(&smu->mutex);
 
 
        mutex_lock(&smu->mutex);
 
-       if (smu->funcs->set_active_display_count)
-               ret = smu->funcs->set_active_display_count(smu, count);
+       if (smu->ppt_funcs->set_active_display_count)
+               ret = smu->ppt_funcs->set_active_display_count(smu, count);
 
        mutex_unlock(&smu->mutex);
 
 
        mutex_lock(&smu->mutex);
 
-       if (smu->funcs->get_clock_by_type)
-               ret = smu->funcs->get_clock_by_type(smu, type, clocks);
+       if (smu->ppt_funcs->get_clock_by_type)
+               ret = smu->ppt_funcs->get_clock_by_type(smu, type, clocks);
 
        mutex_unlock(&smu->mutex);
 
 
        mutex_lock(&smu->mutex);
 
-       if (smu->funcs->get_max_high_clocks)
-               ret = smu->funcs->get_max_high_clocks(smu, clocks);
+       if (smu->ppt_funcs->get_max_high_clocks)
+               ret = smu->ppt_funcs->get_max_high_clocks(smu, clocks);
 
        mutex_unlock(&smu->mutex);
 
 
        mutex_lock(&smu->mutex);
 
-       if (smu->funcs->display_clock_voltage_request)
-               ret = smu->funcs->display_clock_voltage_request(smu, clock_req);
+       if (smu->ppt_funcs->display_clock_voltage_request)
+               ret = smu->ppt_funcs->display_clock_voltage_request(smu, clock_req);
 
        mutex_unlock(&smu->mutex);
 
 
        mutex_lock(&smu->mutex);
 
-       if (smu->funcs->notify_smu_enable_pwe)
-               ret = smu->funcs->notify_smu_enable_pwe(smu);
+       if (smu->ppt_funcs->notify_smu_enable_pwe)
+               ret = smu->ppt_funcs->notify_smu_enable_pwe(smu);
 
        mutex_unlock(&smu->mutex);
 
 
        mutex_lock(&smu->mutex);
 
-       if (smu->funcs->set_xgmi_pstate)
-               ret = smu->funcs->set_xgmi_pstate(smu, pstate);
+       if (smu->ppt_funcs->set_xgmi_pstate)
+               ret = smu->ppt_funcs->set_xgmi_pstate(smu, pstate);
 
        mutex_unlock(&smu->mutex);
 
 
        mutex_lock(&smu->mutex);
 
-       if (smu->funcs->set_azalia_d3_pme)
-               ret = smu->funcs->set_azalia_d3_pme(smu);
+       if (smu->ppt_funcs->set_azalia_d3_pme)
+               ret = smu->ppt_funcs->set_azalia_d3_pme(smu);
 
        mutex_unlock(&smu->mutex);
 
 
        mutex_lock(&smu->mutex);
 
-       if (smu->funcs->baco_is_support)
-               ret = smu->funcs->baco_is_support(smu);
+       if (smu->ppt_funcs->baco_is_support)
+               ret = smu->ppt_funcs->baco_is_support(smu);
 
        mutex_unlock(&smu->mutex);
 
 
 int smu_baco_get_state(struct smu_context *smu, enum smu_baco_state *state)
 {
-       if (smu->funcs->baco_get_state)
+       if (smu->ppt_funcs->baco_get_state)
                return -EINVAL;
 
        mutex_lock(&smu->mutex);
-       *state = smu->funcs->baco_get_state(smu);
+       *state = smu->ppt_funcs->baco_get_state(smu);
        mutex_unlock(&smu->mutex);
 
        return 0;
 
        mutex_lock(&smu->mutex);
 
-       if (smu->funcs->baco_reset)
-               ret = smu->funcs->baco_reset(smu);
+       if (smu->ppt_funcs->baco_reset)
+               ret = smu->ppt_funcs->baco_reset(smu);
 
        mutex_unlock(&smu->mutex);
 
 
        mutex_lock(&smu->mutex);
 
-       if (smu->funcs->mode2_reset)
-               ret = smu->funcs->mode2_reset(smu);
+       if (smu->ppt_funcs->mode2_reset)
+               ret = smu->ppt_funcs->mode2_reset(smu);
 
        mutex_unlock(&smu->mutex);
 
 
        mutex_lock(&smu->mutex);
 
-       if (smu->funcs->get_max_sustainable_clocks_by_dc)
-               ret = smu->funcs->get_max_sustainable_clocks_by_dc(smu, max_clocks);
+       if (smu->ppt_funcs->get_max_sustainable_clocks_by_dc)
+               ret = smu->ppt_funcs->get_max_sustainable_clocks_by_dc(smu, max_clocks);
 
        mutex_unlock(&smu->mutex);
 
 
                *size = 4;
                break;
        default:
-               ret = smu_smc_read_sensor(smu, sensor, data, size);
+               ret = smu_v11_0_read_sensor(smu, sensor, data, size);
        }
        mutex_unlock(&smu->sensor_lock);
 
        .get_power_limit = arcturus_get_power_limit,
        .is_dpm_running = arcturus_is_dpm_running,
        .dpm_set_uvd_enable = arcturus_dpm_set_uvd_enable,
+       .init_microcode = smu_v11_0_init_microcode,
+       .load_microcode = smu_v11_0_load_microcode,
+       .init_smc_tables = smu_v11_0_init_smc_tables,
+       .fini_smc_tables = smu_v11_0_fini_smc_tables,
+       .init_power = smu_v11_0_init_power,
+       .fini_power = smu_v11_0_fini_power,
+       .check_fw_status = smu_v11_0_check_fw_status,
+       .setup_pptable = smu_v11_0_setup_pptable,
+       .get_vbios_bootup_values = smu_v11_0_get_vbios_bootup_values,
+       .get_clk_info_from_vbios = smu_v11_0_get_clk_info_from_vbios,
+       .check_pptable = smu_v11_0_check_pptable,
+       .parse_pptable = smu_v11_0_parse_pptable,
+       .populate_smc_tables = smu_v11_0_populate_smc_pptable,
+       .check_fw_version = smu_v11_0_check_fw_version,
+       .write_pptable = smu_v11_0_write_pptable,
+       .set_min_dcef_deep_sleep = smu_v11_0_set_min_dcef_deep_sleep,
+       .set_tool_table_location = smu_v11_0_set_tool_table_location,
+       .notify_memory_pool_location = smu_v11_0_notify_memory_pool_location,
+       .system_features_control = smu_v11_0_system_features_control,
+       .send_smc_msg = smu_v11_0_send_msg,
+       .send_smc_msg_with_param = smu_v11_0_send_msg_with_param,
+       .read_smc_arg = smu_v11_0_read_arg,
+       .init_display_count = smu_v11_0_init_display_count,
+       .set_allowed_mask = smu_v11_0_set_allowed_mask,
+       .get_enabled_mask = smu_v11_0_get_enabled_mask,
+       .notify_display_change = smu_v11_0_notify_display_change,
+       .set_power_limit = smu_v11_0_set_power_limit,
+       .get_current_clk_freq = smu_v11_0_get_current_clk_freq,
+       .init_max_sustainable_clocks = smu_v11_0_init_max_sustainable_clocks,
+       .start_thermal_control = smu_v11_0_start_thermal_control,
+       .stop_thermal_control = smu_v11_0_stop_thermal_control,
+       .set_deep_sleep_dcefclk = smu_v11_0_set_deep_sleep_dcefclk,
+       .display_clock_voltage_request = smu_v11_0_display_clock_voltage_request,
+       .get_fan_control_mode = smu_v11_0_get_fan_control_mode,
+       .set_fan_control_mode = smu_v11_0_set_fan_control_mode,
+       .set_fan_speed_percent = smu_v11_0_set_fan_speed_percent,
+       .set_fan_speed_rpm = smu_v11_0_set_fan_speed_rpm,
+       .set_xgmi_pstate = smu_v11_0_set_xgmi_pstate,
+       .gfx_off_control = smu_v11_0_gfx_off_control,
+       .register_irq_handler = smu_v11_0_register_irq_handler,
+       .set_azalia_d3_pme = smu_v11_0_set_azalia_d3_pme,
+       .get_max_sustainable_clocks_by_dc = smu_v11_0_get_max_sustainable_clocks_by_dc,
+       .baco_is_support= smu_v11_0_baco_is_support,
+       .baco_get_state = smu_v11_0_baco_get_state,
+       .baco_set_state = smu_v11_0_baco_set_state,
+       .baco_reset = smu_v11_0_baco_reset,
+       .get_dpm_ultimate_freq = smu_v11_0_get_dpm_ultimate_freq,
+       .set_soft_freq_limited_range = smu_v11_0_set_soft_freq_limited_range,
+       .override_pcie_parameters = smu_v11_0_override_pcie_parameters,
 };
 
 void arcturus_set_ppt_funcs(struct smu_context *smu)
 
        struct amdgpu_device            *adev;
        struct amdgpu_irq_src           *irq_source;
 
-       const struct smu_funcs          *funcs;
        const struct pptable_funcs      *ppt_funcs;
        struct mutex                    mutex;
        struct mutex                    sensor_lock;
        int (*set_df_cstate)(struct smu_context *smu, enum pp_df_cstate state);
        int (*update_pcie_parameters)(struct smu_context *smu, uint32_t pcie_gen_cap, uint32_t pcie_width_cap);
        int (*get_dpm_clock_table)(struct smu_context *smu, struct dpm_clocks *clock_table);
-};
-
-struct smu_funcs
-{
        int (*init_microcode)(struct smu_context *smu);
+       int (*load_microcode)(struct smu_context *smu);
        int (*init_smc_tables)(struct smu_context *smu);
        int (*fini_smc_tables)(struct smu_context *smu);
        int (*init_power)(struct smu_context *smu);
        int (*fini_power)(struct smu_context *smu);
-       int (*load_microcode)(struct smu_context *smu);
        int (*check_fw_status)(struct smu_context *smu);
        int (*setup_pptable)(struct smu_context *smu);
        int (*get_vbios_bootup_values)(struct smu_context *smu);
        int (*init_max_sustainable_clocks)(struct smu_context *smu);
        int (*start_thermal_control)(struct smu_context *smu);
        int (*stop_thermal_control)(struct smu_context *smu);
-       int (*read_sensor)(struct smu_context *smu, enum amd_pp_sensors sensor,
-                          void *data, uint32_t *size);
        int (*set_deep_sleep_dcefclk)(struct smu_context *smu, uint32_t clk);
        int (*set_active_display_count)(struct smu_context *smu, uint32_t count);
        int (*store_cc6_data)(struct smu_context *smu, uint32_t separation_time,
 
        BACO_SEQ_COUNT,
 };
 
-void smu_v11_0_set_smu_funcs(struct smu_context *smu);
+int smu_v11_0_init_microcode(struct smu_context *smu);
+
+int smu_v11_0_load_microcode(struct smu_context *smu);
+
+int smu_v11_0_init_smc_tables(struct smu_context *smu);
+
+int smu_v11_0_fini_smc_tables(struct smu_context *smu);
+
+int smu_v11_0_init_power(struct smu_context *smu);
+
+int smu_v11_0_fini_power(struct smu_context *smu);
+
+int smu_v11_0_check_fw_status(struct smu_context *smu);
+
+int smu_v11_0_setup_pptable(struct smu_context *smu);
+
+int smu_v11_0_get_vbios_bootup_values(struct smu_context *smu);
+
+int smu_v11_0_get_clk_info_from_vbios(struct smu_context *smu);
+
+int smu_v11_0_check_pptable(struct smu_context *smu);
+
+int smu_v11_0_parse_pptable(struct smu_context *smu);
+
+int smu_v11_0_populate_smc_pptable(struct smu_context *smu);
+
+int smu_v11_0_check_fw_version(struct smu_context *smu);
+
+int smu_v11_0_write_pptable(struct smu_context *smu);
+
+int smu_v11_0_set_min_dcef_deep_sleep(struct smu_context *smu);
+
+int smu_v11_0_set_tool_table_location(struct smu_context *smu);
+
+int smu_v11_0_notify_memory_pool_location(struct smu_context *smu);
+
+int smu_v11_0_system_features_control(struct smu_context *smu,
+                                            bool en);
+
+int smu_v11_0_send_msg(struct smu_context *smu, uint16_t msg);
+
+int
+smu_v11_0_send_msg_with_param(struct smu_context *smu, uint16_t msg,
+                             uint32_t param);
+
+int smu_v11_0_read_arg(struct smu_context *smu, uint32_t *arg);
+
+int smu_v11_0_init_display_count(struct smu_context *smu, uint32_t count);
+
+int smu_v11_0_set_allowed_mask(struct smu_context *smu);
+
+int smu_v11_0_get_enabled_mask(struct smu_context *smu,
+                                     uint32_t *feature_mask, uint32_t num);
+
+int smu_v11_0_notify_display_change(struct smu_context *smu);
+
+int smu_v11_0_set_power_limit(struct smu_context *smu, uint32_t n);
+
+int smu_v11_0_get_current_clk_freq(struct smu_context *smu,
+                                         enum smu_clk_type clk_id,
+                                         uint32_t *value);
+
+int smu_v11_0_init_max_sustainable_clocks(struct smu_context *smu);
+
+int smu_v11_0_start_thermal_control(struct smu_context *smu);
+
+int smu_v11_0_stop_thermal_control(struct smu_context *smu);
+
+int smu_v11_0_read_sensor(struct smu_context *smu,
+                                enum amd_pp_sensors sensor,
+                                void *data, uint32_t *size);
+
+int smu_v11_0_set_deep_sleep_dcefclk(struct smu_context *smu, uint32_t clk);
+
+int
+smu_v11_0_display_clock_voltage_request(struct smu_context *smu,
+                                       struct pp_display_clock_request
+                                       *clock_req);
+
+uint32_t
+smu_v11_0_get_fan_control_mode(struct smu_context *smu);
+
+int
+smu_v11_0_set_fan_control_mode(struct smu_context *smu,
+                              uint32_t mode);
+
+int
+smu_v11_0_set_fan_speed_percent(struct smu_context *smu, uint32_t speed);
+
+int smu_v11_0_set_fan_speed_rpm(struct smu_context *smu,
+                                      uint32_t speed);
+
+int smu_v11_0_set_xgmi_pstate(struct smu_context *smu,
+                                    uint32_t pstate);
+
+int smu_v11_0_gfx_off_control(struct smu_context *smu, bool enable);
+
+int smu_v11_0_register_irq_handler(struct smu_context *smu);
+
+int smu_v11_0_set_azalia_d3_pme(struct smu_context *smu);
+
+int smu_v11_0_get_max_sustainable_clocks_by_dc(struct smu_context *smu,
+               struct pp_smu_nv_clock_table *max_clocks);
+
+bool smu_v11_0_baco_is_support(struct smu_context *smu);
+
+enum smu_baco_state smu_v11_0_baco_get_state(struct smu_context *smu);
+
+int smu_v11_0_baco_set_state(struct smu_context *smu, enum smu_baco_state state);
+
+int smu_v11_0_baco_reset(struct smu_context *smu);
+
+int smu_v11_0_get_dpm_ultimate_freq(struct smu_context *smu, enum smu_clk_type clk_type,
+                                                uint32_t *min, uint32_t *max);
+
+int smu_v11_0_set_soft_freq_limited_range(struct smu_context *smu, enum smu_clk_type clk_type,
+                           uint32_t min, uint32_t max);
+
+int smu_v11_0_override_pcie_parameters(struct smu_context *smu);
 
 #endif
 
        int     map_to;
 };
 
-void smu_v12_0_set_smu_funcs(struct smu_context *smu);
+int smu_v12_0_send_msg_without_waiting(struct smu_context *smu,
+                                             uint16_t msg);
+
+int smu_v12_0_read_arg(struct smu_context *smu, uint32_t *arg);
+
+int smu_v12_0_wait_for_response(struct smu_context *smu);
+
+int smu_v12_0_send_msg(struct smu_context *smu, uint16_t msg);
+
+int
+smu_v12_0_send_msg_with_param(struct smu_context *smu, uint16_t msg,
+                             uint32_t param);
+
+int smu_v12_0_check_fw_status(struct smu_context *smu);
+
+int smu_v12_0_check_fw_version(struct smu_context *smu);
+
+int smu_v12_0_powergate_sdma(struct smu_context *smu, bool gate);
+
+int smu_v12_0_powergate_vcn(struct smu_context *smu, bool gate);
+
+int smu_v12_0_set_gfx_cgpg(struct smu_context *smu, bool enable);
+
+uint32_t smu_v12_0_get_gfxoff_status(struct smu_context *smu);
+
+int smu_v12_0_gfx_off_control(struct smu_context *smu, bool enable);
+
+int smu_v12_0_init_smc_tables(struct smu_context *smu);
+
+int smu_v12_0_fini_smc_tables(struct smu_context *smu);
+
+int smu_v12_0_populate_smc_tables(struct smu_context *smu);
+
+int smu_v12_0_get_dpm_ultimate_freq(struct smu_context *smu, enum smu_clk_type clk_type,
+                                                uint32_t *min, uint32_t *max);
+
+int smu_v12_0_mode2_reset(struct smu_context *smu);
+
+int smu_v12_0_set_soft_freq_limited_range(struct smu_context *smu, enum smu_clk_type clk_type,
+                           uint32_t min, uint32_t max);
 
 #endif
 
                clock_req.clock_type = amd_pp_dcef_clock;
                clock_req.clock_freq_in_khz = min_clocks.dcef_clock * 10;
 
-               if (smu->funcs->display_clock_voltage_request)
-                       ret = smu->funcs->display_clock_voltage_request(smu, &clock_req);
+               ret = smu_v11_0_display_clock_voltage_request(smu, &clock_req);
                if (!ret) {
                        if (smu_feature_is_supported(smu, SMU_FEATURE_DS_DCEFCLK_BIT)) {
                                ret = smu_send_smc_msg_with_param(smu,
                *size = 4;
                break;
        default:
-               ret = smu_smc_read_sensor(smu, sensor, data, size);
+               ret = smu_v11_0_read_sensor(smu, sensor, data, size);
        }
        mutex_unlock(&smu->sensor_lock);
 
        .display_disable_memory_clock_switch = navi10_display_disable_memory_clock_switch,
        .get_power_limit = navi10_get_power_limit,
        .update_pcie_parameters = navi10_update_pcie_parameters,
+       .init_microcode = smu_v11_0_init_microcode,
+       .load_microcode = smu_v11_0_load_microcode,
+       .init_smc_tables = smu_v11_0_init_smc_tables,
+       .fini_smc_tables = smu_v11_0_fini_smc_tables,
+       .init_power = smu_v11_0_init_power,
+       .fini_power = smu_v11_0_fini_power,
+       .check_fw_status = smu_v11_0_check_fw_status,
+       .setup_pptable = smu_v11_0_setup_pptable,
+       .get_vbios_bootup_values = smu_v11_0_get_vbios_bootup_values,
+       .get_clk_info_from_vbios = smu_v11_0_get_clk_info_from_vbios,
+       .check_pptable = smu_v11_0_check_pptable,
+       .parse_pptable = smu_v11_0_parse_pptable,
+       .populate_smc_tables = smu_v11_0_populate_smc_pptable,
+       .check_fw_version = smu_v11_0_check_fw_version,
+       .write_pptable = smu_v11_0_write_pptable,
+       .set_min_dcef_deep_sleep = smu_v11_0_set_min_dcef_deep_sleep,
+       .set_tool_table_location = smu_v11_0_set_tool_table_location,
+       .notify_memory_pool_location = smu_v11_0_notify_memory_pool_location,
+       .system_features_control = smu_v11_0_system_features_control,
+       .send_smc_msg = smu_v11_0_send_msg,
+       .send_smc_msg_with_param = smu_v11_0_send_msg_with_param,
+       .read_smc_arg = smu_v11_0_read_arg,
+       .init_display_count = smu_v11_0_init_display_count,
+       .set_allowed_mask = smu_v11_0_set_allowed_mask,
+       .get_enabled_mask = smu_v11_0_get_enabled_mask,
+       .notify_display_change = smu_v11_0_notify_display_change,
+       .set_power_limit = smu_v11_0_set_power_limit,
+       .get_current_clk_freq = smu_v11_0_get_current_clk_freq,
+       .init_max_sustainable_clocks = smu_v11_0_init_max_sustainable_clocks,
+       .start_thermal_control = smu_v11_0_start_thermal_control,
+       .stop_thermal_control = smu_v11_0_stop_thermal_control,
+       .set_deep_sleep_dcefclk = smu_v11_0_set_deep_sleep_dcefclk,
+       .display_clock_voltage_request = smu_v11_0_display_clock_voltage_request,
+       .get_fan_control_mode = smu_v11_0_get_fan_control_mode,
+       .set_fan_control_mode = smu_v11_0_set_fan_control_mode,
+       .set_fan_speed_percent = smu_v11_0_set_fan_speed_percent,
+       .set_fan_speed_rpm = smu_v11_0_set_fan_speed_rpm,
+       .set_xgmi_pstate = smu_v11_0_set_xgmi_pstate,
+       .gfx_off_control = smu_v11_0_gfx_off_control,
+       .register_irq_handler = smu_v11_0_register_irq_handler,
+       .set_azalia_d3_pme = smu_v11_0_set_azalia_d3_pme,
+       .get_max_sustainable_clocks_by_dc = smu_v11_0_get_max_sustainable_clocks_by_dc,
+       .baco_is_support= smu_v11_0_baco_is_support,
+       .baco_get_state = smu_v11_0_baco_get_state,
+       .baco_set_state = smu_v11_0_baco_set_state,
+       .baco_reset = smu_v11_0_baco_reset,
+       .get_dpm_ultimate_freq = smu_v11_0_get_dpm_ultimate_freq,
+       .set_soft_freq_limited_range = smu_v11_0_set_soft_freq_limited_range,
+       .override_pcie_parameters = smu_v11_0_override_pcie_parameters,
 };
 
 void navi10_set_ppt_funcs(struct smu_context *smu)
 
        .get_dpm_clock_table = renoir_get_dpm_clock_table,
        .set_watermarks_table = renoir_set_watermarks_table,
        .get_power_profile_mode = renoir_get_power_profile_mode,
+       .check_fw_status = smu_v12_0_check_fw_status,
+       .check_fw_version = smu_v12_0_check_fw_version,
+       .powergate_sdma = smu_v12_0_powergate_sdma,
+       .powergate_vcn = smu_v12_0_powergate_vcn,
+       .send_smc_msg = smu_v12_0_send_msg,
+       .send_smc_msg_with_param = smu_v12_0_send_msg_with_param,
+       .read_smc_arg = smu_v12_0_read_arg,
+       .set_gfx_cgpg = smu_v12_0_set_gfx_cgpg,
+       .gfx_off_control = smu_v12_0_gfx_off_control,
+       .init_smc_tables = smu_v12_0_init_smc_tables,
+       .fini_smc_tables = smu_v12_0_fini_smc_tables,
+       .populate_smc_tables = smu_v12_0_populate_smc_tables,
+       .get_dpm_ultimate_freq = smu_v12_0_get_dpm_ultimate_freq,
+       .mode2_reset = smu_v12_0_mode2_reset,
+       .set_soft_freq_limited_range = smu_v12_0_set_soft_freq_limited_range,
 };
 
 void renoir_set_ppt_funcs(struct smu_context *smu)
 
 #include "amdgpu_smu.h"
 
 #define smu_init_microcode(smu) \
-       ((smu)->funcs->init_microcode ? (smu)->funcs->init_microcode((smu)) : 0)
+       ((smu)->ppt_funcs->init_microcode ? (smu)->ppt_funcs->init_microcode((smu)) : 0)
 #define smu_init_smc_tables(smu) \
-       ((smu)->funcs->init_smc_tables ? (smu)->funcs->init_smc_tables((smu)) : 0)
+       ((smu)->ppt_funcs->init_smc_tables ? (smu)->ppt_funcs->init_smc_tables((smu)) : 0)
 #define smu_fini_smc_tables(smu) \
-       ((smu)->funcs->fini_smc_tables ? (smu)->funcs->fini_smc_tables((smu)) : 0)
+       ((smu)->ppt_funcs->fini_smc_tables ? (smu)->ppt_funcs->fini_smc_tables((smu)) : 0)
 #define smu_init_power(smu) \
-       ((smu)->funcs->init_power ? (smu)->funcs->init_power((smu)) : 0)
+       ((smu)->ppt_funcs->init_power ? (smu)->ppt_funcs->init_power((smu)) : 0)
 #define smu_fini_power(smu) \
-       ((smu)->funcs->fini_power ? (smu)->funcs->fini_power((smu)) : 0)
+       ((smu)->ppt_funcs->fini_power ? (smu)->ppt_funcs->fini_power((smu)) : 0)
 
 #define smu_setup_pptable(smu) \
-       ((smu)->funcs->setup_pptable ? (smu)->funcs->setup_pptable((smu)) : 0)
+       ((smu)->ppt_funcs->setup_pptable ? (smu)->ppt_funcs->setup_pptable((smu)) : 0)
 #define smu_powergate_sdma(smu, gate) \
-       ((smu)->funcs->powergate_sdma ? (smu)->funcs->powergate_sdma((smu), (gate)) : 0)
+       ((smu)->ppt_funcs->powergate_sdma ? (smu)->ppt_funcs->powergate_sdma((smu), (gate)) : 0)
 #define smu_powergate_vcn(smu, gate) \
-       ((smu)->funcs->powergate_vcn ? (smu)->funcs->powergate_vcn((smu), (gate)) : 0)
+       ((smu)->ppt_funcs->powergate_vcn ? (smu)->ppt_funcs->powergate_vcn((smu), (gate)) : 0)
 
 #define smu_get_vbios_bootup_values(smu) \
-       ((smu)->funcs->get_vbios_bootup_values ? (smu)->funcs->get_vbios_bootup_values((smu)) : 0)
+       ((smu)->ppt_funcs->get_vbios_bootup_values ? (smu)->ppt_funcs->get_vbios_bootup_values((smu)) : 0)
 #define smu_get_clk_info_from_vbios(smu) \
-       ((smu)->funcs->get_clk_info_from_vbios ? (smu)->funcs->get_clk_info_from_vbios((smu)) : 0)
+       ((smu)->ppt_funcs->get_clk_info_from_vbios ? (smu)->ppt_funcs->get_clk_info_from_vbios((smu)) : 0)
 #define smu_check_pptable(smu) \
-       ((smu)->funcs->check_pptable ? (smu)->funcs->check_pptable((smu)) : 0)
+       ((smu)->ppt_funcs->check_pptable ? (smu)->ppt_funcs->check_pptable((smu)) : 0)
 #define smu_parse_pptable(smu) \
-       ((smu)->funcs->parse_pptable ? (smu)->funcs->parse_pptable((smu)) : 0)
+       ((smu)->ppt_funcs->parse_pptable ? (smu)->ppt_funcs->parse_pptable((smu)) : 0)
 #define smu_populate_smc_tables(smu) \
-       ((smu)->funcs->populate_smc_tables ? (smu)->funcs->populate_smc_tables((smu)) : 0)
+       ((smu)->ppt_funcs->populate_smc_tables ? (smu)->ppt_funcs->populate_smc_tables((smu)) : 0)
 #define smu_check_fw_version(smu) \
-       ((smu)->funcs->check_fw_version ? (smu)->funcs->check_fw_version((smu)) : 0)
+       ((smu)->ppt_funcs->check_fw_version ? (smu)->ppt_funcs->check_fw_version((smu)) : 0)
 #define smu_write_pptable(smu) \
-       ((smu)->funcs->write_pptable ? (smu)->funcs->write_pptable((smu)) : 0)
+       ((smu)->ppt_funcs->write_pptable ? (smu)->ppt_funcs->write_pptable((smu)) : 0)
 #define smu_set_min_dcef_deep_sleep(smu) \
-       ((smu)->funcs->set_min_dcef_deep_sleep ? (smu)->funcs->set_min_dcef_deep_sleep((smu)) : 0)
+       ((smu)->ppt_funcs->set_min_dcef_deep_sleep ? (smu)->ppt_funcs->set_min_dcef_deep_sleep((smu)) : 0)
 #define smu_set_tool_table_location(smu) \
-       ((smu)->funcs->set_tool_table_location ? (smu)->funcs->set_tool_table_location((smu)) : 0)
+       ((smu)->ppt_funcs->set_tool_table_location ? (smu)->ppt_funcs->set_tool_table_location((smu)) : 0)
 #define smu_notify_memory_pool_location(smu) \
-       ((smu)->funcs->notify_memory_pool_location ? (smu)->funcs->notify_memory_pool_location((smu)) : 0)
+       ((smu)->ppt_funcs->notify_memory_pool_location ? (smu)->ppt_funcs->notify_memory_pool_location((smu)) : 0)
 #define smu_gfx_off_control(smu, enable) \
-       ((smu)->funcs->gfx_off_control ? (smu)->funcs->gfx_off_control((smu), (enable)) : 0)
+       ((smu)->ppt_funcs->gfx_off_control ? (smu)->ppt_funcs->gfx_off_control((smu), (enable)) : 0)
 
 #define smu_set_last_dcef_min_deep_sleep_clk(smu) \
-       ((smu)->funcs->set_last_dcef_min_deep_sleep_clk ? (smu)->funcs->set_last_dcef_min_deep_sleep_clk((smu)) : 0)
+       ((smu)->ppt_funcs->set_last_dcef_min_deep_sleep_clk ? (smu)->ppt_funcs->set_last_dcef_min_deep_sleep_clk((smu)) : 0)
 #define smu_system_features_control(smu, en) \
-       ((smu)->funcs->system_features_control ? (smu)->funcs->system_features_control((smu), (en)) : 0)
+       ((smu)->ppt_funcs->system_features_control ? (smu)->ppt_funcs->system_features_control((smu), (en)) : 0)
 #define smu_init_max_sustainable_clocks(smu) \
-       ((smu)->funcs->init_max_sustainable_clocks ? (smu)->funcs->init_max_sustainable_clocks((smu)) : 0)
+       ((smu)->ppt_funcs->init_max_sustainable_clocks ? (smu)->ppt_funcs->init_max_sustainable_clocks((smu)) : 0)
 #define smu_set_default_od_settings(smu, initialize) \
        ((smu)->ppt_funcs->set_default_od_settings ? (smu)->ppt_funcs->set_default_od_settings((smu), (initialize)) : 0)
 
 #define smu_send_smc_msg(smu, msg) \
-       ((smu)->funcs->send_smc_msg? (smu)->funcs->send_smc_msg((smu), (msg)) : 0)
+       ((smu)->ppt_funcs->send_smc_msg? (smu)->ppt_funcs->send_smc_msg((smu), (msg)) : 0)
 #define smu_send_smc_msg_with_param(smu, msg, param) \
-       ((smu)->funcs->send_smc_msg_with_param? (smu)->funcs->send_smc_msg_with_param((smu), (msg), (param)) : 0)
+       ((smu)->ppt_funcs->send_smc_msg_with_param? (smu)->ppt_funcs->send_smc_msg_with_param((smu), (msg), (param)) : 0)
 #define smu_read_smc_arg(smu, arg) \
-       ((smu)->funcs->read_smc_arg? (smu)->funcs->read_smc_arg((smu), (arg)) : 0)
+       ((smu)->ppt_funcs->read_smc_arg? (smu)->ppt_funcs->read_smc_arg((smu), (arg)) : 0)
 #define smu_alloc_dpm_context(smu) \
        ((smu)->ppt_funcs->alloc_dpm_context ? (smu)->ppt_funcs->alloc_dpm_context((smu)) : 0)
 #define smu_init_display_count(smu, count) \
-       ((smu)->funcs->init_display_count ? (smu)->funcs->init_display_count((smu), (count)) : 0)
+       ((smu)->ppt_funcs->init_display_count ? (smu)->ppt_funcs->init_display_count((smu), (count)) : 0)
 #define smu_feature_set_allowed_mask(smu) \
-       ((smu)->funcs->set_allowed_mask? (smu)->funcs->set_allowed_mask((smu)) : 0)
+       ((smu)->ppt_funcs->set_allowed_mask? (smu)->ppt_funcs->set_allowed_mask((smu)) : 0)
 #define smu_feature_get_enabled_mask(smu, mask, num) \
-       ((smu)->funcs->get_enabled_mask? (smu)->funcs->get_enabled_mask((smu), (mask), (num)) : 0)
+       ((smu)->ppt_funcs->get_enabled_mask? (smu)->ppt_funcs->get_enabled_mask((smu), (mask), (num)) : 0)
 #define smu_is_dpm_running(smu) \
        ((smu)->ppt_funcs->is_dpm_running ? (smu)->ppt_funcs->is_dpm_running((smu)) : 0)
 #define smu_notify_display_change(smu) \
-       ((smu)->funcs->notify_display_change? (smu)->funcs->notify_display_change((smu)) : 0)
+       ((smu)->ppt_funcs->notify_display_change? (smu)->ppt_funcs->notify_display_change((smu)) : 0)
 #define smu_store_powerplay_table(smu) \
        ((smu)->ppt_funcs->store_powerplay_table ? (smu)->ppt_funcs->store_powerplay_table((smu)) : 0)
 #define smu_check_powerplay_table(smu) \
        ((smu)->ppt_funcs->set_default_od8_settings ? (smu)->ppt_funcs->set_default_od8_settings((smu)) : 0)
 
 #define smu_get_current_clk_freq(smu, clk_id, value) \
-       ((smu)->funcs->get_current_clk_freq? (smu)->funcs->get_current_clk_freq((smu), (clk_id), (value)) : 0)
+       ((smu)->ppt_funcs->get_current_clk_freq? (smu)->ppt_funcs->get_current_clk_freq((smu), (clk_id), (value)) : 0)
 
 #define smu_tables_init(smu, tab) \
        ((smu)->ppt_funcs->tables_init ? (smu)->ppt_funcs->tables_init((smu), (tab)) : 0)
 #define smu_set_thermal_fan_table(smu) \
        ((smu)->ppt_funcs->set_thermal_fan_table ? (smu)->ppt_funcs->set_thermal_fan_table((smu)) : 0)
 #define smu_start_thermal_control(smu) \
-       ((smu)->funcs->start_thermal_control? (smu)->funcs->start_thermal_control((smu)) : 0)
+       ((smu)->ppt_funcs->start_thermal_control? (smu)->ppt_funcs->start_thermal_control((smu)) : 0)
 #define smu_stop_thermal_control(smu) \
-       ((smu)->funcs->stop_thermal_control? (smu)->funcs->stop_thermal_control((smu)) : 0)
+       ((smu)->ppt_funcs->stop_thermal_control? (smu)->ppt_funcs->stop_thermal_control((smu)) : 0)
 
 #define smu_smc_read_sensor(smu, sensor, data, size) \
-       ((smu)->funcs->read_sensor? (smu)->funcs->read_sensor((smu), (sensor), (data), (size)) : -EINVAL)
+       ((smu)->ppt_funcs->read_sensor? (smu)->ppt_funcs->read_sensor((smu), (sensor), (data), (size)) : -EINVAL)
 
 #define smu_pre_display_config_changed(smu) \
        ((smu)->ppt_funcs->pre_display_config_changed ? (smu)->ppt_funcs->pre_display_config_changed((smu)) : 0)
 
 
 #define smu_store_cc6_data(smu, st, cc6_dis, pst_dis, pst_sw_dis) \
-       ((smu)->funcs->store_cc6_data ? (smu)->funcs->store_cc6_data((smu), (st), (cc6_dis), (pst_dis), (pst_sw_dis)) : 0)
+       ((smu)->ppt_funcs->store_cc6_data ? (smu)->ppt_funcs->store_cc6_data((smu), (st), (cc6_dis), (pst_dis), (pst_sw_dis)) : 0)
 
 #define smu_get_dal_power_level(smu, clocks) \
-       ((smu)->funcs->get_dal_power_level ? (smu)->funcs->get_dal_power_level((smu), (clocks)) : 0)
+       ((smu)->ppt_funcs->get_dal_power_level ? (smu)->ppt_funcs->get_dal_power_level((smu), (clocks)) : 0)
 #define smu_get_perf_level(smu, designation, level) \
-       ((smu)->funcs->get_perf_level ? (smu)->funcs->get_perf_level((smu), (designation), (level)) : 0)
+       ((smu)->ppt_funcs->get_perf_level ? (smu)->ppt_funcs->get_perf_level((smu), (designation), (level)) : 0)
 #define smu_get_current_shallow_sleep_clocks(smu, clocks) \
-       ((smu)->funcs->get_current_shallow_sleep_clocks ? (smu)->funcs->get_current_shallow_sleep_clocks((smu), (clocks)) : 0)
+       ((smu)->ppt_funcs->get_current_shallow_sleep_clocks ? (smu)->ppt_funcs->get_current_shallow_sleep_clocks((smu), (clocks)) : 0)
 
 #define smu_dpm_set_uvd_enable(smu, enable) \
        ((smu)->ppt_funcs->dpm_set_uvd_enable ? (smu)->ppt_funcs->dpm_set_uvd_enable((smu), (enable)) : 0)
 #define smu_get_thermal_temperature_range(smu, range) \
        ((smu)->ppt_funcs->get_thermal_temperature_range? (smu)->ppt_funcs->get_thermal_temperature_range((smu), (range)) : 0)
 #define smu_register_irq_handler(smu) \
-       ((smu)->funcs->register_irq_handler ? (smu)->funcs->register_irq_handler(smu) : 0)
+       ((smu)->ppt_funcs->register_irq_handler ? (smu)->ppt_funcs->register_irq_handler(smu) : 0)
 
 #define smu_get_dpm_ultimate_freq(smu, param, min, max) \
-               ((smu)->funcs->get_dpm_ultimate_freq ? (smu)->funcs->get_dpm_ultimate_freq((smu), (param), (min), (max)) : 0)
+               ((smu)->ppt_funcs->get_dpm_ultimate_freq ? (smu)->ppt_funcs->get_dpm_ultimate_freq((smu), (param), (min), (max)) : 0)
 
 #define smu_asic_set_performance_level(smu, level) \
        ((smu)->ppt_funcs->set_performance_level? (smu)->ppt_funcs->set_performance_level((smu), (level)) : -EINVAL);
                ((smu)->ppt_funcs->get_dpm_clk_limited ? (smu)->ppt_funcs->get_dpm_clk_limited((smu), (clk_type), (dpm_level), (freq)) : -EINVAL)
 
 #define smu_set_soft_freq_limited_range(smu, clk_type, min, max) \
-               ((smu)->funcs->set_soft_freq_limited_range ? (smu)->funcs->set_soft_freq_limited_range((smu), (clk_type), (min), (max)) : -EINVAL)
+               ((smu)->ppt_funcs->set_soft_freq_limited_range ? (smu)->ppt_funcs->set_soft_freq_limited_range((smu), (clk_type), (min), (max)) : -EINVAL)
 
 #define smu_override_pcie_parameters(smu) \
-               ((smu)->funcs->override_pcie_parameters ? (smu)->funcs->override_pcie_parameters((smu)) : 0)
+               ((smu)->ppt_funcs->override_pcie_parameters ? (smu)->ppt_funcs->override_pcie_parameters((smu)) : 0)
 
 #define smu_update_pcie_parameters(smu, pcie_gen_cap, pcie_width_cap) \
                ((smu)->ppt_funcs->update_pcie_parameters ? (smu)->ppt_funcs->update_pcie_parameters((smu), (pcie_gen_cap), (pcie_width_cap)) : 0)
 
 #include "smu_v11_0.h"
 #include "soc15_common.h"
 #include "atom.h"
-#include "vega20_ppt.h"
-#include "arcturus_ppt.h"
-#include "navi10_ppt.h"
 #include "amd_pcie.h"
 
 #include "asic_reg/thm/thm_11_0_2_offset.h"
        return 0;
 }
 
-static int smu_v11_0_read_arg(struct smu_context *smu, uint32_t *arg)
+int smu_v11_0_read_arg(struct smu_context *smu, uint32_t *arg)
 {
        struct amdgpu_device *adev = smu->adev;
 
        return RREG32_SOC15(MP1, 0, mmMP1_SMN_C2PMSG_90) == 0x1 ? 0 : -EIO;
 }
 
-static int smu_v11_0_send_msg(struct smu_context *smu, uint16_t msg)
+int smu_v11_0_send_msg(struct smu_context *smu, uint16_t msg)
 {
        struct amdgpu_device *adev = smu->adev;
        int ret = 0, index = 0;
 
 }
 
-static int
+int
 smu_v11_0_send_msg_with_param(struct smu_context *smu, uint16_t msg,
                              uint32_t param)
 {
        return ret;
 }
 
-static int smu_v11_0_init_microcode(struct smu_context *smu)
+int smu_v11_0_init_microcode(struct smu_context *smu)
 {
        struct amdgpu_device *adev = smu->adev;
        const char *chip_name;
        return err;
 }
 
-static int smu_v11_0_load_microcode(struct smu_context *smu)
+int smu_v11_0_load_microcode(struct smu_context *smu)
 {
        struct amdgpu_device *adev = smu->adev;
        const uint32_t *src;
        return 0;
 }
 
-static int smu_v11_0_check_fw_status(struct smu_context *smu)
+int smu_v11_0_check_fw_status(struct smu_context *smu)
 {
        struct amdgpu_device *adev = smu->adev;
        uint32_t mp1_fw_flags;
        return -EIO;
 }
 
-static int smu_v11_0_check_fw_version(struct smu_context *smu)
+int smu_v11_0_check_fw_version(struct smu_context *smu)
 {
        uint32_t if_version = 0xff, smu_version = 0xff;
        uint16_t smu_major;
        return 0;
 }
 
-static int smu_v11_0_setup_pptable(struct smu_context *smu)
+int smu_v11_0_setup_pptable(struct smu_context *smu)
 {
        struct amdgpu_device *adev = smu->adev;
        const struct smc_firmware_header_v1_0 *hdr;
        return 0;
 }
 
-static int smu_v11_0_init_smc_tables(struct smu_context *smu)
+int smu_v11_0_init_smc_tables(struct smu_context *smu)
 {
        struct smu_table_context *smu_table = &smu->smu_table;
        struct smu_table *tables = NULL;
        return 0;
 }
 
-static int smu_v11_0_fini_smc_tables(struct smu_context *smu)
+int smu_v11_0_fini_smc_tables(struct smu_context *smu)
 {
        struct smu_table_context *smu_table = &smu->smu_table;
        int ret = 0;
        return 0;
 }
 
-static int smu_v11_0_init_power(struct smu_context *smu)
+int smu_v11_0_init_power(struct smu_context *smu)
 {
        struct smu_power_context *smu_power = &smu->smu_power;
 
        return 0;
 }
 
-static int smu_v11_0_fini_power(struct smu_context *smu)
+int smu_v11_0_fini_power(struct smu_context *smu)
 {
        struct smu_power_context *smu_power = &smu->smu_power;
 
        return 0;
 }
 
-static int smu_v11_0_get_clk_info_from_vbios(struct smu_context *smu)
+int smu_v11_0_get_clk_info_from_vbios(struct smu_context *smu)
 {
        int ret, index;
        struct amdgpu_device *adev = smu->adev;
        return 0;
 }
 
-static int smu_v11_0_notify_memory_pool_location(struct smu_context *smu)
+int smu_v11_0_notify_memory_pool_location(struct smu_context *smu)
 {
        struct smu_table_context *smu_table = &smu->smu_table;
        struct smu_table *memory_pool = &smu_table->memory_pool;
        return ret;
 }
 
-static int smu_v11_0_check_pptable(struct smu_context *smu)
+int smu_v11_0_check_pptable(struct smu_context *smu)
 {
        int ret;
 
        return ret;
 }
 
-static int smu_v11_0_parse_pptable(struct smu_context *smu)
+int smu_v11_0_parse_pptable(struct smu_context *smu)
 {
        int ret;
 
        return ret;
 }
 
-static int smu_v11_0_populate_smc_pptable(struct smu_context *smu)
+int smu_v11_0_populate_smc_pptable(struct smu_context *smu)
 {
        int ret;
 
        return ret;
 }
 
-static int smu_v11_0_write_pptable(struct smu_context *smu)
+int smu_v11_0_write_pptable(struct smu_context *smu)
 {
        struct smu_table_context *table_context = &smu->smu_table;
        int ret = 0;
        return ret;
 }
 
-static int smu_v11_0_set_deep_sleep_dcefclk(struct smu_context *smu, uint32_t clk)
+int smu_v11_0_set_deep_sleep_dcefclk(struct smu_context *smu, uint32_t clk)
 {
        int ret;
 
        return ret;
 }
 
-static int smu_v11_0_set_min_dcef_deep_sleep(struct smu_context *smu)
+int smu_v11_0_set_min_dcef_deep_sleep(struct smu_context *smu)
 {
        struct smu_table_context *table_context = &smu->smu_table;
 
        if (!table_context)
                return -EINVAL;
 
-       if (smu->funcs->set_deep_sleep_dcefclk)
-               return smu->funcs->set_deep_sleep_dcefclk(smu,
-                               table_context->boot_values.dcefclk / 100);
-
-       return 0;
+       return smu_v11_0_set_deep_sleep_dcefclk(smu, table_context->boot_values.dcefclk / 100);
 }
 
-static int smu_v11_0_set_tool_table_location(struct smu_context *smu)
+int smu_v11_0_set_tool_table_location(struct smu_context *smu)
 {
        int ret = 0;
        struct smu_table *tool_table = &smu->smu_table.tables[SMU_TABLE_PMSTATUSLOG];
        return ret;
 }
 
-static int smu_v11_0_init_display_count(struct smu_context *smu, uint32_t count)
+int smu_v11_0_init_display_count(struct smu_context *smu, uint32_t count)
 {
        int ret = 0;
 
 }
 
 
-static int smu_v11_0_set_allowed_mask(struct smu_context *smu)
+int smu_v11_0_set_allowed_mask(struct smu_context *smu)
 {
        struct smu_feature *feature = &smu->smu_feature;
        int ret = 0;
        return ret;
 }
 
-static int smu_v11_0_get_enabled_mask(struct smu_context *smu,
+int smu_v11_0_get_enabled_mask(struct smu_context *smu,
                                      uint32_t *feature_mask, uint32_t num)
 {
        uint32_t feature_mask_high = 0, feature_mask_low = 0;
        return ret;
 }
 
-static int smu_v11_0_system_features_control(struct smu_context *smu,
+int smu_v11_0_system_features_control(struct smu_context *smu,
                                             bool en)
 {
        struct smu_feature *feature = &smu->smu_feature;
        return ret;
 }
 
-static int smu_v11_0_notify_display_change(struct smu_context *smu)
+int smu_v11_0_notify_display_change(struct smu_context *smu)
 {
        int ret = 0;
 
        return ret;
 }
 
-static int smu_v11_0_init_max_sustainable_clocks(struct smu_context *smu)
+int smu_v11_0_init_max_sustainable_clocks(struct smu_context *smu)
 {
        struct smu_11_0_max_sustainable_clocks *max_sustainable_clocks;
        int ret = 0;
        return 0;
 }
 
-static int smu_v11_0_set_power_limit(struct smu_context *smu, uint32_t n)
+int smu_v11_0_set_power_limit(struct smu_context *smu, uint32_t n)
 {
        int ret = 0;
 
        return 0;
 }
 
-static int smu_v11_0_get_current_clk_freq(struct smu_context *smu,
+int smu_v11_0_get_current_clk_freq(struct smu_context *smu,
                                          enum smu_clk_type clk_id,
                                          uint32_t *value)
 {
        return 0;
 }
 
-static int smu_v11_0_start_thermal_control(struct smu_context *smu)
+int smu_v11_0_start_thermal_control(struct smu_context *smu)
 {
        int ret = 0;
        struct smu_temperature_range range;
        return ret;
 }
 
-static int smu_v11_0_stop_thermal_control(struct smu_context *smu)
+int smu_v11_0_stop_thermal_control(struct smu_context *smu)
 {
        struct amdgpu_device *adev = smu->adev;
 
 
 }
 
-static int smu_v11_0_read_sensor(struct smu_context *smu,
+int smu_v11_0_read_sensor(struct smu_context *smu,
                                 enum amd_pp_sensors sensor,
                                 void *data, uint32_t *size)
 {
        return ret;
 }
 
-static int
+int
 smu_v11_0_display_clock_voltage_request(struct smu_context *smu,
                                        struct pp_display_clock_request
                                        *clock_req)
        return ret;
 }
 
-static int smu_v11_0_gfx_off_control(struct smu_context *smu, bool enable)
+int smu_v11_0_gfx_off_control(struct smu_context *smu, bool enable)
 {
        int ret = 0;
        struct amdgpu_device *adev = smu->adev;
        return ret;
 }
 
-static uint32_t
+uint32_t
 smu_v11_0_get_fan_control_mode(struct smu_context *smu)
 {
        if (!smu_feature_is_enabled(smu, SMU_FEATURE_FAN_CONTROL_BIT))
        return 0;
 }
 
-static int
+int
 smu_v11_0_set_fan_speed_percent(struct smu_context *smu, uint32_t speed)
 {
        struct amdgpu_device *adev = smu->adev;
        return smu_v11_0_set_fan_static_mode(smu, FDO_PWM_MODE_STATIC);
 }
 
-static int
+int
 smu_v11_0_set_fan_control_mode(struct smu_context *smu,
                               uint32_t mode)
 {
        return ret;
 }
 
-static int smu_v11_0_set_fan_speed_rpm(struct smu_context *smu,
+int smu_v11_0_set_fan_speed_rpm(struct smu_context *smu,
                                       uint32_t speed)
 {
        struct amdgpu_device *adev = smu->adev;
 #define XGMI_STATE_D0 1
 #define XGMI_STATE_D3 0
 
-static int smu_v11_0_set_xgmi_pstate(struct smu_context *smu,
+int smu_v11_0_set_xgmi_pstate(struct smu_context *smu,
                                     uint32_t pstate)
 {
        int ret = 0;
        .process = smu_v11_0_irq_process,
 };
 
-static int smu_v11_0_register_irq_handler(struct smu_context *smu)
+int smu_v11_0_register_irq_handler(struct smu_context *smu)
 {
        struct amdgpu_device *adev = smu->adev;
        struct amdgpu_irq_src *irq_src = smu->irq_source;
        return ret;
 }
 
-static int smu_v11_0_get_max_sustainable_clocks_by_dc(struct smu_context *smu,
+int smu_v11_0_get_max_sustainable_clocks_by_dc(struct smu_context *smu,
                struct pp_smu_nv_clock_table *max_clocks)
 {
        struct smu_table_context *table_context = &smu->smu_table;
        return 0;
 }
 
-static int smu_v11_0_set_azalia_d3_pme(struct smu_context *smu)
+int smu_v11_0_set_azalia_d3_pme(struct smu_context *smu)
 {
        int ret = 0;
 
        return smu_send_smc_msg_with_param(smu, SMU_MSG_ArmD3, baco_seq);
 }
 
-static bool smu_v11_0_baco_is_support(struct smu_context *smu)
+bool smu_v11_0_baco_is_support(struct smu_context *smu)
 {
        struct amdgpu_device *adev = smu->adev;
        struct smu_baco_context *smu_baco = &smu->smu_baco;
        return false;
 }
 
-static enum smu_baco_state smu_v11_0_baco_get_state(struct smu_context *smu)
+enum smu_baco_state smu_v11_0_baco_get_state(struct smu_context *smu)
 {
        struct smu_baco_context *smu_baco = &smu->smu_baco;
        enum smu_baco_state baco_state;
        return baco_state;
 }
 
-static int smu_v11_0_baco_set_state(struct smu_context *smu, enum smu_baco_state state)
+int smu_v11_0_baco_set_state(struct smu_context *smu, enum smu_baco_state state)
 {
 
        struct smu_baco_context *smu_baco = &smu->smu_baco;
        return ret;
 }
 
-static int smu_v11_0_baco_reset(struct smu_context *smu)
+int smu_v11_0_baco_reset(struct smu_context *smu)
 {
        int ret = 0;
 
        return ret;
 }
 
-static int smu_v11_0_get_dpm_ultimate_freq(struct smu_context *smu, enum smu_clk_type clk_type,
+int smu_v11_0_get_dpm_ultimate_freq(struct smu_context *smu, enum smu_clk_type clk_type,
                                                 uint32_t *min, uint32_t *max)
 {
        int ret = 0, clk_id = 0;
        return ret;
 }
 
-static int smu_v11_0_set_soft_freq_limited_range(struct smu_context *smu, enum smu_clk_type clk_type,
+int smu_v11_0_set_soft_freq_limited_range(struct smu_context *smu, enum smu_clk_type clk_type,
                            uint32_t min, uint32_t max)
 {
        int ret = 0, clk_id = 0;
        return ret;
 }
 
-static int smu_v11_0_override_pcie_parameters(struct smu_context *smu)
+int smu_v11_0_override_pcie_parameters(struct smu_context *smu)
 {
        struct amdgpu_device *adev = smu->adev;
        uint32_t pcie_gen = 0, pcie_width = 0;
        return ret;
 
 }
-
-
-static const struct smu_funcs smu_v11_0_funcs = {
-       .init_microcode = smu_v11_0_init_microcode,
-       .load_microcode = smu_v11_0_load_microcode,
-       .check_fw_status = smu_v11_0_check_fw_status,
-       .check_fw_version = smu_v11_0_check_fw_version,
-       .send_smc_msg = smu_v11_0_send_msg,
-       .send_smc_msg_with_param = smu_v11_0_send_msg_with_param,
-       .read_smc_arg = smu_v11_0_read_arg,
-       .setup_pptable = smu_v11_0_setup_pptable,
-       .init_smc_tables = smu_v11_0_init_smc_tables,
-       .fini_smc_tables = smu_v11_0_fini_smc_tables,
-       .init_power = smu_v11_0_init_power,
-       .fini_power = smu_v11_0_fini_power,
-       .get_vbios_bootup_values = smu_v11_0_get_vbios_bootup_values,
-       .get_clk_info_from_vbios = smu_v11_0_get_clk_info_from_vbios,
-       .notify_memory_pool_location = smu_v11_0_notify_memory_pool_location,
-       .check_pptable = smu_v11_0_check_pptable,
-       .parse_pptable = smu_v11_0_parse_pptable,
-       .populate_smc_tables = smu_v11_0_populate_smc_pptable,
-       .write_pptable = smu_v11_0_write_pptable,
-       .set_min_dcef_deep_sleep = smu_v11_0_set_min_dcef_deep_sleep,
-       .set_tool_table_location = smu_v11_0_set_tool_table_location,
-       .init_display_count = smu_v11_0_init_display_count,
-       .set_allowed_mask = smu_v11_0_set_allowed_mask,
-       .get_enabled_mask = smu_v11_0_get_enabled_mask,
-       .system_features_control = smu_v11_0_system_features_control,
-       .notify_display_change = smu_v11_0_notify_display_change,
-       .set_power_limit = smu_v11_0_set_power_limit,
-       .get_current_clk_freq = smu_v11_0_get_current_clk_freq,
-       .init_max_sustainable_clocks = smu_v11_0_init_max_sustainable_clocks,
-       .start_thermal_control = smu_v11_0_start_thermal_control,
-       .stop_thermal_control = smu_v11_0_stop_thermal_control,
-       .read_sensor = smu_v11_0_read_sensor,
-       .set_deep_sleep_dcefclk = smu_v11_0_set_deep_sleep_dcefclk,
-       .display_clock_voltage_request = smu_v11_0_display_clock_voltage_request,
-       .get_fan_control_mode = smu_v11_0_get_fan_control_mode,
-       .set_fan_control_mode = smu_v11_0_set_fan_control_mode,
-       .set_fan_speed_percent = smu_v11_0_set_fan_speed_percent,
-       .set_fan_speed_rpm = smu_v11_0_set_fan_speed_rpm,
-       .set_xgmi_pstate = smu_v11_0_set_xgmi_pstate,
-       .gfx_off_control = smu_v11_0_gfx_off_control,
-       .register_irq_handler = smu_v11_0_register_irq_handler,
-       .set_azalia_d3_pme = smu_v11_0_set_azalia_d3_pme,
-       .get_max_sustainable_clocks_by_dc = smu_v11_0_get_max_sustainable_clocks_by_dc,
-       .baco_is_support = smu_v11_0_baco_is_support,
-       .baco_get_state = smu_v11_0_baco_get_state,
-       .baco_set_state = smu_v11_0_baco_set_state,
-       .baco_reset = smu_v11_0_baco_reset,
-       .get_dpm_ultimate_freq = smu_v11_0_get_dpm_ultimate_freq,
-       .set_soft_freq_limited_range = smu_v11_0_set_soft_freq_limited_range,
-       .override_pcie_parameters = smu_v11_0_override_pcie_parameters,
-};
-
-void smu_v11_0_set_smu_funcs(struct smu_context *smu)
-{
-       struct amdgpu_device *adev = smu->adev;
-
-       smu->funcs = &smu_v11_0_funcs;
-       switch (adev->asic_type) {
-       case CHIP_VEGA20:
-               vega20_set_ppt_funcs(smu);
-               break;
-       case CHIP_ARCTURUS:
-               arcturus_set_ppt_funcs(smu);
-               break;
-       case CHIP_NAVI10:
-       case CHIP_NAVI14:
-       case CHIP_NAVI12:
-               navi10_set_ppt_funcs(smu);
-               break;
-       default:
-               pr_warn("Unknown asic for smu11\n");
-       }
-}
 
 #include "smu_v12_0.h"
 #include "soc15_common.h"
 #include "atom.h"
-#include "renoir_ppt.h"
 
 #include "asic_reg/mp/mp_12_0_0_offset.h"
 #include "asic_reg/mp/mp_12_0_0_sh_mask.h"
 #define SMUIO_GFX_MISC_CNTL__PWR_GFXOFF_STATUS_MASK          0x00000006L
 #define SMUIO_GFX_MISC_CNTL__PWR_GFXOFF_STATUS__SHIFT        0x1
 
-static int smu_v12_0_send_msg_without_waiting(struct smu_context *smu,
+int smu_v12_0_send_msg_without_waiting(struct smu_context *smu,
                                              uint16_t msg)
 {
        struct amdgpu_device *adev = smu->adev;
        return 0;
 }
 
-static int smu_v12_0_read_arg(struct smu_context *smu, uint32_t *arg)
+int smu_v12_0_read_arg(struct smu_context *smu, uint32_t *arg)
 {
        struct amdgpu_device *adev = smu->adev;
 
        return 0;
 }
 
-static int smu_v12_0_wait_for_response(struct smu_context *smu)
+int smu_v12_0_wait_for_response(struct smu_context *smu)
 {
        struct amdgpu_device *adev = smu->adev;
        uint32_t cur_value, i;
        return RREG32_SOC15(MP1, 0, mmMP1_SMN_C2PMSG_90) == 0x1 ? 0 : -EIO;
 }
 
-static int smu_v12_0_send_msg(struct smu_context *smu, uint16_t msg)
+int smu_v12_0_send_msg(struct smu_context *smu, uint16_t msg)
 {
        struct amdgpu_device *adev = smu->adev;
        int ret = 0, index = 0;
 
 }
 
-static int
+int
 smu_v12_0_send_msg_with_param(struct smu_context *smu, uint16_t msg,
                              uint32_t param)
 {
        return ret;
 }
 
-static int smu_v12_0_check_fw_status(struct smu_context *smu)
+int smu_v12_0_check_fw_status(struct smu_context *smu)
 {
        struct amdgpu_device *adev = smu->adev;
        uint32_t mp1_fw_flags;
        return -EIO;
 }
 
-static int smu_v12_0_check_fw_version(struct smu_context *smu)
+int smu_v12_0_check_fw_version(struct smu_context *smu)
 {
        uint32_t if_version = 0xff, smu_version = 0xff;
        uint16_t smu_major;
        return ret;
 }
 
-static int smu_v12_0_powergate_sdma(struct smu_context *smu, bool gate)
+int smu_v12_0_powergate_sdma(struct smu_context *smu, bool gate)
 {
        if (!(smu->adev->flags & AMD_IS_APU))
                return 0;
                return smu_send_smc_msg(smu, SMU_MSG_PowerUpSdma);
 }
 
-static int smu_v12_0_powergate_vcn(struct smu_context *smu, bool gate)
+int smu_v12_0_powergate_vcn(struct smu_context *smu, bool gate)
 {
        if (!(smu->adev->flags & AMD_IS_APU))
                return 0;
                return smu_send_smc_msg(smu, SMU_MSG_PowerUpVcn);
 }
 
-static int smu_v12_0_set_gfx_cgpg(struct smu_context *smu, bool enable)
+int smu_v12_0_set_gfx_cgpg(struct smu_context *smu, bool enable)
 {
        if (!(smu->adev->pg_flags & AMD_PG_SUPPORT_GFX_PG))
                return 0;
  * Returns 2=Not in GFXOFF.
  * Returns 3=Transition into GFXOFF.
  */
-static uint32_t smu_v12_0_get_gfxoff_status(struct smu_context *smu)
+uint32_t smu_v12_0_get_gfxoff_status(struct smu_context *smu)
 {
        uint32_t reg;
        uint32_t gfxOff_Status = 0;
        return gfxOff_Status;
 }
 
-static int smu_v12_0_gfx_off_control(struct smu_context *smu, bool enable)
+int smu_v12_0_gfx_off_control(struct smu_context *smu, bool enable)
 {
        int ret = 0, timeout = 500;
 
        return ret;
 }
 
-static int smu_v12_0_init_smc_tables(struct smu_context *smu)
+int smu_v12_0_init_smc_tables(struct smu_context *smu)
 {
        struct smu_table_context *smu_table = &smu->smu_table;
        struct smu_table *tables = NULL;
        return smu_tables_init(smu, tables);
 }
 
-static int smu_v12_0_fini_smc_tables(struct smu_context *smu)
+int smu_v12_0_fini_smc_tables(struct smu_context *smu)
 {
        struct smu_table_context *smu_table = &smu->smu_table;
 
        return 0;
 }
 
-static int smu_v12_0_populate_smc_tables(struct smu_context *smu)
+int smu_v12_0_populate_smc_tables(struct smu_context *smu)
 {
        struct smu_table_context *smu_table = &smu->smu_table;
        struct smu_table *table = NULL;
        return smu_update_table(smu, SMU_TABLE_DPMCLOCKS, 0, smu_table->clocks_table, false);
 }
 
-static int smu_v12_0_get_dpm_ultimate_freq(struct smu_context *smu, enum smu_clk_type clk_type,
+int smu_v12_0_get_dpm_ultimate_freq(struct smu_context *smu, enum smu_clk_type clk_type,
                                                 uint32_t *min, uint32_t *max)
 {
        int ret = 0;
        return ret;
 }
 
-static int smu_v12_0_mode2_reset(struct smu_context *smu){
+int smu_v12_0_mode2_reset(struct smu_context *smu){
        return smu_v12_0_send_msg_with_param(smu, SMU_MSG_GfxDeviceDriverReset, SMU_RESET_MODE_2);
 }
 
-static int smu_v12_0_set_soft_freq_limited_range(struct smu_context *smu, enum smu_clk_type clk_type,
+int smu_v12_0_set_soft_freq_limited_range(struct smu_context *smu, enum smu_clk_type clk_type,
                            uint32_t min, uint32_t max)
 {
        int ret = 0;
 
        return ret;
 }
-
-static const struct smu_funcs smu_v12_0_funcs = {
-       .check_fw_status = smu_v12_0_check_fw_status,
-       .check_fw_version = smu_v12_0_check_fw_version,
-       .powergate_sdma = smu_v12_0_powergate_sdma,
-       .powergate_vcn = smu_v12_0_powergate_vcn,
-       .send_smc_msg = smu_v12_0_send_msg,
-       .send_smc_msg_with_param = smu_v12_0_send_msg_with_param,
-       .read_smc_arg = smu_v12_0_read_arg,
-       .set_gfx_cgpg = smu_v12_0_set_gfx_cgpg,
-       .gfx_off_control = smu_v12_0_gfx_off_control,
-       .init_smc_tables = smu_v12_0_init_smc_tables,
-       .fini_smc_tables = smu_v12_0_fini_smc_tables,
-       .populate_smc_tables = smu_v12_0_populate_smc_tables,
-       .get_dpm_ultimate_freq = smu_v12_0_get_dpm_ultimate_freq,
-       .mode2_reset = smu_v12_0_mode2_reset,
-       .set_soft_freq_limited_range = smu_v12_0_set_soft_freq_limited_range,
-};
-
-void smu_v12_0_set_smu_funcs(struct smu_context *smu)
-{
-       struct amdgpu_device *adev = smu->adev;
-
-       smu->funcs = &smu_v12_0_funcs;
-
-       switch (adev->asic_type) {
-       case CHIP_RENOIR:
-               renoir_set_ppt_funcs(smu);
-               break;
-       default:
-               pr_warn("Unknown asic for smu12\n");
-       }
-}
 
        if (smu_feature_is_supported(smu, SMU_FEATURE_DPM_DCEFCLK_BIT)) {
                clock_req.clock_type = amd_pp_dcef_clock;
                clock_req.clock_freq_in_khz = min_clocks.dcef_clock * 10;
-               if (!smu->funcs->display_clock_voltage_request(smu, &clock_req)) {
+               if (!smu_v11_0_display_clock_voltage_request(smu, &clock_req)) {
                        if (smu_feature_is_supported(smu, SMU_FEATURE_DS_DCEFCLK_BIT)) {
                                ret = smu_send_smc_msg_with_param(smu,
                                                                  SMU_MSG_SetMinDeepSleepDcefclk,
                *size = 4;
                break;
        default:
-               ret = smu_smc_read_sensor(smu, sensor, data, size);
+               ret = smu_v11_0_read_sensor(smu, sensor, data, size);
        }
        mutex_unlock(&smu->sensor_lock);
 
        .set_watermarks_table = vega20_set_watermarks_table,
        .get_thermal_temperature_range = vega20_get_thermal_temperature_range,
        .set_df_cstate = vega20_set_df_cstate,
-       .update_pcie_parameters = vega20_update_pcie_parameters
+       .update_pcie_parameters = vega20_update_pcie_parameters,
+       .init_microcode = smu_v11_0_init_microcode,
+       .load_microcode = smu_v11_0_load_microcode,
+       .init_smc_tables = smu_v11_0_init_smc_tables,
+       .fini_smc_tables = smu_v11_0_fini_smc_tables,
+       .init_power = smu_v11_0_init_power,
+       .fini_power = smu_v11_0_fini_power,
+       .check_fw_status = smu_v11_0_check_fw_status,
+       .setup_pptable = smu_v11_0_setup_pptable,
+       .get_vbios_bootup_values = smu_v11_0_get_vbios_bootup_values,
+       .get_clk_info_from_vbios = smu_v11_0_get_clk_info_from_vbios,
+       .check_pptable = smu_v11_0_check_pptable,
+       .parse_pptable = smu_v11_0_parse_pptable,
+       .populate_smc_tables = smu_v11_0_populate_smc_pptable,
+       .check_fw_version = smu_v11_0_check_fw_version,
+       .write_pptable = smu_v11_0_write_pptable,
+       .set_min_dcef_deep_sleep = smu_v11_0_set_min_dcef_deep_sleep,
+       .set_tool_table_location = smu_v11_0_set_tool_table_location,
+       .notify_memory_pool_location = smu_v11_0_notify_memory_pool_location,
+       .system_features_control = smu_v11_0_system_features_control,
+       .send_smc_msg = smu_v11_0_send_msg,
+       .send_smc_msg_with_param = smu_v11_0_send_msg_with_param,
+       .read_smc_arg = smu_v11_0_read_arg,
+       .init_display_count = smu_v11_0_init_display_count,
+       .set_allowed_mask = smu_v11_0_set_allowed_mask,
+       .get_enabled_mask = smu_v11_0_get_enabled_mask,
+       .notify_display_change = smu_v11_0_notify_display_change,
+       .set_power_limit = smu_v11_0_set_power_limit,
+       .get_current_clk_freq = smu_v11_0_get_current_clk_freq,
+       .init_max_sustainable_clocks = smu_v11_0_init_max_sustainable_clocks,
+       .start_thermal_control = smu_v11_0_start_thermal_control,
+       .stop_thermal_control = smu_v11_0_stop_thermal_control,
+       .set_deep_sleep_dcefclk = smu_v11_0_set_deep_sleep_dcefclk,
+       .display_clock_voltage_request = smu_v11_0_display_clock_voltage_request,
+       .get_fan_control_mode = smu_v11_0_get_fan_control_mode,
+       .set_fan_control_mode = smu_v11_0_set_fan_control_mode,
+       .set_fan_speed_percent = smu_v11_0_set_fan_speed_percent,
+       .set_fan_speed_rpm = smu_v11_0_set_fan_speed_rpm,
+       .set_xgmi_pstate = smu_v11_0_set_xgmi_pstate,
+       .gfx_off_control = smu_v11_0_gfx_off_control,
+       .register_irq_handler = smu_v11_0_register_irq_handler,
+       .set_azalia_d3_pme = smu_v11_0_set_azalia_d3_pme,
+       .get_max_sustainable_clocks_by_dc = smu_v11_0_get_max_sustainable_clocks_by_dc,
+       .baco_is_support= smu_v11_0_baco_is_support,
+       .baco_get_state = smu_v11_0_baco_get_state,
+       .baco_set_state = smu_v11_0_baco_set_state,
+       .baco_reset = smu_v11_0_baco_reset,
+       .get_dpm_ultimate_freq = smu_v11_0_get_dpm_ultimate_freq,
+       .set_soft_freq_limited_range = smu_v11_0_set_soft_freq_limited_range,
+       .override_pcie_parameters = smu_v11_0_override_pcie_parameters,
 };
 
 void vega20_set_ppt_funcs(struct smu_context *smu)