Skip to content

Commit e8a71a3

Browse files
committed
Merge tag 'ntb-5.1' of git://github.com/jonmason/ntb
Pull NTB updates from Jon Mason: - fixes for switchtec debugability and mapping table entries - NTB transport improvements - a reworking of the peer_db_addr for better abstraction * tag 'ntb-5.1' of git://github.com/jonmason/ntb: NTB: add new parameter to peer_db_addr() db_bit and db_data NTB: ntb_transport: Ensure the destination buffer is mapped for TX DMA NTB: ntb_transport: Free MWs in ntb_transport_link_cleanup() ntb_hw_switchtec: Added support of >=4G memory windows ntb_hw_switchtec: NT req id mapping table register entry number should be 512 ntb_hw_switchtec: debug print 64bit aligned crosslink BAR Numbers
2 parents 2b9c272 + ebb09b3 commit e8a71a3

File tree

7 files changed

+113
-21
lines changed

7 files changed

+113
-21
lines changed

drivers/ntb/hw/intel/ntb_hw_gen1.c

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ int ndev_mw_to_bar(struct intel_ntb_dev *ndev, int idx)
180180
return ndev->reg->mw_bar[idx];
181181
}
182182

183-
static inline int ndev_db_addr(struct intel_ntb_dev *ndev,
183+
void ndev_db_addr(struct intel_ntb_dev *ndev,
184184
phys_addr_t *db_addr, resource_size_t *db_size,
185185
phys_addr_t reg_addr, unsigned long reg)
186186
{
@@ -196,8 +196,6 @@ static inline int ndev_db_addr(struct intel_ntb_dev *ndev,
196196
*db_size = ndev->reg->db_size;
197197
dev_dbg(&ndev->ntb.pdev->dev, "Peer db size %llx\n", *db_size);
198198
}
199-
200-
return 0;
201199
}
202200

203201
u64 ndev_db_read(struct intel_ntb_dev *ndev,
@@ -1111,13 +1109,28 @@ int intel_ntb_db_clear_mask(struct ntb_dev *ntb, u64 db_bits)
11111109
ndev->self_reg->db_mask);
11121110
}
11131111

1114-
int intel_ntb_peer_db_addr(struct ntb_dev *ntb, phys_addr_t *db_addr,
1115-
resource_size_t *db_size)
1112+
static int intel_ntb_peer_db_addr(struct ntb_dev *ntb, phys_addr_t *db_addr,
1113+
resource_size_t *db_size, u64 *db_data, int db_bit)
11161114
{
1115+
u64 db_bits;
11171116
struct intel_ntb_dev *ndev = ntb_ndev(ntb);
11181117

1119-
return ndev_db_addr(ndev, db_addr, db_size, ndev->peer_addr,
1118+
if (unlikely(db_bit >= BITS_PER_LONG_LONG))
1119+
return -EINVAL;
1120+
1121+
db_bits = BIT_ULL(db_bit);
1122+
1123+
if (unlikely(db_bits & ~ntb_ndev(ntb)->db_valid_mask))
1124+
return -EINVAL;
1125+
1126+
ndev_db_addr(ndev, db_addr, db_size, ndev->peer_addr,
11201127
ndev->peer_reg->db_bell);
1128+
1129+
if (db_data)
1130+
*db_data = db_bits;
1131+
1132+
1133+
return 0;
11211134
}
11221135

11231136
static int intel_ntb_peer_db_set(struct ntb_dev *ntb, u64 db_bits)

drivers/ntb/hw/intel/ntb_hw_gen1.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,9 @@ extern struct intel_b2b_addr xeon_b2b_dsd_addr;
147147
int ndev_init_isr(struct intel_ntb_dev *ndev, int msix_min, int msix_max,
148148
int msix_shift, int total_shift);
149149
enum ntb_topo xeon_ppd_topo(struct intel_ntb_dev *ndev, u8 ppd);
150+
void ndev_db_addr(struct intel_ntb_dev *ndev,
151+
phys_addr_t *db_addr, resource_size_t *db_size,
152+
phys_addr_t reg_addr, unsigned long reg);
150153
u64 ndev_db_read(struct intel_ntb_dev *ndev, void __iomem *mmio);
151154
int ndev_db_write(struct intel_ntb_dev *ndev, u64 db_bits,
152155
void __iomem *mmio);
@@ -166,8 +169,6 @@ int intel_ntb_db_vector_count(struct ntb_dev *ntb);
166169
u64 intel_ntb_db_vector_mask(struct ntb_dev *ntb, int db_vector);
167170
int intel_ntb_db_set_mask(struct ntb_dev *ntb, u64 db_bits);
168171
int intel_ntb_db_clear_mask(struct ntb_dev *ntb, u64 db_bits);
169-
int intel_ntb_peer_db_addr(struct ntb_dev *ntb, phys_addr_t *db_addr,
170-
resource_size_t *db_size);
171172
int intel_ntb_spad_is_unsafe(struct ntb_dev *ntb);
172173
int intel_ntb_spad_count(struct ntb_dev *ntb);
173174
u32 intel_ntb_spad_read(struct ntb_dev *ntb, int idx);

drivers/ntb/hw/intel/ntb_hw_gen3.c

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -532,6 +532,37 @@ static int intel_ntb3_mw_set_trans(struct ntb_dev *ntb, int pidx, int idx,
532532
return 0;
533533
}
534534

535+
int intel_ntb3_peer_db_addr(struct ntb_dev *ntb, phys_addr_t *db_addr,
536+
resource_size_t *db_size,
537+
u64 *db_data, int db_bit)
538+
{
539+
phys_addr_t db_addr_base;
540+
struct intel_ntb_dev *ndev = ntb_ndev(ntb);
541+
542+
if (unlikely(db_bit >= BITS_PER_LONG_LONG))
543+
return -EINVAL;
544+
545+
if (unlikely(BIT_ULL(db_bit) & ~ntb_ndev(ntb)->db_valid_mask))
546+
return -EINVAL;
547+
548+
ndev_db_addr(ndev, &db_addr_base, db_size, ndev->peer_addr,
549+
ndev->peer_reg->db_bell);
550+
551+
if (db_addr) {
552+
*db_addr = db_addr_base + (db_bit * 4);
553+
dev_dbg(&ndev->ntb.pdev->dev, "Peer db addr %llx db bit %d\n",
554+
*db_addr, db_bit);
555+
}
556+
557+
if (db_data) {
558+
*db_data = 1;
559+
dev_dbg(&ndev->ntb.pdev->dev, "Peer db data %llx db bit %d\n",
560+
*db_data, db_bit);
561+
}
562+
563+
return 0;
564+
}
565+
535566
static int intel_ntb3_peer_db_set(struct ntb_dev *ntb, u64 db_bits)
536567
{
537568
struct intel_ntb_dev *ndev = ntb_ndev(ntb);
@@ -584,7 +615,7 @@ const struct ntb_dev_ops intel_ntb3_ops = {
584615
.db_clear = intel_ntb3_db_clear,
585616
.db_set_mask = intel_ntb_db_set_mask,
586617
.db_clear_mask = intel_ntb_db_clear_mask,
587-
.peer_db_addr = intel_ntb_peer_db_addr,
618+
.peer_db_addr = intel_ntb3_peer_db_addr,
588619
.peer_db_set = intel_ntb3_peer_db_set,
589620
.spad_is_unsafe = intel_ntb_spad_is_unsafe,
590621
.spad_count = intel_ntb_spad_count,

drivers/ntb/hw/mscc/ntb_hw_switchtec.c

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,7 @@ static void switchtec_ntb_mw_clr_direct(struct switchtec_ntb *sndev, int idx)
236236
ctl_val &= ~NTB_CTRL_BAR_DIR_WIN_EN;
237237
iowrite32(ctl_val, &ctl->bar_entry[bar].ctl);
238238
iowrite32(0, &ctl->bar_entry[bar].win_size);
239+
iowrite32(0, &ctl->bar_ext_entry[bar].win_size);
239240
iowrite64(sndev->self_partition, &ctl->bar_entry[bar].xlate_addr);
240241
}
241242

@@ -258,7 +259,9 @@ static void switchtec_ntb_mw_set_direct(struct switchtec_ntb *sndev, int idx,
258259
ctl_val |= NTB_CTRL_BAR_DIR_WIN_EN;
259260

260261
iowrite32(ctl_val, &ctl->bar_entry[bar].ctl);
261-
iowrite32(xlate_pos | size, &ctl->bar_entry[bar].win_size);
262+
iowrite32(xlate_pos | (lower_32_bits(size) & 0xFFFFF000),
263+
&ctl->bar_entry[bar].win_size);
264+
iowrite32(upper_32_bits(size), &ctl->bar_ext_entry[bar].win_size);
262265
iowrite64(sndev->self_partition | addr,
263266
&ctl->bar_entry[bar].xlate_addr);
264267
}
@@ -679,11 +682,16 @@ static u64 switchtec_ntb_db_read_mask(struct ntb_dev *ntb)
679682

680683
static int switchtec_ntb_peer_db_addr(struct ntb_dev *ntb,
681684
phys_addr_t *db_addr,
682-
resource_size_t *db_size)
685+
resource_size_t *db_size,
686+
u64 *db_data,
687+
int db_bit)
683688
{
684689
struct switchtec_ntb *sndev = ntb_sndev(ntb);
685690
unsigned long offset;
686691

692+
if (unlikely(db_bit >= BITS_PER_LONG_LONG))
693+
return -EINVAL;
694+
687695
offset = (unsigned long)sndev->mmio_peer_dbmsg->odb -
688696
(unsigned long)sndev->stdev->mmio;
689697

@@ -693,6 +701,8 @@ static int switchtec_ntb_peer_db_addr(struct ntb_dev *ntb,
693701
*db_addr = pci_resource_start(ntb->pdev, 0) + offset;
694702
if (db_size)
695703
*db_size = sizeof(u32);
704+
if (db_data)
705+
*db_data = BIT_ULL(db_bit) << sndev->db_peer_shift;
696706

697707
return 0;
698708
}
@@ -1025,7 +1035,9 @@ static int crosslink_setup_mws(struct switchtec_ntb *sndev, int ntb_lut_idx,
10251035
ctl_val |= NTB_CTRL_BAR_DIR_WIN_EN;
10261036

10271037
iowrite32(ctl_val, &ctl->bar_entry[bar].ctl);
1028-
iowrite32(xlate_pos | size, &ctl->bar_entry[bar].win_size);
1038+
iowrite32(xlate_pos | (lower_32_bits(size) & 0xFFFFF000),
1039+
&ctl->bar_entry[bar].win_size);
1040+
iowrite32(upper_32_bits(size), &ctl->bar_ext_entry[bar].win_size);
10291041
iowrite64(sndev->peer_partition | addr,
10301042
&ctl->bar_entry[bar].xlate_addr);
10311043
}
@@ -1092,7 +1104,7 @@ static int crosslink_enum_partition(struct switchtec_ntb *sndev,
10921104

10931105
dev_dbg(&sndev->stdev->dev,
10941106
"Crosslink BAR%d addr: %llx\n",
1095-
i, bar_addr);
1107+
i*2, bar_addr);
10961108

10971109
if (bar_addr != bar_space * i)
10981110
continue;

drivers/ntb/ntb_transport.c

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,9 @@ struct ntb_transport_qp {
144144
struct list_head tx_free_q;
145145
spinlock_t ntb_tx_free_q_lock;
146146
void __iomem *tx_mw;
147-
dma_addr_t tx_mw_phys;
147+
phys_addr_t tx_mw_phys;
148+
size_t tx_mw_size;
149+
dma_addr_t tx_mw_dma_addr;
148150
unsigned int tx_index;
149151
unsigned int tx_max_entry;
150152
unsigned int tx_max_frame;
@@ -862,6 +864,9 @@ static void ntb_transport_link_cleanup(struct ntb_transport_ctx *nt)
862864
if (!nt->link_is_up)
863865
cancel_delayed_work_sync(&nt->link_work);
864866

867+
for (i = 0; i < nt->mw_count; i++)
868+
ntb_free_mw(nt, i);
869+
865870
/* The scratchpad registers keep the values if the remote side
866871
* goes down, blast them now to give them a sane value the next
867872
* time they are accessed
@@ -1049,6 +1054,7 @@ static int ntb_transport_init_queue(struct ntb_transport_ctx *nt,
10491054
tx_size = (unsigned int)mw_size / num_qps_mw;
10501055
qp_offset = tx_size * (qp_num / mw_count);
10511056

1057+
qp->tx_mw_size = tx_size;
10521058
qp->tx_mw = nt->mw_vec[mw_num].vbase + qp_offset;
10531059
if (!qp->tx_mw)
10541060
return -EINVAL;
@@ -1644,7 +1650,7 @@ static int ntb_async_tx_submit(struct ntb_transport_qp *qp,
16441650
dma_cookie_t cookie;
16451651

16461652
device = chan->device;
1647-
dest = qp->tx_mw_phys + qp->tx_max_frame * entry->tx_index;
1653+
dest = qp->tx_mw_dma_addr + qp->tx_max_frame * entry->tx_index;
16481654
buff_off = (size_t)buf & ~PAGE_MASK;
16491655
dest_off = (size_t)dest & ~PAGE_MASK;
16501656

@@ -1863,6 +1869,18 @@ ntb_transport_create_queue(void *data, struct device *client_dev,
18631869
qp->rx_dma_chan = NULL;
18641870
}
18651871

1872+
if (qp->tx_dma_chan) {
1873+
qp->tx_mw_dma_addr =
1874+
dma_map_resource(qp->tx_dma_chan->device->dev,
1875+
qp->tx_mw_phys, qp->tx_mw_size,
1876+
DMA_FROM_DEVICE, 0);
1877+
if (dma_mapping_error(qp->tx_dma_chan->device->dev,
1878+
qp->tx_mw_dma_addr)) {
1879+
qp->tx_mw_dma_addr = 0;
1880+
goto err1;
1881+
}
1882+
}
1883+
18661884
dev_dbg(&pdev->dev, "Using %s memcpy for TX\n",
18671885
qp->tx_dma_chan ? "DMA" : "CPU");
18681886

@@ -1904,6 +1922,10 @@ ntb_transport_create_queue(void *data, struct device *client_dev,
19041922
qp->rx_alloc_entry = 0;
19051923
while ((entry = ntb_list_rm(&qp->ntb_rx_q_lock, &qp->rx_free_q)))
19061924
kfree(entry);
1925+
if (qp->tx_mw_dma_addr)
1926+
dma_unmap_resource(qp->tx_dma_chan->device->dev,
1927+
qp->tx_mw_dma_addr, qp->tx_mw_size,
1928+
DMA_FROM_DEVICE, 0);
19071929
if (qp->tx_dma_chan)
19081930
dma_release_channel(qp->tx_dma_chan);
19091931
if (qp->rx_dma_chan)
@@ -1945,6 +1967,11 @@ void ntb_transport_free_queue(struct ntb_transport_qp *qp)
19451967
*/
19461968
dma_sync_wait(chan, qp->last_cookie);
19471969
dmaengine_terminate_all(chan);
1970+
1971+
dma_unmap_resource(chan->device->dev,
1972+
qp->tx_mw_dma_addr, qp->tx_mw_size,
1973+
DMA_FROM_DEVICE, 0);
1974+
19481975
dma_release_channel(chan);
19491976
}
19501977

include/linux/ntb.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,8 @@ struct ntb_dev_ops {
296296
int (*db_clear_mask)(struct ntb_dev *ntb, u64 db_bits);
297297

298298
int (*peer_db_addr)(struct ntb_dev *ntb,
299-
phys_addr_t *db_addr, resource_size_t *db_size);
299+
phys_addr_t *db_addr, resource_size_t *db_size,
300+
u64 *db_data, int db_bit);
300301
u64 (*peer_db_read)(struct ntb_dev *ntb);
301302
int (*peer_db_set)(struct ntb_dev *ntb, u64 db_bits);
302303
int (*peer_db_clear)(struct ntb_dev *ntb, u64 db_bits);
@@ -1078,6 +1079,8 @@ static inline int ntb_db_clear_mask(struct ntb_dev *ntb, u64 db_bits)
10781079
* @ntb: NTB device context.
10791080
* @db_addr: OUT - The address of the peer doorbell register.
10801081
* @db_size: OUT - The number of bytes to write the peer doorbell register.
1082+
* @db_data: OUT - The data of peer doorbell register
1083+
* @db_bit: door bell bit number
10811084
*
10821085
* Return the address of the peer doorbell register. This may be used, for
10831086
* example, by drivers that offload memory copy operations to a dma engine.
@@ -1091,12 +1094,13 @@ static inline int ntb_db_clear_mask(struct ntb_dev *ntb, u64 db_bits)
10911094
*/
10921095
static inline int ntb_peer_db_addr(struct ntb_dev *ntb,
10931096
phys_addr_t *db_addr,
1094-
resource_size_t *db_size)
1097+
resource_size_t *db_size,
1098+
u64 *db_data, int db_bit)
10951099
{
10961100
if (!ntb->ops->peer_db_addr)
10971101
return -EINVAL;
10981102

1099-
return ntb->ops->peer_db_addr(ntb, db_addr, db_size);
1103+
return ntb->ops->peer_db_addr(ntb, db_addr, db_size, db_data, db_bit);
11001104
}
11011105

11021106
/**

include/linux/switchtec.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -248,9 +248,13 @@ struct ntb_ctrl_regs {
248248
u32 win_size;
249249
u64 xlate_addr;
250250
} bar_entry[6];
251-
u32 reserved2[216];
252-
u32 req_id_table[256];
253-
u32 reserved3[512];
251+
struct {
252+
u32 win_size;
253+
u32 reserved[3];
254+
} bar_ext_entry[6];
255+
u32 reserved2[192];
256+
u32 req_id_table[512];
257+
u32 reserved3[256];
254258
u64 lut_entry[512];
255259
} __packed;
256260

0 commit comments

Comments
 (0)