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