svn commit: r289257 - head/sys/dev/ntb/ntb_hw

Conrad E. Meyer cem at FreeBSD.org
Tue Oct 13 19:45:30 UTC 2015


Author: cem
Date: Tue Oct 13 19:45:29 2015
New Revision: 289257
URL: https://svnweb.freebsd.org/changeset/base/289257

Log:
  NTB: (partial) MFV ed6c24ed: NTB-RP support
  
  This commit does not actually add NTB-RP support.  Mostly it serves to
  shuffle code around to match the Linux driver.  Original Linux commit
  log follows:
  
  Add support for Non-Transparent Bridge connected to a PCI-E Root Port on
  the remote system (also known as NTB-RP mode).  This allows for a NTB
  enabled system to be connected to a non-NTB enabled system/slot.
  
  Modifications to the registers and BARs/MWs on the Secondary side by the
  remote system are reflected into registers on the Primary side for the
  local system.  Similarly, modifications of registers and BARs/MWs on
  Primary side by the local system are reflected into registers on the
  Secondary side for the Remote System.  This allows communication between
  the 2 sides via these registers and BARs/MWs.
  
  Note: there is not a fix for the Xeon Errata (that was already worked
  around in NTB-B2B mode) for NTB-RP mode.  Due to this limitation, NTB-RP
  will not work on the Secondary side with the Xeon Errata workaround
  enabled.  To get around this, disable the workaround via the
  xeon_errata_workaround=0 modparm.  However, this can cause the hang
  described in the errata.
  
  Authored by:	Jon Mason
  Obtained from:	Linux
  Sponsored by:	EMC / Isilon Storage Division

Modified:
  head/sys/dev/ntb/ntb_hw/ntb_hw.c
  head/sys/dev/ntb/ntb_hw/ntb_regs.h

Modified: head/sys/dev/ntb/ntb_hw/ntb_hw.c
==============================================================================
--- head/sys/dev/ntb/ntb_hw/ntb_hw.c	Tue Oct 13 19:44:36 2015	(r289256)
+++ head/sys/dev/ntb/ntb_hw/ntb_hw.c	Tue Oct 13 19:45:29 2015	(r289257)
@@ -709,17 +709,6 @@ ntb_setup_xeon(struct ntb_softc *ntb)
 	val = pci_read_config(ntb->device, NTB_PPD_OFFSET, 1);
 
 	connection_type = val & XEON_PPD_CONN_TYPE;
-	switch (connection_type) {
-	case NTB_CONN_B2B:
-		ntb->conn_type = NTB_CONN_B2B;
-		break;
-	case NTB_CONN_CLASSIC:
-	case NTB_CONN_RP:
-	default:
-		device_printf(ntb->device, "Connection type %d not supported\n",
-		    connection_type);
-		return (ENXIO);
-	}
 
 	if ((val & XEON_PPD_DEV_TYPE) != 0)
 		ntb->dev_type = NTB_DEV_USD;
@@ -728,12 +717,42 @@ ntb_setup_xeon(struct ntb_softc *ntb)
 
 	ntb->reg_ofs.ldb	= XEON_PDOORBELL_OFFSET;
 	ntb->reg_ofs.ldb_mask	= XEON_PDBMSK_OFFSET;
+	ntb->reg_ofs.spad_local	= XEON_SPAD_OFFSET;
 	ntb->reg_ofs.bar2_xlat	= XEON_SBAR2XLAT_OFFSET;
 	ntb->reg_ofs.bar4_xlat	= XEON_SBAR4XLAT_OFFSET;
-	ntb->reg_ofs.lnk_cntl	= XEON_NTBCNTL_OFFSET;
-	ntb->reg_ofs.lnk_stat	= XEON_LINK_STATUS_OFFSET;
-	ntb->reg_ofs.spad_local	= XEON_SPAD_OFFSET;
-	ntb->reg_ofs.spci_cmd	= XEON_PCICMD_OFFSET;
+
+	switch (connection_type) {
+	case NTB_CONN_B2B:
+		ntb->conn_type = NTB_CONN_B2B;
+
+		/*
+		 * reg_ofs.rdb and reg_ofs.spad_remote are effectively ignored
+		 * with the NTB_REGS_THRU_MW errata mode enabled.  (See
+		 * ntb_ring_doorbell() and ntb_read/write_remote_spad().)
+		 */
+		ntb->reg_ofs.rdb	 = XEON_B2B_DOORBELL_OFFSET;
+		ntb->reg_ofs.spad_remote = XEON_B2B_SPAD_OFFSET;
+
+		ntb->limits.max_spads	 = XEON_MAX_SPADS;
+		break;
+
+	case NTB_CONN_RP:
+		/*
+		 * Every Xeon today needs NTB_REGS_THRU_MW, so punt on RP for
+		 * now.
+		 */
+		KASSERT(HAS_FEATURE(NTB_REGS_THRU_MW),
+		    ("Xeon without MW errata unimplemented"));
+		device_printf(ntb->device,
+		    "NTB-RP disabled to due hardware errata.\n");
+		return (ENXIO);
+
+	case NTB_CONN_TRANSPARENT:
+	default:
+		device_printf(ntb->device, "Connection type %d not supported\n",
+		    connection_type);
+		return (ENXIO);
+	}
 
 	/*
 	 * There is a Xeon hardware errata related to writes to SDOORBELL or
@@ -757,15 +776,9 @@ ntb_setup_xeon(struct ntb_softc *ntb)
 		ntb_reg_write(8, XEON_PBAR4LMT_OFFSET, 0);
 
 
-	if (ntb->conn_type == NTB_CONN_B2B) {
-		ntb->reg_ofs.rdb	 = XEON_B2B_DOORBELL_OFFSET;
-		ntb->reg_ofs.spad_remote = XEON_B2B_SPAD_OFFSET;
-		ntb->limits.max_spads	 = XEON_MAX_SPADS;
-	} else {
-		ntb->reg_ofs.rdb	 = XEON_SDOORBELL_OFFSET;
-		ntb->reg_ofs.spad_remote = XEON_SPAD_OFFSET;
-		ntb->limits.max_spads	 = XEON_MAX_COMPAT_SPADS;
-	}
+	ntb->reg_ofs.lnk_cntl	 = XEON_NTBCNTL_OFFSET;
+	ntb->reg_ofs.lnk_stat	 = XEON_LINK_STATUS_OFFSET;
+	ntb->reg_ofs.spci_cmd	 = XEON_PCICMD_OFFSET;
 
 	ntb->limits.max_db_bits	 = XEON_MAX_DB_BITS;
 	ntb->limits.msix_cnt	 = XEON_MSIX_CNT;
@@ -774,8 +787,9 @@ ntb_setup_xeon(struct ntb_softc *ntb)
 	configure_xeon_secondary_side_bars(ntb);
 
 	/* Enable Bus Master and Memory Space on the secondary side */
-	ntb_reg_write(2, ntb->reg_ofs.spci_cmd,
-	    PCIM_CMD_MEMEN | PCIM_CMD_BUSMASTEREN);
+	if (ntb->conn_type == NTB_CONN_B2B)
+		ntb_reg_write(2, ntb->reg_ofs.spci_cmd,
+		    PCIM_CMD_MEMEN | PCIM_CMD_BUSMASTEREN);
 
 	/* Enable link training */
 	ntb_reg_write(4, ntb->reg_ofs.lnk_cntl,
@@ -996,7 +1010,8 @@ ntb_handle_link_event(struct ntb_softc *
 		ntb->link_status = NTB_LINK_UP;
 		event = NTB_EVENT_HW_LINK_UP;
 
-		if (ntb->type == NTB_SOC)
+		if (ntb->type == NTB_SOC ||
+		    ntb->conn_type == NTB_CONN_TRANSPARENT)
 			status = ntb_reg_read(2, ntb->reg_ofs.lnk_stat);
 		else
 			status = pci_read_config(ntb->device,

Modified: head/sys/dev/ntb/ntb_hw/ntb_regs.h
==============================================================================
--- head/sys/dev/ntb/ntb_hw/ntb_regs.h	Tue Oct 13 19:44:36 2015	(r289256)
+++ head/sys/dev/ntb/ntb_hw/ntb_regs.h	Tue Oct 13 19:45:29 2015	(r289257)
@@ -29,8 +29,6 @@
 #ifndef _NTB_REGS_H_
 #define _NTB_REGS_H_
 
-#define NTB_LINK_ENABLE		0x0000
-#define NTB_LINK_DISABLE	0x0002
 #define NTB_LINK_STATUS_ACTIVE	0x2000
 #define NTB_LINK_SPEED_MASK	0x000f
 #define NTB_LINK_WIDTH_MASK	0x03f0
@@ -47,6 +45,7 @@
 #define XEON_PCICMD_OFFSET	0x0504
 #define XEON_DEVCTRL_OFFSET	0x0598
 #define XEON_LINK_STATUS_OFFSET	0x01a2
+#define XEON_SLINK_STATUS_OFFSET	0x05a2
 
 #define XEON_PBAR2LMT_OFFSET	0x0000
 #define XEON_PBAR4LMT_OFFSET	0x0008
@@ -117,6 +116,8 @@
 #define SOC_LTSSMSTATEJMP_FORCEDETECT	(1 << 2)
 #define SOC_IBIST_ERR_OFLOW	0x7fff7fff
 
+#define NTB_CNTL_CFG_LOCK	(1 << 0)
+#define NTB_CNTL_LINK_DISABLE	(1 << 1)
 #define NTB_CNTL_BAR23_SNOOP	(1 << 2)
 #define NTB_CNTL_BAR45_SNOOP	(1 << 6)
 #define SOC_CNTL_LINK_DOWN	(1 << 16)
@@ -130,7 +131,7 @@
 #define SOC_PPD_CONN_TYPE	0x0300
 #define SOC_PPD_DEV_TYPE	0x1000
 
-#define NTB_CONN_CLASSIC 	0
+#define NTB_CONN_TRANSPARENT 	0
 #define NTB_CONN_B2B 		1
 #define NTB_CONN_RP 		2
 


More information about the svn-src-head mailing list