Link: https://lore.kernel.org/r/20260217200002.683975158@linuxfoundation.org Tested-by: Florian Fainelli <florian.fainelli@broadcom.com> Tested-by: Takeshi Ogasawara <takeshi.ogasawara@futuring-girl.com> Tested-by: Peter Schneider <pschneider1968@googlemail.com> Tested-by: Jon Hunter <jonathanh@nvidia.com> Tested-by: Salvatore Bonaccorso <carnil@debian.org> Tested-by: Brett A C Sheffield <bacs@librecast.net> Tested-by: Mark Brown <broonie@kernel.org> Tested-by: Luna Jernberg <droidbittin@gmail.com> Tested-by: Ronald Warsow <rwarsow@gmx.de> Tested-by: Justin M. Forbes <jforbes@fedoraproject.org> Tested-by: Ron Economos <re@w6rz.net> Tested-by: Miguel Ojeda <ojeda@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
67 lines
1.9 KiB
C
67 lines
1.9 KiB
C
/* SPDX-License-Identifier: MIT */
|
|
/* Copyright © 2025 Intel Corporation */
|
|
|
|
#ifndef __I915_PTR_UTIL_H__
|
|
#define __I915_PTR_UTIL_H__
|
|
|
|
#include <linux/types.h>
|
|
|
|
#define ptr_mask_bits(ptr, n) ({ \
|
|
unsigned long __v = (unsigned long)(ptr); \
|
|
(typeof(ptr))(__v & -BIT(n)); \
|
|
})
|
|
|
|
#define ptr_unmask_bits(ptr, n) ((unsigned long)(ptr) & (BIT(n) - 1))
|
|
|
|
#define ptr_unpack_bits(ptr, bits, n) ({ \
|
|
unsigned long __v = (unsigned long)(ptr); \
|
|
*(bits) = __v & (BIT(n) - 1); \
|
|
(typeof(ptr))(__v & -BIT(n)); \
|
|
})
|
|
|
|
#define ptr_pack_bits(ptr, bits, n) ({ \
|
|
unsigned long __bits = (bits); \
|
|
GEM_BUG_ON(__bits & -BIT(n)); \
|
|
((typeof(ptr))((unsigned long)(ptr) | __bits)); \
|
|
})
|
|
|
|
#define ptr_dec(ptr) ({ \
|
|
unsigned long __v = (unsigned long)(ptr); \
|
|
(typeof(ptr))(__v - 1); \
|
|
})
|
|
|
|
#define ptr_inc(ptr) ({ \
|
|
unsigned long __v = (unsigned long)(ptr); \
|
|
(typeof(ptr))(__v + 1); \
|
|
})
|
|
|
|
#define page_mask_bits(ptr) ptr_mask_bits(ptr, PAGE_SHIFT)
|
|
#define page_unmask_bits(ptr) ptr_unmask_bits(ptr, PAGE_SHIFT)
|
|
#define page_pack_bits(ptr, bits) ptr_pack_bits(ptr, bits, PAGE_SHIFT)
|
|
#define page_unpack_bits(ptr, bits) ptr_unpack_bits(ptr, bits, PAGE_SHIFT)
|
|
|
|
static __always_inline ptrdiff_t ptrdiff(const void *a, const void *b)
|
|
{
|
|
return a - b;
|
|
}
|
|
|
|
#define u64_to_ptr(T, x) ({ \
|
|
typecheck(u64, x); \
|
|
(T *)(uintptr_t)(x); \
|
|
})
|
|
|
|
/*
|
|
* container_of_user: Extract the superclass from a pointer to a member.
|
|
*
|
|
* Exactly like container_of() with the exception that it plays nicely
|
|
* with sparse for __user @ptr.
|
|
*/
|
|
#define container_of_user(ptr, type, member) ({ \
|
|
void __user *__mptr = (void __user *)(ptr); \
|
|
BUILD_BUG_ON_MSG(!__same_type(*(ptr), typeof_member(type, member)) && \
|
|
!__same_type(*(ptr), void), \
|
|
"pointer type mismatch in container_of()"); \
|
|
((type __user *)(__mptr - offsetof(type, member))); })
|
|
|
|
#endif /* __I915_PTR_UTIL_H__ */
|