Updating HP BIOS firmware from Linux

I have an HP Elitebook 845 G8 laptop. I wanted to update the BIOS/UEFI firmware to the latest version. This is important because firmware updates include essential security fixes.

On Linux you can use the LVFS (Linux Vendor Firmware Service) to easily install firmware updates with the fwupd utility or any of its graphical front-ends (such as GNOME Software or KDE Discover). Dell and Lenovo offer firmware updates for many of their systems via LVFS, however HP only has a very small number of firmware updates available on LVFS.

Fortunately it is possible to install firmware updates without having Windows installed, but it’s a bit more manual work. Here I will explain how I managed to update my Elitebook 845 G8, but this should work for most recent HP laptops and desktops.

First you need to download the firmware update for your system. Use your favourite web search engine and search for the model name and add the word downloads to it, for example: HP Elitebook 845 G8 downloads. The first hit will probably bring you to the right page, in my case: https://support.hp.com/us-en/drivers/selfservice/hp-elitebook-845-g8-notebook-pc/38492638

If you don’t know the exact model of your system, use this command (as root):

# /usr/sbin/dmidecode | grep "Product Name"

On the HP downloads page, you will probably get a mssage that it was unable to find drivers for your product. Click on the link Choose a different OS and select any Windows 10 version. Now you will find the latest firmware for your system under BIOS-System Firmware. Click on Download. It will try to let you install a Windows Download and Install Assistant: click on No thanks, I will download and install manually to directly get the firmware file, which should have a name similar to sp138978.exe.

Once you have downloaded this file, we need to extract it. You can use 7-Zip for that. Make sure it is installed on your system:

# apt-install 7zip

Then we will make a directory and extract the firmware package in it:

$ mkdir /tmp/hpfirmware
$ cd /tmp/hpfirmware
$ 7zz x  ~/Downloads/sp138978.exe

You will see many files in the /tmp/hpfirmware directory, such as the History.txt file which you can read if you want to know which changes and bug fixes this update brings. The firmware itself is stored in a file with the extension .bin, in my case it’s named T82_01082000.bin.

To install this firmware, we have to copy it to a directory HP/DEVFW/firmware.bin in your EFI directory (this assumes that you are booting your system in UEFI mode and not in legacy BIOS mode). So as root run these commands from the /tmp/hpfirmware directory:

# mkdir -p /boot/efi/EFI/HP/DEVFW
# cp *.bin /boot/efi/EFI/HP/DEVFW/firmware.bin

Now reboot your system. In GRUB’s menu, choose UEFI Firmware Settings. You will get HP’s Startup Menu of which the last menu item is Update System and Supported Device Firmware. This should now automatically install the firmware update. This takes several minutes , and you screen will go blank during some time: don’t panic and let it run.

7 thoughts on “Updating HP BIOS firmware from Linux

  1. Thanks for your instructions! Only additional note if you have multiple bin files, is to just rename the one specific to your environment to firmware.bin.

  2. @Gert THANK YOU.
    I did this like ten time in Linux Mint before I saw your note and realized the problem.

  3. What an interesting blog post – thank you very much!
    Unfortunately, there doesn’t seem to be a way to update other parts of the hardware with new firmware versions. For the EliteBook 845 G8, for example, there is an update for the SSD firmware. But then you need Windows to run the .exe. Or do you have a suggestion on how to update things like SSD, USB controller or mobile broadband module?

  4. Thanks a lot for this guide. Worked like a charm on my Elitebook 645 G9.

    I only had to adjust the path where to copy the .bin file, since my EFI partition was /boot/EFI and not /boot/efi/EFI

  5. You saved my life! I have a problem where sometimes my complete USB controller dies. Even after reboot the problem persists. Last time I got lucky because there was a new firmware and the update revived the controller. This time I tried to re-flash the same firmware in windows, but that was denied :-(
    BUT: with your solution from Linux it worked! Yay for you!!!

Leave a Reply

Your email address will not be published. Required fields are marked *