| #undef DEBUG_LOG2 |
| |
| #ifdef DEBUG_LOG2 |
| #include <console/console.h> |
| #endif |
| |
| #include <lib.h> |
| |
| /* Assume 8 bits per byte */ |
| #define CHAR_BIT 8 |
| |
| unsigned long log2(unsigned long x) |
| { |
| // assume 8 bits per byte. |
| unsigned long i = 1ULL << (sizeof(x)* CHAR_BIT - 1ULL); |
| unsigned long pow = sizeof(x) * CHAR_BIT - 1ULL; |
| |
| if (! x) { |
| #ifdef DEBUG_LOG2 |
| printk(BIOS_WARNING, "%s called with invalid parameter of 0\n", |
| __func__); |
| #endif |
| return -1; |
| } |
| for(; i > x; i >>= 1, pow--) |
| ; |
| |
| return pow; |
| } |
| |
| unsigned long log2_ceil(unsigned long x) |
| { |
| unsigned long pow; |
| |
| if (! x) |
| return -1; |
| |
| pow = log2(x); |
| |
| if (x > (1ULL << pow)) |
| pow++; |
| |
| return pow; |
| } |