15e5d4451SBrad Bishop extern "C"
25e5d4451SBrad Bishop {
3c98bab51SRamesh Iyyar #include <libpdbg.h>
4c98bab51SRamesh Iyyar }
5c98bab51SRamesh Iyyar 
65e5d4451SBrad Bishop #include "attributes_info.H"
75e5d4451SBrad Bishop 
825e39c84SJayanth Othayoth #include "extensions/phal/common_utils.hpp"
9ad3ff0fdSJayanth Othayoth #include "extensions/phal/create_pel.hpp"
106552de05SJayanth Othayoth #include "extensions/phal/phal_error.hpp"
11e22e8231SJayanth Othayoth #include "util.hpp"
12b181d3bbSRamesh Iyyar 
13c98bab51SRamesh Iyyar #include <libekb.H>
14b181d3bbSRamesh Iyyar 
1575912e83SLakshminarayana R. Kammath #include <ext_interface.hpp>
16f9152b91SRamesh Iyyar #include <nlohmann/json.hpp>
17b181d3bbSRamesh Iyyar #include <phosphor-logging/log.hpp>
18b181d3bbSRamesh Iyyar #include <registration.hpp>
19e22e8231SJayanth Othayoth 
20*e0dd7af4SJayanth Othayoth #include <format>
21*e0dd7af4SJayanth Othayoth 
22b181d3bbSRamesh Iyyar namespace openpower
23b181d3bbSRamesh Iyyar {
24b181d3bbSRamesh Iyyar namespace phal
25b181d3bbSRamesh Iyyar {
26b181d3bbSRamesh Iyyar 
27b181d3bbSRamesh Iyyar using namespace phosphor::logging;
28b181d3bbSRamesh Iyyar 
29b181d3bbSRamesh Iyyar /**
3075912e83SLakshminarayana R. Kammath  *  @brief  Select BOOT SEEPROM and Measurement SEEPROM(PRIMARY/BACKUP) on POWER
3175912e83SLakshminarayana R. Kammath  *          processor position 0/1 depending on boot count before kicking off
3275912e83SLakshminarayana R. Kammath  *          the boot.
3375912e83SLakshminarayana R. Kammath  *
3475912e83SLakshminarayana R. Kammath  *  @return void
3575912e83SLakshminarayana R. Kammath  */
selectBootSeeprom()3675912e83SLakshminarayana R. Kammath void selectBootSeeprom()
3775912e83SLakshminarayana R. Kammath {
3875912e83SLakshminarayana R. Kammath     struct pdbg_target* procTarget;
3975912e83SLakshminarayana R. Kammath     ATTR_BACKUP_SEEPROM_SELECT_Enum bkpSeePromSelect;
4075912e83SLakshminarayana R. Kammath     ATTR_BACKUP_MEASUREMENT_SEEPROM_SELECT_Enum bkpMeaSeePromSelect;
4175912e83SLakshminarayana R. Kammath 
4275912e83SLakshminarayana R. Kammath     pdbg_for_each_class_target("proc", procTarget)
4375912e83SLakshminarayana R. Kammath     {
445c3f9258SAndrew Geissler         if (!isPrimaryProc(procTarget))
4575912e83SLakshminarayana R. Kammath         {
4675912e83SLakshminarayana R. Kammath             continue;
4775912e83SLakshminarayana R. Kammath         }
4875912e83SLakshminarayana R. Kammath 
4975912e83SLakshminarayana R. Kammath         // Choose seeprom side to boot from based on boot count
5075912e83SLakshminarayana R. Kammath         if (getBootCount() > 0)
5175912e83SLakshminarayana R. Kammath         {
5275912e83SLakshminarayana R. Kammath             log<level::INFO>("Setting SBE seeprom side to 0",
5375912e83SLakshminarayana R. Kammath                              entry("SBE_SIDE_SELECT=%d",
5475912e83SLakshminarayana R. Kammath                                    ENUM_ATTR_BACKUP_SEEPROM_SELECT_PRIMARY));
5575912e83SLakshminarayana R. Kammath 
5675912e83SLakshminarayana R. Kammath             bkpSeePromSelect = ENUM_ATTR_BACKUP_SEEPROM_SELECT_PRIMARY;
5775912e83SLakshminarayana R. Kammath             bkpMeaSeePromSelect =
5875912e83SLakshminarayana R. Kammath                 ENUM_ATTR_BACKUP_MEASUREMENT_SEEPROM_SELECT_PRIMARY;
5975912e83SLakshminarayana R. Kammath         }
6075912e83SLakshminarayana R. Kammath         else
6175912e83SLakshminarayana R. Kammath         {
6275912e83SLakshminarayana R. Kammath             log<level::INFO>("Setting SBE seeprom side to 1",
6375912e83SLakshminarayana R. Kammath                              entry("SBE_SIDE_SELECT=%d",
6475912e83SLakshminarayana R. Kammath                                    ENUM_ATTR_BACKUP_SEEPROM_SELECT_SECONDARY));
6575912e83SLakshminarayana R. Kammath             bkpSeePromSelect = ENUM_ATTR_BACKUP_SEEPROM_SELECT_SECONDARY;
6675912e83SLakshminarayana R. Kammath             bkpMeaSeePromSelect =
6775912e83SLakshminarayana R. Kammath                 ENUM_ATTR_BACKUP_MEASUREMENT_SEEPROM_SELECT_SECONDARY;
6875912e83SLakshminarayana R. Kammath         }
6975912e83SLakshminarayana R. Kammath 
7075912e83SLakshminarayana R. Kammath         // Set the Attribute as per bootcount policy for boot seeprom
7175912e83SLakshminarayana R. Kammath         if (DT_SET_PROP(ATTR_BACKUP_SEEPROM_SELECT, procTarget,
7275912e83SLakshminarayana R. Kammath                         bkpSeePromSelect))
7375912e83SLakshminarayana R. Kammath         {
7475912e83SLakshminarayana R. Kammath             log<level::ERR>(
7575912e83SLakshminarayana R. Kammath                 "Attribute [ATTR_BACKUP_SEEPROM_SELECT] set failed");
7675912e83SLakshminarayana R. Kammath             throw std::runtime_error(
7775912e83SLakshminarayana R. Kammath                 "Attribute [ATTR_BACKUP_SEEPROM_SELECT] set failed");
7875912e83SLakshminarayana R. Kammath         }
7975912e83SLakshminarayana R. Kammath 
8075912e83SLakshminarayana R. Kammath         // Set the Attribute as per bootcount policy for measurement seeprom
8175912e83SLakshminarayana R. Kammath         if (DT_SET_PROP(ATTR_BACKUP_MEASUREMENT_SEEPROM_SELECT, procTarget,
8275912e83SLakshminarayana R. Kammath                         bkpMeaSeePromSelect))
8375912e83SLakshminarayana R. Kammath         {
8475912e83SLakshminarayana R. Kammath             log<level::ERR>(
8575912e83SLakshminarayana R. Kammath                 "Attribute [ATTR_BACKUP_MEASUREMENT_SEEPROM_SELECT] set "
8675912e83SLakshminarayana R. Kammath                 "failed");
8775912e83SLakshminarayana R. Kammath             throw std::runtime_error(
8875912e83SLakshminarayana R. Kammath                 "Attribute [ATTR_BACKUP_MEASUREMENT_SEEPROM_SELECT] set "
8975912e83SLakshminarayana R. Kammath                 "failed");
9075912e83SLakshminarayana R. Kammath         }
9175912e83SLakshminarayana R. Kammath     }
9275912e83SLakshminarayana R. Kammath }
9375912e83SLakshminarayana R. Kammath 
9475912e83SLakshminarayana R. Kammath /**
95e22e8231SJayanth Othayoth  * @brief Read the HW Level from VPD and set CLK NE termination site
96e22e8231SJayanth Othayoth  * Note any failure in this function will result startHost failure.
97e22e8231SJayanth Othayoth  */
setClkNETerminationSite()98e22e8231SJayanth Othayoth void setClkNETerminationSite()
99e22e8231SJayanth Othayoth {
100e22e8231SJayanth Othayoth     // Get Motherborad VINI Recored "HW" keyword
101e22e8231SJayanth Othayoth     constexpr auto objPath =
102e22e8231SJayanth Othayoth         "/xyz/openbmc_project/inventory/system/chassis/motherboard";
103e22e8231SJayanth Othayoth     constexpr auto kwdVpdInf = "com.ibm.ipzvpd.VINI";
104e22e8231SJayanth Othayoth     constexpr auto hwKwd = "HW";
105e22e8231SJayanth Othayoth 
106e22e8231SJayanth Othayoth     auto bus = sdbusplus::bus::new_default();
107e22e8231SJayanth Othayoth 
108e22e8231SJayanth Othayoth     std::string service = util::getService(bus, objPath, kwdVpdInf);
109e22e8231SJayanth Othayoth 
110e22e8231SJayanth Othayoth     auto properties = bus.new_method_call(
111e22e8231SJayanth Othayoth         service.c_str(), objPath, "org.freedesktop.DBus.Properties", "Get");
112e22e8231SJayanth Othayoth     properties.append(kwdVpdInf);
113e22e8231SJayanth Othayoth     properties.append(hwKwd);
114e22e8231SJayanth Othayoth 
115e22e8231SJayanth Othayoth     // Store "HW" Keyword data.
116e22e8231SJayanth Othayoth     std::variant<std::vector<uint8_t>> val;
117e22e8231SJayanth Othayoth     try
118e22e8231SJayanth Othayoth     {
119e22e8231SJayanth Othayoth         auto result = bus.call(properties);
120e22e8231SJayanth Othayoth         result.read(val);
121e22e8231SJayanth Othayoth     }
122aaea6867SPatrick Williams     catch (const sdbusplus::exception_t& e)
123e22e8231SJayanth Othayoth     {
124e22e8231SJayanth Othayoth         log<level::ERR>("Get HW Keyword read from VINI Failed");
125e22e8231SJayanth Othayoth         throw std::runtime_error("Get HW Keyword read from VINI Failed");
126e22e8231SJayanth Othayoth     }
127e22e8231SJayanth Othayoth 
128e22e8231SJayanth Othayoth     auto hwData = std::get<std::vector<uint8_t>>(val);
129e22e8231SJayanth Othayoth 
130e22e8231SJayanth Othayoth     //"HW" Keyword size is 2 as per VPD spec.
131e22e8231SJayanth Othayoth     constexpr auto hwKwdSize = 2;
132e22e8231SJayanth Othayoth     if (hwKwdSize != hwData.size())
133e22e8231SJayanth Othayoth     {
134e22e8231SJayanth Othayoth         log<level::ERR>(
135*e0dd7af4SJayanth Othayoth             std::format("Incorrect VINI records HW Keyword data size({})",
136e22e8231SJayanth Othayoth                         hwData.size())
137e22e8231SJayanth Othayoth                 .c_str());
138e22e8231SJayanth Othayoth         throw std::runtime_error("Incorrect VINI records HW Keyword data size");
139e22e8231SJayanth Othayoth     }
140e22e8231SJayanth Othayoth 
141*e0dd7af4SJayanth Othayoth     log<level::DEBUG>(std::format("VINI Records HW[0]:{} HW[1]:{}",
142e22e8231SJayanth Othayoth                                   hwData.at(0), hwData.at(1))
143e22e8231SJayanth Othayoth                           .c_str());
144e22e8231SJayanth Othayoth 
145e22e8231SJayanth Othayoth     // VINI Record "HW" keyword's Byte 0's MSB bit indicates
146e22e8231SJayanth Othayoth     // proc or planar type need to choose.
147e22e8231SJayanth Othayoth     constexpr uint8_t SYS_CLK_NE_TERMINATION_ON_MASK = 0x80;
148e22e8231SJayanth Othayoth 
149e22e8231SJayanth Othayoth     ATTR_SYS_CLK_NE_TERMINATION_SITE_Type clockTerm =
150e22e8231SJayanth Othayoth         ENUM_ATTR_SYS_CLK_NE_TERMINATION_SITE_PLANAR;
151e22e8231SJayanth Othayoth 
152e22e8231SJayanth Othayoth     if (SYS_CLK_NE_TERMINATION_ON_MASK & hwData.at(0))
153e22e8231SJayanth Othayoth     {
154e22e8231SJayanth Othayoth         clockTerm = ENUM_ATTR_SYS_CLK_NE_TERMINATION_SITE_PROC;
155e22e8231SJayanth Othayoth     }
156e22e8231SJayanth Othayoth 
157e22e8231SJayanth Othayoth     // update all the processor attributes
158e22e8231SJayanth Othayoth     struct pdbg_target* procTarget;
159e22e8231SJayanth Othayoth     pdbg_for_each_class_target("proc", procTarget)
160e22e8231SJayanth Othayoth     {
161e22e8231SJayanth Othayoth         if (DT_SET_PROP(ATTR_SYS_CLK_NE_TERMINATION_SITE, procTarget,
162e22e8231SJayanth Othayoth                         clockTerm))
163e22e8231SJayanth Othayoth         {
164e22e8231SJayanth Othayoth             log<level::ERR>(
165e22e8231SJayanth Othayoth                 "Attribute ATTR_SYS_CLK_NE_TERMINATION_SITE set failed");
166e22e8231SJayanth Othayoth             throw std::runtime_error(
167e22e8231SJayanth Othayoth                 "Attribute ATTR_SYS_CLK_NE_TERMINATION_SITE set failed");
168e22e8231SJayanth Othayoth         }
169e22e8231SJayanth Othayoth     }
170e22e8231SJayanth Othayoth }
171e22e8231SJayanth Othayoth 
172e22e8231SJayanth Othayoth /**
173f9152b91SRamesh Iyyar  * @brief Helper function to create error log (aka PEL) with
174f9152b91SRamesh Iyyar  *        procedure callout for the hardware isolation policy
175f9152b91SRamesh Iyyar  *        settings failures.
176f9152b91SRamesh Iyyar  *
177f9152b91SRamesh Iyyar  * @param[in] procedureCode - The procedure code to include in the callout
178f9152b91SRamesh Iyyar  * @param[in] priority - The priority for the procedure callout
179f9152b91SRamesh Iyyar  * @param[in] additionalData - The additional data to include in the error log
180f9152b91SRamesh Iyyar  *
181f9152b91SRamesh Iyyar  * @return void
182f9152b91SRamesh Iyyar  */
183f9152b91SRamesh Iyyar static void
createPELForHwIsolationSettingsErr(const std::string & procedureCode,const std::string & priority,const pel::FFDCData & additionalData)184f9152b91SRamesh Iyyar     createPELForHwIsolationSettingsErr(const std::string& procedureCode,
185f9152b91SRamesh Iyyar                                        const std::string& priority,
186f9152b91SRamesh Iyyar                                        const pel::FFDCData& additionalData)
187f9152b91SRamesh Iyyar {
188f9152b91SRamesh Iyyar     try
189f9152b91SRamesh Iyyar     {
190f9152b91SRamesh Iyyar         using json = nlohmann::json;
1914d5b5bfeSMarri Devender Rao         using Severity =
1924d5b5bfeSMarri Devender Rao             sdbusplus::xyz::openbmc_project::Logging::server::Entry::Level;
193f9152b91SRamesh Iyyar 
194f9152b91SRamesh Iyyar         json jsonCalloutDataList;
195f9152b91SRamesh Iyyar         jsonCalloutDataList = json::array();
196f9152b91SRamesh Iyyar         json jsonCalloutData;
197f9152b91SRamesh Iyyar         jsonCalloutData["Procedure"] = procedureCode;
198f9152b91SRamesh Iyyar         jsonCalloutData["Priority"] = priority;
199f9152b91SRamesh Iyyar         jsonCalloutDataList.emplace_back(jsonCalloutData);
200f9152b91SRamesh Iyyar 
201f9152b91SRamesh Iyyar         openpower::pel::createErrorPEL("org.open_power.PHAL.Error.Boot",
2024d5b5bfeSMarri Devender Rao                                        jsonCalloutDataList, additionalData,
2034d5b5bfeSMarri Devender Rao                                        Severity::Error);
204f9152b91SRamesh Iyyar     }
205f9152b91SRamesh Iyyar     catch (const std::exception& e)
206f9152b91SRamesh Iyyar     {
207f9152b91SRamesh Iyyar         // Don't throw exception since the caller might call in the error path
208f9152b91SRamesh Iyyar         // and even we should allow the hardware isolation by default.
209f9152b91SRamesh Iyyar         log<level::ERR>(
210*e0dd7af4SJayanth Othayoth             std::format("Exception [{}], failed to create the error log "
211f9152b91SRamesh Iyyar                         "for the hardware isolation policy settings failures.",
212f9152b91SRamesh Iyyar                         e.what())
213f9152b91SRamesh Iyyar                 .c_str());
214f9152b91SRamesh Iyyar     }
215f9152b91SRamesh Iyyar }
216f9152b91SRamesh Iyyar 
217f9152b91SRamesh Iyyar /**
218f9152b91SRamesh Iyyar  * @brief Helper function to decide the hardware isolation (aka guard)
219f9152b91SRamesh Iyyar  *
220f9152b91SRamesh Iyyar  * @return xyz.openbmc_project.Object.Enable::Enabled value on success
221f9152b91SRamesh Iyyar  *         true on failure since hardware isolation feature should be
222f9152b91SRamesh Iyyar  *         enabled by default.
223f9152b91SRamesh Iyyar  */
allowHwIsolation()224f9152b91SRamesh Iyyar static bool allowHwIsolation()
225f9152b91SRamesh Iyyar {
226f9152b91SRamesh Iyyar     bool allowHwIsolation{true};
227f9152b91SRamesh Iyyar 
228f9152b91SRamesh Iyyar     constexpr auto hwIsolationPolicyObjPath =
229f9152b91SRamesh Iyyar         "/xyz/openbmc_project/hardware_isolation/allow_hw_isolation";
230f9152b91SRamesh Iyyar     constexpr auto hwIsolationPolicyIface = "xyz.openbmc_project.Object.Enable";
231f9152b91SRamesh Iyyar 
232f9152b91SRamesh Iyyar     try
233f9152b91SRamesh Iyyar     {
234f9152b91SRamesh Iyyar         auto bus = sdbusplus::bus::new_default();
235f9152b91SRamesh Iyyar 
236f9152b91SRamesh Iyyar         std::string service = util::getService(bus, hwIsolationPolicyObjPath,
237f9152b91SRamesh Iyyar                                                hwIsolationPolicyIface);
238f9152b91SRamesh Iyyar 
239f9152b91SRamesh Iyyar         auto method =
240f9152b91SRamesh Iyyar             bus.new_method_call(service.c_str(), hwIsolationPolicyObjPath,
241f9152b91SRamesh Iyyar                                 "org.freedesktop.DBus.Properties", "Get");
242f9152b91SRamesh Iyyar         method.append(hwIsolationPolicyIface, "Enabled");
243f9152b91SRamesh Iyyar 
244f9152b91SRamesh Iyyar         auto reply = bus.call(method);
245f9152b91SRamesh Iyyar 
246f9152b91SRamesh Iyyar         std::variant<bool> resp;
247f9152b91SRamesh Iyyar 
248f9152b91SRamesh Iyyar         reply.read(resp);
249f9152b91SRamesh Iyyar 
250f9152b91SRamesh Iyyar         if (const bool* enabledPropVal = std::get_if<bool>(&resp))
251f9152b91SRamesh Iyyar         {
252f9152b91SRamesh Iyyar             allowHwIsolation = *enabledPropVal;
253f9152b91SRamesh Iyyar         }
254f9152b91SRamesh Iyyar         else
255f9152b91SRamesh Iyyar         {
256*e0dd7af4SJayanth Othayoth             const auto trace{std::format(
257f9152b91SRamesh Iyyar                 "Failed to read the HardwareIsolation policy "
258f9152b91SRamesh Iyyar                 "from the path [{}] interface [{}]. Continuing with "
259f9152b91SRamesh Iyyar                 "default mode(allow_hw_isolation)",
260f9152b91SRamesh Iyyar                 hwIsolationPolicyObjPath, hwIsolationPolicyIface)};
261f9152b91SRamesh Iyyar 
262f9152b91SRamesh Iyyar             log<level::ERR>(trace.c_str());
263f9152b91SRamesh Iyyar             createPELForHwIsolationSettingsErr("BMC0001", "M",
264f9152b91SRamesh Iyyar                                                {{"REASON_FOR_PEL", trace}});
265f9152b91SRamesh Iyyar         }
266f9152b91SRamesh Iyyar     }
267aaea6867SPatrick Williams     catch (const sdbusplus::exception_t& e)
268f9152b91SRamesh Iyyar     {
269*e0dd7af4SJayanth Othayoth         const auto trace{std::format(
270f9152b91SRamesh Iyyar             "Exception [{}] to get the HardwareIsolation policy "
271f9152b91SRamesh Iyyar             "from the path [{}] interface [{}]. Continuing with "
272f9152b91SRamesh Iyyar             "default mode (allow_hw_isolation)",
273f9152b91SRamesh Iyyar             e.what(), hwIsolationPolicyObjPath, hwIsolationPolicyIface)};
274f9152b91SRamesh Iyyar 
275f9152b91SRamesh Iyyar         log<level::ERR>(trace.c_str());
276f9152b91SRamesh Iyyar         createPELForHwIsolationSettingsErr("BMC0001", "M",
277f9152b91SRamesh Iyyar                                            {{"REASON_FOR_PEL", trace}});
278f9152b91SRamesh Iyyar     }
279f9152b91SRamesh Iyyar 
280f9152b91SRamesh Iyyar     return allowHwIsolation;
281f9152b91SRamesh Iyyar }
282f9152b91SRamesh Iyyar 
283f9152b91SRamesh Iyyar /**
284b181d3bbSRamesh Iyyar  * @brief Starts the self boot engine on POWER processor position 0
285b181d3bbSRamesh Iyyar  *        to kick off a boot.
286b181d3bbSRamesh Iyyar  * @return void
287b181d3bbSRamesh Iyyar  */
startHost(enum ipl_type iplType=IPL_TYPE_NORMAL)288c2e42763SDhruvaraj Subhashchandran void startHost(enum ipl_type iplType = IPL_TYPE_NORMAL)
289b181d3bbSRamesh Iyyar {
290a257693aSChirag Sharma     try
291c98bab51SRamesh Iyyar     {
292a257693aSChirag Sharma         phal_init();
293c2e42763SDhruvaraj Subhashchandran         ipl_set_type(iplType);
294f9152b91SRamesh Iyyar 
295f9152b91SRamesh Iyyar         /**
296f9152b91SRamesh Iyyar          * Don't apply guard records if the HardwareIsolation (aka guard)
297f9152b91SRamesh Iyyar          * the policy is disabled (false). By default, libipl will apply
298f9152b91SRamesh Iyyar          * guard records.
299f9152b91SRamesh Iyyar          */
300f9152b91SRamesh Iyyar         if (!allowHwIsolation())
301f9152b91SRamesh Iyyar         {
302f9152b91SRamesh Iyyar             ipl_disable_guard();
303f9152b91SRamesh Iyyar         }
304f9152b91SRamesh Iyyar 
305ad3ff0fdSJayanth Othayoth         if (iplType == IPL_TYPE_NORMAL)
306ad3ff0fdSJayanth Othayoth         {
307ad3ff0fdSJayanth Othayoth             // Update SEEPROM side only for NORMAL boot
308ad3ff0fdSJayanth Othayoth             selectBootSeeprom();
309ad3ff0fdSJayanth Othayoth         }
310ad3ff0fdSJayanth Othayoth         setClkNETerminationSite();
311a257693aSChirag Sharma     }
3121a9a5a6aSPatrick Williams     catch (const std::exception& ex)
313a257693aSChirag Sharma     {
314ad3ff0fdSJayanth Othayoth         log<level::ERR>("Exception raised during ipl initialisation",
315a257693aSChirag Sharma                         entry("EXCEPTION=%s", ex.what()));
316ad3ff0fdSJayanth Othayoth         openpower::pel::createPEL("org.open_power.PHAL.Error.Boot");
3172b211701SJayanth Othayoth         openpower::pel::detail::processBootError(false);
318ad3ff0fdSJayanth Othayoth         throw std::runtime_error("IPL initialization failed");
319a257693aSChirag Sharma     }
320c2e42763SDhruvaraj Subhashchandran 
321c98bab51SRamesh Iyyar     // To clear trace if success
3222b211701SJayanth Othayoth     openpower::pel::detail::processBootError(true);
323b181d3bbSRamesh Iyyar 
32478479605SMarri Devender Rao     // callback method will be called upon failure which will create the PEL
32578479605SMarri Devender Rao     int rc = ipl_run_major(0);
32678479605SMarri Devender Rao     if (rc > 0)
327b181d3bbSRamesh Iyyar     {
328b181d3bbSRamesh Iyyar         log<level::ERR>("step 0 failed to start the host");
32978479605SMarri Devender Rao         throw std::runtime_error("Failed to execute host start boot step");
330b181d3bbSRamesh Iyyar     }
331b181d3bbSRamesh Iyyar }
332b181d3bbSRamesh Iyyar 
333c2e42763SDhruvaraj Subhashchandran /**
334c2e42763SDhruvaraj Subhashchandran  * @brief Starts the reboot with type memory preserving reboot.
335c2e42763SDhruvaraj Subhashchandran  * @return void
336c2e42763SDhruvaraj Subhashchandran  */
startHostMpReboot()337c2e42763SDhruvaraj Subhashchandran void startHostMpReboot()
338c2e42763SDhruvaraj Subhashchandran {
339c2e42763SDhruvaraj Subhashchandran     // set ipl type as mpipl
340c2e42763SDhruvaraj Subhashchandran     startHost(IPL_TYPE_MPIPL);
341c2e42763SDhruvaraj Subhashchandran }
342c2e42763SDhruvaraj Subhashchandran 
343c2e42763SDhruvaraj Subhashchandran /**
344c2e42763SDhruvaraj Subhashchandran  * @brief Starts the normal boot type.
345c2e42763SDhruvaraj Subhashchandran  * @return void
346c2e42763SDhruvaraj Subhashchandran  */
startHostNormal()347c2e42763SDhruvaraj Subhashchandran void startHostNormal()
348c2e42763SDhruvaraj Subhashchandran {
349ad3ff0fdSJayanth Othayoth     startHost(IPL_TYPE_NORMAL);
350c2e42763SDhruvaraj Subhashchandran }
351c2e42763SDhruvaraj Subhashchandran 
35263508a73SBrad Bishop REGISTER_PROCEDURE("startHost", startHostNormal)
35363508a73SBrad Bishop REGISTER_PROCEDURE("startHostMpReboot", startHostMpReboot)
354b181d3bbSRamesh Iyyar 
355b181d3bbSRamesh Iyyar } // namespace phal
356b181d3bbSRamesh Iyyar } // namespace openpower
357