1178784Skmacy/*
2178784Skmacy * $FreeBSD$
3178784Skmacy */
4178784Skmacy#ifndef	__RDMA_TYPES_H_
5178784Skmacy#define	__RDMA_TYPES_H_
6178784Skmacy#include <sys/types.h>
7178784Skmacy#include <sys/malloc.h>
8178784Skmacy
9178784Skmacy
10178784Skmacytypedef uint8_t 	u8;
11178784Skmacytypedef uint16_t 	u16;
12178784Skmacytypedef uint32_t 	u32;
13178784Skmacytypedef uint64_t 	u64;
14178784Skmacy
15178784Skmacytypedef uint8_t		__u8;
16178784Skmacytypedef uint16_t	__u16;
17178784Skmacytypedef uint32_t	__u32;
18178784Skmacytypedef uint64_t	__u64;
19178784Skmacytypedef uint8_t		__be8;
20178784Skmacytypedef uint16_t	__be16;
21178784Skmacytypedef uint32_t	__be32;
22178784Skmacytypedef uint64_t	__be64;
23178784Skmacy
24178784Skmacytypedef	int32_t		__s32;
25178784Skmacy
26178784Skmacy
27178784Skmacy#define LINUX_TYPES_DEFINED
28178784Skmacy#define ERR_PTR(err) ((void *)((long)(err)))
29178784Skmacy#define IS_ERR(ptr)  ((unsigned long)(ptr) > (unsigned long)(-1000))
30178784Skmacy#define PTR_ERR(ptr)    ((long)(ptr))
31178784Skmacy
32178791Skmacy#ifndef PANIC_IF
33178784Skmacy#define PANIC_IF(exp) do {                  \
34178784Skmacy	if (exp)                            \
35178784Skmacy		panic("BUG func %s line %u: %s", __FUNCTION__, __LINE__, #exp);      \
36178784Skmacy} while (0)
37178791Skmacy#endif
38178784Skmacy
39178784Skmacy#define container_of(p, stype, field) ((stype *)(((uint8_t *)(p)) - offsetof(stype, field)))
40178784Skmacy
41178784Skmacystatic __inline int
42178784Skmacyfind_first_zero_bit(volatile void *p, int max)
43178784Skmacy{
44178784Skmacy        int b;
45178784Skmacy        volatile int *ptr = (volatile int *)p;
46178784Skmacy
47178784Skmacy        for (b = 0; b < max; b += 32) {
48178784Skmacy                if (ptr[b >> 5] != ~0) {
49178784Skmacy                        for (;;) {
50178784Skmacy                                if ((ptr[b >> 5] & (1 << (b & 0x1f))) == 0)
51178784Skmacy                                        return (b);
52178784Skmacy                                b++;
53178784Skmacy                        }
54178784Skmacy                }
55178784Skmacy        }
56178784Skmacy
57178784Skmacy        return (max);
58178784Skmacy}
59178784Skmacy
60178784Skmacystruct kvl {
61178784Skmacy        struct kvl *next;
62178784Skmacy        unsigned int key;
63178784Skmacy        void *value;
64178784Skmacy};
65178784Skmacy
66178784Skmacy#define DEFINE_KVL(x) struct kvl x;
67178784Skmacy
68178784Skmacystatic __inline void *
69178784Skmacykvl_lookup(struct kvl *x, uint32_t key)
70178784Skmacy{
71178784Skmacy        struct kvl *i;
72178784Skmacy        for (i=x->next;i;i=i->next) if (i->key==key) return(i->value);
73178784Skmacy        return(0);
74178784Skmacy}
75178784Skmacy
76178784Skmacystatic __inline int
77178784Skmacykvl_alloc_above(struct kvl *idp, void *ptr, int starting_id, int *id)
78178784Skmacy{
79178784Skmacy	int newid = starting_id;
80178784Skmacy	struct kvl *i;
81178784Skmacy
82178784Skmacy        for (i=idp->next;i;i=i->next)
83178784Skmacy		if (i->key == newid)
84178784Skmacy			return -EEXIST;
85178784Skmacy
86178784Skmacy        i=malloc(sizeof(struct kvl),M_TEMP,M_NOWAIT);
87178784Skmacy        i->key=newid;
88178784Skmacy        i->value=ptr;
89178784Skmacy        i->next=idp->next;
90178784Skmacy        idp->next=i;
91178784Skmacy	*id = newid;
92178784Skmacy        return(0);
93178784Skmacy}
94178784Skmacy
95178784Skmacystatic __inline void
96178784Skmacykvl_delete(struct kvl *idp, int id)
97178784Skmacy{
98178784Skmacy        /* leak */
99178784Skmacy        struct kvl *i, *prev=NULL;
100178784Skmacy        for (i=idp->next;i;prev=i,i=i->next)
101178784Skmacy                if ((i)->key==id) {
102178784Skmacy			if (!prev)
103178784Skmacy				idp->next = i->next;
104178784Skmacy			else
105178784Skmacy				prev->next = i->next;
106178784Skmacy			free(i, M_TEMP);
107178784Skmacy                        return;
108178784Skmacy                }
109178784Skmacy}
110178784Skmacy
111178784Skmacystatic __inline void
112178784Skmacykvl_free(struct kvl *idp)
113178784Skmacy{
114178784Skmacy        struct kvl *i, *tmp;
115178784Skmacy        for (i=idp->next;i;i=tmp) {
116178784Skmacy		tmp=i->next;
117178784Skmacy		free(i, M_TEMP);
118178784Skmacy	}
119178784Skmacy	idp->next = NULL;
120178784Skmacy}
121178784Skmacy
122178784Skmacy
123178784Skmacy#endif
124