From nobody Mon Sep 21 18:39:35 2026 X-Original-To: dev-commits-src-all@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 4hpX8F21gWz6t144 for ; Mon, 21 Sep 2026 18:39:41 +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 "YR2" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4hpX8F19J8z4Dqt for ; Mon, 21 Sep 2026 18:39:41 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1790015981; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=5ifwG+WPVtaaciTIZDiEmS/PPgFY9rqlwmhXNxyUddo=; b=WHWor4ZF5YyDwa/6D5FdTWBNh08av9U1YulI7Ha6F+aQ13Q9ZJKoOW3MpB+cyW7Gcwi/8/ aUe0MwOt/cDIRPPmzT02xEQ7kB6N0Vl0vcCT+DMN74bnXZHMcsv+NEVHvX1DWrTLurswGD s5/efi5U3GHgqTHnKU3oTDLAX/e10LD84s5WmbXpK1Imu9YTWPNZ6G2A9qnLpd8Fg5QrT2 a0kUUfGh3zj6KR+Xx2Oc5OA7UsCeU074PzZlplOr14bkMfa7U42ZNF9Z/4q5gx8XyCA8Hi jo3XkCbkU3DsMuBt8q15eWPmwPC4V9aSGMeUHXqnI5Pxd7BYfJgf+Zk7/ZQ3lQ== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1790015981; b=Bo+RRr2JF2dGFO+Qyzf0a0sAx5rFysYru3NwMSfxw++O9/IRnQ0vBwoiS9X5WE69/iTwp8 e7lQph1rEAIEe00SYggckfGKOfOlr7gtd8OFCHfeyxCmAVYfl7fMGdMD/X6X6r3kz97RBV iVp2eCCjP8MVxl9F9odYswU9iZg3R3xzIrT9OiSWU4SqzcvpwvlgqpiMz9D41M52rNQ4fm ux0la+eHLM/V6pgra7jTWf/E9a5H+5wGOGP7qsxt16wQi2qBToWMm27xK5koy27PjBkiMo oAF85+nYpTOMldumR7jSLf2+iOaq+19o2kshBDo7kRO0lwr38jHHeiCMTTDx8A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1790015981; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=5ifwG+WPVtaaciTIZDiEmS/PPgFY9rqlwmhXNxyUddo=; b=HsL5qhGYEon5gCRISUtU2CW4AN/hHr2h2fxOR1fdZ6lVY8wtpJG+xO+d/cMoHE9DEw6bvP xQcn0i8J2q3gnsgwttuKbmE1GFMcOPPP3AM+8p2BWYNoQu3S6Fadcwk5Z12urjyQ8+m5aJ aAs5grokMMPp8HMwq2bI2luD2whM7aIZR9df8jvbTdfutGlcUYEcDVV2AU+mzjNgA5Ymz4 Ws+tyVgy3aLAIYN/r9Aax96W+tx5KG/jP+LxWY2RdvUfl5qCyT02Md53nEnVrphwST5NFt OsYZDt3bAVRLkxK7g5+HkPzAt36sV+UOhQMbepo0qThNCpcv8w9vwvjSWXtxww== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4hpX8D6L4dzY08 for ; Mon, 21 Sep 2026 18:39:40 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 45a39 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Mon, 21 Sep 2026 18:39:35 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org Cc: Federico Angelilli From: Bojan Novk=?utf-8?Q?ovi=C4=87?= Subject: git: 46d383af0dbd - main - pciconf: Add -C option to filter by class name List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: bnovkov X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 46d383af0dbdb3871354f344b9c1ba99da691121 Auto-Submitted: auto-generated Date: Mon, 21 Sep 2026 18:39:35 +0000 Message-Id: <6ab179e7.45a39.355b76c8@gitrepo.freebsd.org> The branch main has been updated by bnovkov: URL: https://cgit.FreeBSD.org/src/commit/?id=46d383af0dbdb3871354f344b9c1ba99da691121 commit 46d383af0dbdb3871354f344b9c1ba99da691121 Author: Federico Angelilli AuthorDate: 2026-09-21 18:23:10 +0000 Commit: Bojan Novković CommitDate: 2026-09-21 18:37:59 +0000 pciconf: Add -C option to filter by class name Differential Revision: https://reviews.freebsd.org/D59602 MFC after: 3 weeks PR: 289923 Reviewed by: bnovkov --- usr.sbin/pciconf/pciconf.8 | 10 ++++++++-- usr.sbin/pciconf/pciconf.c | 40 +++++++++++++++++++++++++++++++++++----- 2 files changed, 43 insertions(+), 7 deletions(-) diff --git a/usr.sbin/pciconf/pciconf.8 b/usr.sbin/pciconf/pciconf.8 index 1c9be4e817ae..e82db4ed0fc8 100644 --- a/usr.sbin/pciconf/pciconf.8 +++ b/usr.sbin/pciconf/pciconf.8 @@ -23,7 +23,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd September 5, 2026 +.Dd September 21, 2026 .Dt PCICONF 8 .Os .Sh NAME @@ -31,7 +31,7 @@ .Nd diagnostic utility for the PCI bus .Sh SYNOPSIS .Nm -.Fl l Oo Fl BbceVv Oc Op Ar device +.Fl l Oo Fl BbceVv Oc Oo Fl C Ar class Oc Op Ar device .Nm .Fl t Oo Fl v Oc .Nm @@ -227,6 +227,12 @@ Each capability is enumerated via a line in the following format: cap 10[40] = PCI-Express 1 root port .Ed .Pp +If the +.Fl C +option is supplied, +.Nm +will list only the devices whose PCI class name matches the given argument. +.Pp The first value after the .Dq Li cap prefix is the capability ID in hexadecimal. diff --git a/usr.sbin/pciconf/pciconf.c b/usr.sbin/pciconf/pciconf.c index 581a0cb3ff85..7da61da5fa11 100644 --- a/usr.sbin/pciconf/pciconf.c +++ b/usr.sbin/pciconf/pciconf.c @@ -79,10 +79,11 @@ static struct pcisel getsel(const char *str); static void list_bridge(int fd, struct pci_conf *p); static void list_bars(int fd, struct pci_conf *p); static void list_devs(const char *name, int verbose, int bars, int bridge, - int caps, int errors, int vpd, int compact); + int caps, int errors, int vpd, int compact, const char *class); static void show_tree(int verbose); static void list_verbose(struct pci_conf *p); static void list_vpd(int fd, struct pci_conf *p); +static bool validate_class(const char *class); static const char *guess_class(struct pci_conf *p); static const char *guess_subclass(struct pci_conf *p); static int load_vendors(void); @@ -103,7 +104,7 @@ usage(void) { fprintf(stderr, "%s", - "usage: pciconf -l [-BbcevV] [device]\n" + "usage: pciconf -l [-BbcevV] [-C class] [device]\n" " pciconf -t [-v]\n" " pciconf -a device\n" " pciconf -r [-b | -h] device addr[:addr2]\n" @@ -122,12 +123,14 @@ main(int argc, char **argv) enum { NONE, LIST, TREE, READ, WRITE, ATTACHED, DUMPBAR, READBAR, WRITEBAR } mode; int compact, bars, bridge, caps, errors, verbose, vpd; + const char *class; mode = NONE; compact = bars = bridge = caps = errors = verbose = vpd = 0; width = 4; + class = NULL; - while ((c = getopt(argc, argv, "aBbcDehlRrtWwVvx")) != -1) { + while ((c = getopt(argc, argv, "aBbcC:DehlRrtWwVvx")) != -1) { switch(c) { case 'a': mode = ATTACHED; @@ -146,6 +149,10 @@ main(int argc, char **argv) caps++; break; + case 'C': + class = optarg; + break; + case 'D': mode = DUMPBAR; break; @@ -206,7 +213,7 @@ main(int argc, char **argv) if (optind >= argc + 1) usage(); list_devs(optind + 1 == argc ? argv[optind] : NULL, verbose, - bars, bridge, caps, errors, vpd, compact); + bars, bridge, caps, errors, vpd, compact, class); break; case TREE: if (optind != argc) @@ -314,16 +321,20 @@ fetch_devs(int fd, const char *name, struct pci_conf **confp, size_t *countp) static void list_devs(const char *name, int verbose, int bars, int bridge, int caps, - int errors, int vpd, int compact) + int errors, int vpd, int compact, const char *class) { int fd; struct pci_conf *conf, *p; size_t count; + const char *pclass; int none_count = 0; if (verbose) load_vendors(); + if (class != NULL && !validate_class(class)) + errx(1, "Invalid class name"); + fd = open(_PATH_DEVPCI, (bridge || caps || errors) ? O_RDWR : O_RDONLY, 0); if (fd < 0) @@ -339,6 +350,12 @@ list_devs(const char *name, int verbose, int bars, int bridge, int caps, printf("drv\tselector\tclass rev hdr " "vendor device subven subdev\n"); for (p = conf; p < conf + count; p++) { + if (class != NULL) { + pclass = guess_class(p); + if (pclass == NULL || strcasecmp(pclass, class) != 0) + continue; + } + if (compact) printf("%s%d@pci%d:%d:%d:%d:" "\t%06x %02x %02x " @@ -1081,6 +1098,19 @@ static struct {0, 0, NULL} }; +static bool +validate_class(const char *class) +{ + int i; + + for (i = 0; pci_nomatch_tab[i].desc != NULL; i++) { + if ((strcasecmp(class, pci_nomatch_tab[i].desc) == 0) && + (pci_nomatch_tab[i].subclass == -1)) + return (true); + } + return (false); +} + static const char * guess_class(struct pci_conf *p) {