diff options
author | Dave Jiang <dave.jiang@intel.com> | 2014-08-28 13:53:02 -0700 |
---|---|---|
committer | Jon Mason <jdmason@kudzu.us> | 2014-09-14 00:10:38 -0400 |
commit | 3cc5ba1938eea0de372a41d1687c8030049c5e8f (patch) | |
tree | 042e4a40cb3ae8470018821ca6ee569687d413b8 /drivers/ntb/ntb_transport.c | |
parent | 9ef6bf6c75abcfee3cfc3d751b8091200771aeec (diff) | |
download | linux-stable-3cc5ba1938eea0de372a41d1687c8030049c5e8f.tar.gz linux-stable-3cc5ba1938eea0de372a41d1687c8030049c5e8f.tar.bz2 linux-stable-3cc5ba1938eea0de372a41d1687c8030049c5e8f.zip |
ntb: Add alignment check to meet hardware requirement
The NTB translate register must have the value to be BAR size aligned.
This alignment check make sure that the DMA memory allocated has the
proper alignment. Another requirement for NTB to function properly with
memory window BAR size greater or equal to 4M is to use the CMA feature
in 3.16 kernel with the appropriate CONFIG_CMA_ALIGNMENT and
CONFIG_CMA_SIZE_MBYTES set.
Signed-off-by: Dave Jiang <dave.jiang@intel.com>
Signed-off-by: Jon Mason <jdmason@kudzu.us>
Diffstat (limited to 'drivers/ntb/ntb_transport.c')
-rw-r--r-- | drivers/ntb/ntb_transport.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/drivers/ntb/ntb_transport.c b/drivers/ntb/ntb_transport.c index 611fef48bdc3..e9bf2f47b61a 100644 --- a/drivers/ntb/ntb_transport.c +++ b/drivers/ntb/ntb_transport.c @@ -576,6 +576,19 @@ static int ntb_set_mw(struct ntb_transport *nt, int num_mw, unsigned int size) return -ENOMEM; } + /* + * we must ensure that the memory address allocated is BAR size + * aligned in order for the XLAT register to take the value. This + * is a requirement of the hardware. It is recommended to setup CMA + * for BAR sizes equal or greater than 4MB. + */ + if (!IS_ALIGNED(mw->dma_addr, mw->size)) { + dev_err(&pdev->dev, "DMA memory %pad not aligned to BAR size\n", + &mw->dma_addr); + ntb_free_mw(nt, num_mw); + return -ENOMEM; + } + /* Notify HW the memory location of the receive buffer */ ntb_set_mw_addr(nt->ndev, num_mw, mw->dma_addr); |