mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-11 13:27:06 +09:00
ARM CPUs with speculative prefetching have undefined behaviors when the same physical page is mapped to two different virtual addresses with conflicting cache attributes. since many recent systems include IOMMU functionality (i.e., remapping of discontiguous physical pages into a virtually-contiguous address range for I/O devices), it is desirable to support allocating any available OS memory for use by the I/O devices. however, since many systems do not support cache coherency between the CPU and DMA devices, these devices are left with using DMA-coherent allocations from the OS (which severely limits the benefit of an IOMMU) or performing cache maintenance (which can be a severe performance loss, particularly on systems with outer caches, compared to using DMA-coherent memory). this change adds an API for allocating pages from the OS with specific cache maintenance properties and ensures that the kernel's mapping of the page reflects the desired cache attributes, in line with the ARMv7 architectural requirements Change-Id: If0bd3cfe339b9a9b10fd6d45a748cd5e65931cf0 Signed-off-by: Gary King <gking@nvidia.com>
48 lines
1.5 KiB
C
48 lines
1.5 KiB
C
/*
|
|
* arch/arm/include/asm/attrib_alloc.h
|
|
*
|
|
* Page allocator with custom cache attributes
|
|
*
|
|
* Copyright (c) 2010, NVIDIA Corporation.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
* more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*/
|
|
|
|
#ifndef __ARCH_ARM_ATTRIB_ALLOC_H
|
|
#define __ARCH_ARM_ATTRIB_ALLOC_H
|
|
|
|
#include <linux/types.h>
|
|
#include <asm/page.h>
|
|
|
|
struct page *arm_attrib_alloc_pages_exact_node(int nid, gfp_t gfp,
|
|
size_t size, pgprot_t prot);
|
|
|
|
void arm_attrib_free_pages_exact(struct page *page, size_t size);
|
|
|
|
static inline
|
|
struct page *arm_attrib_alloc_pages_exact(gfp_t gfp, size_t size,
|
|
pgprot_t prot)
|
|
{
|
|
return arm_attrib_alloc_pages_exact_node(-1, gfp, size, prot);
|
|
}
|
|
|
|
#define arm_attrib_alloc_page(gfp, prot) \
|
|
arm_attrib_alloc_pages_exact((gfp), PAGE_SIZE, (prot))
|
|
|
|
#define arm_attrib_free_page(page) \
|
|
arm_attrib_free_pages_exact((page), PAGE_SIZE)
|
|
|
|
#endif /* __ARCH_ARM_ATTRIB_ALLOC_H */
|