tlb.h revision 81334
1256752Sbrooks/*- 2256752Sbrooks * Copyright (c) 2001 Jake Burkholder. 3256752Sbrooks * All rights reserved. 4256752Sbrooks * 5256752Sbrooks * Redistribution and use in source and binary forms, with or without 6256752Sbrooks * modification, are permitted provided that the following conditions 7256752Sbrooks * are met: 8256752Sbrooks * 1. Redistributions of source code must retain the above copyright 9256752Sbrooks * notice, this list of conditions and the following disclaimer. 10256752Sbrooks * 2. Redistributions in binary form must reproduce the above copyright 11256752Sbrooks * notice, this list of conditions and the following disclaimer in the 12256752Sbrooks * documentation and/or other materials provided with the distribution. 13256752Sbrooks * 14256752Sbrooks * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15256752Sbrooks * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16256752Sbrooks * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17256752Sbrooks * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18256752Sbrooks * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19256752Sbrooks * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20256752Sbrooks * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21256752Sbrooks * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22256752Sbrooks * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23256752Sbrooks * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24256752Sbrooks * SUCH DAMAGE. 25256752Sbrooks * 26256752Sbrooks * $FreeBSD: head/sys/sparc64/include/tlb.h 81334 2001-08-09 02:09:34Z obrien $ 27256752Sbrooks */ 28256752Sbrooks 29256752Sbrooks#ifndef _MACHINE_TLB_H_ 30256752Sbrooks#define _MACHINE_TLB_H_ 31256752Sbrooks 32256752Sbrooks#define TLB_SLOT_COUNT 64 33256752Sbrooks 34256752Sbrooks#define TLB_SLOT_TSB_KERNEL_MIN 60 /* XXX */ 35256752Sbrooks#define TLB_SLOT_TSB_USER_PRIMARY 61 36256752Sbrooks#define TLB_SLOT_TSB_USER_SECONDARY 62 37256752Sbrooks#define TLB_SLOT_KERNEL 63 38256752Sbrooks 39256752Sbrooks#define TLB_DAR_SLOT_SHIFT (3) 40256752Sbrooks#define TLB_DAR_SLOT(slot) ((slot) << TLB_DAR_SLOT_SHIFT) 41256752Sbrooks 42256752Sbrooks#define TLB_TAR_VA(va) ((va) & ~PAGE_MASK) 43256752Sbrooks#define TLB_TAR_CTX(ctx) ((ctx) & PAGE_MASK) 44256752Sbrooks 45256752Sbrooks#define TLB_DEMAP_ID_SHIFT (4) 46256752Sbrooks#define TLB_DEMAP_ID_PRIMARY (0) 47256752Sbrooks#define TLB_DEMAP_ID_SECONDARY (1) 48256752Sbrooks#define TLB_DEMAP_ID_NUCLEUS (2) 49256752Sbrooks 50257269Sbrooks#define TLB_DEMAP_TYPE_SHIFT (6) 51256752Sbrooks#define TLB_DEMAP_TYPE_PAGE (0) 52256752Sbrooks#define TLB_DEMAP_TYPE_CONTEXT (1) 53256752Sbrooks 54256752Sbrooks#define TLB_DEMAP_VA(va) ((va) & ~PAGE_MASK) 55256752Sbrooks#define TLB_DEMAP_ID(id) ((id) << TLB_DEMAP_ID_SHIFT) 56256752Sbrooks#define TLB_DEMAP_TYPE(type) ((type) << TLB_DEMAP_TYPE_SHIFT) 57256752Sbrooks 58256752Sbrooks#define TLB_DEMAP_PAGE (TLB_DEMAP_TYPE(TLB_DEMAP_TYPE_PAGE)) 59256752Sbrooks#define TLB_DEMAP_CONTEXT (TLB_DEMAP_TYPE(TLB_DEMAP_TYPE_CONTEXT)) 60256752Sbrooks 61256752Sbrooks#define TLB_DEMAP_PRIMARY (TLB_DEMAP_ID(TLB_DEMAP_ID_PRIMARY)) 62256752Sbrooks#define TLB_DEMAP_SECONDARY (TLB_DEMAP_ID(TLB_DEMAP_ID_SECONDARY)) 63256752Sbrooks#define TLB_DEMAP_NUCLEUS (TLB_DEMAP_ID(TLB_DEMAP_ID_NUCLEUS)) 64256752Sbrooks 65256752Sbrooks#define TLB_CTX_KERNEL (0) 66256752Sbrooks 67256752Sbrooks#define TLB_DTLB (1 << 0) 68256752Sbrooks#define TLB_ITLB (1 << 1) 69256752Sbrooks 70256752Sbrooks#define MMU_SFSR_ASI_SHIFT (16) 71256752Sbrooks#define MMU_SFSR_FT_SHIFT (7) 72256752Sbrooks#define MMU_SFSR_E_SHIFT (6) 73256752Sbrooks#define MMU_SFSR_CT_SHIFT (4) 74256752Sbrooks#define MMU_SFSR_PR_SHIFT (3) 75256752Sbrooks#define MMU_SFSR_W_SHIFT (2) 76256752Sbrooks#define MMU_SFSR_OW_SHIFT (1) 77256752Sbrooks#define MMU_SFSR_FV_SHIFT (0) 78256752Sbrooks 79256752Sbrooks#define MMU_SFSR_ASI_SIZE (8) 80256752Sbrooks#define MMU_SFSR_FT_SIZE (6) 81256752Sbrooks#define MMU_SFSR_CT_SIZE (2) 82256752Sbrooks 83256752Sbrooks#define MMU_SFSR_W (1L << MMU_SFSR_W_SHIFT) 84256752Sbrooks 85256752Sbrooksstatic __inline void 86256752Sbrookstlb_dtlb_page_demap(u_int ctx, vm_offset_t va) 87256752Sbrooks{ 88256752Sbrooks if (ctx == TLB_CTX_KERNEL) { 89256752Sbrooks stxa(TLB_DEMAP_VA(va) | TLB_DEMAP_NUCLEUS | TLB_DEMAP_PAGE, 90256752Sbrooks ASI_DMMU_DEMAP, 0); 91256752Sbrooks membar(Sync); 92256752Sbrooks } else 93256752Sbrooks TODO; 94256752Sbrooks} 95256752Sbrooks 96256752Sbrooksstatic __inline void 97256752Sbrookstlb_dtlb_store(vm_offset_t va, struct tte tte) 98256752Sbrooks{ 99256752Sbrooks stxa(AA_DMMU_TAR, ASI_DMMU, 100256752Sbrooks TLB_TAR_VA(va) | TLB_TAR_CTX(tte_get_ctx(tte))); 101256752Sbrooks stxa(0, ASI_DTLB_DATA_IN_REG, tte.tte_data); 102256752Sbrooks membar(Sync); 103256752Sbrooks} 104256752Sbrooks 105256752Sbrooksstatic __inline void 106256752Sbrookstlb_dtlb_store_slot(vm_offset_t va, struct tte tte, int slot) 107256752Sbrooks{ 108256752Sbrooks stxa(AA_DMMU_TAR, ASI_DMMU, TLB_TAR_VA(va) | TLB_TAR_CTX(0)); 109256752Sbrooks stxa(TLB_DAR_SLOT(slot), ASI_DTLB_DATA_ACCESS_REG, tte.tte_data); 110256752Sbrooks membar(Sync); 111256752Sbrooks} 112256752Sbrooks 113256752Sbrooksstatic __inline void 114256752Sbrookstlb_itlb_page_demap(u_int ctx, vm_offset_t va) 115256752Sbrooks{ 116256752Sbrooks if (ctx == TLB_CTX_KERNEL) { 117256752Sbrooks stxa(TLB_DEMAP_VA(va) | TLB_DEMAP_NUCLEUS | TLB_DEMAP_PAGE, 118256752Sbrooks ASI_IMMU_DEMAP, 0); 119256752Sbrooks flush(KERNBASE); 120256752Sbrooks } else 121256752Sbrooks TODO; 122256752Sbrooks} 123256752Sbrooks 124256752Sbrooksstatic __inline void 125256752Sbrookstlb_itlb_store(vm_offset_t va, struct tte tte) 126256752Sbrooks{ 127256752Sbrooks TODO; 128256752Sbrooks} 129256752Sbrooks 130256752Sbrooksstatic __inline void 131256752Sbrookstlb_itlb_store_slot(vm_offset_t va, struct tte tte, int slot) 132256752Sbrooks{ 133257336Snwhitehorn stxa(AA_IMMU_TAR, ASI_IMMU, TLB_TAR_VA(va) | TLB_TAR_CTX(0)); 134256752Sbrooks stxa(TLB_DAR_SLOT(slot), ASI_ITLB_DATA_ACCESS_REG, tte.tte_data); 135256752Sbrooks flush(va); 136256752Sbrooks} 137256752Sbrooks 138256752Sbrooksstatic __inline void 139256752Sbrookstlb_page_demap(u_int tlb, u_int ctx, vm_offset_t va) 140256752Sbrooks{ 141256752Sbrooks if (tlb & TLB_DTLB) 142256752Sbrooks tlb_dtlb_page_demap(ctx, va); 143256752Sbrooks if (tlb & TLB_ITLB) 144256752Sbrooks tlb_itlb_page_demap(ctx, va); 145256752Sbrooks} 146256752Sbrooks 147256752Sbrooksstatic __inline void 148256752Sbrookstlb_store(u_int tlb, vm_offset_t va, struct tte tte) 149256752Sbrooks{ 150256752Sbrooks if (tlb & TLB_DTLB) 151256752Sbrooks tlb_dtlb_store(va, tte); 152256752Sbrooks if (tlb & TLB_ITLB) 153256752Sbrooks tlb_itlb_store(va, tte); 154256752Sbrooks} 155256752Sbrooks 156256752Sbrooksstatic __inline void 157256752Sbrookstlb_store_slot(u_int tlb, vm_offset_t va, struct tte tte, int slot) 158256752Sbrooks{ 159256752Sbrooks if (tlb & TLB_DTLB) 160256752Sbrooks tlb_dtlb_store_slot(va, tte, slot); 161256752Sbrooks if (tlb & TLB_ITLB) 162256752Sbrooks tlb_itlb_store_slot(va, tte, slot); 163256752Sbrooks} 164256752Sbrooks 165256752Sbrooks#endif /* !_MACHINE_TLB_H_ */ 166256752Sbrooks