From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm0-f49.google.com (mail-wm0-f49.google.com [74.125.82.49]) by dpdk.org (Postfix) with ESMTP id 159832C01 for ; Tue, 11 Apr 2017 13:07:51 +0200 (CEST) Received: by mail-wm0-f49.google.com with SMTP id o81so60291385wmb.1 for ; Tue, 11 Apr 2017 04:07:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :in-reply-to:references; bh=CYypjBPgVPEzTtKzkbSr0kP1G+Fstohq6OdanpSEyDc=; b=P25koR7QQTWWUpW9YHgor1qsd7ekcGtVZXre/uD90CKEL6NBfGTLyfhQN/FyXbZYWk 9GFxRrHwglylHTBjG5IhA++zfojz9irClIimPHt5b7miWjO2HnWczZeO0MiIqW6S5CWW hkpMwbfWUPJZMFZOTBz+3ZvwdTLL0YMbtf6sw5KsVwPQWkngqGF3iRyDCnFPVhwuqoxL GrB+RIzloGjbA2ogDFcX9y6kxCUPCLUUbYIo3JGRkx3RovgUF9y6Szbd0rZQkrEEFuSM 2TtwnhU29LeC327/V9pYcXcswFGDk51WFdvRMyOT5uRmnXGf93VV8y4QMEC5X4mn+tsy gDaw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:in-reply-to:references; bh=CYypjBPgVPEzTtKzkbSr0kP1G+Fstohq6OdanpSEyDc=; b=mexb8rJY80LIKRJLqQb/nkwMd4fhatNhj4giF9s7HmvXaAcGFkh8Mww5nCzrxxO5mt g3ZsAb4VBBjbbZ31eBOnk897f2KzLA8GMZbxXQGuPvPC4epuO/2CI1qn78o4nZ7jJN2/ hOvZG7fNrKaMhESV4D1fptY1makwB86VYmgcgyuB0paN7N63SfWrV/F/In1nQlqFlIO1 +OgNKXO2iqsiJ+Bl1VCOCt/8I9B+WvtccVean99HCWQ7/wlXsxnEivgIxX27QazcZTvo k1g2ihn6sSmr9STVv4J3hiXyyaahNwCxMlW3VpLx4/iazSQtl7VwRvidmmA1P9jAqxwP jO5g== X-Gm-Message-State: AN3rC/42e9vDiJ0kS+9MaN4Jr5SeZJy/TNuepYUOCEBF5eJzpygbzS3jYQ5ObWsTXPHNpLQ6 X-Received: by 10.28.209.204 with SMTP id i195mr7057657wmg.113.1491908871253; Tue, 11 Apr 2017 04:07:51 -0700 (PDT) Received: from bidouze.dev.6wind.com (host.78.145.23.62.rev.coltfrance.com. [62.23.145.78]) by smtp.gmail.com with ESMTPSA id g15sm1151735wmc.14.2017.04.11.04.07.50 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 11 Apr 2017 04:07:50 -0700 (PDT) From: Gaetan Rivet To: dev@dpdk.org Cc: Shreyansh Jain Date: Tue, 11 Apr 2017 13:07:29 +0200 Message-Id: <8b190d024c8bfd8fe1a0395eaed2f635e1ec79d4.1491906224.git.gaetan.rivet@6wind.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: References: In-Reply-To: References: Subject: [dpdk-dev] [PATCH v13 2/7] pci: split match and probe X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 11 Apr 2017 11:07:52 -0000 From: Shreyansh Jain Matching of PCI device address and driver ID table is being done at two discreet locations duplicating the code. (rte_eal_pci_probe_one_driver and rte_eal_pci_detach_dev). Refactor the match logic as a single function. Signed-off-by: Shreyansh Jain Reviewed-by: Ferruh Yigit Signed-off-by: Gaetan Rivet --- lib/librte_eal/common/eal_common_pci.c | 176 ++++++++++++++++++--------------- 1 file changed, 98 insertions(+), 78 deletions(-) diff --git a/lib/librte_eal/common/eal_common_pci.c b/lib/librte_eal/common/eal_common_pci.c index 1ab92c9..83a81c4 100644 --- a/lib/librte_eal/common/eal_common_pci.c +++ b/lib/librte_eal/common/eal_common_pci.c @@ -154,73 +154,108 @@ pci_unmap_resource(void *requested_addr, size_t size) } /* - * If vendor/device ID match, call the probe() function of the - * driver. + * Match the PCI Driver and Device using the ID Table + * + * @param pci_drv + * PCI driver from which ID table would be extracted + * @param pci_dev + * PCI device to match against the driver + * @return + * 1 for successful match + * 0 for unsuccessful match */ static int -rte_eal_pci_probe_one_driver(struct rte_pci_driver *dr, struct rte_pci_device *dev) +rte_pci_match(const struct rte_pci_driver *pci_drv, + const struct rte_pci_device *pci_dev) { - int ret; const struct rte_pci_id *id_table; - for (id_table = dr->id_table; id_table->vendor_id != 0; id_table++) { - + for (id_table = pci_drv->id_table; id_table->vendor_id != 0; + id_table++) { /* check if device's identifiers match the driver's ones */ - if (id_table->vendor_id != dev->id.vendor_id && + if (id_table->vendor_id != pci_dev->id.vendor_id && id_table->vendor_id != PCI_ANY_ID) continue; - if (id_table->device_id != dev->id.device_id && + if (id_table->device_id != pci_dev->id.device_id && id_table->device_id != PCI_ANY_ID) continue; - if (id_table->subsystem_vendor_id != dev->id.subsystem_vendor_id && - id_table->subsystem_vendor_id != PCI_ANY_ID) + if (id_table->subsystem_vendor_id != + pci_dev->id.subsystem_vendor_id && + id_table->subsystem_vendor_id != PCI_ANY_ID) continue; - if (id_table->subsystem_device_id != dev->id.subsystem_device_id && - id_table->subsystem_device_id != PCI_ANY_ID) + if (id_table->subsystem_device_id != + pci_dev->id.subsystem_device_id && + id_table->subsystem_device_id != PCI_ANY_ID) continue; - if (id_table->class_id != dev->id.class_id && + if (id_table->class_id != pci_dev->id.class_id && id_table->class_id != RTE_CLASS_ANY_ID) continue; - struct rte_pci_addr *loc = &dev->addr; + return 1; + } - RTE_LOG(INFO, EAL, "PCI device "PCI_PRI_FMT" on NUMA socket %i\n", - loc->domain, loc->bus, loc->devid, loc->function, - dev->device.numa_node); + return 0; +} - /* no initialization when blacklisted, return without error */ - if (dev->device.devargs != NULL && - dev->device.devargs->type == - RTE_DEVTYPE_BLACKLISTED_PCI) { - RTE_LOG(INFO, EAL, " Device is blacklisted, not initializing\n"); - return 1; - } +/* + * If vendor/device ID match, call the probe() function of the + * driver. + */ +static int +rte_eal_pci_probe_one_driver(struct rte_pci_driver *dr, + struct rte_pci_device *dev) +{ + int ret; + struct rte_pci_addr *loc; - RTE_LOG(INFO, EAL, " probe driver: %x:%x %s\n", dev->id.vendor_id, - dev->id.device_id, dr->driver.name); + if ((dr == NULL) || (dev == NULL)) + return -EINVAL; - if (dr->drv_flags & RTE_PCI_DRV_NEED_MAPPING) { - /* map resources for devices that use igb_uio or VFIO */ - ret = rte_eal_pci_map_device(dev); - if (ret != 0) - return ret; - } + loc = &dev->addr; - /* reference driver structure */ - dev->driver = dr; + /* The device is not blacklisted; Check if driver supports it */ + if (!rte_pci_match(dr, dev)) { + /* Match of device and driver failed */ + RTE_LOG(DEBUG, EAL, "Driver (%s) doesn't match the device\n", + dr->driver.name); + return 1; + } - /* call the driver probe() function */ - ret = dr->probe(dr, dev); - if (ret) { - dev->driver = NULL; - if (dr->drv_flags & RTE_PCI_DRV_NEED_MAPPING) - rte_eal_pci_unmap_device(dev); - } + RTE_LOG(INFO, EAL, "PCI device "PCI_PRI_FMT" on NUMA socket %i\n", + loc->domain, loc->bus, loc->devid, loc->function, + dev->device.numa_node); + + /* no initialization when blacklisted, return without error */ + if (dev->device.devargs != NULL && + dev->device.devargs->type == + RTE_DEVTYPE_BLACKLISTED_PCI) { + RTE_LOG(INFO, EAL, " Device is blacklisted, not" + " initializing\n"); + return 1; + } - return ret; + RTE_LOG(INFO, EAL, " probe driver: %x:%x %s\n", dev->id.vendor_id, + dev->id.device_id, dr->driver.name); + + if (dr->drv_flags & RTE_PCI_DRV_NEED_MAPPING) { + /* map resources for devices that use igb_uio */ + ret = rte_eal_pci_map_device(dev); + if (ret != 0) + return ret; } - /* return positive value if driver doesn't support this device */ - return 1; + + /* reference driver structure */ + dev->driver = dr; + + /* call the driver probe() function */ + ret = dr->probe(dr, dev); + if (ret) { + dev->driver = NULL; + if (dr->drv_flags & RTE_PCI_DRV_NEED_MAPPING) + rte_eal_pci_unmap_device(dev); + } + + return ret; } /* @@ -231,51 +266,36 @@ static int rte_eal_pci_detach_dev(struct rte_pci_driver *dr, struct rte_pci_device *dev) { - const struct rte_pci_id *id_table; + struct rte_pci_addr *loc; if ((dr == NULL) || (dev == NULL)) return -EINVAL; - for (id_table = dr->id_table; id_table->vendor_id != 0; id_table++) { - - /* check if device's identifiers match the driver's ones */ - if (id_table->vendor_id != dev->id.vendor_id && - id_table->vendor_id != PCI_ANY_ID) - continue; - if (id_table->device_id != dev->id.device_id && - id_table->device_id != PCI_ANY_ID) - continue; - if (id_table->subsystem_vendor_id != dev->id.subsystem_vendor_id && - id_table->subsystem_vendor_id != PCI_ANY_ID) - continue; - if (id_table->subsystem_device_id != dev->id.subsystem_device_id && - id_table->subsystem_device_id != PCI_ANY_ID) - continue; - - struct rte_pci_addr *loc = &dev->addr; + if (!rte_pci_match(dr, dev)) { + /* Device and driver don't match */ + return 1; + } - RTE_LOG(DEBUG, EAL, "PCI device "PCI_PRI_FMT" on NUMA socket %i\n", - loc->domain, loc->bus, loc->devid, - loc->function, dev->device.numa_node); + loc = &dev->addr; - RTE_LOG(DEBUG, EAL, " remove driver: %x:%x %s\n", dev->id.vendor_id, - dev->id.device_id, dr->driver.name); + RTE_LOG(DEBUG, EAL, "PCI device "PCI_PRI_FMT" on NUMA socket %i\n", + loc->domain, loc->bus, loc->devid, + loc->function, dev->device.numa_node); - if (dr->remove && (dr->remove(dev) < 0)) - return -1; /* negative value is an error */ + RTE_LOG(DEBUG, EAL, " remove driver: %x:%x %s\n", dev->id.vendor_id, + dev->id.device_id, dr->driver.name); - /* clear driver structure */ - dev->driver = NULL; + if (dr->remove && (dr->remove(dev) < 0)) + return -1; /* negative value is an error */ - if (dr->drv_flags & RTE_PCI_DRV_NEED_MAPPING) - /* unmap resources for devices that use igb_uio */ - rte_eal_pci_unmap_device(dev); + /* clear driver structure */ + dev->driver = NULL; - return 0; - } + if (dr->drv_flags & RTE_PCI_DRV_NEED_MAPPING) + /* unmap resources for devices that use igb_uio */ + rte_eal_pci_unmap_device(dev); - /* return positive value if driver doesn't support this device */ - return 1; + return 0; } /* -- 2.1.4