storaged: add support for ufs health info

Test: adb logcat -d -b events | grep storaged_emmc_info
Bug: 36228467
Merged-In: I519fe2b8a99c1c31f1fe720bd671904d1ab609bb
Change-Id: I519fe2b8a99c1c31f1fe720bd671904d1ab609bb
This commit is contained in:
Jin Qian 2017-03-21 16:57:44 -07:00
parent 8197093497
commit 808f703609
2 changed files with 60 additions and 1 deletions

View File

@ -52,6 +52,14 @@ public:
bool report_debugfs();
};
class ufs_info_t : public storage_info_t {
private:
const string health_file = "/sys/devices/soc/624000.ufshc/health";
public:
virtual ~ufs_info_t() {}
bool report();
};
void report_storage_health();
#endif /* _STORAGED_INFO_H_ */

View File

@ -22,6 +22,7 @@
#include <android-base/file.h>
#include <android-base/parseint.h>
#include <android-base/logging.h>
#include <android-base/strings.h>
#include <log/log_event_list.h>
#include "storaged.h"
@ -32,7 +33,10 @@ using namespace android::base;
void report_storage_health()
{
emmc_info_t mmc;
ufs_info_t ufs;
mmc.report();
ufs.report();
}
void storage_info_t::publish()
@ -130,4 +134,51 @@ bool emmc_info_t::report_debugfs()
}
return true;
}
}
bool ufs_info_t::report()
{
string buffer;
if (!ReadFileToString(health_file, &buffer)) {
return false;
}
vector<string> lines = Split(buffer, "\n");
if (lines.empty()) {
return false;
}
char rev[8];
if (sscanf(lines[0].c_str(), "ufs version: 0x%7s\n", rev) < 1) {
return false;
}
version = "ufs " + string(rev);
for (size_t i = 1; i < lines.size(); i++) {
char token[32];
uint16_t val;
int ret;
if ((ret = sscanf(lines[i].c_str(),
"Health Descriptor[Byte offset 0x%*d]: %31s = 0x%hx",
token, &val)) < 2) {
continue;
}
if (string(token) == "bPreEOLInfo") {
eol = val;
} else if (string(token) == "bDeviceLifeTimeEstA") {
lifetime_a = val;
} else if (string(token) == "bDeviceLifeTimeEstB") {
lifetime_b = val;
}
}
if (eol == 0 || (lifetime_a == 0 && lifetime_b == 0)) {
return false;
}
publish();
return true;
}