gpu: nvgpu: Add nvgpu_bsearch() wrapper

Add a wrapper nvgpu_bsearch() for a standard binary search. It has two
implementations: Linux version calls Linux kernel bsearch() and
POSIX/QNX build uses stdlib bsearch().

Change-Id: Ic244df3cf3adb52b2192c175ec9b5dd06bce3ec8
Signed-off-by: Terje Bergstrom <tbergstrom@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/2003370
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
This commit is contained in:
Terje Bergstrom
2019-01-23 15:25:01 -08:00
committed by mobile promotions
parent a28c753ee6
commit 0f84c9024f
7 changed files with 72 additions and 11 deletions

View File

@@ -183,7 +183,8 @@ nvgpu-y += \
os/linux/dt.o \
os/linux/ecc_sysfs.o \
os/linux/ltc.o \
os/linux/os_ops_tu104.o
os/linux/os_ops_tu104.o \
os/linux/bsearch.o
nvgpu-$(CONFIG_GK20A_VIDMEM) += \
os/linux/dmabuf_vidmem.o

View File

@@ -56,6 +56,7 @@ endif
# POSIX sources shared between the POSIX and QNX builds.
srcs += os/posix/bug.c \
os/posix/bsearch.c
srcs += common/sim.c \
common/sim_pci.c \

View File

@@ -280,7 +280,7 @@ static bool check_whitelists(struct gk20a *g,
if (op->type == REGOP(TYPE_GLOBAL)) {
/* search global list */
valid = (g->ops.regops.get_global_whitelist_ranges != NULL) &&
(bsearch(&offset,
(nvgpu_bsearch(&offset,
g->ops.regops.get_global_whitelist_ranges(),
g->ops.regops.get_global_whitelist_ranges_count(),
sizeof(*g->ops.regops.get_global_whitelist_ranges()),
@@ -290,7 +290,7 @@ static bool check_whitelists(struct gk20a *g,
if ((!valid) && (!is_profiler)) {
/* binary search context list */
valid = (g->ops.regops.get_context_whitelist_ranges != NULL) &&
(bsearch(&offset,
(nvgpu_bsearch(&offset,
g->ops.regops.get_context_whitelist_ranges(),
g->ops.regops.get_context_whitelist_ranges_count(),
sizeof(*g->ops.regops.get_context_whitelist_ranges()),
@@ -307,7 +307,7 @@ static bool check_whitelists(struct gk20a *g,
} else if (op->type == REGOP(TYPE_GR_CTX)) {
/* binary search context list */
valid = (g->ops.regops.get_context_whitelist_ranges != NULL) &&
(bsearch(&offset,
(nvgpu_bsearch(&offset,
g->ops.regops.get_context_whitelist_ranges(),
g->ops.regops.get_context_whitelist_ranges_count(),
sizeof(*g->ops.regops.get_context_whitelist_ranges()),
@@ -447,7 +447,7 @@ static bool validate_reg_ops(struct gk20a *g,
/* exported for tools like cyclestats, etc */
bool is_bar0_global_offset_whitelisted_gk20a(struct gk20a *g, u32 offset)
{
bool valid = bsearch(&offset,
bool valid = nvgpu_bsearch(&offset,
g->ops.regops.get_global_whitelist_ranges(),
g->ops.regops.get_global_whitelist_ranges_count(),
sizeof(*g->ops.regops.get_global_whitelist_ranges()),

View File

@@ -7233,7 +7233,7 @@ static int gr_gk20a_find_priv_offset_in_pm_buffer(struct gk20a *g,
count = gr->ctx_vars.hwpm_ctxsw_buffer_offset_map_count;
map_key.addr = addr;
result = bsearch(&map_key, map, count, sizeof(*map), map_cmp);
result = nvgpu_bsearch(&map_key, map, count, sizeof(*map), map_cmp);
if (result != NULL) {
*priv_offset = result->offset;

View File

@@ -22,10 +22,9 @@
#ifndef NVGPU_BSEARCH_H
#define NVGPU_BSEARCH_H
#ifdef __KERNEL__
#include <linux/bsearch.h>
#elif defined(__NVGPU_POSIX__)
#include <stdlib.h>
#endif
#include <nvgpu/types.h>
void *nvgpu_bsearch(const void *key, const void *base, size_t nitems, size_t size,
int (*compar)(const void *a, const void *b));
#endif /*NVGPU_BSEARCH_H*/

View File

@@ -0,0 +1,30 @@
/*
* Copyright (c) 2019, NVIDIA CORPORATION. All rights reserved.
*
* 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.
*/
#include <nvgpu/bsearch.h>
#include <linux/bsearch.h>
void *nvgpu_bsearch(const void *key, const void *base, size_t nitems, size_t size,
int (*compar)(const void *a, const void *b))
{
return bsearch(key, base, nitems, size, compar);
}

View File

@@ -0,0 +1,30 @@
/*
* Copyright (c) 2019, NVIDIA CORPORATION. All rights reserved.
*
* 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.
*/
#include <nvgpu/bsearch.h>
#include <stdlib.h>
void *nvgpu_bsearch(const void *key, const void *base, size_t nitems, size_t size,
int (*compar)(const void *a, const void *b))
{
return bsearch(key, base, nitems, size, compar);
}