xref: /rockchip-linux_mpp/osal/mpp_common.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1 /* SPDX-License-Identifier: Apache-2.0 OR MIT */
2 /*
3  * Copyright (c) 2015 Rockchip Electronics Co., Ltd.
4  */
5 
6 #include "mpp_common.h"
7 
8 static const RK_U8 log2_tab[256] = {
9     0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
10     5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
11     6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
12     6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
13     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
14     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
15     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
16     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
17 };
18 
mpp_log2(RK_U32 v)19 RK_S32 mpp_log2(RK_U32 v)
20 {
21     RK_S32 n = 0;
22 
23     if (v & 0xffff0000) {
24         v >>= 16;
25         n += 16;
26     }
27     if (v & 0xff00) {
28         v >>= 8;
29         n += 8;
30     }
31     n += log2_tab[v];
32 
33     return n;
34 }
35 
mpp_log2_16bit(RK_U32 v)36 RK_S32 mpp_log2_16bit(RK_U32 v)
37 {
38     RK_S32 n = 0;
39 
40     if (v & 0xff00) {
41         v >>= 8;
42         n += 8;
43     }
44     n += log2_tab[v];
45 
46     return n;
47 }
48 
axb_div_c(RK_S32 a,RK_S32 b,RK_S32 c)49 RK_S32 axb_div_c(RK_S32 a, RK_S32 b, RK_S32 c)
50 {
51     RK_U32 left = 32;
52     RK_U32 right = 0;
53     RK_U32 shift;
54     RK_S32 sign = 1;
55     RK_S32 tmp;
56 
57     if (a == 0 || b == 0)
58         return 0;
59     else if ((a * b / b) == a && c != 0)
60         return (a * b / c);
61 
62     if (a < 0) {
63         sign = -1;
64         a = -a;
65     }
66     if (b < 0) {
67         sign *= -1;
68         b = -b;
69     }
70     if (c < 0) {
71         sign *= -1;
72         c = -c;
73     }
74 
75     if (c == 0)
76         return 0x7FFFFFFF * sign;
77 
78     if (b > a) {
79         tmp = b;
80         b = a;
81         a = tmp;
82     }
83 
84     for (--left; (((RK_U32)a << left) >> left) != (RK_U32)a; --left)
85         ;
86 
87     left--;
88 
89     while (((RK_U32)b >> right) > (RK_U32)c)
90         right++;
91 
92     if (right > left) {
93         return 0x7FFFFFFF * sign;
94     } else {
95         shift = left - right;
96         return (RK_S32)((((RK_U32)a << shift) /
97                          (RK_U32)c * (RK_U32)b) >> shift) * sign;
98     }
99 }
100 
mpp_align_16(RK_U32 val)101 RK_U32 mpp_align_16(RK_U32 val)
102 {
103     return MPP_ALIGN(val, 16);
104 }
105 
mpp_align_64(RK_U32 val)106 RK_U32 mpp_align_64(RK_U32 val)
107 {
108     return MPP_ALIGN(val, 64);
109 }
110 
mpp_align_128(RK_U32 val)111 RK_U32 mpp_align_128(RK_U32 val)
112 {
113     return MPP_ALIGN(val, 128);
114 }
115 
mpp_align_256_odd(RK_U32 val)116 RK_U32 mpp_align_256_odd(RK_U32 val)
117 {
118     return MPP_ALIGN(val, 256) | 256;
119 }
120 
mpp_align_128_odd_plus_64(RK_U32 val)121 RK_U32 mpp_align_128_odd_plus_64(RK_U32 val)
122 {
123     val = MPP_ALIGN(val, 64);
124     if (((val - 64) % 256 == 128))
125         return val;
126     else
127         return ((MPP_ALIGN(val, 128) | 128) + 64);
128 }
129