Skip to contentSkip to conversation

ntb: NTB Abstraction Layer

PATCH Superseded Allen Hubbe 4 participants 30 messages May 20, 2015 – May 21, 2015

Subsystems (5)

v1 of 4 Superseded Latest is v4 →

lore
Share & tools
lore
#0 lore raw

cover ntb: NTB Abstraction Layer

The NTB drivers currently support only one hardware driver, and one client type. This patch set adds an abstraction layer, enabling different hardware drivers by other vendors, and clients other than ntb_transport.

The commits in this set may also be pulled from:
github.com/allenbh/linux
in the branch ntb-abh, or tag ntb-abh-v1

Allen Hubbe (12):
Move files in preparation for NTB Abstraction
NTB Abstraction Layer
Intel NTB params for snb b2b addresses
NTB Pingpong Client
NTB Tool Client
ntb_transport: rate limit ntb_qp_link_work
ntb_transport: differentiate link down messages
ntb_transport: don't advance rx on link down
ntb_transport: reset qp link stats on down
ntb_transport: numa aware memory and dma chan
ntb_hw_intel: numa aware memory allocation
ntb_transport: fix small code format issues

Dave Jiang (4):
ntb: Enable link training for RP mode in the driver probe Check the DID for certain workaround error flags to be set.
ntb: performance improvement by write combining
ntb: default to cpu memcpy for performance

 Documentation/ntb.txt               |  127 ++
 MAINTAINERS                         |   16 +-
 drivers/net/ntb_netdev.c            |   58 +-
 drivers/ntb/Kconfig                 |   22 +-
 drivers/ntb/Makefile                |    4 +-
 drivers/ntb/hw/Kconfig              |    1 +
 drivers/ntb/hw/Makefile             |    1 +
 drivers/ntb/hw/intel/Kconfig        |    8 +
 drivers/ntb/hw/intel/Makefile       |    1 +
 drivers/ntb/hw/intel/ntb_hw_intel.c | 2222 +++++++++++++++++++++++++++++++++++
 drivers/ntb/hw/intel/ntb_hw_intel.h |  342 ++++++
 drivers/ntb/ntb.c                   |  251 ++++
 drivers/ntb/ntb_hw.c                | 1896 ------------------------------
 drivers/ntb/ntb_hw.h                |  256 ----
 drivers/ntb/ntb_regs.h              |  177 ---
 drivers/ntb/ntb_transport.c         | 1018 +++++++++-------
 drivers/ntb/test/Kconfig            |   21 +
 drivers/ntb/test/Makefile           |    2 +
 drivers/ntb/test/ntb_pingpong.c     |  251 ++++
 drivers/ntb/test/ntb_tool.c         |  557 +++++++++
 include/linux/ntb.h                 |  969 ++++++++++++++-
 include/linux/ntb_transport.h       |   85 ++
 22 files changed, 5486 insertions(+), 2799 deletions(-)
 create mode 100644 Documentation/ntb.txt
 create mode 100644 drivers/ntb/hw/Kconfig
 create mode 100644 drivers/ntb/hw/Makefile
 create mode 100644 drivers/ntb/hw/intel/Kconfig
 create mode 100644 drivers/ntb/hw/intel/Makefile
 create mode 100644 drivers/ntb/hw/intel/ntb_hw_intel.c
 create mode 100644 drivers/ntb/hw/intel/ntb_hw_intel.h
 create mode 100644 drivers/ntb/ntb.c
 delete mode 100644 drivers/ntb/ntb_hw.c
 delete mode 100644 drivers/ntb/ntb_hw.h
 delete mode 100644 drivers/ntb/ntb_regs.h
 create mode 100644 drivers/ntb/test/Kconfig
 create mode 100644 drivers/ntb/test/Makefile
 create mode 100644 drivers/ntb/test/ntb_pingpong.c
 create mode 100644 drivers/ntb/test/ntb_tool.c
 create mode 100644 include/linux/ntb_transport.h
Signature · 1 line
2.4.0.rc0.43.gcf8a8c6
#1 lore raw

PATCH 1/16 Move files in preparation for NTB Abstraction

This patch only serves the purpose to move files to their new locations, before applying the next patch adding the NTB Abstraction layer. Splitting this patch from the next is intended make distinct the which code is changed only due to moving the files, versus which are substantial code changes in adding the NTB Abstraction layer.

---
 drivers/net/ntb_netdev.c            |    2 +-
 drivers/ntb/Makefile                |    2 +-
 drivers/ntb/hw/intel/ntb_hw_intel.c | 1895 ++++++++++++++++++++++++++++++++++
 drivers/ntb/hw/intel/ntb_hw_intel.h |  385 +++++++
 drivers/ntb/ntb_hw.c                | 1896 -----------------------------------
 drivers/ntb/ntb_hw.h                |  256 -----
 drivers/ntb/ntb_regs.h              |  177 ----
 drivers/ntb/ntb_transport.c         |    2 +-
 include/linux/ntb.h                 |   88 --
 include/linux/ntb_transport.h       |   88 ++
 10 files changed, 2371 insertions(+), 2420 deletions(-)
 create mode 100644 drivers/ntb/hw/intel/ntb_hw_intel.c
 create mode 100644 drivers/ntb/hw/intel/ntb_hw_intel.h
 delete mode 100644 drivers/ntb/ntb_hw.c
 delete mode 100644 drivers/ntb/ntb_hw.h
 delete mode 100644 drivers/ntb/ntb_regs.h
 delete mode 100644 include/linux/ntb.h
 create mode 100644 include/linux/ntb_transport.h
drivers/net/ntb_netdev.c +1 -1
index 5a7e639..dcf8000 100644
@@ -49,7 +49,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"
 
drivers/ntb/Makefile +1 -1
index 15cb59f..17f0309 100644
@@ -1,3 +1,3 @@
 obj-$(CONFIG_NTB) += ntb.o
 
-ntb-objs := ntb_hw.o ntb_transport.o
+ntb-objs := hw/intel/ntb_hw_intel.o ntb_transport.o
drivers/ntb/hw/intel/ntb_hw_intel.c new file +1895 -0

1,895 lines not on this page · raw message

drivers/ntb/hw/intel/ntb_hw_intel.h new file +385 -0

385 lines not on this page · raw message

drivers/ntb/ntb_hw.c deleted +0 -1896

708 lines not on this page · raw message

drivers/ntb/ntb_hw.h deleted +0 -256

256 lines not on this page · raw message

drivers/ntb/ntb_regs.h deleted +0 -177

177 lines not on this page · raw message

drivers/ntb/ntb_transport.c +1 -1
index e9bf2f4..b9d8e19 100644

Lines of this file are not shown. View the raw message.

include/linux/ntb.h deleted +0 -88

88 lines not on this page · raw message

include/linux/ntb_transport.h new file +88 -0

88 lines not on this page · raw message

The rest of this diff is not shown. View the raw message.

Signature · 1 line
2.4.0.rc0.43.gcf8a8c6

Part of the diff is not shown here. View the raw message.

#2 lore raw

PATCH 2/16 NTB Abstraction Layer

In reply to Allen Hubbe

Abstract the ntb device behind a programming interface, so that it can support different hardware. Change the intel hardware driver to fit the abstraction.

Expose the ntb hardware api to client drivers instead of tying it to ntb_transport. Make ntb_transport a client of the ntb hardware api.

---
 Documentation/ntb.txt               |   58 +
 MAINTAINERS                         |   14 +-
 drivers/net/ntb_netdev.c            |   58 +-
 drivers/ntb/Kconfig                 |   20 +-
 drivers/ntb/Makefile                |    4 +-
 drivers/ntb/hw/Kconfig              |    1 +
 drivers/ntb/hw/Makefile             |    1 +
 drivers/ntb/hw/intel/Kconfig        |    8 +
 drivers/ntb/hw/intel/Makefile       |    1 +
 drivers/ntb/hw/intel/ntb_hw_intel.c | 3108 +++++++++++++++++++----------------
 drivers/ntb/hw/intel/ntb_hw_intel.h |  591 +++----
 drivers/ntb/ntb.c                   |  251 +++
 drivers/ntb/ntb_transport.c         |  927 ++++++-----
 include/linux/ntb.h                 |  983 +++++++++++
 include/linux/ntb_transport.h       |   25 +-
 15 files changed, 3873 insertions(+), 2177 deletions(-)
 create mode 100644 Documentation/ntb.txt
 create mode 100644 drivers/ntb/hw/Kconfig
 create mode 100644 drivers/ntb/hw/Makefile
 create mode 100644 drivers/ntb/hw/intel/Kconfig
 create mode 100644 drivers/ntb/hw/intel/Makefile
 create mode 100644 drivers/ntb/ntb.c
 create mode 100644 include/linux/ntb.h
Documentation/ntb.txt new file +58 -0
new file mode 100644
index 0000000..725ba1e
@@ -0,0 +1,58 @@
+# NTB Drivers
+
+NTB (Non-Transparent Bridge) is a type of PCI-Express bridge chip that connects
+the separate memory systems of two computers to the same PCI-Express fabric.
+Existing NTB hardware supports a common feature set, including scratchpad
+registers, doorbell registers, and memory translation windows.  Scratchpad
+registers are read-and-writable registers that are accessible from either side
+of the device, so that peers can exchange a small amount of information at a
+fixed address.  Doorbell registers provide a way for peers to send interrupt
+events.  Memory windows allow translated read and write access to the peer
+memory.
+
+## NTB Core Driver (ntb)
+
+The NTB core driver defines an api wrapping the common feature set, and allows
+clients interested in NTB features to discover NTB the devices supported by
+hardware drivers.  The term "client" is used here to mean an upper layer
+component making use of the NTB api.  The term "driver," or "hardware driver,"
+is used here to mean a driver for a specific vendor and model of NTB hardware.
+
+## NTB Client Drivers
+
+NTB client drivers should register with the NTB core driver.  After
+registering, the client probe and remove functions will be called appropriately
+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.
MAINTAINERS +13 -1
index 2e5bbc0..2560e18 100644
@@ -6943,7 +6943,7 @@ T:	git git://git.rocketboards.org/linux-socfpga-next.git
 S:	Maintained
 F:	arch/nios2/
 
-NTB DRIVER
+NTB DRIVER CORE
 M:	Jon Mason <[email protected]>
 M:	Dave Jiang <[email protected]>
 S:	Supported
@@ -6951,7 +6951,19 @@ W:	https://github.com/jonmason/ntb/wiki
 T:	git git://github.com/jonmason/ntb.git
 F:	drivers/ntb/
 F:	drivers/net/ntb_netdev.c
+F:	drivers/ntb/ntb.c
+F:	drivers/ntb/ntb_transport.c
 F:	include/linux/ntb.h
+F:	include/linux/ntb_transport.h
+
+NTB INTEL DRIVER
+M:	Jon Mason <[email protected]>
+M:	Dave Jiang <[email protected]>
+S:	Supported
+W:	https://github.com/jonmason/ntb/wiki
+T:	git git://github.com/jonmason/ntb.git
+F:	drivers/ntb/hw/intel/ntb_hw_intel.c
+F:	drivers/ntb/hw/intel/ntb_hw_intel.h
 
 NTFS FILESYSTEM
 M:	Anton Altaparmakov <[email protected]>
drivers/net/ntb_netdev.c +32 -26

153 lines not on this page · raw message

drivers/ntb/Kconfig +17 -3
index f69df793..988b03d 100644
@@ -1,7 +1,6 @@
-config NTB
-       tristate "Intel Non-Transparent Bridge support"
+menuconfig NTB
+       tristate "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
@@ -11,3 +10,18 @@ config NTB
 
         If unsure, say N.
 
+if NTB
+
+source "drivers/ntb/hw/Kconfig"
+
+config NTB_TRANSPORT
+       tristate "NTB Transport Client"
+       depends on NTB
+       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
drivers/ntb/Makefile +2 -2
index 17f0309..671c4e6 100644
@@ -1,3 +1,3 @@
+obj-y += hw/
 obj-$(CONFIG_NTB) += ntb.o
-
-ntb-objs := hw/intel/ntb_hw_intel.o ntb_transport.o
+obj-$(CONFIG_NTB_TRANSPORT) += ntb_transport.o
drivers/ntb/hw/Kconfig new file +1 -0
new file mode 100644
index 0000000..4d5535c
@@ -0,0 +1 @@
+source "drivers/ntb/hw/intel/Kconfig"
drivers/ntb/hw/Makefile new file +1 -0
new file mode 100644
index 0000000..175d7c9
@@ -0,0 +1 @@
+obj-$(CONFIG_NTB_INTEL)	+= intel/
drivers/ntb/hw/intel/Kconfig new file +8 -0
new file mode 100644
index 0000000..85de2e8
@@ -0,0 +1,8 @@
+config NTB_INTEL
+       tristate "Intel Non-Transparent Bridge support"
+       depends on NTB
+       depends on X86
+       help
+        This driver supports Intel NTB on capable Xeon and Atom hardware.
+
+        If unsure, say N.
drivers/ntb/hw/intel/Makefile new file +1 -0
new file mode 100644
index 0000000..1b43456
@@ -0,0 +1 @@
+obj-$(CONFIG_NTB_INTEL) += ntb_hw_intel.o
drivers/ntb/hw/intel/ntb_hw_intel.c +1683 -1425

2,719 lines not on this page · raw message

drivers/ntb/hw/intel/ntb_hw_intel.h +266 -325

591 lines not on this page · raw message

drivers/ntb/ntb.c new file +251 -0

251 lines not on this page · raw message

drivers/ntb/ntb_transport.c +546 -381

927 lines not on this page · raw message

include/linux/ntb.h new file +983 -0

983 lines not on this page · raw message

include/linux/ntb_transport.h +11 -14
index 9ac1a62..2862861 100644

Lines of this file are not shown. View the raw message.

The rest of this diff is not shown. View the raw message.

Signature · 1 line
2.4.0.rc0.43.gcf8a8c6

Part of the diff is not shown here. View the raw message.

#3 lore raw

Re: [PATCH 02/16] NTB Abstraction Layer

Quoted 15 lines · Allen Hubbe
 Documentation/ntb.txt               |   58 +
 MAINTAINERS                         |   14 +-
 drivers/net/ntb_netdev.c            |   58 +-
 drivers/ntb/Kconfig                 |   20 +-
 drivers/ntb/Makefile                |    4 +-
 drivers/ntb/hw/Kconfig              |    1 +
 drivers/ntb/hw/Makefile             |    1 +
 drivers/ntb/hw/intel/Kconfig        |    8 +
 drivers/ntb/hw/intel/Makefile       |    1 +
 drivers/ntb/hw/intel/ntb_hw_intel.c | 3108 +++++++++++++++++++----------------
 drivers/ntb/hw/intel/ntb_hw_intel.h |  591 +++----
 drivers/ntb/ntb.c                   |  251 +++
 drivers/ntb/ntb_transport.c         |  927 ++++++-----
 include/linux/ntb.h                 |  983 +++++++++++
 include/linux/ntb_transport.h       |   25 +-
Quoted 8 lines
 15 files changed, 3873 insertions(+), 2177 deletions(-)
 create mode 100644 Documentation/ntb.txt
 create mode 100644 drivers/ntb/hw/Kconfig
 create mode 100644 drivers/ntb/hw/Makefile
 create mode 100644 drivers/ntb/hw/intel/Kconfig
 create mode 100644 drivers/ntb/hw/intel/Makefile
 create mode 100644 drivers/ntb/ntb.c
 create mode 100644 include/linux/ntb.h

(My mailer tells me this message is over 200KB in size. Did you consider offering bribes to get people to review this patch?)

I just spotted two nits.

drivers/ntb/Kconfig config NTB · line 19

Quoted 10 lines
drivers/ntb/Kconfig +7 -0
 
+if NTB
+
+source "drivers/ntb/hw/Kconfig"
+
+config NTB_TRANSPORT
+       tristate "NTB Transport Client"
+       depends on NTB

Superfluous dependency.

Quoted 11 lines
drivers/ntb/Kconfig +8 -0
+       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

drivers/ntb/hw/intel/Kconfig line 3

Quoted 4 lines
drivers/ntb/hw/intel/Kconfig new file +3 -0
 
+config NTB_INTEL
+       tristate "Intel Non-Transparent Bridge support"
+       depends on NTB

Ditto.

drivers/ntb/hw/intel/Kconfig line 8

Quoted 5 lines
drivers/ntb/hw/intel/Kconfig new file +5 -0
+       depends on X86
+       help
+        This driver supports Intel NTB on capable Xeon and Atom hardware.
+
+        If unsure, say N.

Thanks,

Paul Bolle

#4 lore raw

RE: [PATCH 02/16] NTB Abstraction Layer

RnJvbTogUGF1bCBCb2xsZSBbbWFpbHRvOnBlYm9sbGVAdGlzY2FsaS5ubF0NCj4gT24gV2VkLCAy MDE1LTA1LTIwIGF0IDExOjQxIC0wNDAwLCBBbGxlbiBIdWJiZSB3cm90ZToNCg0KDQo+IA0KPiAo TXkgbWFpbGVyIHRlbGxzIG1lIHRoaXMgbWVzc2FnZSBpcyBvdmVyIDIwMEtCIGluIHNpemUuIERp ZCB5b3UgY29uc2lkZXINCj4gb2ZmZXJpbmcgYnJpYmVzIHRvIGdldCBwZW9wbGUgdG8gcmV2aWV3 IHRoaXMgcGF0Y2g/KQ0KDQpJIHdvdWxkIGhhdmUgbGlrZWQgdG8gc2VuZCBzbWFsbGVyIHBhdGNo ZXMsIHRvby4NCg0KSSBhdHRlbXB0ZWQgdG8gc3BsaXQgdGhpcyBvbmUgaW4gdGhyZWU6DQoxKSBh ZGQgdGhlIG50YiBjb3JlIGRyaXZlciBhbmQgaGVhZGVyIGZpbGUNCjIpIGNoYW5nZSBudGJfaHdf aW50ZWwgZHJpdmVyIHRvIHVzZSBuZXcgYXBpDQozKSBjaGFuZ2UgbnRiX3RyYW5zcG9ydCBkcml2 ZXIgdG8gdXNlIG5ldyBhcGkNCg0KVGhlIHByb2JsZW0gaXMsIGFueSBjaGFuZ2UgdG8gdGhlIG9s ZCBudGJfaHdfaW50ZWwgKHdhcyBudGIua28pLCBvciBudGJfdHJhbnNwb3J0LCBhbG9uZSB3aWxs IGNhdXNlIHRoZSBvdGhlciBub3QgdG8gd29yay4NCg0KPiANCj4gSSBqdXN0IHNwb3R0ZWQgdHdv IG5pdHMuDQo+IA0KPiA+IC0tLSBhL2RyaXZlcnMvbnRiL0tjb25maWcNCj4gPiArKysgYi9kcml2 ZXJzL250Yi9LY29uZmlnDQo+ID4NCj4gPiAraWYgTlRCDQo+ID4gKw0KPiA+ICtzb3VyY2UgImRy aXZlcnMvbnRiL2h3L0tjb25maWciDQo+ID4gKw0KPiA+ICtjb25maWcgTlRCX1RSQU5TUE9SVA0K PiA+ICsgICAgICAgdHJpc3RhdGUgIk5UQiBUcmFuc3BvcnQgQ2xpZW50Ig0KPiA+ICsgICAgICAg ZGVwZW5kcyBvbiBOVEINCj4gDQo+IFN1cGVyZmx1b3VzIGRlcGVuZGVuY3kuDQoNCkkgd2lsbCBy ZW1vdmUgZGVwZW5kcyBOVEIgZnJvbSB0aGlzLCBhbmQgb3RoZXIgdGhpbmdzIHdpdGhpbiBpZiBO VEIuDQoNCkkgd2lsbCBhbHNvIGNoYW5nZSB0aGUgbGVhZGluZyBzcGFjZXMgdG8gdGFicy4NCg0K PiANCj4gPiArICAgICAgIGhlbHANCj4gPiArICAgICAgICBUaGlzIGlzIGEgdHJhbnNwb3J0IGRy aXZlciB0aGF0IGVuYWJsZXMgY29ubmVjdGVkIHN5c3RlbXMgdG8NCj4gZXhjaGFuZ2UNCj4gPiAr ICAgICAgICBtZXNzYWdlcyBvdmVyIHRoZSBudGIgaGFyZHdhcmUuICBUaGUgdHJhbnNwb3J0IGV4 cG9zZXMgYQ0KPiBxdWV1ZSBwYWlyIGFwaQ0KPiA+ICsgICAgICAgIHRvIGNsaWVudCBkcml2ZXJz Lg0KPiA+ICsNCj4gPiArICAgICAgICBJZiB1bnN1cmUsIHNheSBOLg0KPiA+ICsNCj4gPiArZW5k aWYgIyBOVEINCj4gDQo+ID4gLS0tIC9kZXYvbnVsbA0KPiA+ICsrKyBiL2RyaXZlcnMvbnRiL2h3 L2ludGVsL0tjb25maWcNCj4gDQo+ID4gK2NvbmZpZyBOVEJfSU5URUwNCj4gPiArICAgICAgIHRy aXN0YXRlICJJbnRlbCBOb24tVHJhbnNwYXJlbnQgQnJpZGdlIHN1cHBvcnQiDQo+ID4gKyAgICAg ICBkZXBlbmRzIG9uIE5UQg0KPiANCj4gRGl0dG8uDQo+IA0KPiA+ICsgICAgICAgZGVwZW5kcyBv biBYODYNCj4gPiArICAgICAgIGhlbHANCj4gPiArICAgICAgICBUaGlzIGRyaXZlciBzdXBwb3J0 cyBJbnRlbCBOVEIgb24gY2FwYWJsZSBYZW9uIGFuZCBBdG9tDQo+IGhhcmR3YXJlLg0KPiA+ICsN Cj4gPiArICAgICAgICBJZiB1bnN1cmUsIHNheSBOLg0KPiANCj4gVGhhbmtzLA0KPiANCj4gDQo+ IFBhdWwgQm9sbGUNCg0KVGhhbmtzLA0KQWxsZW4NCg==

#5 lore raw

PATCH 3/16 ntb: Enable link training for RP mode in the driver probe

In reply to Allen Hubbe

From: Dave Jiang <[email protected]>

Link training for RP should be enabled in the driver probe. We should not have to wait for transport loaded for this to hapen. Otherwise the device will not show up on the transparent bridge side.

---
 drivers/ntb/hw/intel/ntb_hw_intel.c | 10 ++++++++++
 1 file changed, 10 insertions(+)
drivers/ntb/hw/intel/ntb_hw_intel.c +10 -0
index 05c4b77..d162f22 100644
@@ -1333,6 +1333,9 @@ static int snb_poll_link(struct intel_ntb_dev *ndev)
 
 static int snb_link_is_up(struct intel_ntb_dev *ndev)
 {
+	if (ndev->ntb.topo == NTB_TOPO_SEC)
+		return 1;
+
 	return NTB_LNK_STA_ACTIVE(ndev->lnk_sta);
 }
 
@@ -1642,6 +1645,7 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev,
 static int snb_init_ntb(struct intel_ntb_dev *ndev)
 {
 	int rc;
+	u32 ntb_ctl;
 
 	if (ndev->bar4_split)
 		ndev->mw_count = HSX_SPLIT_BAR_MW_COUNT;
@@ -1658,6 +1662,12 @@ static int snb_init_ntb(struct intel_ntb_dev *ndev)
 			dev_err(ndev_dev(ndev), "NTB Primary config disabled\n");
 			return -EINVAL;
 		}
+
+		/* enable link to allow secondary side device to appear */
+		ntb_ctl = ioread32(ndev->self_mmio + ndev->reg->ntb_ctl);
+		ntb_ctl &= ~NTB_CTL_DISABLE;
+		iowrite32(ntb_ctl, ndev->self_mmio + ndev->reg->ntb_ctl);
+
 		/* use half the spads for the peer */
 		ndev->spad_count >>= 1;
 		ndev->self_reg = &snb_pri_reg;
Signature · 1 line
2.4.0.rc0.43.gcf8a8c6
maintainer
#6 lore raw

Re: [PATCH 03/16] ntb: Enable link training for RP mode in the driver probe

Please run "git log --oneline drivers/ntb" and make your subject lines consistent. The convention I use in PCI (and what was used in NTB until recently) is

- Acronyms and initialisms are capitalized
- Subject line is a subsystem prefix ("PCI:", "NTB:", etc.) followed
by a complete sentence starting with a capitalized verb, with no period at the end

Quoted 4 lines · Allen Hubbe

From: Dave Jiang <[email protected]>

Link training for RP should be enabled in the driver probe. We should not have to wait for transport loaded for this to hapen. Otherwise the

s/hapen/happen/

Quoted 49 lines

device will not show up on the transparent bridge side.

---
 drivers/ntb/hw/intel/ntb_hw_intel.c | 10 ++++++++++
 1 file changed, 10 insertions(+)
drivers/ntb/hw/intel/ntb_hw_intel.c +10 -1
index 05c4b77..d162f22 100644
@@ -1333,6 +1333,9 @@ static int snb_poll_link(struct intel_ntb_dev *ndev)
 
 static int snb_link_is_up(struct intel_ntb_dev *ndev)
 {
+       if (ndev->ntb.topo == NTB_TOPO_SEC)
+               return 1;
+
        return NTB_LNK_STA_ACTIVE(ndev->lnk_sta);
 }
 
@@ -1642,6 +1645,7 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev,
 static int snb_init_ntb(struct intel_ntb_dev *ndev)
 {
        int rc;
+       u32 ntb_ctl;
 
        if (ndev->bar4_split)
                ndev->mw_count = HSX_SPLIT_BAR_MW_COUNT;
@@ -1658,6 +1662,12 @@ static int snb_init_ntb(struct intel_ntb_dev *ndev)
                        dev_err(ndev_dev(ndev), "NTB Primary config disabled\n");
                        return -EINVAL;
                }
+
+               /* enable link to allow secondary side device to appear */
+               ntb_ctl = ioread32(ndev->self_mmio + ndev->reg->ntb_ctl);
+               ntb_ctl &= ~NTB_CTL_DISABLE;
+               iowrite32(ntb_ctl, ndev->self_mmio + ndev->reg->ntb_ctl);
+
                /* use half the spads for the peer */
                ndev->spad_count >>= 1;
                ndev->self_reg = &snb_pri_reg;
--

2.4.0.rc0.43.gcf8a8c6

--
To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html

#7 lore raw

RE: [PATCH 03/16] ntb: Enable link training for RP mode in the driver probe

RnJvbTogQmpvcm4gSGVsZ2FhcyBbbWFpbHRvOmJoZWxnYWFzQGdvb2dsZS5jb21dDQo+IFBsZWFz ZSBydW4gImdpdCBsb2cgLS1vbmVsaW5lIGRyaXZlcnMvbnRiIiBhbmQgbWFrZSB5b3VyIHN1Ympl Y3QgbGluZXMNCj4gY29uc2lzdGVudC4gIFRoZSBjb252ZW50aW9uIEkgdXNlIGluIFBDSSAoYW5k IHdoYXQgd2FzIHVzZWQgaW4gTlRCDQo+IHVudGlsIHJlY2VudGx5KSBpcw0KPiANCj4gICAtIEFj cm9ueW1zIGFuZCBpbml0aWFsaXNtcyBhcmUgY2FwaXRhbGl6ZWQNCj4gICAtIFN1YmplY3QgbGlu ZSBpcyBhIHN1YnN5c3RlbSBwcmVmaXggKCJQQ0k6IiwgIk5UQjoiLCBldGMuKSBmb2xsb3dlZA0K PiBieSBhIGNvbXBsZXRlIHNlbnRlbmNlIHN0YXJ0aW5nIHdpdGggYSBjYXBpdGFsaXplZCB2ZXJi LCB3aXRoIG5vDQo+IHBlcmlvZCBhdCB0aGUgZW5kDQoNClRoZXNlIGFyZSB0aGUgbmV3IHN1Ympl Y3QgbGluZXMgdGhhdCB3aWxsIGJlIGluIHRoZSB2MiBvZiB0aGlzIHNldC4NCg0KTlRCOiBGaXgg c21hbGwgY29kZSBmb3JtYXQgaXNzdWVzIGluIHRyYW5zcG9ydA0KTlRCOiBEZWZhdWx0IHRvIENQ VSBtZW1jcHkgZm9yIHBlcmZvcm1hbmNlDQpOVEI6IEltcHJvdmUgcGVyZm9ybWFuY2Ugd2l0aCB3 cml0ZSBjb21iaW5pbmcNCk5UQjogVXNlIE5VTUEgYXdhcmUgbWVtb3J5IGFsbG9jYXRpb24NCk5U QjogVXNlIE5VTUEgbWVtb3J5IGFuZCBETUEgY2hhbiBpbiB0cmFuc3BvcnQNCk5UQjogUmVzZXQg dHJhbnNwb3J0IFFQIGxpbmsgc3RhdHMgb24gZG93bg0KTlRCOiBEbyBub3QgYWR2YW5jZSB0cmFu c3BvcnQgUlggb24gbGluayBkb3duDQpOVEI6IERpZmZlcmVudGlhdGUgdHJhbnNwb3J0IGxpbmsg ZG93biBtZXNzYWdlcw0KTlRCOiBSYXRlIGxpbWl0IG50Yl9xcF9saW5rX3dvcmsNCk5UQjogQWRk IHRvb2wgY2xpZW50DQpOVEI6IEFkZCBwaW5nIHBvbmcgY2xpZW50DQpOVEI6IEludGVsIE5UQiBw YXJhbXMgZm9yIFNOQiBCMkIgYWRkcmVzc2VzDQpOVEI6IENoZWNrIHRoZSBESUQgZm9yIHdvcmth cm91bmQgZXJyb3IgZmxhZ3MNCk5UQjogRW5hYmxlIGxpbmsgdHJhaW5pbmcgZm9yIFJQIG1vZGUg aW4gcHJvYmUNCk5UQjogQWRkIE5UQiBoYXJkd2FyZSBhYnN0cmFjdGlvbiBsYXllcg0KTlRCOiBN b3ZlIGZpbGVzIGluIHByZXBhcmF0aW9uIGZvciBOVEIgYWJzdHJhY3Rpb24NCg0KPiANCj4gT24g V2VkLCBNYXkgMjAsIDIwMTUgYXQgMTA6NDEgQU0sIEFsbGVuIEh1YmJlIDxBbGxlbi5IdWJiZUBl bWMuY29tPg0KPiB3cm90ZToNCj4gPiBGcm9tOiBEYXZlIEppYW5nIDxkYXZlLmppYW5nQGludGVs LmNvbT4NCj4gPg0KPiA+IExpbmsgdHJhaW5pbmcgZm9yIFJQIHNob3VsZCBiZSBlbmFibGVkIGlu IHRoZSBkcml2ZXIgcHJvYmUuIFdlIHNob3VsZA0KPiA+IG5vdCBoYXZlIHRvIHdhaXQgZm9yIHRy YW5zcG9ydCBsb2FkZWQgZm9yIHRoaXMgdG8gaGFwZW4uIE90aGVyd2lzZSB0aGUNCj4gDQo+IHMv aGFwZW4vaGFwcGVuLw0KPiANCj4gPiBkZXZpY2Ugd2lsbCBub3Qgc2hvdyB1cCBvbiB0aGUgdHJh bnNwYXJlbnQgYnJpZGdlIHNpZGUuDQo+ID4NCj4gPiBTaWduZWQtb2ZmLWJ5OiBEYXZlIEppYW5n IDxkYXZlLmppYW5nQGludGVsLmNvbT4NCj4gPiAtLS0NCj4gPiAgZHJpdmVycy9udGIvaHcvaW50 ZWwvbnRiX2h3X2ludGVsLmMgfCAxMCArKysrKysrKysrDQo+ID4gIDEgZmlsZSBjaGFuZ2VkLCAx MCBpbnNlcnRpb25zKCspDQo+ID4NCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9udGIvaHcvaW50 ZWwvbnRiX2h3X2ludGVsLmMNCj4gYi9kcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdfaW50ZWwu Yw0KPiA+IGluZGV4IDA1YzRiNzcuLmQxNjJmMjIgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy9u dGIvaHcvaW50ZWwvbnRiX2h3X2ludGVsLmMNCj4gPiArKysgYi9kcml2ZXJzL250Yi9ody9pbnRl bC9udGJfaHdfaW50ZWwuYw0KPiA+IEBAIC0xMzMzLDYgKzEzMzMsOSBAQCBzdGF0aWMgaW50IHNu Yl9wb2xsX2xpbmsoc3RydWN0IGludGVsX250Yl9kZXYNCj4gKm5kZXYpDQo+ID4NCj4gPiAgc3Rh dGljIGludCBzbmJfbGlua19pc191cChzdHJ1Y3QgaW50ZWxfbnRiX2RldiAqbmRldikNCj4gPiAg ew0KPiA+ICsgICAgICAgaWYgKG5kZXYtPm50Yi50b3BvID09IE5UQl9UT1BPX1NFQykNCj4gPiAr ICAgICAgICAgICAgICAgcmV0dXJuIDE7DQo+ID4gKw0KPiA+ICAgICAgICAgcmV0dXJuIE5UQl9M TktfU1RBX0FDVElWRShuZGV2LT5sbmtfc3RhKTsNCj4gPiAgfQ0KPiA+DQo+ID4gQEAgLTE2NDIs NiArMTY0NSw3IEBAIHN0YXRpYyBpbnQgc25iX3NldHVwX2IyYl9tdyhzdHJ1Y3QgaW50ZWxfbnRi X2Rldg0KPiAqbmRldiwNCj4gPiAgc3RhdGljIGludCBzbmJfaW5pdF9udGIoc3RydWN0IGludGVs X250Yl9kZXYgKm5kZXYpDQo+ID4gIHsNCj4gPiAgICAgICAgIGludCByYzsNCj4gPiArICAgICAg IHUzMiBudGJfY3RsOw0KPiA+DQo+ID4gICAgICAgICBpZiAobmRldi0+YmFyNF9zcGxpdCkNCj4g PiAgICAgICAgICAgICAgICAgbmRldi0+bXdfY291bnQgPSBIU1hfU1BMSVRfQkFSX01XX0NPVU5U Ow0KPiA+IEBAIC0xNjU4LDYgKzE2NjIsMTIgQEAgc3RhdGljIGludCBzbmJfaW5pdF9udGIoc3Ry dWN0IGludGVsX250Yl9kZXYNCj4gKm5kZXYpDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAg ZGV2X2VycihuZGV2X2RldihuZGV2KSwgIk5UQiBQcmltYXJ5IGNvbmZpZw0KPiBkaXNhYmxlZFxu Iik7DQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7DQo+ID4gICAg ICAgICAgICAgICAgIH0NCj4gPiArDQo+ID4gKyAgICAgICAgICAgICAgIC8qIGVuYWJsZSBsaW5r IHRvIGFsbG93IHNlY29uZGFyeSBzaWRlIGRldmljZSB0bw0KPiBhcHBlYXIgKi8NCj4gPiArICAg ICAgICAgICAgICAgbnRiX2N0bCA9IGlvcmVhZDMyKG5kZXYtPnNlbGZfbW1pbyArIG5kZXYtPnJl Zy0NCj4gPm50Yl9jdGwpOw0KPiA+ICsgICAgICAgICAgICAgICBudGJfY3RsICY9IH5OVEJfQ1RM X0RJU0FCTEU7DQo+ID4gKyAgICAgICAgICAgICAgIGlvd3JpdGUzMihudGJfY3RsLCBuZGV2LT5z ZWxmX21taW8gKyBuZGV2LT5yZWctDQo+ID5udGJfY3RsKTsNCj4gPiArDQo+ID4gICAgICAgICAg ICAgICAgIC8qIHVzZSBoYWxmIHRoZSBzcGFkcyBmb3IgdGhlIHBlZXIgKi8NCj4gPiAgICAgICAg ICAgICAgICAgbmRldi0+c3BhZF9jb3VudCA+Pj0gMTsNCj4gPiAgICAgICAgICAgICAgICAgbmRl di0+c2VsZl9yZWcgPSAmc25iX3ByaV9yZWc7DQo+ID4gLS0NCj4gPiAyLjQuMC5yYzAuNDMuZ2Nm OGE4YzYNCj4gPg0KPiA+IC0tDQo+ID4gVG8gdW5zdWJzY3JpYmUgZnJvbSB0aGlzIGxpc3Q6IHNl bmQgdGhlIGxpbmUgInVuc3Vic2NyaWJlIGxpbnV4LXBjaSINCj4gaW4NCj4gPiB0aGUgYm9keSBv ZiBhIG1lc3NhZ2UgdG8gbWFqb3Jkb21vQHZnZXIua2VybmVsLm9yZw0KPiA+IE1vcmUgbWFqb3Jk b21vIGluZm8gYXQgIGh0dHA6Ly92Z2VyLmtlcm5lbC5vcmcvbWFqb3Jkb21vLWluZm8uaHRtbA0K

maintainer
#8 lore raw

Re: [PATCH 03/16] ntb: Enable link training for RP mode in the driver probe

Quoted 11 lines · Allen

From: Bjorn Helgaas [mailto:[email protected]]

Quoted 8 lines

Please run "git log --oneline drivers/ntb" and make your subject lines consistent. The convention I use in PCI (and what was used in NTB until recently) is

- Acronyms and initialisms are capitalized
- Subject line is a subsystem prefix ("PCI:", "NTB:", etc.) followed
by a complete sentence starting with a capitalized verb, with no period at the end

These are the new subject lines that will be in the v2 of this set.

That helps a lot, thanks.

Quoted 11 lines

NTB: Fix small code format issues in transport
NTB: Default to CPU memcpy for performance
NTB: Improve performance with write combining
NTB: Use NUMA aware memory allocation
NTB: Use NUMA memory and DMA chan in transport
NTB: Reset transport QP link stats on down
NTB: Do not advance transport RX on link down
NTB: Differentiate transport link down messages
NTB: Rate limit ntb_qp_link_work
NTB: Add tool client
NTB: Add ping pong client

I think these are test cases, not part of the kernel itself. It'd be nice to know that from the summary. I don't know what the precedent is for that (if there is one).

Quoted 1 line

NTB: Intel NTB params for SNB B2B addresses

This sentence no verb :) Not sure what you're doing with those params.

Quoted 1 line

NTB: Check the DID for workaround error flags

I think there's room to spell out "device ID".

Quoted 1 line

NTB: Enable link training for RP mode in probe

Is that Root Port?

Quoted 2 lines

NTB: Add NTB hardware abstraction layer
NTB: Move files in preparation for NTB abstraction

Of course, none of this has anything to do with the patches themselves, which I don't intend to review because they're out of my area :)

Quoted 68 lines
Quoted 68 lines
Quoted 4 lines · Allen Hubbe

From: Dave Jiang <[email protected]>

Link training for RP should be enabled in the driver probe. We should not have to wait for transport loaded for this to hapen. Otherwise the

s/hapen/happen/

Review

Quoted 8 lines

device will not show up on the transparent bridge side.

---
 drivers/ntb/hw/intel/ntb_hw_intel.c | 10 ++++++++++
 1 file changed, 10 insertions(+)
(quoted diff) +0 -0

b/drivers/ntb/hw/intel/ntb_hw_intel.c

drivers/ntb/hw/intel/ntb_hw_intel.c static int snb_poll_link(struct intel_ntb_dev

Quoted 4 lines

index 05c4b77..d162f22 100644

drivers/ntb/hw/intel/ntb_hw_intel.c +0 -0
@@ -1333,6 +1333,9 @@ static int snb_poll_link(struct intel_ntb_dev

*ndev)

drivers/ntb/hw/intel/ntb_hw_intel.c static int snb_setup_b2b_mw(struct intel_ntb_dev

Quoted 10 lines
drivers/ntb/hw/intel/ntb_hw_intel.c +3 -0
 static int snb_link_is_up(struct intel_ntb_dev *ndev)
 {
+       if (ndev->ntb.topo == NTB_TOPO_SEC)
+               return 1;
+
        return NTB_LNK_STA_ACTIVE(ndev->lnk_sta);
 }
 
@@ -1642,6 +1645,7 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev

*ndev,

drivers/ntb/hw/intel/ntb_hw_intel.c static int snb_init_ntb(struct intel_ntb_dev

Quoted 8 lines
drivers/ntb/hw/intel/ntb_hw_intel.c +1 -0
 static int snb_init_ntb(struct intel_ntb_dev *ndev)
 {
        int rc;
+       u32 ntb_ctl;
 
        if (ndev->bar4_split)
                ndev->mw_count = HSX_SPLIT_BAR_MW_COUNT;
@@ -1658,6 +1662,12 @@ static int snb_init_ntb(struct intel_ntb_dev

*ndev)

drivers/ntb/hw/intel/ntb_hw_intel.c static int snb_init_ntb(struct intel_ntb_dev · line 1662

Quoted 1 line
drivers/ntb/hw/intel/ntb_hw_intel.c +0 -0
                        dev_err(ndev_dev(ndev), "NTB Primary config

disabled\n");

drivers/ntb/hw/intel/ntb_hw_intel.c static int snb_init_ntb(struct intel_ntb_dev *ndev)

Quoted 4 lines
drivers/ntb/hw/intel/ntb_hw_intel.c +2 -0
                        return -EINVAL;
                }
+
+               /* enable link to allow secondary side device to

appear */

Quoted 9 lines
drivers/ntb/hw/intel/ntb_hw_intel.c +4 -0
+               ntb_ctl = ioread32(ndev->self_mmio + ndev->reg-
 ntb_ctl);
+               ntb_ctl &= ~NTB_CTL_DISABLE;
+               iowrite32(ntb_ctl, ndev->self_mmio + ndev->reg-
 ntb_ctl);
+
                /* use half the spads for the peer */
                ndev->spad_count >>= 1;
                ndev->self_reg = &snb_pri_reg;
Quoted 5 lines

--
2.4.0.rc0.43.gcf8a8c6

--
To unsubscribe from this list: send the line "unsubscribe linux-pci"

in

Quoted 2 lines

the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html

#9 lore raw

RE: [PATCH 03/16] ntb: Enable link training for RP mode in the driver probe

RnJvbTogQmpvcm4gSGVsZ2FhcyBbbWFpbHRvOmJoZWxnYWFzQGdvb2dsZS5jb21dDQo+IE9uIFdl ZCwgTWF5IDIwLCAyMDE1IGF0IDQ6NDYgUE0sIEh1YmJlLCBBbGxlbiA8QWxsZW4uSHViYmVAZW1j LmNvbT4NCj4gd3JvdGU6DQo+ID4gRnJvbTogQmpvcm4gSGVsZ2FhcyBbbWFpbHRvOmJoZWxnYWFz QGdvb2dsZS5jb21dDQo+ID4+IFBsZWFzZSBydW4gImdpdCBsb2cgLS1vbmVsaW5lIGRyaXZlcnMv bnRiIiBhbmQgbWFrZSB5b3VyIHN1YmplY3QNCj4gbGluZXMNCj4gPj4gY29uc2lzdGVudC4gIFRo ZSBjb252ZW50aW9uIEkgdXNlIGluIFBDSSAoYW5kIHdoYXQgd2FzIHVzZWQgaW4gTlRCDQo+ID4+ IHVudGlsIHJlY2VudGx5KSBpcw0KPiA+Pg0KPiA+PiAgIC0gQWNyb255bXMgYW5kIGluaXRpYWxp c21zIGFyZSBjYXBpdGFsaXplZA0KPiA+PiAgIC0gU3ViamVjdCBsaW5lIGlzIGEgc3Vic3lzdGVt IHByZWZpeCAoIlBDSToiLCAiTlRCOiIsIGV0Yy4pDQo+IGZvbGxvd2VkDQo+ID4+IGJ5IGEgY29t cGxldGUgc2VudGVuY2Ugc3RhcnRpbmcgd2l0aCBhIGNhcGl0YWxpemVkIHZlcmIsIHdpdGggbm8N Cj4gPj4gcGVyaW9kIGF0IHRoZSBlbmQNCj4gPg0KPiA+IFRoZXNlIGFyZSB0aGUgbmV3IHN1Ympl Y3QgbGluZXMgdGhhdCB3aWxsIGJlIGluIHRoZSB2MiBvZiB0aGlzIHNldC4NCj4gDQo+IFRoYXQg aGVscHMgYSBsb3QsIHRoYW5rcy4NCj4gDQo+ID4gTlRCOiBGaXggc21hbGwgY29kZSBmb3JtYXQg aXNzdWVzIGluIHRyYW5zcG9ydA0KPiA+IE5UQjogRGVmYXVsdCB0byBDUFUgbWVtY3B5IGZvciBw ZXJmb3JtYW5jZQ0KPiA+IE5UQjogSW1wcm92ZSBwZXJmb3JtYW5jZSB3aXRoIHdyaXRlIGNvbWJp bmluZw0KPiA+IE5UQjogVXNlIE5VTUEgYXdhcmUgbWVtb3J5IGFsbG9jYXRpb24NCj4gPiBOVEI6 IFVzZSBOVU1BIG1lbW9yeSBhbmQgRE1BIGNoYW4gaW4gdHJhbnNwb3J0DQo+ID4gTlRCOiBSZXNl dCB0cmFuc3BvcnQgUVAgbGluayBzdGF0cyBvbiBkb3duDQo+ID4gTlRCOiBEbyBub3QgYWR2YW5j ZSB0cmFuc3BvcnQgUlggb24gbGluayBkb3duDQo+ID4gTlRCOiBEaWZmZXJlbnRpYXRlIHRyYW5z cG9ydCBsaW5rIGRvd24gbWVzc2FnZXMNCj4gPiBOVEI6IFJhdGUgbGltaXQgbnRiX3FwX2xpbmtf d29yaw0KPiA+IE5UQjogQWRkIHRvb2wgY2xpZW50DQo+ID4gTlRCOiBBZGQgcGluZyBwb25nIGNs aWVudA0KPiANCj4gSSB0aGluayB0aGVzZSBhcmUgdGVzdCBjYXNlcywgbm90IHBhcnQgb2YgdGhl IGtlcm5lbCBpdHNlbGYuICBJdCdkIGJlDQo+IG5pY2UgdG8ga25vdyB0aGF0IGZyb20gdGhlIHN1 bW1hcnkuICBJIGRvbid0IGtub3cgd2hhdCB0aGUgcHJlY2VkZW50DQo+IGlzIGZvciB0aGF0IChp ZiB0aGVyZSBpcyBvbmUpLg0KDQpXb3VsZCB5b3UgY29uc2lkZXIgdGhpcyBhcyBwcmVjZWRlbnQ6 DQoNCjRhNzc2ZjAgZG1hdGVzdDogU2ltcGxlIERNQSBtZW1jcHkgdGVzdCBjbGllbnQNCg0KPiAN Cj4gPiBOVEI6IEludGVsIE5UQiBwYXJhbXMgZm9yIFNOQiBCMkIgYWRkcmVzc2VzDQo+IA0KPiBU aGlzIHNlbnRlbmNlIG5vIHZlcmIgOikgIE5vdCBzdXJlIHdoYXQgeW91J3JlIGRvaW5nIHdpdGgg dGhvc2UgcGFyYW1zLg0KDQpOVEI6IEFkZCBwYXJhbWV0ZXJzIGZvciBJbnRlbCBTTkIgQjJCIGFk ZHJlc3Nlcw0KDQo+IA0KPiA+IE5UQjogQ2hlY2sgdGhlIERJRCBmb3Igd29ya2Fyb3VuZCBlcnJv ciBmbGFncw0KPiANCj4gSSB0aGluayB0aGVyZSdzIHJvb20gdG8gc3BlbGwgb3V0ICJkZXZpY2Ug SUQiLg0KDQpOVEI6IENoZWNrIHRoZSBkZXZpY2UgSUQgdG8gc2V0IGVycmF0YSBmbGFncw0KDQpB bHNvLCBhZGQgdGhpcyBwcm9zZSBkZXNjcmlwdGlvbiB0byB0aGlzIGNvbW1pdDoNCg0KU2V0IGVy cmF0YSBmbGFncyBmb3IgdGhlIHNwZWNpZmljIGRldmljZSBJRHMgdG8gd2hpY2ggdGhleSBhcHBs eSwNCmluc3RlYWQgb2YgdGhlIHdob2xlIHhlb24gaGFyZHdhcmUgY2xhc3MuDQoNCj4gDQo+ID4g TlRCOiBFbmFibGUgbGluayB0cmFpbmluZyBmb3IgUlAgbW9kZSBpbiBwcm9iZQ0KPiANCj4gSXMg dGhhdCBSb290IFBvcnQ/DQoNCnllcw0KDQo+IA0KPiA+IE5UQjogQWRkIE5UQiBoYXJkd2FyZSBh YnN0cmFjdGlvbiBsYXllcg0KPiA+IE5UQjogTW92ZSBmaWxlcyBpbiBwcmVwYXJhdGlvbiBmb3Ig TlRCIGFic3RyYWN0aW9uDQo+IA0KPiBPZiBjb3Vyc2UsIG5vbmUgb2YgdGhpcyBoYXMgYW55dGhp bmcgdG8gZG8gd2l0aCB0aGUgcGF0Y2hlcw0KPiB0aGVtc2VsdmVzLCB3aGljaCBJIGRvbid0IGlu dGVuZCB0byByZXZpZXcgYmVjYXVzZSB0aGV5J3JlIG91dCBvZiBteQ0KPiBhcmVhIDopDQo+IA0K DQpJIGFwcHJlY2lhdGUgeW91ciBjb21tZW50cyA6KQ0KDQo+ID4+DQo+ID4+IE9uIFdlZCwgTWF5 IDIwLCAyMDE1IGF0IDEwOjQxIEFNLCBBbGxlbiBIdWJiZSA8QWxsZW4uSHViYmVAZW1jLmNvbT4N Cj4gPj4gd3JvdGU6DQo+ID4+ID4gRnJvbTogRGF2ZSBKaWFuZyA8ZGF2ZS5qaWFuZ0BpbnRlbC5j b20+DQo+ID4+ID4NCj4gPj4gPiBMaW5rIHRyYWluaW5nIGZvciBSUCBzaG91bGQgYmUgZW5hYmxl ZCBpbiB0aGUgZHJpdmVyIHByb2JlLiBXZQ0KPiBzaG91bGQNCj4gPj4gPiBub3QgaGF2ZSB0byB3 YWl0IGZvciB0cmFuc3BvcnQgbG9hZGVkIGZvciB0aGlzIHRvIGhhcGVuLiBPdGhlcndpc2UNCj4g dGhlDQo+ID4+DQo+ID4+IHMvaGFwZW4vaGFwcGVuLw0KPiA+Pg0KPiA+PiA+IGRldmljZSB3aWxs IG5vdCBzaG93IHVwIG9uIHRoZSB0cmFuc3BhcmVudCBicmlkZ2Ugc2lkZS4NCj4gPj4gPg0KPiA+ PiA+IFNpZ25lZC1vZmYtYnk6IERhdmUgSmlhbmcgPGRhdmUuamlhbmdAaW50ZWwuY29tPg0KPiA+ PiA+IC0tLQ0KPiA+PiA+ICBkcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdfaW50ZWwuYyB8IDEw ICsrKysrKysrKysNCj4gPj4gPiAgMSBmaWxlIGNoYW5nZWQsIDEwIGluc2VydGlvbnMoKykNCj4g Pj4gPg0KPiA+PiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdfaW50 ZWwuYw0KPiA+PiBiL2RyaXZlcnMvbnRiL2h3L2ludGVsL250Yl9od19pbnRlbC5jDQo+ID4+ID4g aW5kZXggMDVjNGI3Ny4uZDE2MmYyMiAxMDA2NDQNCj4gPj4gPiAtLS0gYS9kcml2ZXJzL250Yi9o dy9pbnRlbC9udGJfaHdfaW50ZWwuYw0KPiA+PiA+ICsrKyBiL2RyaXZlcnMvbnRiL2h3L2ludGVs L250Yl9od19pbnRlbC5jDQo+ID4+ID4gQEAgLTEzMzMsNiArMTMzMyw5IEBAIHN0YXRpYyBpbnQg c25iX3BvbGxfbGluayhzdHJ1Y3QgaW50ZWxfbnRiX2Rldg0KPiA+PiAqbmRldikNCj4gPj4gPg0K PiA+PiA+ICBzdGF0aWMgaW50IHNuYl9saW5rX2lzX3VwKHN0cnVjdCBpbnRlbF9udGJfZGV2ICpu ZGV2KQ0KPiA+PiA+ICB7DQo+ID4+ID4gKyAgICAgICBpZiAobmRldi0+bnRiLnRvcG8gPT0gTlRC X1RPUE9fU0VDKQ0KPiA+PiA+ICsgICAgICAgICAgICAgICByZXR1cm4gMTsNCj4gPj4gPiArDQo+ ID4+ID4gICAgICAgICByZXR1cm4gTlRCX0xOS19TVEFfQUNUSVZFKG5kZXYtPmxua19zdGEpOw0K PiA+PiA+ICB9DQo+ID4+ID4NCj4gPj4gPiBAQCAtMTY0Miw2ICsxNjQ1LDcgQEAgc3RhdGljIGlu dCBzbmJfc2V0dXBfYjJiX213KHN0cnVjdA0KPiBpbnRlbF9udGJfZGV2DQo+ID4+ICpuZGV2LA0K PiA+PiA+ICBzdGF0aWMgaW50IHNuYl9pbml0X250YihzdHJ1Y3QgaW50ZWxfbnRiX2RldiAqbmRl dikNCj4gPj4gPiAgew0KPiA+PiA+ICAgICAgICAgaW50IHJjOw0KPiA+PiA+ICsgICAgICAgdTMy IG50Yl9jdGw7DQo+ID4+ID4NCj4gPj4gPiAgICAgICAgIGlmIChuZGV2LT5iYXI0X3NwbGl0KQ0K PiA+PiA+ICAgICAgICAgICAgICAgICBuZGV2LT5td19jb3VudCA9IEhTWF9TUExJVF9CQVJfTVdf Q09VTlQ7DQo+ID4+ID4gQEAgLTE2NTgsNiArMTY2MiwxMiBAQCBzdGF0aWMgaW50IHNuYl9pbml0 X250YihzdHJ1Y3QgaW50ZWxfbnRiX2Rldg0KPiA+PiAqbmRldikNCj4gPj4gPiAgICAgICAgICAg ICAgICAgICAgICAgICBkZXZfZXJyKG5kZXZfZGV2KG5kZXYpLCAiTlRCIFByaW1hcnkgY29uZmln DQo+ID4+IGRpc2FibGVkXG4iKTsNCj4gPj4gPiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1 cm4gLUVJTlZBTDsNCj4gPj4gPiAgICAgICAgICAgICAgICAgfQ0KPiA+PiA+ICsNCj4gPj4gPiAr ICAgICAgICAgICAgICAgLyogZW5hYmxlIGxpbmsgdG8gYWxsb3cgc2Vjb25kYXJ5IHNpZGUgZGV2 aWNlIHRvDQo+ID4+IGFwcGVhciAqLw0KPiA+PiA+ICsgICAgICAgICAgICAgICBudGJfY3RsID0g aW9yZWFkMzIobmRldi0+c2VsZl9tbWlvICsgbmRldi0+cmVnLQ0KPiA+PiA+bnRiX2N0bCk7DQo+ ID4+ID4gKyAgICAgICAgICAgICAgIG50Yl9jdGwgJj0gfk5UQl9DVExfRElTQUJMRTsNCj4gPj4g PiArICAgICAgICAgICAgICAgaW93cml0ZTMyKG50Yl9jdGwsIG5kZXYtPnNlbGZfbW1pbyArIG5k ZXYtPnJlZy0NCj4gPj4gPm50Yl9jdGwpOw0KPiA+PiA+ICsNCj4gPj4gPiAgICAgICAgICAgICAg ICAgLyogdXNlIGhhbGYgdGhlIHNwYWRzIGZvciB0aGUgcGVlciAqLw0KPiA+PiA+ICAgICAgICAg ICAgICAgICBuZGV2LT5zcGFkX2NvdW50ID4+PSAxOw0KPiA+PiA+ICAgICAgICAgICAgICAgICBu ZGV2LT5zZWxmX3JlZyA9ICZzbmJfcHJpX3JlZzsNCj4gPj4gPiAtLQ0KPiA+PiA+IDIuNC4wLnJj MC40My5nY2Y4YThjNg0KPiA+PiA+DQo+ID4+ID4gLS0NCj4gPj4gPiBUbyB1bnN1YnNjcmliZSBm cm9tIHRoaXMgbGlzdDogc2VuZCB0aGUgbGluZSAidW5zdWJzY3JpYmUgbGludXgtDQo+IHBjaSIN Cj4gPj4gaW4NCj4gPj4gPiB0aGUgYm9keSBvZiBhIG1lc3NhZ2UgdG8gbWFqb3Jkb21vQHZnZXIu a2VybmVsLm9yZw0KPiA+PiA+IE1vcmUgbWFqb3Jkb21vIGluZm8gYXQgIGh0dHA6Ly92Z2VyLmtl cm5lbC5vcmcvbWFqb3Jkb21vLWluZm8uaHRtbA0KPiANCj4gLS0NCj4gWW91IHJlY2VpdmVkIHRo aXMgbWVzc2FnZSBiZWNhdXNlIHlvdSBhcmUgc3Vic2NyaWJlZCB0byB0aGUgR29vZ2xlDQo+IEdy b3VwcyAibGludXgtbnRiIiBncm91cC4NCj4gVG8gdW5zdWJzY3JpYmUgZnJvbSB0aGlzIGdyb3Vw IGFuZCBzdG9wIHJlY2VpdmluZyBlbWFpbHMgZnJvbSBpdCwgc2VuZA0KPiBhbiBlbWFpbCB0byBs aW51eC1udGIrdW5zdWJzY3JpYmVAZ29vZ2xlZ3JvdXBzLmNvbS4NCj4gVG8gcG9zdCB0byB0aGlz IGdyb3VwLCBzZW5kIGVtYWlsIHRvIGxpbnV4LW50YkBnb29nbGVncm91cHMuY29tLg0KPiBUbyB2 aWV3IHRoaXMgZGlzY3Vzc2lvbiBvbiB0aGUgd2ViIHZpc2l0DQo+IGh0dHBzOi8vZ3JvdXBzLmdv b2dsZS5jb20vZC9tc2dpZC9saW51eC0NCj4gbnRiL0NBRXJTcG81V3pRODZ0NUYycGZoSFlpcGNV SDNoMnZ2MUROMS0NCj4gRHB4X1ZQc09uYnB1JTNEdyU0MG1haWwuZ21haWwuY29tLg0KPiBGb3Ig bW9yZSBvcHRpb25zLCB2aXNpdCBodHRwczovL2dyb3Vwcy5nb29nbGUuY29tL2Qvb3B0b3V0Lg0K

maintainer
#10 lore raw

Re: [PATCH 03/16] ntb: Enable link training for RP mode in the driver probe

Quoted 59 lines · Allen

From: Bjorn Helgaas [mailto:[email protected]]

Quoted 30 lines
Quoted 2 lines · Allen

From: Bjorn Helgaas [mailto:[email protected]]

Quoted 1 line

Please run "git log --oneline drivers/ntb" and make your subject

lines

Quoted 5 lines
Quoted 5 lines

consistent. The convention I use in PCI (and what was used in NTB until recently) is

- Acronyms and initialisms are capitalized
- Subject line is a subsystem prefix ("PCI:", "NTB:", etc.)

followed

Quoted 4 lines
Quoted 2 lines

by a complete sentence starting with a capitalized verb, with no period at the end

These are the new subject lines that will be in the v2 of this set.

That helps a lot, thanks.

Quoted 11 lines

NTB: Fix small code format issues in transport
NTB: Default to CPU memcpy for performance
NTB: Improve performance with write combining
NTB: Use NUMA aware memory allocation
NTB: Use NUMA memory and DMA chan in transport
NTB: Reset transport QP link stats on down
NTB: Do not advance transport RX on link down
NTB: Differentiate transport link down messages
NTB: Rate limit ntb_qp_link_work
NTB: Add tool client
NTB: Add ping pong client

Quoted 3 lines

I think these are test cases, not part of the kernel itself. It'd be nice to know that from the summary. I don't know what the precedent is for that (if there is one).

Would you consider this as precedent:

4a776f0 dmatest: Simple DMA memcpy test client

Quoted 4 lines
Quoted 2 lines

NTB: Intel NTB params for SNB B2B addresses

This sentence no verb :) Not sure what you're doing with those params.

NTB: Add parameters for Intel SNB B2B addresses

Quoted 4 lines
Quoted 2 lines

NTB: Check the DID for workaround error flags

I think there's room to spell out "device ID".

NTB: Check the device ID to set errata flags

Also, add this prose description to this commit:

Set errata flags for the specific device IDs to which they apply, instead of the whole xeon hardware class.

Quoted 1 line
Quoted 9 lines
Quoted 3 lines
Quoted 1 line

NTB: Enable link training for RP mode in probe

Is that Root Port?

yes

Quoted 3 lines
Quoted 3 lines

NTB: Add NTB hardware abstraction layer
NTB: Move files in preparation for NTB abstraction

All looks good to me!

#11 lore raw

RE: [PATCH 03/16] ntb: Enable link training for RP mode in the driver probe

RnJvbTogbGludXgtcGNpLW93bmVyQHZnZXIua2VybmVsLm9yZyBbbWFpbHRvOmxpbnV4LXBjaS1v d25lckB2Z2VyLmtlcm5lbC5vcmddIE9uIEJlaGFsZiBPZiBCam9ybiBIZWxnYWFzDQo+IE9uIFdl ZCwgTWF5IDIwLCAyMDE1IGF0IDY6MDAgUE0sIEh1YmJlLCBBbGxlbiA8QWxsZW4uSHViYmVAZW1j LmNvbT4NCj4gd3JvdGU6DQo+ID4gRnJvbTogQmpvcm4gSGVsZ2FhcyBbbWFpbHRvOmJoZWxnYWFz QGdvb2dsZS5jb21dDQo+ID4+IE9uIFdlZCwgTWF5IDIwLCAyMDE1IGF0IDQ6NDYgUE0sIEh1YmJl LCBBbGxlbiA8QWxsZW4uSHViYmVAZW1jLmNvbT4NCj4gPj4gd3JvdGU6DQo+ID4+ID4gRnJvbTog Qmpvcm4gSGVsZ2FhcyBbbWFpbHRvOmJoZWxnYWFzQGdvb2dsZS5jb21dDQo+ID4+ID4+IFBsZWFz ZSBydW4gImdpdCBsb2cgLS1vbmVsaW5lIGRyaXZlcnMvbnRiIiBhbmQgbWFrZSB5b3VyIHN1Ympl Y3QNCj4gPj4gbGluZXMNCj4gPj4gPj4gY29uc2lzdGVudC4gIFRoZSBjb252ZW50aW9uIEkgdXNl IGluIFBDSSAoYW5kIHdoYXQgd2FzIHVzZWQgaW4gTlRCDQo+ID4+ID4+IHVudGlsIHJlY2VudGx5 KSBpcw0KPiA+PiA+Pg0KPiA+PiA+PiAgIC0gQWNyb255bXMgYW5kIGluaXRpYWxpc21zIGFyZSBj YXBpdGFsaXplZA0KPiA+PiA+PiAgIC0gU3ViamVjdCBsaW5lIGlzIGEgc3Vic3lzdGVtIHByZWZp eCAoIlBDSToiLCAiTlRCOiIsIGV0Yy4pDQo+ID4+IGZvbGxvd2VkDQo+ID4+ID4+IGJ5IGEgY29t cGxldGUgc2VudGVuY2Ugc3RhcnRpbmcgd2l0aCBhIGNhcGl0YWxpemVkIHZlcmIsIHdpdGggbm8N Cj4gPj4gPj4gcGVyaW9kIGF0IHRoZSBlbmQNCj4gPj4gPg0KPiA+PiA+IFRoZXNlIGFyZSB0aGUg bmV3IHN1YmplY3QgbGluZXMgdGhhdCB3aWxsIGJlIGluIHRoZSB2MiBvZiB0aGlzIHNldC4NCj4g Pj4NCj4gPj4gVGhhdCBoZWxwcyBhIGxvdCwgdGhhbmtzLg0KPiA+Pg0KPiA+PiA+IE5UQjogRml4 IHNtYWxsIGNvZGUgZm9ybWF0IGlzc3VlcyBpbiB0cmFuc3BvcnQNCj4gPj4gPiBOVEI6IERlZmF1 bHQgdG8gQ1BVIG1lbWNweSBmb3IgcGVyZm9ybWFuY2UNCj4gPj4gPiBOVEI6IEltcHJvdmUgcGVy Zm9ybWFuY2Ugd2l0aCB3cml0ZSBjb21iaW5pbmcNCj4gPj4gPiBOVEI6IFVzZSBOVU1BIGF3YXJl IG1lbW9yeSBhbGxvY2F0aW9uDQo+ID4+ID4gTlRCOiBVc2UgTlVNQSBtZW1vcnkgYW5kIERNQSBj aGFuIGluIHRyYW5zcG9ydA0KPiA+PiA+IE5UQjogUmVzZXQgdHJhbnNwb3J0IFFQIGxpbmsgc3Rh dHMgb24gZG93bg0KPiA+PiA+IE5UQjogRG8gbm90IGFkdmFuY2UgdHJhbnNwb3J0IFJYIG9uIGxp bmsgZG93bg0KPiA+PiA+IE5UQjogRGlmZmVyZW50aWF0ZSB0cmFuc3BvcnQgbGluayBkb3duIG1l c3NhZ2VzDQo+ID4+ID4gTlRCOiBSYXRlIGxpbWl0IG50Yl9xcF9saW5rX3dvcmsNCj4gPj4gPiBO VEI6IEFkZCB0b29sIGNsaWVudA0KPiA+PiA+IE5UQjogQWRkIHBpbmcgcG9uZyBjbGllbnQNCj4g Pj4NCj4gPj4gSSB0aGluayB0aGVzZSBhcmUgdGVzdCBjYXNlcywgbm90IHBhcnQgb2YgdGhlIGtl cm5lbCBpdHNlbGYuICBJdCdkIGJlDQo+ID4+IG5pY2UgdG8ga25vdyB0aGF0IGZyb20gdGhlIHN1 bW1hcnkuICBJIGRvbid0IGtub3cgd2hhdCB0aGUgcHJlY2VkZW50DQo+ID4+IGlzIGZvciB0aGF0 IChpZiB0aGVyZSBpcyBvbmUpLg0KPiA+DQo+ID4gV291bGQgeW91IGNvbnNpZGVyIHRoaXMgYXMg cHJlY2VkZW50Og0KPiA+DQo+ID4gNGE3NzZmMCBkbWF0ZXN0OiBTaW1wbGUgRE1BIG1lbWNweSB0 ZXN0IGNsaWVudA0KPiA+DQo+ID4+DQo+ID4+ID4gTlRCOiBJbnRlbCBOVEIgcGFyYW1zIGZvciBT TkIgQjJCIGFkZHJlc3Nlcw0KPiA+Pg0KPiA+PiBUaGlzIHNlbnRlbmNlIG5vIHZlcmIgOikgIE5v dCBzdXJlIHdoYXQgeW91J3JlIGRvaW5nIHdpdGggdGhvc2UNCj4gcGFyYW1zLg0KPiA+DQo+ID4g TlRCOiBBZGQgcGFyYW1ldGVycyBmb3IgSW50ZWwgU05CIEIyQiBhZGRyZXNzZXMNCj4gPg0KPiA+ Pg0KPiA+PiA+IE5UQjogQ2hlY2sgdGhlIERJRCBmb3Igd29ya2Fyb3VuZCBlcnJvciBmbGFncw0K PiA+Pg0KPiA+PiBJIHRoaW5rIHRoZXJlJ3Mgcm9vbSB0byBzcGVsbCBvdXQgImRldmljZSBJRCIu DQo+ID4NCj4gPiBOVEI6IENoZWNrIHRoZSBkZXZpY2UgSUQgdG8gc2V0IGVycmF0YSBmbGFncw0K PiA+DQo+ID4gQWxzbywgYWRkIHRoaXMgcHJvc2UgZGVzY3JpcHRpb24gdG8gdGhpcyBjb21taXQ6 DQo+ID4NCj4gPiBTZXQgZXJyYXRhIGZsYWdzIGZvciB0aGUgc3BlY2lmaWMgZGV2aWNlIElEcyB0 byB3aGljaCB0aGV5IGFwcGx5LA0KPiA+IGluc3RlYWQgb2YgdGhlIHdob2xlIHhlb24gaGFyZHdh cmUgY2xhc3MuDQo+ID4NCj4gPj4NCj4gPj4gPiBOVEI6IEVuYWJsZSBsaW5rIHRyYWluaW5nIGZv ciBSUCBtb2RlIGluIHByb2JlDQo+ID4+DQo+ID4+IElzIHRoYXQgUm9vdCBQb3J0Pw0KPiA+DQo+ ID4geWVzDQo+ID4NCj4gPj4NCj4gPj4gPiBOVEI6IEFkZCBOVEIgaGFyZHdhcmUgYWJzdHJhY3Rp b24gbGF5ZXINCj4gPj4gPiBOVEI6IE1vdmUgZmlsZXMgaW4gcHJlcGFyYXRpb24gZm9yIE5UQiBh YnN0cmFjdGlvbg0KPiANCj4gQWxsIGxvb2tzIGdvb2QgdG8gbWUhDQoNClRoYW5rcyENCg==

#12 lore raw

PATCH 4/16 Check the DID for certain workaround error flags to be set.

In reply to Allen Hubbe

From: Dave Jiang <[email protected]>

---
 drivers/ntb/hw/intel/ntb_hw_intel.c | 196 +++++++++++++++++++-----------------
 drivers/ntb/hw/intel/ntb_hw_intel.h |  24 ++++-
 drivers/ntb/ntb_transport.c         |  16 +--
 3 files changed, 133 insertions(+), 103 deletions(-)
drivers/ntb/hw/intel/ntb_hw_intel.c +105 -91
index d162f22..89fea50 100644
@@ -503,7 +503,6 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,
 	size_t buf_size;
 	ssize_t ret, off;
 	union { u64 v64; u32 v32; u16 v16; } u;
-	unsigned long reg;
 
 	ndev = filp->private_data;
 	mmio = ndev->self_mmio;
@@ -538,10 +537,10 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,
 
 	if (!ndev->reg->link_is_up(ndev)) {
 		off += scnprintf(buf + off, buf_size - off,
-				 "Link Satus -\t\tDown\n");
+				 "Link Status -\t\tDown\n");
 	} else {
 		off += scnprintf(buf + off, buf_size - off,
-				 "Link Satus -\t\tUp\n");
+				 "Link Status -\t\tUp\n");
 		off += scnprintf(buf + off, buf_size - off,
 				 "Link Speed -\t\tPCI-E Gen %u\n",
 				 NTB_LNK_STA_SPEED(ndev->lnk_sta));
@@ -568,36 +567,30 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,
 	off += scnprintf(buf + off, buf_size - off,
 			 "Doorbell Mask Cached -\t%#llx\n", ndev->db_mask);
 
-	reg = ndev->self_reg->db_mask;
-	u.v64 = ndev_db_read(ndev, mmio + reg);
+	u.v64 = ndev_db_read(ndev, mmio + ndev->self_reg->db_mask);
 	off += scnprintf(buf + off, buf_size - off,
 			 "Doorbell Mask -\t\t%#llx\n", u.v64);
 
-	reg = ndev->self_reg->db_bell;
-	u.v64 = ndev_db_read(ndev, mmio + reg);
+	u.v64 = ndev_db_read(ndev, mmio + ndev->self_reg->db_bell);
 	off += scnprintf(buf + off, buf_size - off,
 			 "Doorbell Bell -\t\t%#llx\n", u.v64);
 
 	off += scnprintf(buf + off, buf_size - off,
 			 "\nNTB Incoming XLAT:\n");
 
-	reg = bar2_off(ndev->xlat_reg->bar2_xlat, 2);
-	u.v64 = ioread64(mmio + reg);
+	u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_xlat, 2));
 	off += scnprintf(buf + off, buf_size - off,
 			 "XLAT23 -\t\t%#018llx\n", u.v64);
 
-	reg = bar2_off(ndev->xlat_reg->bar2_xlat, 4);
-	u.v64 = ioread64(mmio + reg);
+	u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_xlat, 4));
 	off += scnprintf(buf + off, buf_size - off,
 			 "XLAT45 -\t\t%#018llx\n", u.v64);
 
-	reg = bar2_off(ndev->xlat_reg->bar2_limit, 2);
-	u.v64 = ioread64(mmio + reg);
+	u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_limit, 2));
 	off += scnprintf(buf + off, buf_size - off,
 			 "LMT23 -\t\t\t%#018llx\n", u.v64);
 
-	reg = bar2_off(ndev->xlat_reg->bar2_limit, 4);
-	u.v64 = ioread64(mmio + reg);
+	u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_limit, 4));
 	off += scnprintf(buf + off, buf_size - off,
 			 "LMT45 -\t\t\t%#018llx\n", u.v64);
 
@@ -606,41 +599,34 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,
 			off += scnprintf(buf + off, buf_size - off,
 					 "\nNTB Outgoing B2B XLAT:\n");
 
-			reg = bar2_off(SNB_PBAR2XLAT_OFFSET, 2);
-			u.v64 = ioread64(mmio + reg);
+			u.v64 = ioread64(mmio + SNB_PBAR23XLAT_OFFSET);
 			off += scnprintf(buf + off, buf_size - off,
 					 "B2B XLAT23 -\t\t%#018llx\n", u.v64);
 
-			reg = bar2_off(SNB_PBAR2XLAT_OFFSET, 4);
-			u.v64 = ioread64(mmio + reg);
+			u.v64 = ioread64(mmio + SNB_PBAR45XLAT_OFFSET);
 			off += scnprintf(buf + off, buf_size - off,
 					 "B2B XLAT45 -\t\t%#018llx\n", u.v64);
 
-			reg = bar2_off(SNB_PBAR2LMT_OFFSET, 2);
-			u.v64 = ioread64(mmio + reg);
+			u.v64 = ioread64(mmio + SNB_PBAR23LMT_OFFSET);
 			off += scnprintf(buf + off, buf_size - off,
 					 "B2B LMT23 -\t\t%#018llx\n", u.v64);
 
-			reg = bar2_off(SNB_PBAR2LMT_OFFSET, 4);
-			u.v64 = ioread64(mmio + reg);
+			u.v64 = ioread64(mmio + SNB_PBAR45LMT_OFFSET);
 			off += scnprintf(buf + off, buf_size - off,
 					 "B2B LMT45 -\t\t%#018llx\n", u.v64);
 
 			off += scnprintf(buf + off, buf_size - off,
 					 "\nNTB Secondary BAR:\n");
 
-			reg = bar0_off(SNB_SBAR0BASE_OFFSET, 0);
-			u.v64 = ioread64(mmio + reg);
+			u.v64 = ioread64(mmio + SNB_SBAR0BASE_OFFSET);
 			off += scnprintf(buf + off, buf_size - off,
 					 "SBAR01 -\t\t%#018llx\n", u.v64);
 
-			reg = bar0_off(SNB_SBAR0BASE_OFFSET, 2);
-			u.v64 = ioread64(mmio + reg);
+			u.v64 = ioread64(mmio + SNB_SBAR23BASE_OFFSET);
 			off += scnprintf(buf + off, buf_size - off,
 					 "SBAR23 -\t\t%#018llx\n", u.v64);
 
-			reg = bar0_off(SNB_SBAR0BASE_OFFSET, 4);
-			u.v64 = ioread64(mmio + reg);
+			u.v64 = ioread64(mmio + SNB_SBAR45BASE_OFFSET);
 			off += scnprintf(buf + off, buf_size - off,
 					 "SBAR45 -\t\t%#018llx\n", u.v64);
 		}
@@ -648,31 +634,30 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,
 		off += scnprintf(buf + off, buf_size - off,
 				 "\nSNB NTB Statistics:\n");
 
-		reg = SNB_USMEMMISS_OFFSET;
-		u.v16 = ioread16(mmio + reg);
+		u.v16 = ioread16(mmio + SNB_USMEMMISS_OFFSET);
 		off += scnprintf(buf + off, buf_size - off,
 				 "Upstream Memory Miss -\t%u\n", u.v16);
 
 		off += scnprintf(buf + off, buf_size - off,
 				 "\nSNB NTB Hardware Errors:\n");
 
-		reg = SNB_DEVSTS_OFFSET;
-		if (!pci_read_config_word(ndev->ntb.pdev, reg, &u.v16))
+		if (!pci_read_config_word(ndev->ntb.pdev,
+					  SNB_DEVSTS_OFFSET, &u.v16))
 			off += scnprintf(buf + off, buf_size - off,
 					 "DEVSTS -\t\t%#06x\n", u.v16);
 
-		reg = SNB_LINK_STATUS_OFFSET;
-		if (!pci_read_config_word(ndev->ntb.pdev, reg, &u.v16))
+		if (!pci_read_config_word(ndev->ntb.pdev,
+					  SNB_LINK_STATUS_OFFSET, &u.v16))
 			off += scnprintf(buf + off, buf_size - off,
 					 "LNKSTS -\t\t%#06x\n", u.v16);
 
-		reg = SNB_UNCERRSTS_OFFSET;
-		if (!pci_read_config_dword(ndev->ntb.pdev, reg, &u.v32))
+		if (!pci_read_config_dword(ndev->ntb.pdev,
+					   SNB_UNCERRSTS_OFFSET, &u.v32))
 			off += scnprintf(buf + off, buf_size - off,
 					 "UNCERRSTS -\t\t%#06x\n", u.v32);
 
-		reg = SNB_CORERRSTS_OFFSET;
-		if (!pci_read_config_dword(ndev->ntb.pdev, reg, &u.v32))
+		if (!pci_read_config_dword(ndev->ntb.pdev,
+					   SNB_CORERRSTS_OFFSET, &u.v32))
 			off += scnprintf(buf + off, buf_size - off,
 					 "CORERRSTS -\t\t%#06x\n", u.v32);
 	}
@@ -1388,7 +1373,6 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev,
 {
 	struct pci_dev *pdev;
 	void __iomem *mmio;
-	unsigned long off;
 	resource_size_t bar_size;
 	phys_addr_t bar_addr;
 	int b2b_bar;
@@ -1484,9 +1468,6 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev,
 		dev_dbg(ndev_dev(ndev), "SBAR5SZ %#x\n", bar_sz);
 	}
 
-	/* setup incoming bar base addresses */
-	off = SNB_SBAR0BASE_OFFSET;
-
 	/* SBAR01 hit by first part of the b2b bar */
 	if (b2b_bar == 0) {
 		bar_addr = addr->bar0_addr;
@@ -1504,7 +1485,7 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev,
 	}
 
 	dev_dbg(ndev_dev(ndev), "SBAR01 %#018llx\n", bar_addr);
-	iowrite64(bar_addr, mmio + bar0_off(off, 0));
+	iowrite64(bar_addr, mmio + SNB_SBAR0BASE_OFFSET);
 
 	/* Other SBAR are normally hit by the PBAR xlat, except for b2b bar.
 	 * The b2b bar is either disabled above, or configured half-size, and
@@ -1512,102 +1493,96 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev,
 	 */
 
 	bar_addr = addr->bar2_addr64 + (b2b_bar == 2 ? ndev->b2b_off : 0);
-	iowrite64(bar_addr, mmio + bar0_off(off, 2));
-	bar_addr = ioread64(mmio + bar0_off(off, 2));
+	iowrite64(bar_addr, mmio + SNB_SBAR23BASE_OFFSET);
+	bar_addr = ioread64(mmio + SNB_SBAR23BASE_OFFSET);
 	dev_dbg(ndev_dev(ndev), "SBAR23 %#018llx\n", bar_addr);
 
 	if (!ndev->bar4_split) {
 		bar_addr = addr->bar4_addr64 +
 			(b2b_bar == 4 ? ndev->b2b_off : 0);
-		iowrite64(bar_addr, mmio + bar0_off(off, 4));
-		bar_addr = ioread64(mmio + bar0_off(off, 4));
+		iowrite64(bar_addr, mmio + SNB_SBAR45BASE_OFFSET);
+		bar_addr = ioread64(mmio + SNB_SBAR45BASE_OFFSET);
 		dev_dbg(ndev_dev(ndev), "SBAR45 %#018llx\n", bar_addr);
 	} else {
 		bar_addr = addr->bar4_addr32 +
 			(b2b_bar == 4 ? ndev->b2b_off : 0);
-		iowrite32(bar_addr, mmio + bar0_off(off, 4));
-		bar_addr = ioread32(mmio + bar0_off(off, 4));
+		iowrite32(bar_addr, mmio + SNB_SBAR4BASE_OFFSET);
+		bar_addr = ioread32(mmio + SNB_SBAR4BASE_OFFSET);
 		dev_dbg(ndev_dev(ndev), "SBAR4 %#010llx\n", bar_addr);
 
 		bar_addr = addr->bar5_addr32 +
 			(b2b_bar == 5 ? ndev->b2b_off : 0);
-		iowrite32(bar_addr, mmio + bar0_off(off, 5));
-		bar_addr = ioread32(mmio + bar0_off(off, 5));
+		iowrite32(bar_addr, mmio + SNB_SBAR5BASE_OFFSET);
+		bar_addr = ioread32(mmio + SNB_SBAR5BASE_OFFSET);
 		dev_dbg(ndev_dev(ndev), "SBAR5 %#010llx\n", bar_addr);
 	}
 
 	/* setup incoming bar limits == base addrs (zero length windows) */
-	off = SNB_SBAR2LMT_OFFSET;
 
 	bar_addr = addr->bar2_addr64 + (b2b_bar == 2 ? ndev->b2b_off : 0);
-	iowrite64(bar_addr, mmio + bar2_off(off, 2));
-	bar_addr = ioread64(mmio + bar2_off(off, 2));
+	iowrite64(bar_addr, mmio + SNB_SBAR23LMT_OFFSET);
+	bar_addr = ioread64(mmio + SNB_SBAR23LMT_OFFSET);
 	dev_dbg(ndev_dev(ndev), "SBAR23LMT %#018llx\n", bar_addr);
 
 	if (!ndev->bar4_split) {
 		bar_addr = addr->bar4_addr64 +
 			(b2b_bar == 4 ? ndev->b2b_off : 0);
-		iowrite64(bar_addr, mmio + bar2_off(off, 4));
-		bar_addr = ioread64(mmio + bar2_off(off, 4));
+		iowrite64(bar_addr, mmio + SNB_SBAR45LMT_OFFSET);
+		bar_addr = ioread64(mmio + SNB_SBAR45LMT_OFFSET);
 		dev_dbg(ndev_dev(ndev), "SBAR45LMT %#018llx\n", bar_addr);
 	} else {
 		bar_addr = addr->bar4_addr32 +
 			(b2b_bar == 4 ? ndev->b2b_off : 0);
-		iowrite32(bar_addr, mmio + bar2_off(off, 4));
-		bar_addr = ioread32(mmio + bar2_off(off, 4));
+		iowrite32(bar_addr, mmio + SNB_SBAR4LMT_OFFSET);
+		bar_addr = ioread32(mmio + SNB_SBAR4LMT_OFFSET);
 		dev_dbg(ndev_dev(ndev), "SBAR4LMT %#010llx\n", bar_addr);
 
 		bar_addr = addr->bar5_addr32 +
 			(b2b_bar == 5 ? ndev->b2b_off : 0);
-		iowrite32(bar_addr, mmio + bar2_off(off, 5));
-		bar_addr = ioread32(mmio + bar2_off(off, 5));
+		iowrite32(bar_addr, mmio + SNB_SBAR5LMT_OFFSET);
+		bar_addr = ioread32(mmio + SNB_SBAR5LMT_OFFSET);
 		dev_dbg(ndev_dev(ndev), "SBAR5LMT %#05llx\n", bar_addr);
 	}
 
 	/* zero incoming translation addrs */
-	off = SNB_SBAR2XLAT_OFFSET;
-
-	iowrite64(0, mmio + bar2_off(off, 2));
+	iowrite64(0, mmio + SNB_SBAR23XLAT_OFFSET);
 
 	if (!ndev->bar4_split) {
-		iowrite64(0, mmio + bar2_off(off, 4));
+		iowrite64(0, mmio + SNB_SBAR45XLAT_OFFSET);
 	} else {
-		iowrite32(0, mmio + bar2_off(off, 4));
-		iowrite32(0, mmio + bar2_off(off, 5));
+		iowrite32(0, mmio + SNB_SBAR4XLAT_OFFSET);
+		iowrite32(0, mmio + SNB_SBAR5XLAT_OFFSET);
 	}
 
 	/* zero outgoing translation limits (whole bar size windows) */
-	off = SNB_PBAR2LMT_OFFSET;
-	iowrite64(0, mmio + bar2_off(off, 2));
+	iowrite64(0, mmio + SNB_PBAR23LMT_OFFSET);
 	if (!ndev->bar4_split) {
-		iowrite64(0, mmio + bar2_off(off, 4));
+		iowrite64(0, mmio + SNB_PBAR45LMT_OFFSET);
 	} else {
-		iowrite32(0, mmio + bar2_off(off, 4));
-		iowrite32(0, mmio + bar2_off(off, 5));
+		iowrite32(0, mmio + SNB_PBAR4LMT_OFFSET);
+		iowrite32(0, mmio + SNB_PBAR5LMT_OFFSET);
 	}
 
 	/* set outgoing translation offsets */
-	off = SNB_PBAR2XLAT_OFFSET;
-
 	bar_addr = peer_addr->bar2_addr64;
-	iowrite64(bar_addr, mmio + bar2_off(off, 2));
-	bar_addr = ioread64(mmio + bar2_off(off, 2));
+	iowrite64(bar_addr, mmio + SNB_PBAR23XLAT_OFFSET);
+	bar_addr = ioread64(mmio + SNB_PBAR23XLAT_OFFSET);
 	dev_dbg(ndev_dev(ndev), "PBAR23XLAT %#018llx\n", bar_addr);
 
 	if (!ndev->bar4_split) {
 		bar_addr = peer_addr->bar4_addr64;
-		iowrite64(bar_addr, mmio + bar2_off(off, 4));
-		bar_addr = ioread64(mmio + bar2_off(off, 4));
+		iowrite64(bar_addr, mmio + SNB_PBAR45XLAT_OFFSET);
+		bar_addr = ioread64(mmio + SNB_PBAR45XLAT_OFFSET);
 		dev_dbg(ndev_dev(ndev), "PBAR45XLAT %#018llx\n", bar_addr);
 	} else {
 		bar_addr = peer_addr->bar2_addr64;
-		iowrite32(bar_addr, mmio + bar2_off(off, 4));
-		bar_addr = ioread32(mmio + bar2_off(off, 4));
+		iowrite32(bar_addr, mmio + SNB_PBAR4XLAT_OFFSET);
+		bar_addr = ioread32(mmio + SNB_PBAR4XLAT_OFFSET);
 		dev_dbg(ndev_dev(ndev), "PBAR4XLAT %#010llx\n", bar_addr);
 
 		bar_addr = peer_addr->bar2_addr64;
-		iowrite32(bar_addr, mmio + bar2_off(off, 5));
-		bar_addr = ioread32(mmio + bar2_off(off, 5));
+		iowrite32(bar_addr, mmio + SNB_PBAR5XLAT_OFFSET);
+		bar_addr = ioread32(mmio + SNB_PBAR5XLAT_OFFSET);
 		dev_dbg(ndev_dev(ndev), "PBAR5XLAT %#010llx\n", bar_addr);
 	}
 
@@ -1747,29 +1722,68 @@ static int snb_init_dev(struct intel_ntb_dev *ndev)
 	u8 ppd;
 	int rc, mem;
 
+	pdev = ndev_pdev(ndev);
+
+	switch (pdev->device) {
 	/* There is a Xeon hardware errata related to writes to SDOORBELL or
 	 * B2BDOORBELL in conjunction with inbound access to NTB MMIO Space,
 	 * which may hang the system.  To workaround this use the second memory
 	 * window to access the interrupt and scratch pad registers on the
 	 * remote system.
 	 */
-	ndev->hwerr_flags |= NTB_HWERR_SDOORBELL_LOCKUP;
+	case PCI_DEVICE_ID_INTEL_NTB_SS_JSF:
+	case PCI_DEVICE_ID_INTEL_NTB_PS_JSF:
+	case PCI_DEVICE_ID_INTEL_NTB_B2B_JSF:
+	case PCI_DEVICE_ID_INTEL_NTB_SS_SNB:
+	case PCI_DEVICE_ID_INTEL_NTB_PS_SNB:
+	case PCI_DEVICE_ID_INTEL_NTB_B2B_SNB:
+	case PCI_DEVICE_ID_INTEL_NTB_SS_IVT:
+	case PCI_DEVICE_ID_INTEL_NTB_PS_IVT:
+	case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT:
+	case PCI_DEVICE_ID_INTEL_NTB_SS_HSX:
+	case PCI_DEVICE_ID_INTEL_NTB_PS_HSX:
+	case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX:
+		ndev->hwerr_flags |= NTB_HWERR_SDOORBELL_LOCKUP;
+		break;
+	}
 
+	switch (pdev->device) {
 	/* There is a hardware errata related to accessing any register in
 	 * SB01BASE in the presence of bidirectional traffic crossing the NTB.
 	 */
-	ndev->hwerr_flags |= NTB_HWERR_SB01BASE_LOCKUP;
+	case PCI_DEVICE_ID_INTEL_NTB_SS_IVT:
+	case PCI_DEVICE_ID_INTEL_NTB_PS_IVT:
+	case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT:
+	case PCI_DEVICE_ID_INTEL_NTB_SS_HSX:
+	case PCI_DEVICE_ID_INTEL_NTB_PS_HSX:
+	case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX:
+		ndev->hwerr_flags |= NTB_HWERR_SB01BASE_LOCKUP;
+		break;
+	}
 
+	switch (pdev->device) {
 	/* HW Errata on bit 14 of b2bdoorbell register.  Writes will not be
 	 * mirrored to the remote system.  Shrink the number of bits by one,
 	 * since bit 14 is the last bit.
 	 */
-	ndev->hwerr_flags |= NTB_HWERR_B2BDOORBELL_BIT14;
+	case PCI_DEVICE_ID_INTEL_NTB_SS_JSF:
+	case PCI_DEVICE_ID_INTEL_NTB_PS_JSF:
+	case PCI_DEVICE_ID_INTEL_NTB_B2B_JSF:
+	case PCI_DEVICE_ID_INTEL_NTB_SS_SNB:
+	case PCI_DEVICE_ID_INTEL_NTB_PS_SNB:
+	case PCI_DEVICE_ID_INTEL_NTB_B2B_SNB:
+	case PCI_DEVICE_ID_INTEL_NTB_SS_IVT:
+	case PCI_DEVICE_ID_INTEL_NTB_PS_IVT:
+	case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT:
+	case PCI_DEVICE_ID_INTEL_NTB_SS_HSX:
+	case PCI_DEVICE_ID_INTEL_NTB_PS_HSX:
+	case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX:
+		ndev->hwerr_flags |= NTB_HWERR_B2BDOORBELL_BIT14;
+		break;
+	}
 
 	ndev->reg = &snb_reg;
 
-	pdev = ndev_pdev(ndev);
-
 	rc = pci_read_config_byte(pdev, SNB_PPD_OFFSET, &ppd);
 	if (rc)
 		return -EIO;
@@ -2062,14 +2076,14 @@ static const struct intel_ntb_xlat_reg snb_pri_xlat = {
 	 * window by setting the limit equal to base, nor can it limit the size
 	 * of the memory window by setting the limit to base + size.
 	 */
-	.bar2_limit		= SNB_PBAR2LMT_OFFSET,
-	.bar2_xlat		= SNB_PBAR2XLAT_OFFSET,
+	.bar2_limit		= SNB_PBAR23LMT_OFFSET,
+	.bar2_xlat		= SNB_PBAR23XLAT_OFFSET,
 };
 
 static const struct intel_ntb_xlat_reg snb_sec_xlat = {
 	.bar0_base		= SNB_SBAR0BASE_OFFSET,
-	.bar2_limit		= SNB_SBAR2LMT_OFFSET,
-	.bar2_xlat		= SNB_SBAR2XLAT_OFFSET,
+	.bar2_limit		= SNB_SBAR23LMT_OFFSET,
+	.bar2_xlat		= SNB_SBAR23XLAT_OFFSET,
 };
 
 static const struct intel_b2b_addr snb_b2b_usd_addr = {
drivers/ntb/hw/intel/ntb_hw_intel.h +20 -4
index 0224b1a..fec689d 100644
@@ -70,11 +70,27 @@
 
 /* SNB hardware (and JSF, IVT, HSX) */
 
-#define SNB_PBAR2LMT_OFFSET		0x0000
-#define SNB_PBAR2XLAT_OFFSET		0x0010
-#define SNB_SBAR2LMT_OFFSET		0x0020
-#define SNB_SBAR2XLAT_OFFSET		0x0030
+#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
drivers/ntb/ntb_transport.c +8 -8
index f1ed1b7..bb2eb85 100644
@@ -204,8 +204,8 @@ struct ntb_transport_ctx {
 
 	bool link_is_up;
 	struct delayed_work link_work;
-	struct work_struct db_work;
 	struct work_struct link_cleanup;
+	struct tasklet_struct db_work;
 };
 
 enum {
@@ -241,7 +241,7 @@ enum {
 #define NTB_QP_DEF_NUM_ENTRIES	100
 #define NTB_LINK_DOWN_TIMEOUT	10
 
-static void ntb_transport_doorbell_work(struct work_struct *ws);
+static void ntb_transport_doorbell_work(unsigned long data);
 static const struct ntb_ctx_ops ntb_transport_ops;
 static struct ntb_client ntb_transport_client;
 
@@ -1002,8 +1002,9 @@ static int ntb_transport_probe(struct ntb_client *self, struct ntb_dev *ndev)
 	}
 
 	INIT_DELAYED_WORK(&nt->link_work, ntb_transport_link_work);
-	INIT_WORK(&nt->db_work, ntb_transport_doorbell_work);
 	INIT_WORK(&nt->link_cleanup, ntb_transport_link_cleanup_work);
+	tasklet_init(&nt->db_work, ntb_transport_doorbell_work,
+		     (unsigned long)nt);
 
 	rc = ntb_set_ctx(ndev, nt, &ntb_transport_ops);
 	if (rc)
@@ -1044,7 +1045,7 @@ static void ntb_transport_free(struct ntb_client *self, struct ntb_dev *ndev)
 	int i;
 
 	ntb_transport_link_cleanup(nt);
-	cancel_work_sync(&nt->db_work);
+	tasklet_disable(&nt->db_work);
 	cancel_work_sync(&nt->link_cleanup);
 	cancel_delayed_work_sync(&nt->link_work);
 
@@ -1850,10 +1851,9 @@ unsigned int ntb_transport_max_size(struct ntb_transport_qp *qp)
 }
 EXPORT_SYMBOL_GPL(ntb_transport_max_size);
 
-static void ntb_transport_doorbell_work(struct work_struct *work)
+static void ntb_transport_doorbell_work(unsigned long data)
 {
-	struct ntb_transport_ctx *nt = container_of(work,
-			struct ntb_transport_ctx, db_work);
+	struct ntb_transport_ctx *nt = (void *)data;
 	struct ntb_transport_qp *qp;
 	u64 db_mask, db_bits, db_again;
 	unsigned int qp_num;
@@ -1890,7 +1890,7 @@ static void ntb_transport_doorbell_callback(void *data, int vector)
 
 	ntb_db_set_mask(nt->ndev, ntb_db_valid_mask(nt->ndev));
 
-	schedule_work(&nt->db_work);
+	tasklet_schedule(&nt->db_work);
 }
 
 static const struct ntb_ctx_ops ntb_transport_ops = {
Signature · 1 line
2.4.0.rc0.43.gcf8a8c6
maintainer
#13 lore raw

Re: [PATCH 04/16] Check the DID for certain workaround error flags to be set.

Quoted 3 lines · Allen Hubbe

From: Dave Jiang <[email protected]>

Needs a topic in the subject line and a changelog.

It also seems to do a lot more than just checking device ID (I assume that's what "DID" means), so this should probably be split into several patches that each do one thing. I see at least:

- cosmetic code restructuring
- work_struct/tasklet_struct changes
- new #defines and bar2_off() changes

Quoted 527 lines
---
 drivers/ntb/hw/intel/ntb_hw_intel.c | 196 +++++++++++++++++++-----------------
 drivers/ntb/hw/intel/ntb_hw_intel.h |  24 ++++-
 drivers/ntb/ntb_transport.c         |  16 +--
 3 files changed, 133 insertions(+), 103 deletions(-)
drivers/ntb/hw/intel/ntb_hw_intel.c +105 -91
index d162f22..89fea50 100644
@@ -503,7 +503,6 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,
        size_t buf_size;
        ssize_t ret, off;
        union { u64 v64; u32 v32; u16 v16; } u;
-       unsigned long reg;
 
        ndev = filp->private_data;
        mmio = ndev->self_mmio;
@@ -538,10 +537,10 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,
 
        if (!ndev->reg->link_is_up(ndev)) {
                off += scnprintf(buf + off, buf_size - off,
-                                "Link Satus -\t\tDown\n");
+                                "Link Status -\t\tDown\n");
        } else {
                off += scnprintf(buf + off, buf_size - off,
-                                "Link Satus -\t\tUp\n");
+                                "Link Status -\t\tUp\n");
                off += scnprintf(buf + off, buf_size - off,
                                 "Link Speed -\t\tPCI-E Gen %u\n",
                                 NTB_LNK_STA_SPEED(ndev->lnk_sta));
@@ -568,36 +567,30 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,
        off += scnprintf(buf + off, buf_size - off,
                         "Doorbell Mask Cached -\t%#llx\n", ndev->db_mask);
 
-       reg = ndev->self_reg->db_mask;
-       u.v64 = ndev_db_read(ndev, mmio + reg);
+       u.v64 = ndev_db_read(ndev, mmio + ndev->self_reg->db_mask);
        off += scnprintf(buf + off, buf_size - off,
                         "Doorbell Mask -\t\t%#llx\n", u.v64);
 
-       reg = ndev->self_reg->db_bell;
-       u.v64 = ndev_db_read(ndev, mmio + reg);
+       u.v64 = ndev_db_read(ndev, mmio + ndev->self_reg->db_bell);
        off += scnprintf(buf + off, buf_size - off,
                         "Doorbell Bell -\t\t%#llx\n", u.v64);
 
        off += scnprintf(buf + off, buf_size - off,
                         "\nNTB Incoming XLAT:\n");
 
-       reg = bar2_off(ndev->xlat_reg->bar2_xlat, 2);
-       u.v64 = ioread64(mmio + reg);
+       u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_xlat, 2));
        off += scnprintf(buf + off, buf_size - off,
                         "XLAT23 -\t\t%#018llx\n", u.v64);
 
-       reg = bar2_off(ndev->xlat_reg->bar2_xlat, 4);
-       u.v64 = ioread64(mmio + reg);
+       u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_xlat, 4));
        off += scnprintf(buf + off, buf_size - off,
                         "XLAT45 -\t\t%#018llx\n", u.v64);
 
-       reg = bar2_off(ndev->xlat_reg->bar2_limit, 2);
-       u.v64 = ioread64(mmio + reg);
+       u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_limit, 2));
        off += scnprintf(buf + off, buf_size - off,
                         "LMT23 -\t\t\t%#018llx\n", u.v64);
 
-       reg = bar2_off(ndev->xlat_reg->bar2_limit, 4);
-       u.v64 = ioread64(mmio + reg);
+       u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_limit, 4));
        off += scnprintf(buf + off, buf_size - off,
                         "LMT45 -\t\t\t%#018llx\n", u.v64);
 
@@ -606,41 +599,34 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,
                        off += scnprintf(buf + off, buf_size - off,
                                         "\nNTB Outgoing B2B XLAT:\n");
 
-                       reg = bar2_off(SNB_PBAR2XLAT_OFFSET, 2);
-                       u.v64 = ioread64(mmio + reg);
+                       u.v64 = ioread64(mmio + SNB_PBAR23XLAT_OFFSET);
                        off += scnprintf(buf + off, buf_size - off,
                                         "B2B XLAT23 -\t\t%#018llx\n", u.v64);
 
-                       reg = bar2_off(SNB_PBAR2XLAT_OFFSET, 4);
-                       u.v64 = ioread64(mmio + reg);
+                       u.v64 = ioread64(mmio + SNB_PBAR45XLAT_OFFSET);
                        off += scnprintf(buf + off, buf_size - off,
                                         "B2B XLAT45 -\t\t%#018llx\n", u.v64);
 
-                       reg = bar2_off(SNB_PBAR2LMT_OFFSET, 2);
-                       u.v64 = ioread64(mmio + reg);
+                       u.v64 = ioread64(mmio + SNB_PBAR23LMT_OFFSET);
                        off += scnprintf(buf + off, buf_size - off,
                                         "B2B LMT23 -\t\t%#018llx\n", u.v64);
 
-                       reg = bar2_off(SNB_PBAR2LMT_OFFSET, 4);
-                       u.v64 = ioread64(mmio + reg);
+                       u.v64 = ioread64(mmio + SNB_PBAR45LMT_OFFSET);
                        off += scnprintf(buf + off, buf_size - off,
                                         "B2B LMT45 -\t\t%#018llx\n", u.v64);
 
                        off += scnprintf(buf + off, buf_size - off,
                                         "\nNTB Secondary BAR:\n");
 
-                       reg = bar0_off(SNB_SBAR0BASE_OFFSET, 0);
-                       u.v64 = ioread64(mmio + reg);
+                       u.v64 = ioread64(mmio + SNB_SBAR0BASE_OFFSET);
                        off += scnprintf(buf + off, buf_size - off,
                                         "SBAR01 -\t\t%#018llx\n", u.v64);
 
-                       reg = bar0_off(SNB_SBAR0BASE_OFFSET, 2);
-                       u.v64 = ioread64(mmio + reg);
+                       u.v64 = ioread64(mmio + SNB_SBAR23BASE_OFFSET);
                        off += scnprintf(buf + off, buf_size - off,
                                         "SBAR23 -\t\t%#018llx\n", u.v64);
 
-                       reg = bar0_off(SNB_SBAR0BASE_OFFSET, 4);
-                       u.v64 = ioread64(mmio + reg);
+                       u.v64 = ioread64(mmio + SNB_SBAR45BASE_OFFSET);
                        off += scnprintf(buf + off, buf_size - off,
                                         "SBAR45 -\t\t%#018llx\n", u.v64);
                }
@@ -648,31 +634,30 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,
                off += scnprintf(buf + off, buf_size - off,
                                 "\nSNB NTB Statistics:\n");
 
-               reg = SNB_USMEMMISS_OFFSET;
-               u.v16 = ioread16(mmio + reg);
+               u.v16 = ioread16(mmio + SNB_USMEMMISS_OFFSET);
                off += scnprintf(buf + off, buf_size - off,
                                 "Upstream Memory Miss -\t%u\n", u.v16);
 
                off += scnprintf(buf + off, buf_size - off,
                                 "\nSNB NTB Hardware Errors:\n");
 
-               reg = SNB_DEVSTS_OFFSET;
-               if (!pci_read_config_word(ndev->ntb.pdev, reg, &u.v16))
+               if (!pci_read_config_word(ndev->ntb.pdev,
+                                         SNB_DEVSTS_OFFSET, &u.v16))
                        off += scnprintf(buf + off, buf_size - off,
                                         "DEVSTS -\t\t%#06x\n", u.v16);
 
-               reg = SNB_LINK_STATUS_OFFSET;
-               if (!pci_read_config_word(ndev->ntb.pdev, reg, &u.v16))
+               if (!pci_read_config_word(ndev->ntb.pdev,
+                                         SNB_LINK_STATUS_OFFSET, &u.v16))
                        off += scnprintf(buf + off, buf_size - off,
                                         "LNKSTS -\t\t%#06x\n", u.v16);
 
-               reg = SNB_UNCERRSTS_OFFSET;
-               if (!pci_read_config_dword(ndev->ntb.pdev, reg, &u.v32))
+               if (!pci_read_config_dword(ndev->ntb.pdev,
+                                          SNB_UNCERRSTS_OFFSET, &u.v32))
                        off += scnprintf(buf + off, buf_size - off,
                                         "UNCERRSTS -\t\t%#06x\n", u.v32);
 
-               reg = SNB_CORERRSTS_OFFSET;
-               if (!pci_read_config_dword(ndev->ntb.pdev, reg, &u.v32))
+               if (!pci_read_config_dword(ndev->ntb.pdev,
+                                          SNB_CORERRSTS_OFFSET, &u.v32))
                        off += scnprintf(buf + off, buf_size - off,
                                         "CORERRSTS -\t\t%#06x\n", u.v32);
        }
@@ -1388,7 +1373,6 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev,
 {
        struct pci_dev *pdev;
        void __iomem *mmio;
-       unsigned long off;
        resource_size_t bar_size;
        phys_addr_t bar_addr;
        int b2b_bar;
@@ -1484,9 +1468,6 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev,
                dev_dbg(ndev_dev(ndev), "SBAR5SZ %#x\n", bar_sz);
        }
 
-       /* setup incoming bar base addresses */
-       off = SNB_SBAR0BASE_OFFSET;
-
        /* SBAR01 hit by first part of the b2b bar */
        if (b2b_bar == 0) {
                bar_addr = addr->bar0_addr;
@@ -1504,7 +1485,7 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev,
        }
 
        dev_dbg(ndev_dev(ndev), "SBAR01 %#018llx\n", bar_addr);
-       iowrite64(bar_addr, mmio + bar0_off(off, 0));
+       iowrite64(bar_addr, mmio + SNB_SBAR0BASE_OFFSET);
 
        /* Other SBAR are normally hit by the PBAR xlat, except for b2b bar.
         * The b2b bar is either disabled above, or configured half-size, and
@@ -1512,102 +1493,96 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev,
         */
 
        bar_addr = addr->bar2_addr64 + (b2b_bar == 2 ? ndev->b2b_off : 0);
-       iowrite64(bar_addr, mmio + bar0_off(off, 2));
-       bar_addr = ioread64(mmio + bar0_off(off, 2));
+       iowrite64(bar_addr, mmio + SNB_SBAR23BASE_OFFSET);
+       bar_addr = ioread64(mmio + SNB_SBAR23BASE_OFFSET);
        dev_dbg(ndev_dev(ndev), "SBAR23 %#018llx\n", bar_addr);
 
        if (!ndev->bar4_split) {
                bar_addr = addr->bar4_addr64 +
                        (b2b_bar == 4 ? ndev->b2b_off : 0);
-               iowrite64(bar_addr, mmio + bar0_off(off, 4));
-               bar_addr = ioread64(mmio + bar0_off(off, 4));
+               iowrite64(bar_addr, mmio + SNB_SBAR45BASE_OFFSET);
+               bar_addr = ioread64(mmio + SNB_SBAR45BASE_OFFSET);
                dev_dbg(ndev_dev(ndev), "SBAR45 %#018llx\n", bar_addr);
        } else {
                bar_addr = addr->bar4_addr32 +
                        (b2b_bar == 4 ? ndev->b2b_off : 0);
-               iowrite32(bar_addr, mmio + bar0_off(off, 4));
-               bar_addr = ioread32(mmio + bar0_off(off, 4));
+               iowrite32(bar_addr, mmio + SNB_SBAR4BASE_OFFSET);
+               bar_addr = ioread32(mmio + SNB_SBAR4BASE_OFFSET);
                dev_dbg(ndev_dev(ndev), "SBAR4 %#010llx\n", bar_addr);
 
                bar_addr = addr->bar5_addr32 +
                        (b2b_bar == 5 ? ndev->b2b_off : 0);
-               iowrite32(bar_addr, mmio + bar0_off(off, 5));
-               bar_addr = ioread32(mmio + bar0_off(off, 5));
+               iowrite32(bar_addr, mmio + SNB_SBAR5BASE_OFFSET);
+               bar_addr = ioread32(mmio + SNB_SBAR5BASE_OFFSET);
                dev_dbg(ndev_dev(ndev), "SBAR5 %#010llx\n", bar_addr);
        }
 
        /* setup incoming bar limits == base addrs (zero length windows) */
-       off = SNB_SBAR2LMT_OFFSET;
 
        bar_addr = addr->bar2_addr64 + (b2b_bar == 2 ? ndev->b2b_off : 0);
-       iowrite64(bar_addr, mmio + bar2_off(off, 2));
-       bar_addr = ioread64(mmio + bar2_off(off, 2));
+       iowrite64(bar_addr, mmio + SNB_SBAR23LMT_OFFSET);
+       bar_addr = ioread64(mmio + SNB_SBAR23LMT_OFFSET);
        dev_dbg(ndev_dev(ndev), "SBAR23LMT %#018llx\n", bar_addr);
 
        if (!ndev->bar4_split) {
                bar_addr = addr->bar4_addr64 +
                        (b2b_bar == 4 ? ndev->b2b_off : 0);
-               iowrite64(bar_addr, mmio + bar2_off(off, 4));
-               bar_addr = ioread64(mmio + bar2_off(off, 4));
+               iowrite64(bar_addr, mmio + SNB_SBAR45LMT_OFFSET);
+               bar_addr = ioread64(mmio + SNB_SBAR45LMT_OFFSET);
                dev_dbg(ndev_dev(ndev), "SBAR45LMT %#018llx\n", bar_addr);
        } else {
                bar_addr = addr->bar4_addr32 +
                        (b2b_bar == 4 ? ndev->b2b_off : 0);
-               iowrite32(bar_addr, mmio + bar2_off(off, 4));
-               bar_addr = ioread32(mmio + bar2_off(off, 4));
+               iowrite32(bar_addr, mmio + SNB_SBAR4LMT_OFFSET);
+               bar_addr = ioread32(mmio + SNB_SBAR4LMT_OFFSET);
                dev_dbg(ndev_dev(ndev), "SBAR4LMT %#010llx\n", bar_addr);
 
                bar_addr = addr->bar5_addr32 +
                        (b2b_bar == 5 ? ndev->b2b_off : 0);
-               iowrite32(bar_addr, mmio + bar2_off(off, 5));
-               bar_addr = ioread32(mmio + bar2_off(off, 5));
+               iowrite32(bar_addr, mmio + SNB_SBAR5LMT_OFFSET);
+               bar_addr = ioread32(mmio + SNB_SBAR5LMT_OFFSET);
                dev_dbg(ndev_dev(ndev), "SBAR5LMT %#05llx\n", bar_addr);
        }
 
        /* zero incoming translation addrs */
-       off = SNB_SBAR2XLAT_OFFSET;
-
-       iowrite64(0, mmio + bar2_off(off, 2));
+       iowrite64(0, mmio + SNB_SBAR23XLAT_OFFSET);
 
        if (!ndev->bar4_split) {
-               iowrite64(0, mmio + bar2_off(off, 4));
+               iowrite64(0, mmio + SNB_SBAR45XLAT_OFFSET);
        } else {
-               iowrite32(0, mmio + bar2_off(off, 4));
-               iowrite32(0, mmio + bar2_off(off, 5));
+               iowrite32(0, mmio + SNB_SBAR4XLAT_OFFSET);
+               iowrite32(0, mmio + SNB_SBAR5XLAT_OFFSET);
        }
 
        /* zero outgoing translation limits (whole bar size windows) */
-       off = SNB_PBAR2LMT_OFFSET;
-       iowrite64(0, mmio + bar2_off(off, 2));
+       iowrite64(0, mmio + SNB_PBAR23LMT_OFFSET);
        if (!ndev->bar4_split) {
-               iowrite64(0, mmio + bar2_off(off, 4));
+               iowrite64(0, mmio + SNB_PBAR45LMT_OFFSET);
        } else {
-               iowrite32(0, mmio + bar2_off(off, 4));
-               iowrite32(0, mmio + bar2_off(off, 5));
+               iowrite32(0, mmio + SNB_PBAR4LMT_OFFSET);
+               iowrite32(0, mmio + SNB_PBAR5LMT_OFFSET);
        }
 
        /* set outgoing translation offsets */
-       off = SNB_PBAR2XLAT_OFFSET;
-
        bar_addr = peer_addr->bar2_addr64;
-       iowrite64(bar_addr, mmio + bar2_off(off, 2));
-       bar_addr = ioread64(mmio + bar2_off(off, 2));
+       iowrite64(bar_addr, mmio + SNB_PBAR23XLAT_OFFSET);
+       bar_addr = ioread64(mmio + SNB_PBAR23XLAT_OFFSET);
        dev_dbg(ndev_dev(ndev), "PBAR23XLAT %#018llx\n", bar_addr);
 
        if (!ndev->bar4_split) {
                bar_addr = peer_addr->bar4_addr64;
-               iowrite64(bar_addr, mmio + bar2_off(off, 4));
-               bar_addr = ioread64(mmio + bar2_off(off, 4));
+               iowrite64(bar_addr, mmio + SNB_PBAR45XLAT_OFFSET);
+               bar_addr = ioread64(mmio + SNB_PBAR45XLAT_OFFSET);
                dev_dbg(ndev_dev(ndev), "PBAR45XLAT %#018llx\n", bar_addr);
        } else {
                bar_addr = peer_addr->bar2_addr64;
-               iowrite32(bar_addr, mmio + bar2_off(off, 4));
-               bar_addr = ioread32(mmio + bar2_off(off, 4));
+               iowrite32(bar_addr, mmio + SNB_PBAR4XLAT_OFFSET);
+               bar_addr = ioread32(mmio + SNB_PBAR4XLAT_OFFSET);
                dev_dbg(ndev_dev(ndev), "PBAR4XLAT %#010llx\n", bar_addr);
 
                bar_addr = peer_addr->bar2_addr64;
-               iowrite32(bar_addr, mmio + bar2_off(off, 5));
-               bar_addr = ioread32(mmio + bar2_off(off, 5));
+               iowrite32(bar_addr, mmio + SNB_PBAR5XLAT_OFFSET);
+               bar_addr = ioread32(mmio + SNB_PBAR5XLAT_OFFSET);
                dev_dbg(ndev_dev(ndev), "PBAR5XLAT %#010llx\n", bar_addr);
        }
 
@@ -1747,29 +1722,68 @@ static int snb_init_dev(struct intel_ntb_dev *ndev)
        u8 ppd;
        int rc, mem;
 
+       pdev = ndev_pdev(ndev);
+
+       switch (pdev->device) {
        /* There is a Xeon hardware errata related to writes to SDOORBELL or
         * B2BDOORBELL in conjunction with inbound access to NTB MMIO Space,
         * which may hang the system.  To workaround this use the second memory
         * window to access the interrupt and scratch pad registers on the
         * remote system.
         */
-       ndev->hwerr_flags |= NTB_HWERR_SDOORBELL_LOCKUP;
+       case PCI_DEVICE_ID_INTEL_NTB_SS_JSF:
+       case PCI_DEVICE_ID_INTEL_NTB_PS_JSF:
+       case PCI_DEVICE_ID_INTEL_NTB_B2B_JSF:
+       case PCI_DEVICE_ID_INTEL_NTB_SS_SNB:
+       case PCI_DEVICE_ID_INTEL_NTB_PS_SNB:
+       case PCI_DEVICE_ID_INTEL_NTB_B2B_SNB:
+       case PCI_DEVICE_ID_INTEL_NTB_SS_IVT:
+       case PCI_DEVICE_ID_INTEL_NTB_PS_IVT:
+       case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT:
+       case PCI_DEVICE_ID_INTEL_NTB_SS_HSX:
+       case PCI_DEVICE_ID_INTEL_NTB_PS_HSX:
+       case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX:
+               ndev->hwerr_flags |= NTB_HWERR_SDOORBELL_LOCKUP;
+               break;
+       }
 
+       switch (pdev->device) {
        /* There is a hardware errata related to accessing any register in
         * SB01BASE in the presence of bidirectional traffic crossing the NTB.
         */
-       ndev->hwerr_flags |= NTB_HWERR_SB01BASE_LOCKUP;
+       case PCI_DEVICE_ID_INTEL_NTB_SS_IVT:
+       case PCI_DEVICE_ID_INTEL_NTB_PS_IVT:
+       case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT:
+       case PCI_DEVICE_ID_INTEL_NTB_SS_HSX:
+       case PCI_DEVICE_ID_INTEL_NTB_PS_HSX:
+       case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX:
+               ndev->hwerr_flags |= NTB_HWERR_SB01BASE_LOCKUP;
+               break;
+       }
 
+       switch (pdev->device) {
        /* HW Errata on bit 14 of b2bdoorbell register.  Writes will not be
         * mirrored to the remote system.  Shrink the number of bits by one,
         * since bit 14 is the last bit.
         */
-       ndev->hwerr_flags |= NTB_HWERR_B2BDOORBELL_BIT14;
+       case PCI_DEVICE_ID_INTEL_NTB_SS_JSF:
+       case PCI_DEVICE_ID_INTEL_NTB_PS_JSF:
+       case PCI_DEVICE_ID_INTEL_NTB_B2B_JSF:
+       case PCI_DEVICE_ID_INTEL_NTB_SS_SNB:
+       case PCI_DEVICE_ID_INTEL_NTB_PS_SNB:
+       case PCI_DEVICE_ID_INTEL_NTB_B2B_SNB:
+       case PCI_DEVICE_ID_INTEL_NTB_SS_IVT:
+       case PCI_DEVICE_ID_INTEL_NTB_PS_IVT:
+       case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT:
+       case PCI_DEVICE_ID_INTEL_NTB_SS_HSX:
+       case PCI_DEVICE_ID_INTEL_NTB_PS_HSX:
+       case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX:
+               ndev->hwerr_flags |= NTB_HWERR_B2BDOORBELL_BIT14;
+               break;
+       }
 
        ndev->reg = &snb_reg;
 
-       pdev = ndev_pdev(ndev);
-
        rc = pci_read_config_byte(pdev, SNB_PPD_OFFSET, &ppd);
        if (rc)
                return -EIO;
@@ -2062,14 +2076,14 @@ static const struct intel_ntb_xlat_reg snb_pri_xlat = {
         * window by setting the limit equal to base, nor can it limit the size
         * of the memory window by setting the limit to base + size.
         */
-       .bar2_limit             = SNB_PBAR2LMT_OFFSET,
-       .bar2_xlat              = SNB_PBAR2XLAT_OFFSET,
+       .bar2_limit             = SNB_PBAR23LMT_OFFSET,
+       .bar2_xlat              = SNB_PBAR23XLAT_OFFSET,
 };
 
 static const struct intel_ntb_xlat_reg snb_sec_xlat = {
        .bar0_base              = SNB_SBAR0BASE_OFFSET,
-       .bar2_limit             = SNB_SBAR2LMT_OFFSET,
-       .bar2_xlat              = SNB_SBAR2XLAT_OFFSET,
+       .bar2_limit             = SNB_SBAR23LMT_OFFSET,
+       .bar2_xlat              = SNB_SBAR23XLAT_OFFSET,
 };
 
 static const struct intel_b2b_addr snb_b2b_usd_addr = {
drivers/ntb/hw/intel/ntb_hw_intel.h +20 -4
index 0224b1a..fec689d 100644
@@ -70,11 +70,27 @@
 
 /* SNB hardware (and JSF, IVT, HSX) */
 
-#define SNB_PBAR2LMT_OFFSET            0x0000
-#define SNB_PBAR2XLAT_OFFSET           0x0010
-#define SNB_SBAR2LMT_OFFSET            0x0020
-#define SNB_SBAR2XLAT_OFFSET           0x0030
+#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
drivers/ntb/ntb_transport.c +8 -9
index f1ed1b7..bb2eb85 100644
@@ -204,8 +204,8 @@ struct ntb_transport_ctx {
 
        bool link_is_up;
        struct delayed_work link_work;
-       struct work_struct db_work;
        struct work_struct link_cleanup;
+       struct tasklet_struct db_work;
 };
 
 enum {
@@ -241,7 +241,7 @@ enum {
 #define NTB_QP_DEF_NUM_ENTRIES 100
 #define NTB_LINK_DOWN_TIMEOUT  10
 
-static void ntb_transport_doorbell_work(struct work_struct *ws);
+static void ntb_transport_doorbell_work(unsigned long data);
 static const struct ntb_ctx_ops ntb_transport_ops;
 static struct ntb_client ntb_transport_client;
 
@@ -1002,8 +1002,9 @@ static int ntb_transport_probe(struct ntb_client *self, struct ntb_dev *ndev)
        }
 
        INIT_DELAYED_WORK(&nt->link_work, ntb_transport_link_work);
-       INIT_WORK(&nt->db_work, ntb_transport_doorbell_work);
        INIT_WORK(&nt->link_cleanup, ntb_transport_link_cleanup_work);
+       tasklet_init(&nt->db_work, ntb_transport_doorbell_work,
+                    (unsigned long)nt);
 
        rc = ntb_set_ctx(ndev, nt, &ntb_transport_ops);
        if (rc)
@@ -1044,7 +1045,7 @@ static void ntb_transport_free(struct ntb_client *self, struct ntb_dev *ndev)
        int i;
 
        ntb_transport_link_cleanup(nt);
-       cancel_work_sync(&nt->db_work);
+       tasklet_disable(&nt->db_work);
        cancel_work_sync(&nt->link_cleanup);
        cancel_delayed_work_sync(&nt->link_work);
 
@@ -1850,10 +1851,9 @@ unsigned int ntb_transport_max_size(struct ntb_transport_qp *qp)
 }
 EXPORT_SYMBOL_GPL(ntb_transport_max_size);
 
-static void ntb_transport_doorbell_work(struct work_struct *work)
+static void ntb_transport_doorbell_work(unsigned long data)
 {
-       struct ntb_transport_ctx *nt = container_of(work,
-                       struct ntb_transport_ctx, db_work);
+       struct ntb_transport_ctx *nt = (void *)data;
        struct ntb_transport_qp *qp;
        u64 db_mask, db_bits, db_again;
        unsigned int qp_num;
@@ -1890,7 +1890,7 @@ static void ntb_transport_doorbell_callback(void *data, int vector)
 
        ntb_db_set_mask(nt->ndev, ntb_db_valid_mask(nt->ndev));
 
-       schedule_work(&nt->db_work);
+       tasklet_schedule(&nt->db_work);
 }
 
 static const struct ntb_ctx_ops ntb_transport_ops = {
--

2.4.0.rc0.43.gcf8a8c6

--
To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html

maintainer
#14 lore raw

Re: [PATCH 04/16] Check the DID for certain workaround error flags to be set.

T24gV2VkLCAyMDE1LTA1LTIwIGF0IDE2OjExIC0wNTAwLCBCam9ybiBIZWxnYWFzIHdyb3RlOg0K PiBPbiBXZWQsIE1heSAyMCwgMjAxNSBhdCAxMDo0MSBBTSwgQWxsZW4gSHViYmUgPEFsbGVuLkh1 YmJlQGVtYy5jb20+IHdyb3RlOg0KPiA+IEZyb206IERhdmUgSmlhbmcgPGRhdmUuamlhbmdAaW50 ZWwuY29tPg0KPiA+DQo+ID4gU2lnbmVkLW9mZi1ieTogRGF2ZSBKaWFuZyA8ZGF2ZS5qaWFuZ0Bp bnRlbC5jb20+DQo+IA0KPiBOZWVkcyBhIHRvcGljIGluIHRoZSBzdWJqZWN0IGxpbmUgYW5kIGEg Y2hhbmdlbG9nLg0KPiANCj4gSXQgYWxzbyBzZWVtcyB0byBkbyBhIGxvdCBtb3JlIHRoYW4ganVz dCBjaGVja2luZyBkZXZpY2UgSUQgKEkgYXNzdW1lDQo+IHRoYXQncyB3aGF0ICJESUQiIG1lYW5z KSwgc28gdGhpcyBzaG91bGQgcHJvYmFibHkgYmUgc3BsaXQgaW50bw0KPiBzZXZlcmFsIHBhdGNo ZXMgdGhhdCBlYWNoIGRvIG9uZSB0aGluZy4gIEkgc2VlIGF0IGxlYXN0Og0KPiANCj4gICAtIGNv c21ldGljIGNvZGUgcmVzdHJ1Y3R1cmluZw0KPiAgIC0gd29ya19zdHJ1Y3QvdGFza2xldF9zdHJ1 Y3QgY2hhbmdlcw0KPiAgIC0gbmV3ICNkZWZpbmVzIGFuZCBiYXIyX29mZigpIGNoYW5nZXMNCg0K SSB0aGluayB0aGlzIHBhdGNoIGdvdCBtYW5nbGVkIHdpdGggY291cGxlIG90aGVyIHBhdGNoZXMu IEFsbGVuPw0KDQo+IA0KPiA+IC0tLQ0KPiA+ICBkcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdf aW50ZWwuYyB8IDE5NiArKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0tLS0NCj4gPiAg ZHJpdmVycy9udGIvaHcvaW50ZWwvbnRiX2h3X2ludGVsLmggfCAgMjQgKysrKy0NCj4gPiAgZHJp dmVycy9udGIvbnRiX3RyYW5zcG9ydC5jICAgICAgICAgfCAgMTYgKy0tDQo+ID4gIDMgZmlsZXMg Y2hhbmdlZCwgMTMzIGluc2VydGlvbnMoKyksIDEwMyBkZWxldGlvbnMoLSkNCj4gPg0KPiA+IGRp ZmYgLS1naXQgYS9kcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdfaW50ZWwuYyBiL2RyaXZlcnMv bnRiL2h3L2ludGVsL250Yl9od19pbnRlbC5jDQo+ID4gaW5kZXggZDE2MmYyMi4uODlmZWE1MCAx MDA2NDQNCj4gPiAtLS0gYS9kcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdfaW50ZWwuYw0KPiA+ ICsrKyBiL2RyaXZlcnMvbnRiL2h3L2ludGVsL250Yl9od19pbnRlbC5jDQo+ID4gQEAgLTUwMyw3 ICs1MDMsNiBAQCBzdGF0aWMgc3NpemVfdCBuZGV2X2RlYnVnZnNfcmVhZChzdHJ1Y3QgZmlsZSAq ZmlscCwgY2hhciBfX3VzZXIgKnVidWYsDQo+ID4gICAgICAgICBzaXplX3QgYnVmX3NpemU7DQo+ ID4gICAgICAgICBzc2l6ZV90IHJldCwgb2ZmOw0KPiA+ICAgICAgICAgdW5pb24geyB1NjQgdjY0 OyB1MzIgdjMyOyB1MTYgdjE2OyB9IHU7DQo+ID4gLSAgICAgICB1bnNpZ25lZCBsb25nIHJlZzsN Cj4gPg0KPiA+ICAgICAgICAgbmRldiA9IGZpbHAtPnByaXZhdGVfZGF0YTsNCj4gPiAgICAgICAg IG1taW8gPSBuZGV2LT5zZWxmX21taW87DQo+ID4gQEAgLTUzOCwxMCArNTM3LDEwIEBAIHN0YXRp YyBzc2l6ZV90IG5kZXZfZGVidWdmc19yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNl ciAqdWJ1ZiwNCj4gPg0KPiA+ICAgICAgICAgaWYgKCFuZGV2LT5yZWctPmxpbmtfaXNfdXAobmRl dikpIHsNCj4gPiAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1 Zl9zaXplIC0gb2ZmLA0KPiA+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMaW5r IFNhdHVzIC1cdFx0RG93blxuIik7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIkxpbmsgU3RhdHVzIC1cdFx0RG93blxuIik7DQo+ID4gICAgICAgICB9IGVsc2Ugew0KPiA+ ICAgICAgICAgICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBv ZmYsDQo+ID4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxpbmsgU2F0dXMgLVx0 XHRVcFxuIik7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxpbmsgU3Rh dHVzIC1cdFx0VXBcbiIpOw0KPiA+ICAgICAgICAgICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1 ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIkxpbmsgU3BlZWQgLVx0XHRQQ0ktRSBHZW4gJXVcbiIsDQo+ID4gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgTlRCX0xOS19TVEFfU1BFRUQobmRldi0+bG5rX3N0YSkpOw0K PiA+IEBAIC01NjgsMzYgKzU2NywzMCBAQCBzdGF0aWMgc3NpemVfdCBuZGV2X2RlYnVnZnNfcmVh ZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKnVidWYsDQo+ID4gICAgICAgICBvZmYg Kz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAgICAgICAgICAg ICAgICAgICAgICAgICJEb29yYmVsbCBNYXNrIENhY2hlZCAtXHQlI2xseFxuIiwgbmRldi0+ZGJf bWFzayk7DQo+ID4NCj4gPiAtICAgICAgIHJlZyA9IG5kZXYtPnNlbGZfcmVnLT5kYl9tYXNrOw0K PiA+IC0gICAgICAgdS52NjQgPSBuZGV2X2RiX3JlYWQobmRldiwgbW1pbyArIHJlZyk7DQo+ID4g KyAgICAgICB1LnY2NCA9IG5kZXZfZGJfcmVhZChuZGV2LCBtbWlvICsgbmRldi0+c2VsZl9yZWct PmRiX21hc2spOw0KPiA+ICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9z aXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAiRG9vcmJlbGwgTWFzayAt XHRcdCUjbGx4XG4iLCB1LnY2NCk7DQo+ID4NCj4gPiAtICAgICAgIHJlZyA9IG5kZXYtPnNlbGZf cmVnLT5kYl9iZWxsOw0KPiA+IC0gICAgICAgdS52NjQgPSBuZGV2X2RiX3JlYWQobmRldiwgbW1p byArIHJlZyk7DQo+ID4gKyAgICAgICB1LnY2NCA9IG5kZXZfZGJfcmVhZChuZGV2LCBtbWlvICsg bmRldi0+c2VsZl9yZWctPmRiX2JlbGwpOw0KPiA+ICAgICAgICAgb2ZmICs9IHNjbnByaW50Zihi dWYgKyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAi RG9vcmJlbGwgQmVsbCAtXHRcdCUjbGx4XG4iLCB1LnY2NCk7DQo+ID4NCj4gPiAgICAgICAgIG9m ZiArPSBzY25wcmludGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAg ICAgICAgICAgICAgICAgIlxuTlRCIEluY29taW5nIFhMQVQ6XG4iKTsNCj4gPg0KPiA+IC0gICAg ICAgcmVnID0gYmFyMl9vZmYobmRldi0+eGxhdF9yZWctPmJhcjJfeGxhdCwgMik7DQo+ID4gLSAg ICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyByZWcpOw0KPiA+ICsgICAgICAgdS52NjQgPSBp b3JlYWQ2NChtbWlvICsgYmFyMl9vZmYobmRldi0+eGxhdF9yZWctPmJhcjJfeGxhdCwgMikpOw0K PiA+ICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0K PiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAiWExBVDIzIC1cdFx0JSMwMThsbHhcbiIsIHUu djY0KTsNCj4gPg0KPiA+IC0gICAgICAgcmVnID0gYmFyMl9vZmYobmRldi0+eGxhdF9yZWctPmJh cjJfeGxhdCwgNCk7DQo+ID4gLSAgICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyByZWcpOw0K PiA+ICsgICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsgYmFyMl9vZmYobmRldi0+eGxhdF9y ZWctPmJhcjJfeGxhdCwgNCkpOw0KPiA+ICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBv ZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAiWExBVDQ1 IC1cdFx0JSMwMThsbHhcbiIsIHUudjY0KTsNCj4gPg0KPiA+IC0gICAgICAgcmVnID0gYmFyMl9v ZmYobmRldi0+eGxhdF9yZWctPmJhcjJfbGltaXQsIDIpOw0KPiA+IC0gICAgICAgdS52NjQgPSBp b3JlYWQ2NChtbWlvICsgcmVnKTsNCj4gPiArICAgICAgIHUudjY0ID0gaW9yZWFkNjQobW1pbyAr IGJhcjJfb2ZmKG5kZXYtPnhsYXRfcmVnLT5iYXIyX2xpbWl0LCAyKSk7DQo+ID4gICAgICAgICBv ZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAgICAgICAg ICAgICAgICAgICAgICAgICJMTVQyMyAtXHRcdFx0JSMwMThsbHhcbiIsIHUudjY0KTsNCj4gPg0K PiA+IC0gICAgICAgcmVnID0gYmFyMl9vZmYobmRldi0+eGxhdF9yZWctPmJhcjJfbGltaXQsIDQp Ow0KPiA+IC0gICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsgcmVnKTsNCj4gPiArICAgICAg IHUudjY0ID0gaW9yZWFkNjQobW1pbyArIGJhcjJfb2ZmKG5kZXYtPnhsYXRfcmVnLT5iYXIyX2xp bWl0LCA0KSk7DQo+ID4gICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3Np emUgLSBvZmYsDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICJMTVQ0NSAtXHRcdFx0JSMw MThsbHhcbiIsIHUudjY0KTsNCj4gPg0KPiA+IEBAIC02MDYsNDEgKzU5OSwzNCBAQCBzdGF0aWMg c3NpemVfdCBuZGV2X2RlYnVnZnNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIg KnVidWYsDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYg KyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIlxuTlRCIE91dGdvaW5nIEIyQiBYTEFUOlxuIik7DQo+ID4NCj4gPiAtICAg ICAgICAgICAgICAgICAgICAgICByZWcgPSBiYXIyX29mZihTTkJfUEJBUjJYTEFUX09GRlNFVCwg Mik7DQo+ID4gLSAgICAgICAgICAgICAgICAgICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsg cmVnKTsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8g KyBTTkJfUEJBUjIzWExBVF9PRkZTRVQpOw0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIG9m ZiArPSBzY25wcmludGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCMkIgWExBVDIzIC1cdFx0JSMwMThsbHhc biIsIHUudjY0KTsNCj4gPg0KPiA+IC0gICAgICAgICAgICAgICAgICAgICAgIHJlZyA9IGJhcjJf b2ZmKFNOQl9QQkFSMlhMQVRfT0ZGU0VULCA0KTsNCj4gPiAtICAgICAgICAgICAgICAgICAgICAg ICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyByZWcpOw0KPiA+ICsgICAgICAgICAgICAgICAgICAg ICAgIHUudjY0ID0gaW9yZWFkNjQobW1pbyArIFNOQl9QQkFSNDVYTEFUX09GRlNFVCk7DQo+ID4g ICAgICAgICAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9z aXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IkIyQiBYTEFUNDUgLVx0XHQlIzAxOGxseFxuIiwgdS52NjQpOw0KPiA+DQo+ID4gLSAgICAgICAg ICAgICAgICAgICAgICAgcmVnID0gYmFyMl9vZmYoU05CX1BCQVIyTE1UX09GRlNFVCwgMik7DQo+ ID4gLSAgICAgICAgICAgICAgICAgICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsgcmVnKTsN Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyBTTkJf UEJBUjIzTE1UX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgb2ZmICs9IHNj bnByaW50ZihidWYgKyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIkIyQiBMTVQyMyAtXHRcdCUjMDE4bGx4XG4iLCB1LnY2 NCk7DQo+ID4NCj4gPiAtICAgICAgICAgICAgICAgICAgICAgICByZWcgPSBiYXIyX29mZihTTkJf UEJBUjJMTVRfT0ZGU0VULCA0KTsNCj4gPiAtICAgICAgICAgICAgICAgICAgICAgICB1LnY2NCA9 IGlvcmVhZDY0KG1taW8gKyByZWcpOw0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIHUudjY0 ID0gaW9yZWFkNjQobW1pbyArIFNOQl9QQkFSNDVMTVRfT0ZGU0VUKTsNCj4gPiAgICAgICAgICAg ICAgICAgICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYs DQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQjJCIExNVDQ1 IC1cdFx0JSMwMThsbHhcbiIsIHUudjY0KTsNCj4gPg0KPiA+ICAgICAgICAgICAgICAgICAgICAg ICAgIG9mZiArPSBzY25wcmludGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbk5UQiBTZWNvbmRhcnkgQkFS OlxuIik7DQo+ID4NCj4gPiAtICAgICAgICAgICAgICAgICAgICAgICByZWcgPSBiYXIwX29mZihT TkJfU0JBUjBCQVNFX09GRlNFVCwgMCk7DQo+ID4gLSAgICAgICAgICAgICAgICAgICAgICAgdS52 NjQgPSBpb3JlYWQ2NChtbWlvICsgcmVnKTsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICB1 LnY2NCA9IGlvcmVhZDY0KG1taW8gKyBTTkJfU0JBUjBCQVNFX09GRlNFVCk7DQo+ID4gICAgICAg ICAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9zaXplIC0g b2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNCQVIw MSAtXHRcdCUjMDE4bGx4XG4iLCB1LnY2NCk7DQo+ID4NCj4gPiAtICAgICAgICAgICAgICAgICAg ICAgICByZWcgPSBiYXIwX29mZihTTkJfU0JBUjBCQVNFX09GRlNFVCwgMik7DQo+ID4gLSAgICAg ICAgICAgICAgICAgICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsgcmVnKTsNCj4gPiArICAg ICAgICAgICAgICAgICAgICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyBTTkJfU0JBUjIzQkFT RV9PRkZTRVQpOw0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIG9mZiArPSBzY25wcmludGYo YnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICJTQkFSMjMgLVx0XHQlIzAxOGxseFxuIiwgdS52NjQpOw0KPiA+DQo+ ID4gLSAgICAgICAgICAgICAgICAgICAgICAgcmVnID0gYmFyMF9vZmYoU05CX1NCQVIwQkFTRV9P RkZTRVQsIDQpOw0KPiA+IC0gICAgICAgICAgICAgICAgICAgICAgIHUudjY0ID0gaW9yZWFkNjQo bW1pbyArIHJlZyk7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgdS52NjQgPSBpb3JlYWQ2 NChtbWlvICsgU05CX1NCQVI0NUJBU0VfT0ZGU0VUKTsNCj4gPiAgICAgICAgICAgICAgICAgICAg ICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0JBUjQ1IC1cdFx0JSMwMThs bHhcbiIsIHUudjY0KTsNCj4gPiAgICAgICAgICAgICAgICAgfQ0KPiA+IEBAIC02NDgsMzEgKzYz NCwzMCBAQCBzdGF0aWMgc3NpemVfdCBuZGV2X2RlYnVnZnNfcmVhZChzdHJ1Y3QgZmlsZSAqZmls cCwgY2hhciBfX3VzZXIgKnVidWYsDQo+ID4gICAgICAgICAgICAgICAgIG9mZiArPSBzY25wcmlu dGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAiXG5TTkIgTlRCIFN0YXRpc3RpY3M6XG4iKTsNCj4gPg0KPiA+IC0gICAgICAg ICAgICAgICByZWcgPSBTTkJfVVNNRU1NSVNTX09GRlNFVDsNCj4gPiAtICAgICAgICAgICAgICAg dS52MTYgPSBpb3JlYWQxNihtbWlvICsgcmVnKTsNCj4gPiArICAgICAgICAgICAgICAgdS52MTYg PSBpb3JlYWQxNihtbWlvICsgU05CX1VTTUVNTUlTU19PRkZTRVQpOw0KPiA+ICAgICAgICAgICAg ICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVwc3RyZWFtIE1lbW9yeSBNaXNzIC1cdCV1 XG4iLCB1LnYxNik7DQo+ID4NCj4gPiAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50Zihi dWYgKyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICJcblNOQiBOVEIgSGFyZHdhcmUgRXJyb3JzOlxuIik7DQo+ID4NCj4gPiAtICAgICAg ICAgICAgICAgcmVnID0gU05CX0RFVlNUU19PRkZTRVQ7DQo+ID4gLSAgICAgICAgICAgICAgIGlm ICghcGNpX3JlYWRfY29uZmlnX3dvcmQobmRldi0+bnRiLnBkZXYsIHJlZywgJnUudjE2KSkNCj4g PiArICAgICAgICAgICAgICAgaWYgKCFwY2lfcmVhZF9jb25maWdfd29yZChuZGV2LT5udGIucGRl diwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTkJfREVW U1RTX09GRlNFVCwgJnUudjE2KSkNCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICBvZmYgKz0g c2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAiREVWU1RTIC1cdFx0JSMwNnhcbiIsIHUudjE2KTsN Cj4gPg0KPiA+IC0gICAgICAgICAgICAgICByZWcgPSBTTkJfTElOS19TVEFUVVNfT0ZGU0VUOw0K PiA+IC0gICAgICAgICAgICAgICBpZiAoIXBjaV9yZWFkX2NvbmZpZ193b3JkKG5kZXYtPm50Yi5w ZGV2LCByZWcsICZ1LnYxNikpDQo+ID4gKyAgICAgICAgICAgICAgIGlmICghcGNpX3JlYWRfY29u ZmlnX3dvcmQobmRldi0+bnRiLnBkZXYsDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgU05CX0xJTktfU1RBVFVTX09GRlNFVCwgJnUudjE2KSkNCj4gPiAgICAg ICAgICAgICAgICAgICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUg LSBvZmYsDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTE5L U1RTIC1cdFx0JSMwNnhcbiIsIHUudjE2KTsNCj4gPg0KPiA+IC0gICAgICAgICAgICAgICByZWcg PSBTTkJfVU5DRVJSU1RTX09GRlNFVDsNCj4gPiAtICAgICAgICAgICAgICAgaWYgKCFwY2lfcmVh ZF9jb25maWdfZHdvcmQobmRldi0+bnRiLnBkZXYsIHJlZywgJnUudjMyKSkNCj4gPiArICAgICAg ICAgICAgICAgaWYgKCFwY2lfcmVhZF9jb25maWdfZHdvcmQobmRldi0+bnRiLnBkZXYsDQo+ID4g KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNOQl9VTkNFUlJTVFNf T0ZGU0VULCAmdS52MzIpKQ0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIG9mZiArPSBzY25w cmludGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICJVTkNFUlJTVFMgLVx0XHQlIzA2eFxuIiwgdS52MzIpOw0K PiA+DQo+ID4gLSAgICAgICAgICAgICAgIHJlZyA9IFNOQl9DT1JFUlJTVFNfT0ZGU0VUOw0KPiA+ IC0gICAgICAgICAgICAgICBpZiAoIXBjaV9yZWFkX2NvbmZpZ19kd29yZChuZGV2LT5udGIucGRl diwgcmVnLCAmdS52MzIpKQ0KPiA+ICsgICAgICAgICAgICAgICBpZiAoIXBjaV9yZWFkX2NvbmZp Z19kd29yZChuZGV2LT5udGIucGRldiwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgU05CX0NPUkVSUlNUU19PRkZTRVQsICZ1LnYzMikpDQo+ID4gICAgICAg ICAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9zaXplIC0g b2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPUkVS UlNUUyAtXHRcdCUjMDZ4XG4iLCB1LnYzMik7DQo+ID4gICAgICAgICB9DQo+ID4gQEAgLTEzODgs NyArMTM3Myw2IEBAIHN0YXRpYyBpbnQgc25iX3NldHVwX2IyYl9tdyhzdHJ1Y3QgaW50ZWxfbnRi X2RldiAqbmRldiwNCj4gPiAgew0KPiA+ICAgICAgICAgc3RydWN0IHBjaV9kZXYgKnBkZXY7DQo+ ID4gICAgICAgICB2b2lkIF9faW9tZW0gKm1taW87DQo+ID4gLSAgICAgICB1bnNpZ25lZCBsb25n IG9mZjsNCj4gPiAgICAgICAgIHJlc291cmNlX3NpemVfdCBiYXJfc2l6ZTsNCj4gPiAgICAgICAg IHBoeXNfYWRkcl90IGJhcl9hZGRyOw0KPiA+ICAgICAgICAgaW50IGIyYl9iYXI7DQo+ID4gQEAg LTE0ODQsOSArMTQ2OCw2IEBAIHN0YXRpYyBpbnQgc25iX3NldHVwX2IyYl9tdyhzdHJ1Y3QgaW50 ZWxfbnRiX2RldiAqbmRldiwNCj4gPiAgICAgICAgICAgICAgICAgZGV2X2RiZyhuZGV2X2Rldihu ZGV2KSwgIlNCQVI1U1ogJSN4XG4iLCBiYXJfc3opOw0KPiA+ICAgICAgICAgfQ0KPiA+DQo+ID4g LSAgICAgICAvKiBzZXR1cCBpbmNvbWluZyBiYXIgYmFzZSBhZGRyZXNzZXMgKi8NCj4gPiAtICAg ICAgIG9mZiA9IFNOQl9TQkFSMEJBU0VfT0ZGU0VUOw0KPiA+IC0NCj4gPiAgICAgICAgIC8qIFNC QVIwMSBoaXQgYnkgZmlyc3QgcGFydCBvZiB0aGUgYjJiIGJhciAqLw0KPiA+ICAgICAgICAgaWYg KGIyYl9iYXIgPT0gMCkgew0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IGFkZHItPmJh cjBfYWRkcjsNCj4gPiBAQCAtMTUwNCw3ICsxNDg1LDcgQEAgc3RhdGljIGludCBzbmJfc2V0dXBf YjJiX213KHN0cnVjdCBpbnRlbF9udGJfZGV2ICpuZGV2LA0KPiA+ICAgICAgICAgfQ0KPiA+DQo+ ID4gICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYpLCAiU0JBUjAxICUjMDE4bGx4XG4iLCBi YXJfYWRkcik7DQo+ID4gLSAgICAgICBpb3dyaXRlNjQoYmFyX2FkZHIsIG1taW8gKyBiYXIwX29m ZihvZmYsIDApKTsNCj4gPiArICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwgbW1pbyArIFNOQl9T QkFSMEJBU0VfT0ZGU0VUKTsNCj4gPg0KPiA+ICAgICAgICAgLyogT3RoZXIgU0JBUiBhcmUgbm9y bWFsbHkgaGl0IGJ5IHRoZSBQQkFSIHhsYXQsIGV4Y2VwdCBmb3IgYjJiIGJhci4NCj4gPiAgICAg ICAgICAqIFRoZSBiMmIgYmFyIGlzIGVpdGhlciBkaXNhYmxlZCBhYm92ZSwgb3IgY29uZmlndXJl ZCBoYWxmLXNpemUsIGFuZA0KPiA+IEBAIC0xNTEyLDEwMiArMTQ5Myw5NiBAQCBzdGF0aWMgaW50 IHNuYl9zZXR1cF9iMmJfbXcoc3RydWN0IGludGVsX250Yl9kZXYgKm5kZXYsDQo+ID4gICAgICAg ICAgKi8NCj4gPg0KPiA+ICAgICAgICAgYmFyX2FkZHIgPSBhZGRyLT5iYXIyX2FkZHI2NCArIChi MmJfYmFyID09IDIgPyBuZGV2LT5iMmJfb2ZmIDogMCk7DQo+ID4gLSAgICAgICBpb3dyaXRlNjQo YmFyX2FkZHIsIG1taW8gKyBiYXIwX29mZihvZmYsIDIpKTsNCj4gPiAtICAgICAgIGJhcl9hZGRy ID0gaW9yZWFkNjQobW1pbyArIGJhcjBfb2ZmKG9mZiwgMikpOw0KPiA+ICsgICAgICAgaW93cml0 ZTY0KGJhcl9hZGRyLCBtbWlvICsgU05CX1NCQVIyM0JBU0VfT0ZGU0VUKTsNCj4gPiArICAgICAg IGJhcl9hZGRyID0gaW9yZWFkNjQobW1pbyArIFNOQl9TQkFSMjNCQVNFX09GRlNFVCk7DQo+ID4g ICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYpLCAiU0JBUjIzICUjMDE4bGx4XG4iLCBiYXJf YWRkcik7DQo+ID4NCj4gPiAgICAgICAgIGlmICghbmRldi0+YmFyNF9zcGxpdCkgew0KPiA+ICAg ICAgICAgICAgICAgICBiYXJfYWRkciA9IGFkZHItPmJhcjRfYWRkcjY0ICsNCj4gPiAgICAgICAg ICAgICAgICAgICAgICAgICAoYjJiX2JhciA9PSA0ID8gbmRldi0+YjJiX29mZiA6IDApOw0KPiA+ IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoYmFyX2FkZHIsIG1taW8gKyBiYXIwX29mZihvZmYs IDQpKTsNCj4gPiAtICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgYmFy MF9vZmYob2ZmLCA0KSk7DQo+ID4gKyAgICAgICAgICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwg bW1pbyArIFNOQl9TQkFSNDVCQVNFX09GRlNFVCk7DQo+ID4gKyAgICAgICAgICAgICAgIGJhcl9h ZGRyID0gaW9yZWFkNjQobW1pbyArIFNOQl9TQkFSNDVCQVNFX09GRlNFVCk7DQo+ID4gICAgICAg ICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiksICJTQkFSNDUgJSMwMThsbHhcbiIsIGJh cl9hZGRyKTsNCj4gPiAgICAgICAgIH0gZWxzZSB7DQo+ID4gICAgICAgICAgICAgICAgIGJhcl9h ZGRyID0gYWRkci0+YmFyNF9hZGRyMzIgKw0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIChi MmJfYmFyID09IDQgPyBuZGV2LT5iMmJfb2ZmIDogMCk7DQo+ID4gLSAgICAgICAgICAgICAgIGlv d3JpdGUzMihiYXJfYWRkciwgbW1pbyArIGJhcjBfb2ZmKG9mZiwgNCkpOw0KPiA+IC0gICAgICAg ICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBiYXIwX29mZihvZmYsIDQpKTsNCj4g PiArICAgICAgICAgICAgICAgaW93cml0ZTMyKGJhcl9hZGRyLCBtbWlvICsgU05CX1NCQVI0QkFT RV9PRkZTRVQpOw0KPiA+ICsgICAgICAgICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8g KyBTTkJfU0JBUjRCQVNFX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgIGRldl9kYmcobmRl dl9kZXYobmRldiksICJTQkFSNCAlIzAxMGxseFxuIiwgYmFyX2FkZHIpOw0KPiA+DQo+ID4gICAg ICAgICAgICAgICAgIGJhcl9hZGRyID0gYWRkci0+YmFyNV9hZGRyMzIgKw0KPiA+ICAgICAgICAg ICAgICAgICAgICAgICAgIChiMmJfYmFyID09IDUgPyBuZGV2LT5iMmJfb2ZmIDogMCk7DQo+ID4g LSAgICAgICAgICAgICAgIGlvd3JpdGUzMihiYXJfYWRkciwgbW1pbyArIGJhcjBfb2ZmKG9mZiwg NSkpOw0KPiA+IC0gICAgICAgICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBiYXIw X29mZihvZmYsIDUpKTsNCj4gPiArICAgICAgICAgICAgICAgaW93cml0ZTMyKGJhcl9hZGRyLCBt bWlvICsgU05CX1NCQVI1QkFTRV9PRkZTRVQpOw0KPiA+ICsgICAgICAgICAgICAgICBiYXJfYWRk ciA9IGlvcmVhZDMyKG1taW8gKyBTTkJfU0JBUjVCQVNFX09GRlNFVCk7DQo+ID4gICAgICAgICAg ICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiksICJTQkFSNSAlIzAxMGxseFxuIiwgYmFyX2Fk ZHIpOw0KPiA+ICAgICAgICAgfQ0KPiA+DQo+ID4gICAgICAgICAvKiBzZXR1cCBpbmNvbWluZyBi YXIgbGltaXRzID09IGJhc2UgYWRkcnMgKHplcm8gbGVuZ3RoIHdpbmRvd3MpICovDQo+ID4gLSAg ICAgICBvZmYgPSBTTkJfU0JBUjJMTVRfT0ZGU0VUOw0KPiA+DQo+ID4gICAgICAgICBiYXJfYWRk ciA9IGFkZHItPmJhcjJfYWRkcjY0ICsgKGIyYl9iYXIgPT0gMiA/IG5kZXYtPmIyYl9vZmYgOiAw KTsNCj4gPiAtICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwgbW1pbyArIGJhcjJfb2ZmKG9mZiwg MikpOw0KPiA+IC0gICAgICAgYmFyX2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgYmFyMl9vZmYob2Zm LCAyKSk7DQo+ID4gKyAgICAgICBpb3dyaXRlNjQoYmFyX2FkZHIsIG1taW8gKyBTTkJfU0JBUjIz TE1UX09GRlNFVCk7DQo+ID4gKyAgICAgICBiYXJfYWRkciA9IGlvcmVhZDY0KG1taW8gKyBTTkJf U0JBUjIzTE1UX09GRlNFVCk7DQo+ID4gICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYpLCAi U0JBUjIzTE1UICUjMDE4bGx4XG4iLCBiYXJfYWRkcik7DQo+ID4NCj4gPiAgICAgICAgIGlmICgh bmRldi0+YmFyNF9zcGxpdCkgew0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IGFkZHIt PmJhcjRfYWRkcjY0ICsNCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAoYjJiX2JhciA9PSA0 ID8gbmRldi0+YjJiX29mZiA6IDApOw0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoYmFy X2FkZHIsIG1taW8gKyBiYXIyX29mZihvZmYsIDQpKTsNCj4gPiAtICAgICAgICAgICAgICAgYmFy X2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgYmFyMl9vZmYob2ZmLCA0KSk7DQo+ID4gKyAgICAgICAg ICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwgbW1pbyArIFNOQl9TQkFSNDVMTVRfT0ZGU0VUKTsN Cj4gPiArICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgU05CX1NCQVI0 NUxNVF9PRkZTRVQpOw0KPiA+ICAgICAgICAgICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYp LCAiU0JBUjQ1TE1UICUjMDE4bGx4XG4iLCBiYXJfYWRkcik7DQo+ID4gICAgICAgICB9IGVsc2Ug ew0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IGFkZHItPmJhcjRfYWRkcjMyICsNCj4g PiAgICAgICAgICAgICAgICAgICAgICAgICAoYjJiX2JhciA9PSA0ID8gbmRldi0+YjJiX29mZiA6 IDApOw0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlMzIoYmFyX2FkZHIsIG1taW8gKyBiYXIy X29mZihvZmYsIDQpKTsNCj4gPiAtICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBpb3JlYWQzMiht bWlvICsgYmFyMl9vZmYob2ZmLCA0KSk7DQo+ID4gKyAgICAgICAgICAgICAgIGlvd3JpdGUzMihi YXJfYWRkciwgbW1pbyArIFNOQl9TQkFSNExNVF9PRkZTRVQpOw0KPiA+ICsgICAgICAgICAgICAg ICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBTTkJfU0JBUjRMTVRfT0ZGU0VUKTsNCj4gPiAg ICAgICAgICAgICAgICAgZGV2X2RiZyhuZGV2X2RldihuZGV2KSwgIlNCQVI0TE1UICUjMDEwbGx4 XG4iLCBiYXJfYWRkcik7DQo+ID4NCj4gPiAgICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBhZGRy LT5iYXI1X2FkZHIzMiArDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgKGIyYl9iYXIgPT0g NSA/IG5kZXYtPmIyYl9vZmYgOiAwKTsNCj4gPiAtICAgICAgICAgICAgICAgaW93cml0ZTMyKGJh cl9hZGRyLCBtbWlvICsgYmFyMl9vZmYob2ZmLCA1KSk7DQo+ID4gLSAgICAgICAgICAgICAgIGJh cl9hZGRyID0gaW9yZWFkMzIobW1pbyArIGJhcjJfb2ZmKG9mZiwgNSkpOw0KPiA+ICsgICAgICAg ICAgICAgICBpb3dyaXRlMzIoYmFyX2FkZHIsIG1taW8gKyBTTkJfU0JBUjVMTVRfT0ZGU0VUKTsN Cj4gPiArICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBpb3JlYWQzMihtbWlvICsgU05CX1NCQVI1 TE1UX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiks ICJTQkFSNUxNVCAlIzA1bGx4XG4iLCBiYXJfYWRkcik7DQo+ID4gICAgICAgICB9DQo+ID4NCj4g PiAgICAgICAgIC8qIHplcm8gaW5jb21pbmcgdHJhbnNsYXRpb24gYWRkcnMgKi8NCj4gPiAtICAg ICAgIG9mZiA9IFNOQl9TQkFSMlhMQVRfT0ZGU0VUOw0KPiA+IC0NCj4gPiAtICAgICAgIGlvd3Jp dGU2NCgwLCBtbWlvICsgYmFyMl9vZmYob2ZmLCAyKSk7DQo+ID4gKyAgICAgICBpb3dyaXRlNjQo MCwgbW1pbyArIFNOQl9TQkFSMjNYTEFUX09GRlNFVCk7DQo+ID4NCj4gPiAgICAgICAgIGlmICgh bmRldi0+YmFyNF9zcGxpdCkgew0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoMCwgbW1p byArIGJhcjJfb2ZmKG9mZiwgNCkpOw0KPiA+ICsgICAgICAgICAgICAgICBpb3dyaXRlNjQoMCwg bW1pbyArIFNOQl9TQkFSNDVYTEFUX09GRlNFVCk7DQo+ID4gICAgICAgICB9IGVsc2Ugew0KPiA+ IC0gICAgICAgICAgICAgICBpb3dyaXRlMzIoMCwgbW1pbyArIGJhcjJfb2ZmKG9mZiwgNCkpOw0K PiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlMzIoMCwgbW1pbyArIGJhcjJfb2ZmKG9mZiwgNSkp Ow0KPiA+ICsgICAgICAgICAgICAgICBpb3dyaXRlMzIoMCwgbW1pbyArIFNOQl9TQkFSNFhMQVRf T0ZGU0VUKTsNCj4gPiArICAgICAgICAgICAgICAgaW93cml0ZTMyKDAsIG1taW8gKyBTTkJfU0JB UjVYTEFUX09GRlNFVCk7DQo+ID4gICAgICAgICB9DQo+ID4NCj4gPiAgICAgICAgIC8qIHplcm8g b3V0Z29pbmcgdHJhbnNsYXRpb24gbGltaXRzICh3aG9sZSBiYXIgc2l6ZSB3aW5kb3dzKSAqLw0K PiA+IC0gICAgICAgb2ZmID0gU05CX1BCQVIyTE1UX09GRlNFVDsNCj4gPiAtICAgICAgIGlvd3Jp dGU2NCgwLCBtbWlvICsgYmFyMl9vZmYob2ZmLCAyKSk7DQo+ID4gKyAgICAgICBpb3dyaXRlNjQo MCwgbW1pbyArIFNOQl9QQkFSMjNMTVRfT0ZGU0VUKTsNCj4gPiAgICAgICAgIGlmICghbmRldi0+ YmFyNF9zcGxpdCkgew0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoMCwgbW1pbyArIGJh cjJfb2ZmKG9mZiwgNCkpOw0KPiA+ICsgICAgICAgICAgICAgICBpb3dyaXRlNjQoMCwgbW1pbyAr IFNOQl9QQkFSNDVMTVRfT0ZGU0VUKTsNCj4gPiAgICAgICAgIH0gZWxzZSB7DQo+ID4gLSAgICAg ICAgICAgICAgIGlvd3JpdGUzMigwLCBtbWlvICsgYmFyMl9vZmYob2ZmLCA0KSk7DQo+ID4gLSAg ICAgICAgICAgICAgIGlvd3JpdGUzMigwLCBtbWlvICsgYmFyMl9vZmYob2ZmLCA1KSk7DQo+ID4g KyAgICAgICAgICAgICAgIGlvd3JpdGUzMigwLCBtbWlvICsgU05CX1BCQVI0TE1UX09GRlNFVCk7 DQo+ID4gKyAgICAgICAgICAgICAgIGlvd3JpdGUzMigwLCBtbWlvICsgU05CX1BCQVI1TE1UX09G RlNFVCk7DQo+ID4gICAgICAgICB9DQo+ID4NCj4gPiAgICAgICAgIC8qIHNldCBvdXRnb2luZyB0 cmFuc2xhdGlvbiBvZmZzZXRzICovDQo+ID4gLSAgICAgICBvZmYgPSBTTkJfUEJBUjJYTEFUX09G RlNFVDsNCj4gPiAtDQo+ID4gICAgICAgICBiYXJfYWRkciA9IHBlZXJfYWRkci0+YmFyMl9hZGRy NjQ7DQo+ID4gLSAgICAgICBpb3dyaXRlNjQoYmFyX2FkZHIsIG1taW8gKyBiYXIyX29mZihvZmYs IDIpKTsNCj4gPiAtICAgICAgIGJhcl9hZGRyID0gaW9yZWFkNjQobW1pbyArIGJhcjJfb2ZmKG9m ZiwgMikpOw0KPiA+ICsgICAgICAgaW93cml0ZTY0KGJhcl9hZGRyLCBtbWlvICsgU05CX1BCQVIy M1hMQVRfT0ZGU0VUKTsNCj4gPiArICAgICAgIGJhcl9hZGRyID0gaW9yZWFkNjQobW1pbyArIFNO Ql9QQkFSMjNYTEFUX09GRlNFVCk7DQo+ID4gICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYp LCAiUEJBUjIzWExBVCAlIzAxOGxseFxuIiwgYmFyX2FkZHIpOw0KPiA+DQo+ID4gICAgICAgICBp ZiAoIW5kZXYtPmJhcjRfc3BsaXQpIHsNCj4gPiAgICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBw ZWVyX2FkZHItPmJhcjRfYWRkcjY0Ow0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoYmFy X2FkZHIsIG1taW8gKyBiYXIyX29mZihvZmYsIDQpKTsNCj4gPiAtICAgICAgICAgICAgICAgYmFy X2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgYmFyMl9vZmYob2ZmLCA0KSk7DQo+ID4gKyAgICAgICAg ICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwgbW1pbyArIFNOQl9QQkFSNDVYTEFUX09GRlNFVCk7 DQo+ID4gKyAgICAgICAgICAgICAgIGJhcl9hZGRyID0gaW9yZWFkNjQobW1pbyArIFNOQl9QQkFS NDVYTEFUX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRl diksICJQQkFSNDVYTEFUICUjMDE4bGx4XG4iLCBiYXJfYWRkcik7DQo+ID4gICAgICAgICB9IGVs c2Ugew0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IHBlZXJfYWRkci0+YmFyMl9hZGRy NjQ7DQo+ID4gLSAgICAgICAgICAgICAgIGlvd3JpdGUzMihiYXJfYWRkciwgbW1pbyArIGJhcjJf b2ZmKG9mZiwgNCkpOw0KPiA+IC0gICAgICAgICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1t aW8gKyBiYXIyX29mZihvZmYsIDQpKTsNCj4gPiArICAgICAgICAgICAgICAgaW93cml0ZTMyKGJh cl9hZGRyLCBtbWlvICsgU05CX1BCQVI0WExBVF9PRkZTRVQpOw0KPiA+ICsgICAgICAgICAgICAg ICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBTTkJfUEJBUjRYTEFUX09GRlNFVCk7DQo+ID4g ICAgICAgICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiksICJQQkFSNFhMQVQgJSMwMTBs bHhcbiIsIGJhcl9hZGRyKTsNCj4gPg0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IHBl ZXJfYWRkci0+YmFyMl9hZGRyNjQ7DQo+ID4gLSAgICAgICAgICAgICAgIGlvd3JpdGUzMihiYXJf YWRkciwgbW1pbyArIGJhcjJfb2ZmKG9mZiwgNSkpOw0KPiA+IC0gICAgICAgICAgICAgICBiYXJf YWRkciA9IGlvcmVhZDMyKG1taW8gKyBiYXIyX29mZihvZmYsIDUpKTsNCj4gPiArICAgICAgICAg ICAgICAgaW93cml0ZTMyKGJhcl9hZGRyLCBtbWlvICsgU05CX1BCQVI1WExBVF9PRkZTRVQpOw0K PiA+ICsgICAgICAgICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBTTkJfUEJBUjVY TEFUX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiks ICJQQkFSNVhMQVQgJSMwMTBsbHhcbiIsIGJhcl9hZGRyKTsNCj4gPiAgICAgICAgIH0NCj4gPg0K PiA+IEBAIC0xNzQ3LDI5ICsxNzIyLDY4IEBAIHN0YXRpYyBpbnQgc25iX2luaXRfZGV2KHN0cnVj dCBpbnRlbF9udGJfZGV2ICpuZGV2KQ0KPiA+ICAgICAgICAgdTggcHBkOw0KPiA+ICAgICAgICAg aW50IHJjLCBtZW07DQo+ID4NCj4gPiArICAgICAgIHBkZXYgPSBuZGV2X3BkZXYobmRldik7DQo+ ID4gKw0KPiA+ICsgICAgICAgc3dpdGNoIChwZGV2LT5kZXZpY2UpIHsNCj4gPiAgICAgICAgIC8q IFRoZXJlIGlzIGEgWGVvbiBoYXJkd2FyZSBlcnJhdGEgcmVsYXRlZCB0byB3cml0ZXMgdG8gU0RP T1JCRUxMIG9yDQo+ID4gICAgICAgICAgKiBCMkJET09SQkVMTCBpbiBjb25qdW5jdGlvbiB3aXRo IGluYm91bmQgYWNjZXNzIHRvIE5UQiBNTUlPIFNwYWNlLA0KPiA+ICAgICAgICAgICogd2hpY2gg bWF5IGhhbmcgdGhlIHN5c3RlbS4gIFRvIHdvcmthcm91bmQgdGhpcyB1c2UgdGhlIHNlY29uZCBt ZW1vcnkNCj4gPiAgICAgICAgICAqIHdpbmRvdyB0byBhY2Nlc3MgdGhlIGludGVycnVwdCBhbmQg c2NyYXRjaCBwYWQgcmVnaXN0ZXJzIG9uIHRoZQ0KPiA+ICAgICAgICAgICogcmVtb3RlIHN5c3Rl bS4NCj4gPiAgICAgICAgICAqLw0KPiA+IC0gICAgICAgbmRldi0+aHdlcnJfZmxhZ3MgfD0gTlRC X0hXRVJSX1NET09SQkVMTF9MT0NLVVA7DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURf SU5URUxfTlRCX1NTX0pTRjoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9O VEJfUFNfSlNGOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9CMkJf SlNGOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9TU19TTkI6DQo+ ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX1BTX1NOQjoNCj4gPiArICAg ICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfQjJCX1NOQjoNCj4gPiArICAgICAgIGNh c2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfU1NfSVZUOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lf REVWSUNFX0lEX0lOVEVMX05UQl9QU19JVlQ6DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0Vf SURfSU5URUxfTlRCX0IyQl9JVlQ6DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5U RUxfTlRCX1NTX0hTWDoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJf UFNfSFNYOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9CMkJfSFNY Og0KPiA+ICsgICAgICAgICAgICAgICBuZGV2LT5od2Vycl9mbGFncyB8PSBOVEJfSFdFUlJfU0RP T1JCRUxMX0xPQ0tVUDsNCj4gPiArICAgICAgICAgICAgICAgYnJlYWs7DQo+ID4gKyAgICAgICB9 DQo+ID4NCj4gPiArICAgICAgIHN3aXRjaCAocGRldi0+ZGV2aWNlKSB7DQo+ID4gICAgICAgICAv KiBUaGVyZSBpcyBhIGhhcmR3YXJlIGVycmF0YSByZWxhdGVkIHRvIGFjY2Vzc2luZyBhbnkgcmVn aXN0ZXIgaW4NCj4gPiAgICAgICAgICAqIFNCMDFCQVNFIGluIHRoZSBwcmVzZW5jZSBvZiBiaWRp cmVjdGlvbmFsIHRyYWZmaWMgY3Jvc3NpbmcgdGhlIE5UQi4NCj4gPiAgICAgICAgICAqLw0KPiA+ IC0gICAgICAgbmRldi0+aHdlcnJfZmxhZ3MgfD0gTlRCX0hXRVJSX1NCMDFCQVNFX0xPQ0tVUDsN Cj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfU1NfSVZUOg0KPiA+ICsg ICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9QU19JVlQ6DQo+ID4gKyAgICAgICBj YXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX0IyQl9JVlQ6DQo+ID4gKyAgICAgICBjYXNlIFBD SV9ERVZJQ0VfSURfSU5URUxfTlRCX1NTX0hTWDoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklD RV9JRF9JTlRFTF9OVEJfUFNfSFNYOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lO VEVMX05UQl9CMkJfSFNYOg0KPiA+ICsgICAgICAgICAgICAgICBuZGV2LT5od2Vycl9mbGFncyB8 PSBOVEJfSFdFUlJfU0IwMUJBU0VfTE9DS1VQOw0KPiA+ICsgICAgICAgICAgICAgICBicmVhazsN Cj4gPiArICAgICAgIH0NCj4gPg0KPiA+ICsgICAgICAgc3dpdGNoIChwZGV2LT5kZXZpY2UpIHsN Cj4gPiAgICAgICAgIC8qIEhXIEVycmF0YSBvbiBiaXQgMTQgb2YgYjJiZG9vcmJlbGwgcmVnaXN0 ZXIuICBXcml0ZXMgd2lsbCBub3QgYmUNCj4gPiAgICAgICAgICAqIG1pcnJvcmVkIHRvIHRoZSBy ZW1vdGUgc3lzdGVtLiAgU2hyaW5rIHRoZSBudW1iZXIgb2YgYml0cyBieSBvbmUsDQo+ID4gICAg ICAgICAgKiBzaW5jZSBiaXQgMTQgaXMgdGhlIGxhc3QgYml0Lg0KPiA+ICAgICAgICAgICovDQo+ ID4gLSAgICAgICBuZGV2LT5od2Vycl9mbGFncyB8PSBOVEJfSFdFUlJfQjJCRE9PUkJFTExfQklU MTQ7DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX1NTX0pTRjoNCj4g PiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfUFNfSlNGOg0KPiA+ICsgICAg ICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9CMkJfSlNGOg0KPiA+ICsgICAgICAgY2Fz ZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9TU19TTkI6DQo+ID4gKyAgICAgICBjYXNlIFBDSV9E RVZJQ0VfSURfSU5URUxfTlRCX1BTX1NOQjoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9J RF9JTlRFTF9OVEJfQjJCX1NOQjoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRF TF9OVEJfU1NfSVZUOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9Q U19JVlQ6DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX0IyQl9JVlQ6 DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX1NTX0hTWDoNCj4gPiAr ICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfUFNfSFNYOg0KPiA+ICsgICAgICAg Y2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9CMkJfSFNYOg0KPiA+ICsgICAgICAgICAgICAg ICBuZGV2LT5od2Vycl9mbGFncyB8PSBOVEJfSFdFUlJfQjJCRE9PUkJFTExfQklUMTQ7DQo+ID4g KyAgICAgICAgICAgICAgIGJyZWFrOw0KPiA+ICsgICAgICAgfQ0KPiA+DQo+ID4gICAgICAgICBu ZGV2LT5yZWcgPSAmc25iX3JlZzsNCj4gPg0KPiA+IC0gICAgICAgcGRldiA9IG5kZXZfcGRldihu ZGV2KTsNCj4gPiAtDQo+ID4gICAgICAgICByYyA9IHBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYs IFNOQl9QUERfT0ZGU0VULCAmcHBkKTsNCj4gPiAgICAgICAgIGlmIChyYykNCj4gPiAgICAgICAg ICAgICAgICAgcmV0dXJuIC1FSU87DQo+ID4gQEAgLTIwNjIsMTQgKzIwNzYsMTQgQEAgc3RhdGlj IGNvbnN0IHN0cnVjdCBpbnRlbF9udGJfeGxhdF9yZWcgc25iX3ByaV94bGF0ID0gew0KPiA+ICAg ICAgICAgICogd2luZG93IGJ5IHNldHRpbmcgdGhlIGxpbWl0IGVxdWFsIHRvIGJhc2UsIG5vciBj YW4gaXQgbGltaXQgdGhlIHNpemUNCj4gPiAgICAgICAgICAqIG9mIHRoZSBtZW1vcnkgd2luZG93 IGJ5IHNldHRpbmcgdGhlIGxpbWl0IHRvIGJhc2UgKyBzaXplLg0KPiA+ICAgICAgICAgICovDQo+ ID4gLSAgICAgICAuYmFyMl9saW1pdCAgICAgICAgICAgICA9IFNOQl9QQkFSMkxNVF9PRkZTRVQs DQo+ID4gLSAgICAgICAuYmFyMl94bGF0ICAgICAgICAgICAgICA9IFNOQl9QQkFSMlhMQVRfT0ZG U0VULA0KPiA+ICsgICAgICAgLmJhcjJfbGltaXQgICAgICAgICAgICAgPSBTTkJfUEJBUjIzTE1U X09GRlNFVCwNCj4gPiArICAgICAgIC5iYXIyX3hsYXQgICAgICAgICAgICAgID0gU05CX1BCQVIy M1hMQVRfT0ZGU0VULA0KPiA+ICB9Ow0KPiA+DQo+ID4gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50 ZWxfbnRiX3hsYXRfcmVnIHNuYl9zZWNfeGxhdCA9IHsNCj4gPiAgICAgICAgIC5iYXIwX2Jhc2Ug ICAgICAgICAgICAgID0gU05CX1NCQVIwQkFTRV9PRkZTRVQsDQo+ID4gLSAgICAgICAuYmFyMl9s aW1pdCAgICAgICAgICAgICA9IFNOQl9TQkFSMkxNVF9PRkZTRVQsDQo+ID4gLSAgICAgICAuYmFy Ml94bGF0ICAgICAgICAgICAgICA9IFNOQl9TQkFSMlhMQVRfT0ZGU0VULA0KPiA+ICsgICAgICAg LmJhcjJfbGltaXQgICAgICAgICAgICAgPSBTTkJfU0JBUjIzTE1UX09GRlNFVCwNCj4gPiArICAg ICAgIC5iYXIyX3hsYXQgICAgICAgICAgICAgID0gU05CX1NCQVIyM1hMQVRfT0ZGU0VULA0KPiA+ ICB9Ow0KPiA+DQo+ID4gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfYjJiX2FkZHIgc25iX2Iy Yl91c2RfYWRkciA9IHsNCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9udGIvaHcvaW50ZWwvbnRi X2h3X2ludGVsLmggYi9kcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdfaW50ZWwuaA0KPiA+IGlu ZGV4IDAyMjRiMWEuLmZlYzY4OWQgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy9udGIvaHcvaW50 ZWwvbnRiX2h3X2ludGVsLmgNCj4gPiArKysgYi9kcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdf aW50ZWwuaA0KPiA+IEBAIC03MCwxMSArNzAsMjcgQEANCj4gPg0KPiA+ICAvKiBTTkIgaGFyZHdh cmUgKGFuZCBKU0YsIElWVCwgSFNYKSAqLw0KPiA+DQo+ID4gLSNkZWZpbmUgU05CX1BCQVIyTE1U X09GRlNFVCAgICAgICAgICAgIDB4MDAwMA0KPiA+IC0jZGVmaW5lIFNOQl9QQkFSMlhMQVRfT0ZG U0VUICAgICAgICAgICAweDAwMTANCj4gPiAtI2RlZmluZSBTTkJfU0JBUjJMTVRfT0ZGU0VUICAg ICAgICAgICAgMHgwMDIwDQo+ID4gLSNkZWZpbmUgU05CX1NCQVIyWExBVF9PRkZTRVQgICAgICAg ICAgIDB4MDAzMA0KPiA+ICsjZGVmaW5lIFNOQl9QQkFSMjNMTVRfT0ZGU0VUICAgICAgICAgICAw eDAwMDANCj4gPiArI2RlZmluZSBTTkJfUEJBUjQ1TE1UX09GRlNFVCAgICAgICAgICAgMHgwMDA4 DQo+ID4gKyNkZWZpbmUgU05CX1BCQVI0TE1UX09GRlNFVCAgICAgICAgICAgIDB4MDAwOA0KPiA+ ICsjZGVmaW5lIFNOQl9QQkFSNUxNVF9PRkZTRVQgICAgICAgICAgICAweDAwMGMNCj4gPiArI2Rl ZmluZSBTTkJfUEJBUjIzWExBVF9PRkZTRVQgICAgICAgICAgMHgwMDEwDQo+ID4gKyNkZWZpbmUg U05CX1BCQVI0NVhMQVRfT0ZGU0VUICAgICAgICAgIDB4MDAxOA0KPiA+ICsjZGVmaW5lIFNOQl9Q QkFSNFhMQVRfT0ZGU0VUICAgICAgICAgICAweDAwMTgNCj4gPiArI2RlZmluZSBTTkJfUEJBUjVY TEFUX09GRlNFVCAgICAgICAgICAgMHgwMDFjDQo+ID4gKyNkZWZpbmUgU05CX1NCQVIyM0xNVF9P RkZTRVQgICAgICAgICAgIDB4MDAyMA0KPiA+ICsjZGVmaW5lIFNOQl9TQkFSNDVMTVRfT0ZGU0VU ICAgICAgICAgICAweDAwMjgNCj4gPiArI2RlZmluZSBTTkJfU0JBUjRMTVRfT0ZGU0VUICAgICAg ICAgICAgMHgwMDI4DQo+ID4gKyNkZWZpbmUgU05CX1NCQVI1TE1UX09GRlNFVCAgICAgICAgICAg IDB4MDAyYw0KPiA+ICsjZGVmaW5lIFNOQl9TQkFSMjNYTEFUX09GRlNFVCAgICAgICAgICAweDAw MzANCj4gPiArI2RlZmluZSBTTkJfU0JBUjQ1WExBVF9PRkZTRVQgICAgICAgICAgMHgwMDM4DQo+ ID4gKyNkZWZpbmUgU05CX1NCQVI0WExBVF9PRkZTRVQgICAgICAgICAgIDB4MDAzOA0KPiA+ICsj ZGVmaW5lIFNOQl9TQkFSNVhMQVRfT0ZGU0VUICAgICAgICAgICAweDAwM2MNCj4gPiAgI2RlZmlu ZSBTTkJfU0JBUjBCQVNFX09GRlNFVCAgICAgICAgICAgMHgwMDQwDQo+ID4gKyNkZWZpbmUgU05C X1NCQVIyM0JBU0VfT0ZGU0VUICAgICAgICAgIDB4MDA0OA0KPiA+ICsjZGVmaW5lIFNOQl9TQkFS NDVCQVNFX09GRlNFVCAgICAgICAgICAweDAwNTANCj4gPiArI2RlZmluZSBTTkJfU0JBUjRCQVNF X09GRlNFVCAgICAgICAgICAgMHgwMDUwDQo+ID4gKyNkZWZpbmUgU05CX1NCQVI1QkFTRV9PRkZT RVQgICAgICAgICAgIDB4MDA1NA0KPiA+ICAjZGVmaW5lIFNOQl9TQkRGX09GRlNFVCAgICAgICAg ICAgICAgICAgICAgICAgIDB4MDA1Yw0KPiA+ICAjZGVmaW5lIFNOQl9OVEJDTlRMX09GRlNFVCAg ICAgICAgICAgICAweDAwNTgNCj4gPiAgI2RlZmluZSBTTkJfUERPT1JCRUxMX09GRlNFVCAgICAg ICAgICAgMHgwMDYwDQo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbnRiL250Yl90cmFuc3BvcnQu YyBiL2RyaXZlcnMvbnRiL250Yl90cmFuc3BvcnQuYw0KPiA+IGluZGV4IGYxZWQxYjcuLmJiMmVi ODUgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy9udGIvbnRiX3RyYW5zcG9ydC5jDQo+ID4gKysr IGIvZHJpdmVycy9udGIvbnRiX3RyYW5zcG9ydC5jDQo+ID4gQEAgLTIwNCw4ICsyMDQsOCBAQCBz dHJ1Y3QgbnRiX3RyYW5zcG9ydF9jdHggew0KPiA+DQo+ID4gICAgICAgICBib29sIGxpbmtfaXNf dXA7DQo+ID4gICAgICAgICBzdHJ1Y3QgZGVsYXllZF93b3JrIGxpbmtfd29yazsNCj4gPiAtICAg ICAgIHN0cnVjdCB3b3JrX3N0cnVjdCBkYl93b3JrOw0KPiA+ICAgICAgICAgc3RydWN0IHdvcmtf c3RydWN0IGxpbmtfY2xlYW51cDsNCj4gPiArICAgICAgIHN0cnVjdCB0YXNrbGV0X3N0cnVjdCBk Yl93b3JrOw0KPiA+ICB9Ow0KPiA+DQo+ID4gIGVudW0gew0KPiA+IEBAIC0yNDEsNyArMjQxLDcg QEAgZW51bSB7DQo+ID4gICNkZWZpbmUgTlRCX1FQX0RFRl9OVU1fRU5UUklFUyAxMDANCj4gPiAg I2RlZmluZSBOVEJfTElOS19ET1dOX1RJTUVPVVQgIDEwDQo+ID4NCj4gPiAtc3RhdGljIHZvaWQg bnRiX3RyYW5zcG9ydF9kb29yYmVsbF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd3MpOw0KPiA+ ICtzdGF0aWMgdm9pZCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX3dvcmsodW5zaWduZWQgbG9uZyBk YXRhKTsNCj4gPiAgc3RhdGljIGNvbnN0IHN0cnVjdCBudGJfY3R4X29wcyBudGJfdHJhbnNwb3J0 X29wczsNCj4gPiAgc3RhdGljIHN0cnVjdCBudGJfY2xpZW50IG50Yl90cmFuc3BvcnRfY2xpZW50 Ow0KPiA+DQo+ID4gQEAgLTEwMDIsOCArMTAwMiw5IEBAIHN0YXRpYyBpbnQgbnRiX3RyYW5zcG9y dF9wcm9iZShzdHJ1Y3QgbnRiX2NsaWVudCAqc2VsZiwgc3RydWN0IG50Yl9kZXYgKm5kZXYpDQo+ ID4gICAgICAgICB9DQo+ID4NCj4gPiAgICAgICAgIElOSVRfREVMQVlFRF9XT1JLKCZudC0+bGlu a193b3JrLCBudGJfdHJhbnNwb3J0X2xpbmtfd29yayk7DQo+ID4gLSAgICAgICBJTklUX1dPUkso Jm50LT5kYl93b3JrLCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX3dvcmspOw0KPiA+ICAgICAgICAg SU5JVF9XT1JLKCZudC0+bGlua19jbGVhbnVwLCBudGJfdHJhbnNwb3J0X2xpbmtfY2xlYW51cF93 b3JrKTsNCj4gPiArICAgICAgIHRhc2tsZXRfaW5pdCgmbnQtPmRiX3dvcmssIG50Yl90cmFuc3Bv cnRfZG9vcmJlbGxfd29yaywNCj4gPiArICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9u ZyludCk7DQo+ID4NCj4gPiAgICAgICAgIHJjID0gbnRiX3NldF9jdHgobmRldiwgbnQsICZudGJf dHJhbnNwb3J0X29wcyk7DQo+ID4gICAgICAgICBpZiAocmMpDQo+ID4gQEAgLTEwNDQsNyArMTA0 NSw3IEBAIHN0YXRpYyB2b2lkIG50Yl90cmFuc3BvcnRfZnJlZShzdHJ1Y3QgbnRiX2NsaWVudCAq c2VsZiwgc3RydWN0IG50Yl9kZXYgKm5kZXYpDQo+ID4gICAgICAgICBpbnQgaTsNCj4gPg0KPiA+ ICAgICAgICAgbnRiX3RyYW5zcG9ydF9saW5rX2NsZWFudXAobnQpOw0KPiA+IC0gICAgICAgY2Fu Y2VsX3dvcmtfc3luYygmbnQtPmRiX3dvcmspOw0KPiA+ICsgICAgICAgdGFza2xldF9kaXNhYmxl KCZudC0+ZGJfd29yayk7DQo+ID4gICAgICAgICBjYW5jZWxfd29ya19zeW5jKCZudC0+bGlua19j bGVhbnVwKTsNCj4gPiAgICAgICAgIGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmbnQtPmxpbmtf d29yayk7DQo+ID4NCj4gPiBAQCAtMTg1MCwxMCArMTg1MSw5IEBAIHVuc2lnbmVkIGludCBudGJf dHJhbnNwb3J0X21heF9zaXplKHN0cnVjdCBudGJfdHJhbnNwb3J0X3FwICpxcCkNCj4gPiAgfQ0K PiA+ICBFWFBPUlRfU1lNQk9MX0dQTChudGJfdHJhbnNwb3J0X21heF9zaXplKTsNCj4gPg0KPiA+ IC1zdGF0aWMgdm9pZCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX3dvcmsoc3RydWN0IHdvcmtfc3Ry dWN0ICp3b3JrKQ0KPiA+ICtzdGF0aWMgdm9pZCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX3dvcmso dW5zaWduZWQgbG9uZyBkYXRhKQ0KPiA+ICB7DQo+ID4gLSAgICAgICBzdHJ1Y3QgbnRiX3RyYW5z cG9ydF9jdHggKm50ID0gY29udGFpbmVyX29mKHdvcmssDQo+ID4gLSAgICAgICAgICAgICAgICAg ICAgICAgc3RydWN0IG50Yl90cmFuc3BvcnRfY3R4LCBkYl93b3JrKTsNCj4gPiArICAgICAgIHN0 cnVjdCBudGJfdHJhbnNwb3J0X2N0eCAqbnQgPSAodm9pZCAqKWRhdGE7DQo+ID4gICAgICAgICBz dHJ1Y3QgbnRiX3RyYW5zcG9ydF9xcCAqcXA7DQo+ID4gICAgICAgICB1NjQgZGJfbWFzaywgZGJf Yml0cywgZGJfYWdhaW47DQo+ID4gICAgICAgICB1bnNpZ25lZCBpbnQgcXBfbnVtOw0KPiA+IEBA IC0xODkwLDcgKzE4OTAsNyBAQCBzdGF0aWMgdm9pZCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX2Nh bGxiYWNrKHZvaWQgKmRhdGEsIGludCB2ZWN0b3IpDQo+ID4NCj4gPiAgICAgICAgIG50Yl9kYl9z ZXRfbWFzayhudC0+bmRldiwgbnRiX2RiX3ZhbGlkX21hc2sobnQtPm5kZXYpKTsNCj4gPg0KPiA+ IC0gICAgICAgc2NoZWR1bGVfd29yaygmbnQtPmRiX3dvcmspOw0KPiA+ICsgICAgICAgdGFza2xl dF9zY2hlZHVsZSgmbnQtPmRiX3dvcmspOw0KPiA+ICB9DQo+ID4NCj4gPiAgc3RhdGljIGNvbnN0 IHN0cnVjdCBudGJfY3R4X29wcyBudGJfdHJhbnNwb3J0X29wcyA9IHsNCj4gPiAtLQ0KPiA+IDIu NC4wLnJjMC40My5nY2Y4YThjNg0KPiA+DQo+ID4gLS0NCj4gPiBUbyB1bnN1YnNjcmliZSBmcm9t IHRoaXMgbGlzdDogc2VuZCB0aGUgbGluZSAidW5zdWJzY3JpYmUgbGludXgtcGNpIiBpbg0KPiA+ IHRoZSBib2R5IG9mIGEgbWVzc2FnZSB0byBtYWpvcmRvbW9Admdlci5rZXJuZWwub3JnDQo+ID4g TW9yZSBtYWpvcmRvbW8gaW5mbyBhdCAgaHR0cDovL3ZnZXIua2VybmVsLm9yZy9tYWpvcmRvbW8t aW5mby5odG1sDQo=

#15 lore raw

RE: [PATCH 04/16] Check the DID for certain workaround error flags to be set.

RnJvbTogbGludXgtbnRiQGdvb2dsZWdyb3Vwcy5jb20gW21haWx0bzpsaW51eC1udGJAZ29vZ2xl Z3JvdXBzLmNvbV0gT24gQmVoYWxmIE9mIEppYW5nLCBEYXZlDQo+IE9uIFdlZCwgMjAxNS0wNS0y MCBhdCAxNjoxMSAtMDUwMCwgQmpvcm4gSGVsZ2FhcyB3cm90ZToNCj4gPiBPbiBXZWQsIE1heSAy MCwgMjAxNSBhdCAxMDo0MSBBTSwgQWxsZW4gSHViYmUgPEFsbGVuLkh1YmJlQGVtYy5jb20+DQo+ IHdyb3RlOg0KPiA+ID4gRnJvbTogRGF2ZSBKaWFuZyA8ZGF2ZS5qaWFuZ0BpbnRlbC5jb20+DQo+ ID4gPg0KPiA+ID4gU2lnbmVkLW9mZi1ieTogRGF2ZSBKaWFuZyA8ZGF2ZS5qaWFuZ0BpbnRlbC5j b20+DQo+ID4NCj4gPiBOZWVkcyBhIHRvcGljIGluIHRoZSBzdWJqZWN0IGxpbmUgYW5kIGEgY2hh bmdlbG9nLg0KPiA+DQo+ID4gSXQgYWxzbyBzZWVtcyB0byBkbyBhIGxvdCBtb3JlIHRoYW4ganVz dCBjaGVja2luZyBkZXZpY2UgSUQgKEkgYXNzdW1lDQo+ID4gdGhhdCdzIHdoYXQgIkRJRCIgbWVh bnMpLCBzbyB0aGlzIHNob3VsZCBwcm9iYWJseSBiZSBzcGxpdCBpbnRvDQo+ID4gc2V2ZXJhbCBw YXRjaGVzIHRoYXQgZWFjaCBkbyBvbmUgdGhpbmcuICBJIHNlZSBhdCBsZWFzdDoNCj4gPg0KPiA+ ICAgLSBjb3NtZXRpYyBjb2RlIHJlc3RydWN0dXJpbmcNCj4gPiAgIC0gd29ya19zdHJ1Y3QvdGFz a2xldF9zdHJ1Y3QgY2hhbmdlcw0KPiA+ICAgLSBuZXcgI2RlZmluZXMgYW5kIGJhcjJfb2ZmKCkg Y2hhbmdlcw0KPiANCj4gSSB0aGluayB0aGlzIHBhdGNoIGdvdCBtYW5nbGVkIHdpdGggY291cGxl IG90aGVyIHBhdGNoZXMuIEFsbGVuPw0KDQpZZXMsIHRoZXJlIHdpbGwgYmUgYSB2MiB0byBmaXgg dGhlIG1hbmdsaW5nLiAgVGhlIGNvZGUgcmVzdHJ1Y3R1cmluZyBpcyBtZWFudCBmb3IgYSBkaWZm ZXJlbnQgcGF0Y2guDQoNClRoaXMgaXMgYWxsIHRoYXQgaXMgbWVhbnQgdG8gY2hhbmdlIGluIHRo aXMgcGF0Y2g6DQoNCj4gPiA+IEBAIC0xNzQ3LDI5ICsxNzIyLDY4IEBAIHN0YXRpYyBpbnQgc25i X2luaXRfZGV2KHN0cnVjdCBpbnRlbF9udGJfZGV2DQo+ICpuZGV2KQ0KPiA+ID4gICAgICAgICB1 OCBwcGQ7DQo+ID4gPiAgICAgICAgIGludCByYywgbWVtOw0KPiA+ID4NCj4gPiA+ICsgICAgICAg cGRldiA9IG5kZXZfcGRldihuZGV2KTsNCj4gPiA+ICsNCj4gPiA+ICsgICAgICAgc3dpdGNoIChw ZGV2LT5kZXZpY2UpIHsNCj4gPiA+ICAgICAgICAgLyogVGhlcmUgaXMgYSBYZW9uIGhhcmR3YXJl IGVycmF0YSByZWxhdGVkIHRvIHdyaXRlcyB0bw0KPiBTRE9PUkJFTEwgb3INCj4gPiA+ICAgICAg ICAgICogQjJCRE9PUkJFTEwgaW4gY29uanVuY3Rpb24gd2l0aCBpbmJvdW5kIGFjY2VzcyB0byBO VEINCj4gTU1JTyBTcGFjZSwNCj4gPiA+ICAgICAgICAgICogd2hpY2ggbWF5IGhhbmcgdGhlIHN5 c3RlbS4gIFRvIHdvcmthcm91bmQgdGhpcyB1c2UgdGhlDQo+IHNlY29uZCBtZW1vcnkNCj4gPiA+ ICAgICAgICAgICogd2luZG93IHRvIGFjY2VzcyB0aGUgaW50ZXJydXB0IGFuZCBzY3JhdGNoIHBh ZCByZWdpc3RlcnMNCj4gb24gdGhlDQo+ID4gPiAgICAgICAgICAqIHJlbW90ZSBzeXN0ZW0uDQo+ ID4gPiAgICAgICAgICAqLw0KPiA+ID4gLSAgICAgICBuZGV2LT5od2Vycl9mbGFncyB8PSBOVEJf SFdFUlJfU0RPT1JCRUxMX0xPQ0tVUDsNCj4gPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lE X0lOVEVMX05UQl9TU19KU0Y6DQo+ID4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRF TF9OVEJfUFNfSlNGOg0KPiA+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRC X0IyQl9KU0Y6DQo+ID4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfU1Nf U05COg0KPiA+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX1BTX1NOQjoN Cj4gPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9CMkJfU05COg0KPiA+ ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX1NTX0lWVDoNCj4gPiA+ICsg ICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9QU19JVlQ6DQo+ID4gPiArICAgICAg IGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfQjJCX0lWVDoNCj4gPiA+ICsgICAgICAgY2Fz ZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9TU19IU1g6DQo+ID4gPiArICAgICAgIGNhc2UgUENJ X0RFVklDRV9JRF9JTlRFTF9OVEJfUFNfSFNYOg0KPiA+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJ Q0VfSURfSU5URUxfTlRCX0IyQl9IU1g6DQo+ID4gPiArICAgICAgICAgICAgICAgbmRldi0+aHdl cnJfZmxhZ3MgfD0gTlRCX0hXRVJSX1NET09SQkVMTF9MT0NLVVA7DQo+ID4gPiArICAgICAgICAg ICAgICAgYnJlYWs7DQo+ID4gPiArICAgICAgIH0NCj4gPiA+DQo+ID4gPiArICAgICAgIHN3aXRj aCAocGRldi0+ZGV2aWNlKSB7DQo+ID4gPiAgICAgICAgIC8qIFRoZXJlIGlzIGEgaGFyZHdhcmUg ZXJyYXRhIHJlbGF0ZWQgdG8gYWNjZXNzaW5nIGFueQ0KPiByZWdpc3RlciBpbg0KPiA+ID4gICAg ICAgICAgKiBTQjAxQkFTRSBpbiB0aGUgcHJlc2VuY2Ugb2YgYmlkaXJlY3Rpb25hbCB0cmFmZmlj DQo+IGNyb3NzaW5nIHRoZSBOVEIuDQo+ID4gPiAgICAgICAgICAqLw0KPiA+ID4gLSAgICAgICBu ZGV2LT5od2Vycl9mbGFncyB8PSBOVEJfSFdFUlJfU0IwMUJBU0VfTE9DS1VQOw0KPiA+ID4gKyAg ICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX1NTX0lWVDoNCj4gPiA+ICsgICAgICAg Y2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9QU19JVlQ6DQo+ID4gPiArICAgICAgIGNhc2Ug UENJX0RFVklDRV9JRF9JTlRFTF9OVEJfQjJCX0lWVDoNCj4gPiA+ICsgICAgICAgY2FzZSBQQ0lf REVWSUNFX0lEX0lOVEVMX05UQl9TU19IU1g6DQo+ID4gPiArICAgICAgIGNhc2UgUENJX0RFVklD RV9JRF9JTlRFTF9OVEJfUFNfSFNYOg0KPiA+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURf SU5URUxfTlRCX0IyQl9IU1g6DQo+ID4gPiArICAgICAgICAgICAgICAgbmRldi0+aHdlcnJfZmxh Z3MgfD0gTlRCX0hXRVJSX1NCMDFCQVNFX0xPQ0tVUDsNCj4gPiA+ICsgICAgICAgICAgICAgICBi cmVhazsNCj4gPiA+ICsgICAgICAgfQ0KPiA+ID4NCj4gPiA+ICsgICAgICAgc3dpdGNoIChwZGV2 LT5kZXZpY2UpIHsNCj4gPiA+ICAgICAgICAgLyogSFcgRXJyYXRhIG9uIGJpdCAxNCBvZiBiMmJk b29yYmVsbCByZWdpc3Rlci4gIFdyaXRlcyB3aWxsDQo+IG5vdCBiZQ0KPiA+ID4gICAgICAgICAg KiBtaXJyb3JlZCB0byB0aGUgcmVtb3RlIHN5c3RlbS4gIFNocmluayB0aGUgbnVtYmVyIG9mIGJp dHMNCj4gYnkgb25lLA0KPiA+ID4gICAgICAgICAgKiBzaW5jZSBiaXQgMTQgaXMgdGhlIGxhc3Qg Yml0Lg0KPiA+ID4gICAgICAgICAgKi8NCj4gPiA+IC0gICAgICAgbmRldi0+aHdlcnJfZmxhZ3Mg fD0gTlRCX0hXRVJSX0IyQkRPT1JCRUxMX0JJVDE0Ow0KPiA+ID4gKyAgICAgICBjYXNlIFBDSV9E RVZJQ0VfSURfSU5URUxfTlRCX1NTX0pTRjoNCj4gPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNF X0lEX0lOVEVMX05UQl9QU19KU0Y6DQo+ID4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9J TlRFTF9OVEJfQjJCX0pTRjoNCj4gPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVM X05UQl9TU19TTkI6DQo+ID4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJf UFNfU05COg0KPiA+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX0IyQl9T TkI6DQo+ID4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfU1NfSVZUOg0K PiA+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX1BTX0lWVDoNCj4gPiA+ ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9CMkJfSVZUOg0KPiA+ID4gKyAg ICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX1NTX0hTWDoNCj4gPiA+ICsgICAgICAg Y2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9QU19IU1g6DQo+ID4gPiArICAgICAgIGNhc2Ug UENJX0RFVklDRV9JRF9JTlRFTF9OVEJfQjJCX0hTWDoNCj4gPiA+ICsgICAgICAgICAgICAgICBu ZGV2LT5od2Vycl9mbGFncyB8PSBOVEJfSFdFUlJfQjJCRE9PUkJFTExfQklUMTQ7DQo+ID4gPiAr ICAgICAgICAgICAgICAgYnJlYWs7DQo+ID4gPiArICAgICAgIH0NCj4gPiA+DQo+ID4gPiAgICAg ICAgIG5kZXYtPnJlZyA9ICZzbmJfcmVnOw0KPiA+ID4NCj4gPiA+IC0gICAgICAgcGRldiA9IG5k ZXZfcGRldihuZGV2KTsNCj4gPiA+IC0NCj4gPiA+ICAgICAgICAgcmMgPSBwY2lfcmVhZF9jb25m aWdfYnl0ZShwZGV2LCBTTkJfUFBEX09GRlNFVCwgJnBwZCk7DQo+ID4gPiAgICAgICAgIGlmIChy YykNCj4gPiA+ICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTzsNCg==

#16 lore raw

PATCH 5/16 Intel NTB params for snb b2b addresses

In reply to Allen Hubbe

Add module parameters for the addresses to be used in b2b topology.

---
 Documentation/ntb.txt               | 10 +++++
 drivers/ntb/hw/intel/ntb_hw_intel.c | 77 ++++++++++++++++++++++++++++---------
 2 files changed, 68 insertions(+), 19 deletions(-)
Documentation/ntb.txt +10 -0
index 725ba1e..00a3f92 100644
@@ -56,3 +56,13 @@ Module Parameters:
 * 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.
+* snb\_b2b\_usd\_bar2\_addr64 - If using B2B topology on Xeon hardware, use this
+	64 bit address on the bus between the NTB devices for the window at
+	BAR2, on the upstream side of the link.
+* snb\_b2b\_usd\_bar4\_addr64 - See *snb\_b2b\_bar2\_addr64*.
+* snb\_b2b\_usd\_bar4\_addr32 - See *snb\_b2b\_bar2\_addr64*.
+* snb\_b2b\_usd\_bar5\_addr32 - See *snb\_b2b\_bar2\_addr64*.
+* snb\_b2b\_dsd\_bar2\_addr64 - See *snb\_b2b\_bar2\_addr64*.
+* snb\_b2b\_dsd\_bar4\_addr64 - See *snb\_b2b\_bar2\_addr64*.
+* snb\_b2b\_dsd\_bar4\_addr32 - See *snb\_b2b\_bar2\_addr64*.
+* snb\_b2b\_dsd\_bar5\_addr32 - See *snb\_b2b\_bar2\_addr64*.
drivers/ntb/hw/intel/ntb_hw_intel.c +58 -19

106 lines not on this page · raw message

Signature · 1 line
2.4.0.rc0.43.gcf8a8c6
#17 lore raw

PATCH 6/16 NTB Pingpong Client

In reply to Allen Hubbe

This is a simple pingpong driver that exercises the scratchpads and doorbells of the ntb hardware. This driver may be used to test that your ntb hardware and drivers are functioning at a basic level.

---
 Documentation/ntb.txt           |  27 +++++
 MAINTAINERS                     |   1 +
 drivers/ntb/Kconfig             |   2 +
 drivers/ntb/Makefile            |   2 +-
 drivers/ntb/test/Kconfig        |   9 ++
 drivers/ntb/test/Makefile       |   1 +
 drivers/ntb/test/ntb_pingpong.c | 251 ++++++++++++++++++++++++++++++++++++++++
 7 files changed, 292 insertions(+), 1 deletion(-)
 create mode 100644 drivers/ntb/test/Kconfig
 create mode 100644 drivers/ntb/test/Makefile
 create mode 100644 drivers/ntb/test/ntb_pingpong.c
Documentation/ntb.txt +27 -0
index 00a3f92..e5d1591 100644
@@ -37,6 +37,33 @@ 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 Ping Pong Test Client (ntb\_pingpong)
+
+The Ping Pong test client serves as a demonstration to exercise the doorbell
+and scratchpad registers of NTB hardware, and as an example simple NTB client.
+Ping Pong enables the link when started, waits for the NTB link to come up, and
+then proceeds to read and write the doorbell scratchpad registers of the NTB.
+The peers interrupt each other using a bit mask of doorbell bits, which is
+shifted by one in each round, to test the behavior of multiple doorbell bits
+and interrupt vectors.  The Ping Pong driver also reads the first local
+scratchpad, and writes the value plus one to the first peer scratchpad, each
+round before writing the peer doorbell register.
+
+Module Parameters:
+
+* unsafe - Some hardware has known issues with scratchpad and doorbell
+	registers.  By default, Ping Pong will not attempt to exercise such
+	hardware.  You may override this behavior at your own risk by setting
+	unsafe=1.
+* delay\_ms - Specify the delay between receiving a doorbell
+	interrupt event and setting the peer doorbell register for the next
+	round.
+* init\_db - Specify the doorbell bits to start new series of rounds.  A new
+	series begins once all the doorbell bits have been shifted out of
+	range.
+* dyndbg - It is suggested to specify dyndbg=+p when loading this module, and
+	then to observe debugging output on the console.
+
 ## NTB Hardware Drivers
 
 NTB hardware drivers should register devices with the NTB core driver.  After
MAINTAINERS +1 -0
index 2560e18..cbc9d3d 100644
@@ -6952,6 +6952,7 @@ T:	git git://github.com/jonmason/ntb.git
 F:	drivers/ntb/
 F:	drivers/net/ntb_netdev.c
 F:	drivers/ntb/ntb.c
+F:	drivers/ntb/ntb_pingpong.c
 F:	drivers/ntb/ntb_transport.c
 F:	include/linux/ntb.h
 F:	include/linux/ntb_transport.h
drivers/ntb/Kconfig +2 -0
index 988b03d..c137eb7 100644
@@ -14,6 +14,8 @@ if NTB
 
 source "drivers/ntb/hw/Kconfig"
 
+source "drivers/ntb/test/Kconfig"
+
 config NTB_TRANSPORT
        tristate "NTB Transport Client"
        depends on NTB
drivers/ntb/Makefile +1 -1
index 671c4e6..c2d2982 100644
@@ -1,3 +1,3 @@
-obj-y += hw/
+obj-y += hw/ test/
 obj-$(CONFIG_NTB) += ntb.o
 obj-$(CONFIG_NTB_TRANSPORT) += ntb_transport.o
drivers/ntb/test/Kconfig new file +9 -0
new file mode 100644
index 0000000..9b81c4c
@@ -0,0 +1,9 @@
+config NTB_PINGPONG
+       tristate "NTB Simple Ping Pong Client"
+       depends on NTB
+       help
+        This is a simple ping pong driver that exercises the scratchpads and
+        doorbells of the ntb hardware.  This driver may be used to test that
+        your ntb hardware and drivers are functioning at a basic level.
+
+        If unsure, say N.
drivers/ntb/test/Makefile new file +1 -0
new file mode 100644
index 0000000..b323093
@@ -0,0 +1 @@
+obj-$(CONFIG_NTB_PINGPONG) += ntb_pingpong.o
drivers/ntb/test/ntb_pingpong.c new file +251 -0

251 lines not on this page · raw message

Signature · 1 line
2.4.0.rc0.43.gcf8a8c6
#18 lore raw

Re: [PATCH 06/16] NTB Pingpong Client

Similar nit as for 2/6.

Quoted 12 lines · Allen Hubbe
drivers/ntb/Kconfig +2 -0
@@ -14,6 +14,8 @@ if NTB
 
 source "drivers/ntb/hw/Kconfig"
 
+source "drivers/ntb/test/Kconfig"
+
 config NTB_TRANSPORT
 

drivers/ntb/test/Kconfig line 3

Quoted 4 lines
drivers/ntb/test/Kconfig new file +3 -0
 
+config NTB_PINGPONG
+       tristate "NTB Simple Ping Pong Client"
+       depends on NTB

Again, superfluous dependency.

drivers/ntb/test/Kconfig line 9

Quoted 6 lines
drivers/ntb/test/Kconfig new file +6 -0
+       help
+        This is a simple ping pong driver that exercises the scratchpads and
+        doorbells of the ntb hardware.  This driver may be used to test that
+        your ntb hardware and drivers are functioning at a basic level.
+
+        If unsure, say N.

Thanks,

Paul Bolle

#19 lore raw

PATCH 7/16 NTB Tool Client

In reply to Allen Hubbe

This is a simple debugging driver that enables the doorbell and scratchpad registers to be read and written from the debugfs. This tool enables more complicated debugging to be scripted from user space. This driver may be used to test that your ntb hardware and drivers are functioning at a basic level.

---
 Documentation/ntb.txt       |  32 +++
 MAINTAINERS                 |   1 +
 drivers/ntb/test/Kconfig    |  12 +
 drivers/ntb/test/Makefile   |   1 +
 drivers/ntb/test/ntb_tool.c | 557 ++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 603 insertions(+)
 create mode 100644 drivers/ntb/test/ntb_tool.c
Documentation/ntb.txt +32 -0
index e5d1591..b48249a 100644
@@ -64,6 +64,38 @@ Module Parameters:
 * dyndbg - It is suggested to specify dyndbg=+p when loading this module, and
 	then to observe debugging output on the console.
 
+### NTB Tool Test Client (ntb\_tool)
+
+The Tool test client serves for debugging, primarily, ntb hardware and drivers.
+The Tool provides access through debugfs for reading, setting, and clearing the
+NTB doorbell, and reading and writing scratchpads.
+
+The Tool does not currently have any module parameters.
+
+Debugfs Files:
+
+* *debugfs*/ntb\_tool/*hw*/ - A directory in debugfs will be created for each
+	NTB device probed by the tool.  This directory is shortened to *hw*
+	below.
+* *hw*/db - This file is used to read, set, and clear the local doorbell.  Not
+	all operations may be supported by all hardware.  To read the doorbell,
+	read the file.  To set the doorbell, write `s` followed by the bits to
+	set (eg: `echo 's 0x0101' > db`).  To clear the doorbell, write `c`
+	followed by the bits to clear.
+* *hw*/mask - This file is used to read, set, and clear the local doorbell mask.
+	See *db* for details.
+* *hw*/peer\_db - This file is used to read, set, and clear the peer doorbell.
+	See *db* for details.
+* *hw*/peer\_mask - This file is used to read, set, and clear the peer doorbell
+	mask.  See *db* for details.
+* *hw*/spad - This file is used to read and write local scratchpads.  To read
+	the values of all scratchpads, read the file.  To write values, write a
+	series of pairs of scratchpad number and value
+	(eg: `echo '4 0x123 7 0xabc' > spad`
+	# to set scratchpads `4` and `7` to `0x123` and `0xabc`, respectively).
+* *hw*/peer\_spad - This file is used to read and write peer scratchpads.  See
+	*spad* for details.
+
 ## NTB Hardware Drivers
 
 NTB hardware drivers should register devices with the NTB core driver.  After
MAINTAINERS +1 -0
index cbc9d3d..dccfe82 100644
@@ -6953,6 +6953,7 @@ F:	drivers/ntb/
 F:	drivers/net/ntb_netdev.c
 F:	drivers/ntb/ntb.c
 F:	drivers/ntb/ntb_pingpong.c
+F:	drivers/ntb/ntb_tool.c
 F:	drivers/ntb/ntb_transport.c
 F:	include/linux/ntb.h
 F:	include/linux/ntb_transport.h
drivers/ntb/test/Kconfig +12 -0
index 9b81c4c..413829c 100644
@@ -7,3 +7,15 @@ config NTB_PINGPONG
         your ntb hardware and drivers are functioning at a basic level.
 
         If unsure, say N.
+
+config NTB_TOOL
+       tristate "NTB Debugging Tool Client"
+       depends on NTB
+       help
+	This is a simple debugging driver that enables the doorbell and
+	scratchpad registers to be read and written from the debugfs.  This
+	enables more complicated debugging to be scripted from user space.
+	This driver may be used to test that your ntb hardware and drivers are
+	functioning at a basic level.
+
+        If unsure, say N.
drivers/ntb/test/Makefile +1 -0
index b323093..0ea32a3 100644
@@ -1 +1,2 @@
 obj-$(CONFIG_NTB_PINGPONG) += ntb_pingpong.o
+obj-$(CONFIG_NTB_TOOL) += ntb_tool.o
drivers/ntb/test/ntb_tool.c new file +557 -0

557 lines not on this page · raw message

Signature · 1 line
2.4.0.rc0.43.gcf8a8c6
#20 lore raw

Re: [PATCH 07/16] NTB Tool Client

drivers/ntb/test/Kconfig config NTB_PINGPONG · line 13

Quoted 5 lines · Allen Hubbe
drivers/ntb/test/Kconfig +3 -0
+config NTB_TOOL
+       tristate "NTB Debugging Tool Client"
+       depends on NTB

Same nit as for 2/16 and 7/16.

drivers/ntb/test/Kconfig config NTB_PINGPONG · line 21

Quoted 3 lines
drivers/ntb/test/Kconfig +2 -0
+       help
 
+        If unsure, say N.

(Please start the indentation with a tab, and not with spaces.)

Thanks,

Paul Bolle

#21 lore raw

PATCH 8/16 ntb_transport: rate limit ntb_qp_link_work

In reply to Allen Hubbe

When the ntb transport is connecting and waiting for the peer, the debug console receives lots of debug level messages about the remote qp link status being down. Rate limit those messages.

---
 drivers/ntb/ntb_transport.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/ntb/ntb_transport.c +1 -1
index bb2eb85..833f5b6 100644
@@ -830,7 +830,7 @@ static void ntb_qp_link_work(struct work_struct *work)
 
 	/* query remote spad for qp ready bits */
 	ntb_peer_spad_read(nt->ndev, QP_LINKS);
-	dev_dbg(&pdev->dev, "Remote QP link status = %x\n", val);
+	dev_dbg_ratelimited(&pdev->dev, "Remote QP link status = %x\n", val);
 
 	/* See if the remote side is up */
 	if (val & BIT(qp->qp_num)) {
Signature · 1 line
2.4.0.rc0.43.gcf8a8c6
#22 lore raw

PATCH 9/16 ntb_transport: differentiate link down messages

In reply to Allen Hubbe

The same message "qp%d: Link Down\n" was printed at two locations in ntb_transport. Change the messages so they are distinct.

---
 drivers/ntb/ntb_transport.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/ntb/ntb_transport.c +2 -2
index 833f5b6..8a6db1a 100644
@@ -657,7 +657,7 @@ static void ntb_qp_link_cleanup(struct ntb_transport_qp *qp)
 		return;
 	}
 
-	dev_info(&pdev->dev, "qp %d: Link Down\n", qp->qp_num);
+	dev_info(&pdev->dev, "qp %d: Link Cleanup\n", qp->qp_num);
 	qp->link_is_up = false;
 
 	if (qp->event_handler)
@@ -1455,7 +1455,7 @@ static void ntb_send_link_down(struct ntb_transport_qp *qp)
 		return;
 
 	qp->link_is_up = false;
-	dev_info(&pdev->dev, "qp %d: Link Down\n", qp->qp_num);
+	dev_info(&pdev->dev, "qp %d: Send Link Down\n", qp->qp_num);
 
 	for (i = 0; i < NTB_LINK_DOWN_TIMEOUT; i++) {
 		entry = ntb_list_rm(&qp->ntb_tx_free_q_lock, &qp->tx_free_q);
Signature · 1 line
2.4.0.rc0.43.gcf8a8c6
#23 lore raw

PATCH 10/16 ntb_transport: don't advance rx on link down

In reply to Allen Hubbe

On link down, don't advance RX index to the next entry. The next entry should never be valid after receiving the link down flag.

---
 drivers/ntb/ntb_transport.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/ntb/ntb_transport.c +1 -2
index 8a6db1a..9b4e240 100644
@@ -1211,8 +1211,7 @@ static int ntb_process_rxc(struct ntb_transport_qp *qp)
 		dev_dbg(&qp->ndev->pdev->dev, "link down flag set\n");
 		ntb_qp_link_down(qp);
 		hdr->flags = 0;
-		iowrite32(qp->rx_index, &qp->rx_info->entry);
-		return 0;
+		return -EAGAIN;
 	}
 
 	if (hdr->ver != (u32)qp->rx_pkts) {
Signature · 1 line
2.4.0.rc0.43.gcf8a8c6
#24 lore raw

PATCH 11/16 ntb_transport: reset qp link stats on down

In reply to Allen Hubbe

Reset the link stats when the link goes down. In particular, the tx and rx index and count must be reset, or else the tx side will be sending packets to the rx side, where the rx side is not expecting them. Reset all the stats, to be consistent.

---
 drivers/ntb/ntb_transport.c | 36 ++++++++++++++++++++++++++++--------
 1 file changed, 28 insertions(+), 8 deletions(-)
drivers/ntb/ntb_transport.c +28 -8
index 9b4e240..c76d8b9 100644
@@ -647,18 +647,37 @@ static int ntb_set_mw(struct ntb_transport_ctx *nt, int num_mw,
 	return 0;
 }
 
+static void ntb_qp_link_down_reset(struct ntb_transport_qp *qp)
+{
+	qp->link_is_up = false;
+
+	qp->tx_index = 0;
+	qp->rx_index = 0;
+	qp->rx_bytes = 0;
+	qp->rx_pkts = 0;
+	qp->rx_ring_empty = 0;
+	qp->rx_err_no_buf = 0;
+	qp->rx_err_oflow = 0;
+	qp->rx_err_ver = 0;
+	qp->rx_memcpy = 0;
+	qp->rx_async = 0;
+	qp->tx_bytes = 0;
+	qp->tx_pkts = 0;
+	qp->tx_ring_full = 0;
+	qp->tx_err_no_buf = 0;
+	qp->tx_memcpy = 0;
+	qp->tx_async = 0;
+}
+
 static void ntb_qp_link_cleanup(struct ntb_transport_qp *qp)
 {
 	struct ntb_transport_ctx *nt = qp->transport;
 	struct pci_dev *pdev = nt->ndev->pdev;
 
-	if (qp->link_is_up) {
-		cancel_delayed_work_sync(&qp->link_work);
-		return;
-	}
-
 	dev_info(&pdev->dev, "qp %d: Link Cleanup\n", qp->qp_num);
-	qp->link_is_up = false;
+
+	cancel_delayed_work_sync(&qp->link_work);
+	ntb_qp_link_down_reset(qp);
 
 	if (qp->event_handler)
 		qp->event_handler(qp->cb_data, qp->link_is_up);
@@ -865,9 +884,9 @@ static int ntb_transport_init_queue(struct ntb_transport_ctx *nt,
 	qp->qp_num = qp_num;
 	qp->transport = nt;
 	qp->ndev = nt->ndev;
-	qp->link_is_up = false;
 	qp->client_ready = false;
 	qp->event_handler = NULL;
+	ntb_qp_link_down_reset(qp);
 
 	if (qp_count % mw_count && mw_num + 1 < qp_count / mw_count)
 		num_qps_mw = qp_count / mw_count + 1;
@@ -1453,7 +1472,6 @@ static void ntb_send_link_down(struct ntb_transport_qp *qp)
 	if (!qp->link_is_up)
 		return;
 
-	qp->link_is_up = false;
 	dev_info(&pdev->dev, "qp %d: Send Link Down\n", qp->qp_num);
 
 	for (i = 0; i < NTB_LINK_DOWN_TIMEOUT; i++) {
@@ -1475,6 +1493,8 @@ static void ntb_send_link_down(struct ntb_transport_qp *qp)
 	if (rc)
 		dev_err(&pdev->dev, "ntb: QP%d unable to send linkdown msg\n",
 			qp->qp_num);
+
+	ntb_qp_link_down_reset(qp);
 }
 
 /**
Signature · 1 line
2.4.0.rc0.43.gcf8a8c6
#25 lore raw

PATCH 12/16 ntb_transport: numa aware memory and dma chan

In reply to Allen Hubbe

Allocate memory and request the dma channel for the same numa node as the ntb device.

---
 drivers/ntb/ntb_transport.c | 46 +++++++++++++++++++++++++++++++--------------
 1 file changed, 32 insertions(+), 14 deletions(-)
drivers/ntb/ntb_transport.c +32 -14
index c76d8b9..91809fa 100644
@@ -346,6 +346,7 @@ int ntb_transport_register_client_dev(char *device_name)
 {
 	struct ntb_transport_client_dev *client_dev;
 	struct ntb_transport_ctx *nt;
+	int node;
 	int rc, i = 0;
 
 	if (list_empty(&ntb_transport_list))
@@ -354,8 +355,10 @@ int ntb_transport_register_client_dev(char *device_name)
 	list_for_each_entry(nt, &ntb_transport_list, entry) {
 		struct device *dev;
 
-		client_dev = kzalloc(sizeof(*client_dev),
-				     GFP_KERNEL);
+		node = dev_to_node(&nt->ndev->dev);
+
+		client_dev = kzalloc_node(sizeof(*client_dev),
+				     GFP_KERNEL, node);
 		if (!client_dev) {
 			rc = -ENOMEM;
 			goto err;
@@ -949,6 +952,7 @@ static int ntb_transport_probe(struct ntb_client *self, struct ntb_dev *ndev)
 	struct ntb_transport_mw *mw;
 	unsigned int mw_count, qp_count;
 	u64 qp_bitmap;
+	int node;
 	int rc, i;
 
 	if (ntb_db_is_unsafe(ndev))
@@ -958,7 +962,9 @@ static int ntb_transport_probe(struct ntb_client *self, struct ntb_dev *ndev)
 		dev_dbg(&ndev->dev,
 			"scratchpad is unsafe, proceed anyway...\n");
 
-	nt = kzalloc(sizeof(*nt), GFP_KERNEL);
+	node = dev_to_node(&ndev->dev);
+
+	nt = kzalloc_node(sizeof(*nt), GFP_KERNEL, node);
 	if (!nt)
 		return -ENOMEM;
 
@@ -968,7 +974,8 @@ static int ntb_transport_probe(struct ntb_client *self, struct ntb_dev *ndev)
 
 	nt->mw_count = mw_count;
 
-	nt->mw_vec = kcalloc(mw_count, sizeof(*nt->mw_vec), GFP_KERNEL);
+	nt->mw_vec = kzalloc_node(mw_count * sizeof(*nt->mw_vec),
+				  GFP_KERNEL, node);
 	if (!nt->mw_vec) {
 		rc = -ENOMEM;
 		goto err;
@@ -1008,7 +1015,8 @@ static int ntb_transport_probe(struct ntb_client *self, struct ntb_dev *ndev)
 	nt->qp_bitmap = qp_bitmap;
 	nt->qp_bitmap_free = qp_bitmap;
 
-	nt->qp_vec = kcalloc(qp_count, sizeof(*nt->qp_vec), GFP_KERNEL);
+	nt->qp_vec = kzalloc_node(qp_count * sizeof(*nt->qp_vec),
+				  GFP_KERNEL, node);
 	if (!nt->qp_vec) {
 		rc = -ENOMEM;
 		goto err2;
@@ -1497,6 +1505,11 @@ static void ntb_send_link_down(struct ntb_transport_qp *qp)
 	ntb_qp_link_down_reset(qp);
 }
 
+static bool ntb_dma_filter_fn(struct dma_chan *chan, void *node)
+{
+	return dev_to_node(&chan->dev->device) == (int)(unsigned long)node;
+}
+
 /**
  * ntb_transport_create_queue - Create a new NTB transport layer queue
  * @rx_handler: receive callback function
@@ -1522,12 +1535,16 @@ ntb_transport_create_queue(void *data, struct device *client_dev,
 	struct ntb_transport_qp *qp;
 	u64 qp_bit;
 	unsigned int free_queue;
+	dma_cap_mask_t dma_mask;
+	int node;
 	int i;
 
 	ndev = dev_ntb(client_dev->parent);
 	pdev = ndev->pdev;
 	nt = ndev->ctx;
 
+	node = dev_to_node(&ndev->dev);
+
 	free_queue = ffs(nt->qp_bitmap);
 	if (!free_queue)
 		goto err;
@@ -1545,15 +1562,16 @@ ntb_transport_create_queue(void *data, struct device *client_dev,
 	qp->tx_handler = handlers->tx_handler;
 	qp->event_handler = handlers->event_handler;
 
-	dmaengine_get();
-	qp->dma_chan = dma_find_channel(DMA_MEMCPY);
-	if (!qp->dma_chan) {
-		dmaengine_put();
+	dma_cap_zero(dma_mask);
+	dma_cap_set(DMA_MEMCPY, dma_mask);
+
+	qp->dma_chan = dma_request_channel(dma_mask, ntb_dma_filter_fn,
+					   (void *)(unsigned long)node);
+	if (!qp->dma_chan)
 		dev_info(&pdev->dev, "Unable to allocate DMA channel, using CPU instead\n");
-	}
 
 	for (i = 0; i < NTB_QP_DEF_NUM_ENTRIES; i++) {
-		entry = kzalloc(sizeof(*entry), GFP_ATOMIC);
+		entry = kzalloc_node(sizeof(*entry), GFP_ATOMIC, node);
 		if (!entry)
 			goto err1;
 
@@ -1563,7 +1581,7 @@ ntb_transport_create_queue(void *data, struct device *client_dev,
 	}
 
 	for (i = 0; i < NTB_QP_DEF_NUM_ENTRIES; i++) {
-		entry = kzalloc(sizeof(*entry), GFP_ATOMIC);
+		entry = kzalloc_node(sizeof(*entry), GFP_ATOMIC, node);
 		if (!entry)
 			goto err2;
 
@@ -1586,7 +1604,7 @@ err1:
 	while ((entry = ntb_list_rm(&qp->ntb_rx_free_q_lock, &qp->rx_free_q)))
 		kfree(entry);
 	if (qp->dma_chan)
-		dmaengine_put();
+		dma_release_channel(qp->dma_chan);
 	nt->qp_bitmap_free |= qp_bit;
 err:
 	return NULL;
@@ -1623,7 +1641,7 @@ void ntb_transport_free_queue(struct ntb_transport_qp *qp)
 		 */
 		dma_sync_wait(chan, qp->last_cookie);
 		dmaengine_terminate_all(chan);
-		dmaengine_put();
+		dma_release_channel(chan);
 	}
 
 	qp_bit = BIT_ULL(qp->qp_num);
Signature · 1 line
2.4.0.rc0.43.gcf8a8c6
#26 lore raw

PATCH 13/16 ntb_hw_intel: numa aware memory allocation

In reply to Allen Hubbe

Allocate memory for the numa node of the ntb device.

---
 drivers/ntb/hw/intel/ntb_hw_intel.c | 18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)
drivers/ntb/hw/intel/ntb_hw_intel.c +12 -6
index 7e19d46..aa0bffb 100644
@@ -413,10 +413,12 @@ static int ndev_init_isr(struct intel_ntb_dev *ndev,
 			 int msix_shift, int total_shift)
 {
 	struct pci_dev *pdev;
-	int rc, i, msix_count;
+	int rc, i, msix_count, node;
 
 	pdev = ndev_pdev(ndev);
 
+	node = dev_to_node(&pdev->dev);
+
 	/* Mask all doorbell interrupts */
 	ndev->db_mask = ndev->db_valid_mask;
 	ndev->reg->db_iowrite(ndev->db_mask,
@@ -425,11 +427,13 @@ static int ndev_init_isr(struct intel_ntb_dev *ndev,
 
 	/* Try to set up msix irq */
 
-	ndev->vec = kcalloc(msix_max, sizeof(*ndev->vec), GFP_KERNEL);
+	ndev->vec = kzalloc_node(msix_max * sizeof(*ndev->vec),
+				 GFP_KERNEL, node);
 	if (!ndev->vec)
 		goto err_msix_vec_alloc;
 
-	ndev->msix = kcalloc(msix_max, sizeof(*ndev->msix), GFP_KERNEL);
+	ndev->msix = kzalloc_node(msix_max * sizeof(*ndev->msix),
+				  GFP_KERNEL, node);
 	if (!ndev->msix)
 		goto err_msix_alloc;
 
@@ -1963,10 +1967,12 @@ static int intel_ntb_pci_probe(struct pci_dev *pdev,
 			       const struct pci_device_id *id)
 {
 	struct intel_ntb_dev *ndev;
-	int rc;
+	int rc, node;
+
+	node = dev_to_node(&pdev->dev);
 
 	if (pdev_is_bwd(pdev)) {
-		ndev = kmalloc(sizeof(*ndev), GFP_KERNEL);
+		ndev = kmalloc_node(sizeof(*ndev), GFP_KERNEL, node);
 		if (!ndev) {
 			rc = -ENOMEM;
 			goto err_ndev;
@@ -1983,7 +1989,7 @@ static int intel_ntb_pci_probe(struct pci_dev *pdev,
 			goto err_init_dev;
 
 	} else if (pdev_is_snb(pdev)) {
-		ndev = kmalloc(sizeof(*ndev), GFP_KERNEL);
+		ndev = kmalloc_node(sizeof(*ndev), GFP_KERNEL, node);
 		if (!ndev) {
 			rc = -ENOMEM;
 			goto err_ndev;
Signature · 1 line
2.4.0.rc0.43.gcf8a8c6
#27 lore raw

PATCH 14/16 ntb: performance improvement by write combining

In reply to Allen Hubbe

From: Dave Jiang <[email protected]>

Changing the memory window BAR mappings to write combining significantly boosts the performance. We will also use memcpy that utilizies non-temporal store which showed performance improement when doing non-cached memcpys.

---
 drivers/ntb/ntb_transport.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)
drivers/ntb/ntb_transport.c +7 -2
index 91809fa..cc0b7ff 100644
@@ -58,6 +58,7 @@
 #include <linux/pci.h>
 #include <linux/slab.h>
 #include <linux/types.h>
+#include <linux/uaccess.h>
 #include "linux/ntb.h"
 #include "linux/ntb_transport.h"
 
@@ -989,7 +990,7 @@ static int ntb_transport_probe(struct ntb_client *self, struct ntb_dev *ndev)
 		if (rc)
 			goto err1;
 
-		mw->vbase = ioremap(mw->phys_addr, mw->phys_size);
+		mw->vbase = ioremap_wc(mw->phys_addr, mw->phys_size);
 		if (!mw->vbase) {
 			rc = -ENOMEM;
 			goto err1;
@@ -1360,7 +1361,11 @@ static void ntb_tx_copy_callback(void *data)
 
 static void ntb_memcpy_tx(struct ntb_queue_entry *entry, void __iomem *offset)
 {
-	memcpy_toio(offset, entry->buf, entry->len);
+	/*
+	 * Using non-temporal mov to improve performance on non-cached
+	 * writes. Even though we aren't actually copying from user space.
+	 */
+	__copy_from_user_inatomic_nocache(offset, entry->buf, entry->len);
 
 	/* Ensure that the data is fully copied out before setting the flags */
 	wmb();
Signature · 1 line
2.4.0.rc0.43.gcf8a8c6
#28 lore raw

PATCH 15/16 ntb: default to cpu memcpy for performance

In reply to Allen Hubbe

From: Dave Jiang <[email protected]>

Disable DMA usage by default, since the CPU provides much better performance with write combining. Provide a module parameter to enable DMA usage when offloading the memcpy is preferred.

---
 drivers/ntb/ntb_transport.c | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)
drivers/ntb/ntb_transport.c +13 -4
index cc0b7ff..237f76f 100644
@@ -88,6 +88,10 @@ static unsigned int copy_bytes = 1024;
 module_param(copy_bytes, uint, 0644);
 MODULE_PARM_DESC(copy_bytes, "Threshold under which NTB will use the CPU to copy instead of DMA");
 
+static bool use_dma;
+module_param(use_dma, bool, 0644);
+MODULE_PARM_DESC(use_dma, "Use DMA engine to perform large data copy");
+
 static struct dentry *nt_debugfs_dir;
 
 struct ntb_queue_entry {
@@ -1570,10 +1574,15 @@ ntb_transport_create_queue(void *data, struct device *client_dev,
 	dma_cap_zero(dma_mask);
 	dma_cap_set(DMA_MEMCPY, dma_mask);
 
-	qp->dma_chan = dma_request_channel(dma_mask, ntb_dma_filter_fn,
-					   (void *)(unsigned long)node);
-	if (!qp->dma_chan)
-		dev_info(&pdev->dev, "Unable to allocate DMA channel, using CPU instead\n");
+	if (use_dma) {
+		qp->dma_chan = dma_request_channel(dma_mask, ntb_dma_filter_fn,
+						   (void *)(unsigned long)node);
+		if (!qp->dma_chan)
+			dev_info(&pdev->dev, "Unable to allocate DMA channel\n");
+	} else {
+		qp->dma_chan = NULL;
+	}
+	dev_dbg(&pdev->dev, "Using %s memcpy\n", qp->dma_chan ? "DMA" : "CPU");
 
 	for (i = 0; i < NTB_QP_DEF_NUM_ENTRIES; i++) {
 		entry = kzalloc_node(sizeof(*entry), GFP_ATOMIC, node);
Signature · 1 line
2.4.0.rc0.43.gcf8a8c6
#29 lore raw

PATCH 16/16 ntb_transport: fix small code format issues

In reply to Allen Hubbe

Fix code format issues detected by checkpatch.pl. Fix one spelling error, and some unnecessary whitespace after cast operators. I did not add the comments for spinlocks, which checkpatch still reports as missing.

---
 drivers/ntb/ntb_transport.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/ntb/ntb_transport.c +6 -6
index 237f76f..15d237c 100644
@@ -97,7 +97,7 @@ static struct dentry *nt_debugfs_dir;
 struct ntb_queue_entry {
 	/* ntb_queue list reference */
 	struct list_head entry;
-	/* pointers to data to be transfered */
+	/* pointers to data to be transferred */
 	void *cb_data;
 	void *buf;
 	unsigned int len;
@@ -1158,8 +1158,8 @@ static void ntb_async_rx(struct ntb_queue_entry *entry, void *offset,
 		goto err_wait;
 
 	device = chan->device;
-	pay_off = (size_t) offset & ~PAGE_MASK;
-	buff_off = (size_t) buf & ~PAGE_MASK;
+	pay_off = (size_t)offset & ~PAGE_MASK;
+	buff_off = (size_t)buf & ~PAGE_MASK;
 
 	if (!is_dma_copy_aligned(device, pay_off, buff_off, len))
 		goto err_wait;
@@ -1397,7 +1397,7 @@ static void ntb_async_tx(struct ntb_transport_qp *qp,
 	entry->tx_hdr = hdr;
 
 	iowrite32(entry->len, &hdr->len);
-	iowrite32((u32) qp->tx_pkts, &hdr->ver);
+	iowrite32((u32)qp->tx_pkts, &hdr->ver);
 
 	if (!chan)
 		goto err;
@@ -1407,8 +1407,8 @@ static void ntb_async_tx(struct ntb_transport_qp *qp,
 
 	device = chan->device;
 	dest = qp->tx_mw_phys + qp->tx_max_frame * qp->tx_index;
-	buff_off = (size_t) buf & ~PAGE_MASK;
-	dest_off = (size_t) dest & ~PAGE_MASK;
+	buff_off = (size_t)buf & ~PAGE_MASK;
+	dest_off = (size_t)dest & ~PAGE_MASK;
 
 	if (!is_dma_copy_aligned(device, buff_off, dest_off, len))
 		goto err;
Signature · 1 line
2.4.0.rc0.43.gcf8a8c6