14a7c1baca14ebd7bbc05f7d6dec68908e02da1f
[dpdk.git] / lib / librte_eal / common / include / rte_cycles.h
1 /*-
2  *   BSD LICENSE
3  * 
4  *   Copyright(c) 2010-2013 Intel Corporation. All rights reserved.
5  *   All rights reserved.
6  * 
7  *   Redistribution and use in source and binary forms, with or without 
8  *   modification, are permitted provided that the following conditions 
9  *   are met:
10  * 
11  *     * Redistributions of source code must retain the above copyright 
12  *       notice, this list of conditions and the following disclaimer.
13  *     * Redistributions in binary form must reproduce the above copyright 
14  *       notice, this list of conditions and the following disclaimer in 
15  *       the documentation and/or other materials provided with the 
16  *       distribution.
17  *     * Neither the name of Intel Corporation nor the names of its 
18  *       contributors may be used to endorse or promote products derived 
19  *       from this software without specific prior written permission.
20  * 
21  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
22  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
23  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 
24  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
25  *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
26  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
27  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
28  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 
29  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
30  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
31  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  * 
33  */
34 /*   BSD LICENSE
35  *
36  *   Copyright(c) 2013 6WIND.
37  *
38  *   Redistribution and use in source and binary forms, with or without
39  *   modification, are permitted provided that the following conditions
40  *   are met:
41  *
42  *     * Redistributions of source code must retain the above copyright
43  *       notice, this list of conditions and the following disclaimer.
44  *     * Redistributions in binary form must reproduce the above copyright
45  *       notice, this list of conditions and the following disclaimer in
46  *       the documentation and/or other materials provided with the
47  *       distribution.
48  *     * Neither the name of 6WIND S.A. nor the names of its
49  *       contributors may be used to endorse or promote products derived
50  *       from this software without specific prior written permission.
51  *
52  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
53  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
54  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
55  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
56  *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
57  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
58  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
59  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
60  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
61  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
62  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
63  */
64
65 #ifndef _RTE_CYCLES_H_
66 #define _RTE_CYCLES_H_
67
68 /**
69  * @file
70  *
71  * Simple Time Reference Functions (Cycles and HPET).
72  */
73
74 #ifdef __cplusplus
75 extern "C" {
76 #endif
77
78 #include <stdint.h>
79
80 #ifdef RTE_LIBRTE_EAL_VMWARE_TSC_MAP_SUPPORT
81 /** Global switch to use VMWARE mapping of TSC instead of RDTSC */
82 extern int rte_cycles_vmware_tsc_map;
83 #include <rte_branch_prediction.h>
84 #endif
85
86
87 /**
88  * Read the TSC register.
89  *
90  * @return
91  *   The TSC for this lcore.
92  */
93 static inline uint64_t
94 rte_rdtsc(void)
95 {
96         union {
97                 uint64_t tsc_64;
98                 struct {
99                         uint32_t lo_32;
100                         uint32_t hi_32;
101                 };
102         } tsc;
103
104 #ifdef RTE_LIBRTE_EAL_VMWARE_TSC_MAP_SUPPORT
105         if (unlikely(rte_cycles_vmware_tsc_map)) {
106                 /* ecx = 0x10000 corresponds to the physical TSC for VMware */
107                 asm volatile("rdpmc" :
108                              "=a" (tsc.lo_32),
109                              "=d" (tsc.hi_32) :
110                              "c"(0x10000));
111                 return tsc.tsc_64;
112         }
113 #endif
114
115         asm volatile("rdtsc" :
116                      "=a" (tsc.lo_32),
117                      "=d" (tsc.hi_32));
118         return tsc.tsc_64;
119 }
120
121 /**
122  * Return the number of HPET cycles since boot
123  *
124  * This counter is global for all execution units. The number of
125  * cycles in one second can be retrived using rte_get_hpet_hz().
126  *
127  * @return
128  *   the number of cycles
129  */
130 uint64_t
131 rte_get_hpet_cycles(void);
132
133 /**
134  * Get the number of cycles in one second.
135  *
136  * @return
137  *   The number of cycles in one second.
138  */
139 uint64_t
140 rte_get_hpet_hz(void);
141
142 /**
143  * Wait at least us microseconds.
144  *
145  * @param us
146  *   The number of microseconds to wait.
147  */
148 void
149 rte_delay_us(unsigned us);
150
151 /**
152  * Wait at least ms milliseconds.
153  *
154  * @param ms
155  *   The number of milliseconds to wait.
156  */
157 static inline void
158 rte_delay_ms(unsigned ms)
159 {
160         rte_delay_us(ms * 1000);
161 }
162
163 #ifdef __cplusplus
164 }
165 #endif
166
167 #endif /* _RTE_CYCLES_H_ */