Eric Biederman | 8ca8d76 | 2003-04-22 19:02:15 +0000 | [diff] [blame] | 1 | #include <console/console.h> |
Myles Watson | 5817078 | 2009-10-28 16:13:28 +0000 | [diff] [blame] | 2 | #include <lib.h> |
3 | |||||
Yinghai Lu | 13f1c2a | 2005-07-08 02:49:49 +0000 | [diff] [blame] | 4 | /* Assume 8 bits per byte */ |
5 | #define CHAR_BIT 8 | ||||
6 | |||||
Eric Biederman | 8ca8d76 | 2003-04-22 19:02:15 +0000 | [diff] [blame] | 7 | unsigned long log2(unsigned long x) |
8 | { | ||||
Edward O'Callaghan | 8fac0b3 | 2014-06-17 18:53:36 +1000 | [diff] [blame] | 9 | /* assume 8 bits per byte. */ |
10 | unsigned long pow = sizeof(x) * CHAR_BIT - 1ULL; | ||||
11 | unsigned long i = 1ULL << pow; | ||||
Eric Biederman | 8ca8d76 | 2003-04-22 19:02:15 +0000 | [diff] [blame] | 12 | |
Edward O'Callaghan | 8fac0b3 | 2014-06-17 18:53:36 +1000 | [diff] [blame] | 13 | if (!x) { |
14 | printk(BIOS_WARNING, "%s called with invalid parameter of 0\n", | ||||
Yinghai Lu | 13f1c2a | 2005-07-08 02:49:49 +0000 | [diff] [blame] | 15 | __func__); |
Edward O'Callaghan | 8fac0b3 | 2014-06-17 18:53:36 +1000 | [diff] [blame] | 16 | return -1; |
17 | } | ||||
Eric Biederman | 8ca8d76 | 2003-04-22 19:02:15 +0000 | [diff] [blame] | 18 | |
Edward O'Callaghan | 8fac0b3 | 2014-06-17 18:53:36 +1000 | [diff] [blame] | 19 | for (; i > x; i >>= 1, pow--); |
20 | |||||
21 | return pow; | ||||
Eric Biederman | 8ca8d76 | 2003-04-22 19:02:15 +0000 | [diff] [blame] | 22 | } |
Alexandru Gagniuc | 594ef81 | 2014-01-13 00:49:49 -0600 | [diff] [blame] | 23 | |
24 | unsigned long log2_ceil(unsigned long x) | ||||
25 | { | ||||
26 | unsigned long pow; | ||||
27 | |||||
Edward O'Callaghan | 8fac0b3 | 2014-06-17 18:53:36 +1000 | [diff] [blame] | 28 | if (!x) |
Alexandru Gagniuc | 594ef81 | 2014-01-13 00:49:49 -0600 | [diff] [blame] | 29 | return -1; |
30 | |||||
31 | pow = log2(x); | ||||
32 | |||||
33 | if (x > (1ULL << pow)) | ||||
34 | pow++; | ||||
35 | |||||
36 | return pow; | ||||
37 | } |