diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2441-amdgpu-dc-allow-inlining-constant-int-to-fixed-a-lot.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2441-amdgpu-dc-allow-inlining-constant-int-to-fixed-a-lot.patch | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2441-amdgpu-dc-allow-inlining-constant-int-to-fixed-a-lot.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2441-amdgpu-dc-allow-inlining-constant-int-to-fixed-a-lot.patch new file mode 100644 index 00000000..0bcd7c53 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2441-amdgpu-dc-allow-inlining-constant-int-to-fixed-a-lot.patch @@ -0,0 +1,171 @@ +From b25c18031e94f7026df81ab744068b270593fd28 Mon Sep 17 00:00:00 2001 +From: Dave Airlie <airlied@redhat.com> +Date: Fri, 29 Sep 2017 17:13:25 +1000 +Subject: [PATCH 2441/4131] amdgpu/dc: allow inlining constant int to fixed a + lot better. + +This uses two things that might be Linux specific, +__builtin_constant_p (might be gcc) +and +BUILD_BUG_ON. (maybe other dm's can have something similiar). + +This saves 4k in the bw calcs code. + +Signed-off-by: Dave Airlie <airlied@redhat.com> +Reviewed-by: Harry Wentland <harry.wentland@amd.com> +--- + drivers/gpu/drm/amd/display/dc/calcs/bw_fixed.c | 37 ++++++++----------------- + drivers/gpu/drm/amd/display/dc/inc/bw_fixed.h | 26 +++++++++++++++-- + 2 files changed, 35 insertions(+), 28 deletions(-) + +diff --git a/drivers/gpu/drm/amd/display/dc/calcs/bw_fixed.c b/drivers/gpu/drm/amd/display/dc/calcs/bw_fixed.c +index 0de6fa1..6ca288f 100644 +--- a/drivers/gpu/drm/amd/display/dc/calcs/bw_fixed.c ++++ b/drivers/gpu/drm/amd/display/dc/calcs/bw_fixed.c +@@ -25,13 +25,6 @@ + #include "dm_services.h" + #include "bw_fixed.h" + +-#define BITS_PER_FRACTIONAL_PART 24 +- +-#define MIN_I32 \ +- (int64_t)(-(1LL << (63 - BITS_PER_FRACTIONAL_PART))) +- +-#define MAX_I32 \ +- (int64_t)((1ULL << (63 - BITS_PER_FRACTIONAL_PART)) - 1) + + #define MIN_I64 \ + (int64_t)(-(1LL << 63)) +@@ -40,10 +33,7 @@ + (int64_t)((1ULL << 63) - 1) + + #define FRACTIONAL_PART_MASK \ +- ((1ULL << BITS_PER_FRACTIONAL_PART) - 1) +- +-#define GET_INTEGER_PART(x) \ +- ((x) >> BITS_PER_FRACTIONAL_PART) ++ ((1ULL << BW_FIXED_BITS_PER_FRACTIONAL_PART) - 1) + + #define GET_FRACTIONAL_PART(x) \ + (FRACTIONAL_PART_MASK & (x)) +@@ -56,19 +46,14 @@ static uint64_t abs_i64(int64_t arg) + return (uint64_t)(-arg); + } + +-struct bw_fixed bw_int_to_fixed(int64_t value) ++struct bw_fixed bw_int_to_fixed_nonconst(int64_t value) + { + struct bw_fixed res; +- ASSERT(value < MAX_I32 && value > MIN_I32); +- res.value = value << BITS_PER_FRACTIONAL_PART; ++ ASSERT(value < BW_FIXED_MAX_I32 && value > BW_FIXED_MIN_I32); ++ res.value = value << BW_FIXED_BITS_PER_FRACTIONAL_PART; + return res; + } + +-int32_t bw_fixed_to_int(struct bw_fixed value) +-{ +- return GET_INTEGER_PART(value.value); +-} +- + struct bw_fixed bw_frc_to_fixed(int64_t numerator, int64_t denominator) + { + struct bw_fixed res; +@@ -87,11 +72,11 @@ struct bw_fixed bw_frc_to_fixed(int64_t numerator, int64_t denominator) + arg2_value = abs_i64(denominator); + res_value = div64_u64_rem(arg1_value, arg2_value, &remainder); + +- ASSERT(res_value <= MAX_I32); ++ ASSERT(res_value <= BW_FIXED_MAX_I32); + + /* determine fractional part */ + { +- uint32_t i = BITS_PER_FRACTIONAL_PART; ++ uint32_t i = BW_FIXED_BITS_PER_FRACTIONAL_PART; + + do + { +@@ -164,8 +149,8 @@ struct bw_fixed bw_mul(const struct bw_fixed arg1, const struct bw_fixed arg2) + uint64_t arg1_value = abs_i64(arg1.value); + uint64_t arg2_value = abs_i64(arg2.value); + +- uint64_t arg1_int = GET_INTEGER_PART(arg1_value); +- uint64_t arg2_int = GET_INTEGER_PART(arg2_value); ++ uint64_t arg1_int = BW_FIXED_GET_INTEGER_PART(arg1_value); ++ uint64_t arg2_int = BW_FIXED_GET_INTEGER_PART(arg2_value); + + uint64_t arg1_fra = GET_FRACTIONAL_PART(arg1_value); + uint64_t arg2_fra = GET_FRACTIONAL_PART(arg2_value); +@@ -174,9 +159,9 @@ struct bw_fixed bw_mul(const struct bw_fixed arg1, const struct bw_fixed arg2) + + res.value = arg1_int * arg2_int; + +- ASSERT(res.value <= MAX_I32); ++ ASSERT(res.value <= BW_FIXED_MAX_I32); + +- res.value <<= BITS_PER_FRACTIONAL_PART; ++ res.value <<= BW_FIXED_BITS_PER_FRACTIONAL_PART; + + tmp = arg1_int * arg2_fra; + +@@ -192,7 +177,7 @@ struct bw_fixed bw_mul(const struct bw_fixed arg1, const struct bw_fixed arg2) + + tmp = arg1_fra * arg2_fra; + +- tmp = (tmp >> BITS_PER_FRACTIONAL_PART) + ++ tmp = (tmp >> BW_FIXED_BITS_PER_FRACTIONAL_PART) + + (tmp >= (uint64_t)(bw_frc_to_fixed(1, 2).value)); + + ASSERT(tmp <= (uint64_t)(MAX_I64 - res.value)); +diff --git a/drivers/gpu/drm/amd/display/dc/inc/bw_fixed.h b/drivers/gpu/drm/amd/display/dc/inc/bw_fixed.h +index 4477e62..39ee8eba3 100644 +--- a/drivers/gpu/drm/amd/display/dc/inc/bw_fixed.h ++++ b/drivers/gpu/drm/amd/display/dc/inc/bw_fixed.h +@@ -26,10 +26,19 @@ + #ifndef BW_FIXED_H_ + #define BW_FIXED_H_ + ++#define BW_FIXED_BITS_PER_FRACTIONAL_PART 24 ++ ++#define BW_FIXED_GET_INTEGER_PART(x) ((x) >> BW_FIXED_BITS_PER_FRACTIONAL_PART) + struct bw_fixed { + int64_t value; + }; + ++#define BW_FIXED_MIN_I32 \ ++ (int64_t)(-(1LL << (63 - BW_FIXED_BITS_PER_FRACTIONAL_PART))) ++ ++#define BW_FIXED_MAX_I32 \ ++ (int64_t)((1ULL << (63 - BW_FIXED_BITS_PER_FRACTIONAL_PART)) - 1) ++ + static inline struct bw_fixed bw_min2(const struct bw_fixed arg1, + const struct bw_fixed arg2) + { +@@ -56,9 +65,22 @@ static inline struct bw_fixed bw_max3(struct bw_fixed v1, + return bw_max2(bw_max2(v1, v2), v3); + } + +-struct bw_fixed bw_int_to_fixed(int64_t value); ++struct bw_fixed bw_int_to_fixed_nonconst(int64_t value); ++static inline struct bw_fixed bw_int_to_fixed(int64_t value) ++{ ++ if (__builtin_constant_p(value)) { ++ struct bw_fixed res; ++ BUILD_BUG_ON(value > BW_FIXED_MAX_I32 || value < BW_FIXED_MIN_I32); ++ res.value = value << BW_FIXED_BITS_PER_FRACTIONAL_PART; ++ return res; ++ } else ++ return bw_int_to_fixed_nonconst(value); ++} + +-int32_t bw_fixed_to_int(struct bw_fixed value); ++static inline int32_t bw_fixed_to_int(struct bw_fixed value) ++{ ++ return BW_FIXED_GET_INTEGER_PART(value.value); ++} + + struct bw_fixed bw_frc_to_fixed(int64_t num, int64_t denum); + +-- +2.7.4 + |