]> git.itanic.dy.fi Git - linux-stable/commitdiff
net: ipa: fix table alignment requirement
authorAlex Elder <elder@linaro.org>
Thu, 18 Mar 2021 18:59:29 +0000 (13:59 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 28 Sep 2022 09:10:34 +0000 (11:10 +0200)
[ Upstream commit e5d4e96b44cf20330c970c3e30ea0a8c3a23feca ]

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>
Stable-dep-of: cf412ec33325 ("net: ipa: properly limit modem routing table use")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/ipa/ipa_table.c

index f26cb9d706dac9c89c49adaed20dc9c0b6fa651b..45e1d68b469459e947ddeebeb0e973318501fda1 100644 (file)
 /* 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
@@ -669,6 +661,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;