You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'for-linus' of git://ftp.arm.linux.org.uk/~rmk/linux-arm into next
Pull ARM updates from Russell King: - Major clean-up of the L2 cache support code. The existing mess was becoming rather unmaintainable through all the additions that others have done over time. This turns it into a much nicer structure, and implements a few performance improvements as well. - Clean up some of the CP15 control register tweaks for alignment support, moving some code and data into alignment.c - DMA properties for ARM, from Santosh and reviewed by DT people. This adds DT properties to specify bus translations we can't discover automatically, and to indicate whether devices are coherent. - Hibernation support for ARM - Make ftrace work with read-only text in modules - add suspend support for PJ4B CPUs - rework interrupt masking for undefined instruction handling, which allows us to enable interrupts earlier in the handling of these exceptions. - support for big endian page tables - fix stacktrace support to exclude stacktrace functions from the trace, and add save_stack_trace_regs() implementation so that kprobes can record stack traces. - Add support for the Cortex-A17 CPU. - Remove last vestiges of ARM710 support. - Removal of ARM "meminfo" structure, finally converting us solely to memblock to handle the early memory initialisation. * 'for-linus' of git://ftp.arm.linux.org.uk/~rmk/linux-arm: (142 commits) ARM: ensure C page table setup code follows assembly code (part II) ARM: ensure C page table setup code follows assembly code ARM: consolidate last remaining open-coded alignment trap enable ARM: remove global cr_no_alignment ARM: remove CPU_CP15 conditional from alignment.c ARM: remove unused adjust_cr() function ARM: move "noalign" command line option to alignment.c ARM: provide common method to clear bits in CPU control register ARM: 8025/1: Get rid of meminfo ARM: 8060/1: mm: allow sub-architectures to override PCI I/O memory type ARM: 8066/1: correction for ARM patch 8031/2 ARM: 8049/1: ftrace/add save_stack_trace_regs() implementation ARM: 8065/1: remove last use of CONFIG_CPU_ARM710 ARM: 8062/1: Modify ldrt fixup handler to re-execute the userspace instruction ARM: 8047/1: rwsem: use asm-generic rwsem implementation ARM: l2c: trial at enabling some Cortex-A9 optimisations ARM: l2c: add warnings for stuff modifying aux_ctrl register values ARM: l2c: print a warning with L2C-310 caches if the cache size is modified ARM: l2c: remove old .set_debug method ARM: l2c: kill L2X0_AUX_CTRL_MASK before anyone else makes use of this ...
This commit is contained in:
@@ -701,3 +701,113 @@ void __iomem *of_iomap(struct device_node *np, int index)
|
||||
return ioremap(res.start, resource_size(&res));
|
||||
}
|
||||
EXPORT_SYMBOL(of_iomap);
|
||||
|
||||
/**
|
||||
* of_dma_get_range - Get DMA range info
|
||||
* @np: device node to get DMA range info
|
||||
* @dma_addr: pointer to store initial DMA address of DMA range
|
||||
* @paddr: pointer to store initial CPU address of DMA range
|
||||
* @size: pointer to store size of DMA range
|
||||
*
|
||||
* Look in bottom up direction for the first "dma-ranges" property
|
||||
* and parse it.
|
||||
* dma-ranges format:
|
||||
* DMA addr (dma_addr) : naddr cells
|
||||
* CPU addr (phys_addr_t) : pna cells
|
||||
* size : nsize cells
|
||||
*
|
||||
* It returns -ENODEV if "dma-ranges" property was not found
|
||||
* for this device in DT.
|
||||
*/
|
||||
int of_dma_get_range(struct device_node *np, u64 *dma_addr, u64 *paddr, u64 *size)
|
||||
{
|
||||
struct device_node *node = of_node_get(np);
|
||||
const __be32 *ranges = NULL;
|
||||
int len, naddr, nsize, pna;
|
||||
int ret = 0;
|
||||
u64 dmaaddr;
|
||||
|
||||
if (!node)
|
||||
return -EINVAL;
|
||||
|
||||
while (1) {
|
||||
naddr = of_n_addr_cells(node);
|
||||
nsize = of_n_size_cells(node);
|
||||
node = of_get_next_parent(node);
|
||||
if (!node)
|
||||
break;
|
||||
|
||||
ranges = of_get_property(node, "dma-ranges", &len);
|
||||
|
||||
/* Ignore empty ranges, they imply no translation required */
|
||||
if (ranges && len > 0)
|
||||
break;
|
||||
|
||||
/*
|
||||
* At least empty ranges has to be defined for parent node if
|
||||
* DMA is supported
|
||||
*/
|
||||
if (!ranges)
|
||||
break;
|
||||
}
|
||||
|
||||
if (!ranges) {
|
||||
pr_debug("%s: no dma-ranges found for node(%s)\n",
|
||||
__func__, np->full_name);
|
||||
ret = -ENODEV;
|
||||
goto out;
|
||||
}
|
||||
|
||||
len /= sizeof(u32);
|
||||
|
||||
pna = of_n_addr_cells(node);
|
||||
|
||||
/* dma-ranges format:
|
||||
* DMA addr : naddr cells
|
||||
* CPU addr : pna cells
|
||||
* size : nsize cells
|
||||
*/
|
||||
dmaaddr = of_read_number(ranges, naddr);
|
||||
*paddr = of_translate_dma_address(np, ranges);
|
||||
if (*paddr == OF_BAD_ADDR) {
|
||||
pr_err("%s: translation of DMA address(%pad) to CPU address failed node(%s)\n",
|
||||
__func__, dma_addr, np->full_name);
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
*dma_addr = dmaaddr;
|
||||
|
||||
*size = of_read_number(ranges + naddr + pna, nsize);
|
||||
|
||||
pr_debug("dma_addr(%llx) cpu_addr(%llx) size(%llx)\n",
|
||||
*dma_addr, *paddr, *size);
|
||||
|
||||
out:
|
||||
of_node_put(node);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(of_dma_get_range);
|
||||
|
||||
/**
|
||||
* of_dma_is_coherent - Check if device is coherent
|
||||
* @np: device node
|
||||
*
|
||||
* It returns true if "dma-coherent" property was found
|
||||
* for this device in DT.
|
||||
*/
|
||||
bool of_dma_is_coherent(struct device_node *np)
|
||||
{
|
||||
struct device_node *node = of_node_get(np);
|
||||
|
||||
while (node) {
|
||||
if (of_property_read_bool(node, "dma-coherent")) {
|
||||
of_node_put(node);
|
||||
return true;
|
||||
}
|
||||
node = of_get_next_parent(node);
|
||||
}
|
||||
of_node_put(node);
|
||||
return false;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(of_dma_is_coherent);
|
||||
|
||||
Reference in New Issue
Block a user