root/sys/dev/pci/drm/include/linux/math.h
/* Public domain. */

#ifndef _LINUX_MATH_H
#define _LINUX_MATH_H

#define mult_frac(x, n, d) (((x) * (n)) / (d))

#define round_up(x, y) ((((x) + ((y) - 1)) / (y)) * (y))
#define round_down(x, y) (((x) / (y)) * (y)) /* y is power of two */
#define rounddown(x, y) (((x) / (y)) * (y)) /* arbitrary y */
#define DIV_ROUND_UP(x, y)      (((x) + ((y) - 1)) / (y))
#define DIV_ROUND_UP_ULL(x, y)  DIV_ROUND_UP(x, y)
#define DIV_ROUND_DOWN(x, y)    ((x) / (y))
#define DIV_ROUND_DOWN_ULL(x, y)        DIV_ROUND_DOWN(x, y)
#define DIV_ROUND_CLOSEST(x, y) (((x) + ((y) / 2)) / (y))
#define DIV_ROUND_CLOSEST_ULL(x, y)     DIV_ROUND_CLOSEST(x, y)

/* integer square root, Heron's method */
static inline unsigned long
int_sqrt(unsigned long x)
{
        unsigned long r;

        if (x <= 1)
                return x;

        r = x / 2;
        /*
         * while next < current
         * (r + (x / r)) / 2 < r
         * r + (x / r) < 2r
         * (x / r) < r
         */
        while ((x / r) < r)
                r = (r + (x / r)) / 2;
        return r;
}

#endif