1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- 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: /*(DEBLOBBED)*/
- on AMD : /*(DEBLOBBED)*/
- 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 /*(DEBLOBBED)*/ (or /*(DEBLOBBED)*/)
- 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. Only 64-bit is currently
- supported.
- Here's an example:
- CONFIG_FIRMWARE_IN_KERNEL=y
- CONFIG_EXTRA_FIRMWARE="/*(DEBLOBBED)*/ /*(DEBLOBBED)*/"
- 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.
|