net: ipa: fix table alignment requirement
[ 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>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
c2cf0613d1
commit
3ae25aca3f
@@ -118,14 +118,6 @@
|
|||||||
/* Check things that can be validated at build time. */
|
/* Check things that can be validated at build time. */
|
||||||
static void ipa_table_validate_build(void)
|
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
|
/* Filter and route tables contain DMA addresses that refer
|
||||||
* to filter or route rules. But the size of a table entry
|
* 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
|
* 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)
|
if (!virt)
|
||||||
return -ENOMEM;
|
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_virt = virt;
|
||||||
ipa->table_addr = addr;
|
ipa->table_addr = addr;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user