blob: 3fbbe360a021802db031be57bc5360628a358f14 [file] [log] [blame]
/*
// Copyright (c) 2019 Intel Corporation
//
// 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.
*/
#include "pfr_mgr.hpp"
#include "pfr.hpp"
namespace intel
{
namespace pfr
{
static constexpr uint8_t activeImage = 0;
static constexpr uint8_t recoveryImage = 1;
PfrVersion::PfrVersion(sdbusplus::asio::object_server &srv_,
std::shared_ptr<sdbusplus::asio::connection> &conn_,
const std::string &path_) :
server(srv_),
conn(conn_), path(path_)
{
if (path == "bmc_active")
{
purpose = "xyz.openbmc_project.Software.Version.VersionPurpose.BMC";
ImageType imgType = ImageType::bmcActive;
version = getVersionInfoCPLD(imgType);
}
else if (path == "bmc_recovery")
{
purpose = "xyz.openbmc_project.Software.Version.VersionPurpose.BMC";
ImageType imgType = ImageType::bmcRecovery;
version = getVersionInfoCPLD(imgType);
}
else if (path == "bios_active")
{
purpose = "xyz.openbmc_project.Software.Version.VersionPurpose.Host";
ImageType imgType = ImageType::biosActive;
version = getVersionInfoCPLD(imgType);
}
else if (path == "bios_recovery")
{
purpose = "xyz.openbmc_project.Software.Version.VersionPurpose.Host";
ImageType imgType = ImageType::biosRecovery;
version = getVersionInfoCPLD(imgType);
}
else if (path == "cpld")
{
purpose = "xyz.openbmc_project.Software.Version.VersionPurpose.Other";
ImageType imgType = ImageType::cpld;
version = getVersionInfoCPLD(imgType);
}
else
{
phosphor::logging::log<phosphor::logging::level::ERR>(
"Invalid path specified for PfrVersion");
return;
}
std::string objPath = "/xyz/openbmc_project/software/" + path;
auto iface =
server.add_interface(objPath, "xyz.openbmc_project.Software.Version");
iface->register_property("Purpose", purpose);
iface->register_property("Version", version);
iface->initialize();
/* Activation interface represents activation state for an associated
* xyz.openbmc_project.Software.Version. since these versions are already
* active, so we should set "activation" to Active and
* "RequestedActivation" to None. */
std::string activation =
"xyz.openbmc_project.Software.Activation.Activations.Active";
std::string reqActNone =
"xyz.openbmc_project.Software.Activation.RequestedActivations.None";
auto activationIface = server.add_interface(
objPath, "xyz.openbmc_project.Software.Activation");
activationIface->register_property("Activation", activation);
activationIface->register_property("RequestedActivation", reqActNone);
activationIface->initialize();
}
bool PfrConfig::getPFRProvisionedState()
{
bool ufmProvisioned = false;
bool ufmLocked = false;
getProvisioningStatus(ufmLocked, ufmProvisioned);
return ufmProvisioned;
}
PfrConfig::PfrConfig(sdbusplus::asio::object_server &srv_,
std::shared_ptr<sdbusplus::asio::connection> &conn_) :
server(srv_),
conn(conn_)
{
auto pfrIntf =
server.add_interface("/xyz/openbmc_project/intel_pfr",
"xyz.openbmc_project.Intel_PFR.Attributes");
pfrIntf->register_property("provisioned_state", getPFRProvisionedState());
pfrIntf->initialize();
}
} // namespace pfr
} // namespace intel