Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ntb_hw_switchtec: Check for alignment of the buffer in mw_set_trans()

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>
Signed-off-by: Jon Mason <jdmason@kudzu.us>

authored by

Logan Gunthorpe and committed by
Jon Mason
1e2fd202 cbd27448

+13
+13
drivers/ntb/hw/mscc/ntb_hw_switchtec.c
··· 320 320 if (xlate_pos < 12) 321 321 return -EINVAL; 322 322 323 + if (!IS_ALIGNED(addr, BIT_ULL(xlate_pos))) { 324 + /* 325 + * In certain circumstances we can get a buffer that is 326 + * not aligned to its size. (Most of the time 327 + * dma_alloc_coherent ensures this). This can happen when 328 + * using large buffers allocated by the CMA 329 + * (see CMA_CONFIG_ALIGNMENT) 330 + */ 331 + dev_err(&sndev->stdev->dev, 332 + "ERROR: Memory window address is not aligned to it's size!\n"); 333 + return -EINVAL; 334 + } 335 + 323 336 rc = switchtec_ntb_part_op(sndev, ctl, NTB_CTRL_PART_OP_LOCK, 324 337 NTB_CTRL_PART_STATUS_LOCKED); 325 338 if (rc)