diff --git a/drivers/gpu/nvgpu/include/nvgpu/posix/utils.h b/drivers/gpu/nvgpu/include/nvgpu/posix/utils.h index f2db92d6d..faf077f05 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/posix/utils.h +++ b/drivers/gpu/nvgpu/include/nvgpu/posix/utils.h @@ -183,10 +183,12 @@ static inline u32 be32_to_cpu(u32 x) static inline unsigned int nvgpu_posix_hweight8(uint8_t x) { unsigned int ret; - uint8_t result = x - ((x >> 1) & 0x55U); + uint8_t result = ((U8(x) >> U8(1)) & U8(0x55)); - result = (result & 0x33U) + ((result >> 2) & 0x33U); - result = (result + (result >> 4)) & 0x0FU; + result = nvgpu_safe_sub_u8(x, result); + + result = (result & U8(0x33)) + ((result >> U8(2)) & U8(0x33)); + result = (result + (result >> U8(4))) & U8(0x0f); ret = (unsigned int)result; return ret; diff --git a/drivers/gpu/nvgpu/include/nvgpu/safe_ops.h b/drivers/gpu/nvgpu/include/nvgpu/safe_ops.h index 03370552b..ee27613c5 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/safe_ops.h +++ b/drivers/gpu/nvgpu/include/nvgpu/safe_ops.h @@ -64,6 +64,15 @@ static inline s64 nvgpu_safe_add_s64(s64 sl_a, s64 sl_b) } } +static inline u8 nvgpu_safe_sub_u8(u8 uc_a, u8 uc_b) +{ + if (uc_a < uc_b) { + BUG(); + } else { + return uc_a - uc_b; + } +} + static inline u32 nvgpu_safe_sub_u32(u32 ui_a, u32 ui_b) { if (ui_a < ui_b) {