| /** |
| * 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() |
| { |
| |
| } |
| |
| } |
| } |