/* * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include #include #include #include #include #include #include #include #include namespace aidl { namespace android { namespace hardware { namespace thermal { namespace implementation { constexpr size_t kThrottlingSeverityCount = std::distance(::ndk::enum_range().begin(), ::ndk::enum_range().end()); using ThrottlingArray = std::array(kThrottlingSeverityCount)>; using CdevArray = std::array(kThrottlingSeverityCount)>; constexpr std::chrono::milliseconds kMinPollIntervalMs = std::chrono::milliseconds(2000); constexpr std::chrono::milliseconds kUeventPollTimeoutMs = std::chrono::milliseconds(300000); // Max number of time_in_state buckets is 20 in atoms // VendorSensorCoolingDeviceStats, VendorTempResidencyStats constexpr int kMaxStatsResidencyCount = 20; constexpr int kMaxStatsThresholdCount = kMaxStatsResidencyCount - 1; enum FormulaOption : uint32_t { COUNT_THRESHOLD = 0, WEIGHTED_AVG, MAXIMUM, MINIMUM, }; template struct ThresholdList { std::optional logging_name; std::vector thresholds; explicit ThresholdList(std::optional logging_name, std::vector thresholds) : logging_name(logging_name), thresholds(thresholds) {} ThresholdList() = default; ThresholdList(const ThresholdList &) = default; ThresholdList &operator=(const ThresholdList &) = default; ThresholdList(ThresholdList &&) = default; ThresholdList &operator=(ThresholdList &&) = default; ~ThresholdList() = default; }; template struct StatsInfo { // if bool, record all or none depending on flag // if set, check name present in set std::variant > record_by_default_threshold_all_or_name_set_; // map name to list of thresholds std::unordered_map > > record_by_threshold; void clear() { record_by_default_threshold_all_or_name_set_ = false; record_by_threshold.clear(); } }; struct StatsConfig { StatsInfo sensor_stats_info; StatsInfo cooling_device_request_info; void clear() { sensor_stats_info.clear(); cooling_device_request_info.clear(); } }; enum SensorFusionType : uint32_t { SENSOR = 0, ODPM, }; struct VirtualSensorInfo { std::vector linked_sensors; std::vector linked_sensors_type; std::vector coefficients; float offset; std::vector trigger_sensors; FormulaOption formula; }; struct VirtualPowerRailInfo { std::vector linked_power_rails; std::vector coefficients; float offset; FormulaOption formula; }; // The method when the ODPM power is lower than threshold enum ReleaseLogic : uint32_t { INCREASE = 0, // Increase throttling by step DECREASE, // Decrease throttling by step STEPWISE, // Support both increase and decrease logix RELEASE_TO_FLOOR, // Release throttling to floor directly NONE, }; struct BindedCdevInfo { CdevArray limit_info; ThrottlingArray power_thresholds; ReleaseLogic release_logic; ThrottlingArray cdev_weight_for_pid; CdevArray cdev_ceiling; int max_release_step; int max_throttle_step; CdevArray cdev_floor_with_power_link; std::string power_rail; // The flag for activate release logic when power is higher than power threshold bool high_power_check; // The flag for only triggering throttling until all power samples are collected bool throttling_with_power_link; }; struct ThrottlingInfo { ThrottlingArray k_po; ThrottlingArray k_pu; ThrottlingArray k_i; ThrottlingArray k_d; ThrottlingArray i_max; ThrottlingArray max_alloc_power; ThrottlingArray min_alloc_power; ThrottlingArray s_power; ThrottlingArray i_cutoff; float i_default; int tran_cycle; std::unordered_map excluded_power_info_map; std::unordered_map binded_cdev_info_map; }; struct SensorInfo { TemperatureType type; ThrottlingArray hot_thresholds; ThrottlingArray cold_thresholds; ThrottlingArray hot_hysteresis; ThrottlingArray cold_hysteresis; std::string temp_path; float vr_threshold; float multiplier; std::chrono::milliseconds polling_delay; std::chrono::milliseconds passive_delay; std::chrono::milliseconds time_resolution; bool send_cb; bool send_powerhint; bool is_watch; bool is_hidden; std::unique_ptr virtual_sensor_info; std::shared_ptr throttling_info; }; struct CdevInfo { CoolingType type; std::string read_path; std::string write_path; std::vector state2power; int max_state; }; struct PowerRailInfo { std::string rail; int power_sample_count; std::chrono::milliseconds power_sample_delay; std::unique_ptr virtual_power_rail_info; }; bool ParseThermalConfig(std::string_view config_path, Json::Value *config); bool ParseSensorInfo(const Json::Value &config, std::unordered_map *sensors_parsed); bool ParseCoolingDevice(const Json::Value &config, std::unordered_map *cooling_device_parsed); bool ParsePowerRailInfo(const Json::Value &config, std::unordered_map *power_rail_parsed); bool ParseStatsConfig(const Json::Value &config, const std::unordered_map &sensor_info_map_, const std::unordered_map &cooling_device_info_map_, StatsConfig *stats_config); } // namespace implementation } // namespace thermal } // namespace hardware } // namespace android } // namespace aidl