1215976Sjmallett/***********************license start*************** 2232812Sjmallett * Copyright (c) 2003-2010 Cavium Inc. (support@cavium.com). All rights 3215976Sjmallett * reserved. 4215976Sjmallett * 5215976Sjmallett * 6215976Sjmallett * Redistribution and use in source and binary forms, with or without 7215976Sjmallett * modification, are permitted provided that the following conditions are 8215976Sjmallett * met: 9215976Sjmallett * 10215976Sjmallett * * Redistributions of source code must retain the above copyright 11215976Sjmallett * notice, this list of conditions and the following disclaimer. 12215976Sjmallett * 13215976Sjmallett * * Redistributions in binary form must reproduce the above 14215976Sjmallett * copyright notice, this list of conditions and the following 15215976Sjmallett * disclaimer in the documentation and/or other materials provided 16215976Sjmallett * with the distribution. 17215976Sjmallett 18232812Sjmallett * * Neither the name of Cavium Inc. nor the names of 19215976Sjmallett * its contributors may be used to endorse or promote products 20215976Sjmallett * derived from this software without specific prior written 21215976Sjmallett * permission. 22215976Sjmallett 23215976Sjmallett * This Software, including technical data, may be subject to U.S. export control 24215976Sjmallett * laws, including the U.S. Export Administration Act and its associated 25215976Sjmallett * regulations, and may be subject to export or import regulations in other 26215976Sjmallett * countries. 27215976Sjmallett 28215976Sjmallett * TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" 29232812Sjmallett * AND WITH ALL FAULTS AND CAVIUM INC. MAKES NO PROMISES, REPRESENTATIONS OR 30215976Sjmallett * WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH RESPECT TO 31215976Sjmallett * THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY REPRESENTATION OR 32215976Sjmallett * DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT DEFECTS, AND CAVIUM 33215976Sjmallett * SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES OF TITLE, 34215976Sjmallett * MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR PURPOSE, LACK OF 35215976Sjmallett * VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION OR 36215976Sjmallett * CORRESPONDENCE TO DESCRIPTION. THE ENTIRE RISK ARISING OUT OF USE OR 37215976Sjmallett * PERFORMANCE OF THE SOFTWARE LIES WITH YOU. 38215976Sjmallett ***********************license end**************************************/ 39215976Sjmallett 40215976Sjmallett 41215976Sjmallett#ifndef __CVMX_TLB_H__ 42215976Sjmallett#define __CVMX_TLB_H__ 43215976Sjmallett 44215976Sjmallett/** 45215976Sjmallett * @file 46215976Sjmallett * 47215976Sjmallett * cvmx-tlb provides access functions for setting up TLB entries for simple 48215976Sjmallett * executive applications. 49215976Sjmallett * 50215976Sjmallett * <hr>$Revision: 41586 $<hr> 51215976Sjmallett */ 52215976Sjmallett 53215976Sjmallett#ifdef __cplusplus 54215976Sjmallettextern "C" { 55215976Sjmallett#endif 56215976Sjmallett 57215976Sjmallett/** 58215976Sjmallett * Find a free entry that can be used for share memory mapping. 59215976Sjmallett * 60215976Sjmallett * @return -1: no free entry found 61215976Sjmallett * @return : a free entry 62215976Sjmallett */ 63215976Sjmallettint cvmx_tlb_allocate_runtime_entry(void); 64215976Sjmallett 65215976Sjmallett/** 66215976Sjmallett * Invalidate the TLB entry. Remove previous mapping if one was set up 67215976Sjmallett * @param tlbi 68215976Sjmallett */ 69215976Sjmallettvoid cvmx_tlb_free_runtime_entry(uint32_t tlbi); 70215976Sjmallett 71215976Sjmallett/** 72215976Sjmallett * Debug routine to show all shared memory mapping 73215976Sjmallett */ 74215976Sjmallettvoid cvmx_tlb_dump_shared_mapping(void); 75215976Sjmallett 76215976Sjmallett/** 77215976Sjmallett * Program a single TLB entry to enable the provided vaddr to paddr mapping. 78215976Sjmallett * 79215976Sjmallett * @param index Index of the TLB entry 80215976Sjmallett * @param vaddr The virtual address for this mapping 81215976Sjmallett * @param paddr The physical address for this mapping 82215976Sjmallett * @param size Size of the mapping 83215976Sjmallett * @param tlb_flags Entry mapping flags 84215976Sjmallett */ 85215976Sjmallettvoid cvmx_tlb_write_entry(int index, uint64_t vaddr, uint64_t paddr, 86215976Sjmallett uint64_t size, uint64_t tlb_flags); 87215976Sjmallett 88215976Sjmallett 89215976Sjmallett/** 90215976Sjmallett * Program a single TLB entry to enable the provided vaddr to paddr mapping. 91215976Sjmallett * This version adds a wired entry that should not be changed at run time 92215976Sjmallett * 93215976Sjmallett * @param index Index of the TLB entry 94215976Sjmallett * @param vaddr The virtual address for this mapping 95215976Sjmallett * @param paddr The physical address for this mapping 96215976Sjmallett * @param size Size of the mapping 97215976Sjmallett * @param tlb_flags Entry mapping flags 98215976Sjmallett * @return -1: TLB out of entries 99215976Sjmallett * 0: fixed entry added 100215976Sjmallett * 101215976Sjmallett */ 102215976Sjmallettint cvmx_tlb_add_fixed_entry(uint64_t vaddr, uint64_t paddr, 103215976Sjmallett uint64_t size, uint64_t tlb_flags); 104215976Sjmallett 105215976Sjmallett/** 106215976Sjmallett * Program a single TLB entry to enable the provided vaddr to paddr mapping. 107215976Sjmallett * This version writes a runtime entry. It will check the index to make sure 108215976Sjmallett * not to overwrite any fixed entries. 109215976Sjmallett * 110215976Sjmallett * @param index Index of the TLB entry 111215976Sjmallett * @param vaddr The virtual address for this mapping 112215976Sjmallett * @param paddr The physical address for this mapping 113215976Sjmallett * @param size Size of the mapping 114215976Sjmallett * @param tlb_flags Entry mapping flags 115215976Sjmallett */ 116215976Sjmallettvoid cvmx_tlb_write_runtime_entry(int index, uint64_t vaddr, uint64_t paddr, 117215976Sjmallett uint64_t size, uint64_t tlb_flags); 118215976Sjmallett 119215976Sjmallett 120215976Sjmallett/** 121215976Sjmallett * Find the TLB index of a given virtual address 122215976Sjmallett * 123215976Sjmallett * @param vaddr The virtual address to look up 124215976Sjmallett * @return -1 not TLB mapped 125215976Sjmallett * >=0 TLB TLB index 126215976Sjmallett */ 127215976Sjmallettint cvmx_tlb_lookup(uint64_t vaddr); 128215976Sjmallett 129215976Sjmallett/** 130215976Sjmallett * Debug routine to show all TLB entries of this core 131215976Sjmallett * 132215976Sjmallett */ 133215976Sjmallettvoid cvmx_tlb_dump_all(void); 134215976Sjmallett 135215976Sjmallett/* 136215976Sjmallett * @INTERNAL 137215976Sjmallett * return the next power of two value for the given input <v> 138215976Sjmallett * 139215976Sjmallett * @param v input value 140215976Sjmallett * @return next power of two value for v 141215976Sjmallett */ 142215976Sjmallettstatic inline uint64_t __upper_power_of_two(uint64_t v) 143215976Sjmallett{ 144215976Sjmallett v--; 145215976Sjmallett v |= v >> 1; 146215976Sjmallett v |= v >> 2; 147215976Sjmallett v |= v >> 4; 148215976Sjmallett v |= v >> 8; 149215976Sjmallett v |= v >> 16; 150215976Sjmallett v |= v >> 32; 151215976Sjmallett v++; 152215976Sjmallett return v; 153215976Sjmallett} 154215976Sjmallett 155215976Sjmallett/** 156215976Sjmallett * @INTERNAL 157215976Sjmallett * Check if the given value 'v' is power of two. 158215976Sjmallett * 159215976Sjmallett * @param v input value 160215976Sjmallett * @return 1 yes 161215976Sjmallett * 0 no 162215976Sjmallett */ 163215976Sjmallettstatic inline int __is_power_of_two(uint64_t v) 164215976Sjmallett{ 165215976Sjmallett int num_of_1s = 0; 166215976Sjmallett 167215976Sjmallett CVMX_DPOP(num_of_1s, v); 168215976Sjmallett return (num_of_1s == 1 ); 169215976Sjmallett} 170215976Sjmallett 171215976Sjmallett#ifdef __cplusplus 172215976Sjmallett} 173215976Sjmallett#endif 174215976Sjmallett 175215976Sjmallett#endif 176