int polaris10_fan_ctrl_start_smc_fan_control(struct pp_hwmgr *hwmgr) { int result; if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_ODFuzzyFanControlSupport)) { cgs_write_register(hwmgr->device, mmSMC_MSG_ARG_0, FAN_CONTROL_FUZZY); result = smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_StartFanControl); if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_FanSpeedInTableIsRPM)) hwmgr->hwmgr_func->set_max_fan_rpm_output(hwmgr, hwmgr->thermal_controller. advanceFanControlParameters.usMaxFanRPM); else hwmgr->hwmgr_func->set_max_fan_pwm_output(hwmgr, hwmgr->thermal_controller. advanceFanControlParameters.usMaxFanPWM); } else { cgs_write_register(hwmgr->device, mmSMC_MSG_ARG_0, FAN_CONTROL_TABLE); result = smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_StartFanControl); } if (!result && hwmgr->thermal_controller. advanceFanControlParameters.ucTargetTemperature) result = smum_send_msg_to_smc_with_parameter(hwmgr->smumgr, PPSMC_MSG_SetFanTemperatureTarget, hwmgr->thermal_controller. advanceFanControlParameters.ucTargetTemperature); return result; }
int polaris10_fan_ctrl_get_fan_speed_info(struct pp_hwmgr *hwmgr, struct phm_fan_speed_info *fan_speed_info) { if (hwmgr->thermal_controller.fanInfo.bNoFan) return 0; fan_speed_info->supports_percent_read = true; fan_speed_info->supports_percent_write = true; fan_speed_info->min_percent = 0; fan_speed_info->max_percent = 100; if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_FanSpeedInTableIsRPM) && hwmgr->thermal_controller.fanInfo.ucTachometerPulsesPerRevolution) { fan_speed_info->supports_rpm_read = true; fan_speed_info->supports_rpm_write = true; fan_speed_info->min_rpm = hwmgr->thermal_controller.fanInfo.ulMinRPM; fan_speed_info->max_rpm = hwmgr->thermal_controller.fanInfo.ulMaxRPM; } else { fan_speed_info->min_rpm = 0; fan_speed_info->max_rpm = 0; } return 0; }
static int rv_dpm_get_pp_table_entry_callback( struct pp_hwmgr *hwmgr, struct pp_hw_power_state *hw_ps, unsigned int index, const void *clock_info) { struct rv_power_state *rv_ps = cast_rv_ps(hw_ps); const ATOM_PPLIB_CZ_CLOCK_INFO *rv_clock_info = clock_info; struct phm_clock_voltage_dependency_table *table = hwmgr->dyn_state.vddc_dependency_on_sclk; uint8_t clock_info_index = rv_clock_info->index; if (clock_info_index > (uint8_t)(hwmgr->platform_descriptor.hardwareActivityPerformanceLevels - 1)) clock_info_index = (uint8_t)(hwmgr->platform_descriptor.hardwareActivityPerformanceLevels - 1); rv_ps->levels[index].engine_clock = table->entries[clock_info_index].clk; rv_ps->levels[index].vddc_index = (uint8_t)table->entries[clock_info_index].v; rv_ps->level = index + 1; if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_SclkDeepSleep)) { rv_ps->levels[index].ds_divider_index = 5; rv_ps->levels[index].ss_divider_index = 5; } return 0; }
/** * Set Fan Speed in percent. * @param hwmgr the address of the powerplay hardware manager. * @param speed is the percentage value (0% - 100%) to be set. * @exception Fails is the 100% setting appears to be 0. */ int iceland_fan_ctrl_set_fan_speed_percent(struct pp_hwmgr *hwmgr, uint32_t speed) { uint32_t duty100; uint32_t duty; uint64_t tmp64; if (hwmgr->thermal_controller.fanInfo.bNoFan) return -EINVAL; if (speed > 100) { pr_warning("Cannot set more than 100%% duty cycle. Set it to 100.\n"); speed = 100; } if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_MicrocodeFanControl)) iceland_fan_ctrl_stop_smc_fan_control(hwmgr); duty100 = PHM_READ_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC, CG_FDO_CTRL1, FMAX_DUTY100); if (0 == duty100) return -EINVAL; tmp64 = (uint64_t)speed * duty100; do_div(tmp64, 100); duty = (uint32_t)tmp64; PHM_WRITE_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC, CG_FDO_CTRL0, FDO_STATIC_DUTY, duty); return iceland_fan_ctrl_set_static_mode(hwmgr, FDO_PWM_MODE_STATIC); }
/** * Set Fan Speed in RPM. * @param hwmgr the address of the powerplay hardware manager. * @param speed is the percentage value (min - max) to be set. * @exception Fails is the speed not lie between min and max. */ int polaris10_fan_ctrl_set_fan_speed_rpm(struct pp_hwmgr *hwmgr, uint32_t speed) { uint32_t tach_period; uint32_t crystal_clock_freq; if (hwmgr->thermal_controller.fanInfo.bNoFan || (hwmgr->thermal_controller.fanInfo. ucTachometerPulsesPerRevolution == 0) || (speed < hwmgr->thermal_controller.fanInfo.ulMinRPM) || (speed > hwmgr->thermal_controller.fanInfo.ulMaxRPM)) return 0; if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_MicrocodeFanControl)) polaris10_fan_ctrl_stop_smc_fan_control(hwmgr); crystal_clock_freq = tonga_get_xclk(hwmgr); tach_period = 60 * crystal_clock_freq * 10000 / (8 * speed); PHM_WRITE_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC, CG_TACH_STATUS, TACH_PERIOD, tach_period); return polaris10_fan_ctrl_set_static_mode(hwmgr, FDO_PWM_MODE_STATIC); }
/** * Set Fan Speed in percent. * @param hwmgr the address of the powerplay hardware manager. * @param speed is the percentage value (0% - 100%) to be set. * @exception Fails is the 100% setting appears to be 0. */ int polaris10_fan_ctrl_set_fan_speed_percent(struct pp_hwmgr *hwmgr, uint32_t speed) { uint32_t duty100; uint32_t duty; uint64_t tmp64; if (hwmgr->thermal_controller.fanInfo.bNoFan) return 0; if (speed > 100) speed = 100; if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_MicrocodeFanControl)) polaris10_fan_ctrl_stop_smc_fan_control(hwmgr); duty100 = PHM_READ_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC, CG_FDO_CTRL1, FMAX_DUTY100); if (duty100 == 0) return -EINVAL; tmp64 = (uint64_t)speed * duty100; do_div(tmp64, 100); duty = (uint32_t)tmp64; PHM_WRITE_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC, CG_FDO_CTRL0, FDO_STATIC_DUTY, duty); return polaris10_fan_ctrl_set_static_mode(hwmgr, FDO_PWM_MODE_STATIC); }
static int smu7_powerup_samu(struct pp_hwmgr *hwmgr) { if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_SamuPowerGating)) return smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_SAMPowerON); return 0; }
int phm_notify_smc_display_config_after_ps_adjustment(struct pp_hwmgr *hwmgr) { PHM_FUNC_CHECK(hwmgr); if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_TablelessHardwareInterface)) if (NULL != hwmgr->hwmgr_func->notify_smc_display_config_after_ps_adjustment) hwmgr->hwmgr_func->notify_smc_display_config_after_ps_adjustment(hwmgr); return 0; }
int phm_disable_clock_power_gatings(struct pp_hwmgr *hwmgr) { PHM_FUNC_CHECK(hwmgr); if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_TablelessHardwareInterface)) { if (NULL != hwmgr->hwmgr_func->disable_clock_power_gating) return hwmgr->hwmgr_func->disable_clock_power_gating(hwmgr); } return 0; }
/** * Start the fan control on the SMC. * @param hwmgr the address of the powerplay hardware manager. * @param pInput the pointer to input data * @param pOutput the pointer to output data * @param pStorage the pointer to temporary storage * @param Result the last failure code * @return result from set temperature range routine */ int tf_iceland_thermal_start_smc_fan_control(struct pp_hwmgr *hwmgr, void *input, void *output, void *storage, int result) { /* If the fantable setup has failed we could have disabled PHM_PlatformCaps_MicrocodeFanControl even after this function was included in the table. * Make sure that we still think controlling the fan is OK. */ if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_MicrocodeFanControl)) { iceland_fan_ctrl_start_smc_fan_control(hwmgr); iceland_fan_ctrl_set_static_mode(hwmgr, FDO_PWM_MODE_STATIC); } return 0; }
int phm_display_configuration_changed(struct pp_hwmgr *hwmgr) { PHM_FUNC_CHECK(hwmgr); if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_TablelessHardwareInterface)) { if (NULL != hwmgr->hwmgr_func->display_config_changed) hwmgr->hwmgr_func->display_config_changed(hwmgr); } else return phm_dispatch_table(hwmgr, &hwmgr->display_configuration_changed, NULL, NULL); return 0; }
static int smu7_powerup_uvd(struct pp_hwmgr *hwmgr) { if (phm_cf_want_uvd_power_gating(hwmgr)) { if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_UVDDynamicPowerGating)) { return smum_send_msg_to_smc_with_parameter(hwmgr->smumgr, PPSMC_MSG_UVDPowerON, 1); } else { return smum_send_msg_to_smc_with_parameter(hwmgr->smumgr, PPSMC_MSG_UVDPowerON, 0); } } return 0; }
int phm_enable_dynamic_state_management(struct pp_hwmgr *hwmgr) { PHM_FUNC_CHECK(hwmgr); if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_TablelessHardwareInterface)) { if (NULL != hwmgr->hwmgr_func->dynamic_state_management_enable) return hwmgr->hwmgr_func->dynamic_state_management_enable(hwmgr); } else { return phm_dispatch_table(hwmgr, &(hwmgr->enable_dynamic_state_management), NULL, NULL); } return 0; }
int phm_power_down_asic(struct pp_hwmgr *hwmgr) { PHM_FUNC_CHECK(hwmgr); if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_TablelessHardwareInterface)) { if (NULL != hwmgr->hwmgr_func->power_off_asic) return hwmgr->hwmgr_func->power_off_asic(hwmgr); } else { return phm_dispatch_table(hwmgr, &(hwmgr->power_down_asic), NULL, NULL); } return 0; }
/** * Reset Fan Speed to default. * @param hwmgr the address of the powerplay hardware manager. * @exception Always succeeds. */ int iceland_fan_ctrl_reset_fan_speed_to_default(struct pp_hwmgr *hwmgr) { int result; if (hwmgr->thermal_controller.fanInfo.bNoFan) return 0; if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_MicrocodeFanControl)) { result = iceland_fan_ctrl_set_static_mode(hwmgr, FDO_PWM_MODE_STATIC); if (0 == result) result = iceland_fan_ctrl_start_smc_fan_control(hwmgr); } else result = iceland_fan_ctrl_set_default_mode(hwmgr); return result; }
int cz_dpm_powergate_vce(struct pp_hwmgr *hwmgr, bool bgate) { struct cz_hwmgr *cz_hwmgr = (struct cz_hwmgr *)(hwmgr->backend); if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_VCEPowerGating)) { if (cz_hwmgr->vce_power_gated != bgate) { if (bgate) { cgs_set_clockgating_state( hwmgr->device, AMD_IP_BLOCK_TYPE_VCE, AMD_CG_STATE_UNGATE); cgs_set_powergating_state( hwmgr->device, AMD_IP_BLOCK_TYPE_VCE, AMD_PG_STATE_GATE); cz_enable_disable_vce_dpm(hwmgr, false); cz_dpm_powerdown_vce(hwmgr); cz_hwmgr->vce_power_gated = true; } else { cz_dpm_powerup_vce(hwmgr); cz_hwmgr->vce_power_gated = false; cgs_set_powergating_state( hwmgr->device, AMD_IP_BLOCK_TYPE_VCE, AMD_CG_STATE_UNGATE); cgs_set_clockgating_state( hwmgr->device, AMD_IP_BLOCK_TYPE_VCE, AMD_PG_STATE_GATE); cz_dpm_update_vce_dpm(hwmgr); cz_enable_disable_vce_dpm(hwmgr, true); return 0; } } } else { cz_hwmgr->vce_power_gated = bgate; cz_dpm_update_vce_dpm(hwmgr); cz_enable_disable_vce_dpm(hwmgr, !bgate); return 0; } if (!cz_hwmgr->vce_power_gated) cz_dpm_update_vce_dpm(hwmgr); return 0; }
/** * Initializes the thermal controller subsystem. * * @param pHwMgr the address of the powerplay hardware manager. * @param pTemperatureRange the address of the structure holding the temperature range. * @exception PP_Result_Failed if any of the paramters is NULL, otherwise the return value from the dispatcher. */ int phm_start_thermal_controller(struct pp_hwmgr *hwmgr, struct PP_TemperatureRange *temperature_range) { struct PP_TemperatureRange range; if (temperature_range == NULL) { range.max = TEMP_RANGE_MAX; range.min = TEMP_RANGE_MIN; } else { range.max = temperature_range->max; range.min = temperature_range->min; } if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_ThermalController) && hwmgr->hwmgr_func->start_thermal_controller != NULL) return hwmgr->hwmgr_func->start_thermal_controller(hwmgr, &range); return 0; }
/** * Initializes the thermal controller subsystem. * * @param pHwMgr the address of the powerplay hardware manager. * @exception PP_Result_Failed if any of the paramters is NULL, otherwise the return value from the dispatcher. */ int phm_start_thermal_controller(struct pp_hwmgr *hwmgr) { int ret = 0; struct PP_TemperatureRange range = {TEMP_RANGE_MIN, TEMP_RANGE_MAX}; struct amdgpu_device *adev = hwmgr->adev; if (hwmgr->hwmgr_func->get_thermal_temperature_range) hwmgr->hwmgr_func->get_thermal_temperature_range( hwmgr, &range); if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_ThermalController) && hwmgr->hwmgr_func->start_thermal_controller != NULL) ret = hwmgr->hwmgr_func->start_thermal_controller(hwmgr, &range); adev->pm.dpm.thermal.min_temp = range.min; adev->pm.dpm.thermal.max_temp = range.max; return ret; }
int cz_enable_disable_uvd_dpm(struct pp_hwmgr *hwmgr, bool enable) { struct cz_hwmgr *cz_hwmgr = (struct cz_hwmgr *)(hwmgr->backend); uint32_t dpm_features = 0; if (enable && phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_UVDDPM)) { cz_hwmgr->dpm_flags |= DPMFlags_UVD_Enabled; dpm_features |= UVD_DPM_MASK; smum_send_msg_to_smc_with_parameter(hwmgr->smumgr, PPSMC_MSG_EnableAllSmuFeatures, dpm_features); } else { dpm_features |= UVD_DPM_MASK; cz_hwmgr->dpm_flags &= ~DPMFlags_UVD_Enabled; smum_send_msg_to_smc_with_parameter(hwmgr->smumgr, PPSMC_MSG_DisableAllSmuFeatures, dpm_features); } return 0; }
int phm_set_power_state(struct pp_hwmgr *hwmgr, const struct pp_hw_power_state *pcurrent_state, const struct pp_hw_power_state *pnew_power_state) { struct phm_set_power_state_input states; PHM_FUNC_CHECK(hwmgr); states.pcurrent_state = pcurrent_state; states.pnew_state = pnew_power_state; if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_TablelessHardwareInterface)) { if (NULL != hwmgr->hwmgr_func->power_state_set) return hwmgr->hwmgr_func->power_state_set(hwmgr, &states); } else { return phm_dispatch_table(hwmgr, &(hwmgr->set_power_state), &states, NULL); } return 0; }
int phm_enable_dynamic_state_management(struct pp_hwmgr *hwmgr) { int ret = 1; bool enabled; PHM_FUNC_CHECK(hwmgr); if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_TablelessHardwareInterface)) { if (NULL != hwmgr->hwmgr_func->dynamic_state_management_enable) ret = hwmgr->hwmgr_func->dynamic_state_management_enable(hwmgr); } else { ret = phm_dispatch_table(hwmgr, &(hwmgr->enable_dynamic_state_management), NULL, NULL); } enabled = ret == 0 ? true : false; cgs_notify_dpm_enabled(hwmgr->device, enabled); return ret; }
bool phm_cf_want_vce_power_gating(struct pp_hwmgr *hwmgr) { return phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_VCEPowerGating); }
/** * Set up the fan table to control the fan using the SMC. * @param hwmgr the address of the powerplay hardware manager. * @param pInput the pointer to input data * @param pOutput the pointer to output data * @param pStorage the pointer to temporary storage * @param Result the last failure code * @return result from set temperature range routine */ int tf_iceland_thermal_setup_fan_table(struct pp_hwmgr *hwmgr, void *input, void *output, void *storage, int result) { struct iceland_hwmgr *data = (struct iceland_hwmgr *)(hwmgr->backend); SMU71_Discrete_FanTable fan_table = { FDO_MODE_HARDWARE }; uint32_t duty100; uint32_t t_diff1, t_diff2, pwm_diff1, pwm_diff2; uint16_t fdo_min, slope1, slope2; uint32_t reference_clock; int res; uint64_t tmp64; if (!phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_MicrocodeFanControl)) return 0; if (0 == data->fan_table_start) { phm_cap_unset(hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_MicrocodeFanControl); return 0; } duty100 = PHM_READ_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC, CG_FDO_CTRL1, FMAX_DUTY100); if (0 == duty100) { phm_cap_unset(hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_MicrocodeFanControl); return 0; } tmp64 = hwmgr->thermal_controller.advanceFanControlParameters.usPWMMin * duty100; do_div(tmp64, 10000); fdo_min = (uint16_t)tmp64; t_diff1 = hwmgr->thermal_controller.advanceFanControlParameters.usTMed - hwmgr->thermal_controller.advanceFanControlParameters.usTMin; t_diff2 = hwmgr->thermal_controller.advanceFanControlParameters.usTHigh - hwmgr->thermal_controller.advanceFanControlParameters.usTMed; pwm_diff1 = hwmgr->thermal_controller.advanceFanControlParameters.usPWMMed - hwmgr->thermal_controller.advanceFanControlParameters.usPWMMin; pwm_diff2 = hwmgr->thermal_controller.advanceFanControlParameters.usPWMHigh - hwmgr->thermal_controller.advanceFanControlParameters.usPWMMed; slope1 = (uint16_t)((50 + ((16 * duty100 * pwm_diff1) / t_diff1)) / 100); slope2 = (uint16_t)((50 + ((16 * duty100 * pwm_diff2) / t_diff2)) / 100); fan_table.TempMin = cpu_to_be16((50 + hwmgr->thermal_controller.advanceFanControlParameters.usTMin) / 100); fan_table.TempMed = cpu_to_be16((50 + hwmgr->thermal_controller.advanceFanControlParameters.usTMed) / 100); fan_table.TempMax = cpu_to_be16((50 + hwmgr->thermal_controller.advanceFanControlParameters.usTMax) / 100); fan_table.Slope1 = cpu_to_be16(slope1); fan_table.Slope2 = cpu_to_be16(slope2); fan_table.FdoMin = cpu_to_be16(fdo_min); fan_table.HystDown = cpu_to_be16(hwmgr->thermal_controller.advanceFanControlParameters.ucTHyst); fan_table.HystUp = cpu_to_be16(1); fan_table.HystSlope = cpu_to_be16(1); fan_table.TempRespLim = cpu_to_be16(5); reference_clock = iceland_get_xclk(hwmgr); fan_table.RefreshPeriod = cpu_to_be32((hwmgr->thermal_controller.advanceFanControlParameters.ulCycleDelay * reference_clock) / 1600); fan_table.FdoMax = cpu_to_be16((uint16_t)duty100); fan_table.TempSrc = (uint8_t)PHM_READ_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC, CG_MULT_THERMAL_CTRL, TEMP_SEL); //fan_table.FanControl_GL_Flag = 1; res = iceland_copy_bytes_to_smc(hwmgr->smumgr, data->fan_table_start, (uint8_t *)&fan_table, (uint32_t)sizeof(fan_table), data->sram_end); /* TO DO FOR SOME DEVICE ID 0X692b, send this msg return invalid command. if (res == 0 && hwmgr->thermal_controller.advanceFanControlParameters.ucMinimumPWMLimit != 0) res = (0 == smum_send_msg_to_smc_with_parameter(hwmgr->smumgr, PPSMC_MSG_SetFanMinPwm, \ hwmgr->thermal_controller.advanceFanControlParameters.ucMinimumPWMLimit) ? 0 : -1); if (res == 0 && hwmgr->thermal_controller.advanceFanControlParameters.ulMinFanSCLKAcousticLimit != 0) res = (0 == smum_send_msg_to_smc_with_parameter(hwmgr->smumgr, PPSMC_MSG_SetFanSclkTarget, \ hwmgr->thermal_controller.advanceFanControlParameters.ulMinFanSCLKAcousticLimit) ? 0 : -1); if (0 != res) phm_cap_unset(hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_MicrocodeFanControl); */ return 0; }
void pem_init_feature_info(struct pp_eventmgr *eventmgr) { /* PowerPlay info */ eventmgr->ui_state_info[PP_PowerSource_AC].default_ui_lable = PP_StateUILabel_Performance; eventmgr->ui_state_info[PP_PowerSource_AC].current_ui_label = PP_StateUILabel_Performance; eventmgr->ui_state_info[PP_PowerSource_DC].default_ui_lable = PP_StateUILabel_Battery; eventmgr->ui_state_info[PP_PowerSource_DC].current_ui_label = PP_StateUILabel_Battery; if (phm_cap_enabled(eventmgr->platform_descriptor->platformCaps, PHM_PlatformCaps_PowerPlaySupport)) { eventmgr->features[PP_Feature_PowerPlay].supported = true; eventmgr->features[PP_Feature_PowerPlay].version = PEM_CURRENT_POWERPLAY_FEATURE_VERSION; eventmgr->features[PP_Feature_PowerPlay].enabled_default = true; eventmgr->features[PP_Feature_PowerPlay].enabled = true; } else { eventmgr->features[PP_Feature_PowerPlay].supported = false; eventmgr->features[PP_Feature_PowerPlay].enabled = false; eventmgr->features[PP_Feature_PowerPlay].enabled_default = false; } eventmgr->features[PP_Feature_Force3DClock].supported = true; eventmgr->features[PP_Feature_Force3DClock].enabled = false; eventmgr->features[PP_Feature_Force3DClock].enabled_default = false; eventmgr->features[PP_Feature_Force3DClock].version = 1; /* over drive*/ eventmgr->features[PP_Feature_User2DPerformance].version = 4; eventmgr->features[PP_Feature_User3DPerformance].version = 4; eventmgr->features[PP_Feature_OverdriveTest].version = 4; eventmgr->features[PP_Feature_OverDrive].version = 4; eventmgr->features[PP_Feature_OverDrive].enabled = false; eventmgr->features[PP_Feature_OverDrive].enabled_default = false; eventmgr->features[PP_Feature_User2DPerformance].supported = false; eventmgr->features[PP_Feature_User2DPerformance].enabled = false; eventmgr->features[PP_Feature_User2DPerformance].enabled_default = false; eventmgr->features[PP_Feature_User3DPerformance].supported = false; eventmgr->features[PP_Feature_User3DPerformance].enabled = false; eventmgr->features[PP_Feature_User3DPerformance].enabled_default = false; eventmgr->features[PP_Feature_OverdriveTest].supported = false; eventmgr->features[PP_Feature_OverdriveTest].enabled = false; eventmgr->features[PP_Feature_OverdriveTest].enabled_default = false; eventmgr->features[PP_Feature_OverDrive].supported = false; eventmgr->features[PP_Feature_PowerBudgetWaiver].enabled_default = false; eventmgr->features[PP_Feature_PowerBudgetWaiver].version = 1; eventmgr->features[PP_Feature_PowerBudgetWaiver].supported = false; eventmgr->features[PP_Feature_PowerBudgetWaiver].enabled = false; /* Multi UVD States support */ eventmgr->features[PP_Feature_MultiUVDState].supported = false; eventmgr->features[PP_Feature_MultiUVDState].enabled = false; eventmgr->features[PP_Feature_MultiUVDState].enabled_default = false; /* Dynamic UVD States support */ eventmgr->features[PP_Feature_DynamicUVDState].supported = false; eventmgr->features[PP_Feature_DynamicUVDState].enabled = false; eventmgr->features[PP_Feature_DynamicUVDState].enabled_default = false; /* VCE DPM support */ eventmgr->features[PP_Feature_VCEDPM].supported = false; eventmgr->features[PP_Feature_VCEDPM].enabled = false; eventmgr->features[PP_Feature_VCEDPM].enabled_default = false; /* ACP PowerGating support */ eventmgr->features[PP_Feature_ACP_POWERGATING].supported = false; eventmgr->features[PP_Feature_ACP_POWERGATING].enabled = false; eventmgr->features[PP_Feature_ACP_POWERGATING].enabled_default = false; /* PPM support */ eventmgr->features[PP_Feature_PPM].version = 1; eventmgr->features[PP_Feature_PPM].supported = false; eventmgr->features[PP_Feature_PPM].enabled = false; /* FFC support (enables fan and temp settings, Gemini needs temp settings) */ if (phm_cap_enabled(eventmgr->platform_descriptor->platformCaps, PHM_PlatformCaps_ODFuzzyFanControlSupport) || phm_cap_enabled(eventmgr->platform_descriptor->platformCaps, PHM_PlatformCaps_GeminiRegulatorFanControlSupport)) { eventmgr->features[PP_Feature_FFC].version = 1; eventmgr->features[PP_Feature_FFC].supported = true; eventmgr->features[PP_Feature_FFC].enabled = true; eventmgr->features[PP_Feature_FFC].enabled_default = true; } else { eventmgr->features[PP_Feature_FFC].supported = false; eventmgr->features[PP_Feature_FFC].enabled = false; eventmgr->features[PP_Feature_FFC].enabled_default = false; } eventmgr->features[PP_Feature_VariBright].supported = false; eventmgr->features[PP_Feature_VariBright].enabled = false; eventmgr->features[PP_Feature_VariBright].enabled_default = false; eventmgr->features[PP_Feature_BACO].supported = false; eventmgr->features[PP_Feature_BACO].supported = false; eventmgr->features[PP_Feature_BACO].enabled_default = false; /* PowerDown feature support */ eventmgr->features[PP_Feature_PowerDown].supported = false; eventmgr->features[PP_Feature_PowerDown].enabled = false; eventmgr->features[PP_Feature_PowerDown].enabled_default = false; eventmgr->features[PP_Feature_FPS].version = 1; eventmgr->features[PP_Feature_FPS].supported = false; eventmgr->features[PP_Feature_FPS].enabled_default = false; eventmgr->features[PP_Feature_FPS].enabled = false; eventmgr->features[PP_Feature_ViPG].version = 1; eventmgr->features[PP_Feature_ViPG].supported = false; eventmgr->features[PP_Feature_ViPG].enabled_default = false; eventmgr->features[PP_Feature_ViPG].enabled = false; }