1 /*
2  * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 /*!
8  * Header file containing the public API for the System Controller (SC)
9  * Power Management (PM) function. This includes functions for power state
10  * control, clock control, reset control, and wake-up event control.
11  *
12  * @addtogroup PM_SVC (SVC) Power Management Service
13  *
14  * Module for the Power Management (PM) service.
15  *
16  * @{
17  */
18 
19 #ifndef SCI_PM_API_H
20 #define SCI_PM_API_H
21 
22 /* Includes */
23 
24 #include <sci/sci_types.h>
25 #include <sci/svc/rm/sci_rm_api.h>
26 
27 /* Defines */
28 
29 /*!
30  * @name Defines for type widths
31  */
32 /*@{*/
33 #define SC_PM_POWER_MODE_W      2	/* Width of sc_pm_power_mode_t */
34 #define SC_PM_CLOCK_MODE_W      3	/* Width of sc_pm_clock_mode_t */
35 #define SC_PM_RESET_TYPE_W      2	/* Width of sc_pm_reset_type_t */
36 #define SC_PM_RESET_REASON_W    3	/* Width of sc_pm_reset_reason_t */
37 /*@}*/
38 
39 /*!
40  * @name Defines for clock indexes (sc_pm_clk_t)
41  */
42 /*@{*/
43 /*@}*/
44 
45 /*!
46  * @name Defines for ALL parameters
47  */
48 /*@{*/
49 #define SC_PM_CLK_ALL   UINT8_MAX	/* All clocks */
50 /*@}*/
51 
52 /*!
53  * @name Defines for sc_pm_power_mode_t
54  */
55 /*@{*/
56 #define SC_PM_PW_MODE_OFF       0U	/* Power off */
57 #define SC_PM_PW_MODE_STBY      1U	/* Power in standby */
58 #define SC_PM_PW_MODE_LP        2U	/* Power in low-power */
59 #define SC_PM_PW_MODE_ON        3U	/* Power on */
60 /*@}*/
61 
62 /*!
63  * @name Defines for sc_pm_clk_t
64  */
65 /*@{*/
66 #define SC_PM_CLK_SLV_BUS       0U	/* Slave bus clock */
67 #define SC_PM_CLK_MST_BUS       1U	/* Master bus clock */
68 #define SC_PM_CLK_PER           2U	/* Peripheral clock */
69 #define SC_PM_CLK_PHY           3U	/* Phy clock */
70 #define SC_PM_CLK_MISC          4U	/* Misc clock */
71 #define SC_PM_CLK_MISC0         0U	/* Misc 0 clock */
72 #define SC_PM_CLK_MISC1         1U	/* Misc 1 clock */
73 #define SC_PM_CLK_MISC2         2U	/* Misc 2 clock */
74 #define SC_PM_CLK_MISC3         3U	/* Misc 3 clock */
75 #define SC_PM_CLK_MISC4         4U	/* Misc 4 clock */
76 #define SC_PM_CLK_CPU           2U	/* CPU clock */
77 #define SC_PM_CLK_PLL           4U	/* PLL */
78 #define SC_PM_CLK_BYPASS        4U	/* Bypass clock */
79 /*@}*/
80 
81 /*!
82  * @name Defines for sc_pm_clk_mode_t
83  */
84 /*@{*/
85 #define SC_PM_CLK_MODE_ROM_INIT        0U	/* Clock is initialized by ROM. */
86 #define SC_PM_CLK_MODE_OFF             1U	/* Clock is disabled */
87 #define SC_PM_CLK_MODE_ON              2U	/* Clock is enabled. */
88 #define SC_PM_CLK_MODE_AUTOGATE_SW     3U	/* Clock is in SW autogate mode */
89 #define SC_PM_CLK_MODE_AUTOGATE_HW     4U	/* Clock is in HW autogate mode */
90 #define SC_PM_CLK_MODE_AUTOGATE_SW_HW  5U	/* Clock is in SW-HW autogate mode */
91 /*@}*/
92 
93 /*!
94  * @name Defines for sc_pm_clk_parent_t
95  */
96 /*@{*/
97 #define SC_PM_PARENT_XTAL              0U	/* Parent is XTAL. */
98 #define SC_PM_PARENT_PLL0              1U	/* Parent is PLL0 */
99 #define SC_PM_PARENT_PLL1              2U	/* Parent is PLL1 or PLL0/2 */
100 #define SC_PM_PARENT_PLL2              3U	/* Parent in PLL2 or PLL0/4 */
101 #define SC_PM_PARENT_BYPS              4U	/* Parent is a bypass clock. */
102 /*@}*/
103 
104 /*!
105  * @name Defines for sc_pm_reset_type_t
106  */
107 /*@{*/
108 #define SC_PM_RESET_TYPE_COLD          0U	/* Cold reset */
109 #define SC_PM_RESET_TYPE_WARM          1U	/* Warm reset */
110 #define SC_PM_RESET_TYPE_BOARD         2U	/* Board reset */
111 /*@}*/
112 
113 /*!
114  * @name Defines for sc_pm_reset_cause_t
115  */
116 /*@{*/
117 #define SC_PM_RESET_CAUSE_TEMP         0U	/* Reset due to temp panic alarm */
118 #define SC_PM_RESET_CAUSE_FAULT        1U	/* Reset due to fault exception */
119 #define SC_PM_RESET_CAUSE_IRQ          2U	/* Reset due to SCU reset IRQ */
120 #define SC_PM_RESET_CAUSE_WDOG         3U	/* Reset due to SW WDOG */
121 #define SC_PM_RESET_CAUSE_API          4U	/* Reset due to pm_reset() or monitor */
122 /*@}*/
123 
124 /*!
125  * @name Defines for sc_pm_reset_reason_t
126  */
127 /*@{*/
128 #define SC_PM_RESET_REASON_POR         0U	/* Power on reset */
129 #define SC_PM_RESET_REASON_WARM        1U	/* Warm reset */
130 #define SC_PM_RESET_REASON_SW          2U	/* Software reset */
131 #define SC_PM_RESET_REASON_WDOG        3U	/* Watchdog reset */
132 #define SC_PM_RESET_REASON_LOCKUP      4U	/* Lockup reset */
133 #define SC_PM_RESET_REASON_TAMPER      5U	/* Tamper reset */
134 #define SC_PM_RESET_REASON_TEMP        6U	/* Temp reset */
135 #define SC_PM_RESET_REASON_LOW_VOLT    7U	/* Low voltage reset */
136 /*@}*/
137 
138 /*!
139  * @name Defines for sc_pm_sys_if_t
140  */
141 /*@{*/
142 #define SC_PM_SYS_IF_INTERCONNECT       0U	/* System interconnect */
143 #define SC_PM_SYS_IF_MU                 1U	/* AP -> SCU message units */
144 #define SC_PM_SYS_IF_OCMEM              2U	/* On-chip memory (ROM/OCRAM) */
145 #define SC_PM_SYS_IF_DDR                3U	/* DDR memory */
146 /*@}*/
147 
148 /*!
149  * @name Defines for sc_pm_wake_src_t
150  */
151 /*@{*/
152 #define SC_PM_WAKE_SRC_NONE             0U	/* No wake source, used for self-kill */
153 #define SC_PM_WAKE_SRC_SCU              1U	/* Wakeup from SCU to resume CPU (IRQSTEER & GIC powered down) */
154 #define SC_PM_WAKE_SRC_IRQSTEER         2U	/* Wakeup from IRQSTEER to resume CPU (GIC powered down) */
155 #define SC_PM_WAKE_SRC_IRQSTEER_GIC     3U	/* Wakeup from IRQSTEER+GIC to wake CPU  (GIC clock gated) */
156 #define SC_PM_WAKE_SRC_GIC              4U	/* Wakeup from GIC to wake CPU */
157 /*@}*/
158 
159 /* Types */
160 
161 /*!
162  * This type is used to declare a power mode. Note resources only use
163  * SC_PM_PW_MODE_OFF and SC_PM_PW_MODE_ON. The other modes are used only
164  * as system power modes.
165  */
166 typedef uint8_t sc_pm_power_mode_t;
167 
168 /*!
169  * This type is used to declare a clock.
170  */
171 typedef uint8_t sc_pm_clk_t;
172 
173 /*!
174  * This type is used to declare a clock mode.
175  */
176 typedef uint8_t sc_pm_clk_mode_t;
177 
178 /*!
179  * This type is used to declare the clock parent.
180  */
181 typedef uint8_t sc_pm_clk_parent_t;
182 
183 /*!
184  * This type is used to declare clock rates.
185  */
186 typedef uint32_t sc_pm_clock_rate_t;
187 
188 /*!
189  * This type is used to declare a desired reset type.
190  */
191 typedef uint8_t sc_pm_reset_type_t;
192 
193 /*!
194  * This type is used to declare a desired reset type.
195  */
196 typedef uint8_t sc_pm_reset_cause;
197 
198 /*!
199  * This type is used to declare a reason for a reset.
200  */
201 typedef uint8_t sc_pm_reset_reason_t;
202 
203 /*!
204  * This type is used to specify a system-level interface to be power managed.
205  */
206 typedef uint8_t sc_pm_sys_if_t;
207 
208 /*!
209  * This type is used to specify a wake source for CPU resources.
210  */
211 typedef uint8_t sc_pm_wake_src_t;
212 
213 /* Functions */
214 
215 /*!
216  * @name Power Functions
217  * @{
218  */
219 
220 /*!
221  * This function sets the system power mode. Only the owner of the
222  * SC_R_SYSTEM resource can do this.
223  *
224  * @param[in]     ipc         IPC handle
225  * @param[in]     mode        power mode to apply
226  *
227  * @return Returns an error code (SC_ERR_NONE = success).
228  *
229  * Return errors:
230  * - SC_ERR_PARM if invalid mode,
231  * - SC_ERR_NOACCESS if caller not the owner of SC_R_SYSTEM
232  *
233  * @see sc_pm_set_sys_power_mode().
234  */
235 sc_err_t sc_pm_set_sys_power_mode(sc_ipc_t ipc, sc_pm_power_mode_t mode);
236 
237 /*!
238  * This function sets the power mode of a partition.
239  *
240  * @param[in]     ipc         IPC handle
241  * @param[in]     pt          handle of partition
242  * @param[in]     mode        power mode to apply
243  *
244  * @return Returns an error code (SC_ERR_NONE = success).
245  *
246  * Return errors:
247  * - SC_ERR_PARM if invalid partition or mode,
248  * - SC_ERR_NOACCESS if caller's partition is not the owner or
249  *   parent of \a pt
250  *
251  * The power mode of the partitions is a max power any resource will
252  * be set to. Calling this will result in all resources owned
253  * by \a pt to have their power changed to the lower of \a mode or the
254  * individual resource mode set using sc_pm_set_resource_power_mode().
255  */
256 sc_err_t sc_pm_set_partition_power_mode(sc_ipc_t ipc, sc_rm_pt_t pt,
257 					sc_pm_power_mode_t mode);
258 
259 /*!
260  * This function gets the power mode of a partition.
261  *
262  * @param[in]     ipc         IPC handle
263  * @param[in]     pt          handle of partition
264  * @param[out]    mode        pointer to return power mode
265  *
266  * @return Returns an error code (SC_ERR_NONE = success).
267  *
268  * Return errors:
269  * - SC_ERR_PARM if invalid partition
270  */
271 sc_err_t sc_pm_get_sys_power_mode(sc_ipc_t ipc, sc_rm_pt_t pt,
272 				  sc_pm_power_mode_t *mode);
273 
274 /*!
275  * This function sets the power mode of a resource.
276  *
277  * @param[in]     ipc         IPC handle
278  * @param[in]     resource    ID of the resource
279  * @param[in]     mode        power mode to apply
280  *
281  * @return Returns an error code (SC_ERR_NONE = success).
282  *
283  * Return errors:
284  * - SC_ERR_PARM if invalid resource or mode,
285  * - SC_ERR_NOACCESS if caller's partition is not the resource owner
286  *   or parent of the owner
287  *
288  * This function will record the individual resource power mode
289  * and change it if the requested mode is lower than or equal to the
290  * partition power mode set with sc_pm_set_partition_power_mode().
291  * In other words, the power mode of the resource will be the minimum
292  * of the resource power mode and the partition power mode.
293  *
294  * Note some resources are still not accessible even when powered up if bus
295  * transactions go through a fabric not powered up. Examples of this are
296  * resources in display and capture subsystems which require the display
297  * controller or the imaging subsytem to be powered up first.
298  *
299  * Not that resources are grouped into power domains by the underlying
300  * hardware. If any resource in the domain is on, the entire power domain
301  * will be on. Other power domains required to access the resource will
302  * also be turned on. Clocks required to access the peripheral will be
303  * turned on. Refer to the SoC RM for more info on power domains and access
304  * infrastructure (bus fabrics, clock domains, etc.).
305  */
306 sc_err_t sc_pm_set_resource_power_mode(sc_ipc_t ipc, sc_rsrc_t resource,
307 				       sc_pm_power_mode_t mode);
308 
309 /*!
310  * This function gets the power mode of a resource.
311  *
312  * @param[in]     ipc         IPC handle
313  * @param[in]     resource    ID of the resource
314  * @param[out]    mode        pointer to return power mode
315  *
316  * @return Returns an error code (SC_ERR_NONE = success).
317  *
318  * Note only SC_PM_PW_MODE_OFF and SC_PM_PW_MODE_ON are valid. The value
319  * returned does not reflect the power mode of the partition..
320  */
321 sc_err_t sc_pm_get_resource_power_mode(sc_ipc_t ipc, sc_rsrc_t resource,
322 				       sc_pm_power_mode_t *mode);
323 
324 /*!
325  * This function requests the low power mode some of the resources
326  * can enter based on their state. This API is only valid for the
327  * following resources : SC_R_A53, SC_R_A53_0, SC_R_A53_1, SC_A53_2,
328  * SC_A53_3, SC_R_A72, SC_R_A72_0, SC_R_A72_1, SC_R_CC1, SC_R_A35,
329  * SC_R_A35_0, SC_R_A35_1, SC_R_A35_2, SC_R_A35_3.
330  * For all other resources it will return SC_ERR_PARAM.
331  * This function will set the low power mode the cores, cluster
332  * and cluster associated resources will enter when all the cores
333  * in a given cluster execute WFI
334  *
335  * @param[in]     ipc         IPC handle
336  * @param[in]     resource    ID of the resource
337  * @param[in]     mode        power mode to apply
338  *
339  * @return Returns an error code (SC_ERR_NONE = success).
340  *
341  */
342 sc_err_t sc_pm_req_low_power_mode(sc_ipc_t ipc, sc_rsrc_t resource,
343 				  sc_pm_power_mode_t mode);
344 
345 /*!
346  * This function requests low-power mode entry for CPU/cluster
347  * resources. This API is only valid for the following resources:
348  * SC_R_A53, SC_R_A53_x, SC_R_A72, SC_R_A72_x, SC_R_A35, SC_R_A35_x,
349  * SC_R_CCI. For all other resources it will return SC_ERR_PARAM.
350  * For individual core resources, the specified power mode
351  * and wake source will be applied after the core has entered
352  * WFI.  For cluster resources, the specified power mode is
353  * applied after all cores in the cluster have entered low-power mode.
354  * For multicluster resources, the specified power mode is applied
355  * after all clusters have reached low-power mode.
356  *
357  * @param[in]     ipc         IPC handle
358  * @param[in]     resource    ID of the resource
359  * @param[in]     mode        power mode to apply
360  * @param[in]     wake_src    wake source for low-power exit
361  *
362  * @return Returns an error code (SC_ERR_NONE = success).
363  *
364  */
365 sc_err_t sc_pm_req_cpu_low_power_mode(sc_ipc_t ipc, sc_rsrc_t resource,
366 				      sc_pm_power_mode_t mode,
367 				      sc_pm_wake_src_t wake_src);
368 
369 /*!
370  * This function is used to set the resume address of a CPU.
371  *
372  * @param[in]     ipc         IPC handle
373  * @param[in]     resource    ID of the CPU resource
374  * @param[in]     address     64-bit resume address
375  *
376  * @return Returns an error code (SC_ERR_NONE = success).
377  *
378  * Return errors:
379  * - SC_ERR_PARM if invalid resource or address,
380  * - SC_ERR_NOACCESS if caller's partition is not the parent of the
381  *   resource (CPU) owner
382  */
383 sc_err_t sc_pm_set_cpu_resume_addr(sc_ipc_t ipc, sc_rsrc_t resource,
384 				   sc_faddr_t address);
385 
386 /*!
387  * This function is used to set parameters for CPU resume from
388  * low-power mode.
389  *
390  * @param[in]     ipc         IPC handle
391  * @param[in]     resource    ID of the CPU resource
392  * @param[in]     isPrimary   set SC_TRUE if primary wake CPU
393  * @param[in]     address     64-bit resume address
394  *
395  * @return Returns an error code (SC_ERR_NONE = success).
396  *
397  * Return errors:
398  * - SC_ERR_PARM if invalid resource or address,
399  * - SC_ERR_NOACCESS if caller's partition is not the parent of the
400  *   resource (CPU) owner
401  */
402 sc_err_t sc_pm_set_cpu_resume(sc_ipc_t ipc, sc_rsrc_t resource,
403 			      sc_bool_t isPrimary, sc_faddr_t address);
404 
405 /*!
406  * This function requests the power mode configuration for system-level
407  * interfaces including messaging units, interconnect, and memories.  This API
408  * is only valid for the following resources : SC_R_A53, SC_R_A72, and
409  * SC_R_M4_x_PID_y.  For all other resources, it will return SC_ERR_PARAM.
410  * The requested power mode will be captured and applied to system-level
411  * resources as system conditions allow.
412  *
413  * @param[in]     ipc         IPC handle
414  * @param[in]     resource    ID of the resource
415  * @param[in]     sys_if      system-level interface to be configured
416  * @param[in]     hpm         high-power mode for the system interface
417  * @param[in]     lpm         low-power mode for the system interface
418  *
419  * @return Returns an error code (SC_ERR_NONE = success).
420  *
421  */
422 sc_err_t sc_pm_req_sys_if_power_mode(sc_ipc_t ipc, sc_rsrc_t resource,
423 				     sc_pm_sys_if_t sys_if,
424 				     sc_pm_power_mode_t hpm,
425 				     sc_pm_power_mode_t lpm);
426 
427 /* @} */
428 
429 /*!
430  * @name Clock/PLL Functions
431  * @{
432  */
433 
434 /*!
435  * This function sets the rate of a resource's clock/PLL.
436  *
437  * @param[in]     ipc         IPC handle
438  * @param[in]     resource    ID of the resource
439  * @param[in]     clk         clock/PLL to affect
440  * @param[in,out] rate        pointer to rate to set,
441  *                            return actual rate
442  * @return Returns an error code (SC_ERR_NONE = success).
443  *
444  * Return errors:
445  * - SC_ERR_PARM if invalid resource or clock/PLL,
446  * - SC_ERR_NOACCESS if caller's partition is not the resource owner
447  *   or parent of the owner,
448  * - SC_ERR_UNAVAILABLE if clock/PLL not applicable to this resource,
449  * - SC_ERR_LOCKED if rate locked (usually because shared clock/PLL)
450  *
451  * Refer to the [Clock List](@ref CLOCKS) for valid clock/PLL values.
452  */
453 sc_err_t sc_pm_set_clock_rate(sc_ipc_t ipc, sc_rsrc_t resource,
454 			      sc_pm_clk_t clk, sc_pm_clock_rate_t *rate);
455 
456 /*!
457  * This function gets the rate of a resource's clock/PLL.
458  *
459  * @param[in]     ipc         IPC handle
460  * @param[in]     resource    ID of the resource
461  * @param[in]     clk         clock/PLL to affect
462  * @param[out]    rate        pointer to return rate
463  *
464  * @return Returns an error code (SC_ERR_NONE = success).
465  *
466  * Return errors:
467  * - SC_ERR_PARM if invalid resource or clock/PLL,
468  * - SC_ERR_NOACCESS if caller's partition is not the resource owner
469  *   or parent of the owner,
470  * - SC_ERR_UNAVAILABLE if clock/PLL not applicable to this resource
471  *
472  * Refer to the [Clock List](@ref CLOCKS) for valid clock/PLL values.
473  */
474 sc_err_t sc_pm_get_clock_rate(sc_ipc_t ipc, sc_rsrc_t resource,
475 			      sc_pm_clk_t clk, sc_pm_clock_rate_t *rate);
476 
477 /*!
478  * This function enables/disables a resource's clock.
479  *
480  * @param[in]     ipc         IPC handle
481  * @param[in]     resource    ID of the resource
482  * @param[in]     clk         clock to affect
483  * @param[in]     enable      enable if SC_TRUE; otherwise disabled
484  * @param[in]     autog       HW auto clock gating
485  *
486  * If \a resource is SC_R_ALL then all resources owned will be affected.
487  * No error will be returned.
488  *
489  * If \a clk is SC_PM_CLK_ALL, then an error will be returned if any
490  * of the available clocks returns an error.
491  *
492  * @return Returns an error code (SC_ERR_NONE = success).
493  *
494  * Return errors:
495  * - SC_ERR_PARM if invalid resource or clock,
496  * - SC_ERR_NOACCESS if caller's partition is not the resource owner
497  *   or parent of the owner,
498  * - SC_ERR_UNAVAILABLE if clock not applicable to this resource
499  *
500  * Refer to the [Clock List](@ref CLOCKS) for valid clock values.
501  */
502 sc_err_t sc_pm_clock_enable(sc_ipc_t ipc, sc_rsrc_t resource,
503 			    sc_pm_clk_t clk, sc_bool_t enable, sc_bool_t autog);
504 
505 /*!
506  * This function sets the parent of a resource's clock.
507  * This function should only be called when the clock is disabled.
508  *
509  * @param[in]     ipc         IPC handle
510  * @param[in]     resource    ID of the resource
511  * @param[in]     clk         clock to affect
512  * @param[in]     parent      New parent of the clock.
513  *
514  * @return Returns an error code (SC_ERR_NONE = success).
515  *
516  * Return errors:
517  * - SC_ERR_PARM if invalid resource or clock,
518  * - SC_ERR_NOACCESS if caller's partition is not the resource owner
519  *   or parent of the owner,
520  * - SC_ERR_UNAVAILABLE if clock not applicable to this resource
521  * - SC_ERR_BUSY if clock is currently enabled.
522  * - SC_ERR_NOPOWER if resource not powered
523  *
524  * Refer to the [Clock List](@ref CLOCKS) for valid clock values.
525  */
526 sc_err_t sc_pm_set_clock_parent(sc_ipc_t ipc, sc_rsrc_t resource,
527 				sc_pm_clk_t clk, sc_pm_clk_parent_t parent);
528 
529 /*!
530  * This function gets the parent of a resource's clock.
531  *
532  * @param[in]     ipc         IPC handle
533  * @param[in]     resource    ID of the resource
534  * @param[in]     clk         clock to affect
535  * @param[out]     parent     pointer to return parent of clock.
536  *
537  * @return Returns an error code (SC_ERR_NONE = success).
538  *
539  * Return errors:
540  * - SC_ERR_PARM if invalid resource or clock,
541  * - SC_ERR_NOACCESS if caller's partition is not the resource owner
542  *   or parent of the owner,
543  * - SC_ERR_UNAVAILABLE if clock not applicable to this resource
544  *
545  * Refer to the [Clock List](@ref CLOCKS) for valid clock values.
546  */
547 sc_err_t sc_pm_get_clock_parent(sc_ipc_t ipc, sc_rsrc_t resource,
548 				sc_pm_clk_t clk, sc_pm_clk_parent_t *parent);
549 
550 /* @} */
551 
552 /*!
553  * @name Reset Functions
554  * @{
555  */
556 
557 /*!
558  * This function is used to reset the system. Only the owner of the
559  * SC_R_SYSTEM resource can do this.
560  *
561  * @param[in]     ipc         IPC handle
562  * @param[in]     type        reset type
563  *
564  * @return Returns an error code (SC_ERR_NONE = success).
565  *
566  * Return errors:
567  * - SC_ERR_PARM if invalid type,
568  * - SC_ERR_NOACCESS if caller not the owner of SC_R_SYSTEM
569  *
570  * If this function returns, then the reset did not occur due to an
571  * invalid parameter.
572  */
573 sc_err_t sc_pm_reset(sc_ipc_t ipc, sc_pm_reset_type_t type);
574 
575 /*!
576  * This function gets a caller's reset reason.
577  *
578  * @param[in]     ipc         IPC handle
579  * @param[out]    reason      pointer to return reset reason
580  *
581  * @return Returns an error code (SC_ERR_NONE = success).
582  */
583 sc_err_t sc_pm_reset_reason(sc_ipc_t ipc, sc_pm_reset_reason_t *reason);
584 
585 /*!
586  * This function is used to boot a partition.
587  *
588  * @param[in]     ipc          IPC handle
589  * @param[in]     pt           handle of partition to boot
590  * @param[in]     resource_cpu ID of the CPU resource to start
591  * @param[in]     boot_addr    64-bit boot address
592  * @param[in]     resource_mu  ID of the MU that must be powered
593  * @param[in]     resource_dev ID of the boot device that must be powered
594  *
595  * @return Returns an error code (SC_ERR_NONE = success).
596  *
597  * Return errors:
598  * - SC_ERR_PARM if invalid partition, resource, or addr,
599  * - SC_ERR_NOACCESS if caller's partition is not the parent of the
600  *   partition to boot
601  */
602 sc_err_t sc_pm_boot(sc_ipc_t ipc, sc_rm_pt_t pt,
603 		    sc_rsrc_t resource_cpu, sc_faddr_t boot_addr,
604 		    sc_rsrc_t resource_mu, sc_rsrc_t resource_dev);
605 
606 /*!
607  * This function is used to reboot the caller's partition.
608  *
609  * @param[in]     ipc         IPC handle
610  * @param[in]     type        reset type
611  *
612  * If \a type is SC_PM_RESET_TYPE_COLD, then most peripherals owned by
613  * the calling partition will be reset if possible. SC state (partitions,
614  * power, clocks, etc.) is reset. The boot SW of the booting CPU must be
615  * able to handle peripherals that that are not reset.
616  *
617  * If \a type is SC_PM_RESET_TYPE_WARM, then only the boot CPU is reset.
618  * SC state (partitions, power, clocks, etc.) are NOT reset. The boot SW
619  * of the booting CPU must be able to handle peripherals and SC state that
620  * that are not reset.
621  *
622  * If \a type is SC_PM_RESET_TYPE_BOARD, then return with no action.
623  *
624  * If this function returns, then the reset did not occur due to an
625  * invalid parameter.
626  */
627 void sc_pm_reboot(sc_ipc_t ipc, sc_pm_reset_type_t type);
628 
629 /*!
630  * This function is used to reboot a partition.
631  *
632  * @param[in]     ipc         IPC handle
633  * @param[in]     pt          handle of partition to reboot
634  * @param[in]     type        reset type
635  *
636  * If \a type is SC_PM_RESET_TYPE_COLD, then most peripherals owned by
637  * the calling partition will be reset if possible. SC state (partitions,
638  * power, clocks, etc.) is reset. The boot SW of the booting CPU must be
639  * able to handle peripherals that that are not reset.
640  *
641  * If \a type is SC_PM_RESET_TYPE_WARM, then only the boot CPU is reset.
642  * SC state (partitions, power, clocks, etc.) are NOT reset. The boot SW
643  * of the booting CPU must be able to handle peripherals and SC state that
644  * that are not reset.
645  *
646  * If \a type is SC_PM_RESET_TYPE_BOARD, then return with no action.
647  *
648  * @return Returns an error code (SC_ERR_NONE = success).
649  *
650  * Return errors:
651  * - SC_ERR_PARM if invalid partition or type
652  * - SC_ERR_NOACCESS if caller's partition is not the parent of \a pt,
653  *
654  * Most peripherals owned by the partition will be reset if
655  * possible. SC state (partitions, power, clocks, etc.) is reset. The
656  * boot SW of the booting CPU must be able to handle peripherals that
657  * that are not reset.
658  */
659 sc_err_t sc_pm_reboot_partition(sc_ipc_t ipc, sc_rm_pt_t pt,
660 				sc_pm_reset_type_t type);
661 
662 /*!
663  * This function is used to start/stop a CPU.
664  *
665  * @param[in]     ipc         IPC handle
666  * @param[in]     resource    ID of the CPU resource
667  * @param[in]     enable      start if SC_TRUE; otherwise stop
668  * @param[in]     address     64-bit boot address
669  *
670  * @return Returns an error code (SC_ERR_NONE = success).
671  *
672  * Return errors:
673  * - SC_ERR_PARM if invalid resource or address,
674  * - SC_ERR_NOACCESS if caller's partition is not the parent of the
675  *   resource (CPU) owner
676  */
677 sc_err_t sc_pm_cpu_start(sc_ipc_t ipc, sc_rsrc_t resource, sc_bool_t enable,
678 			 sc_faddr_t address);
679 
680 /* @} */
681 
682 #endif /* SCI_PM_API_H */
683 
684 /**@}*/
685