lkml.org 
[lkml]   [2022]   [Sep]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 094/141] net: ipa: fix table alignment requirement
    Date
    From: Alex Elder <elder@linaro.org>

    [ 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 | 20 ++++++++++++--------
    1 file changed, 12 insertions(+), 8 deletions(-)

    diff --git a/drivers/net/ipa/ipa_table.c b/drivers/net/ipa/ipa_table.c
    index f26cb9d706da..45e1d68b4694 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
    @@ -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;

    --
    2.35.1


    \
     
     \ /
      Last update: 2022-09-26 13:11    [W:5.762 / U:0.056 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site