This patch is used to add the class_id support
for pci_probe since some devices need the class_info
(class_code, subclass_code, programming_interface)

Signed-off-by: Ziye Yang <ziye.yang at intel.com>
---
 lib/librte_eal/bsdapp/eal/eal_pci.c     | 4 ++++
 lib/librte_eal/common/eal_common_pci.c  | 3 +++
 lib/librte_eal/common/include/rte_pci.h | 8 ++++++--
 lib/librte_eal/linuxapp/eal/eal_pci.c   | 9 +++++++++
 4 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/lib/librte_eal/bsdapp/eal/eal_pci.c 
b/lib/librte_eal/bsdapp/eal/eal_pci.c
index 6c21fbd..3b12ee6 100644
--- a/lib/librte_eal/bsdapp/eal/eal_pci.c
+++ b/lib/librte_eal/bsdapp/eal/eal_pci.c
@@ -273,6 +273,10 @@ pci_scan_one(int dev_pci_fd, struct pci_conf *conf)
        /* get subsystem_device id */
        dev->id.subsystem_device_id = conf->pc_subdevice;

+       dev->id.class_id = (conf->pc_class << 16) |
+                          (conf->pc_subclass << 8) |
+                          (conf->pc_progif);
+
        /* TODO: get max_vfs */
        dev->max_vfs = 0;

diff --git a/lib/librte_eal/common/eal_common_pci.c 
b/lib/librte_eal/common/eal_common_pci.c
index dcfe947..6832821 100644
--- a/lib/librte_eal/common/eal_common_pci.c
+++ b/lib/librte_eal/common/eal_common_pci.c
@@ -162,6 +162,9 @@ rte_eal_pci_probe_one_driver(struct rte_pci_driver *dr, 
struct rte_pci_device *d
                if (id_table->subsystem_device_id != 
dev->id.subsystem_device_id &&
                                id_table->subsystem_device_id != PCI_ANY_ID)
                        continue;
+               if (id_table->class_id != dev->id.class_id &&
+                               id_table->class_id != CLASS_ANY_ID)
+                       continue;

                struct rte_pci_addr *loc = &dev->addr;

diff --git a/lib/librte_eal/common/include/rte_pci.h 
b/lib/librte_eal/common/include/rte_pci.h
index 334c12e..a538fbe 100644
--- a/lib/librte_eal/common/include/rte_pci.h
+++ b/lib/librte_eal/common/include/rte_pci.h
@@ -129,6 +129,7 @@ struct rte_pci_id {
        uint16_t device_id;           /**< Device ID or PCI_ANY_ID. */
        uint16_t subsystem_vendor_id; /**< Subsystem vendor ID or PCI_ANY_ID. */
        uint16_t subsystem_device_id; /**< Subsystem device ID or PCI_ANY_ID. */
+       uint32_t class_id;           /**< Class ID (class, subclass, pi) or 
CLASS_ANY_ID. */
 };

 /**
@@ -170,6 +171,7 @@ struct rte_pci_device {

 /** Any PCI device identifier (vendor, device, ...) */
 #define PCI_ANY_ID (0xffff)
+#define CLASS_ANY_ID (0xffffff)

 #ifdef __cplusplus
 /** C++ macro used to help building up tables of device IDs */
@@ -177,14 +179,16 @@ struct rte_pci_device {
        (vend),                   \
        (dev),                    \
        PCI_ANY_ID,               \
-       PCI_ANY_ID
+       PCI_ANY_ID,               \
+       CLASS_ANY_ID
 #else
 /** Macro used to help building up tables of device IDs */
 #define RTE_PCI_DEVICE(vend, dev)          \
        .vendor_id = (vend),               \
        .device_id = (dev),                \
        .subsystem_vendor_id = PCI_ANY_ID, \
-       .subsystem_device_id = PCI_ANY_ID
+       .subsystem_device_id = PCI_ANY_ID, \
+       .class_id = CLASS_ANY_ID
 #endif

 struct rte_pci_driver;
diff --git a/lib/librte_eal/linuxapp/eal/eal_pci.c 
b/lib/librte_eal/linuxapp/eal/eal_pci.c
index bc5b5be..d9bfc0c 100644
--- a/lib/librte_eal/linuxapp/eal/eal_pci.c
+++ b/lib/librte_eal/linuxapp/eal/eal_pci.c
@@ -306,6 +306,15 @@ pci_scan_one(const char *dirname, uint16_t domain, uint8_t 
bus,
        }
        dev->id.subsystem_device_id = (uint16_t)tmp;

+       /* get class_id */
+       snprintf(filename, sizeof(filename), "%s/class",
+                dirname);
+       if (eal_parse_sysfs_value(filename, &tmp) < 0) {
+               free(dev);
+               return -1;
+       }
+       dev->id.class_id = (uint32_t)tmp && CLASS_ANY_ID;
+
        /* get max_vfs */
        dev->max_vfs = 0;
        snprintf(filename, sizeof(filename), "%s/max_vfs", dirname);
-- 
1.9.3

Reply via email to