1*c2e0c6b5SAndroid Build Coastguard Worker /*
2*c2e0c6b5SAndroid Build Coastguard Worker * The PCI Library -- Looking up Names via UDEV and HWDB
3*c2e0c6b5SAndroid Build Coastguard Worker *
4*c2e0c6b5SAndroid Build Coastguard Worker * Copyright (c) 2013--2014 Tom Gundersen <[email protected]>
5*c2e0c6b5SAndroid Build Coastguard Worker * Copyright (c) 2014 Martin Mares <[email protected]>
6*c2e0c6b5SAndroid Build Coastguard Worker *
7*c2e0c6b5SAndroid Build Coastguard Worker * Can be freely distributed and used under the terms of the GNU GPL v2+.
8*c2e0c6b5SAndroid Build Coastguard Worker *
9*c2e0c6b5SAndroid Build Coastguard Worker * SPDX-License-Identifier: GPL-2.0-or-later
10*c2e0c6b5SAndroid Build Coastguard Worker */
11*c2e0c6b5SAndroid Build Coastguard Worker
12*c2e0c6b5SAndroid Build Coastguard Worker #include <string.h>
13*c2e0c6b5SAndroid Build Coastguard Worker
14*c2e0c6b5SAndroid Build Coastguard Worker #include "internal.h"
15*c2e0c6b5SAndroid Build Coastguard Worker #include "names.h"
16*c2e0c6b5SAndroid Build Coastguard Worker
17*c2e0c6b5SAndroid Build Coastguard Worker #ifdef PCI_HAVE_HWDB
18*c2e0c6b5SAndroid Build Coastguard Worker
19*c2e0c6b5SAndroid Build Coastguard Worker #include <libudev.h>
20*c2e0c6b5SAndroid Build Coastguard Worker #include <stdio.h>
21*c2e0c6b5SAndroid Build Coastguard Worker #include <stdlib.h>
22*c2e0c6b5SAndroid Build Coastguard Worker
23*c2e0c6b5SAndroid Build Coastguard Worker char *
pci_id_hwdb_lookup(struct pci_access * a,int cat,int id1,int id2,int id3,int id4 UNUSED)24*c2e0c6b5SAndroid Build Coastguard Worker pci_id_hwdb_lookup(struct pci_access *a, int cat, int id1, int id2, int id3, int id4 UNUSED)
25*c2e0c6b5SAndroid Build Coastguard Worker {
26*c2e0c6b5SAndroid Build Coastguard Worker char modalias[64];
27*c2e0c6b5SAndroid Build Coastguard Worker const char *key = NULL;
28*c2e0c6b5SAndroid Build Coastguard Worker
29*c2e0c6b5SAndroid Build Coastguard Worker const char *disabled = pci_get_param(a, "hwdb.disable");
30*c2e0c6b5SAndroid Build Coastguard Worker if (disabled && atoi(disabled))
31*c2e0c6b5SAndroid Build Coastguard Worker return NULL;
32*c2e0c6b5SAndroid Build Coastguard Worker
33*c2e0c6b5SAndroid Build Coastguard Worker switch (cat)
34*c2e0c6b5SAndroid Build Coastguard Worker {
35*c2e0c6b5SAndroid Build Coastguard Worker case ID_VENDOR:
36*c2e0c6b5SAndroid Build Coastguard Worker sprintf(modalias, "pci:v%08X*", id1);
37*c2e0c6b5SAndroid Build Coastguard Worker key = "ID_VENDOR_FROM_DATABASE";
38*c2e0c6b5SAndroid Build Coastguard Worker break;
39*c2e0c6b5SAndroid Build Coastguard Worker case ID_DEVICE:
40*c2e0c6b5SAndroid Build Coastguard Worker sprintf(modalias, "pci:v%08Xd%08X*", id1, id2);
41*c2e0c6b5SAndroid Build Coastguard Worker key = "ID_MODEL_FROM_DATABASE";
42*c2e0c6b5SAndroid Build Coastguard Worker break;
43*c2e0c6b5SAndroid Build Coastguard Worker case ID_SUBSYSTEM:
44*c2e0c6b5SAndroid Build Coastguard Worker /*
45*c2e0c6b5SAndroid Build Coastguard Worker * There is no udev hwdb key which returns subsystem. Also note that query
46*c2e0c6b5SAndroid Build Coastguard Worker * modalias "pci:v%08Xd%08Xsv%08Xsd%08X*" matches also hwdb device with
47*c2e0c6b5SAndroid Build Coastguard Worker * modalias "pci:v%08Xd%08Xsv*sd*" (which is the default modalias), so
48*c2e0c6b5SAndroid Build Coastguard Worker * there is no way to get information specific for the subsystem.
49*c2e0c6b5SAndroid Build Coastguard Worker */
50*c2e0c6b5SAndroid Build Coastguard Worker return NULL;
51*c2e0c6b5SAndroid Build Coastguard Worker case ID_GEN_SUBSYSTEM:
52*c2e0c6b5SAndroid Build Coastguard Worker /* There is no udev hwdb key which returns generic subsystem. */
53*c2e0c6b5SAndroid Build Coastguard Worker return NULL;
54*c2e0c6b5SAndroid Build Coastguard Worker case ID_CLASS:
55*c2e0c6b5SAndroid Build Coastguard Worker sprintf(modalias, "pci:v*d*sv*sd*bc%02X*", id1);
56*c2e0c6b5SAndroid Build Coastguard Worker key = "ID_PCI_CLASS_FROM_DATABASE";
57*c2e0c6b5SAndroid Build Coastguard Worker break;
58*c2e0c6b5SAndroid Build Coastguard Worker case ID_SUBCLASS:
59*c2e0c6b5SAndroid Build Coastguard Worker sprintf(modalias, "pci:v*d*sv*sd*bc%02Xsc%02X*", id1, id2);
60*c2e0c6b5SAndroid Build Coastguard Worker key = "ID_PCI_SUBCLASS_FROM_DATABASE";
61*c2e0c6b5SAndroid Build Coastguard Worker break;
62*c2e0c6b5SAndroid Build Coastguard Worker case ID_PROGIF:
63*c2e0c6b5SAndroid Build Coastguard Worker sprintf(modalias, "pci:v*d*sv*sd*bc%02Xsc%02Xi%02X*", id1, id2, id3);
64*c2e0c6b5SAndroid Build Coastguard Worker key = "ID_PCI_INTERFACE_FROM_DATABASE";
65*c2e0c6b5SAndroid Build Coastguard Worker break;
66*c2e0c6b5SAndroid Build Coastguard Worker }
67*c2e0c6b5SAndroid Build Coastguard Worker
68*c2e0c6b5SAndroid Build Coastguard Worker if (key)
69*c2e0c6b5SAndroid Build Coastguard Worker {
70*c2e0c6b5SAndroid Build Coastguard Worker if (!a->id_udev_hwdb)
71*c2e0c6b5SAndroid Build Coastguard Worker {
72*c2e0c6b5SAndroid Build Coastguard Worker a->debug("Initializing UDEV HWDB\n");
73*c2e0c6b5SAndroid Build Coastguard Worker a->id_udev = udev_new();
74*c2e0c6b5SAndroid Build Coastguard Worker a->id_udev_hwdb = udev_hwdb_new(a->id_udev);
75*c2e0c6b5SAndroid Build Coastguard Worker }
76*c2e0c6b5SAndroid Build Coastguard Worker
77*c2e0c6b5SAndroid Build Coastguard Worker struct udev_list_entry *entry;
78*c2e0c6b5SAndroid Build Coastguard Worker udev_list_entry_foreach(entry, udev_hwdb_get_properties_list_entry(a->id_udev_hwdb, modalias, 0))
79*c2e0c6b5SAndroid Build Coastguard Worker {
80*c2e0c6b5SAndroid Build Coastguard Worker const char *entry_name = udev_list_entry_get_name(entry);
81*c2e0c6b5SAndroid Build Coastguard Worker if (entry_name && !strcmp(entry_name, key))
82*c2e0c6b5SAndroid Build Coastguard Worker {
83*c2e0c6b5SAndroid Build Coastguard Worker const char *entry_value = udev_list_entry_get_value(entry);
84*c2e0c6b5SAndroid Build Coastguard Worker if (entry_value)
85*c2e0c6b5SAndroid Build Coastguard Worker return pci_strdup(a, entry_value);
86*c2e0c6b5SAndroid Build Coastguard Worker }
87*c2e0c6b5SAndroid Build Coastguard Worker }
88*c2e0c6b5SAndroid Build Coastguard Worker }
89*c2e0c6b5SAndroid Build Coastguard Worker
90*c2e0c6b5SAndroid Build Coastguard Worker return NULL;
91*c2e0c6b5SAndroid Build Coastguard Worker }
92*c2e0c6b5SAndroid Build Coastguard Worker
93*c2e0c6b5SAndroid Build Coastguard Worker void
pci_id_hwdb_free(struct pci_access * a)94*c2e0c6b5SAndroid Build Coastguard Worker pci_id_hwdb_free(struct pci_access *a)
95*c2e0c6b5SAndroid Build Coastguard Worker {
96*c2e0c6b5SAndroid Build Coastguard Worker if (a->id_udev_hwdb)
97*c2e0c6b5SAndroid Build Coastguard Worker {
98*c2e0c6b5SAndroid Build Coastguard Worker udev_hwdb_unref(a->id_udev_hwdb);
99*c2e0c6b5SAndroid Build Coastguard Worker a->id_udev_hwdb = NULL;
100*c2e0c6b5SAndroid Build Coastguard Worker }
101*c2e0c6b5SAndroid Build Coastguard Worker if (a->id_udev)
102*c2e0c6b5SAndroid Build Coastguard Worker {
103*c2e0c6b5SAndroid Build Coastguard Worker udev_unref(a->id_udev);
104*c2e0c6b5SAndroid Build Coastguard Worker a->id_udev = NULL;
105*c2e0c6b5SAndroid Build Coastguard Worker }
106*c2e0c6b5SAndroid Build Coastguard Worker }
107*c2e0c6b5SAndroid Build Coastguard Worker
108*c2e0c6b5SAndroid Build Coastguard Worker #else
109*c2e0c6b5SAndroid Build Coastguard Worker
110*c2e0c6b5SAndroid Build Coastguard Worker char *
pci_id_hwdb_lookup(struct pci_access * a UNUSED,int cat UNUSED,int id1 UNUSED,int id2 UNUSED,int id3 UNUSED,int id4 UNUSED)111*c2e0c6b5SAndroid Build Coastguard Worker pci_id_hwdb_lookup(struct pci_access *a UNUSED, int cat UNUSED, int id1 UNUSED, int id2 UNUSED, int id3 UNUSED, int id4 UNUSED)
112*c2e0c6b5SAndroid Build Coastguard Worker {
113*c2e0c6b5SAndroid Build Coastguard Worker return NULL;
114*c2e0c6b5SAndroid Build Coastguard Worker }
115*c2e0c6b5SAndroid Build Coastguard Worker
116*c2e0c6b5SAndroid Build Coastguard Worker void
pci_id_hwdb_free(struct pci_access * a UNUSED)117*c2e0c6b5SAndroid Build Coastguard Worker pci_id_hwdb_free(struct pci_access *a UNUSED)
118*c2e0c6b5SAndroid Build Coastguard Worker {
119*c2e0c6b5SAndroid Build Coastguard Worker }
120*c2e0c6b5SAndroid Build Coastguard Worker
121*c2e0c6b5SAndroid Build Coastguard Worker #endif
122