| .. _opal-quiesce: |
| |
| OPAL_QUIESCE |
| ============ |
| |
| The host OS can use OPAL_QUIESCE to ensure CPUs under host control are not |
| executing OPAL. This is useful in crash or shutdown scenarios to try to |
| ensure that CPUs are not holding locks, and is intended to be used with |
| OPAL_SIGNAL_SYSTEM_RESET, for example. |
| |
| Arguments |
| --------- |
| :: |
| |
| uint32_t quiesce_type |
| QUIESCE_HOLD Wait for all target(s) currently executing OPAL to |
| return to the host. Any new OPAL call that is made |
| will be held off until QUIESCE_RESUME. |
| QUIESCE_REJECT Wait for all target(s) currently executing OPAL to |
| return to the host. Any new OPAL call that is made |
| will fail with OPAL_BUSY until QUIESCE_RESUME. |
| QUIESCE_LOCK_BREAK After QUIESCE_HOLD or QUIESCE_REJECT is successful, |
| the CPU can call QUIESCE_LOCK_BREAK to skip all |
| locking in OPAL to give the best chance of making |
| progress in the crash/debug paths. The host should |
| ensure all other CPUs are stopped (e.g., with |
| OPAL_SIGNAL_SYSTEM_RESET) before this call is made, to |
| avoid concurrency. |
| QUIESCE_RESUME Undo the effects of QUIESCE_HOLD/QUIESCE_REJECT and |
| QUIESCE_LOCK_BREAK calls. |
| QUIESCE_RESUME_FAST_REBOOT |
| As above, but also reset the tracking of OS calls |
| into firmware as part of fast reboot (secondaries |
| will never return to OS, but instead be released |
| into a new OS boot). |
| |
| int32_t target_cpu |
| cpu_nr >= 0 The cpu server number of the target cpu to reset. |
| -1 All cpus except the current one should be quiesced. |
| |
| Returns |
| ------- |
| OPAL_SUCCESS |
| The quiesce call was successful. |
| |
| OPAL_PARTIAL |
| Some or all of the CPUs executing OPAL when the call was made did not |
| return to the host after a timeout of 1 second. This is a best effort |
| at quiescing OPAL, and QUIESCE_RESUME must be called to resume normal |
| firmware operation. |
| |
| OPAL_PARAMETER |
| A parameter was incorrect. |
| |
| OPAL_BUSY |
| This CPU was not able to complete the operation, either because another |
| has concurrently started quiescing the system, or because it has not |
| successfully called QUIESCE_HOLD or QUIESCE_REJECT before attempting |
| QUIESCE_LOCK_BREAK or QUIESCE_RESUME. |