| 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: |
| on Intel: kernel/x86/microcode/GenuineIntel.bin |
| on AMD : kernel/x86/microcode/AuthenticAMD.bin |
| |
| 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 |
| mkdir -p kernel/x86/microcode |
| cp ../microcode.bin kernel/x86/microcode/GenuineIntel.bin (or AuthenticAMD.bin) |
| find . | cpio -o -H newc >../ucode.cpio |
| cd .. |
| cat ucode.cpio /boot/initrd-3.5.0.img >/boot/initrd-3.5.0.ucode.img |
| |
| Builtin microcode |
| ================= |
| |
| We can also load builtin microcode supplied through the regular firmware |
| builtin method CONFIG_FIRMWARE_IN_KERNEL. Here's an example: |
| |
| 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. |