summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTheo de Raadt <deraadt@cvs.openbsd.org>2022-01-05 16:24:30 +0000
committerTheo de Raadt <deraadt@cvs.openbsd.org>2022-01-05 16:24:30 +0000
commitfa5cb48fc0d92c83a0feb1299cd918f143370a8b (patch)
treed7ce61099cb82ce432b3facf2f051bca10f72420
parentdf670203d886d028fa1fbf38aad175dacb6849f9 (diff)
We are moving back to a shell-script based fw_update, written in such a
way that the install script can also run it. This allows earlier retrieval of downloaded firmwares, based upon patterns found in dmesg. many iterations of this in snaps for about a month.
-rw-r--r--usr.sbin/fw_update/Makefile28
-rw-r--r--usr.sbin/fw_update/patterns.c121
2 files changed, 149 insertions, 0 deletions
diff --git a/usr.sbin/fw_update/Makefile b/usr.sbin/fw_update/Makefile
new file mode 100644
index 00000000000..a8d2406fd7c
--- /dev/null
+++ b/usr.sbin/fw_update/Makefile
@@ -0,0 +1,28 @@
+# $OpenBSD: Makefile,v 1.4 2022/01/05 16:24:29 deraadt Exp $
+
+NOPROG=
+MAN= fw_update.8
+CC= ${HOSTCC}
+CFLAGS+=-I /usr/src/sys/dev/pci/drm/amd/amdgpu \
+ -I /usr/src/sys/dev/pci/drm/i915 \
+ -I /usr/src/sys/dev/pci/drm/radeon
+ALL= firmware_patterns
+
+PROG=patterns
+
+firmware_patterns: patterns
+ $(.OBJDIR)/patterns | sort | uniq > $@
+
+realinstall:
+
+all: firmware_patterns
+
+afterinstall: firmware_patterns
+ ${INSTALL} ${INSTALL_COPY} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \
+ ${.CURDIR}/fw_update.sh ${DESTDIR}${BINDIR}/fw_update
+ ${INSTALL} ${INSTALL_COPY} -o ${SHAREOWN} -g ${SHAREGRP} \
+ -m ${SHAREMODE} ${.OBJDIR}/firmware_patterns \
+ ${DESTDIR}${SHAREDIR}/misc/firmware_patterns
+
+CLEANFILES+=firmware_patterns
+.include <bsd.prog.mk>
diff --git a/usr.sbin/fw_update/patterns.c b/usr.sbin/fw_update/patterns.c
new file mode 100644
index 00000000000..c7ff15a2138
--- /dev/null
+++ b/usr.sbin/fw_update/patterns.c
@@ -0,0 +1,121 @@
+/* $OpenBSD: patterns.c,v 1.1 2022/01/05 16:24:29 deraadt Exp $ */
+
+/*
+ * Copyright (c) 1995, 1996 Christopher G. Demetriou. All rights reserved.
+ * Copyright (c) 1994 Charles Hannum. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Charles Hannum.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/types.h>
+#include <dev/pci/pcivar.h>
+#include <dev/pci/pcidevs.h>
+#include <dev/pci/pcidevs_data.h>
+
+#include "amdgpu_devlist.h"
+#include "i915_devlist.h"
+#include "radeon_devlist.h"
+
+#include <stdio.h>
+
+#define nitems(_a) (sizeof((_a)) / sizeof((_a)[0]))
+
+const char *
+pci_findvendor(pci_vendor_id_t vendor)
+{
+ const struct pci_known_vendor *kdp = pci_known_vendors;
+
+ while (kdp->vendorname != NULL) { /* all have vendor name */
+ if (kdp->vendor == vendor)
+ break;
+ kdp++;
+ }
+ return (kdp->vendorname);
+}
+
+const char *
+pci_findproduct(pci_vendor_id_t vendor, pci_product_id_t product)
+{
+ const struct pci_known_product *pkp = pci_known_products;
+
+ while (pkp->productname != NULL) { /* all have product name */
+ if (pkp->vendor == vendor && pkp->product == product)
+ break;
+ pkp++;
+ }
+ return (pkp->productname);
+}
+
+void
+print_devices(char driver[], const struct pci_matchid devices[], int items)
+{
+ const char *v, *p;
+ int i;
+
+ for (i = 0; i < items; i++) {
+ v = pci_findvendor(devices[i].pm_vid);
+ p = pci_findproduct(devices[i].pm_vid,
+ devices[i].pm_pid);
+ if ( v && p )
+ printf("%s \"%s %s\"\n", driver, v ? v : "", p ? p : "");
+ }
+}
+
+int
+main(void)
+{
+ printf("%s\n", "acx");
+ printf("%s\n", "amdgpu");
+ print_devices("amdgpu", amdgpu_devices, nitems(amdgpu_devices));
+ printf("%s\n", "athn");
+ printf("%s\n", "bwfm");
+ printf("%s\n", "bwi");
+ printf("%s\n", "intel");
+ printf("%s\n", "intel ^cpu0: Intel");
+ printf("%s\n", "inteldrm");
+ print_devices("inteldrm", i915_devices, nitems(i915_devices));
+ printf("%s\n", "ipw");
+ printf("%s\n", "iwi");
+ printf("%s\n", "iwm");
+ printf("%s\n", "iwn");
+ printf("%s\n", "iwx");
+ printf("%s\n", "malo");
+ printf("%s\n", "ogx");
+ printf("%s\n", "otus");
+ printf("%s\n", "pgt");
+ printf("%s\n", "radeondrm");
+ print_devices("radeondrm", radeon_devices, nitems(radeon_devices));
+ printf("%s\n", "rsu");
+ printf("%s\n", "rtwn");
+ printf("%s\n", "uath");
+ printf("%s\n", "upgt");
+ printf("%s\n", "urtwn");
+ printf("%s\n", "uvideo");
+ printf("%s\n", "vmm");
+ printf("%s\n", "wpi");
+
+ return 0;
+}