Merge "Migrate battery mitigation to Thermal AIDL" into udc-dev
diff --git a/edgetpu/sepolicy/appdomain.te b/edgetpu/sepolicy/appdomain.te
index 37cb1db..804a202 100644
--- a/edgetpu/sepolicy/appdomain.te
+++ b/edgetpu/sepolicy/appdomain.te
@@ -1,2 +1,5 @@
 # Allow apps to read tflite Darwinn delegate properties
 get_prop(appdomain, vendor_tflite_delegate_prop)
+
+# Allow apps to read hetero runtime properties
+get_prop(appdomain, vendor_hetero_runtime_prop)
diff --git a/edgetpu/sepolicy/edgetpu_dba_service.te b/edgetpu/sepolicy/edgetpu_dba_service.te
index dca4ac4..ce1f200 100644
--- a/edgetpu/sepolicy/edgetpu_dba_service.te
+++ b/edgetpu/sepolicy/edgetpu_dba_service.te
@@ -39,3 +39,5 @@
 
 # Allow EdgeTPU DBA service to read tflite Darwinn delegate properties
 get_prop(edgetpu_dba_server, vendor_tflite_delegate_prop)
+# Allow EdgeTPU DBA service to read hetero runtime properties
+get_prop(edgetpu_dba_server, vendor_hetero_runtime_prop)
diff --git a/edgetpu/sepolicy/hal_camera_default.te b/edgetpu/sepolicy/hal_camera_default.te
index a8ea541..3c09f2f 100644
--- a/edgetpu/sepolicy/hal_camera_default.te
+++ b/edgetpu/sepolicy/hal_camera_default.te
@@ -1,2 +1,5 @@
 # Allow camera HAL to read tflite Darwinn delegate properties
 get_prop(hal_camera_default, vendor_tflite_delegate_prop)
+
+# Allow camera HAL to read hetero runtime properties
+get_prop(hal_camera_default, vendor_hetero_runtime_prop)
diff --git a/edgetpu/sepolicy/hal_neuralnetworks_darwinn.te b/edgetpu/sepolicy/hal_neuralnetworks_darwinn.te
index 02e485c..7d50bfc 100644
--- a/edgetpu/sepolicy/hal_neuralnetworks_darwinn.te
+++ b/edgetpu/sepolicy/hal_neuralnetworks_darwinn.te
@@ -54,3 +54,5 @@
 
 # Allow NNAPI HAL to read tflite DarwiNN delegate properties
 get_prop(hal_neuralnetworks_darwinn, vendor_tflite_delegate_prop)
+# Allow NNAPI HAL to read hetero runtime properties
+get_prop(hal_neuralnetworks_darwinn, vendor_hetero_runtime_prop)
diff --git a/edgetpu/sepolicy/property.te b/edgetpu/sepolicy/property.te
index 254d059..1ed9a59 100644
--- a/edgetpu/sepolicy/property.te
+++ b/edgetpu/sepolicy/property.te
@@ -5,3 +5,6 @@
 # Tflite Darwinn delegate properties are written once by vendor_init,
 # and then read by apps, camera hal, and some Darwinn vendor services.
 system_vendor_config_prop(vendor_tflite_delegate_prop)
+
+# Hetero runtime properties, including tracing levels.
+system_vendor_config_prop(vendor_hetero_runtime_prop)
diff --git a/edgetpu/sepolicy/property_contexts b/edgetpu/sepolicy/property_contexts
index 56c2bf6..c21eb13 100644
--- a/edgetpu/sepolicy/property_contexts
+++ b/edgetpu/sepolicy/property_contexts
@@ -3,3 +3,6 @@
 
 # for DarwinnDelegate
 vendor.edgetpu.tflite_delegate.                 u:object_r:vendor_tflite_delegate_prop:s0
+
+# for hetero runtime
+vendor.google.silicon.                          u:object_r:vendor_hetero_runtime_prop:s0
diff --git a/modem/dump_modemlog.cpp b/modem/dump_modemlog.cpp
index 5aaa554..f7ef834 100644
--- a/modem/dump_modemlog.cpp
+++ b/modem/dump_modemlog.cpp
@@ -22,7 +22,9 @@
 #define MODEM_LOGGING_STATUS_PROPERTY "vendor.sys.modem.logging.status"
 #define MODEM_LOGGING_NUMBER_BUGREPORT_PROPERTY "persist.vendor.sys.modem.logging.br_num"
 #define MODEM_LOGGING_PATH_PROPERTY "vendor.sys.modem.logging.log_path"
+#define MODEM_SIM_DIRECTORY "/data/vendor/radio/sim/"
 #define MODEM_LOG_PREFIX "sbuff_"
+#define SIM_POWERON_LOG_PREFIX "sim_poweron_log_"
 
 int main() {
     bool modemLogEnabled = ::android::base::GetBoolProperty(MODEM_LOGGING_PERSIST_PROPERTY, false);
@@ -55,6 +57,7 @@
     }
 
     dumpLogs("/data/vendor/radio/extended_logs", BUGREPORT_PACKING_DIR, 20, "extended_log_");
+    dumpLogs(MODEM_SIM_DIRECTORY, BUGREPORT_PACKING_DIR, 1, SIM_POWERON_LOG_PREFIX);
     copyFile("/mnt/vendor/efs/nv_normal.bin", "/data/vendor/radio/logs/always-on/all_logs/nv_normal.bin");
     copyFile("/mnt/vendor/efs/nv_protected.bin", "/data/vendor/radio/logs/always-on/all_logs/nv_protected.bin");
     return 0;
diff --git a/powerstats/AdaptiveDvfsStateResidencyDataProvider.cpp b/powerstats/AdaptiveDvfsStateResidencyDataProvider.cpp
index 28b076c..6e377aa 100644
--- a/powerstats/AdaptiveDvfsStateResidencyDataProvider.cpp
+++ b/powerstats/AdaptiveDvfsStateResidencyDataProvider.cpp
@@ -25,6 +25,9 @@
 using android::base::Split;
 using android::base::Trim;
 
+static const std::string pathSuffix = "/time_in_state";
+static const std::string stateSuffix = "MHz";
+
 namespace aidl {
 namespace android {
 namespace hardware {
@@ -34,33 +37,35 @@
 AdaptiveDvfsStateResidencyDataProvider::AdaptiveDvfsStateResidencyDataProvider(
         std::string path,
         uint64_t clockRate,
-        std::string powerEntityName,
-        std::string freqPath)
+        std::vector<std::pair<std::string, std::string>> powerEntities)
     : DvfsStateResidencyDataProvider(path, clockRate, {}) {
-    std::unique_ptr<FILE, decltype(&fclose)> fp(fopen(freqPath.c_str(), "r"), fclose);
-    if (!fp) {
-        PLOG(ERROR) << __func__ << ":Failed to open file " << freqPath;
-        return;
-    }
-
     size_t len = 0;
     char *line = nullptr;
-    std::string suffix = "MHz";
     std::vector<std::pair<std::string, std::string>> states = {};
     std::vector<std::string> parts;
-    std::string freqStr;
 
-    while (getline(&line, &len, fp.get()) != -1) {
-        parts = Split(line, " ");
-        if (parts.size() > 0) {
-            freqStr = Trim(parts[0]);
-            states.push_back(std::make_pair(
-                    freqStr.substr(0, freqStr.length() - 3) + suffix,
-                    freqStr));
+    for (int32_t i = 0; i < powerEntities.size(); i++) {
+        std::string freqPath = powerEntities[i].second + pathSuffix;
+        std::unique_ptr<FILE, decltype(&fclose)> fp(fopen(freqPath.c_str(), "r"), fclose);
+        if (!fp) {
+            PLOG(ERROR) << __func__ << ":Failed to open file " << freqPath;
+            continue;
         }
+
+        while (getline(&line, &len, fp.get()) != -1) {
+            parts = Split(Trim(std::string(line)), " ");
+            if (parts.size() > 0) {
+                std::string freqStr = Trim(parts[0]);
+                states.push_back(std::make_pair(
+                        freqStr.substr(0, freqStr.length() - 3) + stateSuffix,
+                        freqStr));
+            }
+        }
+
+        mPowerEntities.push_back({powerEntities[i].first, std::move(states)});
     }
 
-    mPowerEntities.push_back({powerEntityName, std::move(states)});
+    free(line);
 }
 
 bool AdaptiveDvfsStateResidencyDataProvider::getStateResidencies(
diff --git a/powerstats/DvfsStateResidencyDataProvider.cpp b/powerstats/DvfsStateResidencyDataProvider.cpp
index c7561d6..ba8bd5e 100644
--- a/powerstats/DvfsStateResidencyDataProvider.cpp
+++ b/powerstats/DvfsStateResidencyDataProvider.cpp
@@ -103,6 +103,10 @@
             it = residencies->find(mPowerEntities[powerEntityIndex].powerEntityName + nameSuffix);
         }
 
+        // The given string is last state for each entity.
+        if (StartsWith(Trim(std::string(line)), "last_freq_change_time_ns:"))
+            it = residencies->end();
+
         if (it != residencies->end()) {
             stateId = matchState(line, mPowerEntities[powerEntityIndex]);
 
diff --git a/powerstats/include/AdaptiveDvfsStateResidencyDataProvider.h b/powerstats/include/AdaptiveDvfsStateResidencyDataProvider.h
index 661b940..5983f0b 100644
--- a/powerstats/include/AdaptiveDvfsStateResidencyDataProvider.h
+++ b/powerstats/include/AdaptiveDvfsStateResidencyDataProvider.h
@@ -28,14 +28,12 @@
     /*
      * path - path to dvfs sysfs node.
      * clockRate - clock rate in KHz.
-     * powerEntityName - power entity name to parse.
-     * freqPath - path to frequency table.
+     * powerEntities - list of power entity pairs (name to power entity, path to frequency table)
      */
     AdaptiveDvfsStateResidencyDataProvider(
         std::string path,
         uint64_t clockRate,
-        std::string powerEntityName,
-        std::string freqPath);
+        std::vector<std::pair<std::string, std::string>> powerEntities);
     ~AdaptiveDvfsStateResidencyDataProvider() = default;
 
     /*
diff --git a/radio/dump_radio.cpp b/radio/dump_radio.cpp
index 64d137e..8d6743c 100644
--- a/radio/dump_radio.cpp
+++ b/radio/dump_radio.cpp
@@ -22,7 +22,23 @@
 #define RIL_LOG_NUMBER_PROPERTY "persist.vendor.ril.log.num_file"
 #define RIL_LOG_PREFIX "rild.log."
 
+#define TCPDUMP_LOG_DIRECTORY "/data/vendor/tcpdump_logger/logs"
+#define TCPDUMP_NUMBER_BUGREPORT "persist.vendor.tcpdump.log.br_num"
+#define TCPDUMP_PERSIST_PROPERTY "persist.vendor.tcpdump.log.alwayson"
+#define TCPDUMP_LOG_PREFIX "tcpdump"
+
 int main() {
+    // netmgr
+    bool tcpdumpEnabled = ::android::base::GetBoolProperty(TCPDUMP_PERSIST_PROPERTY, false);
+
+    if (tcpdumpEnabled) {
+        dumpLogs(TCPDUMP_LOG_DIRECTORY, BUGREPORT_PACKING_DIR, ::android::base::GetIntProperty(TCPDUMP_NUMBER_BUGREPORT, 5), TCPDUMP_LOG_PREFIX);
+    }
+    copyFile("/data/vendor/radio/metrics_data", "/data/vendor/radio/logs/always-on/all_logs/metrics_data");
+    copyFile("/data/vendor/radio/omadm_logs.txt", "/data/vendor/radio/logs/always-on/all_logs/omadm_logs.txt");
+    copyFile("/data/vendor/radio/power_anomaly_data.txt", "/data/vendor/radio/logs/always-on/all_logs/power_anomaly_data.txt");
+
+    // RIL dump
     std::string rilLogDir = ::android::base::GetProperty(RIL_LOG_DIRECTORY_PROPERTY, RIL_LOG_DIRECTORY);
 
     int maxFileNum = ::android::base::GetIntProperty(RIL_LOG_NUMBER_PROPERTY, 50);
diff --git a/radio/sepolicy/dump_radio.te b/radio/sepolicy/dump_radio.te
index 3fe29c9..146776c 100644
--- a/radio/sepolicy/dump_radio.te
+++ b/radio/sepolicy/dump_radio.te
@@ -4,4 +4,5 @@
   allow dump_radio radio_vendor_data_file:dir create_dir_perms;
   allow dump_radio radio_vendor_data_file:file create_file_perms;
   get_prop(dump_radio, vendor_rild_prop)
+  get_prop(dump_radio vendor_tcpdump_log_prop)
 ')
diff --git a/soc/sepolicy/freq/genfs_contexts b/soc/sepolicy/freq/genfs_contexts
index b747c1c..76a783d 100644
--- a/soc/sepolicy/freq/genfs_contexts
+++ b/soc/sepolicy/freq/genfs_contexts
@@ -7,6 +7,7 @@
 genfscon sysfs /devices/platform/17000060.devfreq_tnr/devfreq/17000060.devfreq_tnr/time_in_state       u:object_r:sysfs_cpu:s0
 genfscon sysfs /devices/platform/17000070.devfreq_mfc/devfreq/17000070.devfreq_mfc/time_in_state       u:object_r:sysfs_cpu:s0
 genfscon sysfs /devices/platform/17000080.devfreq_bw/devfreq/17000080.devfreq_bw/time_in_state         u:object_r:sysfs_cpu:s0
+genfscon sysfs /devices/platform/17000080.devfreq_bo/devfreq/17000080.devfreq_bo/time_in_state         u:object_r:sysfs_cpu:s0
 genfscon sysfs /devices/platform/17000090.devfreq_dsu/devfreq/17000090.devfreq_dsu/time_in_state       u:object_r:sysfs_cpu:s0
 genfscon sysfs /devices/platform/170000a0.devfreq_bci/devfreq/170000a0.devfreq_bci/time_in_state       u:object_r:sysfs_cpu:s0
 genfscon sysfs /devices/platform/1f000000.mali/time_in_state                                           u:object_r:sysfs_cpu:s0
diff --git a/storage/dumpstate.te b/storage/sepolicy/dumpstate.te
similarity index 100%
rename from storage/dumpstate.te
rename to storage/sepolicy/dumpstate.te