-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
yaml --- r: 205740 b: refs/heads/master c: 7227b67 h: refs/heads/master v: v3
- Loading branch information
Omar Ramirez Luna
authored and
Greg Kroah-Hartman
committed
Jun 23, 2010
1 parent
b7776ac
commit 7e3c648
Showing
5 changed files
with
693 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
--- | ||
refs/heads/master: 5cc28e622f2f7ecb7711c370f99a2b7fb4226e2f | ||
refs/heads/master: 7227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} | ||
} | ||
} |
Oops, something went wrong.