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 | 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
	
	 Allen Hubbe
						Allen Hubbe