lkml.org 
[lkml]   [2017]   [Dec]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 3.16 108/204] bus: mbus: fix window size calculation for 4GB windows
    3.16.52-rc1 review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Jan Luebbe <jlu@pengutronix.de>

    commit 2bbbd96357ce76cc45ec722c00f654aa7b189112 upstream.

    At least the Armada XP SoC supports 4GB on a single DRAM window. Because
    the size register values contain the actual size - 1, the MSB is set in
    that case. For example, the SDRAM window's control register's value is
    0xffffffe1 for 4GB (bits 31 to 24 contain the size).

    The MBUS driver reads back each window's size from registers and
    calculates the actual size as (control_reg | ~DDR_SIZE_MASK) + 1, which
    overflows for 32 bit values, resulting in other miscalculations further
    on (a bad RAM window for the CESA crypto engine calculated by
    mvebu_mbus_setup_cpu_target_nooverlap() in my case).

    This patch changes the type in 'struct mbus_dram_window' from u32 to
    u64, which allows us to keep using the same register calculation code in
    most MBUS-using drivers (which calculate ->size - 1 again).

    Fixes: fddddb52a6c4 ("bus: introduce an Marvell EBU MBus driver")
    Signed-off-by: Jan Luebbe <jlu@pengutronix.de>
    Signed-off-by: Gregory CLEMENT <gregory.clement@free-electrons.com>
    Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
    ---
    drivers/bus/mvebu-mbus.c | 2 +-
    include/linux/mbus.h | 4 ++--
    2 files changed, 3 insertions(+), 3 deletions(-)

    --- a/drivers/bus/mvebu-mbus.c
    +++ b/drivers/bus/mvebu-mbus.c
    @@ -523,7 +523,7 @@ mvebu_mbus_default_setup_cpu_target(stru
    if (mbus->hw_io_coherency)
    w->mbus_attr |= ATTR_HW_COHERENCY;
    w->base = base & DDR_BASE_CS_LOW_MASK;
    - w->size = (size | ~DDR_SIZE_MASK) + 1;
    + w->size = (u64)(size | ~DDR_SIZE_MASK) + 1;
    }
    }
    mvebu_mbus_dram_info.num_cs = cs;
    --- a/include/linux/mbus.h
    +++ b/include/linux/mbus.h
    @@ -29,8 +29,8 @@ struct mbus_dram_target_info
    struct mbus_dram_window {
    u8 cs_index;
    u8 mbus_attr;
    - u32 base;
    - u32 size;
    + u64 base;
    + u64 size;
    } cs[4];
    };

    \
     
     \ /
      Last update: 2017-12-28 18:56    [W:4.292 / U:0.048 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site