|  | /* SPDX-License-Identifier: GPL-2.0 */ | 
|  | #ifndef PERF_CACHELINE_H | 
|  | #define PERF_CACHELINE_H | 
|  |  | 
|  | #include <linux/compiler.h> | 
|  |  | 
|  | int __pure cacheline_size(void); | 
|  |  | 
|  |  | 
|  | /* | 
|  | * Some architectures have 'Adjacent Cacheline Prefetch' feature, | 
|  | * which performs like the cacheline size being doubled. | 
|  | */ | 
|  | static inline u64 cl_address(u64 address, bool double_cl) | 
|  | { | 
|  | u64 size = cacheline_size(); | 
|  |  | 
|  | if (double_cl) | 
|  | size *= 2; | 
|  |  | 
|  | /* return the cacheline of the address */ | 
|  | return (address & ~(size - 1)); | 
|  | } | 
|  |  | 
|  | static inline u64 cl_offset(u64 address, bool double_cl) | 
|  | { | 
|  | u64 size = cacheline_size(); | 
|  |  | 
|  | if (double_cl) | 
|  | size *= 2; | 
|  |  | 
|  | /* return the offset inside cacheline */ | 
|  | return (address & (size - 1)); | 
|  | } | 
|  |  | 
|  | #endif // PERF_CACHELINE_H |