mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-08 14:23:19 +00:00
of: Introduce of_translate_dma_region()
This function is similar to of_translate_dma_address() but also reads a length in addition to an address from a device tree property. Reviewed-by: Rob Herring <robh@kernel.org> Signed-off-by: Thierry Reding <treding@nvidia.com> Link: https://lore.kernel.org/r/20230120174251.4004100-2-thierry.reding@gmail.com Signed-off-by: Joerg Roedel <jroedel@suse.de>
This commit is contained in:
parent
bb649412d3
commit
e251c21372
@ -626,6 +626,47 @@ u64 of_translate_dma_address(struct device_node *dev, const __be32 *in_addr)
|
||||
}
|
||||
EXPORT_SYMBOL(of_translate_dma_address);
|
||||
|
||||
/**
|
||||
* of_translate_dma_region - Translate device tree address and size tuple
|
||||
* @dev: device tree node for which to translate
|
||||
* @prop: pointer into array of cells
|
||||
* @start: return value for the start of the DMA range
|
||||
* @length: return value for the length of the DMA range
|
||||
*
|
||||
* Returns a pointer to the cell immediately following the translated DMA region.
|
||||
*/
|
||||
const __be32 *of_translate_dma_region(struct device_node *dev, const __be32 *prop,
|
||||
phys_addr_t *start, size_t *length)
|
||||
{
|
||||
struct device_node *parent;
|
||||
u64 address, size;
|
||||
int na, ns;
|
||||
|
||||
parent = __of_get_dma_parent(dev);
|
||||
if (!parent)
|
||||
return NULL;
|
||||
|
||||
na = of_bus_n_addr_cells(parent);
|
||||
ns = of_bus_n_size_cells(parent);
|
||||
|
||||
of_node_put(parent);
|
||||
|
||||
address = of_translate_dma_address(dev, prop);
|
||||
if (address == OF_BAD_ADDR)
|
||||
return NULL;
|
||||
|
||||
size = of_read_number(prop + na, ns);
|
||||
|
||||
if (start)
|
||||
*start = address;
|
||||
|
||||
if (length)
|
||||
*length = size;
|
||||
|
||||
return prop + na + ns;
|
||||
}
|
||||
EXPORT_SYMBOL(of_translate_dma_region);
|
||||
|
||||
const __be32 *__of_get_address(struct device_node *dev, int index, int bar_no,
|
||||
u64 *size, unsigned int *flags)
|
||||
{
|
||||
|
@ -38,6 +38,8 @@ struct of_pci_range {
|
||||
/* Translate a DMA address from device space to CPU space */
|
||||
extern u64 of_translate_dma_address(struct device_node *dev,
|
||||
const __be32 *in_addr);
|
||||
extern const __be32 *of_translate_dma_region(struct device_node *dev, const __be32 *addr,
|
||||
phys_addr_t *start, size_t *length);
|
||||
|
||||
#ifdef CONFIG_OF_ADDRESS
|
||||
extern u64 of_translate_address(struct device_node *np, const __be32 *addr);
|
||||
|
Loading…
Reference in New Issue
Block a user