From nobody Thu Feb 29 16:37:05 2024 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4TlxhK5Qg7z5CVHB; Thu, 29 Feb 2024 16:37:05 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4TlxhK4cfQz43mq; Thu, 29 Feb 2024 16:37:05 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1709224625; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=SN5785BnWe3eQieuoFF9GfzYQ4FjJsMm9ItD5sv2lbE=; b=dfmxWzQxudmYRkCZRWxFvfkjaLqWzPrqdPn+ANvtQdy73IpyaE26oLRAcL3STT/roh4pIs n1KL7/g5+Zh/LT9hq8X8IB50e5pIrq3KSkODmxPZmPA1Hokupxm+EpX1IIMZ91Yc5plBTF J7B+yCO5/vQsZ10QhhGS9sLgWWQRZd2NzlJKkamxOBT493vOJHbLMyml++4cybcG7SaewZ jV/QUWn02paFKEoevW1zb0h493xIqzdfMAddUQR52jM+Vfp1YJ7CHHtFz4SdxHMeNN33Bq 3ogSVPCn6NpnopmE0nZncdjJ30GROA/keW6DzcK5sQpMemnoIVBoc/teV9leSQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1709224625; a=rsa-sha256; cv=none; b=GcCOfLBn4u8emiV1q272kReLvLNdcDcMdylbYOkUPor2H3qz/aVe8HwZ4o1N8Sa2Jsj1TK QgjJC6r4b+rCFZQTLkKC0kJ9XWhkfNkZhL7Q07HWOkgg1dhiwrNzNUoNmXz26yrUZJNq0r YkMUOIyYpXd+Uxc/7DHY2FsI7oHyCQnBYdXQbALVG8+TkADJ/6Rd9oUeVRJZphaR0l7Dpt t+eDHtyg39KGGdi4oyLEkcLevUixxA+e7x3qqn/JmQ2KPiMUVrECLstKeTsB3VQVaoiQ/q b6jXdDi+BUyZOhsn7IJiKGVqC90vme4ZgKh8mtlaa9f51HpiggoxZZJEGwWA0w== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1709224625; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=SN5785BnWe3eQieuoFF9GfzYQ4FjJsMm9ItD5sv2lbE=; b=O2NpS4w21RQouw1OT4zC26bPLZnSkkyk7modjArj31zUs4AUx5B5QUqa5D9Bc0kMO68J6H gAblPwnPHua5HL98sTuNbxQvFJSe7Vhic13Ne0wxdCB1APBBdfRKi3G7BxCsqWSQiO4S/+ K9ITmVqkc5Zr/PqE1iprr0oe8OABmMjBkEJYuBOdHAy1dZvKr4Mvbclvu+fBVNBqqIpzci yiQjzxnsiFbd7VNmGUUmDwLsExgxmb+9ksfhRepJsV+SwFOImSzhTqHEDQJKmcbz298G6m yOPmKh2zPb0mgLyz/3Xav8Zoc4GIeQA9pkJnTPISKhOsjK/oyqU3NirmkHQoLg== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4TlxhK4DTBzqNL; Thu, 29 Feb 2024 16:37:05 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 41TGb5PI041757; Thu, 29 Feb 2024 16:37:05 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 41TGb5Wm041754; Thu, 29 Feb 2024 16:37:05 GMT (envelope-from git) Date: Thu, 29 Feb 2024 16:37:05 GMT Message-Id: <202402291637.41TGb5Wm041754@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Warner Losh Subject: git: 479905a1ed26 - main - firmware: Allow binary files to be loaded by /boot/loader List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: dev-commits-src-main@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: imp X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 479905a1ed26c54ef29cdff65cf25f7feade654b Auto-Submitted: auto-generated The branch main has been updated by imp: URL: https://cgit.FreeBSD.org/src/commit/?id=479905a1ed26c54ef29cdff65cf25f7feade654b commit 479905a1ed26c54ef29cdff65cf25f7feade654b Author: Warner Losh AuthorDate: 2024-02-29 16:36:31 +0000 Commit: Warner Losh CommitDate: 2024-02-29 16:36:31 +0000 firmware: Allow binary files to be loaded by /boot/loader Files loaded "-t firmware" (or module_type="firmware"). They are registered with the firmware system using the full path to the file. There's only one firmware per file, and it is the entire file. We do an extra firmware_get() on any firmware we find here to prevent them from ever being unloaded (we can't handle that case sanely). Sponsored by: Netflix Reviewed by: tsoome, jhb Differential Revision: https://reviews.freebsd.org/D43522 --- sys/kern/subr_firmware.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/sys/kern/subr_firmware.c b/sys/kern/subr_firmware.c index 059bedeaac1c..33ec2e0cc0e4 100644 --- a/sys/kern/subr_firmware.c +++ b/sys/kern/subr_firmware.c @@ -161,6 +161,19 @@ lookup(const char *name) LIST_FOREACH(fp, &firmware_table, link) { if (fp->fw.name != NULL && strcasecmp(name, fp->fw.name) == 0) break; + + /* + * If the name looks like an absolute path, also try to match + * the last part of the string to the requested firmware if it + * matches the trailing components. This allows us to load + * /boot/firmware/abc/bca2233_fw.bin and match it against + * requests for bca2233_fw.bin or abc/bca2233_fw.bin. + */ + if (*fp->fw.name == '/' && strlen(fp->fw.name) > strlen(name)) { + const char *p = fp->fw.name + strlen(fp->fw.name) - strlen(name); + if (p[-1] == '/' && strcasecmp(name, p) == 0) + break; + } } return (fp); } @@ -548,6 +561,42 @@ restart: mtx_unlock(&firmware_mtx); } +/* + * Find all the binary firmware that was loaded in the boot loader via load -t + * firmware foo. There is only one firmware per file, it's the whole file, and + * there's no meaningful version passed in, so pass 0 for that. If version is + * needed by the consumer (and not just arbitrarily defined), the .ko version + * must be used instead. + */ +static void +firmware_binary_files(void) +{ + caddr_t file; + char *name; + const char *type; + const void *addr; + size_t size; + unsigned int version = 0; + const struct firmware *fw; + struct priv_fw *fp; + + file = 0; + for (;;) { + file = preload_search_next_name(file); + if (file == 0) + break; + type = (const char *)preload_search_info(file, MODINFO_TYPE); + if (type == NULL || strcmp(type, "firmware") != 0) + continue; + name = preload_search_info(file, MODINFO_NAME); + addr = preload_fetch_addr(file); + size = preload_fetch_size(file); + fw = firmware_register(name, addr, size, version, NULL); + fp = PRIV_FW(fw); + fp->refcnt++; /* Hold an extra reference so we never unload */ + } +} + /* * Module glue. */ @@ -566,6 +615,7 @@ firmware_modevent(module_t mod, int type, void *unused) /* NB: use our own loop routine that sets up context */ (void) taskqueue_start_threads(&firmware_tq, 1, PWAIT, "firmware taskq"); + firmware_binary_files(); if (rootvnode != NULL) { /* * Root is already mounted so we won't get an event;