2008-03-27 21:51:39 +03:00
|
|
|
/*
|
|
|
|
* Marvell MBUS common definitions.
|
|
|
|
*
|
|
|
|
* Copyright (C) 2008 Marvell Semiconductor
|
|
|
|
*
|
|
|
|
* This file is licensed under the terms of the GNU General Public
|
|
|
|
* License version 2. This program is licensed "as is" without any
|
|
|
|
* warranty of any kind, whether express or implied.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __LINUX_MBUS_H
|
|
|
|
#define __LINUX_MBUS_H
|
|
|
|
|
2016-09-15 08:37:30 +03:00
|
|
|
#include <linux/errno.h>
|
|
|
|
|
2013-07-26 17:17:47 +04:00
|
|
|
struct resource;
|
|
|
|
|
2008-03-27 21:51:39 +03:00
|
|
|
struct mbus_dram_target_info
|
|
|
|
{
|
|
|
|
/*
|
|
|
|
* The 4-bit MBUS target ID of the DRAM controller.
|
|
|
|
*/
|
|
|
|
u8 mbus_dram_target_id;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* The base address, size, and MBUS attribute ID for each
|
|
|
|
* of the possible DRAM chip selects. Peripherals are
|
|
|
|
* required to support at least 4 decode windows.
|
|
|
|
*/
|
|
|
|
int num_cs;
|
|
|
|
struct mbus_dram_window {
|
|
|
|
u8 cs_index;
|
|
|
|
u8 mbus_attr;
|
2017-08-28 18:25:16 +03:00
|
|
|
u64 base;
|
|
|
|
u64 size;
|
2008-03-27 21:51:39 +03:00
|
|
|
} cs[4];
|
|
|
|
};
|
|
|
|
|
bus: introduce an Marvell EBU MBus driver
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 <thomas.petazzoni@free-electrons.com>
Acked-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
2013-03-21 20:59:14 +04:00
|
|
|
/* Flags for PCI/PCIe address decoding regions */
|
|
|
|
#define MVEBU_MBUS_PCI_IO 0x1
|
|
|
|
#define MVEBU_MBUS_PCI_MEM 0x2
|
|
|
|
#define MVEBU_MBUS_PCI_WA 0x3
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Magic value that explicits that we don't need a remapping-capable
|
|
|
|
* address decoding window.
|
|
|
|
*/
|
|
|
|
#define MVEBU_MBUS_NO_REMAP (0xffffffff)
|
|
|
|
|
2013-03-21 20:59:19 +04:00
|
|
|
/* Maximum size of a mbus window name */
|
|
|
|
#define MVEBU_MBUS_MAX_WINNAME_SZ 32
|
|
|
|
|
2011-12-08 00:48:07 +04:00
|
|
|
/*
|
|
|
|
* The Marvell mbus is to be found only on SOCs from the Orion family
|
|
|
|
* at the moment. Provide a dummy stub for other architectures.
|
|
|
|
*/
|
|
|
|
#ifdef CONFIG_PLAT_ORION
|
|
|
|
extern const struct mbus_dram_target_info *mv_mbus_dram_info(void);
|
bus: mvebu-mbus: add mv_mbus_dram_info_nooverlap()
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 <thomas.petazzoni@free-electrons.com>
Signed-off-by: Gregory CLEMENT <gregory.clement@free-electrons.com>
2015-05-28 12:40:54 +03:00
|
|
|
extern const struct mbus_dram_target_info *mv_mbus_dram_info_nooverlap(void);
|
2016-09-15 08:37:30 +03:00
|
|
|
int mvebu_mbus_get_io_win_info(phys_addr_t phyaddr, u32 *size, u8 *target,
|
|
|
|
u8 *attr);
|
2011-12-08 00:48:07 +04:00
|
|
|
#else
|
|
|
|
static inline const struct mbus_dram_target_info *mv_mbus_dram_info(void)
|
|
|
|
{
|
|
|
|
return NULL;
|
|
|
|
}
|
bus: mvebu-mbus: add mv_mbus_dram_info_nooverlap()
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 <thomas.petazzoni@free-electrons.com>
Signed-off-by: Gregory CLEMENT <gregory.clement@free-electrons.com>
2015-05-28 12:40:54 +03:00
|
|
|
static inline const struct mbus_dram_target_info *mv_mbus_dram_info_nooverlap(void)
|
|
|
|
{
|
|
|
|
return NULL;
|
|
|
|
}
|
2016-09-15 08:37:30 +03:00
|
|
|
static inline int mvebu_mbus_get_io_win_info(phys_addr_t phyaddr, u32 *size,
|
|
|
|
u8 *target, u8 *attr)
|
|
|
|
{
|
|
|
|
/*
|
|
|
|
* On all ARM32 MVEBU platforms with MBus support, this stub
|
|
|
|
* function will not get called. The real function from the
|
|
|
|
* MBus driver is called instead. ARM64 MVEBU platforms like
|
|
|
|
* the Armada 3700 could use the mv_xor device driver which calls
|
|
|
|
* into this function
|
|
|
|
*/
|
|
|
|
return -EINVAL;
|
|
|
|
}
|
2011-12-08 00:48:07 +04:00
|
|
|
#endif
|
bus: introduce an Marvell EBU MBus driver
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 <thomas.petazzoni@free-electrons.com>
Acked-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
2013-03-21 20:59:14 +04:00
|
|
|
|
2016-11-17 22:19:12 +03:00
|
|
|
#ifdef CONFIG_MVEBU_MBUS
|
2016-06-21 18:16:18 +03:00
|
|
|
int mvebu_mbus_save_cpu_target(u32 __iomem *store_addr);
|
2013-07-26 17:17:47 +04:00
|
|
|
void mvebu_mbus_get_pcie_mem_aperture(struct resource *res);
|
|
|
|
void mvebu_mbus_get_pcie_io_aperture(struct resource *res);
|
2016-03-14 11:39:02 +03:00
|
|
|
int mvebu_mbus_get_dram_win_info(phys_addr_t phyaddr, u8 *target, u8 *attr);
|
2013-07-26 17:17:39 +04:00
|
|
|
int mvebu_mbus_add_window_remap_by_id(unsigned int target,
|
|
|
|
unsigned int attribute,
|
|
|
|
phys_addr_t base, size_t size,
|
|
|
|
phys_addr_t remap);
|
|
|
|
int mvebu_mbus_add_window_by_id(unsigned int target, unsigned int attribute,
|
|
|
|
phys_addr_t base, size_t size);
|
bus: introduce an Marvell EBU MBus driver
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 <thomas.petazzoni@free-electrons.com>
Acked-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
2013-03-21 20:59:14 +04:00
|
|
|
int mvebu_mbus_del_window(phys_addr_t base, size_t size);
|
|
|
|
int mvebu_mbus_init(const char *soc, phys_addr_t mbus_phys_base,
|
|
|
|
size_t mbus_size, phys_addr_t sdram_phys_base,
|
|
|
|
size_t sdram_size);
|
2014-04-14 17:47:01 +04:00
|
|
|
int mvebu_mbus_dt_init(bool is_coherent);
|
2016-11-17 22:19:12 +03:00
|
|
|
#else
|
|
|
|
static inline int mvebu_mbus_get_dram_win_info(phys_addr_t phyaddr, u8 *target,
|
|
|
|
u8 *attr)
|
|
|
|
{
|
|
|
|
return -EINVAL;
|
|
|
|
}
|
|
|
|
#endif /* CONFIG_MVEBU_MBUS */
|
bus: introduce an Marvell EBU MBus driver
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 <thomas.petazzoni@free-electrons.com>
Acked-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
2013-03-21 20:59:14 +04:00
|
|
|
|
|
|
|
#endif /* __LINUX_MBUS_H */
|