1ffb56695SRafal Jaworowski /*- 217f4cae4SRafal Jaworowski * Copyright (C) 2006-2012 Semihalf. 3ffb56695SRafal Jaworowski * All rights reserved. 4ffb56695SRafal Jaworowski * 5ffb56695SRafal Jaworowski * Redistribution and use in source and binary forms, with or without 6ffb56695SRafal Jaworowski * modification, are permitted provided that the following conditions 7ffb56695SRafal Jaworowski * are met: 8ffb56695SRafal Jaworowski * 1. Redistributions of source code must retain the above copyright 9ffb56695SRafal Jaworowski * notice, this list of conditions and the following disclaimer. 10ffb56695SRafal Jaworowski * 2. Redistributions in binary form must reproduce the above copyright 11ffb56695SRafal Jaworowski * notice, this list of conditions and the following disclaimer in the 12ffb56695SRafal Jaworowski * documentation and/or other materials provided with the distribution. 13ffb56695SRafal Jaworowski * 3. The name of the author may not be used to endorse or promote products 14ffb56695SRafal Jaworowski * derived from this software without specific prior written permission. 15ffb56695SRafal Jaworowski * 16ffb56695SRafal Jaworowski * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17ffb56695SRafal Jaworowski * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18ffb56695SRafal Jaworowski * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN 19ffb56695SRafal Jaworowski * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20ffb56695SRafal Jaworowski * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 21ffb56695SRafal Jaworowski * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 22ffb56695SRafal Jaworowski * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 23ffb56695SRafal Jaworowski * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 24ffb56695SRafal Jaworowski * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 25ffb56695SRafal Jaworowski * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26ffb56695SRafal Jaworowski * 27ffb56695SRafal Jaworowski * $FreeBSD$ 28ffb56695SRafal Jaworowski */ 29ffb56695SRafal Jaworowski 30ffb56695SRafal Jaworowski #ifndef _MACHINE_TLB_H_ 31ffb56695SRafal Jaworowski #define _MACHINE_TLB_H_ 32ffb56695SRafal Jaworowski 3317f4cae4SRafal Jaworowski #if defined(BOOKE_E500) 3417f4cae4SRafal Jaworowski 35ffb56695SRafal Jaworowski /* PowerPC E500 MAS registers */ 36ffb56695SRafal Jaworowski #define MAS0_TLBSEL(x) ((x << 28) & 0x10000000) 37afefc223SJustin Hibbits #define MAS0_ESEL(x) ((x << 16) & 0x003F0000) 38ffb56695SRafal Jaworowski 39ffb56695SRafal Jaworowski #define MAS0_TLBSEL1 0x10000000 40ffb56695SRafal Jaworowski #define MAS0_TLBSEL0 0x00000000 41ffb56695SRafal Jaworowski #define MAS0_ESEL_TLB1MASK 0x000F0000 42ffb56695SRafal Jaworowski #define MAS0_ESEL_TLB0MASK 0x00030000 43ffb56695SRafal Jaworowski #define MAS0_ESEL_SHIFT 16 44ffb56695SRafal Jaworowski #define MAS0_NV_MASK 0x00000003 45ffb56695SRafal Jaworowski #define MAS0_NV_SHIFT 0 46ffb56695SRafal Jaworowski 47ffb56695SRafal Jaworowski #define MAS1_VALID 0x80000000 48ffb56695SRafal Jaworowski #define MAS1_IPROT 0x40000000 49ffb56695SRafal Jaworowski #define MAS1_TID_MASK 0x00FF0000 50ffb56695SRafal Jaworowski #define MAS1_TID_SHIFT 16 51b2b734e7SRafal Jaworowski #define MAS1_TS_MASK 0x00001000 52b2b734e7SRafal Jaworowski #define MAS1_TS_SHIFT 12 53ffb56695SRafal Jaworowski #define MAS1_TSIZE_MASK 0x00000F00 54ffb56695SRafal Jaworowski #define MAS1_TSIZE_SHIFT 8 55ffb56695SRafal Jaworowski 56ffb56695SRafal Jaworowski #define TLB_SIZE_4K 1 57ffb56695SRafal Jaworowski #define TLB_SIZE_16K 2 58ffb56695SRafal Jaworowski #define TLB_SIZE_64K 3 59ffb56695SRafal Jaworowski #define TLB_SIZE_256K 4 60ffb56695SRafal Jaworowski #define TLB_SIZE_1M 5 61ffb56695SRafal Jaworowski #define TLB_SIZE_4M 6 62ffb56695SRafal Jaworowski #define TLB_SIZE_16M 7 63ffb56695SRafal Jaworowski #define TLB_SIZE_64M 8 64ffb56695SRafal Jaworowski #define TLB_SIZE_256M 9 65ffb56695SRafal Jaworowski #define TLB_SIZE_1G 10 66ffb56695SRafal Jaworowski #define TLB_SIZE_4G 11 67ffb56695SRafal Jaworowski 68*e683c328SJustin Hibbits #ifdef __powerpc64__ 69*e683c328SJustin Hibbits #define MAS2_EPN_MASK 0xFFFFFFFFFFFFF000UL 70*e683c328SJustin Hibbits #else 71b2b734e7SRafal Jaworowski #define MAS2_EPN_MASK 0xFFFFF000 72*e683c328SJustin Hibbits #endif 73ffb56695SRafal Jaworowski #define MAS2_EPN_SHIFT 12 74ffb56695SRafal Jaworowski #define MAS2_X0 0x00000040 75ffb56695SRafal Jaworowski #define MAS2_X1 0x00000020 76ffb56695SRafal Jaworowski #define MAS2_W 0x00000010 77ffb56695SRafal Jaworowski #define MAS2_I 0x00000008 78ffb56695SRafal Jaworowski #define MAS2_M 0x00000004 79ffb56695SRafal Jaworowski #define MAS2_G 0x00000002 80ffb56695SRafal Jaworowski #define MAS2_E 0x00000001 81f60708c9SJustin Hibbits #define MAS2_WIMGE_MASK 0x0000007F 82ffb56695SRafal Jaworowski 83ffb56695SRafal Jaworowski #define MAS3_RPN 0xFFFFF000 84ffb56695SRafal Jaworowski #define MAS3_RPN_SHIFT 12 85ffb56695SRafal Jaworowski #define MAS3_U0 0x00000200 86ffb56695SRafal Jaworowski #define MAS3_U1 0x00000100 87ffb56695SRafal Jaworowski #define MAS3_U2 0x00000080 88ffb56695SRafal Jaworowski #define MAS3_U3 0x00000040 89ffb56695SRafal Jaworowski #define MAS3_UX 0x00000020 90ffb56695SRafal Jaworowski #define MAS3_SX 0x00000010 91ffb56695SRafal Jaworowski #define MAS3_UW 0x00000008 92ffb56695SRafal Jaworowski #define MAS3_SW 0x00000004 93ffb56695SRafal Jaworowski #define MAS3_UR 0x00000002 94ffb56695SRafal Jaworowski #define MAS3_SR 0x00000001 95ffb56695SRafal Jaworowski 96ffb56695SRafal Jaworowski #define MAS4_TLBSELD1 0x10000000 97ffb56695SRafal Jaworowski #define MAS4_TLBSELD0 0x00000000 98ffb56695SRafal Jaworowski #define MAS4_TIDSELD_MASK 0x00030000 99ffb56695SRafal Jaworowski #define MAS4_TIDSELD_SHIFT 16 100ffb56695SRafal Jaworowski #define MAS4_TSIZED_MASK 0x00000F00 101ffb56695SRafal Jaworowski #define MAS4_TSIZED_SHIFT 8 102ffb56695SRafal Jaworowski #define MAS4_X0D 0x00000040 103ffb56695SRafal Jaworowski #define MAS4_X1D 0x00000020 104ffb56695SRafal Jaworowski #define MAS4_WD 0x00000010 105ffb56695SRafal Jaworowski #define MAS4_ID 0x00000008 106ffb56695SRafal Jaworowski #define MAS4_MD 0x00000004 107ffb56695SRafal Jaworowski #define MAS4_GD 0x00000002 108ffb56695SRafal Jaworowski #define MAS4_ED 0x00000001 109ffb56695SRafal Jaworowski 110ffb56695SRafal Jaworowski #define MAS6_SPID0_MASK 0x00FF0000 111ffb56695SRafal Jaworowski #define MAS6_SPID0_SHIFT 16 112ffb56695SRafal Jaworowski #define MAS6_SAS 0x00000001 113ffb56695SRafal Jaworowski 11492f6e934SJustin Hibbits #define MAS7_RPN 0x0000000F 11592f6e934SJustin Hibbits 116ffb56695SRafal Jaworowski #define MAS1_GETTID(mas1) (((mas1) & MAS1_TID_MASK) >> MAS1_TID_SHIFT) 117ffb56695SRafal Jaworowski 118ffb56695SRafal Jaworowski #define MAS2_TLB0_ENTRY_IDX_MASK 0x0007f000 119ffb56695SRafal Jaworowski #define MAS2_TLB0_ENTRY_IDX_SHIFT 12 120ffb56695SRafal Jaworowski 121ffb56695SRafal Jaworowski /* 122b2b734e7SRafal Jaworowski * Maximum number of TLB1 entries used for a permanent mapping of kernel 123b2b734e7SRafal Jaworowski * region (kernel image plus statically allocated data). 124ffb56695SRafal Jaworowski */ 125ffb56695SRafal Jaworowski #define KERNEL_REGION_MAX_TLB_ENTRIES 4 126ffb56695SRafal Jaworowski 127f60708c9SJustin Hibbits /* 128f60708c9SJustin Hibbits * Use MAS2_X0 to mark entries which will be copied 129f60708c9SJustin Hibbits * to AP CPUs during SMP bootstrap. As result entries 130f60708c9SJustin Hibbits * marked with _TLB_ENTRY_SHARED will be shared by all CPUs. 131f60708c9SJustin Hibbits */ 132f60708c9SJustin Hibbits #define _TLB_ENTRY_SHARED (MAS2_X0) /* XXX under SMP? */ 133ffb56695SRafal Jaworowski #define _TLB_ENTRY_IO (MAS2_I | MAS2_G) 134b2b734e7SRafal Jaworowski #define _TLB_ENTRY_MEM (MAS2_M) 135ffb56695SRafal Jaworowski 136f60708c9SJustin Hibbits #define TLB1_MAX_ENTRIES 64 137f60708c9SJustin Hibbits 13817f4cae4SRafal Jaworowski #if !defined(LOCORE) 13917f4cae4SRafal Jaworowski typedef struct tlb_entry { 14033724f17SNathan Whitehorn vm_paddr_t phys; 14133724f17SNathan Whitehorn vm_offset_t virt; 14233724f17SNathan Whitehorn vm_size_t size; 14317f4cae4SRafal Jaworowski uint32_t mas1; 144*e683c328SJustin Hibbits #ifdef __powerpc64__ 145*e683c328SJustin Hibbits uint64_t mas2; 146*e683c328SJustin Hibbits #else 14717f4cae4SRafal Jaworowski uint32_t mas2; 148*e683c328SJustin Hibbits #endif 14917f4cae4SRafal Jaworowski uint32_t mas3; 15092f6e934SJustin Hibbits uint32_t mas7; 15117f4cae4SRafal Jaworowski } tlb_entry_t; 15217f4cae4SRafal Jaworowski 15317f4cae4SRafal Jaworowski void tlb0_print_tlbentries(void); 15417f4cae4SRafal Jaworowski 15517f4cae4SRafal Jaworowski void tlb1_inval_entry(unsigned int); 15633724f17SNathan Whitehorn void tlb1_init(void); 15717f4cae4SRafal Jaworowski void tlb1_print_entries(void); 15817f4cae4SRafal Jaworowski void tlb1_print_tlbentries(void); 15917f4cae4SRafal Jaworowski #endif /* !LOCORE */ 16017f4cae4SRafal Jaworowski 16117f4cae4SRafal Jaworowski #elif defined(BOOKE_PPC4XX) 16217f4cae4SRafal Jaworowski 16317f4cae4SRafal Jaworowski /* TLB Words */ 16417f4cae4SRafal Jaworowski #define TLB_PAGEID 0 16517f4cae4SRafal Jaworowski #define TLB_XLAT 1 16617f4cae4SRafal Jaworowski #define TLB_ATTRIB 2 16717f4cae4SRafal Jaworowski 16817f4cae4SRafal Jaworowski /* Page identification fields */ 16917f4cae4SRafal Jaworowski #define TLB_EPN_MASK (0xFFFFFC00 >> 0) 17017f4cae4SRafal Jaworowski #define TLB_VALID (0x80000000 >> 22) 17117f4cae4SRafal Jaworowski #define TLB_TS (0x80000000 >> 23) 17217f4cae4SRafal Jaworowski #define TLB_SIZE_1K (0x00000000 >> 24) 17317f4cae4SRafal Jaworowski #define TLB_SIZE_MASK (0xF0000000 >> 24) 17417f4cae4SRafal Jaworowski 17517f4cae4SRafal Jaworowski /* Translation fields */ 17617f4cae4SRafal Jaworowski #define TLB_RPN_MASK (0xFFFFFC00 >> 0) 17717f4cae4SRafal Jaworowski #define TLB_ERPN_MASK (0xF0000000 >> 28) 17817f4cae4SRafal Jaworowski 17917f4cae4SRafal Jaworowski /* Storage attribute and access control fields */ 18017f4cae4SRafal Jaworowski #define TLB_WL1 (0x80000000 >> 11) 18117f4cae4SRafal Jaworowski #define TLB_IL1I (0x80000000 >> 12) 18217f4cae4SRafal Jaworowski #define TLB_IL1D (0x80000000 >> 13) 18317f4cae4SRafal Jaworowski #define TLB_IL2I (0x80000000 >> 14) 18417f4cae4SRafal Jaworowski #define TLB_IL2D (0x80000000 >> 15) 18517f4cae4SRafal Jaworowski #define TLB_U0 (0x80000000 >> 16) 18617f4cae4SRafal Jaworowski #define TLB_U1 (0x80000000 >> 17) 18717f4cae4SRafal Jaworowski #define TLB_U2 (0x80000000 >> 18) 18817f4cae4SRafal Jaworowski #define TLB_U3 (0x80000000 >> 19) 18917f4cae4SRafal Jaworowski #define TLB_W (0x80000000 >> 20) 19017f4cae4SRafal Jaworowski #define TLB_I (0x80000000 >> 21) 19117f4cae4SRafal Jaworowski #define TLB_M (0x80000000 >> 22) 19217f4cae4SRafal Jaworowski #define TLB_G (0x80000000 >> 23) 19317f4cae4SRafal Jaworowski #define TLB_E (0x80000000 >> 24) 19417f4cae4SRafal Jaworowski #define TLB_UX (0x80000000 >> 26) 19517f4cae4SRafal Jaworowski #define TLB_UW (0x80000000 >> 27) 19617f4cae4SRafal Jaworowski #define TLB_UR (0x80000000 >> 28) 19717f4cae4SRafal Jaworowski #define TLB_SX (0x80000000 >> 29) 19817f4cae4SRafal Jaworowski #define TLB_SW (0x80000000 >> 30) 19917f4cae4SRafal Jaworowski #define TLB_SR (0x80000000 >> 31) 20017f4cae4SRafal Jaworowski #define TLB_SIZE 64 20117f4cae4SRafal Jaworowski 20217f4cae4SRafal Jaworowski #define TLB_SIZE_4K (0x10000000 >> 24) 20317f4cae4SRafal Jaworowski #define TLB_SIZE_16K (0x20000000 >> 24) 20417f4cae4SRafal Jaworowski #define TLB_SIZE_64K (0x30000000 >> 24) 20517f4cae4SRafal Jaworowski #define TLB_SIZE_256K (0x40000000 >> 24) 20617f4cae4SRafal Jaworowski #define TLB_SIZE_1M (0x50000000 >> 24) 20717f4cae4SRafal Jaworowski #define TLB_SIZE_16M (0x70000000 >> 24) 20817f4cae4SRafal Jaworowski #define TLB_SIZE_256M (0x90000000 >> 24) 20917f4cae4SRafal Jaworowski #define TLB_SIZE_1G (0xA0000000 >> 24) 21017f4cae4SRafal Jaworowski 21117f4cae4SRafal Jaworowski #endif /* BOOKE_E500 */ 21217f4cae4SRafal Jaworowski 213b2b734e7SRafal Jaworowski #define TID_KERNEL 0 /* TLB TID to use for kernel (shared) translations */ 214ffb56695SRafal Jaworowski #define TID_KRESERVED 1 /* Number of TIDs reserved for kernel */ 215b2b734e7SRafal Jaworowski #define TID_URESERVED 0 /* Number of TIDs reserved for user */ 216ffb56695SRafal Jaworowski #define TID_MIN (TID_KRESERVED + TID_URESERVED) 217ffb56695SRafal Jaworowski #define TID_MAX 255 218b2b734e7SRafal Jaworowski #define TID_NONE -1 219ffb56695SRafal Jaworowski 2201d56a280SRafal Jaworowski #define TLB_UNLOCKED 0 2211d56a280SRafal Jaworowski 222ffb56695SRafal Jaworowski #if !defined(LOCORE) 223ffb56695SRafal Jaworowski 224b2b734e7SRafal Jaworowski typedef int tlbtid_t; 22517f4cae4SRafal Jaworowski 226ffb56695SRafal Jaworowski struct pmap; 227ffb56695SRafal Jaworowski 228*e683c328SJustin Hibbits void tlb_lock(uintptr_t *); 229*e683c328SJustin Hibbits void tlb_unlock(uintptr_t *); 230f60708c9SJustin Hibbits void tlb1_ap_prep(void); 2310aeed3e9SJustin Hibbits int tlb1_set_entry(vm_offset_t, vm_paddr_t, vm_size_t, uint32_t); 2321d56a280SRafal Jaworowski 233ffb56695SRafal Jaworowski #endif /* !LOCORE */ 234ffb56695SRafal Jaworowski 235ffb56695SRafal Jaworowski #endif /* _MACHINE_TLB_H_ */ 236