Merge "Move the rest of radio dump to gs-common" into udc-dev
diff --git a/audio/aidl.mk b/audio/aidl.mk
index 1044148..ae64e13 100644
--- a/audio/aidl.mk
+++ b/audio/aidl.mk
@@ -9,3 +9,6 @@
 include device/google/gs-common/audio/common.mk
 
 DEVICE_PRODUCT_COMPATIBILITY_MATRIX_FILE += device/google/gs-common/audio/aidl/device_framework_matrix_product.xml
+
+PRODUCT_PROPERTY_OVERRIDES += \
+       vendor.audio_hal.aidl.enable=true
diff --git a/audio/sepolicy/common/property_contexts b/audio/sepolicy/common/property_contexts
index aa981f1..1749ac8 100644
--- a/audio/sepolicy/common/property_contexts
+++ b/audio/sepolicy/common/property_contexts
@@ -8,3 +8,4 @@
 vendor.audiodump.encode.disable                 u:object_r:vendor_audio_prop:s0
 vendor.audiodump.log.cca.updated                u:object_r:vendor_audio_prop:s0
 vendor.audiodump.cca.config                     u:object_r:vendor_audio_prop:s0
+vendor.audio_hal.aidl.enable                    u:object_r:vendor_audio_prop:s0
diff --git a/audio/sepolicy/common/rild.te b/audio/sepolicy/common/rild.te
new file mode 100644
index 0000000..fe86848
--- /dev/null
+++ b/audio/sepolicy/common/rild.te
@@ -0,0 +1 @@
+get_prop(rild, vendor_audio_prop);
diff --git a/audio/sepolicy/common/vendor_init.te b/audio/sepolicy/common/vendor_init.te
new file mode 100644
index 0000000..26f3fa8
--- /dev/null
+++ b/audio/sepolicy/common/vendor_init.te
@@ -0,0 +1,2 @@
+# Audio property
+set_prop(vendor_init, vendor_audio_prop)
diff --git a/edgetpu/edgetpu.mk b/edgetpu/edgetpu.mk
index 862de56..2f0f77c 100644
--- a/edgetpu/edgetpu.mk
+++ b/edgetpu/edgetpu.mk
@@ -27,4 +27,4 @@
 BOARD_VENDOR_SEPOLICY_DIRS += device/google/gs-common/edgetpu/sepolicy
 
 # Tflite Darwinn delegate property
-PRODUCT_VENDOR_PROPERTIES += vendor.edgetpu.tflite_delegate.force_disable_io_coherency=1
+PRODUCT_VENDOR_PROPERTIES += vendor.edgetpu.tflite_delegate.force_disable_io_coherency=0
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/Android.bp b/modem/Android.bp
index 2bf023c..84bdd61 100644
--- a/modem/Android.bp
+++ b/modem/Android.bp
@@ -18,7 +18,9 @@
         "-Werror",
     ],
     shared_libs: [
+        "libbase",
         "libdump",
+        "liblog",
     ],
     vendor: true,
     relative_install_path: "dump",
diff --git a/modem/dump_modemlog.cpp b/modem/dump_modemlog.cpp
index 216cffe..5aaa554 100644
--- a/modem/dump_modemlog.cpp
+++ b/modem/dump_modemlog.cpp
@@ -14,9 +14,47 @@
  * limitations under the License.
  */
 #include <dump/pixel_dump.h>
+#include <android-base/properties.h>
+#include <log/log.h>
+
+#define MODEM_LOGGING_PERSIST_PROPERTY "persist.vendor.sys.modem.logging.enable"
+#define MODEM_LOGGING_PROPERTY "vendor.sys.modem.logging.enable"
+#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_LOG_PREFIX "sbuff_"
 
 int main() {
-    dumpLogs("/data/vendor/radio/extended_logs", "/data/vendor/radio/logs/always-on/all_logs", 20, "extended_log_");
+    bool modemLogEnabled = ::android::base::GetBoolProperty(MODEM_LOGGING_PERSIST_PROPERTY, false);
+    if (modemLogEnabled && ::android::base::GetProperty(MODEM_LOGGING_PATH_PROPERTY, "") == MODEM_LOG_DIRECTORY) {
+        bool modemLogStarted = ::android::base::GetBoolProperty(MODEM_LOGGING_STATUS_PROPERTY, false);
+        int maxFileNum = ::android::base::GetIntProperty(MODEM_LOGGING_NUMBER_BUGREPORT_PROPERTY, 100);
+
+        if (modemLogStarted) {
+            ::android::base::SetProperty(MODEM_LOGGING_PROPERTY, "false");
+            ALOGD("Stopping modem logging...\n");
+        } else {
+            ALOGD("modem logging is not running\n");
+        }
+
+        for (int i = 0; i < 15; i++) {
+            if (!::android::base::GetBoolProperty(MODEM_LOGGING_STATUS_PROPERTY, false)) {
+                ALOGD("modem logging stopped\n");
+                sleep(1);
+                break;
+            }
+            sleep(1);
+        }
+
+        dumpLogs(MODEM_LOG_DIRECTORY, BUGREPORT_PACKING_DIR, maxFileNum, MODEM_LOG_PREFIX);
+
+        if (modemLogStarted) {
+            ALOGD("Restarting modem logging...\n");
+            ::android::base::SetProperty(MODEM_LOGGING_PROPERTY, "true");
+        }
+    }
+
+    dumpLogs("/data/vendor/radio/extended_logs", BUGREPORT_PACKING_DIR, 20, "extended_log_");
     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/modem/sepolicy/dump_modemlog.te b/modem/sepolicy/dump_modemlog.te
index c49bd5e..0afcedf 100644
--- a/modem/sepolicy/dump_modemlog.te
+++ b/modem/sepolicy/dump_modemlog.te
@@ -4,6 +4,9 @@
   allow dump_modemlog mnt_vendor_file:dir search;
   allow dump_modemlog modem_efs_file:dir search;
   allow dump_modemlog modem_efs_file:file r_file_perms;
+  allow dump_modemlog vendor_slog_file:dir r_dir_perms;
+  allow dump_modemlog vendor_slog_file:file r_file_perms;
   allow dump_modemlog radio_vendor_data_file:dir create_dir_perms;
   allow dump_modemlog radio_vendor_data_file:file create_file_perms;
+  set_prop(dump_modemlog, vendor_modem_prop)
 ')
diff --git a/powerstats/AdaptiveDvfsStateResidencyDataProvider.cpp b/powerstats/AdaptiveDvfsStateResidencyDataProvider.cpp
new file mode 100644
index 0000000..6e377aa
--- /dev/null
+++ b/powerstats/AdaptiveDvfsStateResidencyDataProvider.cpp
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2023 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.
+ */
+#include "AdaptiveDvfsStateResidencyDataProvider.h"
+
+#include <android-base/logging.h>
+#include <android-base/parseint.h>
+#include <android-base/strings.h>
+
+#include <string>
+#include <utility>
+
+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 {
+namespace power {
+namespace stats {
+
+AdaptiveDvfsStateResidencyDataProvider::AdaptiveDvfsStateResidencyDataProvider(
+        std::string path,
+        uint64_t clockRate,
+        std::vector<std::pair<std::string, std::string>> powerEntities)
+    : DvfsStateResidencyDataProvider(path, clockRate, {}) {
+    size_t len = 0;
+    char *line = nullptr;
+    std::vector<std::pair<std::string, std::string>> states = {};
+    std::vector<std::string> parts;
+
+    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)});
+    }
+
+    free(line);
+}
+
+bool AdaptiveDvfsStateResidencyDataProvider::getStateResidencies(
+        std::unordered_map<std::string, std::vector<StateResidency>> *residencies) {
+    return DvfsStateResidencyDataProvider::getStateResidencies(residencies);
+}
+
+std::unordered_map<std::string, std::vector<State>>
+        AdaptiveDvfsStateResidencyDataProvider::getInfo() {
+    return DvfsStateResidencyDataProvider::getInfo();
+}
+
+}  // namespace stats
+}  // namespace power
+}  // namespace hardware
+}  // namespace android
+}  // namespace aidl
diff --git a/powerstats/DvfsStateResidencyDataProvider.cpp b/powerstats/DvfsStateResidencyDataProvider.cpp
index 511159e..ba8bd5e 100644
--- a/powerstats/DvfsStateResidencyDataProvider.cpp
+++ b/powerstats/DvfsStateResidencyDataProvider.cpp
@@ -37,7 +37,7 @@
 
 DvfsStateResidencyDataProvider::DvfsStateResidencyDataProvider(std::string path, uint64_t clockRate,
         std::vector<Config> cfgs)
-    : mPath(std::move(path)), mClockRate(clockRate), mPowerEntities(std::move(cfgs)) {}
+    : mPowerEntities(std::move(cfgs)), mPath(std::move(path)), mClockRate(clockRate) {}
 
 int32_t DvfsStateResidencyDataProvider::matchEntity(char const *line) {
     for (int32_t i = 0; i < mPowerEntities.size(); i++) {
@@ -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
new file mode 100644
index 0000000..5983f0b
--- /dev/null
+++ b/powerstats/include/AdaptiveDvfsStateResidencyDataProvider.h
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2023 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 "DvfsStateResidencyDataProvider.h"
+
+namespace aidl {
+namespace android {
+namespace hardware {
+namespace power {
+namespace stats {
+
+class AdaptiveDvfsStateResidencyDataProvider : public DvfsStateResidencyDataProvider {
+  public:
+    /*
+     * path - path to dvfs sysfs node.
+     * clockRate - clock rate in KHz.
+     * powerEntities - list of power entity pairs (name to power entity, path to frequency table)
+     */
+    AdaptiveDvfsStateResidencyDataProvider(
+        std::string path,
+        uint64_t clockRate,
+        std::vector<std::pair<std::string, std::string>> powerEntities);
+    ~AdaptiveDvfsStateResidencyDataProvider() = default;
+
+    /*
+     * See IStateResidencyDataProvider::getStateResidencies
+     */
+    bool getStateResidencies(
+        std::unordered_map<std::string, std::vector<StateResidency>> *residencies) override;
+
+    /*
+     * See IStateResidencyDataProvider::getInfo
+     */
+    std::unordered_map<std::string, std::vector<State>> getInfo() override;
+};
+
+}  // namespace stats
+}  // namespace power
+}  // namespace hardware
+}  // namespace android
+}  // namespace aidl
diff --git a/powerstats/include/DvfsStateResidencyDataProvider.h b/powerstats/include/DvfsStateResidencyDataProvider.h
index ca8ab22..0aeafb7 100644
--- a/powerstats/include/DvfsStateResidencyDataProvider.h
+++ b/powerstats/include/DvfsStateResidencyDataProvider.h
@@ -51,6 +51,9 @@
      */
     std::unordered_map<std::string, std::vector<State>> getInfo() override;
 
+  protected:
+    std::vector<Config> mPowerEntities;
+
   private:
     int32_t matchEntity(char const *line);
     int32_t matchState(char const *line, const Config& powerEntity);
@@ -58,7 +61,6 @@
 
     const std::string mPath;
     const uint64_t mClockRate;
-    std::vector<Config> mPowerEntities;
 };
 
 }  // namespace stats
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