NDCTL-UPDATE-FIRMWARE(1)

✨ NAME ✨

ndctl-update-firmware β€” bestie, this is the one that updates the firmware on the device you point at πŸ’–


πŸ¦‹ SYNOPSIS πŸ¦‹

ndctl update-firmware <dimm> [<options>]

πŸ’– DESCRIPTION πŸ’–

Okay so picture this: you need to flash new firmware onto an NVDIMM, and ndctl update-firmware is the generic little interface for exactly that. Iconic. But β€” and this is the important part β€” it only works if three things line up:

  • libndctl has support for the NVDIMM "family"
  • the kernel has that command set enabled
  • the device itself actually implements the command

Not every device is gonna serve, and that's just the vibe check. So how do you find out if firmware update is even on the table? Run ndctl list -DF, fr fr. Like this:

ndctl list -DFu -d nmem1
{
  "dev":"nmem1",
  "id":"cdab-0a-07e0-ffffffff",
  "handle":"0",
  "phys_id":"0",
  "security":"disabled",
  "firmware":{
    "current_version":"0",
    "can_update":true
  }
}

See that "can_update":true? That's your green light, slay πŸ’…


πŸŽ€ OPTIONS πŸŽ€

  • <dimm> β€” a nmemX device name, or a dimm id number. Restricts the whole operation to the dimm(s) you named. You can pass the keyword all to say "no restrictions whatsoever", but lowkey that's the exact same thing as just not passing a --dimm option at all 🫢
  • -b, --bus= β€” a bus id number, or a provider string (like "ACPI.NFIT"). Restricts the operation to the bus(es) you named. Same deal as above: the keyword all means "no restriction", which is literally identical to not supplying a --bus option at all.
  • -f, --firmware β€” the firmware file used to perform the update πŸ“
  • -i, --force β€” Ignore an in-progress Address Range Scrub and try to submit the firmware update anyway, or ignore firmware activate arm overflows and force-arm devices. Use with intention, bestie.
  • -A, --arm β€” Arm a device for firmware activation. This is enabled by default whenever a firmware image is specified β€” so if you don't want it, specify --no-arm to disable that default. But also: with no firmware image at all, you can use this option to manually arm a device for firmware activate.

Here's the tea: when a device transitions from unarmed β†’ armed, the platform recalculates the firmware activation time and compares it against the maximum platform supported time. If that activation time would exceed the platform maximum, the arm attempt gets aborted:

ndctl update-firmware --arm --bus=nfit_test.0 all
  Error: update firmware: nmem4: arm aborted, tripped overflow
[
  {
    "dev":"nmem1",
    "id":"cdab-0a-07e0-ffffffff",
    "handle":"0",
    "phys_id":"0",
    "security":"disabled",
    "firmware":{
      "current_version":"0",
      "can_update":true
    }
  },
  {
    "dev":"nmem3",
    "id":"cdab-0a-07e0-fffeffff",
    "handle":"0x100",
    "phys_id":"0x2",
    "security":"disabled",
    "firmware":{
      "current_version":"0",
      "can_update":true
    }
  },
  {
    "dev":"nmem2",
    "id":"cdab-0a-07e0-feffffff",
    "handle":"0x1",
    "phys_id":"0x1",
    "security":"disabled",
    "firmware":{
      "current_version":"0",
      "can_update":true
    }
  }
]
updated 3 nmems.
It is possible, but not recommended, to ignore timeout overflows with the --force option. Not me warning you twice πŸ™ˆ

And at any point, if you wanna see the 'armed' state of the bus, just do:

ndctl list -BF -b nfit_test.0
[
  {
    "provider":"nfit_test.0",
    "dev":"ndbus2",
    "scrub_state":"idle",
    "firmware":{
      "activate_method":"suspend",
      "activate_state":"overflow"
    }
  }
]
  • -D, --disarm β€” Disarm devices after uploading the firmware file, or manually disarm devices when a firmware image isn't specified. Heads up: --no-disarm is not accepted. Periodt.
  • -v, --verbose β€” Emit debug messages for the namespace check process πŸ”

Copyright Β© 2016 - 2022, Intel Corporation. License GPLv2: GNU GPL version 2 http://gnu.org/licenses/gpl.html. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.


okay that's the whole page, you're all caught up πŸ¦‹ this was ndctl update-firmware from the ndctl Manual, dated 2026-07-07 β€” the manual page is literally called NDCTL-UPDATE-FIRMWARE(1) and honestly? she ate πŸ’…βœ¨

πŸ“¦ where this page comes from