xref: /linux/lib/devmem_is_allowed.c (revision 6b76ca2a)
1527701edSPalmer Dabbelt // SPDX-License-Identifier: GPL-2.0-only
2527701edSPalmer Dabbelt /*
3527701edSPalmer Dabbelt  * A generic version of devmem_is_allowed.
4527701edSPalmer Dabbelt  *
5527701edSPalmer Dabbelt  * Based on arch/arm64/mm/mmap.c
6527701edSPalmer Dabbelt  *
7527701edSPalmer Dabbelt  * Copyright (C) 2020 Google, Inc.
8527701edSPalmer Dabbelt  * Copyright (C) 2012 ARM Ltd.
9527701edSPalmer Dabbelt  */
10527701edSPalmer Dabbelt 
11527701edSPalmer Dabbelt #include <linux/mm.h>
12527701edSPalmer Dabbelt #include <linux/ioport.h>
13*6b76ca2aSArnd Bergmann #include <linux/io.h>
14527701edSPalmer Dabbelt 
15527701edSPalmer Dabbelt /*
16527701edSPalmer Dabbelt  * devmem_is_allowed() checks to see if /dev/mem access to a certain address
17527701edSPalmer Dabbelt  * is valid. The argument is a physical page number.  We mimic x86 here by
18527701edSPalmer Dabbelt  * disallowing access to system RAM as well as device-exclusive MMIO regions.
19527701edSPalmer Dabbelt  * This effectively disable read()/write() on /dev/mem.
20527701edSPalmer Dabbelt  */
devmem_is_allowed(unsigned long pfn)21527701edSPalmer Dabbelt int devmem_is_allowed(unsigned long pfn)
22527701edSPalmer Dabbelt {
23854f3264SLiang Wang 	if (iomem_is_exclusive(PFN_PHYS(pfn)))
24527701edSPalmer Dabbelt 		return 0;
25527701edSPalmer Dabbelt 	if (!page_is_ram(pfn))
26527701edSPalmer Dabbelt 		return 1;
27527701edSPalmer Dabbelt 	return 0;
28527701edSPalmer Dabbelt }
29