diff --git a/powerstats/CpupmStateResidencyDataProvider.cpp b/powerstats/CpupmStateResidencyDataProvider.cpp
new file mode 100644
index 0000000..bb0e61f
--- /dev/null
+++ b/powerstats/CpupmStateResidencyDataProvider.cpp
@@ -0,0 +1,146 @@
+/*
+ * 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 "CpupmStateResidencyDataProvider.h"
+
+#include <android-base/logging.h>
+#include <android-base/parseint.h>
+#include <android-base/strings.h>
+
+#include <string>
+#include <utility>
+
+using android::base::ParseUint;
+using android::base::Split;
+using android::base::StartsWith;
+using android::base::Trim;
+
+namespace aidl {
+namespace android {
+namespace hardware {
+namespace power {
+namespace stats {
+
+CpupmStateResidencyDataProvider::CpupmStateResidencyDataProvider(
+        const std::string &path, const Config &config)
+    : mPath(std::move(path)), mConfig(std::move(config)) {}
+
+int32_t CpupmStateResidencyDataProvider::matchState(char const *line) {
+    for (int32_t i = 0; i < mConfig.states.size(); i++) {
+        if (mConfig.states[i].second == Trim(std::string(line))) {
+            return i;
+        }
+    }
+    return -1;
+}
+
+int32_t CpupmStateResidencyDataProvider::matchEntity(char const *line) {
+    for (int32_t i = 0; i < mConfig.entities.size(); i++) {
+        if (StartsWith(Trim(std::string(line)), mConfig.entities[i].second)) {
+            return i;
+        }
+    }
+    return -1;
+}
+
+bool CpupmStateResidencyDataProvider::parseState(
+        char const *line, uint64_t *duration, uint64_t *count) {
+    std::vector<std::string> parts = Split(line, " ");
+    if (parts.size() != 5) {
+        return false;
+    }
+    if (!ParseUint(Trim(parts[1]), count)) {
+        return false;
+    }
+    if (!ParseUint(Trim(parts[3]), duration)) {
+        return false;
+    }
+    return true;
+}
+
+bool CpupmStateResidencyDataProvider::getStateResidencies(
+        std::unordered_map<std::string, std::vector<StateResidency>> *residencies) {
+    std::unique_ptr<FILE, decltype(&fclose)> fp(fopen(mPath.c_str(), "r"), fclose);
+    if (!fp) {
+        PLOG(ERROR) << __func__ << ":Failed to open file " << mPath;
+        return false;
+    }
+
+    for (int32_t i = 0; i < mConfig.entities.size(); i++) {
+        std::vector<StateResidency> stateResidencies(mConfig.states.size());
+        for (int32_t j = 0; j < stateResidencies.size(); j++) {
+            stateResidencies[j].id = j;
+        }
+        residencies->emplace(mConfig.entities[i].first, stateResidencies);
+    }
+
+    size_t len = 0;
+    char *line = nullptr;
+
+    int32_t temp, entityIndex, stateId = -1;
+    uint64_t duration, count;
+    auto it = residencies->end();
+
+    while (getline(&line, &len, fp.get()) != -1) {
+        temp = matchState(line);
+        // Assign new id only when a new valid state is encountered.
+        if (temp >= 0) {
+            stateId = temp;
+        }
+
+        if (stateId >= 0) {
+            entityIndex = matchEntity(line);
+            it = residencies->find(mConfig.entities[entityIndex].first);
+
+            if (it != residencies->end()) {
+                if (parseState(line, &duration, &count)) {
+                    it->second[stateId].totalTimeInStateMs = duration / US_TO_MS;
+                    it->second[stateId].totalStateEntryCount = count;
+                } else {
+                    LOG(ERROR) << "Failed to parse duration and count from [" << std::string(line)
+                               << "]";
+                    return false;
+                }
+            }
+        }
+    }
+
+    free(line);
+
+    return true;
+}
+
+std::unordered_map<std::string, std::vector<State>> CpupmStateResidencyDataProvider::getInfo() {
+    std::unordered_map<std::string, std::vector<State>> info;
+    for (auto const &entity : mConfig.entities) {
+        std::vector<State> stateInfo(mConfig.states.size());
+        int32_t stateId = 0;
+        for (auto const &state : mConfig.states) {
+            stateInfo[stateId] = State{
+                .id = stateId,
+                .name = state.first
+            };
+            stateId++;
+        }
+        info.emplace(entity.first, stateInfo);
+    }
+    return info;
+}
+
+}  // namespace stats
+}  // namespace power
+}  // namespace hardware
+}  // namespace android
+}  // namespace aidl
