NTB: Alter MW API to support multi-ports devices
Multi-port NTB devices permit to share a memory between all accessible peers. Memory Windows API is altered to correspondingly initialize and map memory windows for such devices: ntb_mw_count(pidx); - number of inbound memory windows, which can be allocated for shared buffer with specified peer device. ntb_mw_get_align(pidx, widx); - get alignment and size restriction parameters to properly allocate inbound memory region. ntb_peer_mw_count(); - get number of outbound memory windows. ntb_peer_mw_get_addr(widx); - get mapping address of an outbound memory window If hardware supports inbound translation configured on the local ntb port: ntb_mw_set_trans(pidx, widx); - set translation address of allocated inbound memory window so a peer device could access it. ntb_mw_clear_trans(pidx, widx); - clear the translation address of an inbound memory window. If hardware supports outbound translation configured on the peer ntb port: ntb_peer_mw_set_trans(pidx, widx); - set translation address of a memory window retrieved from a peer device ntb_peer_mw_clear_trans(pidx, widx); - clear the translation address of an outbound memory window Signed-off-by: Serge Semin <fancer.lancer@gmail.com> Acked-by: Allen Hubbe <Allen.Hubbe@dell.com> Signed-off-by: Jon Mason <jdmason@kudzu.us>
这个提交包含在:
@@ -673,7 +673,7 @@ static void ntb_free_mw(struct ntb_transport_ctx *nt, int num_mw)
|
||||
if (!mw->virt_addr)
|
||||
return;
|
||||
|
||||
ntb_mw_clear_trans(nt->ndev, num_mw);
|
||||
ntb_mw_clear_trans(nt->ndev, PIDX, num_mw);
|
||||
dma_free_coherent(&pdev->dev, mw->buff_size,
|
||||
mw->virt_addr, mw->dma_addr);
|
||||
mw->xlat_size = 0;
|
||||
@@ -730,7 +730,8 @@ static int ntb_set_mw(struct ntb_transport_ctx *nt, int num_mw,
|
||||
}
|
||||
|
||||
/* Notify HW the memory location of the receive buffer */
|
||||
rc = ntb_mw_set_trans(nt->ndev, num_mw, mw->dma_addr, mw->xlat_size);
|
||||
rc = ntb_mw_set_trans(nt->ndev, PIDX, num_mw, mw->dma_addr,
|
||||
mw->xlat_size);
|
||||
if (rc) {
|
||||
dev_err(&pdev->dev, "Unable to set mw%d translation", num_mw);
|
||||
ntb_free_mw(nt, num_mw);
|
||||
@@ -1058,7 +1059,12 @@ static int ntb_transport_probe(struct ntb_client *self, struct ntb_dev *ndev)
|
||||
int node;
|
||||
int rc, i;
|
||||
|
||||
mw_count = ntb_mw_count(ndev);
|
||||
mw_count = ntb_mw_count(ndev, PIDX);
|
||||
|
||||
if (!ndev->ops->mw_set_trans) {
|
||||
dev_err(&ndev->dev, "Inbound MW based NTB API is required\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (ntb_db_is_unsafe(ndev))
|
||||
dev_dbg(&ndev->dev,
|
||||
@@ -1100,8 +1106,13 @@ static int ntb_transport_probe(struct ntb_client *self, struct ntb_dev *ndev)
|
||||
for (i = 0; i < mw_count; i++) {
|
||||
mw = &nt->mw_vec[i];
|
||||
|
||||
rc = ntb_mw_get_range(ndev, i, &mw->phys_addr, &mw->phys_size,
|
||||
&mw->xlat_align, &mw->xlat_align_size);
|
||||
rc = ntb_mw_get_align(ndev, PIDX, i, &mw->xlat_align,
|
||||
&mw->xlat_align_size, NULL);
|
||||
if (rc)
|
||||
goto err1;
|
||||
|
||||
rc = ntb_peer_mw_get_addr(ndev, i, &mw->phys_addr,
|
||||
&mw->phys_size);
|
||||
if (rc)
|
||||
goto err1;
|
||||
|
||||
|
在新工单中引用
屏蔽一个用户