[systemd-devel] [PATCH][pciutils] libpci: pci_id_lookup - add udev/hwdb support
Tom Gundersen
teg at jklm.no
Sat Jul 20 14:40:38 PDT 2013
Small correction to the subject, it should have said:
[PATCH][pciutils] libpci: pci_id_lookup - add udev/hwdb support
On Sat, Jul 20, 2013 at 10:44 PM, Tom Gundersen <teg at jklm.no> wrote:
> 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 at 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 <libudev.h>
> +#include <stdio.h>
> +#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)
> {
> --
> 1.8.3.3
>
More information about the systemd-devel
mailing list