Add methods to health HAL interface to report storage info
The methods will report device specific storage info.
Bug: 68388678
Test: vts-tradefed run vts -m VtsHalHealthV2_0
Change-Id: I76a15f36f271312d2b49141ee1d45118be101397
diff --git a/health/2.0/Android.bp b/health/2.0/Android.bp
index 1080df1..97704bf 100644
--- a/health/2.0/Android.bp
+++ b/health/2.0/Android.bp
@@ -17,6 +17,9 @@
],
types: [
"Result",
+ "DiskStats",
+ "StorageAttribute",
+ "StorageInfo",
],
gen_java: true,
}
diff --git a/health/2.0/IHealth.hal b/health/2.0/IHealth.hal
index 3e10701..a33bb15 100644
--- a/health/2.0/IHealth.hal
+++ b/health/2.0/IHealth.hal
@@ -137,4 +137,27 @@
* @return value charge status, or UNKNOWN if not successful.
*/
getChargeStatus() generates (Result result, BatteryStatus value);
+
+ /**
+ * Get storage info.
+ *
+ * @return result SUCCESS if successful,
+ * NOT_SUPPORTED if this property is not supported,
+ * UNKNOWN other errors.
+ * @return value vector of StorageInfo structs, to be ignored if result is not
+ * SUCCESS.
+ */
+ getStorageInfo() generates (Result result, vec<StorageInfo> value);
+
+ /**
+ * Gets disk statistics (number of reads/writes processed, number of I/O
+ * operations in flight etc).
+ *
+ * @return result SUCCESS if successful,
+ * NOT_SUPPORTED if this property is not supported,
+ * UNKNOWN other errors.
+ * @return value vector of disk statistics, to be ignored if result is not SUCCESS.
+ * The mapping is index 0->sda, 1->sdb and so on.
+ */
+ getDiskStats() generates (Result result, vec<DiskStats> value);
};
diff --git a/health/2.0/default/Health.cpp b/health/2.0/default/Health.cpp
index 4710c90..96f6d70 100644
--- a/health/2.0/default/Health.cpp
+++ b/health/2.0/default/Health.cpp
@@ -1,3 +1,18 @@
+/*
+ * Copyright (C) 2018 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.
+ */
#define LOG_TAG "android.hardware.health@2.0-impl"
#include <android-base/logging.h>
@@ -160,6 +175,30 @@
return Void();
}
+Return<void> Health::getStorageInfo(getStorageInfo_cb _hidl_cb) {
+ std::vector<struct StorageInfo> info;
+ get_storage_info(info);
+ hidl_vec<struct StorageInfo> info_vec(info);
+ if (!info.size()) {
+ _hidl_cb(Result::NOT_SUPPORTED, info_vec);
+ } else {
+ _hidl_cb(Result::SUCCESS, info_vec);
+ }
+ return Void();
+}
+
+Return<void> Health::getDiskStats(getDiskStats_cb _hidl_cb) {
+ std::vector<struct DiskStats> stats;
+ get_disk_stats(stats);
+ hidl_vec<struct DiskStats> stats_vec(stats);
+ if (!stats.size()) {
+ _hidl_cb(Result::NOT_SUPPORTED, stats_vec);
+ } else {
+ _hidl_cb(Result::SUCCESS, stats_vec);
+ }
+ return Void();
+}
+
void Health::serviceDied(uint64_t /* cookie */, const wp<IBase>& who) {
(void)unregisterCallbackInternal(who.promote());
}
diff --git a/health/2.0/default/include/health2/Health.h b/health/2.0/default/include/health2/Health.h
index ab42ae7..41ba9e9 100644
--- a/health/2.0/default/include/health2/Health.h
+++ b/health/2.0/default/include/health2/Health.h
@@ -9,6 +9,12 @@
#include <healthd/BatteryMonitor.h>
#include <hidl/Status.h>
+using android::hardware::health::V2_0::StorageInfo;
+using android::hardware::health::V2_0::DiskStats;
+
+void get_storage_info(std::vector<struct StorageInfo>& info);
+void get_disk_stats(std::vector<struct DiskStats>& stats);
+
namespace android {
namespace hardware {
namespace health {
@@ -44,6 +50,8 @@
Return<void> getCapacity(getCapacity_cb _hidl_cb) override;
Return<void> getEnergyCounter(getEnergyCounter_cb _hidl_cb) override;
Return<void> getChargeStatus(getChargeStatus_cb _hidl_cb) override;
+ Return<void> getStorageInfo(getStorageInfo_cb _hidl_cb) override;
+ Return<void> getDiskStats(getDiskStats_cb _hidl_cb) override;
// Methods from ::android::hidl::base::V1_0::IBase follow.
Return<void> debug(const hidl_handle& fd, const hidl_vec<hidl_string>& args) override;
diff --git a/health/2.0/types.hal b/health/2.0/types.hal
index 8c6d88f..4e7a081 100644
--- a/health/2.0/types.hal
+++ b/health/2.0/types.hal
@@ -26,3 +26,101 @@
NOT_FOUND,
CALLBACK_DIED,
};
+
+/*
+ * Identification attributes for a storage device.
+ */
+struct StorageAttribute {
+ /**
+ * Set to true if internal storage
+ */
+ bool isInternal;
+ /**
+ * Set to true if this is the boot device.
+ */
+ bool isBootDevice;
+ /**
+ * Name of the storage device.
+ */
+ string name;
+};
+
+/*
+ * Information on storage device including life time estimates, end of life
+ * information and other attributes.
+ */
+struct StorageInfo {
+ /**
+ * Attributes of the storage device whose info is contained by the struct.
+ */
+ StorageAttribute attr;
+ /**
+ * pre-eol (end of life) information. Follows JEDEC standard No.84-B50.
+ */
+ uint16_t eol;
+ /**
+ * device life time estimation (type A). Follows JEDEC standard No.84-B50.
+ */
+ uint16_t lifetimeA;
+ /**
+ * device life time estimation (type B). Follows JEDEC standard No.84-B50.
+ */
+ uint16_t lifetimeB;
+ /**
+ * version string
+ */
+ string version;
+};
+/*
+ * Disk statistics since boot.
+ */
+struct DiskStats {
+ /**
+ * Number of reads processed.
+ */
+ uint64_t reads;
+ /**
+ * number of read I/Os merged with in-queue I/Os.
+ */
+ uint64_t readMerges;
+ /**
+ * number of sectors read.
+ */
+ uint64_t readSectors;
+ /**
+ * total wait time for read requests.
+ */
+ uint64_t readTicks;
+ /**
+ * number of writes processed.
+ */
+ uint64_t writes;
+ /**
+ * number of writes merged with in-queue I/Os.
+ */
+ uint64_t writeMerges;
+ /**
+ * number of sectors written.
+ */
+ uint64_t writeSectors;
+ /**
+ * total wait time for write requests.
+ */
+ uint64_t writeTicks;
+ /**
+ * number of I/Os currently in flight.
+ */
+ uint64_t ioInFlight;
+ /**
+ * total time this block device has been active.
+ */
+ uint64_t ioTicks;
+ /**
+ * total wait time for all requests.
+ */
+ uint64_t ioInQueue;
+ /**
+ * Attributes of the memory device.
+ */
+ StorageAttribute attr;
+};