From ff4de9c9c16c5a3cb7f1da9776a199d90ccfdc28 Mon Sep 17 00:00:00 2001 From: ajesh Date: Fri, 26 Apr 2019 21:46:04 +0530 Subject: [PATCH] gpu: nvgpu: fix issues with ffs and __fls The LSB is position 1 for ffs and LSB is position 0 for __fls. Fix the issue with the return values of ffs and __fls to follow the mentioned bit positions. Jira NVGPU-2149 Change-Id: I4deab420c62217f8ad90683397c38530f88467d2 Signed-off-by: ajesh Reviewed-on: https://git-master.nvidia.com/r/2107276 Reviewed-by: Automatic_Commit_Validation_User GVS: Gerrit_Virtual_Submit Reviewed-by: Alex Waterman Reviewed-by: Ankur Kishore Reviewed-by: mobile promotions Tested-by: mobile promotions --- .../gpu/nvgpu/include/nvgpu/posix/bitops.h | 20 +++++++++---------- drivers/gpu/nvgpu/libnvgpu-drv.export | 4 ++-- drivers/gpu/nvgpu/os/posix/bitmap.c | 9 ++++----- 3 files changed, 15 insertions(+), 18 deletions(-) diff --git a/drivers/gpu/nvgpu/include/nvgpu/posix/bitops.h b/drivers/gpu/nvgpu/include/nvgpu/posix/bitops.h index 282b29f8b..8f47c2281 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/posix/bitops.h +++ b/drivers/gpu/nvgpu/include/nvgpu/posix/bitops.h @@ -50,18 +50,16 @@ (bit) < (size); \ (bit) = find_next_bit((addr), (size), (bit) + 1U)) -#define ffs(word) __ffs(word) +unsigned long nvgpu_posix_ffs(unsigned long word); +unsigned long nvgpu_posix_fls(unsigned long word); + +#define ffs(word) nvgpu_posix_ffs(word) +#define fls(word) nvgpu_posix_fls(word) + +#define __ffs(word) ((ffs(word)) - 1) +#define __fls(word) ((fls(word)) - 1) + #define ffz(word) __ffs(~(word)) -#define fls(word) __fls(word) - -/* - * Clashes with symbols in libc it seems. - */ -#define __ffs(word) __nvgpu_posix_ffs(word) -#define __fls(word) __nvgpu_posix_fls(word) - -unsigned long __nvgpu_posix_ffs(unsigned long word); -unsigned long __nvgpu_posix_fls(unsigned long word); unsigned long find_first_bit(const unsigned long *addr, unsigned long size); unsigned long find_next_bit(const unsigned long *addr, unsigned long size, diff --git a/drivers/gpu/nvgpu/libnvgpu-drv.export b/drivers/gpu/nvgpu/libnvgpu-drv.export index 21e75f171..4f498e5b6 100644 --- a/drivers/gpu/nvgpu/libnvgpu-drv.export +++ b/drivers/gpu/nvgpu/libnvgpu-drv.export @@ -7,10 +7,10 @@ __nvgpu_kmalloc __nvgpu_kzalloc __nvgpu_log_dbg __nvgpu_log_msg -__nvgpu_posix_ffs -__nvgpu_posix_fls __nvgpu_readl __nvgpu_set_pte +nvgpu_posix_ffs +nvgpu_posix_fls bitmap_clear bitmap_find_next_zero_area_off bitmap_set diff --git a/drivers/gpu/nvgpu/os/posix/bitmap.c b/drivers/gpu/nvgpu/os/posix/bitmap.c index 46b5b7065..b8a19ea31 100644 --- a/drivers/gpu/nvgpu/os/posix/bitmap.c +++ b/drivers/gpu/nvgpu/os/posix/bitmap.c @@ -30,13 +30,12 @@ #define BIT_MASK(nr) (1UL << ((nr) % BITS_PER_LONG)) #define BIT_WORD(nr) ((nr) / BITS_PER_LONG) -unsigned long __nvgpu_posix_ffs(unsigned long word) +unsigned long nvgpu_posix_ffs(unsigned long word) { - return ((unsigned long)__builtin_ffsl(word) - 1UL) & - (((unsigned long)sizeof(unsigned long) * 8UL) - 1UL); + return (unsigned long)__builtin_ffsl(word); } -unsigned long __nvgpu_posix_fls(unsigned long word) +unsigned long nvgpu_posix_fls(unsigned long word) { unsigned long ret; @@ -104,7 +103,7 @@ static unsigned long __find_next_bit(const unsigned long *addr, w = addr[idx] ^ invert_mask; } - return min(n, ffs(w) + idx * BITS_PER_LONG); + return min(n, __ffs(w) + idx * BITS_PER_LONG); } unsigned long find_first_bit(const unsigned long *addr, unsigned long size)