You've already forked linux-rockchip
mirror of
https://github.com/armbian/linux-rockchip.git
synced 2026-01-06 11:08:10 -08:00
NTB: Split ntb_hw_intel and ntb_transport drivers
Change ntb_hw_intel to use the new NTB hardware abstraction layer. Split ntb_transport into its own driver. Change it to use the new NTB hardware abstraction layer. Signed-off-by: Allen Hubbe <Allen.Hubbe@emc.com> Signed-off-by: Jon Mason <jdmason@kudzu.us>
This commit is contained in:
@@ -26,7 +26,33 @@ as ntb hardware, or hardware drivers, are inserted and removed. The
|
||||
registration uses the Linux Device framework, so it should feel familiar to
|
||||
anyone who has written a pci driver.
|
||||
|
||||
### NTB Transport Client (ntb\_transport) and NTB Netdev (ntb\_netdev)
|
||||
|
||||
The primary client for NTB is the Transport client, used in tandem with NTB
|
||||
Netdev. These drivers function together to create a logical link to the peer,
|
||||
across the ntb, to exchange packets of network data. The Transport client
|
||||
establishes a logical link to the peer, and creates queue pairs to exchange
|
||||
messages and data. The NTB Netdev then creates an ethernet device using a
|
||||
Transport queue pair. Network data is copied between socket buffers and the
|
||||
Transport queue pair buffer. The Transport client may be used for other things
|
||||
besides Netdev, however no other applications have yet been written.
|
||||
|
||||
## NTB Hardware Drivers
|
||||
|
||||
NTB hardware drivers should register devices with the NTB core driver. After
|
||||
registering, clients probe and remove functions will be called.
|
||||
|
||||
### NTB Intel Hardware Driver (ntb\_hw\_intel)
|
||||
|
||||
The Intel hardware driver supports NTB on Xeon and Atom CPUs.
|
||||
|
||||
Module Parameters:
|
||||
|
||||
* b2b\_mw\_idx - If the peer ntb is to be accessed via a memory window, then use
|
||||
this memory window to access the peer ntb. A value of zero or positive
|
||||
starts from the first mw idx, and a negative value starts from the last
|
||||
mw idx. Both sides MUST set the same value here! The default value is
|
||||
`-1`.
|
||||
* b2b\_mw\_share - If the peer ntb is to be accessed via a memory window, and if
|
||||
the memory window is large enough, still allow the client to use the
|
||||
second half of the memory window for address translation to the peer.
|
||||
|
||||
@@ -7007,6 +7007,14 @@ F: drivers/net/ntb_netdev.c
|
||||
F: include/linux/ntb.h
|
||||
F: include/linux/ntb_transport.h
|
||||
|
||||
NTB INTEL DRIVER
|
||||
M: Jon Mason <jdmason@kudzu.us>
|
||||
M: Dave Jiang <dave.jiang@intel.com>
|
||||
S: Supported
|
||||
W: https://github.com/jonmason/ntb/wiki
|
||||
T: git git://github.com/jonmason/ntb.git
|
||||
F: drivers/ntb/hw/intel/
|
||||
|
||||
NTFS FILESYSTEM
|
||||
M: Anton Altaparmakov <anton@tuxera.com>
|
||||
L: linux-ntfs-dev@lists.sourceforge.net
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
* GPL LICENSE SUMMARY
|
||||
*
|
||||
* Copyright(c) 2012 Intel Corporation. All rights reserved.
|
||||
* Copyright (C) 2015 EMC Corporation. All Rights Reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of version 2 of the GNU General Public License as
|
||||
@@ -13,6 +14,7 @@
|
||||
* BSD LICENSE
|
||||
*
|
||||
* Copyright(c) 2012 Intel Corporation. All rights reserved.
|
||||
* Copyright (C) 2015 EMC Corporation. All Rights Reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
@@ -40,7 +42,7 @@
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* Intel PCIe NTB Network Linux driver
|
||||
* PCIe NTB Network Linux driver
|
||||
*
|
||||
* Contact Information:
|
||||
* Jon Mason <jon.mason@intel.com>
|
||||
@@ -49,6 +51,7 @@
|
||||
#include <linux/ethtool.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/ntb.h>
|
||||
#include <linux/ntb_transport.h>
|
||||
|
||||
#define NTB_NETDEV_VER "0.7"
|
||||
@@ -70,26 +73,19 @@ struct ntb_netdev {
|
||||
|
||||
static LIST_HEAD(dev_list);
|
||||
|
||||
static void ntb_netdev_event_handler(void *data, int status)
|
||||
static void ntb_netdev_event_handler(void *data, int link_is_up)
|
||||
{
|
||||
struct net_device *ndev = data;
|
||||
struct ntb_netdev *dev = netdev_priv(ndev);
|
||||
|
||||
netdev_dbg(ndev, "Event %x, Link %x\n", status,
|
||||
netdev_dbg(ndev, "Event %x, Link %x\n", link_is_up,
|
||||
ntb_transport_link_query(dev->qp));
|
||||
|
||||
switch (status) {
|
||||
case NTB_LINK_DOWN:
|
||||
if (link_is_up) {
|
||||
if (ntb_transport_link_query(dev->qp))
|
||||
netif_carrier_on(ndev);
|
||||
} else {
|
||||
netif_carrier_off(ndev);
|
||||
break;
|
||||
case NTB_LINK_UP:
|
||||
if (!ntb_transport_link_query(dev->qp))
|
||||
return;
|
||||
|
||||
netif_carrier_on(ndev);
|
||||
break;
|
||||
default:
|
||||
netdev_warn(ndev, "Unsupported event type %d\n", status);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -160,8 +156,6 @@ static netdev_tx_t ntb_netdev_start_xmit(struct sk_buff *skb,
|
||||
struct ntb_netdev *dev = netdev_priv(ndev);
|
||||
int rc;
|
||||
|
||||
netdev_dbg(ndev, "%s: skb len %d\n", __func__, skb->len);
|
||||
|
||||
rc = ntb_transport_tx_enqueue(dev->qp, skb, skb->data, skb->len);
|
||||
if (rc)
|
||||
goto err;
|
||||
@@ -322,20 +316,26 @@ static const struct ntb_queue_handlers ntb_netdev_handlers = {
|
||||
.event_handler = ntb_netdev_event_handler,
|
||||
};
|
||||
|
||||
static int ntb_netdev_probe(struct pci_dev *pdev)
|
||||
static int ntb_netdev_probe(struct device *client_dev)
|
||||
{
|
||||
struct ntb_dev *ntb;
|
||||
struct net_device *ndev;
|
||||
struct pci_dev *pdev;
|
||||
struct ntb_netdev *dev;
|
||||
int rc;
|
||||
|
||||
ndev = alloc_etherdev(sizeof(struct ntb_netdev));
|
||||
ntb = dev_ntb(client_dev->parent);
|
||||
pdev = ntb->pdev;
|
||||
if (!pdev)
|
||||
return -ENODEV;
|
||||
|
||||
ndev = alloc_etherdev(sizeof(*dev));
|
||||
if (!ndev)
|
||||
return -ENOMEM;
|
||||
|
||||
dev = netdev_priv(ndev);
|
||||
dev->ndev = ndev;
|
||||
dev->pdev = pdev;
|
||||
BUG_ON(!dev->pdev);
|
||||
ndev->features = NETIF_F_HIGHDMA;
|
||||
|
||||
ndev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
|
||||
@@ -349,7 +349,8 @@ static int ntb_netdev_probe(struct pci_dev *pdev)
|
||||
ndev->netdev_ops = &ntb_netdev_ops;
|
||||
ndev->ethtool_ops = &ntb_ethtool_ops;
|
||||
|
||||
dev->qp = ntb_transport_create_queue(ndev, pdev, &ntb_netdev_handlers);
|
||||
dev->qp = ntb_transport_create_queue(ndev, client_dev,
|
||||
&ntb_netdev_handlers);
|
||||
if (!dev->qp) {
|
||||
rc = -EIO;
|
||||
goto err;
|
||||
@@ -372,12 +373,17 @@ err:
|
||||
return rc;
|
||||
}
|
||||
|
||||
static void ntb_netdev_remove(struct pci_dev *pdev)
|
||||
static void ntb_netdev_remove(struct device *client_dev)
|
||||
{
|
||||
struct ntb_dev *ntb;
|
||||
struct net_device *ndev;
|
||||
struct pci_dev *pdev;
|
||||
struct ntb_netdev *dev;
|
||||
bool found = false;
|
||||
|
||||
ntb = dev_ntb(client_dev->parent);
|
||||
pdev = ntb->pdev;
|
||||
|
||||
list_for_each_entry(dev, &dev_list, list) {
|
||||
if (dev->pdev == pdev) {
|
||||
found = true;
|
||||
@@ -396,7 +402,7 @@ static void ntb_netdev_remove(struct pci_dev *pdev)
|
||||
free_netdev(ndev);
|
||||
}
|
||||
|
||||
static struct ntb_client ntb_netdev_client = {
|
||||
static struct ntb_transport_client ntb_netdev_client = {
|
||||
.driver.name = KBUILD_MODNAME,
|
||||
.driver.owner = THIS_MODULE,
|
||||
.probe = ntb_netdev_probe,
|
||||
@@ -407,7 +413,7 @@ static int __init ntb_netdev_init_module(void)
|
||||
{
|
||||
int rc;
|
||||
|
||||
rc = ntb_register_client_dev(KBUILD_MODNAME);
|
||||
rc = ntb_transport_register_client_dev(KBUILD_MODNAME);
|
||||
if (rc)
|
||||
return rc;
|
||||
return ntb_transport_register_client(&ntb_netdev_client);
|
||||
@@ -417,6 +423,6 @@ module_init(ntb_netdev_init_module);
|
||||
static void __exit ntb_netdev_exit_module(void)
|
||||
{
|
||||
ntb_transport_unregister_client(&ntb_netdev_client);
|
||||
ntb_unregister_client_dev(KBUILD_MODNAME);
|
||||
ntb_transport_unregister_client_dev(KBUILD_MODNAME);
|
||||
}
|
||||
module_exit(ntb_netdev_exit_module);
|
||||
|
||||
@@ -1,13 +1,26 @@
|
||||
config NTB
|
||||
tristate "Intel Non-Transparent Bridge support"
|
||||
depends on PCI
|
||||
depends on X86
|
||||
help
|
||||
The PCI-E Non-transparent bridge hardware is a point-to-point PCI-E bus
|
||||
connecting 2 systems. When configured, writes to the device's PCI
|
||||
mapped memory will be mirrored to a buffer on the remote system. The
|
||||
ntb Linux driver uses this point-to-point communication as a method to
|
||||
transfer data from one system to the other.
|
||||
menuconfig NTB
|
||||
tristate "Non-Transparent Bridge support"
|
||||
depends on PCI
|
||||
help
|
||||
The PCI-E Non-transparent bridge hardware is a point-to-point PCI-E bus
|
||||
connecting 2 systems. When configured, writes to the device's PCI
|
||||
mapped memory will be mirrored to a buffer on the remote system. The
|
||||
ntb Linux driver uses this point-to-point communication as a method to
|
||||
transfer data from one system to the other.
|
||||
|
||||
If unsure, say N.
|
||||
If unsure, say N.
|
||||
|
||||
if NTB
|
||||
|
||||
source "drivers/ntb/hw/Kconfig"
|
||||
|
||||
config NTB_TRANSPORT
|
||||
tristate "NTB Transport Client"
|
||||
help
|
||||
This is a transport driver that enables connected systems to exchange
|
||||
messages over the ntb hardware. The transport exposes a queue pair api
|
||||
to client drivers.
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
endif # NTB
|
||||
|
||||
@@ -1,4 +1,2 @@
|
||||
obj-$(CONFIG_NTB) += ntb.o
|
||||
obj-$(CONFIG_NTB) += ntb_hw_intel.o
|
||||
|
||||
ntb_hw_intel-objs := hw/intel/ntb_hw_intel.o ntb_transport.o
|
||||
obj-$(CONFIG_NTB) += ntb.o hw/
|
||||
obj-$(CONFIG_NTB_TRANSPORT) += ntb_transport.o
|
||||
|
||||
1
drivers/ntb/hw/Kconfig
Normal file
1
drivers/ntb/hw/Kconfig
Normal file
@@ -0,0 +1 @@
|
||||
source "drivers/ntb/hw/intel/Kconfig"
|
||||
1
drivers/ntb/hw/Makefile
Normal file
1
drivers/ntb/hw/Makefile
Normal file
@@ -0,0 +1 @@
|
||||
obj-$(CONFIG_NTB_INTEL) += intel/
|
||||
7
drivers/ntb/hw/intel/Kconfig
Normal file
7
drivers/ntb/hw/intel/Kconfig
Normal file
@@ -0,0 +1,7 @@
|
||||
config NTB_INTEL
|
||||
tristate "Intel Non-Transparent Bridge support"
|
||||
depends on X86_64
|
||||
help
|
||||
This driver supports Intel NTB on capable Xeon and Atom hardware.
|
||||
|
||||
If unsure, say N.
|
||||
1
drivers/ntb/hw/intel/Makefile
Normal file
1
drivers/ntb/hw/intel/Makefile
Normal file
@@ -0,0 +1 @@
|
||||
obj-$(CONFIG_NTB_INTEL) += ntb_hw_intel.o
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -5,6 +5,7 @@
|
||||
* GPL LICENSE SUMMARY
|
||||
*
|
||||
* Copyright(c) 2012 Intel Corporation. All rights reserved.
|
||||
* Copyright (C) 2015 EMC Corporation. All Rights Reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of version 2 of the GNU General Public License as
|
||||
@@ -13,6 +14,7 @@
|
||||
* BSD LICENSE
|
||||
*
|
||||
* Copyright(c) 2012 Intel Corporation. All rights reserved.
|
||||
* Copyright (C) 2015 EMC Corporation. All Rights Reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
@@ -40,7 +42,7 @@
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* Intel PCIe NTB Linux driver
|
||||
* PCIe NTB Transport Linux driver
|
||||
*
|
||||
* Contact Information:
|
||||
* Jon Mason <jon.mason@intel.com>
|
||||
@@ -48,21 +50,16 @@
|
||||
|
||||
struct ntb_transport_qp;
|
||||
|
||||
struct ntb_client {
|
||||
struct ntb_transport_client {
|
||||
struct device_driver driver;
|
||||
int (*probe)(struct pci_dev *pdev);
|
||||
void (*remove)(struct pci_dev *pdev);
|
||||
int (*probe)(struct device *client_dev);
|
||||
void (*remove)(struct device *client_dev);
|
||||
};
|
||||
|
||||
enum {
|
||||
NTB_LINK_DOWN = 0,
|
||||
NTB_LINK_UP,
|
||||
};
|
||||
|
||||
int ntb_transport_register_client(struct ntb_client *drvr);
|
||||
void ntb_transport_unregister_client(struct ntb_client *drvr);
|
||||
int ntb_register_client_dev(char *device_name);
|
||||
void ntb_unregister_client_dev(char *device_name);
|
||||
int ntb_transport_register_client(struct ntb_transport_client *drvr);
|
||||
void ntb_transport_unregister_client(struct ntb_transport_client *drvr);
|
||||
int ntb_transport_register_client_dev(char *device_name);
|
||||
void ntb_transport_unregister_client_dev(char *device_name);
|
||||
|
||||
struct ntb_queue_handlers {
|
||||
void (*rx_handler)(struct ntb_transport_qp *qp, void *qp_data,
|
||||
@@ -75,7 +72,7 @@ struct ntb_queue_handlers {
|
||||
unsigned char ntb_transport_qp_num(struct ntb_transport_qp *qp);
|
||||
unsigned int ntb_transport_max_size(struct ntb_transport_qp *qp);
|
||||
struct ntb_transport_qp *
|
||||
ntb_transport_create_queue(void *data, struct pci_dev *pdev,
|
||||
ntb_transport_create_queue(void *data, struct device *client_dev,
|
||||
const struct ntb_queue_handlers *handlers);
|
||||
void ntb_transport_free_queue(struct ntb_transport_qp *qp);
|
||||
int ntb_transport_rx_enqueue(struct ntb_transport_qp *qp, void *cb, void *data,
|
||||
|
||||
Reference in New Issue
Block a user