mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2026-06-13 15:03:58 +03:00
dm: Introduce xxx_get_dma_range()
Add the following functions to get a specific device's DMA ranges: - dev_get_dma_range() - ofnode_get_dma_range() - of_get_dma_range() - fdt_get_dma_range() They are specially useful in oder to be able validate a physical address space range into a bus's and to convert addresses from and to address spaces. Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de> Reviewed-by: Simon Glass <sjg@chromium.org> Tested-by: Peter Robinson <pbrobinson@gmail.com> Signed-off-by: Matthias Brugger <mbrugger@suse.com>
This commit is contained in:
committed by
Matthias Brugger
parent
c709243ee0
commit
51bdb50904
@@ -44,6 +44,23 @@ u64 of_translate_address(const struct device_node *no, const __be32 *in_addr);
|
||||
*/
|
||||
u64 of_translate_dma_address(const struct device_node *no, const __be32 *in_addr);
|
||||
|
||||
|
||||
/**
|
||||
* of_get_dma_range() - get dma-ranges for a specific DT node
|
||||
*
|
||||
* Get DMA ranges for a specifc node, this is useful to perform bus->cpu and
|
||||
* cpu->bus address translations
|
||||
*
|
||||
* @param blob Pointer to device tree blob
|
||||
* @param node_offset Node DT offset
|
||||
* @param cpu Pointer to variable storing the range's cpu address
|
||||
* @param bus Pointer to variable storing the range's bus address
|
||||
* @param size Pointer to variable storing the range's size
|
||||
* @return translated DMA address or OF_BAD_ADDR on error
|
||||
*/
|
||||
int of_get_dma_range(const struct device_node *dev, phys_addr_t *cpu,
|
||||
dma_addr_t *bus, u64 *size);
|
||||
|
||||
/**
|
||||
* of_get_address() - obtain an address from a node
|
||||
*
|
||||
|
||||
@@ -998,6 +998,22 @@ u64 ofnode_translate_address(ofnode node, const fdt32_t *in_addr);
|
||||
*/
|
||||
u64 ofnode_translate_dma_address(ofnode node, const fdt32_t *in_addr);
|
||||
|
||||
/**
|
||||
* ofnode_get_dma_range() - get dma-ranges for a specific DT node
|
||||
*
|
||||
* Get DMA ranges for a specifc node, this is useful to perform bus->cpu and
|
||||
* cpu->bus address translations
|
||||
*
|
||||
* @param blob Pointer to device tree blob
|
||||
* @param node_offset Node DT offset
|
||||
* @param cpu Pointer to variable storing the range's cpu address
|
||||
* @param bus Pointer to variable storing the range's bus address
|
||||
* @param size Pointer to variable storing the range's size
|
||||
* @return translated DMA address or OF_BAD_ADDR on error
|
||||
*/
|
||||
int ofnode_get_dma_range(ofnode node, phys_addr_t *cpu, dma_addr_t *bus,
|
||||
u64 *size);
|
||||
|
||||
/**
|
||||
* ofnode_device_is_compatible() - check if the node is compatible with compat
|
||||
*
|
||||
|
||||
@@ -647,6 +647,21 @@ u64 dev_translate_address(const struct udevice *dev, const fdt32_t *in_addr);
|
||||
u64 dev_translate_dma_address(const struct udevice *dev,
|
||||
const fdt32_t *in_addr);
|
||||
|
||||
/**
|
||||
* dev_get_dma_range() - Get a device's DMA constraints
|
||||
*
|
||||
* Provide the address bases and size of the linear mapping between the CPU and
|
||||
* a device's BUS address space.
|
||||
*
|
||||
* @dev: device giving the context in which to translate the DMA address
|
||||
* @cpu: base address for CPU's view of memory
|
||||
* @bus: base address for BUS's view of memory
|
||||
* @size: size of the address space
|
||||
* @return 0 if ok, negative on error
|
||||
*/
|
||||
int dev_get_dma_range(const struct udevice *dev, phys_addr_t *cpu,
|
||||
dma_addr_t *bus, u64 *size);
|
||||
|
||||
/**
|
||||
* dev_read_alias_highest_id - Get highest alias id for the given stem
|
||||
* @stem: Alias stem to be examined
|
||||
@@ -1005,6 +1020,12 @@ static inline u64 dev_translate_dma_address(const struct udevice *dev,
|
||||
return ofnode_translate_dma_address(dev_ofnode(dev), in_addr);
|
||||
}
|
||||
|
||||
static inline int dev_get_dma_range(const struct udevice *dev, phys_addr_t *cpu,
|
||||
dma_addr_t *bus, u64 *size)
|
||||
{
|
||||
return ofnode_get_dma_range(dev_ofnode(dev), cpu, bus, size);
|
||||
}
|
||||
|
||||
static inline int dev_read_alias_highest_id(const char *stem)
|
||||
{
|
||||
if (!CONFIG_IS_ENABLED(OF_LIBFDT) || !gd->fdt_blob)
|
||||
|
||||
@@ -260,6 +260,20 @@ u64 fdt_translate_address(const void *blob, int node_offset,
|
||||
u64 fdt_translate_dma_address(const void *blob, int node_offset,
|
||||
const __be32 *in_addr);
|
||||
|
||||
/**
|
||||
* Get DMA ranges for a specifc node, this is useful to perform bus->cpu and
|
||||
* cpu->bus address translations
|
||||
*
|
||||
* @param blob Pointer to device tree blob
|
||||
* @param node_offset Node DT offset
|
||||
* @param cpu Pointer to variable storing the range's cpu address
|
||||
* @param bus Pointer to variable storing the range's bus address
|
||||
* @param size Pointer to variable storing the range's size
|
||||
* @return translated DMA address or OF_BAD_ADDR on error
|
||||
*/
|
||||
int fdt_get_dma_range(const void *blob, int node_offset, phys_addr_t *cpu,
|
||||
dma_addr_t *bus, u64 *size);
|
||||
|
||||
int fdt_node_offset_by_compat_reg(void *blob, const char *compat,
|
||||
phys_addr_t compat_off);
|
||||
int fdt_alloc_phandle(void *blob);
|
||||
|
||||
Reference in New Issue
Block a user