blob: 0c75d1d214441889912abba41c33b2ef58fa9d68 [file] [edit]
/*
* SPDX-FileCopyrightText: Copyright OpenBMC Authors
* SPDX-License-Identifier: Apache-2.0
*/
#include "NvidiaGpuResetRequired.hpp"
#include "NvidiaEventReporting.hpp"
#include <boost/system/error_code.hpp>
#include <phosphor-logging/lg2.hpp>
#include <sdbusplus/asio/connection.hpp>
#include <cstdint>
#include <format>
#include <map>
#include <memory>
#include <span>
#include <string>
NvidiaResetRequiredEventHandler::NvidiaResetRequiredEventHandler(
const std::string& deviceName,
const std::shared_ptr<sdbusplus::asio::connection>& conn) :
deviceName(deviceName), conn(conn)
{}
void NvidiaResetRequiredEventHandler::handleLoggingComplete(
const boost::system::error_code& ec)
{
if (ec)
{
lg2::error("Failed to log ResetRequired event for device {DEV}: {EC}",
"DEV", deviceName, "EC", ec.message());
}
}
void NvidiaResetRequiredEventHandler::handleResetRequiredEvent(
const EventInfo& /*unused*/, std::span<const uint8_t> /*unused*/)
{
const std::string eventMessage =
std::format("The resource {} requires a reset. Reset the GPU or power "
"cycle the baseboard.",
deviceName);
conn->async_method_call(
[weak{weak_from_this()}](const boost::system::error_code& ec) {
std::shared_ptr<NvidiaResetRequiredEventHandler> self = weak.lock();
if (!self)
{
lg2::error(
"Invalid reference to NvidiaResetRequiredEventHandler");
return;
}
self->handleLoggingComplete(ec);
},
"xyz.openbmc_project.Logging", "/xyz/openbmc_project/logging",
"xyz.openbmc_project.Logging.Create", "Create", eventMessage,
"xyz.openbmc_project.Logging.Entry.Level.Critical",
std::map<std::string, std::string>{});
}