mirror of
https://github.com/NVIDIA/open-gpu-kernel-modules.git
synced 2025-01-20 06:52:11 +01:00
121 lines
3.5 KiB
C
121 lines
3.5 KiB
C
|
/*
|
||
|
* SPDX-FileCopyrightText: Copyright (c) 2015 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||
|
* SPDX-License-Identifier: MIT
|
||
|
*
|
||
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
||
|
* copy of this software and associated documentation files (the "Software"),
|
||
|
* to deal in the Software without restriction, including without limitation
|
||
|
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||
|
* and/or sell copies of the Software, and to permit persons to whom the
|
||
|
* Software is furnished to do so, subject to the following conditions:
|
||
|
*
|
||
|
* The above copyright notice and this permission notice shall be included in
|
||
|
* all copies or substantial portions of the Software.
|
||
|
*
|
||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||
|
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||
|
* DEALINGS IN THE SOFTWARE.
|
||
|
*/
|
||
|
|
||
|
#ifndef __NV_COMMON_UTILS_H__
|
||
|
#define __NV_COMMON_UTILS_H__
|
||
|
|
||
|
#include "nvtypes.h"
|
||
|
#include "nvmisc.h"
|
||
|
|
||
|
#if !defined(TRUE)
|
||
|
#define TRUE NV_TRUE
|
||
|
#endif
|
||
|
|
||
|
#if !defined(FALSE)
|
||
|
#define FALSE NV_FALSE
|
||
|
#endif
|
||
|
|
||
|
#define NV_IS_UNSIGNED(x) ((__typeof__(x))-1 > 0)
|
||
|
|
||
|
/* Get the length of a statically-sized array. */
|
||
|
#define ARRAY_LEN(_arr) (sizeof(_arr) / sizeof(_arr[0]))
|
||
|
|
||
|
#define NV_INVALID_HEAD 0xFFFFFFFF
|
||
|
|
||
|
#define NV_INVALID_CONNECTOR_PHYSICAL_INFORMATION (~0)
|
||
|
|
||
|
#if !defined(NV_MIN)
|
||
|
# define NV_MIN(a,b) (((a)<(b))?(a):(b))
|
||
|
#endif
|
||
|
|
||
|
#define NV_MIN3(a,b,c) NV_MIN(NV_MIN(a, b), c)
|
||
|
#define NV_MIN4(a,b,c,d) NV_MIN3(NV_MIN(a,b),c,d)
|
||
|
|
||
|
#if !defined(NV_MAX)
|
||
|
# define NV_MAX(a,b) (((a)>(b))?(a):(b))
|
||
|
#endif
|
||
|
|
||
|
#define NV_MAX3(a,b,c) NV_MAX(NV_MAX(a, b), c)
|
||
|
#define NV_MAX4(a,b,c,d) NV_MAX3(NV_MAX(a,b),c,d)
|
||
|
|
||
|
static inline int NV_LIMIT_VAL_TO_MIN_MAX(int val, int min, int max)
|
||
|
{
|
||
|
if (val < min) {
|
||
|
return min;
|
||
|
}
|
||
|
if (val > max) {
|
||
|
return max;
|
||
|
}
|
||
|
return val;
|
||
|
}
|
||
|
|
||
|
#define NV_ROUNDUP_DIV(x,y) ((x) / (y) + (((x) % (y)) ? 1 : 0))
|
||
|
|
||
|
/*
|
||
|
* Macros used for computing palette entries:
|
||
|
*
|
||
|
* NV_UNDER_REPLICATE(val, source_size, result_size) expands a value
|
||
|
* of source_size bits into a value of target_size bits by shifting
|
||
|
* the source value into the high bits and replicating the high bits
|
||
|
* of the value into the low bits of the result.
|
||
|
*
|
||
|
* PALETTE_DEPTH_SHIFT(val, w) maps a colormap entry for a component
|
||
|
* that has w bits to an appropriate entry in a LUT of 256 entries.
|
||
|
*/
|
||
|
static inline unsigned int NV_UNDER_REPLICATE(unsigned short val,
|
||
|
int source_size,
|
||
|
int result_size)
|
||
|
{
|
||
|
return (val << (result_size - source_size)) |
|
||
|
(val >> ((source_size << 1) - result_size));
|
||
|
}
|
||
|
|
||
|
|
||
|
static inline unsigned short PALETTE_DEPTH_SHIFT(unsigned short val, int depth)
|
||
|
{
|
||
|
return NV_UNDER_REPLICATE(val, depth, 8);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Use __builtin_ffs where it is supported, or provide an equivalent
|
||
|
* implementation for platforms like riscv where it is not.
|
||
|
*/
|
||
|
#if defined(__GNUC__) && !NVCPU_IS_RISCV64
|
||
|
static inline int nv_ffs(int x)
|
||
|
{
|
||
|
return __builtin_ffs(x);
|
||
|
}
|
||
|
#else
|
||
|
static inline int nv_ffs(int x)
|
||
|
{
|
||
|
if (x == 0)
|
||
|
return 0;
|
||
|
|
||
|
LOWESTBITIDX_32(x);
|
||
|
|
||
|
return 1 + x;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#endif /* __NV_COMMON_UTILS_H__ */
|