1c072f6e8SVladimir Kondratyev /*- 24d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 3c072f6e8SVladimir Kondratyev * 4c072f6e8SVladimir Kondratyev * Copyright (c) 2010 Isilon Systems, Inc. 5c072f6e8SVladimir Kondratyev * Copyright (c) 2016 Matthew Macy (mmacy@mattmacy.io) 6c072f6e8SVladimir Kondratyev * Copyright (c) 2017 Mellanox Technologies, Ltd. 7c072f6e8SVladimir Kondratyev * Copyright (c) 2021 Vladimir Kondratyev <wulf@FreeBSD.org> 8c072f6e8SVladimir Kondratyev * 9c072f6e8SVladimir Kondratyev * Redistribution and use in source and binary forms, with or without 10c072f6e8SVladimir Kondratyev * modification, are permitted provided that the following conditions are 11c072f6e8SVladimir Kondratyev * met: 12c072f6e8SVladimir Kondratyev * 1. Redistributions of source code must retain the above copyright 13c072f6e8SVladimir Kondratyev * notice, this list of conditions and the following disclaimer. 14c072f6e8SVladimir Kondratyev * 2. Redistributions in binary form must reproduce the above copyright 15c072f6e8SVladimir Kondratyev * notice, this list of conditions and the following disclaimer in 16c072f6e8SVladimir Kondratyev * the documentation and/or other materials provided with the 17c072f6e8SVladimir Kondratyev * distribution. 18c072f6e8SVladimir Kondratyev * 19c072f6e8SVladimir Kondratyev * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 20c072f6e8SVladimir Kondratyev * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21c072f6e8SVladimir Kondratyev * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22c072f6e8SVladimir Kondratyev * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 23c072f6e8SVladimir Kondratyev * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24c072f6e8SVladimir Kondratyev * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25c072f6e8SVladimir Kondratyev * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26c072f6e8SVladimir Kondratyev * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27c072f6e8SVladimir Kondratyev * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28c072f6e8SVladimir Kondratyev * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29c072f6e8SVladimir Kondratyev * SUCH DAMAGE. 30c072f6e8SVladimir Kondratyev */ 31c072f6e8SVladimir Kondratyev 32307f78f3SVladimir Kondratyev #ifndef _LINUXKPI_LINUX_HIGHMEM_H_ 33307f78f3SVladimir Kondratyev #define _LINUXKPI_LINUX_HIGHMEM_H_ 34c072f6e8SVladimir Kondratyev 35c072f6e8SVladimir Kondratyev #include <sys/types.h> 36c072f6e8SVladimir Kondratyev #include <sys/lock.h> 37c072f6e8SVladimir Kondratyev #include <sys/mutex.h> 38c072f6e8SVladimir Kondratyev #include <sys/proc.h> 39c072f6e8SVladimir Kondratyev #include <sys/sched.h> 40c072f6e8SVladimir Kondratyev #include <sys/sf_buf.h> 41c072f6e8SVladimir Kondratyev 42c072f6e8SVladimir Kondratyev #include <vm/vm.h> 43c072f6e8SVladimir Kondratyev #include <vm/vm_page.h> 44c072f6e8SVladimir Kondratyev #include <vm/pmap.h> 45c072f6e8SVladimir Kondratyev 46*d21316ffSVladimir Kondratyev #include <linux/mm.h> 47c072f6e8SVladimir Kondratyev #include <linux/page.h> 48c072f6e8SVladimir Kondratyev 49c072f6e8SVladimir Kondratyev #define PageHighMem(p) (0) 50c072f6e8SVladimir Kondratyev 519e9c682fSBjoern A. Zeeb static inline struct page * 52c072f6e8SVladimir Kondratyev kmap_to_page(void *addr) 53c072f6e8SVladimir Kondratyev { 549dafbd0cSJean-Sébastien Pédron 55c072f6e8SVladimir Kondratyev return (virt_to_page(addr)); 56c072f6e8SVladimir Kondratyev } 57c072f6e8SVladimir Kondratyev 58c072f6e8SVladimir Kondratyev static inline void * 599e9c682fSBjoern A. Zeeb kmap(struct page *page) 60c072f6e8SVladimir Kondratyev { 61c072f6e8SVladimir Kondratyev struct sf_buf *sf; 62c072f6e8SVladimir Kondratyev 63c072f6e8SVladimir Kondratyev if (PMAP_HAS_DMAP) { 64d1ea0764SBjoern A. Zeeb return ((void *)PHYS_TO_DMAP(page_to_phys(page))); 65c072f6e8SVladimir Kondratyev } else { 66c072f6e8SVladimir Kondratyev sched_pin(); 67c072f6e8SVladimir Kondratyev sf = sf_buf_alloc(page, SFB_NOWAIT | SFB_CPUPRIVATE); 68c072f6e8SVladimir Kondratyev if (sf == NULL) { 69c072f6e8SVladimir Kondratyev sched_unpin(); 70c072f6e8SVladimir Kondratyev return (NULL); 71c072f6e8SVladimir Kondratyev } 72c072f6e8SVladimir Kondratyev return ((void *)sf_buf_kva(sf)); 73c072f6e8SVladimir Kondratyev } 74c072f6e8SVladimir Kondratyev } 75c072f6e8SVladimir Kondratyev 76c072f6e8SVladimir Kondratyev static inline void * 779e9c682fSBjoern A. Zeeb kmap_atomic_prot(struct page *page, pgprot_t prot) 78c072f6e8SVladimir Kondratyev { 79c072f6e8SVladimir Kondratyev vm_memattr_t attr = pgprot2cachemode(prot); 80c072f6e8SVladimir Kondratyev 81c072f6e8SVladimir Kondratyev if (attr != VM_MEMATTR_DEFAULT) { 82c072f6e8SVladimir Kondratyev vm_page_lock(page); 83c072f6e8SVladimir Kondratyev page->flags |= PG_FICTITIOUS; 84c072f6e8SVladimir Kondratyev vm_page_unlock(page); 85c072f6e8SVladimir Kondratyev pmap_page_set_memattr(page, attr); 86c072f6e8SVladimir Kondratyev } 87c072f6e8SVladimir Kondratyev return (kmap(page)); 88c072f6e8SVladimir Kondratyev } 89c072f6e8SVladimir Kondratyev 90c072f6e8SVladimir Kondratyev static inline void * 919e9c682fSBjoern A. Zeeb kmap_atomic(struct page *page) 92c072f6e8SVladimir Kondratyev { 939dafbd0cSJean-Sébastien Pédron 94c072f6e8SVladimir Kondratyev return (kmap_atomic_prot(page, VM_PROT_ALL)); 95c072f6e8SVladimir Kondratyev } 96c072f6e8SVladimir Kondratyev 979dafbd0cSJean-Sébastien Pédron static inline void * 9873f35891SVladimir Kondratyev kmap_local_page(struct page *page) 9973f35891SVladimir Kondratyev { 10073f35891SVladimir Kondratyev return (kmap(page)); 10173f35891SVladimir Kondratyev } 10273f35891SVladimir Kondratyev 10373f35891SVladimir Kondratyev static inline void * 1049e9c682fSBjoern A. Zeeb kmap_local_page_prot(struct page *page, pgprot_t prot) 1059dafbd0cSJean-Sébastien Pédron { 1069dafbd0cSJean-Sébastien Pédron 1079dafbd0cSJean-Sébastien Pédron return (kmap_atomic_prot(page, prot)); 1089dafbd0cSJean-Sébastien Pédron } 1099dafbd0cSJean-Sébastien Pédron 110c072f6e8SVladimir Kondratyev static inline void 1119e9c682fSBjoern A. Zeeb kunmap(struct page *page) 112c072f6e8SVladimir Kondratyev { 113c072f6e8SVladimir Kondratyev struct sf_buf *sf; 114c072f6e8SVladimir Kondratyev 115c072f6e8SVladimir Kondratyev if (!PMAP_HAS_DMAP) { 116c072f6e8SVladimir Kondratyev /* lookup SF buffer in list */ 117c072f6e8SVladimir Kondratyev sf = sf_buf_alloc(page, SFB_NOWAIT | SFB_CPUPRIVATE); 118c072f6e8SVladimir Kondratyev 119c072f6e8SVladimir Kondratyev /* double-free */ 120c072f6e8SVladimir Kondratyev sf_buf_free(sf); 121c072f6e8SVladimir Kondratyev sf_buf_free(sf); 122c072f6e8SVladimir Kondratyev 123c072f6e8SVladimir Kondratyev sched_unpin(); 124c072f6e8SVladimir Kondratyev } 125c072f6e8SVladimir Kondratyev } 126c072f6e8SVladimir Kondratyev 127c072f6e8SVladimir Kondratyev static inline void 128c072f6e8SVladimir Kondratyev kunmap_atomic(void *vaddr) 129c072f6e8SVladimir Kondratyev { 1309dafbd0cSJean-Sébastien Pédron 131c072f6e8SVladimir Kondratyev if (!PMAP_HAS_DMAP) 132c072f6e8SVladimir Kondratyev kunmap(virt_to_page(vaddr)); 133c072f6e8SVladimir Kondratyev } 134c072f6e8SVladimir Kondratyev 1359dafbd0cSJean-Sébastien Pédron static inline void 1369dafbd0cSJean-Sébastien Pédron kunmap_local(void *addr) 1379dafbd0cSJean-Sébastien Pédron { 1389dafbd0cSJean-Sébastien Pédron 1399dafbd0cSJean-Sébastien Pédron kunmap_atomic(addr); 1409dafbd0cSJean-Sébastien Pédron } 1419dafbd0cSJean-Sébastien Pédron 142307f78f3SVladimir Kondratyev #endif /* _LINUXKPI_LINUX_HIGHMEM_H_ */ 143