libec: Add AddEntropyCommand.
BUG=b:144959033
TEST=FEATURES="test" emerge-hatch libec
Change-Id: Ia6c188857c18343e11058707470b7e7d4a2ac575
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform2/+/3139188
Tested-by: Tom Hughes <tomhughes@chromium.org>
Commit-Queue: Tom Hughes <tomhughes@chromium.org>
Reviewed-by: Andrea Grandi <agrandi@google.com>
(cherry picked from commit 95cba42c3e39999a02c3534e6924cdd5b8cdc775)
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform2/+/4117814
Commit-Queue: YH Lin <yueherngl@chromium.org>
Tested-by: YH Lin <yueherngl@chromium.org>
diff --git a/libec/BUILD.gn b/libec/BUILD.gn
index dc32388..9200c22 100644
--- a/libec/BUILD.gn
+++ b/libec/BUILD.gn
@@ -27,6 +27,7 @@
}
libec_sources = [
+ "add_entropy_command.cc",
"device_event_command.cc",
"display_soc_command.cc",
"ec_command_factory.cc",
@@ -58,6 +59,7 @@
install_config("install_libec_headers") {
sources = [
+ "add_entropy_command.h",
"device_event_command.h",
"display_soc_command.h",
"ec_command.h",
@@ -96,6 +98,7 @@
if (use.test) {
executable("libec_tests") {
sources = [
+ "add_entropy_command_test.cc",
"device_event_command_test.cc",
"display_soc_command_test.cc",
"ec_command_async_test.cc",
diff --git a/libec/add_entropy_command.cc b/libec/add_entropy_command.cc
new file mode 100644
index 0000000..222be66
--- /dev/null
+++ b/libec/add_entropy_command.cc
@@ -0,0 +1,27 @@
+// Copyright 2022 The ChromiumOS Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <base/time/time.h>
+#include "libec/add_entropy_command.h"
+
+namespace ec {
+
+AddEntropyCommand::AddEntropyCommand(bool reset)
+ : EcCommandAsync(EC_CMD_ADD_ENTROPY,
+ ADD_ENTROPY_GET_RESULT,
+ {.poll_for_result_num_attempts = 20,
+ .poll_interval = base::Milliseconds(100),
+ // The EC temporarily stops responding to EC commands
+ // when this command is run, so we will keep trying until
+ // we get success (or time out).
+ .validate_poll_result = false},
+ 0) {
+ if (reset) {
+ Req()->action = ADD_ENTROPY_RESET_ASYNC;
+ } else {
+ Req()->action = ADD_ENTROPY_ASYNC;
+ }
+}
+
+} // namespace ec
diff --git a/libec/add_entropy_command.h b/libec/add_entropy_command.h
new file mode 100644
index 0000000..7eadad4
--- /dev/null
+++ b/libec/add_entropy_command.h
@@ -0,0 +1,27 @@
+// Copyright 2022 The ChromiumOS Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef LIBEC_ADD_ENTROPY_COMMAND_H_
+#define LIBEC_ADD_ENTROPY_COMMAND_H_
+
+#include <brillo/brillo_export.h>
+#include "libec/ec_command_async.h"
+
+namespace ec {
+
+class BRILLO_EXPORT AddEntropyCommand
+ : public EcCommandAsync<struct ec_params_rollback_add_entropy, EmptyParam> {
+ public:
+ explicit AddEntropyCommand(bool reset);
+ ~AddEntropyCommand() override = default;
+};
+
+static_assert(!std::is_copy_constructible<AddEntropyCommand>::value,
+ "EcCommands are not copyable by default");
+static_assert(!std::is_copy_assignable<AddEntropyCommand>::value,
+ "EcCommands are not copy-assignable by default");
+
+} // namespace ec
+
+#endif // LIBEC_ADD_ENTROPY_COMMAND_H_
diff --git a/libec/add_entropy_command_test.cc b/libec/add_entropy_command_test.cc
new file mode 100644
index 0000000..501dae0
--- /dev/null
+++ b/libec/add_entropy_command_test.cc
@@ -0,0 +1,36 @@
+// Copyright 2022 The ChromiumOS Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <gmock/gmock.h>
+#include <gtest/gtest.h>
+
+#include "libec/add_entropy_command.h"
+
+namespace ec {
+namespace {
+
+using ::testing::Return;
+
+TEST(AddEntropyCommand, AddEntropyCommand) {
+ AddEntropyCommand cmd(false);
+ EXPECT_EQ(cmd.Version(), 0);
+ EXPECT_EQ(cmd.Command(), EC_CMD_ADD_ENTROPY);
+ EXPECT_EQ(cmd.Req()->action, ADD_ENTROPY_ASYNC);
+ EXPECT_EQ(cmd.options().poll_for_result_num_attempts, 20);
+ EXPECT_EQ(cmd.options().poll_interval, base::Milliseconds(100));
+ EXPECT_EQ(cmd.options().validate_poll_result, false);
+}
+
+TEST(AddEntropyCommand, AddEntropyCommandReset) {
+ AddEntropyCommand cmd(true);
+ EXPECT_EQ(cmd.Version(), 0);
+ EXPECT_EQ(cmd.Command(), EC_CMD_ADD_ENTROPY);
+ EXPECT_EQ(cmd.Req()->action, ADD_ENTROPY_RESET_ASYNC);
+ EXPECT_EQ(cmd.options().poll_for_result_num_attempts, 20);
+ EXPECT_EQ(cmd.options().poll_interval, base::Milliseconds(100));
+ EXPECT_EQ(cmd.options().validate_poll_result, false);
+}
+
+} // namespace
+} // namespace ec