Skip to content

Commit

Permalink
staging: ti dspbridge: add generic utilities
Browse files Browse the repository at this point in the history
Add TI's DSP Bridge generic utilities driver sources

Signed-off-by: Omar Ramirez Luna <omar.ramirez@ti.com>
Signed-off-by: Kanigeri, Hari <h-kanigeri2@ti.com>
Signed-off-by: Ameya Palande <ameya.palande@nokia.com>
Signed-off-by: Guzman Lugo, Fernando <fernando.lugo@ti.com>
Signed-off-by: Hebbar, Shivananda <x0hebbar@ti.com>
Signed-off-by: Ramos Falcon, Ernesto <ernesto@ti.com>
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
Signed-off-by: Anna, Suman <s-anna@ti.com>
Signed-off-by: Gupta, Ramesh <grgupta@ti.com>
Signed-off-by: Gomez Castellanos, Ivan <ivan.gomez@ti.com>
Signed-off-by: Andy Shevchenko <ext-andriy.shevchenko@nokia.com>
Signed-off-by: Armando Uribe De Leon <x0095078@ti.com>
Signed-off-by: Deepak Chitriki <deepak.chitriki@ti.com>
Signed-off-by: Menon, Nishanth <nm@ti.com>
Signed-off-by: Phil Carmody <ext-phil.2.carmody@nokia.com>
Signed-off-by: Ohad Ben-Cohen <ohad@wizery.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
  • Loading branch information
Omar Ramirez Luna authored and Greg Kroah-Hartman committed Jun 23, 2010
1 parent 5cc28e6 commit 7227b67
Show file tree
Hide file tree
Showing 4 changed files with 692 additions and 0 deletions.
167 changes: 167 additions & 0 deletions drivers/staging/tidspbridge/gen/gb.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
/*
* gb.c
*
* DSP-BIOS Bridge driver support functions for TI OMAP processors.
*
* Generic bitmap operations.
*
* Copyright (C) 2005-2006 Texas Instruments, Inc.
*
* This package is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/

/* ----------------------------------- DSP/BIOS Bridge */
#include <dspbridge/std.h>
#include <linux/types.h>
/* ----------------------------------- This */
#include <dspbridge/gs.h>
#include <dspbridge/gb.h>

struct gb_t_map {
u32 len;
u32 wcnt;
u32 *words;
};

/*
* ======== gb_clear ========
* purpose:
* Clears a bit in the bit map.
*/

void gb_clear(struct gb_t_map *map, u32 bitn)
{
u32 mask;

mask = 1L << (bitn % BITS_PER_LONG);
map->words[bitn / BITS_PER_LONG] &= ~mask;
}

/*
* ======== gb_create ========
* purpose:
* Creates a bit map.
*/

struct gb_t_map *gb_create(u32 len)
{
struct gb_t_map *map;
u32 i;
map = (struct gb_t_map *)gs_alloc(sizeof(struct gb_t_map));
if (map != NULL) {
map->len = len;
map->wcnt = len / BITS_PER_LONG + 1;
map->words = (u32 *) gs_alloc(map->wcnt * sizeof(u32));
if (map->words != NULL) {
for (i = 0; i < map->wcnt; i++)
map->words[i] = 0L;

} else {
gs_frees(map, sizeof(struct gb_t_map));
map = NULL;
}
}

return map;
}

/*
* ======== gb_delete ========
* purpose:
* Frees a bit map.
*/

void gb_delete(struct gb_t_map *map)
{
gs_frees(map->words, map->wcnt * sizeof(u32));
gs_frees(map, sizeof(struct gb_t_map));
}

/*
* ======== gb_findandset ========
* purpose:
* Finds a free bit and sets it.
*/
u32 gb_findandset(struct gb_t_map *map)
{
u32 bitn;

bitn = gb_minclear(map);

if (bitn != GB_NOBITS)
gb_set(map, bitn);

return bitn;
}

/*
* ======== gb_minclear ========
* purpose:
* returns the location of the first unset bit in the bit map.
*/
u32 gb_minclear(struct gb_t_map *map)
{
u32 bit_location = 0;
u32 bit_acc = 0;
u32 i;
u32 bit;
u32 *word;

for (word = map->words, i = 0; i < map->wcnt; word++, i++) {
if (~*word) {
for (bit = 0; bit < BITS_PER_LONG; bit++, bit_acc++) {
if (bit_acc == map->len)
return GB_NOBITS;

if (~*word & (1L << bit)) {
bit_location = i * BITS_PER_LONG + bit;
return bit_location;
}

}
} else {
bit_acc += BITS_PER_LONG;
}
}

return GB_NOBITS;
}

/*
* ======== gb_set ========
* purpose:
* Sets a bit in the bit map.
*/

void gb_set(struct gb_t_map *map, u32 bitn)
{
u32 mask;

mask = 1L << (bitn % BITS_PER_LONG);
map->words[bitn / BITS_PER_LONG] |= mask;
}

/*
* ======== gb_test ========
* purpose:
* Returns true if the bit is set in the specified location.
*/

bool gb_test(struct gb_t_map *map, u32 bitn)
{
bool state;
u32 mask;
u32 word;

mask = 1L << (bitn % BITS_PER_LONG);
word = map->words[bitn / BITS_PER_LONG];
state = word & mask ? TRUE : FALSE;

return state;
}
213 changes: 213 additions & 0 deletions drivers/staging/tidspbridge/gen/gh.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,213 @@
/*
* gh.c
*
* DSP-BIOS Bridge driver support functions for TI OMAP processors.
*
* Copyright (C) 2005-2006 Texas Instruments, Inc.
*
* This package is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/

#include <dspbridge/std.h>

#include <dspbridge/host_os.h>

#include <dspbridge/gs.h>

#include <dspbridge/gh.h>

struct element {
struct element *next;
u8 data[1];
};

struct gh_t_hash_tab {
u16 max_bucket;
u16 val_size;
struct element **buckets;
u16(*hash) (void *, u16);
bool(*match) (void *, void *);
void (*delete) (void *);
};

static void noop(void *p);
static s32 cur_init;
static void myfree(void *ptr, s32 size);

/*
* ======== gh_create ========
*/

struct gh_t_hash_tab *gh_create(u16 max_bucket, u16 val_size,
u16(*hash) (void *, u16), bool(*match) (void *,
void *),
void (*delete) (void *))
{
struct gh_t_hash_tab *hash_tab;
u16 i;
hash_tab =
(struct gh_t_hash_tab *)gs_alloc(sizeof(struct gh_t_hash_tab));
if (hash_tab == NULL)
return NULL;
hash_tab->max_bucket = max_bucket;
hash_tab->val_size = val_size;
hash_tab->hash = hash;
hash_tab->match = match;
hash_tab->delete = delete == NULL ? noop : delete;

hash_tab->buckets = (struct element **)
gs_alloc(sizeof(struct element *) * max_bucket);
if (hash_tab->buckets == NULL) {
gh_delete(hash_tab);
return NULL;
}

for (i = 0; i < max_bucket; i++)
hash_tab->buckets[i] = NULL;

return hash_tab;
}

/*
* ======== gh_delete ========
*/
void gh_delete(struct gh_t_hash_tab *hash_tab)
{
struct element *elem, *next;
u16 i;

if (hash_tab != NULL) {
if (hash_tab->buckets != NULL) {
for (i = 0; i < hash_tab->max_bucket; i++) {
for (elem = hash_tab->buckets[i]; elem != NULL;
elem = next) {
next = elem->next;
(*hash_tab->delete) (elem->data);
myfree(elem,
sizeof(struct element) - 1 +
hash_tab->val_size);
}
}

myfree(hash_tab->buckets, sizeof(struct element *)
* hash_tab->max_bucket);
}

myfree(hash_tab, sizeof(struct gh_t_hash_tab));
}
}

/*
* ======== gh_exit ========
*/

void gh_exit(void)
{
if (cur_init-- == 1)
gs_exit();

}

/*
* ======== gh_find ========
*/

void *gh_find(struct gh_t_hash_tab *hash_tab, void *key)
{
struct element *elem;

elem = hash_tab->buckets[(*hash_tab->hash) (key, hash_tab->max_bucket)];

for (; elem; elem = elem->next) {
if ((*hash_tab->match) (key, elem->data))
return elem->data;
}

return NULL;
}

/*
* ======== gh_init ========
*/

void gh_init(void)
{
if (cur_init++ == 0)
gs_init();
}

/*
* ======== gh_insert ========
*/

void *gh_insert(struct gh_t_hash_tab *hash_tab, void *key, void *value)
{
struct element *elem;
u16 i;
char *src, *dst;

elem = (struct element *)gs_alloc(sizeof(struct element) - 1 +
hash_tab->val_size);
if (elem != NULL) {

dst = (char *)elem->data;
src = (char *)value;
for (i = 0; i < hash_tab->val_size; i++)
*dst++ = *src++;

i = (*hash_tab->hash) (key, hash_tab->max_bucket);
elem->next = hash_tab->buckets[i];
hash_tab->buckets[i] = elem;

return elem->data;
}

return NULL;
}

/*
* ======== noop ========
*/
/* ARGSUSED */
static void noop(void *p)
{
p = p; /* stifle compiler warning */
}

/*
* ======== myfree ========
*/
static void myfree(void *ptr, s32 size)
{
gs_free(ptr);
}

/**
* gh_iterate() - This function goes through all the elements in the hash table
* looking for the dsp symbols.
* @hash_tab: Hash table
* @callback: pointer to callback function
* @user_data: User data, contains the find_symbol_context pointer
*
*/
void gh_iterate(struct gh_t_hash_tab *hash_tab,
void (*callback)(void *, void *), void *user_data)
{
struct element *elem;
u32 i;

if (hash_tab && hash_tab->buckets)
for (i = 0; i < hash_tab->max_bucket; i++) {
elem = hash_tab->buckets[i];
while (elem) {
callback(&elem->data, user_data);
elem = elem->next;
}
}
}
Loading

0 comments on commit 7227b67

Please sign in to comment.