blob: 4aab7db1ec85328ce149c6dbcc161d23c92a2f77 [file] [log] [blame]
/**
* Copyright © 2020 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 "pmbus_utils.hpp"
#include <cstdint>
#include <gtest/gtest.h>
using namespace phosphor::power::regulators;
TEST(PMBusUtilsTests, ParseVoutMode)
{
uint8_t voutModeValue;
pmbus_utils::VoutDataFormat format;
int8_t parameter;
// Linear format: Exponent is negative: 0b1'1111
voutModeValue = 0b0001'1111u;
pmbus_utils::parseVoutMode(voutModeValue, format, parameter);
EXPECT_EQ(format, pmbus_utils::VoutDataFormat::linear);
EXPECT_EQ(parameter, -1);
// Linear format: Exponent is negative: 0b1'0000
voutModeValue = 0b1001'0000u;
pmbus_utils::parseVoutMode(voutModeValue, format, parameter);
EXPECT_EQ(format, pmbus_utils::VoutDataFormat::linear);
EXPECT_EQ(parameter, -16);
// Linear format: Exponent is positive: 0b0'1111
voutModeValue = 0b1000'1111u;
pmbus_utils::parseVoutMode(voutModeValue, format, parameter);
EXPECT_EQ(format, pmbus_utils::VoutDataFormat::linear);
EXPECT_EQ(parameter, 15);
// Linear format: Exponent is positive: 0b0'0001
voutModeValue = 0b0000'0001u;
pmbus_utils::parseVoutMode(voutModeValue, format, parameter);
EXPECT_EQ(format, pmbus_utils::VoutDataFormat::linear);
EXPECT_EQ(parameter, 1);
// Linear format: Exponent is zero: 0b0'0000
voutModeValue = 0b0000'0000u;
pmbus_utils::parseVoutMode(voutModeValue, format, parameter);
EXPECT_EQ(format, pmbus_utils::VoutDataFormat::linear);
EXPECT_EQ(parameter, 0);
// VID format: VID code is 0b1'1111
voutModeValue = 0b0011'1111u;
pmbus_utils::parseVoutMode(voutModeValue, format, parameter);
EXPECT_EQ(format, pmbus_utils::VoutDataFormat::vid);
EXPECT_EQ(parameter, 31);
// VID format: VID code is 0b1'0000
voutModeValue = 0b1011'0000u;
pmbus_utils::parseVoutMode(voutModeValue, format, parameter);
EXPECT_EQ(format, pmbus_utils::VoutDataFormat::vid);
EXPECT_EQ(parameter, 16);
// VID format: VID code is 0b0'1111
voutModeValue = 0b1010'1111u;
pmbus_utils::parseVoutMode(voutModeValue, format, parameter);
EXPECT_EQ(format, pmbus_utils::VoutDataFormat::vid);
EXPECT_EQ(parameter, 15);
// VID format: VID code is 0b0'0001
voutModeValue = 0b0010'0001u;
pmbus_utils::parseVoutMode(voutModeValue, format, parameter);
EXPECT_EQ(format, pmbus_utils::VoutDataFormat::vid);
EXPECT_EQ(parameter, 1);
// VID format: VID code is 0b0'0000
voutModeValue = 0b1010'0000u;
pmbus_utils::parseVoutMode(voutModeValue, format, parameter);
EXPECT_EQ(format, pmbus_utils::VoutDataFormat::vid);
EXPECT_EQ(parameter, 0);
// Direct format
voutModeValue = 0b1100'0000u;
pmbus_utils::parseVoutMode(voutModeValue, format, parameter);
EXPECT_EQ(format, pmbus_utils::VoutDataFormat::direct);
EXPECT_EQ(parameter, 0);
// IEEE format
voutModeValue = 0b0110'0000u;
pmbus_utils::parseVoutMode(voutModeValue, format, parameter);
EXPECT_EQ(format, pmbus_utils::VoutDataFormat::ieee);
EXPECT_EQ(parameter, 0);
}
TEST(PMBusUtilsTests, ToString)
{
// Sensor data format: SensorDataFormat::linear_11
{
pmbus_utils::SensorDataFormat format =
pmbus_utils::SensorDataFormat::linear_11;
EXPECT_EQ(pmbus_utils::toString(format), "linear_11");
}
// Sensor data format: SensorDataFormat::linear_16
{
pmbus_utils::SensorDataFormat format =
pmbus_utils::SensorDataFormat::linear_16;
EXPECT_EQ(pmbus_utils::toString(format), "linear_16");
}
// Sensor value type: SensorValueType::iout
{
pmbus_utils::SensorValueType type = pmbus_utils::SensorValueType::iout;
EXPECT_EQ(pmbus_utils::toString(type), "iout");
}
// Sensor value type: SensorValueType::iout_peak
{
pmbus_utils::SensorValueType type =
pmbus_utils::SensorValueType::iout_peak;
EXPECT_EQ(pmbus_utils::toString(type), "iout_peak");
}
// Sensor value type: SensorValueType::iout_valley
{
pmbus_utils::SensorValueType type =
pmbus_utils::SensorValueType::iout_valley;
EXPECT_EQ(pmbus_utils::toString(type), "iout_valley");
}
// Sensor value type: SensorValueType::pout
{
pmbus_utils::SensorValueType type = pmbus_utils::SensorValueType::pout;
EXPECT_EQ(pmbus_utils::toString(type), "pout");
}
// Sensor value type: SensorValueType::temperature
{
pmbus_utils::SensorValueType type =
pmbus_utils::SensorValueType::temperature;
EXPECT_EQ(pmbus_utils::toString(type), "temperature");
}
// Sensor value type: SensorValueType::temperature_peak
{
pmbus_utils::SensorValueType type =
pmbus_utils::SensorValueType::temperature_peak;
EXPECT_EQ(pmbus_utils::toString(type), "temperature_peak");
}
// Sensor value type: SensorValueType::vout
{
pmbus_utils::SensorValueType type = pmbus_utils::SensorValueType::vout;
EXPECT_EQ(pmbus_utils::toString(type), "vout");
}
// Sensor value type: SensorValueType::vout_peak
{
pmbus_utils::SensorValueType type =
pmbus_utils::SensorValueType::vout_peak;
EXPECT_EQ(pmbus_utils::toString(type), "vout_peak");
}
// Sensor value type: SensorValueType::vout_valley
{
pmbus_utils::SensorValueType type =
pmbus_utils::SensorValueType::vout_valley;
EXPECT_EQ(pmbus_utils::toString(type), "vout_valley");
}
// Vout data format: VoutDataFormat::linear
{
pmbus_utils::VoutDataFormat format =
pmbus_utils::VoutDataFormat::linear;
EXPECT_EQ(pmbus_utils::toString(format), "linear");
}
// Vout data format: VoutDataFormat::vid
{
pmbus_utils::VoutDataFormat format = pmbus_utils::VoutDataFormat::vid;
EXPECT_EQ(pmbus_utils::toString(format), "vid");
}
// Vout data format: VoutDataFormat::direct
{
pmbus_utils::VoutDataFormat format =
pmbus_utils::VoutDataFormat::direct;
EXPECT_EQ(pmbus_utils::toString(format), "direct");
}
// Vout data format: VoutDataFormat::ieee
{
pmbus_utils::VoutDataFormat format = pmbus_utils::VoutDataFormat::ieee;
EXPECT_EQ(pmbus_utils::toString(format), "ieee");
}
}
TEST(PMBusUtilsTests, ConvertToVoutLinear)
{
double volts;
int8_t exponent;
// Exponent > 0: Value is not rounded up
volts = 13.9;
exponent = 2;
// 13.9 / 2^2 == 3.475 = 3
EXPECT_EQ(pmbus_utils::convertToVoutLinear(volts, exponent), 3);
// Exponent > 0: Value is rounded up
volts = 14.0;
exponent = 2;
// 14.0 / 2^2 == 3.5 = 4
EXPECT_EQ(pmbus_utils::convertToVoutLinear(volts, exponent), 4);
// Exponent = 0: Value is not rounded up
volts = 2.49;
exponent = 0;
// 2.49 / 2^0 == 2.49 = 2
EXPECT_EQ(pmbus_utils::convertToVoutLinear(volts, exponent), 2);
// Exponent = 0: Value is rounded up
volts = 2.51;
exponent = 0;
// 2.51 / 2^0 == 2.51 = 3
EXPECT_EQ(pmbus_utils::convertToVoutLinear(volts, exponent), 3);
// Exponent < 0: Value is not rounded up
volts = 1.32613;
exponent = -8;
// 1.32613 / 2^-8 == 339.48928 == 339
EXPECT_EQ(pmbus_utils::convertToVoutLinear(volts, exponent), 339);
// Exponent < 0: Value is rounded up
volts = 1.32618;
exponent = -8;
// 1.32618 / 2^-8 == 339.50208 == 340
EXPECT_EQ(pmbus_utils::convertToVoutLinear(volts, exponent), 340);
}