blob: 17f3af4fbe10bbac26c6057f07ba39cf8c02e0ed [file] [log] [blame]
Shawn McCarney14572cf2024-11-06 12:17:57 -06001/**
2 * Copyright © 2024 IBM Corporation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16#pragma once
17
18#include "pmbus.hpp"
19
20#include <sdbusplus/bus.hpp>
21
22#include <cstdint>
23#include <memory>
24#include <string>
25#include <tuple>
Shawn McCarney23dee382024-11-11 18:41:49 -060026#include <utility> // for std::pair
Shawn McCarney14572cf2024-11-06 12:17:57 -060027
28/**
29 * @namespace utils
30 *
31 * Contains utility functions used within the psutils tool.
32 */
33namespace utils
34{
35
36// PsuI2cInfo contains the device i2c bus and i2c address
37using PsuI2cInfo = std::tuple<std::uint64_t, std::uint64_t>;
38
39/**
40 * @brief Get i2c bus and address
41 *
42 * @param[in] bus - Systemd bus connection
43 * @param[in] psuInventoryPath - The PSU inventory path.
44 *
45 * @return tuple - i2cBus and i2cAddr.
46 */
47PsuI2cInfo getPsuI2c(sdbusplus::bus_t& bus,
48 const std::string& psuInventoryPath);
49
50/**
51 * @brief Get PMBus interface pointer
52 *
53 * @param[in] i2cBus - PSU i2c bus
54 * @param[in] i2cAddr - PSU i2c address
55 *
56 * @return Pointer to PSU PMBus interface
57 */
Patrick Williams92261f82025-02-01 08:22:34 -050058std::unique_ptr<phosphor::pmbus::PMBusBase> getPmbusIntf(std::uint64_t i2cBus,
59 std::uint64_t i2cAddr);
Shawn McCarney14572cf2024-11-06 12:17:57 -060060
61/**
62 * @brief Reads a VPD value from PMBus, corrects size, and contents.
63 *
64 * If the VPD data read is not the passed in size, resize and fill with
65 * spaces. If the data contains a non-alphanumeric value, replace any of
66 * those values with spaces.
67 *
68 * @param[in] pmbusIntf - PMBus Interface.
69 * @param[in] vpdName - The name of the sysfs "file" to read data from.
70 * @param[in] type - The HWMON file type to read from.
71 * @param[in] vpdSize - The expected size of the data for this VPD/property
72 *
73 * @return A string containing the VPD data read, resized if necessary
74 */
75std::string readVPDValue(phosphor::pmbus::PMBusBase& pmbusIntf,
76 const std::string& vpdName,
77 const phosphor::pmbus::Type& type,
78 const std::size_t& vpdSize);
79
80/**
81 * @brief Check for file existence
82 *
83 * @param[in] filePath - File path
84 *
85 * @return bool
86 */
87bool checkFileExists(const std::string& filePath);
88
Shawn McCarney23dee382024-11-11 18:41:49 -060089/**
90 * @brief Get the device name from the device path
91 *
92 * @param[in] devPath - PSU path
93 *
94 * @return device name e.g. 3-0068
95 */
96std::string getDeviceName(std::string devPath);
97
98/**
99 * @brief Function to get device path using DBus bus and PSU
100 * inventory Path
101 *
102 * @param[in] bus - The sdbusplus DBus bus connection
103 * @param[in] psuInventoryPath - PSU inventory path
104 *
105 * @return device path e.g. /sys/bus/i2c/devices/3-0068
106 */
107std::string getDevicePath(sdbusplus::bus_t& bus,
108 const std::string& psuInventoryPath);
109
110/**
111 * @brief Parse the device name to obtain bus and device address
112 *
113 * @param[in] devName - Device name
114 *
115 * @return bus and device address
116 */
117std::pair<uint8_t, uint8_t> parseDeviceName(const std::string& devName);
118
119/**
120 * @brief Wrapper to check existence of PSU JSON file
121 *
122 * @return true or false (true if using JSON file)
123 */
124bool usePsuJsonFile();
125
Shawn McCarney14572cf2024-11-06 12:17:57 -0600126} // namespace utils