mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02: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:
		
							parent
							
								
									a1bd3baeb2
								
							
						
					
					
						commit
						e26a5843f7
					
				
					 13 changed files with 2958 additions and 2564 deletions
				
			
		| 
						 | 
					@ -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
 | 
					registration uses the Linux Device framework, so it should feel familiar to
 | 
				
			||||||
anyone who has written a pci driver.
 | 
					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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
NTB hardware drivers should register devices with the NTB core driver.  After
 | 
					NTB hardware drivers should register devices with the NTB core driver.  After
 | 
				
			||||||
registering, clients probe and remove functions will be called.
 | 
					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.h
 | 
				
			||||||
F:	include/linux/ntb_transport.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
 | 
					NTFS FILESYSTEM
 | 
				
			||||||
M:	Anton Altaparmakov <anton@tuxera.com>
 | 
					M:	Anton Altaparmakov <anton@tuxera.com>
 | 
				
			||||||
L:	linux-ntfs-dev@lists.sourceforge.net
 | 
					L:	linux-ntfs-dev@lists.sourceforge.net
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,6 +5,7 @@
 | 
				
			||||||
 *   GPL LICENSE SUMMARY
 | 
					 *   GPL LICENSE SUMMARY
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 *   Copyright(c) 2012 Intel Corporation. All rights reserved.
 | 
					 *   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
 | 
					 *   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
 | 
					 *   it under the terms of version 2 of the GNU General Public License as
 | 
				
			||||||
| 
						 | 
					@ -13,6 +14,7 @@
 | 
				
			||||||
 *   BSD LICENSE
 | 
					 *   BSD LICENSE
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 *   Copyright(c) 2012 Intel Corporation. All rights reserved.
 | 
					 *   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
 | 
					 *   Redistribution and use in source and binary forms, with or without
 | 
				
			||||||
 *   modification, are permitted provided that the following conditions
 | 
					 *   modification, are permitted provided that the following conditions
 | 
				
			||||||
| 
						 | 
					@ -40,7 +42,7 @@
 | 
				
			||||||
 *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
					 *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
				
			||||||
 *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
					 *   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:
 | 
					 * Contact Information:
 | 
				
			||||||
 * Jon Mason <jon.mason@intel.com>
 | 
					 * Jon Mason <jon.mason@intel.com>
 | 
				
			||||||
| 
						 | 
					@ -49,6 +51,7 @@
 | 
				
			||||||
#include <linux/ethtool.h>
 | 
					#include <linux/ethtool.h>
 | 
				
			||||||
#include <linux/module.h>
 | 
					#include <linux/module.h>
 | 
				
			||||||
#include <linux/pci.h>
 | 
					#include <linux/pci.h>
 | 
				
			||||||
 | 
					#include <linux/ntb.h>
 | 
				
			||||||
#include <linux/ntb_transport.h>
 | 
					#include <linux/ntb_transport.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define NTB_NETDEV_VER	"0.7"
 | 
					#define NTB_NETDEV_VER	"0.7"
 | 
				
			||||||
| 
						 | 
					@ -70,26 +73,19 @@ struct ntb_netdev {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static LIST_HEAD(dev_list);
 | 
					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 net_device *ndev = data;
 | 
				
			||||||
	struct ntb_netdev *dev = netdev_priv(ndev);
 | 
						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));
 | 
							   ntb_transport_link_query(dev->qp));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	switch (status) {
 | 
						if (link_is_up) {
 | 
				
			||||||
	case NTB_LINK_DOWN:
 | 
							if (ntb_transport_link_query(dev->qp))
 | 
				
			||||||
 | 
								netif_carrier_on(ndev);
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
		netif_carrier_off(ndev);
 | 
							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);
 | 
						struct ntb_netdev *dev = netdev_priv(ndev);
 | 
				
			||||||
	int rc;
 | 
						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);
 | 
						rc = ntb_transport_tx_enqueue(dev->qp, skb, skb->data, skb->len);
 | 
				
			||||||
	if (rc)
 | 
						if (rc)
 | 
				
			||||||
		goto err;
 | 
							goto err;
 | 
				
			||||||
| 
						 | 
					@ -322,20 +316,26 @@ static const struct ntb_queue_handlers ntb_netdev_handlers = {
 | 
				
			||||||
	.event_handler = ntb_netdev_event_handler,
 | 
						.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 net_device *ndev;
 | 
				
			||||||
 | 
						struct pci_dev *pdev;
 | 
				
			||||||
	struct ntb_netdev *dev;
 | 
						struct ntb_netdev *dev;
 | 
				
			||||||
	int rc;
 | 
						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)
 | 
						if (!ndev)
 | 
				
			||||||
		return -ENOMEM;
 | 
							return -ENOMEM;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dev = netdev_priv(ndev);
 | 
						dev = netdev_priv(ndev);
 | 
				
			||||||
	dev->ndev = ndev;
 | 
						dev->ndev = ndev;
 | 
				
			||||||
	dev->pdev = pdev;
 | 
						dev->pdev = pdev;
 | 
				
			||||||
	BUG_ON(!dev->pdev);
 | 
					 | 
				
			||||||
	ndev->features = NETIF_F_HIGHDMA;
 | 
						ndev->features = NETIF_F_HIGHDMA;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ndev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
 | 
						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->netdev_ops = &ntb_netdev_ops;
 | 
				
			||||||
	ndev->ethtool_ops = &ntb_ethtool_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) {
 | 
						if (!dev->qp) {
 | 
				
			||||||
		rc = -EIO;
 | 
							rc = -EIO;
 | 
				
			||||||
		goto err;
 | 
							goto err;
 | 
				
			||||||
| 
						 | 
					@ -372,12 +373,17 @@ static int ntb_netdev_probe(struct pci_dev *pdev)
 | 
				
			||||||
	return rc;
 | 
						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 net_device *ndev;
 | 
				
			||||||
 | 
						struct pci_dev *pdev;
 | 
				
			||||||
	struct ntb_netdev *dev;
 | 
						struct ntb_netdev *dev;
 | 
				
			||||||
	bool found = false;
 | 
						bool found = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ntb = dev_ntb(client_dev->parent);
 | 
				
			||||||
 | 
						pdev = ntb->pdev;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	list_for_each_entry(dev, &dev_list, list) {
 | 
						list_for_each_entry(dev, &dev_list, list) {
 | 
				
			||||||
		if (dev->pdev == pdev) {
 | 
							if (dev->pdev == pdev) {
 | 
				
			||||||
			found = true;
 | 
								found = true;
 | 
				
			||||||
| 
						 | 
					@ -396,7 +402,7 @@ static void ntb_netdev_remove(struct pci_dev *pdev)
 | 
				
			||||||
	free_netdev(ndev);
 | 
						free_netdev(ndev);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct ntb_client ntb_netdev_client = {
 | 
					static struct ntb_transport_client ntb_netdev_client = {
 | 
				
			||||||
	.driver.name = KBUILD_MODNAME,
 | 
						.driver.name = KBUILD_MODNAME,
 | 
				
			||||||
	.driver.owner = THIS_MODULE,
 | 
						.driver.owner = THIS_MODULE,
 | 
				
			||||||
	.probe = ntb_netdev_probe,
 | 
						.probe = ntb_netdev_probe,
 | 
				
			||||||
| 
						 | 
					@ -407,7 +413,7 @@ static int __init ntb_netdev_init_module(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int rc;
 | 
						int rc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	rc = ntb_register_client_dev(KBUILD_MODNAME);
 | 
						rc = ntb_transport_register_client_dev(KBUILD_MODNAME);
 | 
				
			||||||
	if (rc)
 | 
						if (rc)
 | 
				
			||||||
		return rc;
 | 
							return rc;
 | 
				
			||||||
	return ntb_transport_register_client(&ntb_netdev_client);
 | 
						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)
 | 
					static void __exit ntb_netdev_exit_module(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	ntb_transport_unregister_client(&ntb_netdev_client);
 | 
						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);
 | 
					module_exit(ntb_netdev_exit_module);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,13 +1,26 @@
 | 
				
			||||||
config NTB
 | 
					menuconfig NTB
 | 
				
			||||||
       tristate "Intel Non-Transparent Bridge support"
 | 
						tristate "Non-Transparent Bridge support"
 | 
				
			||||||
       depends on PCI
 | 
						depends on PCI
 | 
				
			||||||
       depends on X86
 | 
						help
 | 
				
			||||||
       help
 | 
						 The PCI-E Non-transparent bridge hardware is a point-to-point PCI-E bus
 | 
				
			||||||
        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
 | 
				
			||||||
        connecting 2 systems.  When configured, writes to the device's PCI
 | 
						 mapped memory will be mirrored to a buffer on the remote system.  The
 | 
				
			||||||
        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
 | 
				
			||||||
        ntb Linux driver uses this point-to-point communication as a method to
 | 
						 transfer data from one system to the other.
 | 
				
			||||||
        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.o hw/
 | 
				
			||||||
obj-$(CONFIG_NTB) += ntb_hw_intel.o
 | 
					obj-$(CONFIG_NTB_TRANSPORT) += ntb_transport.o
 | 
				
			||||||
 | 
					 | 
				
			||||||
ntb_hw_intel-objs := hw/intel/ntb_hw_intel.o 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
											
										
									
								
							| 
						 | 
					@ -5,6 +5,7 @@
 | 
				
			||||||
 *   GPL LICENSE SUMMARY
 | 
					 *   GPL LICENSE SUMMARY
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 *   Copyright(c) 2012 Intel Corporation. All rights reserved.
 | 
					 *   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
 | 
					 *   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
 | 
					 *   it under the terms of version 2 of the GNU General Public License as
 | 
				
			||||||
| 
						 | 
					@ -13,6 +14,7 @@
 | 
				
			||||||
 *   BSD LICENSE
 | 
					 *   BSD LICENSE
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 *   Copyright(c) 2012 Intel Corporation. All rights reserved.
 | 
					 *   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
 | 
					 *   Redistribution and use in source and binary forms, with or without
 | 
				
			||||||
 *   modification, are permitted provided that the following conditions
 | 
					 *   modification, are permitted provided that the following conditions
 | 
				
			||||||
| 
						 | 
					@ -45,341 +47,296 @@
 | 
				
			||||||
 * Contact Information:
 | 
					 * Contact Information:
 | 
				
			||||||
 * Jon Mason <jon.mason@intel.com>
 | 
					 * Jon Mason <jon.mason@intel.com>
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
#include <linux/ntb_transport.h>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define NTB_LINK_STATUS_ACTIVE	0x2000
 | 
					#ifndef NTB_HW_INTEL_H
 | 
				
			||||||
#define NTB_LINK_SPEED_MASK	0x000f
 | 
					#define NTB_HW_INTEL_H
 | 
				
			||||||
#define NTB_LINK_WIDTH_MASK	0x03f0
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SNB_MSIX_CNT		4
 | 
					#include <linux/ntb.h>
 | 
				
			||||||
#define SNB_MAX_B2B_SPADS	16
 | 
					#include <linux/pci.h>
 | 
				
			||||||
#define SNB_MAX_COMPAT_SPADS	16
 | 
					 | 
				
			||||||
/* Reserve the uppermost bit for link interrupt */
 | 
					 | 
				
			||||||
#define SNB_MAX_DB_BITS		15
 | 
					 | 
				
			||||||
#define SNB_LINK_DB		15
 | 
					 | 
				
			||||||
#define SNB_DB_BITS_PER_VEC	5
 | 
					 | 
				
			||||||
#define HSX_SPLITBAR_MAX_MW	3
 | 
					 | 
				
			||||||
#define SNB_MAX_MW		2
 | 
					 | 
				
			||||||
#define SNB_ERRATA_MAX_MW	1
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SNB_DB_HW_LINK		0x8000
 | 
					#define PCI_DEVICE_ID_INTEL_NTB_B2B_JSF	0x3725
 | 
				
			||||||
 | 
					#define PCI_DEVICE_ID_INTEL_NTB_PS_JSF	0x3726
 | 
				
			||||||
 | 
					#define PCI_DEVICE_ID_INTEL_NTB_SS_JSF	0x3727
 | 
				
			||||||
 | 
					#define PCI_DEVICE_ID_INTEL_NTB_B2B_SNB	0x3C0D
 | 
				
			||||||
 | 
					#define PCI_DEVICE_ID_INTEL_NTB_PS_SNB	0x3C0E
 | 
				
			||||||
 | 
					#define PCI_DEVICE_ID_INTEL_NTB_SS_SNB	0x3C0F
 | 
				
			||||||
 | 
					#define PCI_DEVICE_ID_INTEL_NTB_B2B_IVT	0x0E0D
 | 
				
			||||||
 | 
					#define PCI_DEVICE_ID_INTEL_NTB_PS_IVT	0x0E0E
 | 
				
			||||||
 | 
					#define PCI_DEVICE_ID_INTEL_NTB_SS_IVT	0x0E0F
 | 
				
			||||||
 | 
					#define PCI_DEVICE_ID_INTEL_NTB_B2B_HSX	0x2F0D
 | 
				
			||||||
 | 
					#define PCI_DEVICE_ID_INTEL_NTB_PS_HSX	0x2F0E
 | 
				
			||||||
 | 
					#define PCI_DEVICE_ID_INTEL_NTB_SS_HSX	0x2F0F
 | 
				
			||||||
 | 
					#define PCI_DEVICE_ID_INTEL_NTB_B2B_BWD	0x0C4E
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SNB_UNCERRSTS_OFFSET	0x014C
 | 
					/* SNB hardware (and JSF, IVT, HSX) */
 | 
				
			||||||
#define SNB_CORERRSTS_OFFSET	0x0158
 | 
					 | 
				
			||||||
#define SNB_LINK_STATUS_OFFSET	0x01A2
 | 
					 | 
				
			||||||
#define SNB_PCICMD_OFFSET	0x0504
 | 
					 | 
				
			||||||
#define SNB_DEVCTRL_OFFSET	0x0598
 | 
					 | 
				
			||||||
#define SNB_DEVSTS_OFFSET	0x059A
 | 
					 | 
				
			||||||
#define SNB_SLINK_STATUS_OFFSET	0x05A2
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SNB_PBAR2LMT_OFFSET	0x0000
 | 
					#define SNB_PBAR23LMT_OFFSET		0x0000
 | 
				
			||||||
#define SNB_PBAR4LMT_OFFSET	0x0008
 | 
					#define SNB_PBAR45LMT_OFFSET		0x0008
 | 
				
			||||||
#define SNB_PBAR5LMT_OFFSET	0x000C
 | 
					#define SNB_PBAR4LMT_OFFSET		0x0008
 | 
				
			||||||
#define SNB_PBAR2XLAT_OFFSET	0x0010
 | 
					#define SNB_PBAR5LMT_OFFSET		0x000c
 | 
				
			||||||
#define SNB_PBAR4XLAT_OFFSET	0x0018
 | 
					#define SNB_PBAR23XLAT_OFFSET		0x0010
 | 
				
			||||||
#define SNB_PBAR5XLAT_OFFSET	0x001C
 | 
					#define SNB_PBAR45XLAT_OFFSET		0x0018
 | 
				
			||||||
#define SNB_SBAR2LMT_OFFSET	0x0020
 | 
					#define SNB_PBAR4XLAT_OFFSET		0x0018
 | 
				
			||||||
#define SNB_SBAR4LMT_OFFSET	0x0028
 | 
					#define SNB_PBAR5XLAT_OFFSET		0x001c
 | 
				
			||||||
#define SNB_SBAR5LMT_OFFSET	0x002C
 | 
					#define SNB_SBAR23LMT_OFFSET		0x0020
 | 
				
			||||||
#define SNB_SBAR2XLAT_OFFSET	0x0030
 | 
					#define SNB_SBAR45LMT_OFFSET		0x0028
 | 
				
			||||||
#define SNB_SBAR4XLAT_OFFSET	0x0038
 | 
					#define SNB_SBAR4LMT_OFFSET		0x0028
 | 
				
			||||||
#define SNB_SBAR5XLAT_OFFSET	0x003C
 | 
					#define SNB_SBAR5LMT_OFFSET		0x002c
 | 
				
			||||||
#define SNB_SBAR0BASE_OFFSET	0x0040
 | 
					#define SNB_SBAR23XLAT_OFFSET		0x0030
 | 
				
			||||||
#define SNB_SBAR2BASE_OFFSET	0x0048
 | 
					#define SNB_SBAR45XLAT_OFFSET		0x0038
 | 
				
			||||||
#define SNB_SBAR4BASE_OFFSET	0x0050
 | 
					#define SNB_SBAR4XLAT_OFFSET		0x0038
 | 
				
			||||||
#define SNB_SBAR5BASE_OFFSET	0x0054
 | 
					#define SNB_SBAR5XLAT_OFFSET		0x003c
 | 
				
			||||||
#define SNB_NTBCNTL_OFFSET	0x0058
 | 
					#define SNB_SBAR0BASE_OFFSET		0x0040
 | 
				
			||||||
#define SNB_SBDF_OFFSET		0x005C
 | 
					#define SNB_SBAR23BASE_OFFSET		0x0048
 | 
				
			||||||
#define SNB_PDOORBELL_OFFSET	0x0060
 | 
					#define SNB_SBAR45BASE_OFFSET		0x0050
 | 
				
			||||||
#define SNB_PDBMSK_OFFSET	0x0062
 | 
					#define SNB_SBAR4BASE_OFFSET		0x0050
 | 
				
			||||||
#define SNB_SDOORBELL_OFFSET	0x0064
 | 
					#define SNB_SBAR5BASE_OFFSET		0x0054
 | 
				
			||||||
#define SNB_SDBMSK_OFFSET	0x0066
 | 
					#define SNB_SBDF_OFFSET			0x005c
 | 
				
			||||||
#define SNB_USMEMMISS_OFFSET	0x0070
 | 
					#define SNB_NTBCNTL_OFFSET		0x0058
 | 
				
			||||||
#define SNB_SPAD_OFFSET		0x0080
 | 
					#define SNB_PDOORBELL_OFFSET		0x0060
 | 
				
			||||||
#define SNB_SPADSEMA4_OFFSET	0x00c0
 | 
					#define SNB_PDBMSK_OFFSET		0x0062
 | 
				
			||||||
#define SNB_WCCNTRL_OFFSET	0x00e0
 | 
					#define SNB_SDOORBELL_OFFSET		0x0064
 | 
				
			||||||
#define SNB_B2B_SPAD_OFFSET	0x0100
 | 
					#define SNB_SDBMSK_OFFSET		0x0066
 | 
				
			||||||
#define SNB_B2B_DOORBELL_OFFSET	0x0140
 | 
					#define SNB_USMEMMISS_OFFSET		0x0070
 | 
				
			||||||
#define SNB_B2B_XLAT_OFFSETL	0x0144
 | 
					#define SNB_SPAD_OFFSET			0x0080
 | 
				
			||||||
#define SNB_B2B_XLAT_OFFSETU	0x0148
 | 
					#define SNB_PBAR23SZ_OFFSET		0x00d0
 | 
				
			||||||
 | 
					#define SNB_PBAR45SZ_OFFSET		0x00d1
 | 
				
			||||||
 | 
					#define SNB_PBAR4SZ_OFFSET		0x00d1
 | 
				
			||||||
 | 
					#define SNB_SBAR23SZ_OFFSET		0x00d2
 | 
				
			||||||
 | 
					#define SNB_SBAR45SZ_OFFSET		0x00d3
 | 
				
			||||||
 | 
					#define SNB_SBAR4SZ_OFFSET		0x00d3
 | 
				
			||||||
 | 
					#define SNB_PPD_OFFSET			0x00d4
 | 
				
			||||||
 | 
					#define SNB_PBAR5SZ_OFFSET		0x00d5
 | 
				
			||||||
 | 
					#define SNB_SBAR5SZ_OFFSET		0x00d6
 | 
				
			||||||
 | 
					#define SNB_WCCNTRL_OFFSET		0x00e0
 | 
				
			||||||
 | 
					#define SNB_UNCERRSTS_OFFSET		0x014c
 | 
				
			||||||
 | 
					#define SNB_CORERRSTS_OFFSET		0x0158
 | 
				
			||||||
 | 
					#define SNB_LINK_STATUS_OFFSET		0x01a2
 | 
				
			||||||
 | 
					#define SNB_SPCICMD_OFFSET		0x0504
 | 
				
			||||||
 | 
					#define SNB_DEVCTRL_OFFSET		0x0598
 | 
				
			||||||
 | 
					#define SNB_DEVSTS_OFFSET		0x059a
 | 
				
			||||||
 | 
					#define SNB_SLINK_STATUS_OFFSET		0x05a2
 | 
				
			||||||
 | 
					#define SNB_B2B_SPAD_OFFSET		0x0100
 | 
				
			||||||
 | 
					#define SNB_B2B_DOORBELL_OFFSET		0x0140
 | 
				
			||||||
 | 
					#define SNB_B2B_XLAT_OFFSETL		0x0144
 | 
				
			||||||
 | 
					#define SNB_B2B_XLAT_OFFSETU		0x0148
 | 
				
			||||||
 | 
					#define SNB_PPD_CONN_MASK		0x03
 | 
				
			||||||
 | 
					#define SNB_PPD_CONN_TRANSPARENT	0x00
 | 
				
			||||||
 | 
					#define SNB_PPD_CONN_B2B		0x01
 | 
				
			||||||
 | 
					#define SNB_PPD_CONN_RP			0x02
 | 
				
			||||||
 | 
					#define SNB_PPD_DEV_MASK		0x10
 | 
				
			||||||
 | 
					#define SNB_PPD_DEV_USD			0x00
 | 
				
			||||||
 | 
					#define SNB_PPD_DEV_DSD			0x10
 | 
				
			||||||
 | 
					#define SNB_PPD_SPLIT_BAR_MASK		0x40
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					#define SNB_PPD_TOPO_MASK	(SNB_PPD_CONN_MASK | SNB_PPD_DEV_MASK)
 | 
				
			||||||
 * The addresses are setup so the 32bit BARs can function. Thus
 | 
					#define SNB_PPD_TOPO_PRI_USD	(SNB_PPD_CONN_RP | SNB_PPD_DEV_USD)
 | 
				
			||||||
 * the addresses are all in 32bit space
 | 
					#define SNB_PPD_TOPO_PRI_DSD	(SNB_PPD_CONN_RP | SNB_PPD_DEV_DSD)
 | 
				
			||||||
 */
 | 
					#define SNB_PPD_TOPO_SEC_USD	(SNB_PPD_CONN_TRANSPARENT | SNB_PPD_DEV_USD)
 | 
				
			||||||
#define SNB_MBAR01_USD_ADDR	0x000000002100000CULL
 | 
					#define SNB_PPD_TOPO_SEC_DSD	(SNB_PPD_CONN_TRANSPARENT | SNB_PPD_DEV_DSD)
 | 
				
			||||||
#define SNB_MBAR23_USD_ADDR	0x000000004100000CULL
 | 
					#define SNB_PPD_TOPO_B2B_USD	(SNB_PPD_CONN_B2B | SNB_PPD_DEV_USD)
 | 
				
			||||||
#define SNB_MBAR4_USD_ADDR	0x000000008100000CULL
 | 
					#define SNB_PPD_TOPO_B2B_DSD	(SNB_PPD_CONN_B2B | SNB_PPD_DEV_DSD)
 | 
				
			||||||
#define SNB_MBAR5_USD_ADDR	0x00000000A100000CULL
 | 
					 | 
				
			||||||
#define SNB_MBAR01_DSD_ADDR	0x000000002000000CULL
 | 
					 | 
				
			||||||
#define SNB_MBAR23_DSD_ADDR	0x000000004000000CULL
 | 
					 | 
				
			||||||
#define SNB_MBAR4_DSD_ADDR	0x000000008000000CULL
 | 
					 | 
				
			||||||
#define SNB_MBAR5_DSD_ADDR	0x00000000A000000CULL
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define BWD_MSIX_CNT		34
 | 
					#define SNB_MW_COUNT			2
 | 
				
			||||||
#define BWD_MAX_SPADS		16
 | 
					#define HSX_SPLIT_BAR_MW_COUNT		3
 | 
				
			||||||
#define BWD_MAX_DB_BITS		34
 | 
					#define SNB_DB_COUNT			15
 | 
				
			||||||
#define BWD_DB_BITS_PER_VEC	1
 | 
					#define SNB_DB_LINK			15
 | 
				
			||||||
#define BWD_MAX_MW		2
 | 
					#define SNB_DB_LINK_BIT			BIT_ULL(SNB_DB_LINK)
 | 
				
			||||||
 | 
					#define SNB_DB_MSIX_VECTOR_COUNT	4
 | 
				
			||||||
 | 
					#define SNB_DB_MSIX_VECTOR_SHIFT	5
 | 
				
			||||||
 | 
					#define SNB_DB_TOTAL_SHIFT		16
 | 
				
			||||||
 | 
					#define SNB_SPAD_COUNT			16
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define BWD_PCICMD_OFFSET	0xb004
 | 
					/* BWD hardware */
 | 
				
			||||||
#define BWD_MBAR23_OFFSET	0xb018
 | 
					 | 
				
			||||||
#define BWD_MBAR45_OFFSET	0xb020
 | 
					 | 
				
			||||||
#define BWD_DEVCTRL_OFFSET	0xb048
 | 
					 | 
				
			||||||
#define BWD_LINK_STATUS_OFFSET	0xb052
 | 
					 | 
				
			||||||
#define BWD_ERRCORSTS_OFFSET	0xb110
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define BWD_SBAR2XLAT_OFFSET	0x0008
 | 
					#define BWD_SBAR2XLAT_OFFSET		0x0008
 | 
				
			||||||
#define BWD_SBAR4XLAT_OFFSET	0x0010
 | 
					#define BWD_PDOORBELL_OFFSET		0x0020
 | 
				
			||||||
#define BWD_PDOORBELL_OFFSET	0x0020
 | 
					#define BWD_PDBMSK_OFFSET		0x0028
 | 
				
			||||||
#define BWD_PDBMSK_OFFSET	0x0028
 | 
					#define BWD_NTBCNTL_OFFSET		0x0060
 | 
				
			||||||
#define BWD_NTBCNTL_OFFSET	0x0060
 | 
					#define BWD_SPAD_OFFSET			0x0080
 | 
				
			||||||
#define BWD_EBDF_OFFSET		0x0064
 | 
					#define BWD_PPD_OFFSET			0x00d4
 | 
				
			||||||
#define BWD_SPAD_OFFSET		0x0080
 | 
					#define BWD_PBAR2XLAT_OFFSET		0x8008
 | 
				
			||||||
#define BWD_SPADSEMA_OFFSET	0x00c0
 | 
					#define BWD_B2B_DOORBELL_OFFSET		0x8020
 | 
				
			||||||
#define BWD_STKYSPAD_OFFSET	0x00c4
 | 
					#define BWD_B2B_SPAD_OFFSET		0x8080
 | 
				
			||||||
#define BWD_PBAR2XLAT_OFFSET	0x8008
 | 
					#define BWD_SPCICMD_OFFSET		0xb004
 | 
				
			||||||
#define BWD_PBAR4XLAT_OFFSET	0x8010
 | 
					#define BWD_LINK_STATUS_OFFSET		0xb052
 | 
				
			||||||
#define BWD_B2B_DOORBELL_OFFSET	0x8020
 | 
					#define BWD_ERRCORSTS_OFFSET		0xb110
 | 
				
			||||||
#define BWD_B2B_SPAD_OFFSET	0x8080
 | 
					#define BWD_IP_BASE			0xc000
 | 
				
			||||||
#define BWD_B2B_SPADSEMA_OFFSET	0x80c0
 | 
					#define BWD_DESKEWSTS_OFFSET		(BWD_IP_BASE + 0x3024)
 | 
				
			||||||
#define BWD_B2B_STKYSPAD_OFFSET	0x80c4
 | 
					#define BWD_LTSSMERRSTS0_OFFSET		(BWD_IP_BASE + 0x3180)
 | 
				
			||||||
 | 
					 | 
				
			||||||
#define BWD_MODPHY_PCSREG4	0x1c004
 | 
					 | 
				
			||||||
#define BWD_MODPHY_PCSREG6	0x1c006
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define BWD_IP_BASE		0xC000
 | 
					 | 
				
			||||||
#define BWD_DESKEWSTS_OFFSET	(BWD_IP_BASE + 0x3024)
 | 
					 | 
				
			||||||
#define BWD_LTSSMERRSTS0_OFFSET (BWD_IP_BASE + 0x3180)
 | 
					 | 
				
			||||||
#define BWD_LTSSMSTATEJMP_OFFSET	(BWD_IP_BASE + 0x3040)
 | 
					#define BWD_LTSSMSTATEJMP_OFFSET	(BWD_IP_BASE + 0x3040)
 | 
				
			||||||
#define BWD_IBSTERRRCRVSTS0_OFFSET	(BWD_IP_BASE + 0x3324)
 | 
					#define BWD_IBSTERRRCRVSTS0_OFFSET	(BWD_IP_BASE + 0x3324)
 | 
				
			||||||
 | 
					#define BWD_MODPHY_PCSREG4		0x1c004
 | 
				
			||||||
 | 
					#define BWD_MODPHY_PCSREG6		0x1c006
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define BWD_DESKEWSTS_DBERR	(1 << 15)
 | 
					#define BWD_PPD_INIT_LINK		0x0008
 | 
				
			||||||
#define BWD_LTSSMERRSTS0_UNEXPECTEDEI	(1 << 20)
 | 
					#define BWD_PPD_CONN_MASK		0x0300
 | 
				
			||||||
#define BWD_LTSSMSTATEJMP_FORCEDETECT	(1 << 2)
 | 
					#define BWD_PPD_CONN_TRANSPARENT	0x0000
 | 
				
			||||||
#define BWD_IBIST_ERR_OFLOW	0x7FFF7FFF
 | 
					#define BWD_PPD_CONN_B2B		0x0100
 | 
				
			||||||
 | 
					#define BWD_PPD_CONN_RP			0x0200
 | 
				
			||||||
 | 
					#define BWD_PPD_DEV_MASK		0x1000
 | 
				
			||||||
 | 
					#define BWD_PPD_DEV_USD			0x0000
 | 
				
			||||||
 | 
					#define BWD_PPD_DEV_DSD			0x1000
 | 
				
			||||||
 | 
					#define BWD_PPD_TOPO_MASK	(BWD_PPD_CONN_MASK | BWD_PPD_DEV_MASK)
 | 
				
			||||||
 | 
					#define BWD_PPD_TOPO_PRI_USD	(BWD_PPD_CONN_TRANSPARENT | BWD_PPD_DEV_USD)
 | 
				
			||||||
 | 
					#define BWD_PPD_TOPO_PRI_DSD	(BWD_PPD_CONN_TRANSPARENT | BWD_PPD_DEV_DSD)
 | 
				
			||||||
 | 
					#define BWD_PPD_TOPO_SEC_USD	(BWD_PPD_CONN_RP | BWD_PPD_DEV_USD)
 | 
				
			||||||
 | 
					#define BWD_PPD_TOPO_SEC_DSD	(BWD_PPD_CONN_RP | BWD_PPD_DEV_DSD)
 | 
				
			||||||
 | 
					#define BWD_PPD_TOPO_B2B_USD	(BWD_PPD_CONN_B2B | BWD_PPD_DEV_USD)
 | 
				
			||||||
 | 
					#define BWD_PPD_TOPO_B2B_DSD	(BWD_PPD_CONN_B2B | BWD_PPD_DEV_DSD)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define NTB_CNTL_CFG_LOCK		(1 << 0)
 | 
					#define BWD_MW_COUNT			2
 | 
				
			||||||
#define NTB_CNTL_LINK_DISABLE		(1 << 1)
 | 
					#define BWD_DB_COUNT			34
 | 
				
			||||||
#define NTB_CNTL_S2P_BAR23_SNOOP	(1 << 2)
 | 
					#define BWD_DB_VALID_MASK		(BIT_ULL(BWD_DB_COUNT) - 1)
 | 
				
			||||||
#define NTB_CNTL_P2S_BAR23_SNOOP	(1 << 4)
 | 
					#define BWD_DB_MSIX_VECTOR_COUNT	34
 | 
				
			||||||
#define NTB_CNTL_S2P_BAR4_SNOOP	(1 << 6)
 | 
					#define BWD_DB_MSIX_VECTOR_SHIFT	1
 | 
				
			||||||
#define NTB_CNTL_P2S_BAR4_SNOOP	(1 << 8)
 | 
					#define BWD_DB_TOTAL_SHIFT		34
 | 
				
			||||||
#define NTB_CNTL_S2P_BAR5_SNOOP	(1 << 12)
 | 
					#define BWD_SPAD_COUNT			16
 | 
				
			||||||
#define NTB_CNTL_P2S_BAR5_SNOOP	(1 << 14)
 | 
					 | 
				
			||||||
#define BWD_CNTL_LINK_DOWN		(1 << 16)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define NTB_PPD_OFFSET		0x00D4
 | 
					#define BWD_NTB_CTL_DOWN_BIT		BIT(16)
 | 
				
			||||||
#define SNB_PPD_CONN_TYPE	0x0003
 | 
					#define BWD_NTB_CTL_ACTIVE(x)		!(x & BWD_NTB_CTL_DOWN_BIT)
 | 
				
			||||||
#define SNB_PPD_DEV_TYPE	0x0010
 | 
					
 | 
				
			||||||
#define SNB_PPD_SPLIT_BAR	(1 << 6)
 | 
					#define BWD_DESKEWSTS_DBERR		BIT(15)
 | 
				
			||||||
#define BWD_PPD_INIT_LINK	0x0008
 | 
					#define BWD_LTSSMERRSTS0_UNEXPECTEDEI	BIT(20)
 | 
				
			||||||
#define BWD_PPD_CONN_TYPE	0x0300
 | 
					#define BWD_LTSSMSTATEJMP_FORCEDETECT	BIT(2)
 | 
				
			||||||
#define BWD_PPD_DEV_TYPE	0x1000
 | 
					#define BWD_IBIST_ERR_OFLOW		0x7FFF7FFF
 | 
				
			||||||
#define PCI_DEVICE_ID_INTEL_NTB_B2B_JSF		0x3725
 | 
					
 | 
				
			||||||
#define PCI_DEVICE_ID_INTEL_NTB_PS_JSF		0x3726
 | 
					#define BWD_LINK_HB_TIMEOUT		msecs_to_jiffies(1000)
 | 
				
			||||||
#define PCI_DEVICE_ID_INTEL_NTB_SS_JSF		0x3727
 | 
					#define BWD_LINK_RECOVERY_TIME		msecs_to_jiffies(500)
 | 
				
			||||||
#define PCI_DEVICE_ID_INTEL_NTB_B2B_SNB		0x3C0D
 | 
					
 | 
				
			||||||
#define PCI_DEVICE_ID_INTEL_NTB_PS_SNB		0x3C0E
 | 
					/* Ntb control and link status */
 | 
				
			||||||
#define PCI_DEVICE_ID_INTEL_NTB_SS_SNB		0x3C0F
 | 
					
 | 
				
			||||||
#define PCI_DEVICE_ID_INTEL_NTB_B2B_IVT		0x0E0D
 | 
					#define NTB_CTL_CFG_LOCK		BIT(0)
 | 
				
			||||||
#define PCI_DEVICE_ID_INTEL_NTB_PS_IVT		0x0E0E
 | 
					#define NTB_CTL_DISABLE			BIT(1)
 | 
				
			||||||
#define PCI_DEVICE_ID_INTEL_NTB_SS_IVT		0x0E0F
 | 
					#define NTB_CTL_S2P_BAR2_SNOOP		BIT(2)
 | 
				
			||||||
#define PCI_DEVICE_ID_INTEL_NTB_B2B_HSX		0x2F0D
 | 
					#define NTB_CTL_P2S_BAR2_SNOOP		BIT(4)
 | 
				
			||||||
#define PCI_DEVICE_ID_INTEL_NTB_PS_HSX		0x2F0E
 | 
					#define NTB_CTL_S2P_BAR4_SNOOP		BIT(6)
 | 
				
			||||||
#define PCI_DEVICE_ID_INTEL_NTB_SS_HSX		0x2F0F
 | 
					#define NTB_CTL_P2S_BAR4_SNOOP		BIT(8)
 | 
				
			||||||
#define PCI_DEVICE_ID_INTEL_NTB_B2B_BWD		0x0C4E
 | 
					#define NTB_CTL_S2P_BAR5_SNOOP		BIT(12)
 | 
				
			||||||
 | 
					#define NTB_CTL_P2S_BAR5_SNOOP		BIT(14)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define NTB_LNK_STA_ACTIVE_BIT		0x2000
 | 
				
			||||||
 | 
					#define NTB_LNK_STA_SPEED_MASK		0x000f
 | 
				
			||||||
 | 
					#define NTB_LNK_STA_WIDTH_MASK		0x03f0
 | 
				
			||||||
 | 
					#define NTB_LNK_STA_ACTIVE(x)		(!!((x) & NTB_LNK_STA_ACTIVE_BIT))
 | 
				
			||||||
 | 
					#define NTB_LNK_STA_SPEED(x)		((x) & NTB_LNK_STA_SPEED_MASK)
 | 
				
			||||||
 | 
					#define NTB_LNK_STA_WIDTH(x)		(((x) & NTB_LNK_STA_WIDTH_MASK) >> 4)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Use the following addresses for translation between b2b ntb devices in case
 | 
				
			||||||
 | 
					 * the hardware default values are not reliable. */
 | 
				
			||||||
 | 
					#define SNB_B2B_BAR0_USD_ADDR		0x1000000000000000ull
 | 
				
			||||||
 | 
					#define SNB_B2B_BAR2_USD_ADDR64		0x2000000000000000ull
 | 
				
			||||||
 | 
					#define SNB_B2B_BAR4_USD_ADDR64		0x4000000000000000ull
 | 
				
			||||||
 | 
					#define SNB_B2B_BAR4_USD_ADDR32		0x20000000u
 | 
				
			||||||
 | 
					#define SNB_B2B_BAR5_USD_ADDR32		0x40000000u
 | 
				
			||||||
 | 
					#define SNB_B2B_BAR0_DSD_ADDR		0x9000000000000000ull
 | 
				
			||||||
 | 
					#define SNB_B2B_BAR2_DSD_ADDR64		0xa000000000000000ull
 | 
				
			||||||
 | 
					#define SNB_B2B_BAR4_DSD_ADDR64		0xc000000000000000ull
 | 
				
			||||||
 | 
					#define SNB_B2B_BAR4_DSD_ADDR32		0xa0000000u
 | 
				
			||||||
 | 
					#define SNB_B2B_BAR5_DSD_ADDR32		0xc0000000u
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* The peer ntb secondary config space is 32KB fixed size */
 | 
				
			||||||
 | 
					#define SNB_B2B_MIN_SIZE		0x8000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* flags to indicate hardware errata */
 | 
				
			||||||
 | 
					#define NTB_HWERR_SDOORBELL_LOCKUP	BIT_ULL(0)
 | 
				
			||||||
 | 
					#define NTB_HWERR_SB01BASE_LOCKUP	BIT_ULL(1)
 | 
				
			||||||
 | 
					#define NTB_HWERR_B2BDOORBELL_BIT14	BIT_ULL(2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* flags to indicate unsafe api */
 | 
				
			||||||
 | 
					#define NTB_UNSAFE_DB			BIT_ULL(0)
 | 
				
			||||||
 | 
					#define NTB_UNSAFE_SPAD			BIT_ULL(1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct intel_ntb_dev;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct intel_ntb_reg {
 | 
				
			||||||
 | 
						int (*poll_link)(struct intel_ntb_dev *ndev);
 | 
				
			||||||
 | 
						int (*link_is_up)(struct intel_ntb_dev *ndev);
 | 
				
			||||||
 | 
						u64 (*db_ioread)(void __iomem *mmio);
 | 
				
			||||||
 | 
						void (*db_iowrite)(u64 db_bits, void __iomem *mmio);
 | 
				
			||||||
 | 
						unsigned long			ntb_ctl;
 | 
				
			||||||
 | 
						resource_size_t			db_size;
 | 
				
			||||||
 | 
						int				mw_bar[];
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct intel_ntb_alt_reg {
 | 
				
			||||||
 | 
						unsigned long			db_bell;
 | 
				
			||||||
 | 
						unsigned long			db_mask;
 | 
				
			||||||
 | 
						unsigned long			spad;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct intel_ntb_xlat_reg {
 | 
				
			||||||
 | 
						unsigned long			bar0_base;
 | 
				
			||||||
 | 
						unsigned long			bar2_xlat;
 | 
				
			||||||
 | 
						unsigned long			bar2_limit;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct intel_b2b_addr {
 | 
				
			||||||
 | 
						phys_addr_t			bar0_addr;
 | 
				
			||||||
 | 
						phys_addr_t			bar2_addr64;
 | 
				
			||||||
 | 
						phys_addr_t			bar4_addr64;
 | 
				
			||||||
 | 
						phys_addr_t			bar4_addr32;
 | 
				
			||||||
 | 
						phys_addr_t			bar5_addr32;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct intel_ntb_vec {
 | 
				
			||||||
 | 
						struct intel_ntb_dev		*ndev;
 | 
				
			||||||
 | 
						int				num;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct intel_ntb_dev {
 | 
				
			||||||
 | 
						struct ntb_dev			ntb;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* offset of peer bar0 in b2b bar */
 | 
				
			||||||
 | 
						unsigned long			b2b_off;
 | 
				
			||||||
 | 
						/* mw idx used to access peer bar0 */
 | 
				
			||||||
 | 
						unsigned int			b2b_idx;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* BAR45 is split into BAR4 and BAR5 */
 | 
				
			||||||
 | 
						bool				bar4_split;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						u32				ntb_ctl;
 | 
				
			||||||
 | 
						u32				lnk_sta;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						unsigned char			mw_count;
 | 
				
			||||||
 | 
						unsigned char			spad_count;
 | 
				
			||||||
 | 
						unsigned char			db_count;
 | 
				
			||||||
 | 
						unsigned char			db_vec_count;
 | 
				
			||||||
 | 
						unsigned char			db_vec_shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						u64				db_valid_mask;
 | 
				
			||||||
 | 
						u64				db_link_mask;
 | 
				
			||||||
 | 
						u64				db_mask;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* synchronize rmw access of db_mask and hw reg */
 | 
				
			||||||
 | 
						spinlock_t			db_mask_lock;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct msix_entry		*msix;
 | 
				
			||||||
 | 
						struct intel_ntb_vec		*vec;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						const struct intel_ntb_reg	*reg;
 | 
				
			||||||
 | 
						const struct intel_ntb_alt_reg	*self_reg;
 | 
				
			||||||
 | 
						const struct intel_ntb_alt_reg	*peer_reg;
 | 
				
			||||||
 | 
						const struct intel_ntb_xlat_reg	*xlat_reg;
 | 
				
			||||||
 | 
						void				__iomem *self_mmio;
 | 
				
			||||||
 | 
						void				__iomem *peer_mmio;
 | 
				
			||||||
 | 
						phys_addr_t			peer_addr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						unsigned long			last_ts;
 | 
				
			||||||
 | 
						struct delayed_work		hb_timer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						unsigned long			hwerr_flags;
 | 
				
			||||||
 | 
						unsigned long			unsafe_flags;
 | 
				
			||||||
 | 
						unsigned long			unsafe_flags_ignore;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct dentry			*debugfs_dir;
 | 
				
			||||||
 | 
						struct dentry			*debugfs_info;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define ndev_pdev(ndev) ((ndev)->ntb.pdev)
 | 
				
			||||||
 | 
					#define ndev_name(ndev) pci_name(ndev_pdev(ndev))
 | 
				
			||||||
 | 
					#define ndev_dev(ndev) (&ndev_pdev(ndev)->dev)
 | 
				
			||||||
 | 
					#define ntb_ndev(ntb) container_of(ntb, struct intel_ntb_dev, ntb)
 | 
				
			||||||
 | 
					#define hb_ndev(work) container_of(work, struct intel_ntb_dev, hb_timer.work)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef readq
 | 
					 | 
				
			||||||
static inline u64 readq(void __iomem *addr)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	return readl(addr) | (((u64) readl(addr + 4)) << 32LL);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef writeq
 | 
					 | 
				
			||||||
static inline void writeq(u64 val, void __iomem *addr)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	writel(val & 0xffffffff, addr);
 | 
					 | 
				
			||||||
	writel(val >> 32, addr + 4);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define NTB_BAR_MMIO		0
 | 
					 | 
				
			||||||
#define NTB_BAR_23		2
 | 
					 | 
				
			||||||
#define NTB_BAR_4		4
 | 
					 | 
				
			||||||
#define NTB_BAR_5		5
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define NTB_BAR_MASK		((1 << NTB_BAR_MMIO) | (1 << NTB_BAR_23) |\
 | 
					 | 
				
			||||||
				 (1 << NTB_BAR_4))
 | 
					 | 
				
			||||||
#define NTB_SPLITBAR_MASK	((1 << NTB_BAR_MMIO) | (1 << NTB_BAR_23) |\
 | 
					 | 
				
			||||||
				 (1 << NTB_BAR_4) | (1 << NTB_BAR_5))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define NTB_HB_TIMEOUT		msecs_to_jiffies(1000)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum ntb_hw_event {
 | 
					 | 
				
			||||||
	NTB_EVENT_SW_EVENT0 = 0,
 | 
					 | 
				
			||||||
	NTB_EVENT_SW_EVENT1,
 | 
					 | 
				
			||||||
	NTB_EVENT_SW_EVENT2,
 | 
					 | 
				
			||||||
	NTB_EVENT_HW_ERROR,
 | 
					 | 
				
			||||||
	NTB_EVENT_HW_LINK_UP,
 | 
					 | 
				
			||||||
	NTB_EVENT_HW_LINK_DOWN,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct ntb_mw {
 | 
					 | 
				
			||||||
	dma_addr_t phys_addr;
 | 
					 | 
				
			||||||
	void __iomem *vbase;
 | 
					 | 
				
			||||||
	resource_size_t bar_sz;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct ntb_db_cb {
 | 
					 | 
				
			||||||
	int (*callback)(void *data, int db_num);
 | 
					 | 
				
			||||||
	unsigned int db_num;
 | 
					 | 
				
			||||||
	void *data;
 | 
					 | 
				
			||||||
	struct ntb_device *ndev;
 | 
					 | 
				
			||||||
	struct tasklet_struct irq_work;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define WA_SNB_ERR	0x00000001
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct ntb_device {
 | 
					 | 
				
			||||||
	struct pci_dev *pdev;
 | 
					 | 
				
			||||||
	struct msix_entry *msix_entries;
 | 
					 | 
				
			||||||
	void __iomem *reg_base;
 | 
					 | 
				
			||||||
	struct ntb_mw *mw;
 | 
					 | 
				
			||||||
	struct {
 | 
					 | 
				
			||||||
		unsigned char max_mw;
 | 
					 | 
				
			||||||
		unsigned char max_spads;
 | 
					 | 
				
			||||||
		unsigned char max_db_bits;
 | 
					 | 
				
			||||||
		unsigned char msix_cnt;
 | 
					 | 
				
			||||||
	} limits;
 | 
					 | 
				
			||||||
	struct {
 | 
					 | 
				
			||||||
		void __iomem *ldb;
 | 
					 | 
				
			||||||
		void __iomem *ldb_mask;
 | 
					 | 
				
			||||||
		void __iomem *rdb;
 | 
					 | 
				
			||||||
		void __iomem *bar2_xlat;
 | 
					 | 
				
			||||||
		void __iomem *bar4_xlat;
 | 
					 | 
				
			||||||
		void __iomem *bar5_xlat;
 | 
					 | 
				
			||||||
		void __iomem *spad_write;
 | 
					 | 
				
			||||||
		void __iomem *spad_read;
 | 
					 | 
				
			||||||
		void __iomem *lnk_cntl;
 | 
					 | 
				
			||||||
		void __iomem *lnk_stat;
 | 
					 | 
				
			||||||
		void __iomem *spci_cmd;
 | 
					 | 
				
			||||||
	} reg_ofs;
 | 
					 | 
				
			||||||
	struct ntb_transport *ntb_transport;
 | 
					 | 
				
			||||||
	void (*event_cb)(void *handle, enum ntb_hw_event event);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	struct ntb_db_cb *db_cb;
 | 
					 | 
				
			||||||
	unsigned char hw_type;
 | 
					 | 
				
			||||||
	unsigned char conn_type;
 | 
					 | 
				
			||||||
	unsigned char dev_type;
 | 
					 | 
				
			||||||
	unsigned char num_msix;
 | 
					 | 
				
			||||||
	unsigned char bits_per_vector;
 | 
					 | 
				
			||||||
	unsigned char max_cbs;
 | 
					 | 
				
			||||||
	unsigned char link_width;
 | 
					 | 
				
			||||||
	unsigned char link_speed;
 | 
					 | 
				
			||||||
	unsigned char link_status;
 | 
					 | 
				
			||||||
	unsigned char split_bar;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	struct delayed_work hb_timer;
 | 
					 | 
				
			||||||
	unsigned long last_ts;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	struct delayed_work lr_timer;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	struct dentry *debugfs_dir;
 | 
					 | 
				
			||||||
	struct dentry *debugfs_info;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	unsigned int wa_flags;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * ntb_max_cbs() - return the max callbacks
 | 
					 | 
				
			||||||
 * @ndev: pointer to ntb_device instance
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * Given the ntb pointer, return the maximum number of callbacks
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * RETURNS: the maximum number of callbacks
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
static inline unsigned char ntb_max_cbs(struct ntb_device *ndev)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	return ndev->max_cbs;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * ntb_max_mw() - return the max number of memory windows
 | 
					 | 
				
			||||||
 * @ndev: pointer to ntb_device instance
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * Given the ntb pointer, return the maximum number of memory windows
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * RETURNS: the maximum number of memory windows
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
static inline unsigned char ntb_max_mw(struct ntb_device *ndev)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	return ndev->limits.max_mw;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * ntb_hw_link_status() - return the hardware link status
 | 
					 | 
				
			||||||
 * @ndev: pointer to ntb_device instance
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * Returns true if the hardware is connected to the remote system
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * RETURNS: true or false based on the hardware link state
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
static inline bool ntb_hw_link_status(struct ntb_device *ndev)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	return ndev->link_status == NTB_LINK_UP;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * ntb_query_pdev() - return the pci_dev pointer
 | 
					 | 
				
			||||||
 * @ndev: pointer to ntb_device instance
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * Given the ntb pointer, return the pci_dev pointer for the NTB hardware device
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * RETURNS: a pointer to the ntb pci_dev
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
static inline struct pci_dev *ntb_query_pdev(struct ntb_device *ndev)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	return ndev->pdev;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * ntb_query_debugfs() - return the debugfs pointer
 | 
					 | 
				
			||||||
 * @ndev: pointer to ntb_device instance
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * Given the ntb pointer, return the debugfs directory pointer for the NTB
 | 
					 | 
				
			||||||
 * hardware device
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * RETURNS: a pointer to the debugfs directory
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
static inline struct dentry *ntb_query_debugfs(struct ntb_device *ndev)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	return ndev->debugfs_dir;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct ntb_device *ntb_register_transport(struct pci_dev *pdev,
 | 
					 | 
				
			||||||
					  void *transport);
 | 
					 | 
				
			||||||
void ntb_unregister_transport(struct ntb_device *ndev);
 | 
					 | 
				
			||||||
void ntb_set_mw_addr(struct ntb_device *ndev, unsigned int mw, u64 addr);
 | 
					 | 
				
			||||||
int ntb_register_db_callback(struct ntb_device *ndev, unsigned int idx,
 | 
					 | 
				
			||||||
			     void *data, int (*db_cb_func)(void *data,
 | 
					 | 
				
			||||||
							   int db_num));
 | 
					 | 
				
			||||||
void ntb_unregister_db_callback(struct ntb_device *ndev, unsigned int idx);
 | 
					 | 
				
			||||||
int ntb_register_event_callback(struct ntb_device *ndev,
 | 
					 | 
				
			||||||
				void (*event_cb_func)(void *handle,
 | 
					 | 
				
			||||||
						      enum ntb_hw_event event));
 | 
					 | 
				
			||||||
void ntb_unregister_event_callback(struct ntb_device *ndev);
 | 
					 | 
				
			||||||
int ntb_get_max_spads(struct ntb_device *ndev);
 | 
					 | 
				
			||||||
int ntb_write_local_spad(struct ntb_device *ndev, unsigned int idx, u32 val);
 | 
					 | 
				
			||||||
int ntb_read_local_spad(struct ntb_device *ndev, unsigned int idx, u32 *val);
 | 
					 | 
				
			||||||
int ntb_write_remote_spad(struct ntb_device *ndev, unsigned int idx, u32 val);
 | 
					 | 
				
			||||||
int ntb_read_remote_spad(struct ntb_device *ndev, unsigned int idx, u32 *val);
 | 
					 | 
				
			||||||
resource_size_t ntb_get_mw_base(struct ntb_device *ndev, unsigned int mw);
 | 
					 | 
				
			||||||
void __iomem *ntb_get_mw_vbase(struct ntb_device *ndev, unsigned int mw);
 | 
					 | 
				
			||||||
u64 ntb_get_mw_size(struct ntb_device *ndev, unsigned int mw);
 | 
					 | 
				
			||||||
void ntb_ring_doorbell(struct ntb_device *ndev, unsigned int idx);
 | 
					 | 
				
			||||||
void *ntb_find_transport(struct pci_dev *pdev);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int ntb_transport_init(struct pci_dev *pdev);
 | 
					 | 
				
			||||||
void ntb_transport_free(void *transport);
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							| 
						 | 
					@ -5,6 +5,7 @@
 | 
				
			||||||
 *   GPL LICENSE SUMMARY
 | 
					 *   GPL LICENSE SUMMARY
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 *   Copyright(c) 2012 Intel Corporation. All rights reserved.
 | 
					 *   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
 | 
					 *   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
 | 
					 *   it under the terms of version 2 of the GNU General Public License as
 | 
				
			||||||
| 
						 | 
					@ -13,6 +14,7 @@
 | 
				
			||||||
 *   BSD LICENSE
 | 
					 *   BSD LICENSE
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 *   Copyright(c) 2012 Intel Corporation. All rights reserved.
 | 
					 *   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
 | 
					 *   Redistribution and use in source and binary forms, with or without
 | 
				
			||||||
 *   modification, are permitted provided that the following conditions
 | 
					 *   modification, are permitted provided that the following conditions
 | 
				
			||||||
| 
						 | 
					@ -40,7 +42,7 @@
 | 
				
			||||||
 *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
					 *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
				
			||||||
 *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
					 *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * Intel PCIe NTB Linux driver
 | 
					 * PCIe NTB Transport Linux driver
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * Contact Information:
 | 
					 * Contact Information:
 | 
				
			||||||
 * Jon Mason <jon.mason@intel.com>
 | 
					 * Jon Mason <jon.mason@intel.com>
 | 
				
			||||||
| 
						 | 
					@ -48,21 +50,16 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct ntb_transport_qp;
 | 
					struct ntb_transport_qp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct ntb_client {
 | 
					struct ntb_transport_client {
 | 
				
			||||||
	struct device_driver driver;
 | 
						struct device_driver driver;
 | 
				
			||||||
	int (*probe)(struct pci_dev *pdev);
 | 
						int (*probe)(struct device *client_dev);
 | 
				
			||||||
	void (*remove)(struct pci_dev *pdev);
 | 
						void (*remove)(struct device *client_dev);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum {
 | 
					int ntb_transport_register_client(struct ntb_transport_client *drvr);
 | 
				
			||||||
	NTB_LINK_DOWN = 0,
 | 
					void ntb_transport_unregister_client(struct ntb_transport_client *drvr);
 | 
				
			||||||
	NTB_LINK_UP,
 | 
					int ntb_transport_register_client_dev(char *device_name);
 | 
				
			||||||
};
 | 
					void ntb_transport_unregister_client_dev(char *device_name);
 | 
				
			||||||
 | 
					 | 
				
			||||||
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);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct ntb_queue_handlers {
 | 
					struct ntb_queue_handlers {
 | 
				
			||||||
	void (*rx_handler)(struct ntb_transport_qp *qp, void *qp_data,
 | 
						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 char ntb_transport_qp_num(struct ntb_transport_qp *qp);
 | 
				
			||||||
unsigned int ntb_transport_max_size(struct ntb_transport_qp *qp);
 | 
					unsigned int ntb_transport_max_size(struct ntb_transport_qp *qp);
 | 
				
			||||||
struct ntb_transport_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);
 | 
								   const struct ntb_queue_handlers *handlers);
 | 
				
			||||||
void ntb_transport_free_queue(struct ntb_transport_qp *qp);
 | 
					void ntb_transport_free_queue(struct ntb_transport_qp *qp);
 | 
				
			||||||
int ntb_transport_rx_enqueue(struct ntb_transport_qp *qp, void *cb, void *data,
 | 
					int ntb_transport_rx_enqueue(struct ntb_transport_qp *qp, void *cb, void *data,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue