1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef PERF_CACHELINE_H
3 #define PERF_CACHELINE_H
4 
5 #include <linux/compiler.h>
6 
7 int __pure cacheline_size(void);
8 
9 
10 /*
11  * Some architectures have 'Adjacent Cacheline Prefetch' feature,
12  * which performs like the cacheline size being doubled.
13  */
cl_address(u64 address,bool double_cl)14 static inline u64 cl_address(u64 address, bool double_cl)
15 {
16 	u64 size = cacheline_size();
17 
18 	if (double_cl)
19 		size *= 2;
20 
21 	/* return the cacheline of the address */
22 	return (address & ~(size - 1));
23 }
24 
cl_offset(u64 address,bool double_cl)25 static inline u64 cl_offset(u64 address, bool double_cl)
26 {
27 	u64 size = cacheline_size();
28 
29 	if (double_cl)
30 		size *= 2;
31 
32 	/* return the offset inside cacheline */
33 	return (address & (size - 1));
34 }
35 
36 #endif // PERF_CACHELINE_H
37