xref: /openbmc/estoraged/include/util.hpp (revision c0d66eb7)
1 #pragma once
2 #include "getConfig.hpp"
3 
4 #include <filesystem>
5 #include <optional>
6 #include <string>
7 
8 namespace estoraged
9 {
10 namespace util
11 {
12 
13 struct DeviceInfo
14 {
15     std::filesystem::path deviceFile;
16     std::filesystem::path sysfsDir;
17     std::string luksName;
18     std::string locationCode;
19     uint64_t eraseMaxGeometry;
20     uint64_t eraseMinGeometry;
21     std::string driveType;
22     std::string driveProtocol;
23 
24     DeviceInfo(std::filesystem::path& deviceFile,
25                std::filesystem::path& sysfsDir, std::string& luksName,
26                std::string& locationCode, uint64_t eraseMaxGeometry,
27                uint64_t eraseMinGeometry, std::string& driveType,
28                std::string& driveProtocol) :
29         deviceFile(deviceFile),
30         sysfsDir(sysfsDir), luksName(luksName), locationCode(locationCode),
31         eraseMaxGeometry(eraseMaxGeometry), eraseMinGeometry(eraseMinGeometry),
32         driveType(driveType), driveProtocol(driveProtocol)
33     {}
34 };
35 
36 /** @brief finds the size of the linux block device in bytes
37  *  @param[in] devpath - the name of the linux block device
38  *  @return size of a block device using the devPath
39  */
40 uint64_t findSizeOfBlockDevice(const std::string& devPath);
41 
42 /** @brief finds the predicted life left for a eMMC device
43  *  @param[in] sysfsPath - The path to the linux sysfs interface
44  *  @return the life remaing for the emmc, as a percentage.
45  */
46 uint8_t findPredictedMediaLifeLeftPercent(const std::string& sysfsPath);
47 
48 /** @brief Get the part number (aka part name) for the storage device
49  *  @param[in] sysfsPath - The path to the linux sysfs interface.
50  *  @return part name as a string (or "unknown" if it couldn't be retrieved)
51  */
52 std::string getPartNumber(const std::filesystem::path& sysfsPath);
53 
54 /** @brief Get the serial number for the storage device
55  *  @param[in] sysfsPath - The path to the linux sysfs interface.
56  *  @return serial name as a string (or "unknown" if it couldn't be retrieved)
57  */
58 std::string getSerialNumber(const std::filesystem::path& sysfsPath);
59 
60 /** @brief Look for the device described by the provided StorageData.
61  *  @details Currently, this function assumes that there's only one eMMC.
62  *    When we need to support multiple eMMCs, we will put more information in
63  *    the EntityManager config, to differentiate between them. Also, if we
64  *    want to support other types of storage devices, this function will need
65  *    to be updated.
66  *
67  *  @param[in] data - map of properties from the config object.
68  *  @param[in] searchDir - directory to search for devices in sysfs, e.g.
69  *    /sys/block
70  *  @return DeviceInfo - metadata for the device if device is found. Null
71  *  otherwise.
72  */
73 std::optional<DeviceInfo> findDevice(const StorageData& data,
74                                      const std::filesystem::path& searchDir);
75 
76 } // namespace util
77 
78 } // namespace estoraged
79