Commit | Line | Data |
---|---|---|
0d91ea86 FY |
1 | Early load microcode |
2 | ==================== | |
3 | By Fenghua Yu <fenghua.yu@intel.com> | |
4 | ||
5 | Kernel can update microcode in early phase of boot time. Loading microcode early | |
6 | can fix CPU issues before they are observed during kernel boot time. | |
7 | ||
8 | Microcode is stored in an initrd file. The microcode is read from the initrd | |
9 | file and loaded to CPUs during boot time. | |
10 | ||
11 | The format of the combined initrd image is microcode in cpio format followed by | |
12 | the initrd image (maybe compressed). Kernel parses the combined initrd image | |
13 | during boot time. The microcode file in cpio name space is: | |
757885e9 JS |
14 | on Intel: kernel/x86/microcode/GenuineIntel.bin |
15 | on AMD : kernel/x86/microcode/AuthenticAMD.bin | |
0d91ea86 FY |
16 | |
17 | During BSP boot (before SMP starts), if the kernel finds the microcode file in | |
18 | the initrd file, it parses the microcode and saves matching microcode in memory. | |
19 | If matching microcode is found, it will be uploaded in BSP and later on in all | |
20 | APs. | |
21 | ||
22 | The cached microcode patch is applied when CPUs resume from a sleep state. | |
23 | ||
24 | There are two legacy user space interfaces to load microcode, either through | |
25 | /dev/cpu/microcode or through /sys/devices/system/cpu/microcode/reload file | |
26 | in sysfs. | |
27 | ||
28 | In addition to these two legacy methods, the early loading method described | |
29 | here is the third method with which microcode can be uploaded to a system's | |
30 | CPUs. | |
31 | ||
32 | The following example script shows how to generate a new combined initrd file in | |
33 | /boot/initrd-3.5.0.ucode.img with original microcode microcode.bin and | |
34 | original initrd image /boot/initrd-3.5.0.img. | |
35 | ||
36 | mkdir initrd | |
37 | cd initrd | |
757885e9 JS |
38 | mkdir -p kernel/x86/microcode |
39 | cp ../microcode.bin kernel/x86/microcode/GenuineIntel.bin (or AuthenticAMD.bin) | |
40 | find . | cpio -o -H newc >../ucode.cpio | |
0d91ea86 FY |
41 | cd .. |
42 | cat ucode.cpio /boot/initrd-3.5.0.img >/boot/initrd-3.5.0.ucode.img | |
b5843032 BP |
43 | |
44 | Builtin microcode | |
45 | ================= | |
46 | ||
47 | We can also load builtin microcode supplied through the regular firmware | |
48 | builtin method CONFIG_FIRMWARE_IN_KERNEL. Here's an example: | |
49 | ||
50 | CONFIG_FIRMWARE_IN_KERNEL=y | |
51 | CONFIG_EXTRA_FIRMWARE="intel-ucode/06-3a-09 amd-ucode/microcode_amd_fam15h.bin" | |
52 | CONFIG_EXTRA_FIRMWARE_DIR="/lib/firmware" | |
53 | ||
54 | This basically means, you have the following tree structure locally: | |
55 | ||
56 | /lib/firmware/ | |
57 | |-- amd-ucode | |
58 | ... | |
59 | | |-- microcode_amd_fam15h.bin | |
60 | ... | |
61 | |-- intel-ucode | |
62 | ... | |
63 | | |-- 06-3a-09 | |
64 | ... | |
65 | ||
66 | so that the build system can find those files and integrate them into | |
67 | the final kernel image. The early loader finds them and applies them. |