summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorAlex Elder <elder@linaro.org>2021-03-18 13:59:29 -0500
committerDavid S. Miller <davem@davemloft.net>2021-03-18 16:20:34 -0700
commite5d4e96b44cf20330c970c3e30ea0a8c3a23feca (patch)
treeda22178ff3813b1baab07f36004ddd65bb9d1280 /drivers
parent3c54b7be5d3677f37dfcd68afcc1d8e2b677a5b9 (diff)
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: Alex Elder <elder@linaro.org> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/ipa/ipa_table.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/drivers/net/ipa/ipa_table.c b/drivers/net/ipa/ipa_table.c
index dd07fe9dd87a..988f2c2886b9 100644
--- a/drivers/net/ipa/ipa_table.c
+++ b/drivers/net/ipa/ipa_table.c
@@ -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;