Commit d3658c22 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'ntb-4.16' of git://github.com/jonmason/ntb

Pull NTB updates from Jon Mason:
 "Bug fixes galore, removal of the ntb atom driver, and updates to the
  ntb tools and tests to support the multi-port interface"

* tag 'ntb-4.16' of git://github.com/jonmason/ntb: (37 commits)
  NTB: ntb_perf: fix cast to restricted __le32
  ntb_perf: Fix an error code in perf_copy_chunk()
  ntb_hw_switchtec: Make function switchtec_ntb_remove() static
  NTB: ntb_tool: fix memory leak on 'buf' on error exit path
  NTB: ntb_perf: fix printing of resource_size_t
  NTB: ntb_hw_idt: Set NTB_TOPO_SWITCH topology
  NTB: ntb_test: Update ntb_perf tests
  NTB: ntb_test: Update ntb_tool MW tests
  NTB: ntb_test: Add ntb_tool Message tests
  NTB: ntb_test: Update ntb_tool Scratchpad tests
  NTB: ntb_test: Update ntb_tool DB tests
  NTB: ntb_test: Update ntb_tool link tests
  NTB: ntb_test: Add ntb_tool port tests
  NTB: ntb_test: Safely use paths with whitespace
  NTB: ntb_perf: Add full multi-port NTB API support
  NTB: ntb_tool: Add full multi-port NTB API support
  NTB: ntb_pp: Add full multi-port NTB API support
  NTB: Fix UB/bug in ntb_mw_get_align()
  NTB: Set dma mask and dma coherent mask to NTB devices
  NTB: Rename NTB messaging API methods
  ...
parents 8ac4840a 3b28c987
...@@ -9801,7 +9801,7 @@ F: drivers/ntb/hw/amd/ ...@@ -9801,7 +9801,7 @@ F: drivers/ntb/hw/amd/
NTB DRIVER CORE NTB DRIVER CORE
M: Jon Mason <jdmason@kudzu.us> M: Jon Mason <jdmason@kudzu.us>
M: Dave Jiang <dave.jiang@intel.com> M: Dave Jiang <dave.jiang@intel.com>
M: Allen Hubbe <Allen.Hubbe@emc.com> M: Allen Hubbe <allenbh@gmail.com>
L: linux-ntb@googlegroups.com L: linux-ntb@googlegroups.com
S: Supported S: Supported
W: https://github.com/jonmason/ntb/wiki W: https://github.com/jonmason/ntb/wiki
......
...@@ -1020,6 +1020,10 @@ static int amd_ntb_init_pci(struct amd_ntb_dev *ndev, ...@@ -1020,6 +1020,10 @@ static int amd_ntb_init_pci(struct amd_ntb_dev *ndev,
goto err_dma_mask; goto err_dma_mask;
dev_warn(&pdev->dev, "Cannot DMA consistent highmem\n"); dev_warn(&pdev->dev, "Cannot DMA consistent highmem\n");
} }
rc = dma_coerce_mask_and_coherent(&ndev->ntb.dev,
dma_get_mask(&pdev->dev));
if (rc)
goto err_dma_mask;
ndev->self_mmio = pci_iomap(pdev, 0, 0); ndev->self_mmio = pci_iomap(pdev, 0, 0);
if (!ndev->self_mmio) { if (!ndev->self_mmio) {
......
...@@ -1744,20 +1744,19 @@ static int idt_ntb_msg_clear_mask(struct ntb_dev *ntb, u64 mask_bits) ...@@ -1744,20 +1744,19 @@ static int idt_ntb_msg_clear_mask(struct ntb_dev *ntb, u64 mask_bits)
* idt_ntb_msg_read() - read message register with specified index * idt_ntb_msg_read() - read message register with specified index
* (NTB API callback) * (NTB API callback)
* @ntb: NTB device context. * @ntb: NTB device context.
* @midx: Message register index
* @pidx: OUT - Port index of peer device a message retrieved from * @pidx: OUT - Port index of peer device a message retrieved from
* @msg: OUT - Data * @midx: Message register index
* *
* Read data from the specified message register and source register. * Read data from the specified message register and source register.
* *
* Return: zero on success, negative error if invalid argument passed. * Return: inbound message register value.
*/ */
static int idt_ntb_msg_read(struct ntb_dev *ntb, int midx, int *pidx, u32 *msg) static u32 idt_ntb_msg_read(struct ntb_dev *ntb, int *pidx, int midx)
{ {
struct idt_ntb_dev *ndev = to_ndev_ntb(ntb); struct idt_ntb_dev *ndev = to_ndev_ntb(ntb);
if (midx < 0 || IDT_MSG_CNT <= midx) if (midx < 0 || IDT_MSG_CNT <= midx)
return -EINVAL; return ~(u32)0;
/* Retrieve source port index of the message */ /* Retrieve source port index of the message */
if (pidx != NULL) { if (pidx != NULL) {
...@@ -1772,18 +1771,15 @@ static int idt_ntb_msg_read(struct ntb_dev *ntb, int midx, int *pidx, u32 *msg) ...@@ -1772,18 +1771,15 @@ static int idt_ntb_msg_read(struct ntb_dev *ntb, int midx, int *pidx, u32 *msg)
} }
/* Retrieve data of the corresponding message register */ /* Retrieve data of the corresponding message register */
if (msg != NULL) return idt_nt_read(ndev, ntdata_tbl.msgs[midx].in);
*msg = idt_nt_read(ndev, ntdata_tbl.msgs[midx].in);
return 0;
} }
/* /*
* idt_ntb_msg_write() - write data to the specified message register * idt_ntb_peer_msg_write() - write data to the specified message register
* (NTB API callback) * (NTB API callback)
* @ntb: NTB device context. * @ntb: NTB device context.
* @midx: Message register index
* @pidx: Port index of peer device a message being sent to * @pidx: Port index of peer device a message being sent to
* @midx: Message register index
* @msg: Data to send * @msg: Data to send
* *
* Just try to send data to a peer. Message status register should be * Just try to send data to a peer. Message status register should be
...@@ -1791,7 +1787,8 @@ static int idt_ntb_msg_read(struct ntb_dev *ntb, int midx, int *pidx, u32 *msg) ...@@ -1791,7 +1787,8 @@ static int idt_ntb_msg_read(struct ntb_dev *ntb, int midx, int *pidx, u32 *msg)
* *
* Return: zero on success, negative error if invalid argument passed. * Return: zero on success, negative error if invalid argument passed.
*/ */
static int idt_ntb_msg_write(struct ntb_dev *ntb, int midx, int pidx, u32 msg) static int idt_ntb_peer_msg_write(struct ntb_dev *ntb, int pidx, int midx,
u32 msg)
{ {
struct idt_ntb_dev *ndev = to_ndev_ntb(ntb); struct idt_ntb_dev *ndev = to_ndev_ntb(ntb);
unsigned long irqflags; unsigned long irqflags;
...@@ -2058,7 +2055,7 @@ static const struct ntb_dev_ops idt_ntb_ops = { ...@@ -2058,7 +2055,7 @@ static const struct ntb_dev_ops idt_ntb_ops = {
.msg_set_mask = idt_ntb_msg_set_mask, .msg_set_mask = idt_ntb_msg_set_mask,
.msg_clear_mask = idt_ntb_msg_clear_mask, .msg_clear_mask = idt_ntb_msg_clear_mask,
.msg_read = idt_ntb_msg_read, .msg_read = idt_ntb_msg_read,
.msg_write = idt_ntb_msg_write .peer_msg_write = idt_ntb_peer_msg_write
}; };
/* /*
...@@ -2073,7 +2070,7 @@ static int idt_register_device(struct idt_ntb_dev *ndev) ...@@ -2073,7 +2070,7 @@ static int idt_register_device(struct idt_ntb_dev *ndev)
/* Initialize the rest of NTB device structure and register it */ /* Initialize the rest of NTB device structure and register it */
ndev->ntb.ops = &idt_ntb_ops; ndev->ntb.ops = &idt_ntb_ops;
ndev->ntb.topo = NTB_TOPO_PRI; ndev->ntb.topo = NTB_TOPO_SWITCH;
ret = ntb_register_device(&ndev->ntb); ret = ntb_register_device(&ndev->ntb);
if (ret != 0) { if (ret != 0) {
...@@ -2269,7 +2266,7 @@ static ssize_t idt_dbgfs_info_read(struct file *filp, char __user *ubuf, ...@@ -2269,7 +2266,7 @@ static ssize_t idt_dbgfs_info_read(struct file *filp, char __user *ubuf,
"Message data:\n"); "Message data:\n");
for (idx = 0; idx < IDT_MSG_CNT; idx++) { for (idx = 0; idx < IDT_MSG_CNT; idx++) {
int src; int src;
(void)idt_ntb_msg_read(&ndev->ntb, idx, &src, &data); data = idt_ntb_msg_read(&ndev->ntb, &src, idx);
off += scnprintf(strbuf + off, size - off, off += scnprintf(strbuf + off, size - off,
"\t%hhu. 0x%08x from peer %hhu (Port %hhu)\n", "\t%hhu. 0x%08x from peer %hhu (Port %hhu)\n",
idx, data, src, ndev->peers[src].port); idx, data, src, ndev->peers[src].port);
...@@ -2429,7 +2426,7 @@ static int idt_init_pci(struct idt_ntb_dev *ndev) ...@@ -2429,7 +2426,7 @@ static int idt_init_pci(struct idt_ntb_dev *ndev)
struct pci_dev *pdev = ndev->ntb.pdev; struct pci_dev *pdev = ndev->ntb.pdev;
int ret; int ret;
/* Initialize the bit mask of DMA */ /* Initialize the bit mask of PCI/NTB DMA */
ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(64)); ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(64));
if (ret != 0) { if (ret != 0) {
ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32)); ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
...@@ -2450,6 +2447,12 @@ static int idt_init_pci(struct idt_ntb_dev *ndev) ...@@ -2450,6 +2447,12 @@ static int idt_init_pci(struct idt_ntb_dev *ndev)
dev_warn(&pdev->dev, dev_warn(&pdev->dev,
"Cannot set consistent DMA highmem bit mask\n"); "Cannot set consistent DMA highmem bit mask\n");
} }
ret = dma_coerce_mask_and_coherent(&ndev->ntb.dev,
dma_get_mask(&pdev->dev));
if (ret != 0) {
dev_err(&pdev->dev, "Failed to set NTB device DMA bit mask\n");
return ret;
}
/* /*
* Enable the device advanced error reporting. It's not critical to * Enable the device advanced error reporting. It's not critical to
......
This diff is collapsed.
...@@ -66,7 +66,6 @@ ...@@ -66,7 +66,6 @@
#define PCI_DEVICE_ID_INTEL_NTB_B2B_HSX 0x2F0D #define PCI_DEVICE_ID_INTEL_NTB_B2B_HSX 0x2F0D
#define PCI_DEVICE_ID_INTEL_NTB_PS_HSX 0x2F0E #define PCI_DEVICE_ID_INTEL_NTB_PS_HSX 0x2F0E
#define PCI_DEVICE_ID_INTEL_NTB_SS_HSX 0x2F0F #define PCI_DEVICE_ID_INTEL_NTB_SS_HSX 0x2F0F
#define PCI_DEVICE_ID_INTEL_NTB_B2B_BWD 0x0C4E
#define PCI_DEVICE_ID_INTEL_NTB_B2B_BDX 0x6F0D #define PCI_DEVICE_ID_INTEL_NTB_B2B_BDX 0x6F0D
#define PCI_DEVICE_ID_INTEL_NTB_PS_BDX 0x6F0E #define PCI_DEVICE_ID_INTEL_NTB_PS_BDX 0x6F0E
#define PCI_DEVICE_ID_INTEL_NTB_SS_BDX 0x6F0F #define PCI_DEVICE_ID_INTEL_NTB_SS_BDX 0x6F0F
...@@ -196,63 +195,6 @@ ...@@ -196,63 +195,6 @@
#define SKX_DB_TOTAL_SHIFT 33 #define SKX_DB_TOTAL_SHIFT 33
#define SKX_SPAD_COUNT 16 #define SKX_SPAD_COUNT 16
/* Intel Atom hardware */
#define ATOM_SBAR2XLAT_OFFSET 0x0008
#define ATOM_PDOORBELL_OFFSET 0x0020
#define ATOM_PDBMSK_OFFSET 0x0028
#define ATOM_NTBCNTL_OFFSET 0x0060
#define ATOM_SPAD_OFFSET 0x0080
#define ATOM_PPD_OFFSET 0x00d4
#define ATOM_PBAR2XLAT_OFFSET 0x8008
#define ATOM_B2B_DOORBELL_OFFSET 0x8020
#define ATOM_B2B_SPAD_OFFSET 0x8080
#define ATOM_SPCICMD_OFFSET 0xb004
#define ATOM_LINK_STATUS_OFFSET 0xb052
#define ATOM_ERRCORSTS_OFFSET 0xb110
#define ATOM_IP_BASE 0xc000
#define ATOM_DESKEWSTS_OFFSET (ATOM_IP_BASE + 0x3024)
#define ATOM_LTSSMERRSTS0_OFFSET (ATOM_IP_BASE + 0x3180)
#define ATOM_LTSSMSTATEJMP_OFFSET (ATOM_IP_BASE + 0x3040)
#define ATOM_IBSTERRRCRVSTS0_OFFSET (ATOM_IP_BASE + 0x3324)
#define ATOM_MODPHY_PCSREG4 0x1c004
#define ATOM_MODPHY_PCSREG6 0x1c006
#define ATOM_PPD_INIT_LINK 0x0008
#define ATOM_PPD_CONN_MASK 0x0300
#define ATOM_PPD_CONN_TRANSPARENT 0x0000
#define ATOM_PPD_CONN_B2B 0x0100
#define ATOM_PPD_CONN_RP 0x0200
#define ATOM_PPD_DEV_MASK 0x1000
#define ATOM_PPD_DEV_USD 0x0000
#define ATOM_PPD_DEV_DSD 0x1000
#define ATOM_PPD_TOPO_MASK (ATOM_PPD_CONN_MASK | ATOM_PPD_DEV_MASK)
#define ATOM_PPD_TOPO_PRI_USD (ATOM_PPD_CONN_TRANSPARENT | ATOM_PPD_DEV_USD)
#define ATOM_PPD_TOPO_PRI_DSD (ATOM_PPD_CONN_TRANSPARENT | ATOM_PPD_DEV_DSD)
#define ATOM_PPD_TOPO_SEC_USD (ATOM_PPD_CONN_RP | ATOM_PPD_DEV_USD)
#define ATOM_PPD_TOPO_SEC_DSD (ATOM_PPD_CONN_RP | ATOM_PPD_DEV_DSD)
#define ATOM_PPD_TOPO_B2B_USD (ATOM_PPD_CONN_B2B | ATOM_PPD_DEV_USD)
#define ATOM_PPD_TOPO_B2B_DSD (ATOM_PPD_CONN_B2B | ATOM_PPD_DEV_DSD)
#define ATOM_MW_COUNT 2
#define ATOM_DB_COUNT 34
#define ATOM_DB_VALID_MASK (BIT_ULL(ATOM_DB_COUNT) - 1)
#define ATOM_DB_MSIX_VECTOR_COUNT 34
#define ATOM_DB_MSIX_VECTOR_SHIFT 1
#define ATOM_DB_TOTAL_SHIFT 34
#define ATOM_SPAD_COUNT 16
#define ATOM_NTB_CTL_DOWN_BIT BIT(16)
#define ATOM_NTB_CTL_ACTIVE(x) !(x & ATOM_NTB_CTL_DOWN_BIT)
#define ATOM_DESKEWSTS_DBERR BIT(15)
#define ATOM_LTSSMERRSTS0_UNEXPECTEDEI BIT(20)
#define ATOM_LTSSMSTATEJMP_FORCEDETECT BIT(2)
#define ATOM_IBIST_ERR_OFLOW 0x7FFF7FFF
#define ATOM_LINK_HB_TIMEOUT msecs_to_jiffies(1000)
#define ATOM_LINK_RECOVERY_TIME msecs_to_jiffies(500)
/* Ntb control and link status */ /* Ntb control and link status */
#define NTB_CTL_CFG_LOCK BIT(0) #define NTB_CTL_CFG_LOCK BIT(0)
......
This diff is collapsed.
...@@ -63,12 +63,11 @@ ...@@ -63,12 +63,11 @@
#define DRIVER_NAME "ntb" #define DRIVER_NAME "ntb"
#define DRIVER_DESCRIPTION "PCIe NTB Driver Framework" #define DRIVER_DESCRIPTION "PCIe NTB Driver Framework"
#define DRIVER_LICENSE "Dual BSD/GPL"
#define DRIVER_VERSION "1.0" #define DRIVER_VERSION "1.0"
#define DRIVER_RELDATE "24 March 2015" #define DRIVER_RELDATE "24 March 2015"
#define DRIVER_AUTHOR "Allen Hubbe <Allen.Hubbe@emc.com>" #define DRIVER_AUTHOR "Allen Hubbe <Allen.Hubbe@emc.com>"
MODULE_LICENSE(DRIVER_LICENSE); MODULE_LICENSE("Dual BSD/GPL");
MODULE_VERSION(DRIVER_VERSION); MODULE_VERSION(DRIVER_VERSION);
MODULE_AUTHOR(DRIVER_AUTHOR); MODULE_AUTHOR(DRIVER_AUTHOR);
MODULE_DESCRIPTION(DRIVER_DESCRIPTION); MODULE_DESCRIPTION(DRIVER_DESCRIPTION);
...@@ -112,7 +111,6 @@ int ntb_register_device(struct ntb_dev *ntb) ...@@ -112,7 +111,6 @@ int ntb_register_device(struct ntb_dev *ntb)
init_completion(&ntb->released); init_completion(&ntb->released);
memset(&ntb->dev, 0, sizeof(ntb->dev));
ntb->dev.bus = &ntb_bus; ntb->dev.bus = &ntb_bus;
ntb->dev.parent = &ntb->pdev->dev; ntb->dev.parent = &ntb->pdev->dev;
ntb->dev.release = ntb_dev_release; ntb->dev.release = ntb_dev_release;
......
...@@ -1003,6 +1003,9 @@ static int ntb_transport_init_queue(struct ntb_transport_ctx *nt, ...@@ -1003,6 +1003,9 @@ static int ntb_transport_init_queue(struct ntb_transport_ctx *nt,
mw_base = nt->mw_vec[mw_num].phys_addr; mw_base = nt->mw_vec[mw_num].phys_addr;
mw_size = nt->mw_vec[mw_num].phys_size; mw_size = nt->mw_vec[mw_num].phys_size;
if (max_mw_size && mw_size > max_mw_size)
mw_size = max_mw_size;
tx_size = (unsigned int)mw_size / num_qps_mw; tx_size = (unsigned int)mw_size / num_qps_mw;
qp_offset = tx_size * (qp_num / mw_count); qp_offset = tx_size * (qp_num / mw_count);
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -71,6 +71,7 @@ struct pci_dev; ...@@ -71,6 +71,7 @@ struct pci_dev;
* @NTB_TOPO_B2B_USD: On primary side of local ntb upstream of remote ntb. * @NTB_TOPO_B2B_USD: On primary side of local ntb upstream of remote ntb.
* @NTB_TOPO_B2B_DSD: On primary side of local ntb downstream of remote ntb. * @NTB_TOPO_B2B_DSD: On primary side of local ntb downstream of remote ntb.
* @NTB_TOPO_SWITCH: Connected via a switch which supports ntb. * @NTB_TOPO_SWITCH: Connected via a switch which supports ntb.
* @NTB_TOPO_CROSSLINK: Connected via two symmetric switchecs
*/ */
enum ntb_topo { enum ntb_topo {
NTB_TOPO_NONE = -1, NTB_TOPO_NONE = -1,
...@@ -79,6 +80,7 @@ enum ntb_topo { ...@@ -79,6 +80,7 @@ enum ntb_topo {
NTB_TOPO_B2B_USD, NTB_TOPO_B2B_USD,
NTB_TOPO_B2B_DSD, NTB_TOPO_B2B_DSD,
NTB_TOPO_SWITCH, NTB_TOPO_SWITCH,
NTB_TOPO_CROSSLINK,
}; };
static inline int ntb_topo_is_b2b(enum ntb_topo topo) static inline int ntb_topo_is_b2b(enum ntb_topo topo)
...@@ -94,12 +96,13 @@ static inline int ntb_topo_is_b2b(enum ntb_topo topo) ...@@ -94,12 +96,13 @@ static inline int ntb_topo_is_b2b(enum ntb_topo topo)
static inline char *ntb_topo_string(enum ntb_topo topo) static inline char *ntb_topo_string(enum ntb_topo topo)
{ {
switch (topo) { switch (topo) {
case NTB_TOPO_NONE: return "NTB_TOPO_NONE"; case NTB_TOPO_NONE: return "NTB_TOPO_NONE";
case NTB_TOPO_PRI: return "NTB_TOPO_PRI"; case NTB_TOPO_PRI: return "NTB_TOPO_PRI";
case NTB_TOPO_SEC: return "NTB_TOPO_SEC"; case NTB_TOPO_SEC: return "NTB_TOPO_SEC";
case NTB_TOPO_B2B_USD: return "NTB_TOPO_B2B_USD"; case NTB_TOPO_B2B_USD: return "NTB_TOPO_B2B_USD";
case NTB_TOPO_B2B_DSD: return "NTB_TOPO_B2B_DSD"; case NTB_TOPO_B2B_DSD: return "NTB_TOPO_B2B_DSD";
case NTB_TOPO_SWITCH: return "NTB_TOPO_SWITCH"; case NTB_TOPO_SWITCH: return "NTB_TOPO_SWITCH";
case NTB_TOPO_CROSSLINK: return "NTB_TOPO_CROSSLINK";
} }
return "NTB_TOPO_INVALID"; return "NTB_TOPO_INVALID";
} }
...@@ -250,7 +253,7 @@ static inline int ntb_ctx_ops_is_valid(const struct ntb_ctx_ops *ops) ...@@ -250,7 +253,7 @@ static inline int ntb_ctx_ops_is_valid(const struct ntb_ctx_ops *ops)
* @msg_set_mask: See ntb_msg_set_mask(). * @msg_set_mask: See ntb_msg_set_mask().
* @msg_clear_mask: See ntb_msg_clear_mask(). * @msg_clear_mask: See ntb_msg_clear_mask().
* @msg_read: See ntb_msg_read(). * @msg_read: See ntb_msg_read().
* @msg_write: See ntb_msg_write(). * @peer_msg_write: See ntb_peer_msg_write().
*/ */
struct ntb_dev_ops { struct ntb_dev_ops {
int (*port_number)(struct ntb_dev *ntb); int (*port_number)(struct ntb_dev *ntb);
...@@ -321,8 +324,8 @@ struct ntb_dev_ops { ...@@ -321,8 +324,8 @@ struct ntb_dev_ops {
int (*msg_clear_sts)(struct ntb_dev *ntb, u64 sts_bits); int (*msg_clear_sts)(struct ntb_dev *ntb, u64 sts_bits);
int (*msg_set_mask)(struct ntb_dev *ntb, u64 mask_bits); int (*msg_set_mask)(struct ntb_dev *ntb, u64 mask_bits);
int (*msg_clear_mask)(struct ntb_dev *ntb, u64 mask_bits); int (*msg_clear_mask)(struct ntb_dev *ntb, u64 mask_bits);
int (*msg_read)(struct ntb_dev *ntb, int midx, int *pidx, u32 *msg); u32 (*msg_read)(struct ntb_dev *ntb, int *pidx, int midx);
int (*msg_write)(struct ntb_dev *ntb, int midx, int pidx, u32 msg); int (*peer_msg_write)(struct ntb_dev *ntb, int pidx, int midx, u32 msg);
}; };
static inline int ntb_dev_ops_is_valid(const struct ntb_dev_ops *ops) static inline int ntb_dev_ops_is_valid(const struct ntb_dev_ops *ops)
...@@ -384,7 +387,7 @@ static inline int ntb_dev_ops_is_valid(const struct ntb_dev_ops *ops) ...@@ -384,7 +387,7 @@ static inline int ntb_dev_ops_is_valid(const struct ntb_dev_ops *ops)
/* !ops->msg_set_mask == !ops->msg_count && */ /* !ops->msg_set_mask == !ops->msg_count && */
/* !ops->msg_clear_mask == !ops->msg_count && */ /* !ops->msg_clear_mask == !ops->msg_count && */
!ops->msg_read == !ops->msg_count && !ops->msg_read == !ops->msg_count &&
!ops->msg_write == !ops->msg_count && !ops->peer_msg_write == !ops->msg_count &&
1; 1;
} }
...@@ -764,7 +767,7 @@ static inline int ntb_mw_get_align(struct ntb_dev *ntb, int pidx, int widx, ...@@ -764,7 +767,7 @@ static inline int ntb_mw_get_align(struct ntb_dev *ntb, int pidx, int widx,
resource_size_t *size_align, resource_size_t *size_align,
resource_size_t *size_max) resource_size_t *size_max)
{ {
if (!(ntb_link_is_up(ntb, NULL, NULL) & (1 << pidx))) if (!(ntb_link_is_up(ntb, NULL, NULL) & BIT_ULL(pidx)))
return -ENOTCONN; return -ENOTCONN;
return ntb->ops->mw_get_align(ntb, pidx, widx, addr_align, size_align, return ntb->ops->mw_get_align(ntb, pidx, widx, addr_align, size_align,
...@@ -1459,31 +1462,29 @@ static inline int ntb_msg_clear_mask(struct ntb_dev *ntb, u64 mask_bits) ...@@ -1459,31 +1462,29 @@ static inline int ntb_msg_clear_mask(struct ntb_dev *ntb, u64 mask_bits)
} }
/** /**
* ntb_msg_read() - read message register with specified index * ntb_msg_read() - read inbound message register with specified index
* @ntb: NTB device context. * @ntb: NTB device context.
* @midx: Message register index
* @pidx: OUT - Port index of peer device a message retrieved from * @pidx: OUT - Port index of peer device a message retrieved from
* @msg: OUT - Data * @midx: Message register index
* *
* Read data from the specified message register. Source port index of a * Read data from the specified message register. Source port index of a
* message is retrieved as well. * message is retrieved as well.
* *
* Return: Zero on success, otherwise a negative error number. * Return: The value of the inbound message register.
*/ */
static inline int ntb_msg_read(struct ntb_dev *ntb, int midx, int *pidx, static inline u32 ntb_msg_read(struct ntb_dev *ntb, int *pidx, int midx)
u32 *msg)
{ {
if (!ntb->ops->msg_read) if (!ntb->ops->msg_read)
return -EINVAL; return ~(u32)0;
return ntb->ops->msg_read(ntb, midx, pidx, msg); return ntb->ops->msg_read(ntb, pidx, midx);
} }
/** /**
* ntb_msg_write() - write data to the specified message register * ntb_peer_msg_write() - write data to the specified peer message register
* @ntb: NTB device context. * @ntb: NTB device context.
* @midx: Message register index
* @pidx: Port index of peer device a message being sent to * @pidx: Port index of peer device a message being sent to
* @midx: Message register index
* @msg: Data to send * @msg: Data to send
* *
* Send data to a specified peer device using the defined message register. * Send data to a specified peer device using the defined message register.
...@@ -1492,13 +1493,13 @@ static inline int ntb_msg_read(struct ntb_dev *ntb, int midx, int *pidx, ...@@ -1492,13 +1493,13 @@ static inline int ntb_msg_read(struct ntb_dev *ntb, int midx, int *pidx,
* *
* Return: Zero on success, otherwise a negative error number. * Return: Zero on success, otherwise a negative error number.
*/ */
static inline int ntb_msg_write(struct ntb_dev *ntb, int midx, int pidx, static inline int ntb_peer_msg_write(struct ntb_dev *ntb, int pidx, int midx,
u32 msg) u32 msg)
{ {
if (!ntb->ops->msg_write) if (!ntb->ops->peer_msg_write)
return -EINVAL; return -EINVAL;
return ntb->ops->msg_write(ntb, midx, pidx, msg); return ntb->ops->peer_msg_write(ntb, pidx, midx, msg);
} }
#endif #endif
...@@ -168,6 +168,14 @@ struct ntb_info_regs { ...@@ -168,6 +168,14 @@ struct ntb_info_regs {
u16 reserved1; u16 reserved1;
u64 ep_map; u64 ep_map;
u16 requester_id; u16 requester_id;
u16 reserved2;
u32 reserved3[4];
struct nt_partition_info {
u32 xlink_enabled;
u32 target_part_low;
u32 target_part_high;
u32 reserved;
} ntp_info[48];
} __packed; } __packed;
struct part_cfg_regs { struct part_cfg_regs {
...@@ -284,7 +292,20 @@ enum { ...@@ -284,7 +292,20 @@ enum {
struct pff_csr_regs { struct pff_csr_regs {
u16 vendor_id; u16 vendor_id;
u16 device_id; u16 device_id;
u32 pci_cfg_header[15]; u16 pcicmd;
u16 pcists;
u32 pci_class;
u32 pci_opts;
union {
u32 pci_bar[6];
u64 pci_bar64[3];
};
u32 pci_cardbus;
u32 pci_subsystem_id;
u32 pci_expansion_rom;
u32 pci_cap_ptr;
u32 reserved1;
u32 pci_irq;
u32 pci_cap_region[48]; u32 pci_cap_region[48];
u32 pcie_cap_region[448]; u32 pcie_cap_region[448];
u32 indirect_gas_window[128]; u32 indirect_gas_window[128];
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment