1867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* 2867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Copyright 2010 Tilera Corporation. All Rights Reserved. 3867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 4867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * This program is free software; you can redistribute it and/or 5867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * modify it under the terms of the GNU General Public License 6867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * as published by the Free Software Foundation, version 2. 7867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 8867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * This program is distributed in the hope that it will be useful, but 9867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * WITHOUT ANY WARRANTY; without even the implied warranty of 10867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or 11867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * NON INFRINGEMENT. See the GNU General Public License for 12867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * more details. 13867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf */ 14867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 15867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#ifndef _ASM_TILE_PAGE_H 16867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define _ASM_TILE_PAGE_H 17867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 18867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#include <linux/const.h> 195386e735897afd8bcd332caf21a5f68d9e0e81c6Chris Metcalf#include <hv/hypervisor.h> 205386e735897afd8bcd332caf21a5f68d9e0e81c6Chris Metcalf#include <arch/chip.h> 21867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 22867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* PAGE_SHIFT and HPAGE_SHIFT determine the page sizes. */ 2376c567fbba50c3da2f4d40e2e551bab26cfd4381Chris Metcalf#define PAGE_SHIFT HV_LOG2_PAGE_SIZE_SMALL 2476c567fbba50c3da2f4d40e2e551bab26cfd4381Chris Metcalf#define HPAGE_SHIFT HV_LOG2_PAGE_SIZE_LARGE 25867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 26867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define PAGE_SIZE (_AC(1, UL) << PAGE_SHIFT) 27867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define HPAGE_SIZE (_AC(1, UL) << HPAGE_SHIFT) 28867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 29867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define PAGE_MASK (~(PAGE_SIZE - 1)) 30867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define HPAGE_MASK (~(HPAGE_SIZE - 1)) 31867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 32867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* 3376c567fbba50c3da2f4d40e2e551bab26cfd4381Chris Metcalf * If the Kconfig doesn't specify, set a maximum zone order that 3476c567fbba50c3da2f4d40e2e551bab26cfd4381Chris Metcalf * is enough so that we can create huge pages from small pages given 3576c567fbba50c3da2f4d40e2e551bab26cfd4381Chris Metcalf * the respective sizes of the two page types. See <linux/mmzone.h>. 36867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf */ 3776c567fbba50c3da2f4d40e2e551bab26cfd4381Chris Metcalf#ifndef CONFIG_FORCE_MAX_ZONEORDER 3876c567fbba50c3da2f4d40e2e551bab26cfd4381Chris Metcalf#define CONFIG_FORCE_MAX_ZONEORDER (HPAGE_SHIFT - PAGE_SHIFT + 1) 39867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#endif 40867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 41867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#ifndef __ASSEMBLY__ 42867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 43867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#include <linux/types.h> 44867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#include <linux/string.h> 45867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 46867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstruct page; 47867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 48867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline void clear_page(void *page) 49867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 50867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf memset(page, 0, PAGE_SIZE); 51867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 52867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 53867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline void copy_page(void *to, void *from) 54867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 55867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf memcpy(to, from, PAGE_SIZE); 56867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 57867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 58867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline void clear_user_page(void *page, unsigned long vaddr, 59867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf struct page *pg) 60867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 61867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf clear_page(page); 62867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 63867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 64867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline void copy_user_page(void *to, void *from, unsigned long vaddr, 65867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf struct page *topage) 66867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 67867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf copy_page(to, from); 68867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 69867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 70867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* 71867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Hypervisor page tables are made of the same basic structure. 72867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf */ 73867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 74867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalftypedef HV_PTE pte_t; 75867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalftypedef HV_PTE pgd_t; 76867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalftypedef HV_PTE pgprot_t; 77867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 78867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* 79867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * User L2 page tables are managed as one L2 page table per page, 80867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * because we use the page allocator for them. This keeps the allocation 81867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * simple and makes it potentially useful to implement HIGHPTE at some point. 82867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * However, it's also inefficient, since L2 page tables are much smaller 83867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * than pages (currently 2KB vs 64KB). So we should revisit this. 84867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf */ 85867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalftypedef struct page *pgtable_t; 86867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 87867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* Must be a macro since it is used to create constants. */ 88867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define __pgprot(val) hv_pte(val) 89867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 9028d717411badb78df71ecf087a07b93caf418f59Chris Metcalf/* Rarely-used initializers, typically with a "zero" value. */ 9128d717411badb78df71ecf087a07b93caf418f59Chris Metcalf#define __pte(x) hv_pte(x) 9228d717411badb78df71ecf087a07b93caf418f59Chris Metcalf#define __pgd(x) hv_pte(x) 9328d717411badb78df71ecf087a07b93caf418f59Chris Metcalf 94867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline u64 pgprot_val(pgprot_t pgprot) 95867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 96867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return hv_pte_val(pgprot); 97867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 98867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 99867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline u64 pte_val(pte_t pte) 100867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 101867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return hv_pte_val(pte); 102867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 103867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 104867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline u64 pgd_val(pgd_t pgd) 105867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 106867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return hv_pte_val(pgd); 107867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 108867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 109867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#ifdef __tilegx__ 110867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 111867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalftypedef HV_PTE pmd_t; 112867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 11328d717411badb78df71ecf087a07b93caf418f59Chris Metcalf#define __pmd(x) hv_pte(x) 11428d717411badb78df71ecf087a07b93caf418f59Chris Metcalf 115867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline u64 pmd_val(pmd_t pmd) 116867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 117867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return hv_pte_val(pmd); 118867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 119867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 120867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#endif 121867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 122c745a8a11fa1df6078bfc61fc29492ed43f71c2bChris Metcalfstatic inline __attribute_const__ int get_order(unsigned long size) 123c745a8a11fa1df6078bfc61fc29492ed43f71c2bChris Metcalf{ 124c745a8a11fa1df6078bfc61fc29492ed43f71c2bChris Metcalf return BITS_PER_LONG - __builtin_clzl((size - 1) >> PAGE_SHIFT); 125c745a8a11fa1df6078bfc61fc29492ed43f71c2bChris Metcalf} 126c745a8a11fa1df6078bfc61fc29492ed43f71c2bChris Metcalf 127867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#endif /* !__ASSEMBLY__ */ 128867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 129867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT) 130867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 131867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define HUGE_MAX_HSTATE 2 132867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 133867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#ifdef CONFIG_HUGETLB_PAGE 134867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define HAVE_ARCH_HUGETLB_UNMAPPED_AREA 135867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#endif 136867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 137867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* Each memory controller has PAs distinct in their high bits. */ 138867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define NR_PA_HIGHBIT_SHIFT (CHIP_PA_WIDTH() - CHIP_LOG_NUM_MSHIMS()) 139867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define NR_PA_HIGHBIT_VALUES (1 << CHIP_LOG_NUM_MSHIMS()) 140867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define __pa_to_highbits(pa) ((phys_addr_t)(pa) >> NR_PA_HIGHBIT_SHIFT) 141867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define __pfn_to_highbits(pfn) ((pfn) >> (NR_PA_HIGHBIT_SHIFT - PAGE_SHIFT)) 142867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 143867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#ifdef __tilegx__ 144867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 145867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* 146867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * We reserve the lower half of memory for user-space programs, and the 147867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * upper half for system code. We re-map all of physical memory in the 148867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * upper half, which takes a quarter of our VA space. Then we have 149867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * the vmalloc regions. The supervisor code lives at 0xfffffff700000000, 150867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * with the hypervisor above that. 151867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 152867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Loadable kernel modules are placed immediately after the static 153867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * supervisor code, with each being allocated a 256MB region of 154867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * address space, so we don't have to worry about the range of "jal" 155867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * and other branch instructions. 156867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 157867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * For now we keep life simple and just allocate one pmd (4GB) for vmalloc. 158867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Similarly, for now we don't play any struct page mapping games. 159867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf */ 160867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 161867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#if CHIP_PA_WIDTH() + 2 > CHIP_VA_WIDTH() 162867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf# error Too much PA to map with the VA available! 163867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#endif 164867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define HALF_VA_SPACE (_AC(1, UL) << (CHIP_VA_WIDTH() - 1)) 165867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 166867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define MEM_LOW_END (HALF_VA_SPACE - 1) /* low half */ 167867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define MEM_HIGH_START (-HALF_VA_SPACE) /* high half */ 168867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define PAGE_OFFSET MEM_HIGH_START 169867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define _VMALLOC_START _AC(0xfffffff500000000, UL) /* 4 GB */ 170867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define HUGE_VMAP_BASE _AC(0xfffffff600000000, UL) /* 4 GB */ 171867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define MEM_SV_START _AC(0xfffffff700000000, UL) /* 256 MB */ 172867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define MEM_SV_INTRPT MEM_SV_START 173867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define MEM_MODULE_START _AC(0xfffffff710000000, UL) /* 256 MB */ 174867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define MEM_MODULE_END (MEM_MODULE_START + (256*1024*1024)) 175867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define MEM_HV_START _AC(0xfffffff800000000, UL) /* 32 GB */ 176867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 177867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* Highest DTLB address we will use */ 178867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define KERNEL_HIGH_VADDR MEM_SV_START 179867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 180867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* Since we don't currently provide any fixmaps, we use an impossible VA. */ 181867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define FIXADDR_TOP MEM_HV_START 182867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 183867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#else /* !__tilegx__ */ 184867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 185867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* 186867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * A PAGE_OFFSET of 0xC0000000 means that the kernel has 187867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * a virtual address space of one gigabyte, which limits the 188867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * amount of physical memory you can use to about 768MB. 189867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * If you want more physical memory than this then see the CONFIG_HIGHMEM 190867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * option in the kernel configuration. 191867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 192a78c942df64ef4cf495fd4d8715e48501bd7f8a4Chris Metcalf * The top 16MB chunk in the table below is unavailable to Linux. Since 193a78c942df64ef4cf495fd4d8715e48501bd7f8a4Chris Metcalf * the kernel interrupt vectors must live at ether 0xfe000000 or 0xfd000000 194a78c942df64ef4cf495fd4d8715e48501bd7f8a4Chris Metcalf * (depending on whether the kernel is at PL2 or Pl1), we map all of the 195a78c942df64ef4cf495fd4d8715e48501bd7f8a4Chris Metcalf * bottom of RAM at this address with a huge page table entry to minimize 196a78c942df64ef4cf495fd4d8715e48501bd7f8a4Chris Metcalf * its ITLB footprint (as well as at PAGE_OFFSET). The last architected 197a78c942df64ef4cf495fd4d8715e48501bd7f8a4Chris Metcalf * requirement is that user interrupt vectors live at 0xfc000000, so we 198a78c942df64ef4cf495fd4d8715e48501bd7f8a4Chris Metcalf * make that range of memory available to user processes. The remaining 199a78c942df64ef4cf495fd4d8715e48501bd7f8a4Chris Metcalf * regions are sized as shown; the first four addresses use the PL 1 200a78c942df64ef4cf495fd4d8715e48501bd7f8a4Chris Metcalf * values, and after that, we show "typical" values, since the actual 201a78c942df64ef4cf495fd4d8715e48501bd7f8a4Chris Metcalf * addresses depend on kernel #defines. 202867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 203867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * MEM_HV_INTRPT 0xfe000000 204867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * MEM_SV_INTRPT (kernel code) 0xfd000000 205867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * MEM_USER_INTRPT (user vector) 0xfc000000 206867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * FIX_KMAP_xxx 0xf8000000 (via NR_CPUS * KM_TYPE_NR) 207867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * PKMAP_BASE 0xf7000000 (via LAST_PKMAP) 208867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * HUGE_VMAP 0xf3000000 (via CONFIG_NR_HUGE_VMAPS) 209867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * VMALLOC_START 0xf0000000 (via __VMALLOC_RESERVE) 210867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * mapped LOWMEM 0xc0000000 211867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf */ 212867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 213867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define MEM_USER_INTRPT _AC(0xfc000000, UL) 214a78c942df64ef4cf495fd4d8715e48501bd7f8a4Chris Metcalf#if CONFIG_KERNEL_PL == 1 215867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define MEM_SV_INTRPT _AC(0xfd000000, UL) 216867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define MEM_HV_INTRPT _AC(0xfe000000, UL) 217a78c942df64ef4cf495fd4d8715e48501bd7f8a4Chris Metcalf#else 218a78c942df64ef4cf495fd4d8715e48501bd7f8a4Chris Metcalf#define MEM_GUEST_INTRPT _AC(0xfd000000, UL) 219a78c942df64ef4cf495fd4d8715e48501bd7f8a4Chris Metcalf#define MEM_SV_INTRPT _AC(0xfe000000, UL) 220a78c942df64ef4cf495fd4d8715e48501bd7f8a4Chris Metcalf#define MEM_HV_INTRPT _AC(0xff000000, UL) 221a78c942df64ef4cf495fd4d8715e48501bd7f8a4Chris Metcalf#endif 222867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 223867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define INTRPT_SIZE 0x4000 224867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 225867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* Tolerate page size larger than the architecture interrupt region size. */ 226867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#if PAGE_SIZE > INTRPT_SIZE 227867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#undef INTRPT_SIZE 228867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define INTRPT_SIZE PAGE_SIZE 229867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#endif 230867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 231867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define KERNEL_HIGH_VADDR MEM_USER_INTRPT 232867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define FIXADDR_TOP (KERNEL_HIGH_VADDR - PAGE_SIZE) 233867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 234867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define PAGE_OFFSET _AC(CONFIG_PAGE_OFFSET, UL) 235867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 236867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* On 32-bit architectures we mix kernel modules in with other vmaps. */ 237867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define MEM_MODULE_START VMALLOC_START 238867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define MEM_MODULE_END VMALLOC_END 239867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 240867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#endif /* __tilegx__ */ 241867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 242867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#ifndef __ASSEMBLY__ 243867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 244867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#ifdef CONFIG_HIGHMEM 245867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 246867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* Map kernel virtual addresses to page frames, in HPAGE_SIZE chunks. */ 247867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfextern unsigned long pbase_map[]; 248867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfextern void *vbase_map[]; 249867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 250867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline unsigned long kaddr_to_pfn(const volatile void *_kaddr) 251867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 252867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf unsigned long kaddr = (unsigned long)_kaddr; 253867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return pbase_map[kaddr >> HPAGE_SHIFT] + 254867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf ((kaddr & (HPAGE_SIZE - 1)) >> PAGE_SHIFT); 255867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 256867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 257867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline void *pfn_to_kaddr(unsigned long pfn) 258867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 259867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return vbase_map[__pfn_to_highbits(pfn)] + (pfn << PAGE_SHIFT); 260867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 261867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 262867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline phys_addr_t virt_to_phys(const volatile void *kaddr) 263867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 264867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf unsigned long pfn = kaddr_to_pfn(kaddr); 265867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return ((phys_addr_t)pfn << PAGE_SHIFT) + 266867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf ((unsigned long)kaddr & (PAGE_SIZE-1)); 267867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 268867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 269867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline void *phys_to_virt(phys_addr_t paddr) 270867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 271867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return pfn_to_kaddr(paddr >> PAGE_SHIFT) + (paddr & (PAGE_SIZE-1)); 272867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 273867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 274867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* With HIGHMEM, we pack PAGE_OFFSET through high_memory with all valid VAs. */ 275867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline int virt_addr_valid(const volatile void *kaddr) 276867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 277867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf extern void *high_memory; /* copied from <linux/mm.h> */ 278867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return ((unsigned long)kaddr >= PAGE_OFFSET && kaddr < high_memory); 279867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 280867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 281867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#else /* !CONFIG_HIGHMEM */ 282867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 283867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline unsigned long kaddr_to_pfn(const volatile void *kaddr) 284867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 285867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return ((unsigned long)kaddr - PAGE_OFFSET) >> PAGE_SHIFT; 286867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 287867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 288867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline void *pfn_to_kaddr(unsigned long pfn) 289867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 290867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return (void *)((pfn << PAGE_SHIFT) + PAGE_OFFSET); 291867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 292867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 293867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline phys_addr_t virt_to_phys(const volatile void *kaddr) 294867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 295867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return (phys_addr_t)((unsigned long)kaddr - PAGE_OFFSET); 296867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 297867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 298867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline void *phys_to_virt(phys_addr_t paddr) 299867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 300867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return (void *)((unsigned long)paddr + PAGE_OFFSET); 301867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 302867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 303867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* Check that the given address is within some mapped range of PAs. */ 304867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define virt_addr_valid(kaddr) pfn_valid(kaddr_to_pfn(kaddr)) 305867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 306867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#endif /* !CONFIG_HIGHMEM */ 307867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 308867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* All callers are not consistent in how they call these functions. */ 309867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define __pa(kaddr) virt_to_phys((void *)(unsigned long)(kaddr)) 310867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define __va(paddr) phys_to_virt((phys_addr_t)(paddr)) 311867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 312867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfextern int devmem_is_allowed(unsigned long pagenr); 313867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 314867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#ifdef CONFIG_FLATMEM 315867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline int pfn_valid(unsigned long pfn) 316867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 317867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return pfn < max_mapnr; 318867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 319867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#endif 320867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 321867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* Provide as macros since these require some other headers included. */ 322867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define page_to_pa(page) ((phys_addr_t)(page_to_pfn(page)) << PAGE_SHIFT) 32328d717411badb78df71ecf087a07b93caf418f59Chris Metcalf#define virt_to_page(kaddr) pfn_to_page(kaddr_to_pfn((void *)(kaddr))) 324867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define page_to_virt(page) pfn_to_kaddr(page_to_pfn(page)) 325867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 326867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstruct mm_struct; 327867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfextern pte_t *virt_to_pte(struct mm_struct *mm, unsigned long addr); 328867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 329867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#endif /* !__ASSEMBLY__ */ 330867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 331867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define VM_DATA_DEFAULT_FLAGS \ 332867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf (VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) 333867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 334867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#include <asm-generic/memory_model.h> 335867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 336867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#endif /* _ASM_TILE_PAGE_H */ 337