Merge branch 'master' into core-updates
[jackhill/guix/guix.git] / gnu / packages / firmware.scm
1 ;;; GNU Guix --- Functional package management for GNU
2 ;;; Copyright © 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
3 ;;; Copyright © 2016 Eric Bavier <bavier@member.fsf.org>
4 ;;; Copyright © 2017 David Craven <david@craven.ch>
5 ;;; Copyright © 2017 Efraim Flashner <efraim@flashner.co.il>
6 ;;;
7 ;;; This file is part of GNU Guix.
8 ;;;
9 ;;; GNU Guix is free software; you can redistribute it and/or modify it
10 ;;; under the terms of the GNU General Public License as published by
11 ;;; the Free Software Foundation; either version 3 of the License, or (at
12 ;;; your option) any later version.
13 ;;;
14 ;;; GNU Guix is distributed in the hope that it will be useful, but
15 ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
16 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 ;;; GNU General Public License for more details.
18 ;;;
19 ;;; You should have received a copy of the GNU General Public License
20 ;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
21
22 (define-module (gnu packages firmware)
23 #:use-module ((guix licenses) #:prefix license:)
24 #:use-module (guix packages)
25 #:use-module (guix download)
26 #:use-module (guix git-download)
27 #:use-module (guix build-system gnu)
28 #:use-module (gnu packages)
29 #:use-module (gnu packages admin)
30 #:use-module (gnu packages assembly)
31 #:use-module (gnu packages bison)
32 #:use-module (gnu packages cmake)
33 #:use-module (gnu packages cross-base)
34 #:use-module (gnu packages flex)
35 #:use-module (gnu packages linux)
36 #:use-module (gnu packages perl)
37 #:use-module (gnu packages python))
38
39 (define-public ath9k-htc-firmware
40 (package
41 (name "ath9k-htc-firmware")
42 (version "1.4.0")
43 (source (origin
44 (method git-fetch)
45 (uri (git-reference
46 (url "https://github.com/qca/open-ath9k-htc-firmware.git")
47 (commit version)))
48 (sha256
49 (base32
50 "16jbj8avg5jkgvq5lxm0hdxxn4c3zn7fx8b4nxllvr024apk9w23"))
51 (file-name (string-append name "-" version "-checkout"))
52 (patches (search-patches "ath9k-htc-firmware-objcopy.patch"))))
53 (build-system gnu-build-system)
54 (arguments
55 '(#:phases (alist-cons-before
56 'configure 'pre-configure
57 (lambda* (#:key inputs #:allow-other-keys)
58 (chdir "target_firmware")
59
60 ;; 'configure' is a simple script that runs 'cmake' with
61 ;; the right flags.
62 (substitute* "configure"
63 (("^TOOLCHAIN=.*$")
64 (string-append "TOOLCHAIN="
65 (assoc-ref inputs "cross-gcc")
66 "\n"))))
67 (alist-replace
68 'install
69 (lambda* (#:key outputs #:allow-other-keys)
70 (let* ((out (assoc-ref outputs "out"))
71 (fw-dir (string-append out "/lib/firmware")))
72 (mkdir-p fw-dir)
73 (for-each (lambda (file)
74 (copy-file file
75 (string-append fw-dir "/"
76 (basename file))))
77 (find-files "." "\\.fw$"))
78 #t))
79 %standard-phases))
80 #:tests? #f))
81
82 ;; The firmware is cross-compiled using a "bare bones" compiler (no libc.)
83 ;; Use our own tool chain for that.
84 (native-inputs `(("cross-gcc" ,(cross-gcc "xtensa-elf"))
85 ("cross-binutils" ,(cross-binutils "xtensa-elf"))
86 ("cmake" ,cmake)
87 ("perl" ,perl)))
88 (home-page "http://wireless.kernel.org/en/users/Drivers/ath9k_htc")
89 (synopsis "Firmware for the Atheros AR7010 and AR9271 USB 802.11n NICs")
90 (description
91 "This is the firmware for the Qualcomm Atheros AR7010 and AR9271 USB
92 802.11n NICs (aka Wi-Fi USB dongles). It is used by the ath9k driver of
93 Linux-libre.")
94 (license (license:non-copyleft "http://directory.fsf.org/wiki/License:ClearBSD"))))
95
96 (define-public b43-tools
97 (let ((commit "8dce53297966b31b6c70a7a03c2433978dd9f288")
98 (rev "1"))
99 (package
100 (name "b43-tools")
101 (version (string-append "20140625-" rev "." (string-take commit 7)))
102 (source
103 (origin
104 (method git-fetch)
105 (uri (git-reference
106 (url "http://git.bues.ch/git/b43-tools.git")
107 (commit commit)))
108 (file-name (string-append name "-" version "-checkout"))
109 (sha256
110 (base32
111 "08k7sdr9jagm43r2zv4h03j86klhkblpk73p12444a3vzg1gy1lv"))))
112 (build-system gnu-build-system)
113 (native-inputs
114 `(("flex" ,flex)
115 ("bison" ,bison)))
116 (arguments
117 `(#:modules ((srfi srfi-1)
118 (guix build gnu-build-system)
119 (guix build utils))
120 #:tests? #f ;no tests
121 #:phases
122 (let ((subdirs '("assembler" "disassembler")))
123 (modify-phases %standard-phases
124 (delete 'configure)
125 (add-before 'build 'patch-/bin/true
126 (lambda _
127 (substitute* (find-files "." "Makefile")
128 (("/bin/true") ":"))
129 #t))
130 (replace 'build
131 (lambda _
132 (every (lambda (dir)
133 (zero? (system* "make" "-C" dir "CC=gcc")))
134 subdirs)))
135 (replace 'install
136 (lambda* (#:key outputs #:allow-other-keys)
137 (let ((out (assoc-ref outputs "out")))
138 (mkdir-p (string-append out "/bin"))
139 (every (lambda (dir)
140 (zero?
141 (system* "make" "-C" dir
142 (string-append "PREFIX=" out)
143 "install")))
144 subdirs))))))))
145 (home-page
146 "http://bues.ch/cms/hacking/misc.html#linux_b43_driver_firmware_tools")
147 (synopsis "Collection of tools for the b43 wireless driver")
148 (description
149 "The b43 firmware tools is a collection of firmware extractor,
150 assembler, disassembler, and debugging tools for the Linux kernel b43 wireless
151 driver.")
152 (license license:gpl2))))
153
154 (define-public openfwwf-firmware
155 (package
156 (name "openfwwf-firmware")
157 (version "5.2")
158 (source
159 (origin
160 (method url-fetch)
161 (uri (string-append "http://netweb.ing.unibs.it/~openfwwf/firmware/"
162 "openfwwf-" version ".tar.gz"))
163 (sha256
164 (base32
165 "1p60gdi7w88s7qw82d3g9v7mk887mhvidf4l5q5hh09j10h37q4x"))))
166 (build-system gnu-build-system)
167 (native-inputs
168 `(("b43-tools" ,b43-tools)))
169 (arguments
170 `(#:make-flags (list (string-append "PREFIX="
171 (assoc-ref %outputs "out")
172 "/lib/firmware/b43-open"))
173 #:tests? #f ;no tests
174 #:phases (modify-phases %standard-phases
175 (delete 'configure))))
176 (home-page "http://netweb.ing.unibs.it/~openfwwf/")
177 (synopsis "Firmware for BCM43xx devices")
178 (description
179 "This is firmware from Open FirmWare for WiFi networks (OpenFWWF) for the
180 Broadcom/AirForce chipset BCM43xx with Wireless-Core Revision 5. It is used
181 by the b43-open driver of Linux-libre.")
182 (license license:gpl2)))
183
184 (define-public seabios
185 (package
186 (name "seabios")
187 (version "1.10.1")
188 (source (origin
189 (method url-fetch)
190 (uri (string-append "https://code.coreboot.org/p/seabios/downloads/get/"
191 "seabios-" version ".tar.gz"))
192 (sha256
193 (base32
194 "1jyjl719drnl1v0gf0l5q6qjjmkyqcqkka6s28dfdi0yqsxdsqsh"))))
195 (build-system gnu-build-system)
196 (native-inputs
197 `(("python-2" ,python-2)))
198 (arguments
199 `(#:tests? #f ; No check target.
200 #:phases
201 (modify-phases %standard-phases
202 (replace 'configure
203 (lambda _
204 (setenv "CC" "gcc")
205 #t))
206 (replace 'install
207 (lambda* (#:key outputs #:allow-other-keys)
208 (let* ((out (assoc-ref outputs "out"))
209 (fmw (string-append out "/share/firmware")))
210 (mkdir-p fmw)
211 (copy-file "out/bios.bin" (string-append fmw "/bios.bin"))))))))
212 (home-page "https://www.seabios.org/SeaBIOS")
213 (synopsis "x86 BIOS implementation")
214 (description "SeaBIOS is an open source implementation of a 16bit x86 BIOS.
215 SeaBIOS can run in an emulator or it can run natively on X86 hardware with the
216 use of coreboot.")
217 ;; Dual licensed.
218 (license (list license:gpl3+ license:lgpl3+
219 ;; src/fw/acpi-dsdt.dsl is lgpl2
220 license:lgpl2.1
221 ;; src/fw/lzmadecode.c and src/fw/lzmadecode.h are lgpl3+ and
222 ;; cpl with a linking exception.
223 license:cpl1.0))))
224
225 ;; OVMF is part of the edk2 source tree.
226 (define edk2-commit "13a50a6fe1dcfa6600c38456ee24e0f9ecf51b5f")
227 (define edk2-version (git-version "20170116" "1" edk2-commit))
228 (define edk2-origin
229 (origin
230 (method git-fetch)
231 (uri (git-reference
232 (url "https://github.com/tianocore/edk2")
233 (commit edk2-commit)))
234 (file-name (git-file-name "edk2" edk2-version))
235 (sha256
236 (base32
237 "1gy2332kdqk8bjzpcsripx10896rbvgl0ic7r344kmpiwdgm948b"))))
238
239 (define-public ovmf
240 (package
241 (name "ovmf")
242 (version edk2-version)
243 (source edk2-origin)
244 (build-system gnu-build-system)
245 (native-inputs
246 `(("acpica" ,acpica)
247 ("nasm" ,nasm)
248 ("python-2" ,python-2)
249 ("util-linux" ,util-linux)))
250 (arguments
251 `(#:tests? #f ; No check target.
252 #:phases
253 (modify-phases %standard-phases
254 (replace 'configure
255 (lambda _
256 (let* ((cwd (getcwd))
257 (tools (string-append cwd "/BaseTools"))
258 (bin (string-append tools "/BinWrappers/PosixLike")))
259 (setenv "WORKSPACE" cwd)
260 (setenv "EDK_TOOLS_PATH" tools)
261 (setenv "PATH" (string-append (getenv "PATH") ":" bin))
262 (system* "bash" "edksetup.sh" "BaseTools")
263 (substitute* "Conf/target.txt"
264 (("^TARGET[ ]*=.*$") "TARGET = RELEASE\n")
265 (("^TOOL_CHAIN_TAG[ ]*=.*$") "TOOL_CHAIN_TAG = GCC49\n")
266 (("^MAX_CONCURRENT_THREAD_NUMBER[ ]*=.*$")
267 (format #f "MAX_CONCURRENT_THREAD_NUMBER = ~a~%"
268 (number->string (parallel-job-count)))))
269 ;; Build build support.
270 (setenv "BUILD_CC" "gcc")
271 (zero? (system* "make" "-C" (string-append tools "/Source/C"))))))
272 (add-after 'build 'build-ia32
273 (lambda _
274 (substitute* "Conf/target.txt"
275 (("^TARGET_ARCH[ ]*=.*$") "TARGET_ARCH = IA32\n")
276 (("^ACTIVE_PLATFORM[ ]*=.*$")
277 "ACTIVE_PLATFORM = OvmfPkg/OvmfPkgIa32.dsc\n"))
278 (zero? (system* "build"))))
279 ,@(if (string=? "x86_64-linux" (%current-system))
280 '((add-after 'build 'build-x64
281 (lambda _
282 (substitute* "Conf/target.txt"
283 (("^TARGET_ARCH[ ]*=.*$") "TARGET_ARCH = X64\n")
284 (("^ACTIVE_PLATFORM[ ]*=.*$")
285 "ACTIVE_PLATFORM = OvmfPkg/OvmfPkgX64.dsc\n"))
286 (zero? (system* "build")))))
287 '())
288 (delete 'build)
289 (replace 'install
290 (lambda* (#:key outputs #:allow-other-keys)
291 (let* ((out (assoc-ref outputs "out"))
292 (fmw (string-append out "/share/firmware")))
293 (mkdir-p fmw)
294 (copy-file "Build/OvmfIa32/RELEASE_GCC49/FV/OVMF.fd"
295 (string-append fmw "/ovmf_ia32.bin"))
296 ,@(if (string=? "x86_64-linux" (%current-system))
297 '((copy-file "Build/OvmfX64/RELEASE_GCC49/FV/OVMF.fd"
298 (string-append fmw "/ovmf_x64.bin")))
299 '()))
300 #t)))))
301 (supported-systems '("x86_64-linux" "i686-linux"))
302 (home-page "http://www.tianocore.org")
303 (synopsis "UEFI firmware for QEMU")
304 (description "OVMF is an EDK II based project to enable UEFI support for
305 Virtual Machines. OVMF contains a sample UEFI firmware for QEMU and KVM.")
306 (license (list license:expat
307 license:bsd-2 license:bsd-3 license:bsd-4))))