google-ipmi-sys: Add patch for BMC modes transition Create patch based on https://gerrit.openbmc.org/c/openbmc/google-ipmi-sys/+/64697 Google-Bug-Id: 292038170 Google-Bug-Id: 259113025 Change-Id: I05d447606e259f1bfd891958035e8d5cf932d565 Signed-off-by: Brandon Kim <brandonkim@google.com>
diff --git a/recipes-google/ipmi/google-ipmi-sys/0001-Add-flags-for-bmc-modes-transitions.patch b/recipes-google/ipmi/google-ipmi-sys/0001-Add-flags-for-bmc-modes-transitions.patch new file mode 100644 index 0000000..bd56811 --- /dev/null +++ b/recipes-google/ipmi/google-ipmi-sys/0001-Add-flags-for-bmc-modes-transitions.patch
@@ -0,0 +1,115 @@ +From 4baf41c8d22b975d5bfb65fccb5e1cb1ae2efd3d Mon Sep 17 00:00:00 2001 +From: Hao Zhou <haoooamazing@google.com> +Date: Thu, 6 Jul 2023 22:34:04 +0000 +Subject: [PATCH] Add flags for bmc modes transitions + +1. When /run/bm-drive-cleaning-done.flag is present, it means cleaning + is done and we are in BM_MODE. Also, it is acked by renaming flag to + bm-drive-cleaning-done-ack.flag +2. if not case 1, when /run/bm-drive-cleaning-done-ack.flag is present, + it means the cleaing is done and acked +3. if not case 2, when bm-ready.flag is present, it means we are in + BM_CLEANING_MODE. /run/bm-drive-cleaning.flag is created if needed +4. otherwise, we are in NON_BM_MODE + +Tested: +bm-ready.flag is not present. Respond Non-BM mode: + +ipmitool raw 0x2e 0x32 0x79 0x2b 0x00 0x10 + 79 2b 00 10 00 + +bm-ready.flah is present. For next call, respond Cleaning Mode and +bm-drive-cleaning.flag is created: + +ipmitool raw 0x2e 0x32 0x79 0x2b 0x00 0x10 + 79 2b 00 10 02 + +keep responding Cleaning Mode until bm-drive-cleaning-done.flag is +created. So cleaning is done and for next call, respond BM mode and +rename bm-drive-cleaning-done.flag to bm-drive-cleaning-done-ack.flag: + +ipmitool raw 0x2e 0x32 0x79 0x2b 0x00 0x10 + 79 2b 00 10 01 + +Patch Tracking Bug: b/292038170 +Upstream info / review: https://gerrit.openbmc.org/c/openbmc/google-ipmi-sys/+/64697 +Upstream-Status: Accepted +Justification: Feature required downstream + +Change-Id: Id8a6049550631c30c68a536313b81a8d800fede0 +Signed-off-by: Hao Zhou <haoooamazing@google.com> +--- + handler.cpp | 47 ++++++++++++++++++++++++++++++++++++++++++----- + 1 file changed, 42 insertions(+), 5 deletions(-) + +diff --git a/handler.cpp b/handler.cpp +index 9bbd082..4046871 100644 +--- a/handler.cpp ++++ b/handler.cpp +@@ -68,21 +68,58 @@ using namespace phosphor::logging; + using InternalFailure = + sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure; + ++static constexpr auto bmDriveCleaningFlagPath = "/run/bm-drive-cleaning.flag"; ++static constexpr auto bmDriveCleaningDoneFlagPath = ++ "/run/bm-drive-cleaning-done.flag"; ++static constexpr auto bmDriveCleaningDoneAckFlagPath = ++ "/run/bm-drive-cleaning-done-ack.flag"; ++ + uint8_t isBmcInBareMetalMode() + { + #if BARE_METAL + return static_cast<uint8_t>(BmcMode::BM_MODE); + #else + std::error_code ec; +- if (fs::exists(BM_SIGNAL_PATH, ec)) ++ ++ if (fs::exists(bmDriveCleaningDoneAckFlagPath, ec)) ++ { ++ std::fprintf( ++ stderr, ++ "%s exists so we acked cleaning done and must be in BM mode\n", ++ bmDriveCleaningDoneAckFlagPath); ++ return static_cast<uint8_t>(BmcMode::BM_MODE); ++ } ++ ++ if (fs::exists(bmDriveCleaningDoneFlagPath, ec)) + { +- std::fprintf(stderr, "%s exists so we must be in BM mode\n", +- BM_SIGNAL_PATH); ++ fs::rename(bmDriveCleaningDoneFlagPath, bmDriveCleaningDoneAckFlagPath, ++ ec); ++ std::fprintf( ++ stderr, ++ "%s exists so we just finished cleaning and must be in BM mode\n", ++ bmDriveCleaningDoneFlagPath); + return static_cast<uint8_t>(BmcMode::BM_MODE); + } + +- std::fprintf(stderr, "Unable to find %s so we must not be in BM mode\n", +- BM_SIGNAL_PATH); ++ if (fs::exists(BM_SIGNAL_PATH, ec)) ++ { ++ if (!fs::exists(bmDriveCleaningFlagPath, ec)) ++ { ++ std::ofstream ofs; ++ ofs.open(bmDriveCleaningFlagPath, std::ofstream::out); ++ ofs.close(); ++ } ++ ++ std::fprintf( ++ stderr, ++ "%s exists and no done/ack flag, we must be in BM cleaning mode\n", ++ BM_SIGNAL_PATH); ++ return static_cast<uint8_t>(BmcMode::BM_CLEANING_MODE); ++ } ++ ++ std::fprintf( ++ stderr, ++ "Unable to find any BM state files so we must not be in BM mode\n"); + return static_cast<uint8_t>(BmcMode::NON_BM_MODE); + #endif + } +-- +2.41.0.255.g8b1d071c50-goog +
diff --git a/recipes-google/ipmi/google-ipmi-sys_%.bbappend b/recipes-google/ipmi/google-ipmi-sys_%.bbappend new file mode 100644 index 0000000..6a1bb98 --- /dev/null +++ b/recipes-google/ipmi/google-ipmi-sys_%.bbappend
@@ -0,0 +1,2 @@ +FILESEXTRAPATHS:prepend:gbmc := "${THISDIR}/${PN}:" +SRC_URI:append:gbmc = " file://0001-Add-flags-for-bmc-modes-transitions.patch"