xref: /openbmc/linux/arch/arm64/mm/mmap.c (revision 507d664450f84ab2d5601aed55c6a4b3af9ec4c2)
1caab277bSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
21d18c47cSCatalin Marinas /*
31d18c47cSCatalin Marinas  * Based on arch/arm/mm/mmap.c
41d18c47cSCatalin Marinas  *
51d18c47cSCatalin Marinas  * Copyright (C) 2012 ARM Ltd.
61d18c47cSCatalin Marinas  */
71d18c47cSCatalin Marinas 
81151f838SArd Biesheuvel #include <linux/memblock.h>
9*507d6644SShaokun Zhang #include <linux/types.h>
101d18c47cSCatalin Marinas 
11*507d6644SShaokun Zhang #include <asm/page.h>
121d18c47cSCatalin Marinas 
131d18c47cSCatalin Marinas /*
141d18c47cSCatalin Marinas  * You really shouldn't be using read() or write() on /dev/mem.  This might go
151d18c47cSCatalin Marinas  * away in the future.
161d18c47cSCatalin Marinas  */
17097cbd8dSMin-Hua Chen int valid_phys_addr_range(phys_addr_t addr, size_t size)
181d18c47cSCatalin Marinas {
191151f838SArd Biesheuvel 	/*
201151f838SArd Biesheuvel 	 * Check whether addr is covered by a memory region without the
211151f838SArd Biesheuvel 	 * MEMBLOCK_NOMAP attribute, and whether that region covers the
221151f838SArd Biesheuvel 	 * entire range. In theory, this could lead to false negatives
231151f838SArd Biesheuvel 	 * if the range is covered by distinct but adjacent memory regions
241151f838SArd Biesheuvel 	 * that only differ in other attributes. However, few of such
251151f838SArd Biesheuvel 	 * attributes have been defined, and it is debatable whether it
261151f838SArd Biesheuvel 	 * follows that /dev/mem read() calls should be able traverse
271151f838SArd Biesheuvel 	 * such boundaries.
281151f838SArd Biesheuvel 	 */
291151f838SArd Biesheuvel 	return memblock_is_region_memory(addr, size) &&
301151f838SArd Biesheuvel 	       memblock_is_map_memory(addr);
311d18c47cSCatalin Marinas }
321d18c47cSCatalin Marinas 
331d18c47cSCatalin Marinas /*
341d18c47cSCatalin Marinas  * Do not allow /dev/mem mappings beyond the supported physical range.
351d18c47cSCatalin Marinas  */
361d18c47cSCatalin Marinas int valid_mmap_phys_addr_range(unsigned long pfn, size_t size)
371d18c47cSCatalin Marinas {
381d18c47cSCatalin Marinas 	return !(((pfn << PAGE_SHIFT) + size) & ~PHYS_MASK);
391d18c47cSCatalin Marinas }
40