Messages in this thread | | | From | "Allen Hubbe" <> | Subject | RE: [PATCH 2/2] ntb_hw_switchtec: Check for alignment of the buffer in mw_set_trans() | Date | Mon, 11 Dec 2017 09:58:29 -0500 |
| |
From: Logan Gunthorpe > With Switchtec hardware, the buffer used for a memory window must be > aligned to its size (the hardware only replaces the lower bits). In > certain circumstances dma_alloc_coherent() will not provide a buffer > that adheres to this requirement like when using the CMA and > CONFIG_CMA_ALIGNMENT is set lower than the buffer size. > > When we get an unaligned buffer mw_set_trans() should return an error. > We also log an error so we know the cause of the problem. > > Signed-off-by: Logan Gunthorpe <logang@deltatee.com> > Cc: Jon Mason <jdmason@kudzu.us> > --- > drivers/ntb/hw/mscc/ntb_hw_switchtec.c | 13 +++++++++++++ > 1 file changed, 13 insertions(+) > > diff --git a/drivers/ntb/hw/mscc/ntb_hw_switchtec.c b/drivers/ntb/hw/mscc/ntb_hw_switchtec.c > index 709f37fbe232..984b83bc7dd3 100644 > --- a/drivers/ntb/hw/mscc/ntb_hw_switchtec.c > +++ b/drivers/ntb/hw/mscc/ntb_hw_switchtec.c > @@ -315,6 +315,19 @@ static int switchtec_ntb_mw_set_trans(struct ntb_dev *ntb, int pidx, int widx, > if (xlate_pos < 12) > return -EINVAL; > > + if (addr & ((1 << xlate_pos) - 1)) {
!IS_ALIGNED(addr, BIT_ULL(xlate_pos))
> + /* > + * In certain circumstances we can get a buffer that is > + * not aligned to its size. (Most of the time > + * dma_alloc_coherent ensures this). This can happen when > + * using large buffers allocated by the CMA > + * (see CMA_CONFIG_ALIGNMENT) > + */ > + dev_err(&sndev->stdev->dev, > + "ERROR: Memory window address is not aligned to it's size!\n");
This would be the only ntb hw driver that prints an error in this situation. The ntb_mw_get_align() should provide enough information to client drivers to determine the alignment requirements before calling ntb_mw_set_trans(). IMO no need to print here, but let's see what others say.
> + return -EINVAL; > + } > + > rc = switchtec_ntb_part_op(sndev, ctl, NTB_CTRL_PART_OP_LOCK, > NTB_CTRL_PART_STATUS_LOCKED); > if (rc) > -- > 2.11.0
| |