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