Commit 980c41c8 authored by Logan Gunthorpe's avatar Logan Gunthorpe Committed by Jon Mason

NTB: Ensure ntb_mw_get_align() is only called when the link is up

With Switchtec hardware it's impossible to get the alignment parameters
for a peer's memory window until the peer's driver has configured its
windows. Strictly speaking, the link doesn't have to be up for this,
but the link being up is the only way the client can tell that
the other side has been configured.

This patch converts ntb_transport and ntb_perf to use this function after
the link goes up. This simplifies these clients slightly because they
no longer have to store the alignment parameters. It also tweaks
ntb_tool so that peer_mw_trans will print zero if it is run before
the link goes up.
Signed-off-by: default avatarLogan Gunthorpe <logang@deltatee.com>
Acked-by: default avatarAllen Hubbe <Allen.Hubbe@dell.com>
Signed-off-by: default avatarJon Mason <jdmason@kudzu.us>
parent 48c302dc
...@@ -191,8 +191,6 @@ struct ntb_transport_qp { ...@@ -191,8 +191,6 @@ struct ntb_transport_qp {
struct ntb_transport_mw { struct ntb_transport_mw {
phys_addr_t phys_addr; phys_addr_t phys_addr;
resource_size_t phys_size; resource_size_t phys_size;
resource_size_t xlat_align;
resource_size_t xlat_align_size;
void __iomem *vbase; void __iomem *vbase;
size_t xlat_size; size_t xlat_size;
size_t buff_size; size_t buff_size;
...@@ -687,13 +685,20 @@ static int ntb_set_mw(struct ntb_transport_ctx *nt, int num_mw, ...@@ -687,13 +685,20 @@ static int ntb_set_mw(struct ntb_transport_ctx *nt, int num_mw,
struct ntb_transport_mw *mw = &nt->mw_vec[num_mw]; struct ntb_transport_mw *mw = &nt->mw_vec[num_mw];
struct pci_dev *pdev = nt->ndev->pdev; struct pci_dev *pdev = nt->ndev->pdev;
size_t xlat_size, buff_size; size_t xlat_size, buff_size;
resource_size_t xlat_align;
resource_size_t xlat_align_size;
int rc; int rc;
if (!size) if (!size)
return -EINVAL; return -EINVAL;
xlat_size = round_up(size, mw->xlat_align_size); rc = ntb_mw_get_align(nt->ndev, PIDX, num_mw, &xlat_align,
buff_size = round_up(size, mw->xlat_align); &xlat_align_size, NULL);
if (rc)
return rc;
xlat_size = round_up(size, xlat_align_size);
buff_size = round_up(size, xlat_align);
/* No need to re-setup */ /* No need to re-setup */
if (mw->xlat_size == xlat_size) if (mw->xlat_size == xlat_size)
...@@ -722,7 +727,7 @@ static int ntb_set_mw(struct ntb_transport_ctx *nt, int num_mw, ...@@ -722,7 +727,7 @@ static int ntb_set_mw(struct ntb_transport_ctx *nt, int num_mw,
* is a requirement of the hardware. It is recommended to setup CMA * is a requirement of the hardware. It is recommended to setup CMA
* for BAR sizes equal or greater than 4MB. * for BAR sizes equal or greater than 4MB.
*/ */
if (!IS_ALIGNED(mw->dma_addr, mw->xlat_align)) { if (!IS_ALIGNED(mw->dma_addr, xlat_align)) {
dev_err(&pdev->dev, "DMA memory %pad is not aligned\n", dev_err(&pdev->dev, "DMA memory %pad is not aligned\n",
&mw->dma_addr); &mw->dma_addr);
ntb_free_mw(nt, num_mw); ntb_free_mw(nt, num_mw);
...@@ -1104,11 +1109,6 @@ static int ntb_transport_probe(struct ntb_client *self, struct ntb_dev *ndev) ...@@ -1104,11 +1109,6 @@ static int ntb_transport_probe(struct ntb_client *self, struct ntb_dev *ndev)
for (i = 0; i < mw_count; i++) { for (i = 0; i < mw_count; i++) {
mw = &nt->mw_vec[i]; mw = &nt->mw_vec[i];
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, rc = ntb_peer_mw_get_addr(ndev, i, &mw->phys_addr,
&mw->phys_size); &mw->phys_size);
if (rc) if (rc)
......
...@@ -108,8 +108,6 @@ MODULE_PARM_DESC(on_node, "Run threads only on NTB device node (default: true)") ...@@ -108,8 +108,6 @@ MODULE_PARM_DESC(on_node, "Run threads only on NTB device node (default: true)")
struct perf_mw { struct perf_mw {
phys_addr_t phys_addr; phys_addr_t phys_addr;
resource_size_t phys_size; resource_size_t phys_size;
resource_size_t xlat_align;
resource_size_t xlat_align_size;
void __iomem *vbase; void __iomem *vbase;
size_t xlat_size; size_t xlat_size;
size_t buf_size; size_t buf_size;
...@@ -472,13 +470,20 @@ static int perf_set_mw(struct perf_ctx *perf, resource_size_t size) ...@@ -472,13 +470,20 @@ static int perf_set_mw(struct perf_ctx *perf, resource_size_t size)
{ {
struct perf_mw *mw = &perf->mw; struct perf_mw *mw = &perf->mw;
size_t xlat_size, buf_size; size_t xlat_size, buf_size;
resource_size_t xlat_align;
resource_size_t xlat_align_size;
int rc; int rc;
if (!size) if (!size)
return -EINVAL; return -EINVAL;
xlat_size = round_up(size, mw->xlat_align_size); rc = ntb_mw_get_align(perf->ntb, PIDX, 0, &xlat_align,
buf_size = round_up(size, mw->xlat_align); &xlat_align_size, NULL);
if (rc)
return rc;
xlat_size = round_up(size, xlat_align_size);
buf_size = round_up(size, xlat_align);
if (mw->xlat_size == xlat_size) if (mw->xlat_size == xlat_size)
return 0; return 0;
...@@ -567,11 +572,6 @@ static int perf_setup_mw(struct ntb_dev *ntb, struct perf_ctx *perf) ...@@ -567,11 +572,6 @@ static int perf_setup_mw(struct ntb_dev *ntb, struct perf_ctx *perf)
mw = &perf->mw; mw = &perf->mw;
rc = ntb_mw_get_align(ntb, PIDX, 0, &mw->xlat_align,
&mw->xlat_align_size, NULL);
if (rc)
return rc;
rc = ntb_peer_mw_get_addr(ntb, 0, &mw->phys_addr, &mw->phys_size); rc = ntb_peer_mw_get_addr(ntb, 0, &mw->phys_addr, &mw->phys_size);
if (rc) if (rc)
return rc; return rc;
......
...@@ -753,9 +753,9 @@ static ssize_t tool_peer_mw_trans_read(struct file *filep, ...@@ -753,9 +753,9 @@ static ssize_t tool_peer_mw_trans_read(struct file *filep,
phys_addr_t base; phys_addr_t base;
resource_size_t mw_size; resource_size_t mw_size;
resource_size_t align_addr; resource_size_t align_addr = 0;
resource_size_t align_size; resource_size_t align_size = 0;
resource_size_t max_size; resource_size_t max_size = 0;
buf_size = min_t(size_t, size, 512); buf_size = min_t(size_t, size, 512);
......
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