18d59ecb2SHans Petter Selasky /*- 28d59ecb2SHans Petter Selasky * Copyright (c) 2010 Isilon Systems, Inc. 38d59ecb2SHans Petter Selasky * Copyright (c) 2010 iX Systems, Inc. 48d59ecb2SHans Petter Selasky * Copyright (c) 2010 Panasas, Inc. 583d5d45eSHans Petter Selasky * Copyright (c) 2013-2016 Mellanox Technologies, Ltd. 68d59ecb2SHans Petter Selasky * All rights reserved. 78d59ecb2SHans Petter Selasky * 88d59ecb2SHans Petter Selasky * Redistribution and use in source and binary forms, with or without 98d59ecb2SHans Petter Selasky * modification, are permitted provided that the following conditions 108d59ecb2SHans Petter Selasky * are met: 118d59ecb2SHans Petter Selasky * 1. Redistributions of source code must retain the above copyright 128d59ecb2SHans Petter Selasky * notice unmodified, this list of conditions, and the following 138d59ecb2SHans Petter Selasky * disclaimer. 148d59ecb2SHans Petter Selasky * 2. Redistributions in binary form must reproduce the above copyright 158d59ecb2SHans Petter Selasky * notice, this list of conditions and the following disclaimer in the 168d59ecb2SHans Petter Selasky * documentation and/or other materials provided with the distribution. 178d59ecb2SHans Petter Selasky * 188d59ecb2SHans Petter Selasky * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 198d59ecb2SHans Petter Selasky * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 208d59ecb2SHans Petter Selasky * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 218d59ecb2SHans Petter Selasky * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 228d59ecb2SHans Petter Selasky * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 238d59ecb2SHans Petter Selasky * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 248d59ecb2SHans Petter Selasky * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 258d59ecb2SHans Petter Selasky * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 268d59ecb2SHans Petter Selasky * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 278d59ecb2SHans Petter Selasky * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 288d59ecb2SHans Petter Selasky */ 29307f78f3SVladimir Kondratyev #ifndef _LINUXKPI_LINUX_PAGE_H_ 30307f78f3SVladimir Kondratyev #define _LINUXKPI_LINUX_PAGE_H_ 318d59ecb2SHans Petter Selasky 328d59ecb2SHans Petter Selasky #include <linux/types.h> 338d59ecb2SHans Petter Selasky 348d59ecb2SHans Petter Selasky #include <sys/param.h> 359ed01c32SGleb Smirnoff #include <sys/vmmeter.h> 368d59ecb2SHans Petter Selasky 378d59ecb2SHans Petter Selasky #include <machine/atomic.h> 388d59ecb2SHans Petter Selasky #include <vm/vm.h> 398d59ecb2SHans Petter Selasky #include <vm/vm_page.h> 4083d5d45eSHans Petter Selasky #include <vm/pmap.h> 4183d5d45eSHans Petter Selasky 42c072f6e8SVladimir Kondratyev #if defined(__i386__) || defined(__amd64__) 43c072f6e8SVladimir Kondratyev #include <machine/md_var.h> 44c072f6e8SVladimir Kondratyev #endif 45c072f6e8SVladimir Kondratyev 4676fe8c93SHans Petter Selasky typedef unsigned long linux_pte_t; 4776fe8c93SHans Petter Selasky typedef unsigned long linux_pmd_t; 4876fe8c93SHans Petter Selasky typedef unsigned long linux_pgd_t; 4983d5d45eSHans Petter Selasky typedef unsigned long pgprot_t; 508d59ecb2SHans Petter Selasky 518d59ecb2SHans Petter Selasky #define page vm_page 528d59ecb2SHans Petter Selasky 53ebf85480SHans Petter Selasky #define LINUXKPI_PROT_VALID (1 << 3) 54ebf85480SHans Petter Selasky #define LINUXKPI_CACHE_MODE_SHIFT 4 55ebf85480SHans Petter Selasky 56ebf85480SHans Petter Selasky CTASSERT((VM_PROT_ALL & -LINUXKPI_PROT_VALID) == 0); 571ea4c857SHans Petter Selasky 58c072f6e8SVladimir Kondratyev #define PAGE_KERNEL_IO 0x0000 59c072f6e8SVladimir Kondratyev 601ea4c857SHans Petter Selasky static inline pgprot_t 611ea4c857SHans Petter Selasky cachemode2protval(vm_memattr_t attr) 621ea4c857SHans Petter Selasky { 63ebf85480SHans Petter Selasky return ((attr << LINUXKPI_CACHE_MODE_SHIFT) | LINUXKPI_PROT_VALID); 641ea4c857SHans Petter Selasky } 651ea4c857SHans Petter Selasky 661ea4c857SHans Petter Selasky static inline vm_memattr_t 671ea4c857SHans Petter Selasky pgprot2cachemode(pgprot_t prot) 681ea4c857SHans Petter Selasky { 69ebf85480SHans Petter Selasky if (prot & LINUXKPI_PROT_VALID) 70ebf85480SHans Petter Selasky return (prot >> LINUXKPI_CACHE_MODE_SHIFT); 711ea4c857SHans Petter Selasky else 721ea4c857SHans Petter Selasky return (VM_MEMATTR_DEFAULT); 731ea4c857SHans Petter Selasky } 741ea4c857SHans Petter Selasky 75*80aa295aSVladimir Kondratyev #define page_to_virt(page) linux_page_address(page) 76ebf85480SHans Petter Selasky #define virt_to_page(x) PHYS_TO_VM_PAGE(vtophys(x)) 77ebf85480SHans Petter Selasky #define page_to_pfn(pp) (VM_PAGE_TO_PHYS(pp) >> PAGE_SHIFT) 7883d5d45eSHans Petter Selasky #define pfn_to_page(pfn) (PHYS_TO_VM_PAGE((pfn) << PAGE_SHIFT)) 79ebf85480SHans Petter Selasky #define nth_page(page,n) pfn_to_page(page_to_pfn(page) + (n)) 80c072f6e8SVladimir Kondratyev #define page_to_phys(page) VM_PAGE_TO_PHYS(page) 818d59ecb2SHans Petter Selasky 82ebf85480SHans Petter Selasky #define clear_page(page) memset(page, 0, PAGE_SIZE) 83e51dd47bSMark Johnston #define pgprot_noncached(prot) \ 84ebf85480SHans Petter Selasky (((prot) & VM_PROT_ALL) | cachemode2protval(VM_MEMATTR_UNCACHEABLE)) 858167c92fSJessica Clarke #ifdef VM_MEMATTR_WRITE_COMBINING 86e51dd47bSMark Johnston #define pgprot_writecombine(prot) \ 87ebf85480SHans Petter Selasky (((prot) & VM_PROT_ALL) | cachemode2protval(VM_MEMATTR_WRITE_COMBINING)) 888167c92fSJessica Clarke #else 898167c92fSJessica Clarke #define pgprot_writecombine(prot) pgprot_noncached(prot) 908167c92fSJessica Clarke #endif 918d59ecb2SHans Petter Selasky 928d59ecb2SHans Petter Selasky #undef PAGE_MASK 938d59ecb2SHans Petter Selasky #define PAGE_MASK (~(PAGE_SIZE-1)) 9483d5d45eSHans Petter Selasky /* 9583d5d45eSHans Petter Selasky * Modifying PAGE_MASK in the above way breaks trunc_page, round_page, 9683d5d45eSHans Petter Selasky * and btoc macros. Therefore, redefine them in a way that makes sense 9783d5d45eSHans Petter Selasky * so the LinuxKPI consumers don't get totally broken behavior. 9883d5d45eSHans Petter Selasky */ 9983d5d45eSHans Petter Selasky #undef btoc 10083d5d45eSHans Petter Selasky #define btoc(x) (((vm_offset_t)(x) + PAGE_SIZE - 1) >> PAGE_SHIFT) 10183d5d45eSHans Petter Selasky #undef round_page 10283d5d45eSHans Petter Selasky #define round_page(x) ((((uintptr_t)(x)) + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1)) 10383d5d45eSHans Petter Selasky #undef trunc_page 10483d5d45eSHans Petter Selasky #define trunc_page(x) ((uintptr_t)(x) & ~(PAGE_SIZE - 1)) 1058d59ecb2SHans Petter Selasky 106c072f6e8SVladimir Kondratyev #if defined(__i386__) || defined(__amd64__) 1079a79e08aSVladimir Kondratyev #undef clflush 108c072f6e8SVladimir Kondratyev #undef clflushopt 109c072f6e8SVladimir Kondratyev static inline void 110c072f6e8SVladimir Kondratyev lkpi_clflushopt(unsigned long addr) 111c072f6e8SVladimir Kondratyev { 112c072f6e8SVladimir Kondratyev if (cpu_stdext_feature & CPUID_STDEXT_CLFLUSHOPT) 113c072f6e8SVladimir Kondratyev clflushopt(addr); 114c072f6e8SVladimir Kondratyev else if (cpu_feature & CPUID_CLFSH) 115c072f6e8SVladimir Kondratyev clflush(addr); 116c072f6e8SVladimir Kondratyev else 117c072f6e8SVladimir Kondratyev pmap_invalidate_cache(); 118c072f6e8SVladimir Kondratyev } 1199a79e08aSVladimir Kondratyev #define clflush(x) clflush((unsigned long)(x)) 120c072f6e8SVladimir Kondratyev #define clflushopt(x) lkpi_clflushopt((unsigned long)(x)) 121db562aefSVladimir Kondratyev 122db562aefSVladimir Kondratyev static inline void 123db562aefSVladimir Kondratyev clflush_cache_range(void *addr, unsigned int size) 124db562aefSVladimir Kondratyev { 125db562aefSVladimir Kondratyev pmap_force_invalidate_cache_range((vm_offset_t)addr, 126db562aefSVladimir Kondratyev (vm_offset_t)addr + size); 127db562aefSVladimir Kondratyev } 128c072f6e8SVladimir Kondratyev #endif 129c072f6e8SVladimir Kondratyev 130307f78f3SVladimir Kondratyev #endif /* _LINUXKPI_LINUX_PAGE_H_ */ 131