From f1685d8cbdb4b74be5d400e41d1b3137614af6e1aaaca56fd59aca3cb00d189e Mon Sep 17 00:00:00 2001 From: Thomas Renninger Date: Wed, 11 Dec 2013 11:52:20 +0000 Subject: [PATCH] - Add mkinitrd script to add AMD microcode to initrd. This is needed because microcode driver is built in or gets loaded automatically via udev early. Therefore the microcode has to be available in initrd already. This must not be mixed up with early micorcode loading. This feature will not be implemented via mkinitrd. Dracut is doing early microcode loading. - bnc#847158 - mkinitrd scripts: - mkinitrd_setup-amd_microcode.sh Adding microcode to the initrd - mkinitrd_boot-amd_microcode.sh Triggering the reload at boot on machines with AMD CPUs OBS-URL: https://build.opensuse.org/package/show/Kernel:HEAD/kernel-firmware?expand=0&rev=74 --- kernel-firmware.changes | 18 ++++++++++++++++- kernel-firmware.spec | 26 ++++++++++++++++++++---- mkinitrd_boot-amd_microcode.sh | 8 ++++++++ mkinitrd_setup-amd_microcode.sh | 36 +++++++++++++++++++++++++++++++++ 4 files changed, 83 insertions(+), 5 deletions(-) create mode 100644 mkinitrd_boot-amd_microcode.sh create mode 100644 mkinitrd_setup-amd_microcode.sh diff --git a/kernel-firmware.changes b/kernel-firmware.changes index 2306b20..80f72d8 100644 --- a/kernel-firmware.changes +++ b/kernel-firmware.changes @@ -1,8 +1,24 @@ +------------------------------------------------------------------- +Tue Dec 10 15:46:02 UTC 2013 - trenn@suse.de + +- Add mkinitrd script to add AMD microcode to initrd. + This is needed because microcode driver is built in or gets loaded + automatically via udev early. Therefore the microcode has to be available + in initrd already. + This must not be mixed up with early micorcode loading. This feature will + not be implemented via mkinitrd. Dracut is doing early microcode loading. +- bnc#847158 +- mkinitrd scripts: + - mkinitrd_setup-amd_microcode.sh + Adding microcode to the initrd + - mkinitrd_boot-amd_microcode.sh + Triggering the reload at boot + ------------------------------------------------------------------- Mon Dec 9 14:19:50 UTC 2013 - trenn@suse.de - Correct Supplements string so that the package gets correctly installed - on machines with Intel CPUs + on machines with AMD CPUs bnc#847158 ------------------------------------------------------------------- diff --git a/kernel-firmware.spec b/kernel-firmware.spec index 4d4487e..9acbcde 100644 --- a/kernel-firmware.spec +++ b/kernel-firmware.spec @@ -31,6 +31,8 @@ Source0: linux-firmware-%{version}.tar.bz2 Source1: firmware.sh Source3: iwlwifi-4965-1.ucode Source4: carl9170-1.fw +Source5: mkinitrd_setup-amd_microcode.sh +Source6: mkinitrd_boot-amd_microcode.sh %define __find_supplements bash %_sourcedir/firmware.sh --find-supplements %define __ksyms_supplements bash %_sourcedir/firmware.sh --cache %{_builddir}/%{?buildsubdir}/find_supplements.cache --find-supplements @@ -88,6 +90,8 @@ cp -v %{S:4} carl9170-1.fw # nothing to do %install +install -D -m 0755 %{SOURCE5} %{buildroot}/lib/mkinitrd/scripts/setup-amd_microcode.sh +install -D -m 0755 %{SOURCE6} %{buildroot}/lib/mkinitrd/scripts/boot-amd_microcode.sh mkdir -p %{buildroot}/lib/firmware cp -avf * %{buildroot}/lib/firmware rm -f %{buildroot}/lib/firmware/WHENCE @@ -103,16 +107,30 @@ rm -rf %{buildroot}/lib/firmware/carl9170fw %clean rm -rf %{buildroot} +%post -n ucode-amd +[ -x /sbin/mkinitrd_setup ] && mkinitrd_setup +if [ -e /var/lib/no_initrd_recreation_by_suspend ]; then + echo "Skipping recreation of existing initial ramdisks, due" + echo "to presence of /var/lib/no_initrd_recreation_by_suspend" +elif [ -x /sbin/mkinitrd ]; then + /sbin/mkinitrd +fi + %files %defattr(0644,root,root,0755) %doc WHENCE README GPL-3 LICENCE.* -%exclude /lib/firmware/amd-ucode/microcode_amd.bin -%exclude /lib/firmware/amd-ucode/microcode_amd_fam15h.bin +%exclude /lib/firmware/amd-ucode/microcode_amd.bin* +%exclude /lib/firmware/amd-ucode/microcode_amd_fam15h.bin* /lib/firmware/* %files -n ucode-amd %defattr(0644,root,root,0755) -/lib/firmware/amd-ucode/microcode_amd.bin -/lib/firmware/amd-ucode/microcode_amd_fam15h.bin +/lib/firmware/amd-ucode/microcode_amd.bin* +/lib/firmware/amd-ucode/microcode_amd_fam15h.bin* +/lib/firmware/amd-ucode/ +%dir /lib/mkinitrd +%dir /lib/mkinitrd/scripts +%attr(0755,root,root) /lib/mkinitrd/scripts/setup-amd_microcode.sh +%attr(0755,root,root) /lib/mkinitrd/scripts/boot-amd_microcode.sh %changelog diff --git a/mkinitrd_boot-amd_microcode.sh b/mkinitrd_boot-amd_microcode.sh new file mode 100644 index 0000000..678ed2d --- /dev/null +++ b/mkinitrd_boot-amd_microcode.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +#%stage: boot +#%depends: udev + +if [ -w /sys/devices/system/cpu/microcode/reload ];then + echo 1 >/sys/devices/system/cpu/microcode/reload +fi diff --git a/mkinitrd_setup-amd_microcode.sh b/mkinitrd_setup-amd_microcode.sh new file mode 100644 index 0000000..4ccd691 --- /dev/null +++ b/mkinitrd_setup-amd_microcode.sh @@ -0,0 +1,36 @@ +#/bin/bash + +#%stage: boot +# +# Adds AMD microcode to the initrd +# +# If processor(s) are upgraded on the system, mkinitrd has to be re-called +# manually to include a possible other needed firmware to the initrd +# + +if grep -q -i AuthenticAMD /proc/cpuinfo; then + echo -n "Microcode: " + if [ ! -e /lib/firmware/amd-ucode ];then + echo "AMD microcode not found, amd-ucode package not installed?" + return 0 + fi + fam=`head /proc/cpuinfo |sed -n -e 's/cpu family.*: \([0-9]\+\)/\1/p'` + # Only try to update when family >= 16 (0x10, fam 10h) + if [ $fam -ge 16 >& /dev/null ];then + # Family 0x15 firmware is named: microcode_amd_famXXh.bin" + if [ $fam -lt 21 >& /dev/null ];then + file=microcode_amd.bin + else + file=`printf "microcode_amd_fam%xh.bin" $fam` + fi + if [ -e /lib/firmware/amd-ucode ];then + echo "Adding AMD microcode $file" + mkdir -p $tmp_mnt/lib/firmware/amd-ucode + cp /lib/firmware/amd-ucode/"$file"* $tmp_mnt/lib/firmware/amd-ucode + else + echo "No AMD microcode found, amd-ucode package not installed?" + fi + else + printf "AMD CPU family: 0x%x does not support microcode updates" $fam + fi +fi