blob: 5e0d591de4ff3a2267cfd80d1760639fb9e0ae58 [file] [log] [blame]
Eric Biederman8ca8d762003-04-22 19:02:15 +00001#include <console/console.h>
Myles Watson58170782009-10-28 16:13:28 +00002#include <lib.h>
3
Yinghai Lu13f1c2a2005-07-08 02:49:49 +00004/* Assume 8 bits per byte */
5#define CHAR_BIT 8
6
Eric Biederman8ca8d762003-04-22 19:02:15 +00007unsigned long log2(unsigned long x)
8{
Edward O'Callaghan8fac0b32014-06-17 18:53:36 +10009 /* assume 8 bits per byte. */
10 unsigned long pow = sizeof(x) * CHAR_BIT - 1ULL;
11 unsigned long i = 1ULL << pow;
Eric Biederman8ca8d762003-04-22 19:02:15 +000012
Edward O'Callaghan8fac0b32014-06-17 18:53:36 +100013 if (!x) {
14 printk(BIOS_WARNING, "%s called with invalid parameter of 0\n",
Yinghai Lu13f1c2a2005-07-08 02:49:49 +000015 __func__);
Edward O'Callaghan8fac0b32014-06-17 18:53:36 +100016 return -1;
17 }
Eric Biederman8ca8d762003-04-22 19:02:15 +000018
Edward O'Callaghan8fac0b32014-06-17 18:53:36 +100019 for (; i > x; i >>= 1, pow--);
20
21 return pow;
Eric Biederman8ca8d762003-04-22 19:02:15 +000022}
Alexandru Gagniuc594ef812014-01-13 00:49:49 -060023
24unsigned long log2_ceil(unsigned long x)
25{
26 unsigned long pow;
27
Edward O'Callaghan8fac0b32014-06-17 18:53:36 +100028 if (!x)
Alexandru Gagniuc594ef812014-01-13 00:49:49 -060029 return -1;
30
31 pow = log2(x);
32
33 if (x > (1ULL << pow))
34 pow++;
35
36 return pow;
37}