87 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
| .. 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/
 |