xref: /aosp_15_r20/external/pciutils/lib/physmem.h (revision c2e0c6b56a71da9abe8df5c8348fb3eb5c2c9251)
1*c2e0c6b5SAndroid Build Coastguard Worker /*
2*c2e0c6b5SAndroid Build Coastguard Worker  *      The PCI Library -- Physical memory mapping API
3*c2e0c6b5SAndroid Build Coastguard Worker  *
4*c2e0c6b5SAndroid Build Coastguard Worker  *      Copyright (c) 2023 Pali Rohár <[email protected]>
5*c2e0c6b5SAndroid Build Coastguard Worker  *
6*c2e0c6b5SAndroid Build Coastguard Worker  *      Can be freely distributed and used under the terms of the GNU GPL v2+
7*c2e0c6b5SAndroid Build Coastguard Worker  *
8*c2e0c6b5SAndroid Build Coastguard Worker  *      SPDX-License-Identifier: GPL-2.0-or-later
9*c2e0c6b5SAndroid Build Coastguard Worker  */
10*c2e0c6b5SAndroid Build Coastguard Worker 
11*c2e0c6b5SAndroid Build Coastguard Worker struct physmem;
12*c2e0c6b5SAndroid Build Coastguard Worker 
13*c2e0c6b5SAndroid Build Coastguard Worker void physmem_init_config(struct pci_access *a);
14*c2e0c6b5SAndroid Build Coastguard Worker int physmem_access(struct pci_access *a, int w);
15*c2e0c6b5SAndroid Build Coastguard Worker struct physmem *physmem_open(struct pci_access *a, int w);
16*c2e0c6b5SAndroid Build Coastguard Worker void physmem_close(struct physmem *physmem);
17*c2e0c6b5SAndroid Build Coastguard Worker long physmem_get_pagesize(struct physmem *physmem);
18*c2e0c6b5SAndroid Build Coastguard Worker 
19*c2e0c6b5SAndroid Build Coastguard Worker /*
20*c2e0c6b5SAndroid Build Coastguard Worker  * physmem_map returns ptr on success, (void *)-1 on error and sets errno compatible with POSIX mmap():
21*c2e0c6b5SAndroid Build Coastguard Worker  * - EBADF - invalid physmem argument
22*c2e0c6b5SAndroid Build Coastguard Worker  * - EINVAL - invalid or unaligned addr argument
23*c2e0c6b5SAndroid Build Coastguard Worker  * - EACCES - write access requested but physmem was opened without write access
24*c2e0c6b5SAndroid Build Coastguard Worker  * - ENOSYS - physmem argument does not support physical address mapping at all
25*c2e0c6b5SAndroid Build Coastguard Worker  * - ENXIO - addr/length range was rejected by system (e.g. range not accessible or not available)
26*c2e0c6b5SAndroid Build Coastguard Worker  * - EOVERFLOW - addr/length range is out of the physical address space (e.g. does not fit into signed 32-bit off_t type on 32-bit systems)
27*c2e0c6b5SAndroid Build Coastguard Worker  * - EACCES - generic unknown error for djgpp and windows
28*c2e0c6b5SAndroid Build Coastguard Worker  */
29*c2e0c6b5SAndroid Build Coastguard Worker void *physmem_map(struct physmem *physmem, u64 addr, size_t length, int w);
30*c2e0c6b5SAndroid Build Coastguard Worker 
31*c2e0c6b5SAndroid Build Coastguard Worker /*
32*c2e0c6b5SAndroid Build Coastguard Worker  * Unmap physical memory mapping, ptr and length must be exactly same as for physmem_map(), unmapping just subrange is not allowed.
33*c2e0c6b5SAndroid Build Coastguard Worker  * physmem_unmap returns 0 on success, -1 on error and sets errno:
34*c2e0c6b5SAndroid Build Coastguard Worker  * - EBADF - invalid physmem argument
35*c2e0c6b5SAndroid Build Coastguard Worker  * - EINVAL - invalid ptr/length argument
36*c2e0c6b5SAndroid Build Coastguard Worker  * - EPERM - ptr/length range cannot be unmapped due to access permission checks (e.g. page marked as immutable)
37*c2e0c6b5SAndroid Build Coastguard Worker  * - ENOSYS - physmem argument does not support physical address unmapping at all (e.g. every mapping stays active until application terminates)
38*c2e0c6b5SAndroid Build Coastguard Worker  * - EACCES - generic unknown error for djgpp and windows
39*c2e0c6b5SAndroid Build Coastguard Worker  */
40*c2e0c6b5SAndroid Build Coastguard Worker int physmem_unmap(struct physmem *physmem, void *ptr, size_t length);
41