]> git.proxmox.com Git - pve-firmware.git/blame - assemble-firmware.pl
add initial 5.10 FW list
[pve-firmware.git] / assemble-firmware.pl
CommitLineData
8422a0e2 1#!/usr/bin/perl
7bbca2e6
FG
2
3use strict;
8422a0e2
TL
4use warnings;
5
7bbca2e6
FG
6use File::Basename;
7use File::Path;
8
7bbca2e6
FG
9my $fwsrc2 = "dvb-firmware.git";
10my $fwsrc3 = "firmware-misc";
11
12my $fwlist = shift;
13die "no firmware list specified" if !$fwlist || ! -f $fwlist;
14
15my $target = shift;
16die "no target directory" if !$target || ! -d $target;
17
7bbca2e6
FG
18my $skip = {};
19# debian squeeze also misses those files
20foreach my $fw (qw(
11262e92
TL
213826.arm
22BT3CPCC.bin
23FW10
24FW13
25RTL8192U/boot.img
26RTL8192U/data.img
27RTL8192U/main.img
d31fb1a1
TL
28amdgpu/arcturus_asd.bin
29amdgpu/arcturus_gpu_info.bin
30amdgpu/arcturus_mec.bin
31amdgpu/arcturus_mec2.bin
32amdgpu/arcturus_rlc.bin
33amdgpu/arcturus_sdma.bin
34amdgpu/arcturus_smc.bin
35amdgpu/arcturus_sos.bin
73dd55c0 36amdgpu/arcturus_ta.bin
d31fb1a1 37amdgpu/arcturus_vcn.bin
73dd55c0
TL
38amdgpu/green_sardine_asd.bin
39amdgpu/green_sardine_ce.bin
40amdgpu/green_sardine_dmcub.bin
41amdgpu/green_sardine_gpu_info.bin
42amdgpu/green_sardine_me.bin
43amdgpu/green_sardine_mec.bin
44amdgpu/green_sardine_mec2.bin
45amdgpu/green_sardine_pfp.bin
46amdgpu/green_sardine_rlc.bin
47amdgpu/green_sardine_sdma.bin
48amdgpu/green_sardine_ta.bin
49amdgpu/green_sardine_vcn.bin
64cbf07c 50amdgpu/navi10_mes.bin
73dd55c0
TL
51amdgpu/navy_flounder_ce.bin
52amdgpu/navy_flounder_dmcub.bin
53amdgpu/navy_flounder_me.bin
54amdgpu/navy_flounder_mec.bin
55amdgpu/navy_flounder_mec2.bin
56amdgpu/navy_flounder_pfp.bin
57amdgpu/navy_flounder_rlc.bin
58amdgpu/navy_flounder_sdma.bin
59amdgpu/navy_flounder_smc.bin
60amdgpu/navy_flounder_sos.bin
61amdgpu/navy_flounder_ta.bin
62amdgpu/navy_flounder_vcn.bin
63amdgpu/sienna_cichlid_mes.bin
11262e92
TL
64ar9170.fw
65ast_dp501_fw.bin
11262e92 66ath10k/QCA6174/hw2.1/firmware-4.bin
11262e92 67ath10k/QCA6174/hw3.0/firmware-5.bin
11262e92
TL
68ath10k/QCA9887/hw1.0/board-2.bin
69ath10k/QCA988X/hw2.0/board-2.bin
11262e92
TL
70ath10k/QCA988X/hw2.0/firmware-2.bin
71ath10k/QCA988X/hw2.0/firmware-3.bin
11262e92
TL
72ath10k/QCA988X/hw2.0/firmware.bin
73ath6k/AR6003/hw2.0/bdata.bin
74ath6k/AR6003/hw2.1.1/bdata.bin
75ath6k/AR6004/hw1.0/bdata.DB132.bin
76ath6k/AR6004/hw1.0/bdata.bin
77ath6k/AR6004/hw1.0/fw.ram.bin
78ath6k/AR6004/hw1.1/bdata.DB132.bin
79ath6k/AR6004/hw1.1/bdata.bin
80ath6k/AR6004/hw1.1/fw.ram.bin
81ath6k/AR6004/hw1.2/fw.ram.bin
82ath6k/AR6004/hw1.3/fw.ram.bin
83b43/ucode11.fw
84b43/ucode13.fw
85b43/ucode14.fw
86b43/ucode15.fw
87b43/ucode16_lp.fw
88b43/ucode16_mimo.fw
89b43/ucode24_lcn.fw
90b43/ucode25_lcn.fw
91b43/ucode25_mimo.fw
92b43/ucode26_mimo.fw
93b43/ucode29_mimo.fw
94b43/ucode30_mimo.fw
95b43/ucode33_lcn40.fw
96b43/ucode40.fw
97b43/ucode42.fw
98b43/ucode5.fw
99b43/ucode9.fw
100b43legacy/ucode2.fw
101b43legacy/ucode4.fw
102bfubase.frm
7bbca2e6 103brcm/brcmfmac-sdio.bin
11262e92
TL
104brcm/brcmfmac-sdio.txt
105brcm/brcmfmac43143-sdio.txt
7bbca2e6 106brcm/brcmfmac43241b0-sdio.txt
11262e92
TL
107brcm/brcmfmac43241b4-sdio.txt
108brcm/brcmfmac43241b5-sdio.txt
11262e92
TL
109brcm/brcmfmac4329-sdio.txt
110brcm/brcmfmac4330-sdio.txt
111brcm/brcmfmac4334-sdio.txt
112brcm/brcmfmac43340-sdio.txt
113brcm/brcmfmac4335-sdio.txt
114brcm/brcmfmac43362-sdio.txt
11262e92 115brcm/brcmfmac4339-sdio.txt
11262e92 116brcm/brcmfmac43430-sdio.txt
11262e92 117brcm/brcmfmac43455-sdio.txt
64cbf07c 118brcm/brcmfmac43456-sdio.bin
11262e92
TL
119brcm/brcmfmac4350-pcie.txt
120brcm/brcmfmac4354-pcie.bin
121brcm/brcmfmac4354-pcie.txt
122brcm/brcmfmac4354-sdio.txt
7bbca2e6 123brcm/brcmfmac4356-pcie.txt
11262e92 124brcm/brcmfmac43570-pcie.txt
11262e92
TL
125brcm/brcmfmac4358-pcie.txt
126brcm/brcmfmac4359-pcie.bin
73dd55c0 127brcm/brcmfmac4359-sdio.bin
11262e92 128brcm/brcmfmac43602-pcie.txt
73dd55c0 129brcm/brcmfmac4364-pcie.bin
11262e92
TL
130brcm/brcmfmac4365b-pcie.bin
131brcm/brcmfmac4365b-pcie.txt
132brcm/brcmfmac4365c-pcie.bin
133brcm/brcmfmac4366b-pcie.txt
11262e92
TL
134brcm/brcmfmac4371-pcie.txt
135c218tunx.cod
136c320tunx.cod
433982b1
TL
137cbfw-3.0.3.1.bin
138cbfw.bin
11262e92
TL
139comedi/jr3pci.idm
140cp204unx.cod
433982b1
TL
141ct2fw-3.0.3.1.bin
142ct2fw.bin
143ctfw-3.0.3.1.bin
144ctfw.bin
11262e92 145cxgb4/t4fw-1.3.10.0.bin
7bbca2e6 146cyzfirm.bin
11262e92
TL
147daqboard2000_firmware.bin
148fw.ram.bin
11262e92
TL
149i1480-phy-0.0.bin
150i1480-pre-phy-0.0.bin
151i1480-usb-0.0.bin
152i2400m-fw-sdio-1.3.sbcf
7bbca2e6 153isi4608.bin
11262e92 154isi4616.bin
7bbca2e6
FG
155isi608.bin
156isi608em.bin
11262e92 157isi616em.bin
7bbca2e6 158isight.fw
7bbca2e6 159isl3886pci
11262e92
TL
160isl3886usb
161isl3887usb
7bbca2e6
FG
162iwlwifi-100-6.ucode
163iwlwifi-1000-6.ucode
11262e92 164iwlwifi-130-5.ucode
11262e92
TL
165iwlwifi-3165-10.ucode
166iwlwifi-3168-26.ucode
167iwlwifi-6000-6.ucode
b3bdbd58 168iwlwifi-6000g2b-IWL6000G2B_UCODE_API_MAX.ucode
11262e92
TL
169iwlwifi-7265D-26.ucode
170iwlwifi-8000-10.ucode
171iwlwifi-8000-12.ucode
172iwlwifi-8000-13.ucode
7bbca2e6 173iwlwifi-8000-8.ucode
11262e92
TL
174iwlwifi-8000C-26.ucode
175iwlwifi-8000C-33.ucode
176iwlwifi-8265-26.ucode
177iwlwifi-8265-33.ucode
178iwlwifi-9000-pu-a0-jf-a0--26.ucode
179iwlwifi-9000-pu-a0-jf-a0--33.ucode
180iwlwifi-9000-pu-a0-jf-a0-34.ucode
b3bdbd58 181iwlwifi-9000-pu-a0-jf-a0-43.ucode
11262e92
TL
182iwlwifi-9000-pu-a0-jf-b0--33.ucode
183iwlwifi-9000-pu-a0-jf-b0-34.ucode
b3bdbd58 184iwlwifi-9000-pu-a0-jf-b0-43.ucode
11262e92
TL
185iwlwifi-9000-pu-a0-lc-a0--26.ucode
186iwlwifi-9260-th-a0-jf-a0--26.ucode
187iwlwifi-9260-th-a0-jf-a0--33.ucode
188iwlwifi-9260-th-a0-jf-a0-34.ucode
b3bdbd58 189iwlwifi-9260-th-a0-jf-a0-43.ucode
11262e92
TL
190iwlwifi-9260-th-b0-jf-b0--33.ucode
191iwlwifi-Qu-a0-hr-a0--33.ucode
192iwlwifi-Qu-a0-hr-a0-34.ucode
b3bdbd58 193iwlwifi-Qu-a0-hr-a0-43.ucode
64cbf07c 194iwlwifi-Qu-a0-hr-a0-48.ucode
d31fb1a1 195iwlwifi-Qu-a0-hr-a0-50.ucode
11262e92
TL
196iwlwifi-Qu-a0-jf-b0--26.ucode
197iwlwifi-Qu-a0-jf-b0--33.ucode
198iwlwifi-Qu-a0-jf-b0-34.ucode
b3bdbd58 199iwlwifi-Qu-a0-jf-b0-43.ucode
64cbf07c 200iwlwifi-Qu-a0-jf-b0-48.ucode
d31fb1a1 201iwlwifi-Qu-a0-jf-b0-50.ucode
b3bdbd58
TL
202iwlwifi-Qu-b0-hr-b0-43.ucode
203iwlwifi-Qu-b0-jf-b0-43.ucode
11262e92 204iwlwifi-QuQnj-a0-hr-a0-34.ucode
b3bdbd58 205iwlwifi-QuQnj-a0-hr-a0-43.ucode
64cbf07c 206iwlwifi-QuQnj-a0-hr-a0-48.ucode
d31fb1a1 207iwlwifi-QuQnj-a0-hr-a0-50.ucode
11262e92 208iwlwifi-QuQnj-a0-jf-b0-34.ucode
b3bdbd58
TL
209iwlwifi-QuQnj-a0-jf-b0-43.ucode
210iwlwifi-QuQnj-b0-hr-b0-43.ucode
64cbf07c 211iwlwifi-QuQnj-b0-hr-b0-48.ucode
d31fb1a1 212iwlwifi-QuQnj-b0-hr-b0-50.ucode
73dd55c0 213iwlwifi-QuQnj-b0-hr-b0-59.ucode
64cbf07c 214iwlwifi-QuQnj-b0-jf-b0-48.ucode
d31fb1a1 215iwlwifi-QuQnj-b0-jf-b0-50.ucode
73dd55c0 216iwlwifi-QuQnj-b0-jf-b0-59.ucode
11262e92 217iwlwifi-QuQnj-f0-hr-a0-34.ucode
b3bdbd58 218iwlwifi-QuQnj-f0-hr-a0-43.ucode
64cbf07c 219iwlwifi-QuQnj-f0-hr-a0-48.ucode
d31fb1a1 220iwlwifi-QuQnj-f0-hr-a0-50.ucode
73dd55c0
TL
221iwlwifi-SoSnj-a0-gf-a0-59.ucode
222iwlwifi-SoSnj-a0-gf4-a0-59.ucode
223iwlwifi-SoSnj-a0-hr-b0-59.ucode
224iwlwifi-ma-a0-gf-a0-59.ucode
225iwlwifi-ma-a0-mr-a0-59.ucode
64cbf07c 226iwlwifi-so-a0-gf-a0-48.ucode
d31fb1a1 227iwlwifi-so-a0-gf-a0-50.ucode
73dd55c0 228iwlwifi-so-a0-gf-a0-59.ucode
64cbf07c 229iwlwifi-so-a0-hr-b0-48.ucode
d31fb1a1 230iwlwifi-so-a0-hr-b0-50.ucode
73dd55c0 231iwlwifi-so-a0-hr-b0-59.ucode
64cbf07c 232iwlwifi-so-a0-jf-b0-48.ucode
d31fb1a1 233iwlwifi-so-a0-jf-b0-50.ucode
73dd55c0 234iwlwifi-so-a0-jf-b0-59.ucode
b3bdbd58 235iwlwifi-su-z0-43.ucode
64cbf07c 236iwlwifi-ty-a0-gf-a0-48.ucode
d31fb1a1 237iwlwifi-ty-a0-gf-a0-50.ucode
11262e92
TL
238iwmc3200wifi-calib-sdio.bin
239iwmc3200wifi-lmac-sdio.bin
240iwmc3200wifi-umac-sdio.bin
241ks7010sd.rom
b3bdbd58
TL
242lantiq/xrx200_phy11g_a14.bin
243lantiq/xrx200_phy11g_a22.bin
244lantiq/xrx200_phy22f_a14.bin
245lantiq/xrx200_phy22f_a22.bin
246lantiq/xrx300_phy11g_a21.bin
247lantiq/xrx300_phy22f_a21.bin
11262e92 248lattice-ecp3.bit
11262e92 249libertas/cf8305.bin
433982b1 250libertas/gspi8385.bin
11262e92 251libertas/gspi8385_helper.bin
433982b1 252libertas/gspi8385_hlp.bin
11262e92
TL
253libertas/usb8388.bin
254libertas_cs.fw
255libertas_cs_helper.fw
256liquidio/lio_210nv.bin
257liquidio/lio_210sv.bin
258liquidio/lio_23xx.bin
259liquidio/lio_410nv.bin
7bbca2e6
FG
260me2600_firmware.bin
261me4000_firmware.bin
11262e92
TL
262mrvl/pcie8766_uapsta.bin
263mrvl/pcie8997_uapsta.bin
264mrvl/sd8786_uapsta.bin
64cbf07c
TL
265mrvl/sd8977_uapsta.bin
266mrvl/sd8987_uapsta.bin
11262e92 267mrvl/sd8997_uapsta.bin
11262e92 268mrvl/usb8997_uapsta.bin
64cbf07c
TL
269mt7603_e1.bin
270mt7603_e2.bin
271mt7628_e1.bin
272mt7628_e2.bin
11262e92 273mwl8k/fmimage_8363.fw
11262e92 274mwl8k/helper_8363.fw
11262e92
TL
275ni6534a.bin
276niscrb01.bin
277niscrb02.bin
278nx3fwct.bin
279nx3fwmn.bin
280nxromimg.bin
281orinoco_ezusb_fw
282pca200e_ecd.bin2
283phanfw-4.0.579.bin
284prism2_ru.fw
285prism_ap_fw.bin
286prism_sta_fw.bin
6017019c
TL
287ql2600_fw.bin
288ql2700_fw.bin
289ql8100_fw.bin
290ql8300_fw.bin
73dd55c0 291renesas_usb_fw.mem
b3bdbd58
TL
292rtl_bt/rtl8723b_config.bin
293rtl_bt/rtl8723bs_config.bin
294rtl_bt/rtl8723ds_config.bin
295rtl_bt/rtl8723ds_fw.bin
296rtl_bt/rtl8761a_config.bin
297rtl_bt/rtl8821a_config.bin
7bbca2e6 298rtlwifi/rtl8723bu_bt.bin
11262e92 299rtlwifi/rtl8723efw.bin
64cbf07c 300s5k4ecgx.bin
11262e92
TL
301sd8686.bin
302sd8686_helper.bin
11262e92
TL
303softing-4.6/bcard.bin
304softing-4.6/bcard2.bin
305softing-4.6/cancard.bin
306softing-4.6/cancrd2.bin
307softing-4.6/cansja.bin
308softing-4.6/ldcard.bin
309softing-4.6/ldcard2.bin
310solos-FPGA.bin
311solos-Firmware.bin
312solos-db-FPGA.bin
313symbol_sp24t_prim_fw
314symbol_sp24t_sec_fw
315tehuti/firmware.bin
316ti-connectivity/wl18xx-conf.bin
317tms380tr.bin
318usb8388.bin
319wd719x-risc.bin
320wd719x-wcs.bin
faefccd2 321wil6210_sparrow_plus.fw
b3bdbd58
TL
322wil6436.brd
323wil6436.fw
11262e92
TL
324wlan/prima/WCNSS_qcom_wlan_nv.bin
325zd1201-ap.fw
326zd1201.fw
7bbca2e6
FG
327)) {
328 $skip->{$fw} = 1;
329}
330
331sub copy_fw {
332 my ($src, $dstfw) = @_;
333
334 my $dest = "$target/$dstfw";
335
336 return if -f $dest;
337
338 mkpath dirname($dest);
58a59083 339 system ("cp '$src' '$dest'") == 0 or die "copy '$src' to '$dest' failed!\n";
7bbca2e6
FG
340}
341
342my $fwdone = {};
c3fe809a 343my $fwbase_name = {};
7bbca2e6 344
6bc6bdcb
FG
345my $error = 0;
346
f75a8ffb
TL
347open(my $fd, '<', $fwlist);
348while(defined(my $line = <$fd>)) {
7bbca2e6
FG
349 chomp $line;
350 my ($fw, $mod) = split(/\s+/, $line, 2);
351
c3fe809a
TL
352 my $fw_name = basename($fw);
353 $fwbase_name->{$fw_name} = 1;
354
7bbca2e6
FG
355 next if $mod =~ m|^kernel/sound|;
356 next if $mod =~ m|^kernel/drivers/isdn|;
357
358 # skip ZyDas usb wireless, use package zd1211-firmware instead
359 next if $fw =~ m|^zd1211/|;
360
361 # skip atmel at76c50x wireless networking chips.
362 # use package atmel-firmware instead
363 next if $fw =~ m|^atmel_at76c50|;
364
365 # skip Bluetooth dongles based on the Broadcom BCM203x
366 # use package bluez-firmware instead
367 next if $fw =~ m|^BCM2033|;
368
369 next if $fw =~ m|^xc3028-v27\.fw|; # found twice!
370 next if $fw =~ m|.inp|; # where are those files?
371 next if $fw =~ m|^ueagle-atm/|; # where are those files?
372
7bbca2e6
FG
373 next if $fwdone->{$fw};
374 $fwdone->{$fw} = 1;
375
376 my $fwdest = $fw;
377 if ($fw eq 'libertas/gspi8686.bin') {
378 $fw = 'libertas/gspi8686_v9.bin';
379 }
380 if ($fw eq 'libertas/gspi8686_hlp.bin') {
381 $fw = 'libertas/gspi8686_v9_helper.bin';
382 }
383
384 if ($fw eq 'PE520.cis') {
385 $fw = 'cis/PE520.cis';
386 }
387
279821b7 388 if (-e "$target/$fw") {
6017019c 389 warn "WARN: allowed to skip existing '$fw'\n" if $skip->{$fw};
7bbca2e6
FG
390 next;
391 }
392 if (-f "$fwsrc3/$fw") {
393 copy_fw("$fwsrc3/$fw", $fwdest);
394 next;
395 }
396
bb4be6eb 397 my $module = basename($mod);
7bbca2e6
FG
398 if ($fw =~ m|/|) {
399 next if $skip->{$fw};
400
bb4be6eb 401 warn "ERROR: unable to find firmware ($module): $fw\n";
6bc6bdcb
FG
402 $error++;
403 next;
7bbca2e6
FG
404 }
405
406 my $name = basename($fw);
407
279821b7 408 my $sr = `find '$target' \\( -type f -o -type l \\) -name '$name'`;
7bbca2e6
FG
409 chomp $sr;
410 if ($sr) {
279821b7
TL
411 my $found = 0;
412 for my $f (split("\n", $sr)) {
413 if ($f =~ /$fw$/) {
414 print "found $fw in $f\n";
415 $found = 1;
416 }
417 }
418 next if $found;
7bbca2e6
FG
419 }
420
421 $sr = `find '$fwsrc2' -type f -name '$name'`;
422 chomp $sr;
423 if ($sr) {
424 print "found $fw in $sr\n";
425 copy_fw($sr, $fwdest);
426 next;
427 }
428
429 $sr = `find '$fwsrc3' -type f -name '$name'`;
430 chomp $sr;
431 if ($sr) {
33e03db5 432 print "found $fw in $sr\n";
7bbca2e6
FG
433 copy_fw($sr, $fwdest);
434 next;
435 }
436
437 next if $skip->{$fw};
438 next if $fw =~ m|^dvb-|;
439
bb4be6eb 440 warn "ERROR: unable to find firmware ($module): $fw\n";
6bc6bdcb
FG
441 $error++;
442 next;
7bbca2e6 443}
f75a8ffb 444close($fd);
7bbca2e6 445
c3fe809a
TL
446exit($error) if $error;
447
448my $target_fw_string = `find '$target' -type f -o -type l`;
449chomp $target_fw_string;
450exit(-1) if !$target_fw_string;
451
452my $all_fw_files = [ split("\n", $target_fw_string) ];
453
454my ($keep, $delete) = (0, 0);
455
456my $link_target = {};
457for my $f (@$all_fw_files) {
458 next if ! -l $f;
459 my $link = basename($f);
460 my $file = readlink($f);
461 my $target = basename($file);
462 $link_target->{$target} = 1 if $fwbase_name->{$link};
463 $link_target->{$file} = 1 if $fwbase_name->{$link};
464}
465
466for my $f (@$all_fw_files) {
467 my $name = basename($f);
468
469 if ($fwbase_name->{$name}) {
470 $keep++;
471 } elsif ($link_target->{$name}) {
472 #print "skip link target '$f'\n";
473 $keep++;
474 } else {
475 print "delete unreferenced $f\n";
476 unlink $f or warn "ERROR deleting '$f' - $!\n";
477 $delete++;
478 }
479}
480
481print "cleanup end result: keep: $keep, delete: $delete\n";
482
483exit(0);