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