xref: /openbmc/openpower-vpd-parser/vpd-manager/include/single_fab.hpp (revision ffdff3132f2e523d7d444900c81cea706ec69f8f)
1 #pragma once
2 
3 #include "constants.hpp"
4 #include "event_logger.hpp"
5 
6 #include <string>
7 
8 namespace vpd
9 {
10 /**
11  * @brief class to implement single fab feature.
12  *
13  * The class hosts functionalities required to support single FAB feature.
14  *
15  */
16 class SingleFab
17 {
18   public:
19     /**
20      * @brief API to support single FAB feature.
21      *
22      * This API updates the IM value to the P11 series or creates PEL in invalid
23      * case based on the IM value read from the cache and planar, considering
24      * the system mode and image.
25      *
26      * System mode can be of field mode or lab mode and system image can be
27      * special or normal image.
28      *
29      * @return 0 on success, -1 in case of failure.
30      */
31     int singleFabImOverride() const noexcept;
32 
33   private:
34     /**
35      * @brief API to get IM value from persisted location.
36      *
37      * @return IM value on success, empty string otherwise.
38      */
39     std::string getImFromPersistedLocation() const noexcept;
40 
41     /**
42      * @brief API to get IM value from system planar EEPROM path.
43      *
44      * @return IM value on success, empty string otherwise.
45      */
46     std::string getImFromPlanar() const noexcept;
47 
48     /**
49      * @brief API to update IM value on system planar EEPROM path.
50      *
51      * @param[in] i_imValue - IM value to be updated.
52      *
53      * @return true if value updated successfully, otherwise false.
54      */
55     bool setImOnPlanar(const std::string& i_imValue) const noexcept;
56 
57     /**
58      * @brief API to check is field mode enabled.
59      *
60      * @return true, if field mode is enabled. otherwise false.
61      */
62     bool isFieldModeEnabled() const noexcept;
63 
64     /**
65      * @brief API to update IM value on system planar EEPROM path to P11 series.
66      *
67      * @param[in] i_currentImValuePlanar - current IM value in planar EEPROM.
68      */
69     void updateSystemImValueInVpdToP11Series(
70         std::string i_currentImValuePlanar) const noexcept;
71 
72     /**
73      * @brief API to check if it is a P10 system.
74      *
75      * @param[in] i_imValue - IM value of the system.
76      *
77      * @return true, if P10 system. Otherwise false.
78      */
isP10System(const std::string & i_imValue) const79     inline bool isP10System(const std::string& i_imValue) const noexcept
80     {
81         try
82         {
83             return !(i_imValue.compare(constants::VALUE_0, constants::VALUE_4,
84                                        POWER10_IM_SERIES));
85         }
86         catch (const std::exception& l_ex)
87         {
88             EventLogger::createSyncPel(
89                 types::ErrorType::InternalFailure,
90                 types::SeverityType::Informational, __FILE__, __FUNCTION__, 0,
91                 std::string(
92                     "Failed to check if system is of P10 series. Error : ") +
93                     l_ex.what(),
94                 std::nullopt, std::nullopt, std::nullopt, std::nullopt);
95             return false;
96         }
97     }
98 
99     /**
100      * @brief API to check if it is a P11 system.
101      *
102      * @param[in] i_imValue - IM value of the system.
103      *
104      * @return true, if P11 system. Otherwise false.
105      */
isP11System(const std::string & i_imValue) const106     inline bool isP11System(const std::string& i_imValue) const noexcept
107     {
108         try
109         {
110             return !(i_imValue.compare(constants::VALUE_0, constants::VALUE_4,
111                                        POWER11_IM_SERIES));
112         }
113         catch (const std::exception& l_ex)
114         {
115             EventLogger::createSyncPel(
116                 types::ErrorType::InternalFailure,
117                 types::SeverityType::Informational, __FILE__, __FUNCTION__, 0,
118                 std::string(
119                     "Failed to check if system is of P11 series. Error : ") +
120                     l_ex.what(),
121                 std::nullopt, std::nullopt, std::nullopt, std::nullopt);
122             return false;
123         }
124     }
125 
126     /**
127      * @brief API to check if it is a valid IM series.
128      *
129      * This API checks if the provided IM value is of either P10 or P11 series.
130      *
131      * @param[in] i_imValue - IM value of the system.
132      *
133      * @return true, if valid IM series. Otherwise false.
134      */
isValidImSeries(const std::string & l_imValue) const135     inline bool isValidImSeries(const std::string& l_imValue) const noexcept
136     {
137         return (isP10System(l_imValue) || isP11System(l_imValue));
138     }
139 
140     // valid IM series.
141     static constexpr auto POWER10_IM_SERIES = "5000";
142     static constexpr auto POWER11_IM_SERIES = "6000";
143 };
144 } // namespace vpd
145