Commit e5d4e96b authored by Alex Elder's avatar Alex Elder Committed by David S. Miller
Browse files

net: ipa: fix table alignment requirement



We currently have a build-time check to ensure that the minimum DMA
allocation alignment satisfies the constraint that IPA filter and
route tables must point to rules that are 128-byte aligned.

But what's really important is that the actual allocated DMA memory
has that alignment, even if the minimum is smaller than that.

Remove the BUILD_BUG_ON() call checking against minimim DMA alignment
and instead verify at rutime that the allocated memory is properly
aligned.

Signed-off-by: default avatarAlex Elder <elder@linaro.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 3c54b7be
Loading
Loading
Loading
Loading
+12 −8
Original line number Diff line number Diff line
@@ -118,14 +118,6 @@
/* Check things that can be validated at build time. */
static void ipa_table_validate_build(void)
{
	/* IPA hardware accesses memory 128 bytes at a time.  Addresses
	 * referred to by entries in filter and route tables must be
	 * aligned on 128-byte byte boundaries.  The only rule address
	 * ever use is the "zero rule", and it's aligned at the base
	 * of a coherent DMA allocation.
	 */
	BUILD_BUG_ON(ARCH_DMA_MINALIGN % IPA_TABLE_ALIGN);

	/* Filter and route tables contain DMA addresses that refer
	 * to filter or route rules.  But the size of a table entry
	 * is 64 bits regardless of what the size of an AP DMA address
@@ -665,6 +657,18 @@ int ipa_table_init(struct ipa *ipa)
	if (!virt)
		return -ENOMEM;

	/* We put the "zero rule" at the base of our table area.  The IPA
	 * hardware requires rules to be aligned on a 128-byte boundary.
	 * Make sure the allocation satisfies this constraint.
	 */
	if (addr % IPA_TABLE_ALIGN) {
		dev_err(dev, "table address %pad not %u-byte aligned\n",
			&addr, IPA_TABLE_ALIGN);
		dma_free_coherent(dev, size, virt, addr);

		return -ERANGE;
	}

	ipa->table_virt = virt;
	ipa->table_addr = addr;