1ffb56695SRafal Jaworowski /*- 2*17f4cae4SRafal 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 33*17f4cae4SRafal Jaworowski #if defined(BOOKE_E500) 34*17f4cae4SRafal Jaworowski 35ffb56695SRafal Jaworowski /* PowerPC E500 MAS registers */ 36ffb56695SRafal Jaworowski #define MAS0_TLBSEL(x) ((x << 28) & 0x10000000) 37ffb56695SRafal Jaworowski #define MAS0_ESEL(x) ((x << 16) & 0x000F0000) 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 68b2b734e7SRafal Jaworowski #define MAS2_EPN_MASK 0xFFFFF000 69ffb56695SRafal Jaworowski #define MAS2_EPN_SHIFT 12 70ffb56695SRafal Jaworowski #define MAS2_X0 0x00000040 71ffb56695SRafal Jaworowski #define MAS2_X1 0x00000020 72ffb56695SRafal Jaworowski #define MAS2_W 0x00000010 73ffb56695SRafal Jaworowski #define MAS2_I 0x00000008 74ffb56695SRafal Jaworowski #define MAS2_M 0x00000004 75ffb56695SRafal Jaworowski #define MAS2_G 0x00000002 76ffb56695SRafal Jaworowski #define MAS2_E 0x00000001 77ffb56695SRafal Jaworowski 78ffb56695SRafal Jaworowski #define MAS3_RPN 0xFFFFF000 79ffb56695SRafal Jaworowski #define MAS3_RPN_SHIFT 12 80ffb56695SRafal Jaworowski #define MAS3_U0 0x00000200 81ffb56695SRafal Jaworowski #define MAS3_U1 0x00000100 82ffb56695SRafal Jaworowski #define MAS3_U2 0x00000080 83ffb56695SRafal Jaworowski #define MAS3_U3 0x00000040 84ffb56695SRafal Jaworowski #define MAS3_UX 0x00000020 85ffb56695SRafal Jaworowski #define MAS3_SX 0x00000010 86ffb56695SRafal Jaworowski #define MAS3_UW 0x00000008 87ffb56695SRafal Jaworowski #define MAS3_SW 0x00000004 88ffb56695SRafal Jaworowski #define MAS3_UR 0x00000002 89ffb56695SRafal Jaworowski #define MAS3_SR 0x00000001 90ffb56695SRafal Jaworowski 91ffb56695SRafal Jaworowski #define MAS4_TLBSELD1 0x10000000 92ffb56695SRafal Jaworowski #define MAS4_TLBSELD0 0x00000000 93ffb56695SRafal Jaworowski #define MAS4_TIDSELD_MASK 0x00030000 94ffb56695SRafal Jaworowski #define MAS4_TIDSELD_SHIFT 16 95ffb56695SRafal Jaworowski #define MAS4_TSIZED_MASK 0x00000F00 96ffb56695SRafal Jaworowski #define MAS4_TSIZED_SHIFT 8 97ffb56695SRafal Jaworowski #define MAS4_X0D 0x00000040 98ffb56695SRafal Jaworowski #define MAS4_X1D 0x00000020 99ffb56695SRafal Jaworowski #define MAS4_WD 0x00000010 100ffb56695SRafal Jaworowski #define MAS4_ID 0x00000008 101ffb56695SRafal Jaworowski #define MAS4_MD 0x00000004 102ffb56695SRafal Jaworowski #define MAS4_GD 0x00000002 103ffb56695SRafal Jaworowski #define MAS4_ED 0x00000001 104ffb56695SRafal Jaworowski 105ffb56695SRafal Jaworowski #define MAS6_SPID0_MASK 0x00FF0000 106ffb56695SRafal Jaworowski #define MAS6_SPID0_SHIFT 16 107ffb56695SRafal Jaworowski #define MAS6_SAS 0x00000001 108ffb56695SRafal Jaworowski 109ffb56695SRafal Jaworowski #define MAS1_GETTID(mas1) (((mas1) & MAS1_TID_MASK) >> MAS1_TID_SHIFT) 110ffb56695SRafal Jaworowski 111ffb56695SRafal Jaworowski #define MAS2_TLB0_ENTRY_IDX_MASK 0x0007f000 112ffb56695SRafal Jaworowski #define MAS2_TLB0_ENTRY_IDX_SHIFT 12 113ffb56695SRafal Jaworowski 114ffb56695SRafal Jaworowski /* 115b2b734e7SRafal Jaworowski * Maximum number of TLB1 entries used for a permanent mapping of kernel 116b2b734e7SRafal Jaworowski * region (kernel image plus statically allocated data). 117ffb56695SRafal Jaworowski */ 118ffb56695SRafal Jaworowski #define KERNEL_REGION_MAX_TLB_ENTRIES 4 119ffb56695SRafal Jaworowski 120ffb56695SRafal Jaworowski #define _TLB_ENTRY_IO (MAS2_I | MAS2_G) 121b2b734e7SRafal Jaworowski #ifdef SMP 122b2b734e7SRafal Jaworowski #define _TLB_ENTRY_MEM (MAS2_M) 123b2b734e7SRafal Jaworowski #else 124ffb56695SRafal Jaworowski #define _TLB_ENTRY_MEM (0) 125b2b734e7SRafal Jaworowski #endif 126ffb56695SRafal Jaworowski 127*17f4cae4SRafal Jaworowski #if !defined(LOCORE) 128*17f4cae4SRafal Jaworowski typedef struct tlb_entry { 129*17f4cae4SRafal Jaworowski uint32_t mas1; 130*17f4cae4SRafal Jaworowski uint32_t mas2; 131*17f4cae4SRafal Jaworowski uint32_t mas3; 132*17f4cae4SRafal Jaworowski } tlb_entry_t; 133*17f4cae4SRafal Jaworowski 134*17f4cae4SRafal Jaworowski void tlb0_print_tlbentries(void); 135*17f4cae4SRafal Jaworowski 136*17f4cae4SRafal Jaworowski void tlb1_inval_entry(unsigned int); 137*17f4cae4SRafal Jaworowski void tlb1_init(vm_offset_t); 138*17f4cae4SRafal Jaworowski void tlb1_print_entries(void); 139*17f4cae4SRafal Jaworowski void tlb1_print_tlbentries(void); 140*17f4cae4SRafal Jaworowski #endif /* !LOCORE */ 141*17f4cae4SRafal Jaworowski 142*17f4cae4SRafal Jaworowski #elif defined(BOOKE_PPC4XX) 143*17f4cae4SRafal Jaworowski 144*17f4cae4SRafal Jaworowski /* TLB Words */ 145*17f4cae4SRafal Jaworowski #define TLB_PAGEID 0 146*17f4cae4SRafal Jaworowski #define TLB_XLAT 1 147*17f4cae4SRafal Jaworowski #define TLB_ATTRIB 2 148*17f4cae4SRafal Jaworowski 149*17f4cae4SRafal Jaworowski /* Page identification fields */ 150*17f4cae4SRafal Jaworowski #define TLB_EPN_MASK (0xFFFFFC00 >> 0) 151*17f4cae4SRafal Jaworowski #define TLB_VALID (0x80000000 >> 22) 152*17f4cae4SRafal Jaworowski #define TLB_TS (0x80000000 >> 23) 153*17f4cae4SRafal Jaworowski #define TLB_SIZE_1K (0x00000000 >> 24) 154*17f4cae4SRafal Jaworowski #define TLB_SIZE_MASK (0xF0000000 >> 24) 155*17f4cae4SRafal Jaworowski 156*17f4cae4SRafal Jaworowski /* Translation fields */ 157*17f4cae4SRafal Jaworowski #define TLB_RPN_MASK (0xFFFFFC00 >> 0) 158*17f4cae4SRafal Jaworowski #define TLB_ERPN_MASK (0xF0000000 >> 28) 159*17f4cae4SRafal Jaworowski 160*17f4cae4SRafal Jaworowski /* Storage attribute and access control fields */ 161*17f4cae4SRafal Jaworowski #define TLB_WL1 (0x80000000 >> 11) 162*17f4cae4SRafal Jaworowski #define TLB_IL1I (0x80000000 >> 12) 163*17f4cae4SRafal Jaworowski #define TLB_IL1D (0x80000000 >> 13) 164*17f4cae4SRafal Jaworowski #define TLB_IL2I (0x80000000 >> 14) 165*17f4cae4SRafal Jaworowski #define TLB_IL2D (0x80000000 >> 15) 166*17f4cae4SRafal Jaworowski #define TLB_U0 (0x80000000 >> 16) 167*17f4cae4SRafal Jaworowski #define TLB_U1 (0x80000000 >> 17) 168*17f4cae4SRafal Jaworowski #define TLB_U2 (0x80000000 >> 18) 169*17f4cae4SRafal Jaworowski #define TLB_U3 (0x80000000 >> 19) 170*17f4cae4SRafal Jaworowski #define TLB_W (0x80000000 >> 20) 171*17f4cae4SRafal Jaworowski #define TLB_I (0x80000000 >> 21) 172*17f4cae4SRafal Jaworowski #define TLB_M (0x80000000 >> 22) 173*17f4cae4SRafal Jaworowski #define TLB_G (0x80000000 >> 23) 174*17f4cae4SRafal Jaworowski #define TLB_E (0x80000000 >> 24) 175*17f4cae4SRafal Jaworowski #define TLB_UX (0x80000000 >> 26) 176*17f4cae4SRafal Jaworowski #define TLB_UW (0x80000000 >> 27) 177*17f4cae4SRafal Jaworowski #define TLB_UR (0x80000000 >> 28) 178*17f4cae4SRafal Jaworowski #define TLB_SX (0x80000000 >> 29) 179*17f4cae4SRafal Jaworowski #define TLB_SW (0x80000000 >> 30) 180*17f4cae4SRafal Jaworowski #define TLB_SR (0x80000000 >> 31) 181*17f4cae4SRafal Jaworowski #define TLB_SIZE 64 182*17f4cae4SRafal Jaworowski 183*17f4cae4SRafal Jaworowski #define TLB_SIZE_4K (0x10000000 >> 24) 184*17f4cae4SRafal Jaworowski #define TLB_SIZE_16K (0x20000000 >> 24) 185*17f4cae4SRafal Jaworowski #define TLB_SIZE_64K (0x30000000 >> 24) 186*17f4cae4SRafal Jaworowski #define TLB_SIZE_256K (0x40000000 >> 24) 187*17f4cae4SRafal Jaworowski #define TLB_SIZE_1M (0x50000000 >> 24) 188*17f4cae4SRafal Jaworowski #define TLB_SIZE_16M (0x70000000 >> 24) 189*17f4cae4SRafal Jaworowski #define TLB_SIZE_256M (0x90000000 >> 24) 190*17f4cae4SRafal Jaworowski #define TLB_SIZE_1G (0xA0000000 >> 24) 191*17f4cae4SRafal Jaworowski 192*17f4cae4SRafal Jaworowski #endif /* BOOKE_E500 */ 193*17f4cae4SRafal Jaworowski 194b2b734e7SRafal Jaworowski #define TID_KERNEL 0 /* TLB TID to use for kernel (shared) translations */ 195ffb56695SRafal Jaworowski #define TID_KRESERVED 1 /* Number of TIDs reserved for kernel */ 196b2b734e7SRafal Jaworowski #define TID_URESERVED 0 /* Number of TIDs reserved for user */ 197ffb56695SRafal Jaworowski #define TID_MIN (TID_KRESERVED + TID_URESERVED) 198ffb56695SRafal Jaworowski #define TID_MAX 255 199b2b734e7SRafal Jaworowski #define TID_NONE -1 200ffb56695SRafal Jaworowski 2011d56a280SRafal Jaworowski #define TLB_UNLOCKED 0 2021d56a280SRafal Jaworowski 203ffb56695SRafal Jaworowski #if !defined(LOCORE) 204ffb56695SRafal Jaworowski 205b2b734e7SRafal Jaworowski typedef int tlbtid_t; 206*17f4cae4SRafal Jaworowski 207ffb56695SRafal Jaworowski struct pmap; 208ffb56695SRafal Jaworowski 2091d56a280SRafal Jaworowski void tlb_lock(uint32_t *); 2101d56a280SRafal Jaworowski void tlb_unlock(uint32_t *); 2111d56a280SRafal Jaworowski 212ffb56695SRafal Jaworowski #endif /* !LOCORE */ 213ffb56695SRafal Jaworowski 214ffb56695SRafal Jaworowski #endif /* _MACHINE_TLB_H_ */ 215