From 901907d11663e87540ae3f4dc6b5315da32e4f16 Mon Sep 17 00:00:00 2001 From: deraadt Date: Wed, 5 Jan 2022 16:24:29 +0000 Subject: [PATCH] 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. --- usr.sbin/fw_update/Makefile | 28 ++++++++ usr.sbin/fw_update/patterns.c | 121 ++++++++++++++++++++++++++++++++++ 2 files changed, 149 insertions(+) create mode 100644 usr.sbin/fw_update/Makefile create mode 100644 usr.sbin/fw_update/patterns.c 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 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 +#include +#include +#include + +#include "amdgpu_devlist.h" +#include "i915_devlist.h" +#include "radeon_devlist.h" + +#include + +#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; +} -- 2.20.1