| .. SPDX-License-Identifier: GPL-2.0 |
| |
| ================================== |
| NVDIMM Runtime Firmware Activation |
| ================================== |
| |
| Some persistent memory devices run a firmware locally on the device / |
| "DIMM" to perform tasks like media management, capacity provisioning, |
| and health monitoring. The process of updating that firmware typically |
| involves a reboot because it has implications for in-flight memory |
| transactions. However, reboots are disruptive and at least the Intel |
| persistent memory platform implementation, described by the Intel ACPI |
| DSM specification [1], has added support for activating firmware at |
| runtime. |
| |
| A native sysfs interface is implemented in libnvdimm to allow platform |
| to advertise and control their local runtime firmware activation |
| capability. |
| |
| The libnvdimm bus object, ndbusX, implements an ndbusX/firmware/activate |
| attribute that shows the state of the firmware activation as one of 'idle', |
| 'armed', 'overflow', and 'busy'. |
| |
| - idle: |
| No devices are set / armed to activate firmware |
| |
| - armed: |
| At least one device is armed |
| |
| - busy: |
| In the busy state armed devices are in the process of transitioning |
| back to idle and completing an activation cycle. |
| |
| - overflow: |
| If the platform has a concept of incremental work needed to perform |
| the activation it could be the case that too many DIMMs are armed for |
| activation. In that scenario the potential for firmware activation to |
| timeout is indicated by the 'overflow' state. |
| |
| The 'ndbusX/firmware/activate' property can be written with a value of |
| either 'live', or 'quiesce'. A value of 'quiesce' triggers the kernel to |
| run firmware activation from within the equivalent of the hibernation |
| 'freeze' state where drivers and applications are notified to stop their |
| modifications of system memory. A value of 'live' attempts |
| firmware activation without this hibernation cycle. The |
| 'ndbusX/firmware/activate' property will be elided completely if no |
| firmware activation capability is detected. |
| |
| Another property 'ndbusX/firmware/capability' indicates a value of |
| 'live' or 'quiesce', where 'live' indicates that the firmware |
| does not require or inflict any quiesce period on the system to update |
| firmware. A capability value of 'quiesce' indicates that firmware does |
| expect and injects a quiet period for the memory controller, but 'live' |
| may still be written to 'ndbusX/firmware/activate' as an override to |
| assume the risk of racing firmware update with in-flight device and |
| application activity. The 'ndbusX/firmware/capability' property will be |
| elided completely if no firmware activation capability is detected. |
| |
| The libnvdimm memory-device / DIMM object, nmemX, implements |
| 'nmemX/firmware/activate' and 'nmemX/firmware/result' attributes to |
| communicate the per-device firmware activation state. Similar to the |
| 'ndbusX/firmware/activate' attribute, the 'nmemX/firmware/activate' |
| attribute indicates 'idle', 'armed', or 'busy'. The state transitions |
| from 'armed' to 'idle' when the system is prepared to activate firmware, |
| firmware staged + state set to armed, and 'ndbusX/firmware/activate' is |
| triggered. After that activation event the nmemX/firmware/result |
| attribute reflects the state of the last activation as one of: |
| |
| - none: |
| No runtime activation triggered since the last time the device was reset |
| |
| - success: |
| The last runtime activation completed successfully. |
| |
| - fail: |
| The last runtime activation failed for device-specific reasons. |
| |
| - not_staged: |
| The last runtime activation failed due to a sequencing error of the |
| firmware image not being staged. |
| |
| - need_reset: |
| Runtime firmware activation failed, but the firmware can still be |
| activated via the legacy method of power-cycling the system. |
| |
| [1]: https://docs.pmem.io/persistent-memory/ |