forked from mirrors/linux
		
	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 | ||||
| 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 @@ static int ntb_netdev_probe(struct pci_dev *pdev) | |||
| 	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
											
										
									
								
							|  | @ -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 | ||||
|  | @ -45,341 +47,296 @@ | |||
|  * Contact Information: | ||||
|  * Jon Mason <jon.mason@intel.com> | ||||
|  */ | ||||
| #include <linux/ntb_transport.h> | ||||
| 
 | ||||
| #define NTB_LINK_STATUS_ACTIVE	0x2000 | ||||
| #define NTB_LINK_SPEED_MASK	0x000f | ||||
| #define NTB_LINK_WIDTH_MASK	0x03f0 | ||||
| #ifndef NTB_HW_INTEL_H | ||||
| #define NTB_HW_INTEL_H | ||||
| 
 | ||||
| #define SNB_MSIX_CNT		4 | ||||
| #define SNB_MAX_B2B_SPADS	16 | ||||
| #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 | ||||
| #include <linux/ntb.h> | ||||
| #include <linux/pci.h> | ||||
| 
 | ||||
| #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 | ||||
| #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 | ||||
| /* SNB hardware (and JSF, IVT, HSX) */ | ||||
| 
 | ||||
| #define SNB_PBAR2LMT_OFFSET	0x0000 | ||||
| #define SNB_PBAR4LMT_OFFSET	0x0008 | ||||
| #define SNB_PBAR5LMT_OFFSET	0x000C | ||||
| #define SNB_PBAR2XLAT_OFFSET	0x0010 | ||||
| #define SNB_PBAR4XLAT_OFFSET	0x0018 | ||||
| #define SNB_PBAR5XLAT_OFFSET	0x001C | ||||
| #define SNB_SBAR2LMT_OFFSET	0x0020 | ||||
| #define SNB_SBAR4LMT_OFFSET	0x0028 | ||||
| #define SNB_SBAR5LMT_OFFSET	0x002C | ||||
| #define SNB_SBAR2XLAT_OFFSET	0x0030 | ||||
| #define SNB_SBAR4XLAT_OFFSET	0x0038 | ||||
| #define SNB_SBAR5XLAT_OFFSET	0x003C | ||||
| #define SNB_SBAR0BASE_OFFSET	0x0040 | ||||
| #define SNB_SBAR2BASE_OFFSET	0x0048 | ||||
| #define SNB_SBAR4BASE_OFFSET	0x0050 | ||||
| #define SNB_SBAR5BASE_OFFSET	0x0054 | ||||
| #define SNB_NTBCNTL_OFFSET	0x0058 | ||||
| #define SNB_SBDF_OFFSET		0x005C | ||||
| #define SNB_PDOORBELL_OFFSET	0x0060 | ||||
| #define SNB_PDBMSK_OFFSET	0x0062 | ||||
| #define SNB_SDOORBELL_OFFSET	0x0064 | ||||
| #define SNB_SDBMSK_OFFSET	0x0066 | ||||
| #define SNB_USMEMMISS_OFFSET	0x0070 | ||||
| #define SNB_SPAD_OFFSET		0x0080 | ||||
| #define SNB_SPADSEMA4_OFFSET	0x00c0 | ||||
| #define SNB_WCCNTRL_OFFSET	0x00e0 | ||||
| #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_PBAR23LMT_OFFSET		0x0000 | ||||
| #define SNB_PBAR45LMT_OFFSET		0x0008 | ||||
| #define SNB_PBAR4LMT_OFFSET		0x0008 | ||||
| #define SNB_PBAR5LMT_OFFSET		0x000c | ||||
| #define SNB_PBAR23XLAT_OFFSET		0x0010 | ||||
| #define SNB_PBAR45XLAT_OFFSET		0x0018 | ||||
| #define SNB_PBAR4XLAT_OFFSET		0x0018 | ||||
| #define SNB_PBAR5XLAT_OFFSET		0x001c | ||||
| #define SNB_SBAR23LMT_OFFSET		0x0020 | ||||
| #define SNB_SBAR45LMT_OFFSET		0x0028 | ||||
| #define SNB_SBAR4LMT_OFFSET		0x0028 | ||||
| #define SNB_SBAR5LMT_OFFSET		0x002c | ||||
| #define SNB_SBAR23XLAT_OFFSET		0x0030 | ||||
| #define SNB_SBAR45XLAT_OFFSET		0x0038 | ||||
| #define SNB_SBAR4XLAT_OFFSET		0x0038 | ||||
| #define SNB_SBAR5XLAT_OFFSET		0x003c | ||||
| #define SNB_SBAR0BASE_OFFSET		0x0040 | ||||
| #define SNB_SBAR23BASE_OFFSET		0x0048 | ||||
| #define SNB_SBAR45BASE_OFFSET		0x0050 | ||||
| #define SNB_SBAR4BASE_OFFSET		0x0050 | ||||
| #define SNB_SBAR5BASE_OFFSET		0x0054 | ||||
| #define SNB_SBDF_OFFSET			0x005c | ||||
| #define SNB_NTBCNTL_OFFSET		0x0058 | ||||
| #define SNB_PDOORBELL_OFFSET		0x0060 | ||||
| #define SNB_PDBMSK_OFFSET		0x0062 | ||||
| #define SNB_SDOORBELL_OFFSET		0x0064 | ||||
| #define SNB_SDBMSK_OFFSET		0x0066 | ||||
| #define SNB_USMEMMISS_OFFSET		0x0070 | ||||
| #define SNB_SPAD_OFFSET			0x0080 | ||||
| #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 | ||||
| 
 | ||||
| /*
 | ||||
|  * The addresses are setup so the 32bit BARs can function. Thus | ||||
|  * the addresses are all in 32bit space | ||||
|  */ | ||||
| #define SNB_MBAR01_USD_ADDR	0x000000002100000CULL | ||||
| #define SNB_MBAR23_USD_ADDR	0x000000004100000CULL | ||||
| #define SNB_MBAR4_USD_ADDR	0x000000008100000CULL | ||||
| #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 SNB_PPD_TOPO_MASK	(SNB_PPD_CONN_MASK | SNB_PPD_DEV_MASK) | ||||
| #define SNB_PPD_TOPO_PRI_USD	(SNB_PPD_CONN_RP | SNB_PPD_DEV_USD) | ||||
| #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_PPD_TOPO_SEC_DSD	(SNB_PPD_CONN_TRANSPARENT | SNB_PPD_DEV_DSD) | ||||
| #define SNB_PPD_TOPO_B2B_USD	(SNB_PPD_CONN_B2B | SNB_PPD_DEV_USD) | ||||
| #define SNB_PPD_TOPO_B2B_DSD	(SNB_PPD_CONN_B2B | SNB_PPD_DEV_DSD) | ||||
| 
 | ||||
| #define BWD_MSIX_CNT		34 | ||||
| #define BWD_MAX_SPADS		16 | ||||
| #define BWD_MAX_DB_BITS		34 | ||||
| #define BWD_DB_BITS_PER_VEC	1 | ||||
| #define BWD_MAX_MW		2 | ||||
| #define SNB_MW_COUNT			2 | ||||
| #define HSX_SPLIT_BAR_MW_COUNT		3 | ||||
| #define SNB_DB_COUNT			15 | ||||
| #define SNB_DB_LINK			15 | ||||
| #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 | ||||
| #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 | ||||
| /* BWD hardware */ | ||||
| 
 | ||||
| #define BWD_SBAR2XLAT_OFFSET	0x0008 | ||||
| #define BWD_SBAR4XLAT_OFFSET	0x0010 | ||||
| #define BWD_PDOORBELL_OFFSET	0x0020 | ||||
| #define BWD_PDBMSK_OFFSET	0x0028 | ||||
| #define BWD_NTBCNTL_OFFSET	0x0060 | ||||
| #define BWD_EBDF_OFFSET		0x0064 | ||||
| #define BWD_SPAD_OFFSET		0x0080 | ||||
| #define BWD_SPADSEMA_OFFSET	0x00c0 | ||||
| #define BWD_STKYSPAD_OFFSET	0x00c4 | ||||
| #define BWD_PBAR2XLAT_OFFSET	0x8008 | ||||
| #define BWD_PBAR4XLAT_OFFSET	0x8010 | ||||
| #define BWD_B2B_DOORBELL_OFFSET	0x8020 | ||||
| #define BWD_B2B_SPAD_OFFSET	0x8080 | ||||
| #define BWD_B2B_SPADSEMA_OFFSET	0x80c0 | ||||
| #define BWD_B2B_STKYSPAD_OFFSET	0x80c4 | ||||
| 
 | ||||
| #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_SBAR2XLAT_OFFSET		0x0008 | ||||
| #define BWD_PDOORBELL_OFFSET		0x0020 | ||||
| #define BWD_PDBMSK_OFFSET		0x0028 | ||||
| #define BWD_NTBCNTL_OFFSET		0x0060 | ||||
| #define BWD_SPAD_OFFSET			0x0080 | ||||
| #define BWD_PPD_OFFSET			0x00d4 | ||||
| #define BWD_PBAR2XLAT_OFFSET		0x8008 | ||||
| #define BWD_B2B_DOORBELL_OFFSET		0x8020 | ||||
| #define BWD_B2B_SPAD_OFFSET		0x8080 | ||||
| #define BWD_SPCICMD_OFFSET		0xb004 | ||||
| #define BWD_LINK_STATUS_OFFSET		0xb052 | ||||
| #define BWD_ERRCORSTS_OFFSET		0xb110 | ||||
| #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_IBSTERRRCRVSTS0_OFFSET	(BWD_IP_BASE + 0x3324) | ||||
| #define BWD_MODPHY_PCSREG4		0x1c004 | ||||
| #define BWD_MODPHY_PCSREG6		0x1c006 | ||||
| 
 | ||||
| #define BWD_DESKEWSTS_DBERR	(1 << 15) | ||||
| #define BWD_LTSSMERRSTS0_UNEXPECTEDEI	(1 << 20) | ||||
| #define BWD_LTSSMSTATEJMP_FORCEDETECT	(1 << 2) | ||||
| #define BWD_IBIST_ERR_OFLOW	0x7FFF7FFF | ||||
| #define BWD_PPD_INIT_LINK		0x0008 | ||||
| #define BWD_PPD_CONN_MASK		0x0300 | ||||
| #define BWD_PPD_CONN_TRANSPARENT	0x0000 | ||||
| #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 NTB_CNTL_LINK_DISABLE		(1 << 1) | ||||
| #define NTB_CNTL_S2P_BAR23_SNOOP	(1 << 2) | ||||
| #define NTB_CNTL_P2S_BAR23_SNOOP	(1 << 4) | ||||
| #define NTB_CNTL_S2P_BAR4_SNOOP	(1 << 6) | ||||
| #define NTB_CNTL_P2S_BAR4_SNOOP	(1 << 8) | ||||
| #define NTB_CNTL_S2P_BAR5_SNOOP	(1 << 12) | ||||
| #define NTB_CNTL_P2S_BAR5_SNOOP	(1 << 14) | ||||
| #define BWD_CNTL_LINK_DOWN		(1 << 16) | ||||
| #define BWD_MW_COUNT			2 | ||||
| #define BWD_DB_COUNT			34 | ||||
| #define BWD_DB_VALID_MASK		(BIT_ULL(BWD_DB_COUNT) - 1) | ||||
| #define BWD_DB_MSIX_VECTOR_COUNT	34 | ||||
| #define BWD_DB_MSIX_VECTOR_SHIFT	1 | ||||
| #define BWD_DB_TOTAL_SHIFT		34 | ||||
| #define BWD_SPAD_COUNT			16 | ||||
| 
 | ||||
| #define NTB_PPD_OFFSET		0x00D4 | ||||
| #define SNB_PPD_CONN_TYPE	0x0003 | ||||
| #define SNB_PPD_DEV_TYPE	0x0010 | ||||
| #define SNB_PPD_SPLIT_BAR	(1 << 6) | ||||
| #define BWD_PPD_INIT_LINK	0x0008 | ||||
| #define BWD_PPD_CONN_TYPE	0x0300 | ||||
| #define BWD_PPD_DEV_TYPE	0x1000 | ||||
| #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 BWD_NTB_CTL_DOWN_BIT		BIT(16) | ||||
| #define BWD_NTB_CTL_ACTIVE(x)		!(x & BWD_NTB_CTL_DOWN_BIT) | ||||
| 
 | ||||
| #define BWD_DESKEWSTS_DBERR		BIT(15) | ||||
| #define BWD_LTSSMERRSTS0_UNEXPECTEDEI	BIT(20) | ||||
| #define BWD_LTSSMSTATEJMP_FORCEDETECT	BIT(2) | ||||
| #define BWD_IBIST_ERR_OFLOW		0x7FFF7FFF | ||||
| 
 | ||||
| #define BWD_LINK_HB_TIMEOUT		msecs_to_jiffies(1000) | ||||
| #define BWD_LINK_RECOVERY_TIME		msecs_to_jiffies(500) | ||||
| 
 | ||||
| /* Ntb control and link status */ | ||||
| 
 | ||||
| #define NTB_CTL_CFG_LOCK		BIT(0) | ||||
| #define NTB_CTL_DISABLE			BIT(1) | ||||
| #define NTB_CTL_S2P_BAR2_SNOOP		BIT(2) | ||||
| #define NTB_CTL_P2S_BAR2_SNOOP		BIT(4) | ||||
| #define NTB_CTL_S2P_BAR4_SNOOP		BIT(6) | ||||
| #define NTB_CTL_P2S_BAR4_SNOOP		BIT(8) | ||||
| #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 | ||||
| 
 | ||||
| #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 | ||||
|  * | ||||
|  *   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, | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Allen Hubbe
						Allen Hubbe