2012-12-21 15:44:21 +08:00
|
|
|
Early load microcode
|
|
|
|
====================
|
|
|
|
By Fenghua Yu <fenghua.yu@intel.com>
|
|
|
|
|
|
|
|
Kernel can update microcode in early phase of boot time. Loading microcode early
|
|
|
|
can fix CPU issues before they are observed during kernel boot time.
|
|
|
|
|
|
|
|
Microcode is stored in an initrd file. The microcode is read from the initrd
|
|
|
|
file and loaded to CPUs during boot time.
|
|
|
|
|
|
|
|
The format of the combined initrd image is microcode in cpio format followed by
|
|
|
|
the initrd image (maybe compressed). Kernel parses the combined initrd image
|
|
|
|
during boot time. The microcode file in cpio name space is:
|
2013-05-31 03:09:19 +08:00
|
|
|
on Intel: kernel/x86/microcode/GenuineIntel.bin
|
|
|
|
on AMD : kernel/x86/microcode/AuthenticAMD.bin
|
2012-12-21 15:44:21 +08:00
|
|
|
|
|
|
|
During BSP boot (before SMP starts), if the kernel finds the microcode file in
|
|
|
|
the initrd file, it parses the microcode and saves matching microcode in memory.
|
|
|
|
If matching microcode is found, it will be uploaded in BSP and later on in all
|
|
|
|
APs.
|
|
|
|
|
|
|
|
The cached microcode patch is applied when CPUs resume from a sleep state.
|
|
|
|
|
|
|
|
There are two legacy user space interfaces to load microcode, either through
|
|
|
|
/dev/cpu/microcode or through /sys/devices/system/cpu/microcode/reload file
|
|
|
|
in sysfs.
|
|
|
|
|
|
|
|
In addition to these two legacy methods, the early loading method described
|
|
|
|
here is the third method with which microcode can be uploaded to a system's
|
|
|
|
CPUs.
|
|
|
|
|
|
|
|
The following example script shows how to generate a new combined initrd file in
|
|
|
|
/boot/initrd-3.5.0.ucode.img with original microcode microcode.bin and
|
|
|
|
original initrd image /boot/initrd-3.5.0.img.
|
|
|
|
|
|
|
|
mkdir initrd
|
|
|
|
cd initrd
|
2013-05-31 03:09:19 +08:00
|
|
|
mkdir -p kernel/x86/microcode
|
|
|
|
cp ../microcode.bin kernel/x86/microcode/GenuineIntel.bin (or AuthenticAMD.bin)
|
|
|
|
find . | cpio -o -H newc >../ucode.cpio
|
2012-12-21 15:44:21 +08:00
|
|
|
cd ..
|
|
|
|
cat ucode.cpio /boot/initrd-3.5.0.img >/boot/initrd-3.5.0.ucode.img
|
2016-02-03 19:33:45 +08:00
|
|
|
|
|
|
|
Builtin microcode
|
|
|
|
=================
|
|
|
|
|
|
|
|
We can also load builtin microcode supplied through the regular firmware
|
2016-06-06 23:10:50 +08:00
|
|
|
builtin method CONFIG_FIRMWARE_IN_KERNEL. Only 64-bit is currently
|
|
|
|
supported.
|
|
|
|
|
|
|
|
Here's an example:
|
2016-02-03 19:33:45 +08:00
|
|
|
|
|
|
|
CONFIG_FIRMWARE_IN_KERNEL=y
|
|
|
|
CONFIG_EXTRA_FIRMWARE="intel-ucode/06-3a-09 amd-ucode/microcode_amd_fam15h.bin"
|
|
|
|
CONFIG_EXTRA_FIRMWARE_DIR="/lib/firmware"
|
|
|
|
|
|
|
|
This basically means, you have the following tree structure locally:
|
|
|
|
|
|
|
|
/lib/firmware/
|
|
|
|
|-- amd-ucode
|
|
|
|
...
|
|
|
|
| |-- microcode_amd_fam15h.bin
|
|
|
|
...
|
|
|
|
|-- intel-ucode
|
|
|
|
...
|
|
|
|
| |-- 06-3a-09
|
|
|
|
...
|
|
|
|
|
|
|
|
so that the build system can find those files and integrate them into
|
|
|
|
the final kernel image. The early loader finds them and applies them.
|