From patchwork Sat Jul 20 20:44:40 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Gundersen X-Patchwork-Id: 260480 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id C4C372C00A7 for ; Sun, 21 Jul 2013 06:44:56 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754966Ab3GTUoz (ORCPT ); Sat, 20 Jul 2013 16:44:55 -0400 Received: from mail-wg0-f43.google.com ([74.125.82.43]:52545 "EHLO mail-wg0-f43.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754946Ab3GTUoy (ORCPT ); Sat, 20 Jul 2013 16:44:54 -0400 Received: by mail-wg0-f43.google.com with SMTP id z11so4724749wgg.34 for ; Sat, 20 Jul 2013 13:44:53 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=from:to:cc:subject:date:message-id:x-mailer:x-gm-message-state; bh=RoXcigjVzlSYfiSyYP8AgGPkbiAxdxfKexAESyn0T3c=; b=IB+iRIfZjcBDVmOgOWlPtO+pstDof6NigSgaPe9cNJUpIGMlEaaoJDtmNu2ozLIMlx tCuIjDoExGxPBZ9bN+IMqoe1u5UKXOFzC5GtXtSwkAp8EZq0ZWTAVe/HNQY936PXVzCe tqNLL8vWRW/eULwBtJs5xQiaDCYntxUJPcKJ2n6XN6zAluoGTqcL5j0SxXtFDieW7PgY OKkX7LPrz8vd4vzchQiyhSVFKi/OLU7srGIqMyPMbdwHavlmy0Qcqrt3dRSkN5xX1unU v+2XBKWr6UcLrSG6WkzMTZkR/yFrtN/oIxYWXDXDmxct08Imi3ydWYWpm6GiC2gJqyCe 53Bw== X-Received: by 10.180.188.97 with SMTP id fz1mr14566199wic.34.1374353093399; Sat, 20 Jul 2013 13:44:53 -0700 (PDT) Received: from localhost.localdomain (ip-104.net-82-216-159.suresnes3.rev.numericable.fr. [82.216.159.104]) by mx.google.com with ESMTPSA id nb12sm56325647wic.7.2013.07.20.13.44.52 for (version=TLSv1.2 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sat, 20 Jul 2013 13:44:52 -0700 (PDT) From: Tom Gundersen To: linux-pci@vger.kernel.org Cc: Tom Gundersen , systemd-devel@lists.freedesktop.org Subject: [PATCH][pciutils] lspci: pci_id_lookup - add udev/hwdb support Date: Sat, 20 Jul 2013 22:44:40 +0200 Message-Id: <1374353080-15837-1-git-send-email-teg@jklm.no> X-Mailer: git-send-email 1.8.3.3 X-Gm-Message-State: ALoCoQmsAlu4u0hSw9RGjwig6N0ZlpNFeJiNEE+98kseTE1EGs4rrImq/jEQDF9diA2lM1n9HlOl Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org This lets you select hwdb support at compile time. hwdb is an efficient hardware database shipped with recent versions of systemd/udev. It contains among other sources pci.ids so querying hwdb rather than reading pci.ids directly should give the same result. Ideally Linux distros using systemd would like to not ship pci.ids, but use hwdb as the only source of this information, which this patch allows. Cc: systemd-devel@lists.freedesktop.org --- lib/configure | 17 ++++++++++++++++ lib/names-hash.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 74 insertions(+), 2 deletions(-) diff --git a/lib/configure b/lib/configure index 4ae20d4..674d3ea 100755 --- a/lib/configure +++ b/lib/configure @@ -141,6 +141,23 @@ esac echo >>$c '#define PCI_HAVE_PM_DUMP' echo " dump" +echo_n "Checking for udev hwdb support... " +if [ "$HWDB" = yes -o "$HWDB" = no ] ; then + echo "$HWDB (set manually)" +else + if [ -f /usr/include/libudev.h -o -f /usr/local/include/libudev.h ] ; then + HWDB=yes + else + HWDB=no + fi + echo "$HWDB (auto-detected)" +fi +if [ "$HWDB" = yes ] ; then + echo >>$c '#define PCI_HAVE_HWDB' + echo >>$m 'LIBUDEV=-ludev' + echo >>$m 'WITH_LIBS+=$(LIBUDEV)' +fi + echo_n "Checking for zlib support... " if [ "$ZLIB" = yes -o "$ZLIB" = no ] ; then echo "$ZLIB (set manually)" diff --git a/lib/names-hash.c b/lib/names-hash.c index 33f3c11..9661d03 100644 --- a/lib/names-hash.c +++ b/lib/names-hash.c @@ -11,6 +11,11 @@ #include "internal.h" #include "names.h" +#ifdef PCI_HAVE_HWDB +#include +#include +#endif + struct id_bucket { struct id_bucket *next; unsigned int full; @@ -86,8 +91,58 @@ char *pci_id_lookup(struct pci_access *a, int flags, int cat, int id1, int id2, int id3, int id4) { struct id_entry *n, *best; - u32 id12 = id_pair(id1, id2); - u32 id34 = id_pair(id3, id4); + u32 id12, id34; + +#ifdef PCI_HAVE_HWDB + if (!(flags & PCI_LOOKUP_SKIP_LOCAL)) + { + char modalias[64]; + const char *key = NULL; + struct udev *udev = udev_new(); + struct udev_hwdb *hwdb = udev_hwdb_new(udev); + struct udev_list_entry *entry; + + switch(cat) + { + case ID_VENDOR: + sprintf(modalias, "pci:v%08X*", id1); + key = "ID_VENDOR_FROM_DATABASE"; + break; + case ID_DEVICE: + sprintf(modalias, "pci:v%08Xd%08X*", id1, id2); + key = "ID_MODEL_FROM_DATABASE"; + break; + case ID_SUBSYSTEM: + sprintf(modalias, "pci:v%08Xd%08Xsv%08Xsd%08X*", id1, id2, id3, id4); + key = "ID_MODEL_FROM_DATABASE"; + break; + case ID_GEN_SUBSYSTEM: + sprintf(modalias, "pci:v*d*sv%08Xsd%08X*", id1, id2); + key = "ID_MODEL_FROM_DATABASE"; + break; + case ID_CLASS: + sprintf(modalias, "pci:v*d*sv*sd*bc%02X*", id1); + key = "ID_PCI_CLASS_FROM_DATABASE"; + break; + case ID_SUBCLASS: + sprintf(modalias, "pci:v*d*sv*sd*bc%02Xsc%02X*", id1, id2); + key = "ID_PCI_SUBCLASS_FROM_DATABASE"; + break; + case ID_PROGIF: + sprintf(modalias, "pci:v*d*sv*sd*bc%02Xsc%02Xi%02X*", id1, id2, id3); + key = "ID_PCI_INTERFACE_FROM_DATABASE"; + break; + } + + if (key) + udev_list_entry_foreach(entry, udev_hwdb_get_properties_list_entry(hwdb, modalias, 0)) + if (strcmp(udev_list_entry_get_name(entry), key) == 0) + return udev_list_entry_get_value(entry); + } +#endif + + id12 = id_pair(id1, id2); + id34 = id_pair(id3, id4); if (a->id_hash) {