blob: 7a69a646de3b6eb9e80d7c2c7024b544f2bcb354 [file] [log] [blame]
/**
* Copyright © 2017 IBM 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 <map>
#include <memory>
#include <phosphor-logging/elog.hpp>
#include <phosphor-logging/log.hpp>
#include <elog-errors.hpp>
#include <xyz/openbmc_project/Sensor/Device/error.hpp>
#include <xyz/openbmc_project/Control/Device/error.hpp>
#include <xyz/openbmc_project/Power/Fault/error.hpp>
#include "ucd90160.hpp"
namespace witherspoon
{
namespace power
{
using namespace std::string_literals;
const auto CLEAR_LOGGED_FAULTS = "clear_logged_faults"s;
const auto DEVICE_NAME = "UCD90160"s;
const auto DRIVER_NAME = "ucd9000"s;
using namespace pmbus;
using namespace phosphor::logging;
using namespace sdbusplus::xyz::openbmc_project::Control::Device::Error;
using namespace sdbusplus::xyz::openbmc_project::Sensor::Device::Error;
using namespace sdbusplus::xyz::openbmc_project::Power::Fault::Error;
UCD90160::UCD90160(size_t instance) :
Device(DEVICE_NAME, instance),
interface(std::get<ucd90160::pathField>(
deviceMap.find(instance)->second),
DRIVER_NAME,
instance)
{
}
void UCD90160::onFailure()
{
try
{
auto voutError = checkVOUTFaults();
auto pgoodError = checkPGOODFaults(false);
//Not a voltage or PGOOD fault, but we know something
//failed so still create an error log.
if (!voutError && !pgoodError)
{
createPowerFaultLog();
}
}
catch (ReadFailure& e)
{
if (!accessError)
{
commit<ReadFailure>();
accessError = true;
}
}
}
void UCD90160::analyze()
{
try
{
//Note: Voltage faults are always fatal, so they just
//need to be analyzed in onFailure().
checkPGOODFaults(true);
}
catch (ReadFailure& e)
{
if (!accessError)
{
commit<ReadFailure>();
accessError = true;
}
}
}
void UCD90160::clearFaults()
{
try
{
interface.write(CLEAR_LOGGED_FAULTS, 1, Type::Base);
}
catch (WriteFailure& e)
{
if (!accessError)
{
log<level::ERR>("UCD90160 clear logged faults command failed");
commit<WriteFailure>();
accessError = true;
}
}
}
bool UCD90160::checkVOUTFaults()
{
return false;
}
bool UCD90160::checkPGOODFaults(bool polling)
{
return false;
}
void UCD90160::createPowerFaultLog()
{
}
}
}