Merge "gs101: Use FUSE passthrough by default" into sc-dev
diff --git a/BoardConfig-common.mk b/BoardConfig-common.mk
index 4909b61..888761d 100644
--- a/BoardConfig-common.mk
+++ b/BoardConfig-common.mk
@@ -363,6 +363,9 @@
 # System As Root
 BOARD_BUILD_SYSTEM_ROOT_IMAGE := false
 
+# Vendor ramdisk image for kernel development
+BOARD_BUILD_VENDOR_RAMDISK_IMAGE := true
+
 # Kernel modules
 BOARD_VENDOR_KERNEL_MODULES += \
     $(wildcard $(TARGET_KERNEL_DIR)/*.ko)
diff --git a/conf/fstab.gs101.emmc b/conf/fstab.gs101.emmc
deleted file mode 100644
index 076978d..0000000
--- a/conf/fstab.gs101.emmc
+++ /dev/null
@@ -1,12 +0,0 @@
-# Android fstab file.
-#<src>                  <mnt_point>         <type>    <mnt_flags and options>                               <fs_mgr_flags>
-# The filesystem that contains the filesystem checker binary (typically /system) cannot
-# specify MF_CHECK, and must come before any filesystems that do specify MF_CHECK
-
-
-#/dev/block/mmcblk0p2    /system             ext4      ro                                                    wait
-/dev/block/mmcblk0p3    /cache              ext4      noatime,nosuid,nodev,nomblk_io_submit,errors=panic    wait
-/dev/block/mmcblk0p4    /data               ext4      noatime,nosuid,nodev,nomblk_io_submit,noauto_da_alloc,errors=panic    wait
-
-# VOLD
-/devices/13d00000.dwmmc2/mmc_host/mmc1		/storage/sdcard		vfat	default	voldmanaged=sdcard:auto
diff --git a/conf/fstab.gs101.sdboot b/conf/fstab.gs101.sdboot
deleted file mode 100644
index dd87955..0000000
--- a/conf/fstab.gs101.sdboot
+++ /dev/null
@@ -1,14 +0,0 @@
-# Android fstab file.
-#<src>                  <mnt_point>         <type>    <mnt_flags and options>                               <fs_mgr_flags>
-# The filesystem that contains the filesystem checker binary (typically /system) cannot
-# specify MF_CHECK, and must come before any filesystems that do specify MF_CHECK
-
-
-#/dev/block/mmcblk1p2    /system             ext4      ro                                                    wait
-/dev/block/mmcblk1p4    /cache              ext4      noatime,nosuid,nodev,nomblk_io_submit,errors=panic    wait
-/dev/block/mmcblk1p3    /data               ext4      noatime,nosuid,nodev,nomblk_io_submit,noauto_da_alloc,errors=panic    wait
-/dev/block/mmcblk1p8    /efs                ext4      defaults,rw                                           wait
-
-# VOLD
-/devices/10c00000.usb				auto			vfat	default	voldmanaged=usb1:auto
-/devices/10c00000.usb/10c00000.dwc3/xhci-hcd	auto			vfat	default	voldmanaged=usb2:auto
diff --git a/device-common.mk b/device-common.mk
index d0e4ca1..f0b2bda 100644
--- a/device-common.mk
+++ b/device-common.mk
@@ -20,3 +20,6 @@
 PRODUCT_COPY_FILES += \
     frameworks/native/data/etc/android.hardware.telephony.carrierlock.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.telephony.carrierlock.xml
 
+# Factory OTA
+-include vendor/google/factoryota/client/factoryota.mk
+
diff --git a/device.mk b/device.mk
index 416695f..194ba72 100644
--- a/device.mk
+++ b/device.mk
@@ -57,21 +57,6 @@
 LOCAL_KERNEL := $(TARGET_PREBUILT_KERNEL)
 endif
 
-LOCAL_USES_SDMMC_BOOT := false
-LOCAL_USES_UFS_BOOT := true
-LOCAL_USES_EMMC_BOOT := false
-
-# Metadata Encryption
-# Because the kernel interface to dm-default-key changed in Android R,
-# you also need to ensure that you have set the correct value for
-# PRODUCT_SHIPPING_API_LEVEL in device.mk. For example, if your device
-# launches with Android R (API level 30), device.mk should contain:
-#     PRODUCT_SHIPPING_API_LEVEL := 30
-# You can also set the following system property to force the use of
-# the new dm-default-key API regardless of shipping API level:
-PRODUCT_PROPERTY_OVERRIDES += \
-	ro.crypto.dm_default_key.options_format.version=2
-
 # OEM Unlock reporting
 PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \
 	ro.oem_unlock_supported=1
@@ -221,23 +206,13 @@
 # Recovery files
 PRODUCT_COPY_FILES += \
 	device/google/gs101/conf/init.recovery.device.rc:$(TARGET_COPY_OUT_RECOVERY)/root/init.recovery.gs101.rc
-ifeq ($(LOCAL_USES_SDMMC_BOOT),true)
-PRODUCT_COPY_FILES += \
-	device/google/gs101/conf/fstab.gs101.sdboot:$(TARGET_COPY_OUT_VENDOR)/etc/fstab.gs101 \
-	device/google/gs101/conf/fstab.gs101.sdboot:$(TARGET_COPY_OUT_RECOVERY)/root/first_stage_ramdisk/fstab.gs101
-else
-ifeq ($(LOCAL_USES_UFS_BOOT),true)
+
+# Fstab files
 PRODUCT_COPY_FILES += \
 	device/google/gs101/conf/fstab.gs101:$(TARGET_COPY_OUT_VENDOR)/etc/fstab.gs101 \
 	device/google/gs101/conf/fstab.gs101:$(TARGET_COPY_OUT_RECOVERY)/root/first_stage_ramdisk/fstab.gs101 \
 	device/google/gs101/conf/fstab.persist:$(TARGET_COPY_OUT_VENDOR)/etc/fstab.persist \
 	device/google/gs101/conf/fstab.gs101:$(TARGET_COPY_OUT_VENDOR_RAMDISK)/first_stage_ramdisk/fstab.gs101
-else
-PRODUCT_COPY_FILES += \
-	device/google/gs101/conf/fstab.gs101.emmc:$(TARGET_COPY_OUT_VENDOR)/etc/fstab.gs101 \
-	device/google/gs101/conf/fstab.gs101.emmc:$(TARGET_COPY_OUT_RECOVERY)/root/first_stage_ramdisk/fstab.gs101
-endif
-endif
 
 # Shell scripts
 PRODUCT_COPY_FILES += \
@@ -281,9 +256,6 @@
 	tune2fs.vendor_ramdisk \
 	resize2fs.vendor_ramdisk
 
-PRODUCT_PROPERTY_OVERRIDES += \
-	ro.crypto.volume.filenames_mode=aes-256-cts
-
 # Userdata Checkpointing OTA GC
 PRODUCT_PACKAGES += \
 	checkpoint_gc
diff --git a/dumpstate/DumpstateDevice.cpp b/dumpstate/DumpstateDevice.cpp
index cd5aa6d..7d5bce8 100644
--- a/dumpstate/DumpstateDevice.cpp
+++ b/dumpstate/DumpstateDevice.cpp
@@ -377,160 +377,216 @@
 
 // Dump items related to touch
 void DumpstateDevice::dumpTouchSection(int fd) {
-    const char c2_spi_path[] = "/sys/class/spi_master/spi11/spi11.0";
-    const char r3_spi_path[] = "/sys/devices/virtual/sec/tsp";
+    const char stm_cmd_path[4][50] = {"/sys/class/spi_master/spi11/spi11.0",
+                                      "/proc/fts/driver_test",
+                                      "/sys/class/spi_master/spi6/spi6.0",
+                                      "/proc/fts_ext/driver_test"};
+    const char lsi_spi_path[] = "/sys/devices/virtual/sec/tsp";
     char cmd[256];
 
-    snprintf(cmd, sizeof(cmd), "%s/appid", c2_spi_path);
-    if (!access(cmd, R_OK)) {
-        // Touch firmware version
-        DumpFileToFd(fd, "STM touch firmware version", cmd);
+    for (int i = 0; i < 4; i+=2) {
+        snprintf(cmd, sizeof(cmd), "%s", stm_cmd_path[i + 1]);
+        if (!access(cmd, R_OK)) {
+            snprintf(cmd, sizeof(cmd), "echo A0 01 > %s", stm_cmd_path[i + 1]);
+            RunCommandToFd(fd, "Force Set AP as Bus Owner",
+                           {"/vendor/bin/sh", "-c", cmd});
+        }
 
-        // Touch controller status
-        snprintf(cmd, sizeof(cmd), "%s/status", c2_spi_path);
-        DumpFileToFd(fd, "STM touch status", cmd);
+        snprintf(cmd, sizeof(cmd), "%s/appid", stm_cmd_path[i]);
+        if (!access(cmd, R_OK)) {
+            // Touch firmware version
+            DumpFileToFd(fd, "STM touch firmware version", cmd);
 
-        // Mutual raw data
-        snprintf(cmd, sizeof(cmd),
-                 "echo 13 00 > %s/stm_fts_cmd && cat %s/stm_fts_cmd",
-                 c2_spi_path, c2_spi_path);
-        RunCommandToFd(fd, "Mutual Raw", {"/vendor/bin/sh", "-c", cmd});
+            // Touch controller status
+            snprintf(cmd, sizeof(cmd), "%s/status", stm_cmd_path[i]);
+            DumpFileToFd(fd, "STM touch status", cmd);
 
-        // Mutual strength data
-        snprintf(cmd, sizeof(cmd),
-                 "echo 17 > %s/stm_fts_cmd && cat %s/stm_fts_cmd",
-                 c2_spi_path, c2_spi_path);
-        RunCommandToFd(fd, "Mutual Strength", {"/vendor/bin/sh", "-c", cmd});
+            // Mutual raw data
+            snprintf(cmd, sizeof(cmd),
+                     "echo 13 00 01 > %s/stm_fts_cmd && cat %s/stm_fts_cmd",
+                     stm_cmd_path[i], stm_cmd_path[i]);
+            RunCommandToFd(fd, "Mutual Raw", {"/vendor/bin/sh", "-c", cmd});
 
-        // Self raw data
-        snprintf(cmd, sizeof(cmd),
-                 "echo 15 00 > %s/stm_fts_cmd && cat %s/stm_fts_cmd",
-                 c2_spi_path, c2_spi_path);
-        RunCommandToFd(fd, "Self Raw", {"/vendor/bin/sh", "-c", cmd});
+            // Mutual strength data
+            snprintf(cmd, sizeof(cmd),
+                     "echo 17 01 > %s/stm_fts_cmd && cat %s/stm_fts_cmd",
+                     stm_cmd_path[i], stm_cmd_path[i]);
+            RunCommandToFd(fd, "Mutual Strength", {"/vendor/bin/sh", "-c", cmd});
+
+            // Self raw data
+            snprintf(cmd, sizeof(cmd),
+                     "echo 15 00 01 > %s/stm_fts_cmd && cat %s/stm_fts_cmd",
+                     stm_cmd_path[i], stm_cmd_path[i]);
+            RunCommandToFd(fd, "Self Raw", {"/vendor/bin/sh", "-c", cmd});
+        }
+
+        snprintf(cmd, sizeof(cmd), "%s", stm_cmd_path[i + 1]);
+        if (!access(cmd, R_OK)) {
+            snprintf(cmd, sizeof(cmd), "echo 23 00 > %s && cat %s",
+                     stm_cmd_path[i + 1], stm_cmd_path[i + 1]);
+            RunCommandToFd(fd, "Mutual Raw Data",
+                           {"/vendor/bin/sh", "-c", cmd});
+
+            snprintf(cmd, sizeof(cmd), "echo 23 03 > %s && cat %s",
+                     stm_cmd_path[i + 1], stm_cmd_path[i + 1]);
+            RunCommandToFd(fd, "Mutual Baseline Data",
+                           {"/vendor/bin/sh", "-c", cmd});
+
+            snprintf(cmd, sizeof(cmd), "echo 23 02 > %s && cat %s",
+                     stm_cmd_path[i + 1], stm_cmd_path[i + 1]);
+            RunCommandToFd(fd, "Mutual Strength Data",
+                           {"/vendor/bin/sh", "-c", cmd});
+
+            snprintf(cmd, sizeof(cmd), "echo 24 00 > %s && cat %s",
+                     stm_cmd_path[i + 1], stm_cmd_path[i + 1]);
+            RunCommandToFd(fd, "Self Raw Data",
+                           {"/vendor/bin/sh", "-c", cmd});
+
+            snprintf(cmd, sizeof(cmd), "echo 24 03 > %s && cat %s",
+                     stm_cmd_path[i + 1], stm_cmd_path[i + 1]);
+            RunCommandToFd(fd, "Self Baseline Data",
+                           {"/vendor/bin/sh", "-c", cmd});
+
+            snprintf(cmd, sizeof(cmd), "echo 24 02 > %s && cat %s",
+                     stm_cmd_path[i + 1], stm_cmd_path[i + 1]);
+            RunCommandToFd(fd, "Self Strength Data",
+                           {"/vendor/bin/sh", "-c", cmd});
+
+            snprintf(cmd, sizeof(cmd), "echo 32 10 > %s && cat %s",
+                     stm_cmd_path[i + 1], stm_cmd_path[i + 1]);
+            RunCommandToFd(fd, "Mutual Compensation",
+                           {"/vendor/bin/sh", "-c", cmd});
+
+            snprintf(cmd, sizeof(cmd), "echo 32 11 > %s && cat %s",
+                     stm_cmd_path[i + 1], stm_cmd_path[i + 1]);
+            RunCommandToFd(fd, "Mutual Low Power Compensation",
+                           {"/vendor/bin/sh", "-c", cmd});
+
+            snprintf(cmd, sizeof(cmd), "echo 33 12 > %s && cat %s",
+                     stm_cmd_path[i + 1], stm_cmd_path[i + 1]);
+            RunCommandToFd(fd, "Self Compensation",
+                           {"/vendor/bin/sh", "-c", cmd});
+
+            snprintf(cmd, sizeof(cmd), "echo 34 > %s && cat %s",
+                     stm_cmd_path[i + 1], stm_cmd_path[i + 1]);
+            RunCommandToFd(fd, "Golden Mutual Raw Data",
+                           {"/vendor/bin/sh", "-c", cmd});
+
+            snprintf(cmd, sizeof(cmd), "echo 01 FA 20 00 00 24 80 > %s",
+                     stm_cmd_path[i + 1]);
+            RunCommandToFd(fd, "Packaging Plant - HW reset",
+                           {"/vendor/bin/sh", "-c", cmd});
+            snprintf(cmd, sizeof(cmd), "echo 01 FA 20 00 00 68 08 > %s",
+                     stm_cmd_path[i + 1]);
+            RunCommandToFd(fd, "Packaging Plant - Hibernate Memory",
+                           {"/vendor/bin/sh", "-c", cmd});
+            snprintf(cmd, sizeof(cmd),
+                     "echo 02 FB 00 04 3F D8 00 10 01 > %s && cat %s",
+                     stm_cmd_path[i + 1], stm_cmd_path[i + 1]);
+            RunCommandToFd(fd, "Packaging Plant - Read 16 bytes from Address 0x00041FD8",
+                           {"/vendor/bin/sh", "-c", cmd});
+        }
+
+        snprintf(cmd, sizeof(cmd), "%s/stm_fts_cmd", stm_cmd_path[i]);
+        if (!access(cmd, R_OK)) {
+            // ITO raw data
+            snprintf(cmd, sizeof(cmd),
+                     "echo 01 > %s/stm_fts_cmd && cat %s/stm_fts_cmd",
+                     stm_cmd_path[i], stm_cmd_path[i]);
+            RunCommandToFd(fd, "ITO Raw", {"/vendor/bin/sh", "-c", cmd});
+        }
+
+        if (!access(cmd, R_OK)) {
+            snprintf(cmd, sizeof(cmd), "echo A0 00 > %s", stm_cmd_path[i + 1]);
+            RunCommandToFd(fd, "Restore Bus Owner",
+                           {"/vendor/bin/sh", "-c", cmd});
+        }
     }
 
-    if (!access("/proc/fts/driver_test", R_OK)) {
-        RunCommandToFd(fd, "Mutual Raw Data",
-                       {"/vendor/bin/sh", "-c",
-                        "echo 23 00 > /proc/fts/driver_test && "
-                        "cat /proc/fts/driver_test"});
-        RunCommandToFd(fd, "Mutual Baseline Data",
-                       {"/vendor/bin/sh", "-c",
-                        "echo 23 03 > /proc/fts/driver_test && "
-                        "cat /proc/fts/driver_test"});
-        RunCommandToFd(fd, "Mutual Strength Data",
-                       {"/vendor/bin/sh", "-c",
-                        "echo 23 02 > /proc/fts/driver_test && "
-                        "cat /proc/fts/driver_test"});
-        RunCommandToFd(fd, "Self Raw Data",
-                       {"/vendor/bin/sh", "-c",
-                        "echo 24 00 > /proc/fts/driver_test && "
-                        "cat /proc/fts/driver_test"});
-        RunCommandToFd(fd, "Self Baseline Data",
-                       {"/vendor/bin/sh", "-c",
-                        "echo 24 03 > /proc/fts/driver_test && "
-                        "cat /proc/fts/driver_test"});
-        RunCommandToFd(fd, "Self Strength Data",
-                       {"/vendor/bin/sh", "-c",
-                        "echo 24 02 > /proc/fts/driver_test && "
-                        "cat /proc/fts/driver_test"});
-        RunCommandToFd(fd, "Mutual Compensation",
-                       {"/vendor/bin/sh", "-c",
-                        "echo 32 10 > /proc/fts/driver_test && "
-                        "cat /proc/fts/driver_test"});
-        RunCommandToFd(fd, "Self Compensation",
-                       {"/vendor/bin/sh", "-c",
-                        "echo 33 12 > /proc/fts/driver_test && "
-                        "cat /proc/fts/driver_test"});
-        RunCommandToFd(fd, "Golden Mutual Raw Data",
-                       {"/vendor/bin/sh", "-c",
-                        "echo 34 > /proc/fts/driver_test && "
-                        "cat /proc/fts/driver_test"});
-    }
-    if (!access(r3_spi_path, R_OK)) {
+    if (!access(lsi_spi_path, R_OK)) {
         // Enable: force touch active
         snprintf(cmd, sizeof(cmd),
                  "echo %s > %s/cmd && cat %s/cmd_result",
                  "force_touch_active,1",
-                 r3_spi_path, r3_spi_path);
+                 lsi_spi_path, lsi_spi_path);
         RunCommandToFd(fd, "Force Touch Active", {"/vendor/bin/sh", "-c", cmd});
 
         // Firmware info
-        snprintf(cmd, sizeof(cmd), "%s/fw_version", r3_spi_path);
+        snprintf(cmd, sizeof(cmd), "%s/fw_version", lsi_spi_path);
         DumpFileToFd(fd, "LSI firmware version", cmd);
 
         // Touch status
-        snprintf(cmd, sizeof(cmd), "%s/status", r3_spi_path);
+        snprintf(cmd, sizeof(cmd), "%s/status", lsi_spi_path);
         DumpFileToFd(fd, "LSI touch status", cmd);
 
         // Calibration info
         snprintf(cmd, sizeof(cmd),
                  "echo %s > %s/cmd && cat %s/cmd_result",
                  "get_mis_cal_info",
-                 r3_spi_path, r3_spi_path);
+                 lsi_spi_path, lsi_spi_path);
         RunCommandToFd(fd, "Calibration info", {"/vendor/bin/sh", "-c", cmd});
 
         // Mutual strength
         snprintf(cmd, sizeof(cmd),
                  "echo %s > %s/cmd && cat %s/cmd_result",
                  "run_delta_read_all",
-                 r3_spi_path, r3_spi_path);
+                 lsi_spi_path, lsi_spi_path);
         RunCommandToFd(fd, "Mutual Strength", {"/vendor/bin/sh", "-c", cmd});
 
         // Self strength
         snprintf(cmd, sizeof(cmd),
                  "echo %s > %s/cmd && cat %s/cmd_result",
                  "run_self_delta_read_all",
-                 r3_spi_path, r3_spi_path);
+                 lsi_spi_path, lsi_spi_path);
         RunCommandToFd(fd, "Self Strength", {"/vendor/bin/sh", "-c", cmd});
 
         // Raw cap
         snprintf(cmd, sizeof(cmd),
                  "echo %s > %s/cmd && cat %s/cmd_result",
                  "run_rawcap_read_all",
-                 r3_spi_path, r3_spi_path);
+                 lsi_spi_path, lsi_spi_path);
         RunCommandToFd(fd, "Mutual Raw Cap", {"/vendor/bin/sh", "-c", cmd});
 
         // Self raw cap
         snprintf(cmd, sizeof(cmd),
                  "echo %s > %s/cmd && cat %s/cmd_result",
                  "run_self_rawcap_read_all",
-                 r3_spi_path, r3_spi_path);
+                 lsi_spi_path, lsi_spi_path);
         RunCommandToFd(fd, "Self Raw Cap", {"/vendor/bin/sh", "-c", cmd});
 
         // TYPE_AMBIENT_DATA
         snprintf(cmd, sizeof(cmd),
                  "echo %s > %s/cmd && cat %s/cmd_result",
                  "run_rawdata_read_type,3",
-                 r3_spi_path, r3_spi_path);
+                 lsi_spi_path, lsi_spi_path);
         RunCommandToFd(fd, "TYPE_AMBIENT_DATA", {"/vendor/bin/sh", "-c", cmd});
 
         // TYPE_DECODED_DATA
         snprintf(cmd, sizeof(cmd),
                  "echo %s > %s/cmd && cat %s/cmd_result",
                  "run_rawdata_read_type,5",
-                 r3_spi_path, r3_spi_path);
+                 lsi_spi_path, lsi_spi_path);
         RunCommandToFd(fd, "TYPE_DECODED_DATA", {"/vendor/bin/sh", "-c", cmd});
 
         // TYPE_NOI_P2P_MIN
         snprintf(cmd, sizeof(cmd),
                  "echo %s > %s/cmd && cat %s/cmd_result",
                  "run_rawdata_read_type,30",
-                 r3_spi_path, r3_spi_path);
+                 lsi_spi_path, lsi_spi_path);
         RunCommandToFd(fd, "TYPE_NOI_P2P_MIN", {"/vendor/bin/sh", "-c", cmd});
 
         // TYPE_NOI_P2P_MAX
         snprintf(cmd, sizeof(cmd),
                  "echo %s > %s/cmd && cat %s/cmd_result",
                  "run_rawdata_read_type,31",
-                 r3_spi_path, r3_spi_path);
+                 lsi_spi_path, lsi_spi_path);
         RunCommandToFd(fd, "TYPE_NOI_P2P_MAX", {"/vendor/bin/sh", "-c", cmd});
 
         // Disable: force touch active
         snprintf(cmd, sizeof(cmd),
                  "echo %s > %s/cmd && cat %s/cmd_result",
                  "force_touch_active,0",
-                 r3_spi_path, r3_spi_path);
+                 lsi_spi_path, lsi_spi_path);
         RunCommandToFd(fd, "Force Touch Active", {"/vendor/bin/sh", "-c", cmd});
     }
 }
diff --git a/interfaces/boot/1.2/BootControl.cpp b/interfaces/boot/1.2/BootControl.cpp
index b754404..8a24334 100644
--- a/interfaces/boot/1.2/BootControl.cpp
+++ b/interfaces/boot/1.2/BootControl.cpp
@@ -17,16 +17,15 @@
 #define LOG_TAG "bootcontrolhal"
 
 #include "BootControl.h"
-#include "GptUtils.h"
 
 #include <android-base/file.h>
 #include <android-base/unique_fd.h>
 #include <bootloader_message/bootloader_message.h>
 #include <cutils/properties.h>
-//#include <hardware/boot_control.h>
 #include <libboot_control/libboot_control.h>
 #include <log/log.h>
 
+#include "GptUtils.h"
 
 namespace android {
 namespace hardware {
@@ -37,12 +36,14 @@
 using android::bootable::GetMiscVirtualAbMergeStatus;
 using android::bootable::InitMiscVirtualAbMessageIfNeeded;
 using android::bootable::SetMiscVirtualAbMergeStatus;
-using android::hardware::boot::V1_1::MergeStatus;
-using android::hardware::boot::V1_0::CommandResult;
 using android::hardware::boot::V1_0::BoolResult;
+using android::hardware::boot::V1_0::CommandResult;
+using android::hardware::boot::V1_1::MergeStatus;
 
 namespace {
 
+// clang-format off
+
 #define BOOT_A_PATH     "/dev/block/by-name/boot_a"
 #define BOOT_B_PATH     "/dev/block/by-name/boot_b"
 
@@ -59,6 +60,8 @@
 #define AB_ATTR_MAX_PRIORITY        3UL
 #define AB_ATTR_MAX_RETRY_COUNT     3UL
 
+// clang-format on
+
 static std::string getDevPath(uint32_t slot) {
     char real_path[PATH_MAX];
 
@@ -122,17 +125,17 @@
     return 0;
 }
 
-}
+}  // namespace
 
 // Methods from ::android::hardware::boot::V1_0::IBootControl follow.
 Return<uint32_t> BootControl::getNumberSlots() {
     uint32_t slots = 0;
 
     if (access(BOOT_A_PATH, F_OK) == 0)
-      slots++;
+        slots++;
 
     if (access(BOOT_B_PATH, F_OK) == 0)
-      slots++;
+        slots++;
 
     return slots;
 }
@@ -189,14 +192,14 @@
         return Void();
     }
 
-    std::string boot_lun_path = std::string("/sys/devices/platform/") +
-                                boot_dev + "/pixel/boot_lun_enabled";
+    std::string boot_lun_path =
+            std::string("/sys/devices/platform/") + boot_dev + "/pixel/boot_lun_enabled";
     int fd = open(boot_lun_path.c_str(), O_RDWR);
     if (fd < 0) {
         // Try old path for kernels < 5.4
         // TODO: remove once kernel 4.19 support is deprecated
-        std::string boot_lun_path = std::string("/sys/devices/platform/") +
-                                    boot_dev + "/attributes/boot_lun_enabled";
+        std::string boot_lun_path =
+                std::string("/sys/devices/platform/") + boot_dev + "/attributes/boot_lun_enabled";
         fd = open(boot_lun_path.c_str(), O_RDWR);
         if (fd < 0) {
             _hidl_cb({false, "failed to open ufs attr boot_lun_enabled"});
@@ -257,7 +260,8 @@
     return isSlotFlagSet(slot, AB_ATTR_UNBOOTABLE) ? BoolResult::FALSE : BoolResult::TRUE;
 }
 
-Return<::android::hardware::boot::V1_0::BoolResult> BootControl::isSlotMarkedSuccessful(uint32_t slot) {
+Return<::android::hardware::boot::V1_0::BoolResult> BootControl::isSlotMarkedSuccessful(
+        uint32_t slot) {
     if (getNumberSlots() == 0) {
         // just return true so that we don't we another call trying to mark it as successful
         // when there is no slots
@@ -278,7 +282,8 @@
     return InitMiscVirtualAbMessageIfNeeded();
 }
 
-Return<bool> BootControl::setSnapshotMergeStatus(::android::hardware::boot::V1_1::MergeStatus status) {
+Return<bool> BootControl::setSnapshotMergeStatus(
+        ::android::hardware::boot::V1_1::MergeStatus status) {
     return SetMiscVirtualAbMergeStatus(getCurrentSlot(), status);
 }
 
@@ -300,8 +305,7 @@
 
 // Methods from ::android::hidl::base::V1_0::IBase follow.
 
-
-IBootControl* HIDL_FETCH_IBootControl(const char* /* name */) {
+IBootControl *HIDL_FETCH_IBootControl(const char * /* name */) {
     auto module = new BootControl();
 
     module->Init();
diff --git a/interfaces/boot/1.2/BootControl.h b/interfaces/boot/1.2/BootControl.h
index b601779..17b5f0f 100644
--- a/interfaces/boot/1.2/BootControl.h
+++ b/interfaces/boot/1.2/BootControl.h
@@ -26,16 +26,15 @@
 namespace V1_2 {
 namespace implementation {
 
+using ::android::sp;
 using ::android::hardware::hidl_array;
 using ::android::hardware::hidl_memory;
 using ::android::hardware::hidl_string;
 using ::android::hardware::hidl_vec;
 using ::android::hardware::Return;
 using ::android::hardware::Void;
-using ::android::sp;
 
 struct BootControl : public IBootControl {
-
     bool Init();
 
     // Methods from ::android::hardware::boot::V1_0::IBootControl follow.
@@ -45,22 +44,23 @@
     Return<void> setActiveBootSlot(uint32_t slot, setActiveBootSlot_cb _hidl_cb) override;
     Return<void> setSlotAsUnbootable(uint32_t slot, setSlotAsUnbootable_cb _hidl_cb) override;
     Return<::android::hardware::boot::V1_0::BoolResult> isSlotBootable(uint32_t slot) override;
-    Return<::android::hardware::boot::V1_0::BoolResult> isSlotMarkedSuccessful(uint32_t slot) override;
+    Return<::android::hardware::boot::V1_0::BoolResult> isSlotMarkedSuccessful(
+            uint32_t slot) override;
     Return<void> getSuffix(uint32_t slot, getSuffix_cb _hidl_cb) override;
 
     // Methods from ::android::hardware::boot::V1_1::IBootControl follow.
-    Return<bool> setSnapshotMergeStatus(::android::hardware::boot::V1_1::MergeStatus status) override;
+    Return<bool> setSnapshotMergeStatus(
+            ::android::hardware::boot::V1_1::MergeStatus status) override;
     Return<::android::hardware::boot::V1_1::MergeStatus> getSnapshotMergeStatus() override;
 
     // Methods from ::android::hardware::boot::V1_2::IBootControl follow.
     Return<uint32_t> getActiveBootSlot() override;
 
     // Methods from ::android::hidl::base::V1_0::IBase follow.
-
 };
 
 // FIXME: most likely delete, this is only for passthrough implementations
-extern "C" IBootControl* HIDL_FETCH_IBootControl(const char* name);
+extern "C" IBootControl *HIDL_FETCH_IBootControl(const char *name);
 
 }  // namespace implementation
 }  // namespace V1_2
diff --git a/interfaces/boot/1.2/GptUtils.cpp b/interfaces/boot/1.2/GptUtils.cpp
index 514aa89..25088e7 100644
--- a/interfaces/boot/1.2/GptUtils.cpp
+++ b/interfaces/boot/1.2/GptUtils.cpp
@@ -18,10 +18,10 @@
 
 #include "GptUtils.h"
 
-#include <errno.h>
-#include <log/log.h>
 #include <android-base/file.h>
+#include <errno.h>
 #include <linux/fs.h>
+#include <log/log.h>
 #include <zlib.h>
 
 namespace android {
@@ -32,8 +32,7 @@
 
 namespace {
 
-static int ValidateGptHeader(gpt_header *gpt)
-{
+static int ValidateGptHeader(gpt_header *gpt) {
     if (gpt->signature != GPT_SIGNATURE) {
         ALOGE("invalid gpt signature 0x%lx\n", gpt->signature);
         return -1;
@@ -52,12 +51,11 @@
     return 0;
 }
 
-}
+}  // namespace
 
 GptUtils::GptUtils(const std::string dev_path) : dev_path(dev_path), fd(0) {}
 
-int GptUtils::Load(void)
-{
+int GptUtils::Load(void) {
     fd = open(dev_path.c_str(), O_RDWR);
     if (fd < 0) {
         ALOGE("failed to open block dev %s, %d\n", dev_path.c_str(), errno);
@@ -102,20 +100,19 @@
     }
 
     if (ValidateGptHeader(&gpt_backup)) {
-        ALOGW("error validating gpt backup\n"); // just warn about it, not fail
+        ALOGW("error validating gpt backup\n");  // just warn about it, not fail
     }
 
     // Create map <partition name, gpt_entry pointer>
     auto get_name = [](const uint16_t *efi_name) {
         char name[37] = {};
-        for (int i = 0; efi_name[i] && i < sizeof name - 1; ++i)
-            name[i] = efi_name[i];
+        for (int i = 0; efi_name[i] && i < sizeof name - 1; ++i) name[i] = efi_name[i];
         return std::string(name);
     };
 
-    for (auto const &e: entry_array) {
+    for (auto const &e : entry_array) {
         if (e.name[0] == 0)
-            break;   // stop at the first partition with no name
+            break;  // stop at the first partition with no name
         std::string s = get_name(e.name);
         entries[s] = const_cast<gpt_entry *>(&e);
     }
@@ -123,19 +120,17 @@
     return 0;
 }
 
-gpt_entry *GptUtils::GetPartitionEntry(std::string name)
-{
-    return entries.find(name) != entries.end() ?  entries[name] : nullptr;
+gpt_entry *GptUtils::GetPartitionEntry(std::string name) {
+    return entries.find(name) != entries.end() ? entries[name] : nullptr;
 }
 
-int GptUtils::Sync(void)
-{
+int GptUtils::Sync(void) {
     if (!fd)
         return -1;
 
     // calculate crc and check if we need to update gpt
     gpt_primary.entries_crc32 = crc32(0, reinterpret_cast<uint8_t *>(entry_array.data()),
-                                entry_array.size() * sizeof(gpt_entry));
+                                      entry_array.size() * sizeof(gpt_entry));
 
     // save old crc
     uint32_t crc = gpt_primary.crc32;
@@ -143,7 +138,7 @@
 
     gpt_primary.crc32 = crc32(0, reinterpret_cast<uint8_t *>(&gpt_primary), sizeof gpt_primary);
     if (crc == gpt_primary.crc32)
-        return 0; // nothing to do (no changes)
+        return 0;  // nothing to do (no changes)
 
     ALOGI("updating GPT\n");
 
@@ -161,7 +156,7 @@
         return -1;
     }
 
-    //update GPT backup entries and backup
+    // update GPT backup entries and backup
     lseek64(fd, block_size * gpt_backup.start_lba, SEEK_SET);
     ret = write(fd, entry_array.data(), entry_array.size() * sizeof(gpt_entry));
     if (ret < 0) {
@@ -184,8 +179,7 @@
     return 0;
 }
 
-GptUtils::~GptUtils()
-{
+GptUtils::~GptUtils() {
     if (fd) {
         Sync();
         close(fd);
diff --git a/interfaces/boot/1.2/GptUtils.h b/interfaces/boot/1.2/GptUtils.h
index 8965118..a2bed33 100644
--- a/interfaces/boot/1.2/GptUtils.h
+++ b/interfaces/boot/1.2/GptUtils.h
@@ -16,9 +16,9 @@
 
 #pragma once
 
+#include <map>
 #include <string>
 #include <vector>
-#include <map>
 
 namespace android {
 namespace hardware {
@@ -26,7 +26,7 @@
 namespace V1_2 {
 namespace implementation {
 
-#define GPT_SIGNATURE       0x5452415020494645UL
+#define GPT_SIGNATURE 0x5452415020494645UL
 
 typedef struct {
     uint8_t type_guid[16];
@@ -55,21 +55,21 @@
 } __attribute__((packed)) gpt_header;
 
 class GptUtils {
-   public:
+  public:
     GptUtils(const std::string dev_path);
     int Load(void);
     gpt_entry *GetPartitionEntry(std::string name);
     int Sync(void);
     ~GptUtils();
 
-   private:
+  private:
     std::string dev_path;
     int fd;
     uint32_t block_size;
     gpt_header gpt_primary;
     gpt_header gpt_backup;
     std::vector<gpt_entry> entry_array;
-    std::map<std::string, gpt_entry *>entries;
+    std::map<std::string, gpt_entry *> entries;
 };
 
 }  // namespace implementation
diff --git a/interfaces/boot/1.2/service.cpp b/interfaces/boot/1.2/service.cpp
index 158c456..f07682e 100644
--- a/interfaces/boot/1.2/service.cpp
+++ b/interfaces/boot/1.2/service.cpp
@@ -16,10 +16,11 @@
 
 #define LOG_TAG "android.hardware.boot@1.2-service"
 
-#include <log/log.h>
+#include <android/hardware/boot/1.2/IBootControl.h>
 #include <hidl/HidlTransportSupport.h>
 #include <hidl/Status.h>
-#include <android/hardware/boot/1.2/IBootControl.h>
+#include <log/log.h>
+
 #include "BootControl.h"
 
 using ::android::status_t;
@@ -27,9 +28,9 @@
 using ::android::hardware::boot::V1_2::IBootControl;
 
 using ::android::hardware::boot::V1_2::implementation::BootControl;
-//using ::android::hardware::boot::implementation::BootControl;
+// using ::android::hardware::boot::implementation::BootControl;
 
-int main (int /* argc */, char * /* argv */ []) {
+int main(int /* argc */, char * /* argv */[]) {
     // This function must be called before you join to ensure the proper
     // number of threads are created. The threadpool will never exceed
     // size one because of this call.
@@ -38,12 +39,12 @@
     ::android::sp bootctrl = new BootControl();
     const status_t status = bootctrl->registerAsService();
     if (status != ::android::OK) {
-        return 1; // or handle error
+        return 1;  // or handle error
     }
 
     // Adds this thread to the threadpool, resulting in one total
     // thread in the threadpool. We could also do other things, but
     // would have to specify 'false' to willJoin in configureRpcThreadpool.
     ::android::hardware::joinRpcThreadpool();
-    return 1; // joinRpcThreadpool should never return
+    return 1;  // joinRpcThreadpool should never return
 }
diff --git a/powerstats/Android.bp b/powerstats/Android.bp
index 07e16f1..fa73e51 100644
--- a/powerstats/Android.bp
+++ b/powerstats/Android.bp
@@ -81,6 +81,7 @@
         "liblog",
         "libutils",
         "libbinder_ndk",
+        "pixel_stateresidency_provider_aidl_interface-ndk_platform",
         "android.hardware.power.stats-V1-ndk_platform",
     ],
     relative_install_path: "hw",
diff --git a/powerstats/serviceaidl.cpp b/powerstats/serviceaidl.cpp
index 25eb6ea..8c15775 100644
--- a/powerstats/serviceaidl.cpp
+++ b/powerstats/serviceaidl.cpp
@@ -24,6 +24,7 @@
 #include <dataproviders/IioEnergyMeterDataProvider.h>
 #include <dataproviders/PowerStatsEnergyConsumer.h>
 #include <dataproviders/PowerStatsEnergyAttribution.h>
+#include <dataproviders/PixelStateResidencyDataProvider.h>
 
 #include <android-base/logging.h>
 #include <android-base/properties.h>
@@ -37,6 +38,7 @@
 using aidl::android::hardware::power::stats::EnergyConsumerType;
 using aidl::android::hardware::power::stats::GenericStateResidencyDataProvider;
 using aidl::android::hardware::power::stats::IioEnergyMeterDataProvider;
+using aidl::android::hardware::power::stats::PixelStateResidencyDataProvider;
 using aidl::android::hardware::power::stats::PowerStats;
 using aidl::android::hardware::power::stats::PowerStatsEnergyConsumer;
 
@@ -54,7 +56,8 @@
     };
     std::vector<std::pair<std::string, std::string>> coreStates = {
             {"DWN", "off"}, {"RET", "retention"}, {"WFI", "wfi"}};
-    p->addStateResidencyDataProvider(new AocStateResidencyDataProvider(coreIds, coreStates));
+    p->addStateResidencyDataProvider(std::make_shared<AocStateResidencyDataProvider>(coreIds,
+            coreStates));
 
     // Add AoC voltage stats
     std::vector<std::pair<std::string, std::string>> voltageIds = {
@@ -65,7 +68,7 @@
                                                                       {"UUD", "ultra_underdrive"},
                                                                       {"UD", "underdrive"}};
     p->addStateResidencyDataProvider(
-            new AocStateResidencyDataProvider(voltageIds, voltageStates));
+            std::make_shared<AocStateResidencyDataProvider>(voltageIds, voltageStates));
 
     // Add AoC monitor mode
     std::vector<std::pair<std::string, std::string>> monitorIds = {
@@ -75,7 +78,7 @@
             {"MON", "mode"},
     };
     p->addStateResidencyDataProvider(
-            new AocStateResidencyDataProvider(monitorIds, monitorStates));
+            std::make_shared<AocStateResidencyDataProvider>(monitorIds, monitorStates));
 }
 
 void addDvfsStats(std::shared_ptr<PowerStats> p) {
@@ -167,7 +170,7 @@
         std::make_pair("1066MHz", "1066000000"),
     }});
 
-    p->addStateResidencyDataProvider(new DvfsStateResidencyDataProvider(
+    p->addStateResidencyDataProvider(std::make_shared<DvfsStateResidencyDataProvider>(
             "/sys/devices/platform/1742048c.acpm_stats/fvp_stats", NS_TO_MS, cfgs));
 }
 
@@ -235,7 +238,7 @@
     cfgs.emplace_back(generateGenericStateResidencyConfigs(reqStateConfig, slcReqStateHeaders),
             "SLC-REQ", "SLC_REQ:");
 
-    android::sp<GenericStateResidencyDataProvider> socSdp = new GenericStateResidencyDataProvider(
+    auto socSdp = std::make_shared<GenericStateResidencyDataProvider>(
             "/sys/devices/platform/1742048c.acpm_stats/soc_stats", cfgs);
 
     p->addStateResidencyDataProvider(socSdp);
@@ -248,25 +251,32 @@
 
 void addDisplay(std::shared_ptr<PowerStats> p) {
     // Add display residency stats
-    android::sp<DisplayStateResidencyDataProvider> displaySdp =
-        new DisplayStateResidencyDataProvider("Display",
+
+    /*
+     * TODO(b/167216667): Add complete set of display states here. Must account
+     * for ALL devices built using this source
+     */
+    std::vector<std::string> states = {
+        "Off",
+        "LP: 1440x3040@30",
+        "On: 1440x3040@60",
+        "On: 1440x3040@90",
+        "HBM: 1440x3040@60",
+        "HBM: 1440x3040@90"};
+
+    auto displaySdp =
+        std::make_shared<DisplayStateResidencyDataProvider>("Display",
             "/sys/class/backlight/panel0-backlight/state",
-            /*
-             * TODO(b/167216667): Add complete set of display states here. Must account
-             * for ALL devices built using this source
-             */
-            {"Off", "LP: 1440x3040@30", "On: 1440x3040@60", "On: 1440x3040@90", "HBM: 1440x3040@60",
-            "HBM: 1440x3040@90"});
+            states);
     p->addStateResidencyDataProvider(displaySdp);
 
     // Add display energy consumer
-    android::sp<PowerStatsEnergyConsumer> displayConsumer;
     /*
      * TODO(b/167216667): Add correct display power model here. Must read from display rail
      * and include proper coefficients for display states. Must account for ALL devices built
      * using this source.
      */
-    displayConsumer = PowerStatsEnergyConsumer::createMeterAndEntityConsumer(p,
+    auto displayConsumer = PowerStatsEnergyConsumer::createMeterAndEntityConsumer(p,
             EnergyConsumerType::DISPLAY, "display", {"PPVAR_VSYS_PWR_DISP"}, "Display",
             {{"LP: 1440x3040@30", 1},
              {"On: 1440x3040@60", 2},
@@ -275,8 +285,7 @@
     p->addEnergyConsumer(displayConsumer);
 }
 
-void addCPUclusters(std::shared_ptr<PowerStats> p)
-{
+void addCPUclusters(std::shared_ptr<PowerStats> p) {
     p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterConsumer(p,
             EnergyConsumerType::CPU_CLUSTER, "CPUCL0", {"S4M_VDD_CPUCL0"}));
     p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterConsumer(p,
@@ -287,7 +296,6 @@
 
 void addGPU(std::shared_ptr<PowerStats> p) {
     // Add gpu energy consumer
-    android::sp<PowerStatsEnergyConsumer> gpuConsumer;
     std::map<std::string, int32_t> stateCoeffs;
     const int socRev = android::base::GetIntProperty(kBootHwSoCRev, 0);
 
@@ -315,7 +323,7 @@
             {"670000",  50}};
     }
 
-    gpuConsumer = PowerStatsEnergyConsumer::createMeterAndAttrConsumer(p,
+    auto gpuConsumer = PowerStatsEnergyConsumer::createMeterAndAttrConsumer(p,
             EnergyConsumerType::OTHER, "GPU", {"S2S_VDD_G3D"},
             {{UID_TIME_IN_STATE, "/sys/devices/platform/1c500000.mali/uid_time_in_state"}},
             stateCoeffs);
@@ -349,10 +357,8 @@
     cfgs.emplace_back(generateGenericStateResidencyConfigs(powerStateConfig, powerStateHeaders),
             "MODEM", "");
 
-    android::sp<GenericStateResidencyDataProvider> modemSdp = new GenericStateResidencyDataProvider(
-            "/sys/devices/platform/cpif/modem/power_stats", cfgs);
-
-    p->addStateResidencyDataProvider(modemSdp);
+    p->addStateResidencyDataProvider(std::make_shared<GenericStateResidencyDataProvider>(
+            "/sys/devices/platform/cpif/modem/power_stats", cfgs));
 
     p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterConsumer(p,
             EnergyConsumerType::MOBILE_RADIO, "MODEM", {"VSYS_PWR_MODEM", "VSYS_PWR_RFFE"}));
@@ -364,6 +370,127 @@
             EnergyConsumerType::GNSS, "GPS", {"L9S_GNSS_CORE"}));
 }
 
+void addNFC(std::shared_ptr<PowerStats> p) {
+    const GenericStateResidencyDataProvider::StateResidencyConfig nfcStateConfig = {
+        .entryCountSupported = true,
+        .entryCountPrefix = "Cumulative count:",
+        .totalTimeSupported = true,
+        .totalTimePrefix = "Cumulative duration msec:",
+        .lastEntrySupported = true,
+        .lastEntryPrefix = "Last entry timestamp msec:",
+    };
+    const std::vector<std::pair<std::string, std::string>> nfcStateHeaders = {
+        std::make_pair("IDLE", "Idle mode:"),
+        std::make_pair("ACTIVE", "Active mode:"),
+        std::make_pair("ACTIVE-RW", "Active Reader/Writer mode:"),
+    };
+
+    std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs;
+    cfgs.emplace_back(generateGenericStateResidencyConfigs(nfcStateConfig, nfcStateHeaders),
+            "NFC", "NFC subsystem");
+
+    auto nfcSdp = std::make_shared<GenericStateResidencyDataProvider>(
+            "/sys/devices/platform/10960000.hsi2c/i2c-3/3-0008/power_stats", cfgs);
+
+    p->addStateResidencyDataProvider(nfcSdp);
+}
+
+void addPCIe(std::shared_ptr<PowerStats> p) {
+    // Add PCIe power entities for Modem and WiFi
+    const GenericStateResidencyDataProvider::StateResidencyConfig pcieStateConfig = {
+        .entryCountSupported = true,
+        .entryCountPrefix = "Cumulative count:",
+        .totalTimeSupported = true,
+        .totalTimePrefix = "Cumulative duration msec:",
+        .lastEntrySupported = true,
+        .lastEntryPrefix = "Last entry timestamp msec:",
+    };
+    const std::vector<std::pair<std::string, std::string>> pcieStateHeaders = {
+        std::make_pair("UP", "Link up:"),
+        std::make_pair("DOWN", "Link down:"),
+    };
+
+    // Add PCIe - Modem
+    const std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> pcieModemCfgs = {
+        {generateGenericStateResidencyConfigs(pcieStateConfig, pcieStateHeaders), "PCIe-Modem",
+                "Version: 1"}
+    };
+    auto pcieModemSdp = std::make_shared<GenericStateResidencyDataProvider>(
+            "/sys/devices/platform/11920000.pcie/power_stats", pcieModemCfgs);
+    p->addStateResidencyDataProvider(pcieModemSdp);
+
+    // Add PCIe - WiFi
+    const std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> pcieWifiCfgs = {
+        {generateGenericStateResidencyConfigs(pcieStateConfig, pcieStateHeaders),
+            "PCIe-WiFi", "Version: 1"}
+    };
+    auto pcieWifiSdp = std::make_shared<GenericStateResidencyDataProvider>(
+            "/sys/devices/platform/14520000.pcie/power_stats", pcieWifiCfgs);
+    p->addStateResidencyDataProvider(pcieWifiSdp);
+}
+
+void addWifi(std::shared_ptr<PowerStats> p) {
+    // The transform function converts microseconds to milliseconds.
+    std::function<uint64_t(uint64_t)> usecToMs = [](uint64_t a) { return a / 1000; };
+    const GenericStateResidencyDataProvider::StateResidencyConfig stateConfig = {
+        .entryCountSupported = true,
+        .entryCountPrefix = "count:",
+        .totalTimeSupported = true,
+        .totalTimePrefix = "duration_usec:",
+        .totalTimeTransform = usecToMs,
+        .lastEntrySupported = true,
+        .lastEntryPrefix = "last_entry_timestamp_usec:",
+        .lastEntryTransform = usecToMs,
+    };
+    const GenericStateResidencyDataProvider::StateResidencyConfig pcieStateConfig = {
+        .entryCountSupported = true,
+        .entryCountPrefix = "count:",
+        .totalTimeSupported = true,
+        .totalTimePrefix = "duration_usec:",
+        .totalTimeTransform = usecToMs,
+        .lastEntrySupported = false,
+    };
+
+    const std::vector<std::pair<std::string, std::string>> stateHeaders = {
+        std::make_pair("AWAKE", "AWAKE:"),
+        std::make_pair("ASLEEP", "ASLEEP:"),
+
+    };
+    const std::vector<std::pair<std::string, std::string>> pcieStateHeaders = {
+        std::make_pair("L0", "L0:"),
+        std::make_pair("L1", "L1:"),
+        std::make_pair("L1_1", "L1_1:"),
+        std::make_pair("L1_2", "L1_2:"),
+        std::make_pair("L2", "L2:"),
+    };
+
+    const std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs = {
+        {generateGenericStateResidencyConfigs(stateConfig, stateHeaders), "WIFI", "WIFI"},
+        {generateGenericStateResidencyConfigs(pcieStateConfig, pcieStateHeaders), "WIFI-PCIE",
+                "WIFI-PCIE"}
+    };
+
+    auto wifiSdp = std::make_shared<GenericStateResidencyDataProvider>("/sys/wifi/power_stats",
+            cfgs);
+    p->addStateResidencyDataProvider(wifiSdp);
+}
+
+/**
+ * Unlike other data providers, which source power entity state residency data from the kernel,
+ * this data provider acts as a general-purpose channel for state residency data providers
+ * that live in user space. Entities are defined here and user space clients of this provider's
+ * vendor service register callbacks to provide state residency data for their given pwoer entity.
+ */
+void addPixelStateResidencyDataProvider(std::shared_ptr<PowerStats> p) {
+    std::shared_ptr<PixelStateResidencyDataProvider> pixelSdp =
+            ndk::SharedRefBase::make<PixelStateResidencyDataProvider>();
+
+    pixelSdp->addEntity("Bluetooth", {{0, "Idle"}, {1, "Active"}, {2, "Tx"}, {3, "Rx"}});
+
+    pixelSdp->start();
+    p->addStateResidencyDataProvider(pixelSdp);
+}
+
 int main() {
     LOG(INFO) << "Pixel PowerStats HAL AIDL Service is starting.";
 
@@ -374,6 +501,7 @@
 
     setEnergyMeter(p);
 
+    addPixelStateResidencyDataProvider(p);
     addAoC(p);
     addDisplay(p);
     addDvfsStats(p);
@@ -382,6 +510,9 @@
     addGPU(p);
     addMobileRadio(p);
     addGNSS(p);
+    addNFC(p);
+    addPCIe(p);
+    addWifi(p);
 
     const std::string instance = std::string() + PowerStats::descriptor + "/default";
     binder_status_t status = AServiceManager_addService(p->asBinder().get(), instance.c_str());