Makefile, copy-firmware: support xz/zstd compressed firmware

The kernel has supported compressed firmware for quite some time. So
let's add a couple of targets to produce that. In practical terms this
means it we'll use ~5x times less space on disk.

Reportedly the amd ucode, needs to be uncompressed _within_ the
initrd in order to work. Using compressed ucode in late load just works.
Ideally this will be addressed by the initrd generators, but considering
the files are tiny in size let's skip the compression.

v2
 - commit message, skip compression for files annotated as Raw

v3
 - rebase

[Drop extra verbose statement in zstd case, Josh Boyer
<jwboyer@kernel.org>]

Cc: David Woodhouse <dwmw2@infradead.org>
Signed-off-by: Emil Velikov <emil.l.velikov@gmail.com>
Signed-off-by: Josh Boyer <jwboyer@kernel.org>
This commit is contained in:
Emil Velikov 2023-06-05 14:58:12 +01:00 committed by Josh Boyer
parent ad2ce8beee
commit ee91452dac
No known key found for this signature in database
GPG Key ID: A31B6BD72486CFD6
3 changed files with 51 additions and 9 deletions

View File

@ -11,3 +11,11 @@ check:
install: install:
install -d $(DESTDIR)$(FIRMWAREDIR) install -d $(DESTDIR)$(FIRMWAREDIR)
./copy-firmware.sh $(DESTDIR)$(FIRMWAREDIR) ./copy-firmware.sh $(DESTDIR)$(FIRMWAREDIR)
install-xz:
install -d $(DESTDIR)$(FIRMWAREDIR)
./copy-firmware.sh --xz $(DESTDIR)$(FIRMWAREDIR)
install-zst:
install -d $(DESTDIR)$(FIRMWAREDIR)
./copy-firmware.sh --zstd $(DESTDIR)$(FIRMWAREDIR)

5
WHENCE
View File

@ -3890,14 +3890,19 @@ License: Redistributable. See LICENSE.amd-sev for details
Driver: microcode_amd - AMD CPU Microcode Update Driver for Linux Driver: microcode_amd - AMD CPU Microcode Update Driver for Linux
File: amd-ucode/microcode_amd.bin File: amd-ucode/microcode_amd.bin
Raw: amd-ucode/microcode_amd.bin
Version: 2013-07-10 Version: 2013-07-10
File: amd-ucode/microcode_amd_fam15h.bin File: amd-ucode/microcode_amd_fam15h.bin
Raw: amd-ucode/microcode_amd_fam15h.bin
Version: 2018-05-24 Version: 2018-05-24
File: amd-ucode/microcode_amd_fam16h.bin File: amd-ucode/microcode_amd_fam16h.bin
Raw: amd-ucode/microcode_amd_fam16h.bin
Version: 2014-10-28 Version: 2014-10-28
File: amd-ucode/microcode_amd_fam17h.bin File: amd-ucode/microcode_amd_fam17h.bin
Raw: amd-ucode/microcode_amd_fam17h.bin
Version: 2023-04-13 Version: 2023-04-13
File: amd-ucode/microcode_amd_fam19h.bin File: amd-ucode/microcode_amd_fam19h.bin
Raw: amd-ucode/microcode_amd_fam19h.bin
Version: 2023-01-31 Version: 2023-01-31
File: amd-ucode/README File: amd-ucode/README

View File

@ -6,6 +6,9 @@
verbose=: verbose=:
prune=no prune=no
# shellcheck disable=SC2209
compress=cat
compext=
while test $# -gt 0; do while test $# -gt 0; do
case $1 in case $1 in
@ -20,6 +23,27 @@ while test $# -gt 0; do
shift shift
;; ;;
--xz)
if test "$compext" == ".zst"; then
echo "ERROR: cannot mix XZ and ZSTD compression"
exit 1
fi
compress="xz --compress --quiet --stdout --check=crc32"
compext=".xz"
shift
;;
--zstd)
if test "$compext" == ".xz"; then
echo "ERROR: cannot mix XZ and ZSTD compression"
exit 1
fi
# shellcheck disable=SC2209
compress="zstd --compress --quiet --stdout"
compext=".zst"
shift
;;
*) *)
if test "x$destdir" != "x"; then if test "x$destdir" != "x"; then
echo "ERROR: unknown command-line options: $*" echo "ERROR: unknown command-line options: $*"
@ -35,18 +59,23 @@ done
# shellcheck disable=SC2162 # file/folder name can include escaped symbols # shellcheck disable=SC2162 # file/folder name can include escaped symbols
grep '^File:' WHENCE | sed -e 's/^File: *//g;s/"//g' | while read f; do grep '^File:' WHENCE | sed -e 's/^File: *//g;s/"//g' | while read f; do
test -f "$f" || continue test -f "$f" || continue
$verbose "copying file $f"
install -d "$destdir/$(dirname "$f")" install -d "$destdir/$(dirname "$f")"
cp -d "$f" "$destdir/$f" $verbose "copying/compressing file $f$compext"
if test "$compress" != "cat" && grep -q "^Raw: $f\$" WHENCE; then
$verbose "compression will be skipped for file $f"
cat "$f" > "$destdir/$f"
else
$compress "$f" > "$destdir/$f$compext"
fi
done done
# shellcheck disable=SC2162 # file/folder name can include escaped symbols # shellcheck disable=SC2162 # file/folder name can include escaped symbols
grep -E '^Link:' WHENCE | sed -e 's/^Link: *//g;s/-> //g' | while read f d; do grep -E '^Link:' WHENCE | sed -e 's/^Link: *//g;s/-> //g' | while read f d; do
if test -L "$f"; then if test -L "$f$compext"; then
test -f "$destdir/$f" && continue test -f "$destdir/$f$compext" && continue
$verbose "copying link $f" $verbose "copying link $f$compext"
install -d "$destdir/$(dirname "$f")" install -d "$destdir/$(dirname "$f")"
cp -d "$f" "$destdir/$f" cp -d "$f$compext" "$destdir/$f$compext"
if test "x$d" != "x"; then if test "x$d" != "x"; then
target="$(readlink "$f")" target="$(readlink "$f")"
@ -58,16 +87,16 @@ grep -E '^Link:' WHENCE | sed -e 's/^Link: *//g;s/-> //g' | while read f d; do
$verbose "WARNING: unneeded symlink detected: $f" $verbose "WARNING: unneeded symlink detected: $f"
else else
$verbose "WARNING: pruning unneeded symlink $f" $verbose "WARNING: pruning unneeded symlink $f"
rm -f "$f" rm -f "$f$compext"
fi fi
fi fi
else else
$verbose "WARNING: missing target for symlink $f" $verbose "WARNING: missing target for symlink $f"
fi fi
else else
$verbose "creating link $f -> $d"
install -d "$destdir/$(dirname "$f")" install -d "$destdir/$(dirname "$f")"
ln -sf "$d" "$destdir/$f" $verbose "creating link $f$compext -> $d$compext"
ln -s "$d$compext" "$destdir/$f$compext"
fi fi
done done