12 Oct, 2017

1 commit

  • 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")
    CC: stable@vger.kernel.org
    Signed-off-by: Jan Luebbe
    Signed-off-by: Gregory CLEMENT

    Jan Luebbe
     

19 Nov, 2016

1 commit


15 Sep, 2016

1 commit

  • This patch provides a stub function for mvebu_mbus_get_io_win_info(),
    which will be used for all non-Orion (ARM32 MVEBU) platforms for
    compile test coverage.

    On such platforms this function will return an error so that drivers
    might detect a potential problem.

    Signed-off-by: Stefan Roese
    Acked-by: Gregory CLEMENT
    Cc: Thomas Petazzoni
    Cc: Marcin Wojtas
    Cc: Arnd Bergmann
    Cc: Andrew Lunn
    Cc: Vinod Koul
    Signed-off-by: Vinod Koul

    Stefan Roese
     

11 Jul, 2016

1 commit

  • The save_cpu_target functions should take "u32 __iomem *", not a
    plain "u32 *" as it is passed to register access functions. Fix
    the following warnings by adding the annotation:

    drivers/bus/mvebu-mbus.c:739:17: warning: incorrect type in argument 2 (different address spaces)
    drivers/bus/mvebu-mbus.c:739:17: expected void volatile [noderef] *addr
    drivers/bus/mvebu-mbus.c:739:17: got unsigned int [usertype] *
    drivers/bus/mvebu-mbus.c:741:17: warning: incorrect type in argument 2 (different address spaces)
    drivers/bus/mvebu-mbus.c:741:17: expected void volatile [noderef] *addr
    drivers/bus/mvebu-mbus.c:741:17: got unsigned int [usertype] *
    drivers/bus/mvebu-mbus.c:742:17: warning: incorrect type in argument 2 (different address spaces)
    drivers/bus/mvebu-mbus.c:742:17: expected void volatile [noderef] *addr
    drivers/bus/mvebu-mbus.c:742:17: got unsigned int [usertype] *
    drivers/bus/mvebu-mbus.c:744:17: warning: incorrect type in argument 2 (different address spaces)
    drivers/bus/mvebu-mbus.c:744:17: expected void volatile [noderef] *addr
    drivers/bus/mvebu-mbus.c:744:17: got unsigned int [usertype] *
    drivers/bus/mvebu-mbus.c:790:17: warning: incorrect type in argument 2 (different address spaces)
    drivers/bus/mvebu-mbus.c:790:17: expected void volatile [noderef] *addr
    drivers/bus/mvebu-mbus.c:790:17: got unsigned int [usertype] *
    drivers/bus/mvebu-mbus.c:792:17: warning: incorrect type in argument 2 (different address spaces)
    drivers/bus/mvebu-mbus.c:792:17: expected void volatile [noderef] *addr
    drivers/bus/mvebu-mbus.c:792:17: got unsigned int [usertype] *

    Signed-off-by: Ben Dooks
    Acked-by: Arnd Bergmann
    Signed-off-by: Gregory CLEMENT

    Ben Dooks
     

15 Mar, 2016

1 commit

  • This commit enables finding appropriate mbus window and obtaining its
    target id and attribute for given physical address in two separate
    routines, both for IO and DRAM windows. This functionality
    is needed for Armada XP/38x Network Controller's Buffer Manager and
    PnC configuration.

    [gregory.clement@free-electrons.com: Fix size test for
    mvebu_mbus_get_dram_win_info]

    Signed-off-by: Marcin Wojtas
    [DRAM window information reference in LKv3.10]
    Signed-off-by: Evan Wang
    Signed-off-by: Gregory CLEMENT
    Signed-off-by: David S. Miller

    Marcin Wojtas
     

28 May, 2015

1 commit

  • This commit introduces a variant of the mv_mbus_dram_info() function
    called mv_mbus_dram_info_nooverlap(). Both functions are used by
    Marvell drivers supporting devices doing DMA, and provide them a
    description the DRAM ranges that they need to configure their DRAM
    windows.

    The ranges provided by the mv_mbus_dram_info() function may overlap
    with the I/O windows if there is a lot (>= 4 GB) of RAM
    installed. This is not a problem for most of the DMA masters, except
    for the upcoming new CESA crypto driver because it does DMA to the
    SRAM, which is mapped through an I/O window. For this unit, we need to
    have DRAM ranges that do not overlap with the I/O windows.

    A first implementation done in commit 1737cac69369 ("bus: mvebu-mbus:
    make sure SDRAM CS for DMA don't overlap the MBus bridge window"),
    changed the information returned by mv_mbus_dram_info() to match this
    requirement. However, it broke the requirement of the other DMA
    masters than the DRAM ranges should have power of two sizes.

    To solve this situation, this commit introduces a new
    mv_mbus_dram_info_nooverlap() function, which returns the same
    information as mv_mbus_dram_info(), but guaranteed to not overlap with
    the I/O windows.

    In the end, it gives us two variants of the mv_mbus_dram_info*()
    functions:

    - The normal one, mv_mbus_dram_info(), which has been around for many
    years. This function returns the raw DRAM ranges, which are
    guaranteed to use power of two sizes, but will overlap with I/O
    windows. This function will therefore be used by all DMA masters
    (SATA, XOR, Ethernet, etc.) except the CESA crypto driver.

    - The new 'nooverlap' variant, mv_mbus_dram_info_nooverlap(). This
    function returns DRAM ranges after they have been "tweaked" to make
    sure they don't overlap with I/O windows. By doing this tweaking,
    we remove the power of two size guarantee. This variant will be
    used by the new CESA crypto driver.

    Signed-off-by: Thomas Petazzoni
    Signed-off-by: Gregory CLEMENT

    Thomas Petazzoni
     

01 Dec, 2014

1 commit

  • On Marvell EBU platforms, when doing suspend/resume, the SDRAM window
    configuration must be saved on suspend, and restored on
    resume. However, it needs to be restored on resume *before*
    re-entering the kernel, because the SDRAM window configuration defines
    the layout of the memory. For this reason, it cannot simply be done in
    the ->suspend() and ->resume() hooks of the mvebu-mbus driver.

    Instead, it needs to be restored by the bootloader "boot info"
    mechanism used when resuming. This mechanism allows the kernel to
    define a list of (address, value) pairs when suspending, that the
    bootloader will restore on resume before jumping back into the kernel.

    This commit therefore adds a new function to the mvebu-mbus driver,
    called mvebu_mbus_save_cpu_target(), which will be called by the
    platform code to make the mvebu-mbus driver save the SDRAM window
    configuration in a way that can be understood by the bootloader "boot
    info" mechanism.

    Signed-off-by: Thomas Petazzoni
    Reviewed-by: Gregory CLEMENT
    Link: https://lkml.kernel.org/r/1416585613-2113-8-git-send-email-thomas.petazzoni@free-electrons.com
    Signed-off-by: Jason Cooper

    Thomas Petazzoni
     

24 Apr, 2014

1 commit

  • Until now, the mvebu-mbus was guessing by itself whether hardware I/O
    coherency was available or not by poking into the Device Tree to see
    if the coherency fabric Device Tree node was present or not.

    However, on some upcoming SoCs, the presence or absence of the
    coherency fabric DT node isn't sufficient: in CONFIG_SMP, the
    coherency can be enabled, but not in !CONFIG_SMP.

    In order to clean this up, the mvebu_mbus_dt_init() function is
    extended to get a boolean argument telling whether coherency is
    enabled or not. Therefore, the logic to decide whether coherency is
    available or not now belongs to the core SoC code instead of the
    mvebu-mbus driver itself, which is much better.

    Signed-off-by: Thomas Petazzoni
    Link: https://lkml.kernel.org/r/1397483228-25625-4-git-send-email-thomas.petazzoni@free-electrons.com
    Signed-off-by: Jason Cooper

    Thomas Petazzoni
     

06 Aug, 2013

4 commits

  • Now that every user of the deprecated name-based API has been
    converted to using the ID-based API, let's remove the former one.

    Signed-off-by: Thomas Petazzoni
    Tested-by: Andrew Lunn
    Tested-by: Sebastian Hesselbarth
    Signed-off-by: Jason Cooper

    Thomas Petazzoni
     
  • We add two optional properties to the MBus DT binding, to encode
    the PCIe memory and IO aperture. This allows such information to
    be retrieved by -for instance- the pci driver to allocate the
    MBus decoding windows.

    Correspondingly, and in order to retrieve this information,
    we add two new APIs.

    Signed-off-by: Ezequiel Garcia
    Tested-by: Andrew Lunn
    Tested-by: Sebastian Hesselbarth
    Signed-off-by: Jason Cooper

    Ezequiel Garcia
     
  • This patch adds the most fundamental device-tree initialization.
    We only introduce what's required to be able to probe the mvebu-mbus
    driver from the DT. Follow-up patches will extend the device tree binding,
    allowing to describe static address decoding windows.

    Signed-off-by: Thomas Petazzoni
    Signed-off-by: Ezequiel Garcia
    Tested-by: Andrew Lunn
    Tested-by: Sebastian Hesselbarth
    Signed-off-by: Jason Cooper

    Ezequiel Garcia
     
  • We add an API to create MBus address decoding windows from the target
    ID and attribute. This function will be used later and deprecate the
    current name based scheme.

    Signed-off-by: Thomas Petazzoni
    Tested-by: Andrew Lunn
    Tested-by: Sebastian Hesselbarth
    Signed-off-by: Jason Cooper

    Thomas Petazzoni
     

15 Apr, 2013

1 commit

  • This commit convers the mach-mv78xx0 sub-architecture to use the
    mvebu-mbus driver. We simply have to call mvebu_mbus_init() in the
    ->init_early() function, and modify the PCIe code so that it uses the
    new functions provided by mvebu-mbus to create the needed PCIe
    windows.

    Signed-off-by: Thomas Petazzoni
    Acked-by: Arnd Bergmann
    Signed-off-by: Jason Cooper

    Thomas Petazzoni
     

29 Mar, 2013

1 commit

  • The Marvell EBU SoCs have a configurable physical address space
    layout: the physical ranges of memory used to address PCI(e)
    interfaces, NOR flashes, SRAM and various other types of memory are
    configurable by software, through a mechanism of so-called 'address
    decoding windows'.

    This new driver mvebu-mbus consolidates the existing code to address
    the configuration of these memory ranges, which is spread into
    mach-mvebu, mach-orion5x, mach-mv78xx0, mach-dove and mach-kirkwood.

    Following patches convert each Marvell EBU SoC family to use this
    driver, therefore removing the old code that was configuring the
    address decoding windows.

    It is worth mentioning that the MVEBU_MBUS Kconfig option is
    intentionally added as a blind option. The new driver implements and
    exports the mv_mbus_dram_info() function, which is used by various
    Marvell drivers throughout the tree to get access to window
    configuration parameters that they require. This function is also
    implemented in arch/arm/plat-orion/addr-map.c, which ultimately gets
    removed at the end of this patch series. So, in order to preserve
    bisectability, we want to ensure that *either* this new driver, *or*
    the legacy code in plat-orion/addr-map.c gets compiled in.

    By making MVEBU_MBUS a blind option, we are sure that only a platform
    that does 'select MVEBU_MBUS' will get this new driver compiled
    in. Therefore, throughout the next patches that convert the Marvell
    sub-architectures one after the other to this new driver, we add the
    'select MVEBU_MBUS' and also ensure to remove plat-orion/addr-map.c
    from the build for this specific sub-architecture. This ensures that
    bisectability is preserved.

    Ealier versions of this driver had a DT binding, but since those were
    not yet agreed upon, they were removed. The driver still uses
    of_device_id to find the SoC specific details according to the string
    passed to mvebu_mbus_init(). The plan is to re-introduce a proper DT
    binding as a followup set of patches.

    Signed-off-by: Thomas Petazzoni
    Acked-by: Arnd Bergmann
    Signed-off-by: Jason Cooper

    Thomas Petazzoni
     

14 Dec, 2011

1 commit


28 Mar, 2008

1 commit

  • Introduce struct mbus_dram_target_info, which will be used for
    passing information about the mbus target ID of the DDR unit, and
    mbus target attribute, base address and size for each of the DRAM
    chip selects from the platform code to peripheral drivers.

    Signed-off-by: Lennert Buytenhek
    Reviewed-by: Tzachi Perelstein
    Acked-by: Russell King
    Signed-off-by: Nicolas Pitre

    Lennert Buytenhek