1ffb56695SRafal Jaworowski /*- 2*51369649SPedro F. Giffuni * SPDX-License-Identifier: BSD-3-Clause 3*51369649SPedro F. Giffuni * 417f4cae4SRafal Jaworowski * Copyright (C) 2006-2012 Semihalf. 5ffb56695SRafal Jaworowski * All rights reserved. 6ffb56695SRafal Jaworowski * 7ffb56695SRafal Jaworowski * Redistribution and use in source and binary forms, with or without 8ffb56695SRafal Jaworowski * modification, are permitted provided that the following conditions 9ffb56695SRafal Jaworowski * are met: 10ffb56695SRafal Jaworowski * 1. Redistributions of source code must retain the above copyright 11ffb56695SRafal Jaworowski * notice, this list of conditions and the following disclaimer. 12ffb56695SRafal Jaworowski * 2. Redistributions in binary form must reproduce the above copyright 13ffb56695SRafal Jaworowski * notice, this list of conditions and the following disclaimer in the 14ffb56695SRafal Jaworowski * documentation and/or other materials provided with the distribution. 15ffb56695SRafal Jaworowski * 3. The name of the author may not be used to endorse or promote products 16ffb56695SRafal Jaworowski * derived from this software without specific prior written permission. 17ffb56695SRafal Jaworowski * 18ffb56695SRafal Jaworowski * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 19ffb56695SRafal Jaworowski * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 20ffb56695SRafal Jaworowski * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN 21ffb56695SRafal Jaworowski * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22ffb56695SRafal Jaworowski * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 23ffb56695SRafal Jaworowski * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 24ffb56695SRafal Jaworowski * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 25ffb56695SRafal Jaworowski * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 26ffb56695SRafal Jaworowski * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 27ffb56695SRafal Jaworowski * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 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 68e683c328SJustin Hibbits #ifdef __powerpc64__ 69e683c328SJustin Hibbits #define MAS2_EPN_MASK 0xFFFFFFFFFFFFF000UL 70e683c328SJustin Hibbits #else 71b2b734e7SRafal Jaworowski #define MAS2_EPN_MASK 0xFFFFF000 72e683c328SJustin 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; 144e683c328SJustin Hibbits #ifdef __powerpc64__ 145e683c328SJustin Hibbits uint64_t mas2; 146e683c328SJustin Hibbits #else 14717f4cae4SRafal Jaworowski uint32_t mas2; 148e683c328SJustin Hibbits #endif 14917f4cae4SRafal Jaworowski uint32_t mas3; 15092f6e934SJustin Hibbits uint32_t mas7; 15117f4cae4SRafal Jaworowski } tlb_entry_t; 15217f4cae4SRafal Jaworowski 15317f4cae4SRafal Jaworowski void tlb1_inval_entry(unsigned int); 15433724f17SNathan Whitehorn void tlb1_init(void); 15517f4cae4SRafal Jaworowski #endif /* !LOCORE */ 15617f4cae4SRafal Jaworowski 15717f4cae4SRafal Jaworowski #endif /* BOOKE_E500 */ 15817f4cae4SRafal Jaworowski 159b2b734e7SRafal Jaworowski #define TID_KERNEL 0 /* TLB TID to use for kernel (shared) translations */ 160ffb56695SRafal Jaworowski #define TID_KRESERVED 1 /* Number of TIDs reserved for kernel */ 161b2b734e7SRafal Jaworowski #define TID_URESERVED 0 /* Number of TIDs reserved for user */ 162ffb56695SRafal Jaworowski #define TID_MIN (TID_KRESERVED + TID_URESERVED) 163ffb56695SRafal Jaworowski #define TID_MAX 255 164b2b734e7SRafal Jaworowski #define TID_NONE -1 165ffb56695SRafal Jaworowski 1661d56a280SRafal Jaworowski #define TLB_UNLOCKED 0 1671d56a280SRafal Jaworowski 168ffb56695SRafal Jaworowski #if !defined(LOCORE) 169ffb56695SRafal Jaworowski 170b2b734e7SRafal Jaworowski typedef int tlbtid_t; 17117f4cae4SRafal Jaworowski 172ffb56695SRafal Jaworowski struct pmap; 173ffb56695SRafal Jaworowski 174e683c328SJustin Hibbits void tlb_lock(uintptr_t *); 175e683c328SJustin Hibbits void tlb_unlock(uintptr_t *); 176f60708c9SJustin Hibbits void tlb1_ap_prep(void); 1770aeed3e9SJustin Hibbits int tlb1_set_entry(vm_offset_t, vm_paddr_t, vm_size_t, uint32_t); 1781d56a280SRafal Jaworowski 179ffb56695SRafal Jaworowski #endif /* !LOCORE */ 180ffb56695SRafal Jaworowski 181ffb56695SRafal Jaworowski #endif /* _MACHINE_TLB_H_ */ 182