Line data Source code
1 : /*
2 : * Copyright (c) 2015 Cisco and/or its affiliates.
3 : * Licensed under the Apache License, Version 2.0 (the "License");
4 : * you may not use this file except in compliance with the License.
5 : * You may obtain a copy of the License at:
6 : *
7 : * http://www.apache.org/licenses/LICENSE-2.0
8 : *
9 : * Unless required by applicable law or agreed to in writing, software
10 : * distributed under the License is distributed on an "AS IS" BASIS,
11 : * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 : * See the License for the specific language governing permissions and
13 : * limitations under the License.
14 : */
15 : /*
16 : Copyright (c) 2005 Eliot Dresselhaus
17 :
18 : Permission is hereby granted, free of charge, to any person obtaining
19 : a copy of this software and associated documentation files (the
20 : "Software"), to deal in the Software without restriction, including
21 : without limitation the rights to use, copy, modify, merge, publish,
22 : distribute, sublicense, and/or sell copies of the Software, and to
23 : permit persons to whom the Software is furnished to do so, subject to
24 : the following conditions:
25 :
26 : The above copyright notice and this permission notice shall be
27 : included in all copies or substantial portions of the Software.
28 :
29 : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
30 : EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
31 : MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
32 : NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
33 : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
34 : OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
35 : WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
36 : */
37 :
38 : #ifndef included_clib_cache_h
39 : #define included_clib_cache_h
40 :
41 : #include <vppinfra/error_bootstrap.h>
42 :
43 : /* Default cache line size of 64 bytes. */
44 : #ifndef CLIB_LOG2_CACHE_LINE_BYTES
45 : #define CLIB_LOG2_CACHE_LINE_BYTES 6
46 : #endif
47 :
48 : /* How much data prefetch instruction prefetches */
49 : #ifndef CLIB_LOG2_CACHE_PREFETCH_BYTES
50 : #define CLIB_LOG2_CACHE_PREFETCH_BYTES CLIB_LOG2_CACHE_LINE_BYTES
51 : #endif
52 :
53 : /* Default cache line fill buffers. */
54 : #ifndef CLIB_N_PREFETCHES
55 : #define CLIB_N_PREFETCHES 16
56 : #endif
57 :
58 : #define CLIB_CACHE_LINE_BYTES (1 << CLIB_LOG2_CACHE_LINE_BYTES)
59 : #define CLIB_CACHE_PREFETCH_BYTES (1 << CLIB_LOG2_CACHE_PREFETCH_BYTES)
60 : #define CLIB_CACHE_LINE_ALIGN_MARK(mark) \
61 : u8 mark[0] __attribute__ ((aligned (CLIB_CACHE_LINE_BYTES)))
62 : #define CLIB_CACHE_LINE_ROUND(x) \
63 : ((x + CLIB_CACHE_LINE_BYTES - 1) & ~(CLIB_CACHE_LINE_BYTES - 1))
64 :
65 : /* Read/write arguments to __builtin_prefetch. */
66 : #define CLIB_PREFETCH_READ 0
67 : #define CLIB_PREFETCH_LOAD 0 /* alias for read */
68 : #define CLIB_PREFETCH_WRITE 1
69 : #define CLIB_PREFETCH_STORE 1 /* alias for write */
70 :
71 : #define _CLIB_PREFETCH(n, size, type) \
72 : if ((size) > (n) *CLIB_CACHE_PREFETCH_BYTES) \
73 : __builtin_prefetch (_addr + (n) *CLIB_CACHE_PREFETCH_BYTES, \
74 : CLIB_PREFETCH_##type, /* locality */ 3);
75 :
76 : #define CLIB_PREFETCH(addr, size, type) \
77 : do \
78 : { \
79 : void *_addr = (addr); \
80 : \
81 : ASSERT ((size) <= 4 * CLIB_CACHE_PREFETCH_BYTES); \
82 : _CLIB_PREFETCH (0, size, type); \
83 : _CLIB_PREFETCH (1, size, type); \
84 : _CLIB_PREFETCH (2, size, type); \
85 : _CLIB_PREFETCH (3, size, type); \
86 : } \
87 : while (0)
88 :
89 : #undef _
90 :
91 : static_always_inline void
92 305214051 : clib_prefetch_load (void *p)
93 : {
94 305214051 : __builtin_prefetch (p, /* rw */ 0, /* locality */ 3);
95 305214050 : }
96 :
97 : static_always_inline void
98 170475443 : clib_prefetch_store (void *p)
99 : {
100 170475443 : __builtin_prefetch (p, /* rw */ 1, /* locality */ 3);
101 170475443 : }
102 :
103 : #endif /* included_clib_cache_h */
104 :
105 :
106 : /*
107 : * fd.io coding-style-patch-verification: ON
108 : *
109 : * Local Variables:
110 : * eval: (c-set-style "gnu")
111 : * End:
112 : */
|