• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021 HiSilicon (Shanghai) Technologies CO., LIMITED.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
17  */
18 
19 #ifndef __HI_OSAL__
20 #define __HI_OSAL__
21 
22 #define HI_OSAL_VERSION    "1.0"
23 
24 #include "osal_list.h"
25 #include "autoconf.h"
26 
27 #define osal_gfp_kernel    0
28 #define osal_gfp_atomic    1
29 extern void *osal_vmalloc(unsigned long size);
30 extern void osal_vfree(const void *addr);
31 extern void *osal_kmalloc(unsigned long size, unsigned int osal_gfp_flag);
32 extern void osal_kfree(const void *addr);
33 
34 /* atomic api */
35 typedef struct {
36     void *atomic;
37 } osal_atomic_t;
38 
39 #define OSAL_ATOMIC_INIT(i)  { (i) }
40 
41 extern int osal_atomic_init(osal_atomic_t *atomic);
42 extern void osal_atomic_destroy(osal_atomic_t *atomic);
43 extern int osal_atomic_read(osal_atomic_t *v);
44 extern void osal_atomic_set(osal_atomic_t *v, int i);
45 extern int osal_atomic_inc_return(osal_atomic_t *v);
46 extern int osal_atomic_dec_return(osal_atomic_t *v);
47 
48 /* semaphore api */
49 #define EINTR              4
50 typedef struct osal_semaphore {
51     void *sem;
52 } osal_semaphore_t;
53 extern int osal_sema_init(osal_semaphore_t *sem, int val);
54 extern int osal_down(osal_semaphore_t *sem);
55 extern int osal_down_interruptible(osal_semaphore_t *sem);
56 extern int osal_down_trylock(osal_semaphore_t *sem);
57 extern void osal_up(osal_semaphore_t *sem);
58 /* notice:must be called when kmod exit, other wise will lead to memory leak; */
59 extern void osal_sema_destroy(osal_semaphore_t *sem);
60 
61 /* mutex api */
62 typedef struct osal_mutex {
63     void *mutex;
64 } osal_mutex_t;
65 extern int osal_mutex_init(osal_mutex_t *mutex);
66 extern int osal_mutex_lock(osal_mutex_t *mutex);
67 extern int osal_mutex_lock_interruptible(osal_mutex_t *mutex);
68 extern int osal_mutex_trylock(osal_mutex_t *mutex);
69 extern void osal_mutex_unlock(osal_mutex_t *mutex);
70 /* notice:must be called when kmod exit, other wise will lead to memory leak; */
71 extern void osal_mutex_destroy(osal_mutex_t *mutex);
72 
73 /* spin lock api */
74 typedef struct osal_spinlock {
75     void *lock;
76 } osal_spinlock_t;
77 extern int osal_spin_lock_init(osal_spinlock_t *lock);
78 extern void osal_spin_lock(osal_spinlock_t *lock);
79 extern int osal_spin_trylock(osal_spinlock_t *lock);
80 extern void osal_spin_unlock(osal_spinlock_t *lock);
81 extern void osal_spin_lock_irqsave(osal_spinlock_t *lock, unsigned long *flags);
82 extern void osal_spin_unlock_irqrestore(osal_spinlock_t *lock, const unsigned long *flags);
83 /* notice:must be called when kmod exit, other wise will lead to memory leak; */
84 extern void osal_spin_lock_destroy(osal_spinlock_t *lock);
85 
86 /* wait api */
87 typedef int (*osal_wait_cond_func_t)(const void *param);
88 
89 typedef struct osal_wait {
90     void *wait;
91 } osal_wait_t;
92 #define ERESTARTSYS        512
93 
94 
95 extern unsigned long osal_msecs_to_jiffies(const unsigned int m);
96 extern int osal_wait_init(osal_wait_t *wait);
97 extern int osal_wait_interruptible(osal_wait_t *wait, osal_wait_cond_func_t func, const void *param);
98 extern int osal_wait_uninterruptible(osal_wait_t *wait, osal_wait_cond_func_t func, const void *param);
99 extern int osal_wait_timeout_interruptible(osal_wait_t *wait, osal_wait_cond_func_t func, const void *param,
100                                            unsigned long ms);
101 extern int osal_wait_timeout_uninterruptible(osal_wait_t *wait, osal_wait_cond_func_t func, const void *param,
102                                              unsigned long ms);
103 
104 #define osal_wait_event_interruptible(wait, func, param)                       \
105     ({                                                                         \
106         int __ret = 0;                                                         \
107                                                                                \
108         for (;;) {                                                             \
109             if (func(param) != 0) {                                            \
110                 __ret = 0;                                                     \
111                 break;                                                         \
112             }                                                                  \
113             __ret = osal_wait_timeout_interruptible(wait, (func), param, 100); \
114             if (__ret < 0) {                                                   \
115                 break;                                                         \
116             }                                                                  \
117         }                                                                      \
118         __ret;                                                                 \
119     })
120 
121 #define osal_wait_event_uninterruptible(wait, func, param)          \
122     ({                                                              \
123         int __ret = 0;                                              \
124                                                                     \
125         for (;;) {                                                  \
126             if (func(param) != 0) {                                      \
127                 __ret = 0;                                          \
128                 break;                                              \
129             }                                                       \
130             __ret = osal_wait_uninterruptible(wait, (func), param); \
131             if (__ret < 0) {                                        \
132                 break;                                              \
133             }                                                       \
134         }                                                           \
135         __ret;                                                      \
136     })
137 
138 #define osal_wait_event_timeout_interruptible(wait, func, param, timeout)        \
139     ({                                                                           \
140         int __ret = timeout;                                                     \
141                                                                                  \
142         if ((func(param) != 0) && ((timeout) == 0)) {                            \
143             __ret = 1;                                                           \
144         }                                                                        \
145                                                                                  \
146         for (;;) {                                                               \
147             if (func(param) != 0) {                                              \
148                 __ret = osal_msecs_to_jiffies(__ret);                            \
149                 break;                                                           \
150             }                                                                    \
151             __ret = osal_wait_timeout_interruptible(wait, (func), param, __ret); \
152             if ((__ret == 0) || (__ret == -ERESTARTSYS)) {                       \
153                 break;                                                           \
154             }                                                                    \
155         }                                                                        \
156         __ret;                                                                   \
157     })
158 
159 #define osal_wait_event_timeout_uninterruptible(wait, func, param, timeout)        \
160     ({                                                                             \
161         int __ret = timeout;                                                       \
162                                                                                    \
163         if ((func(param) != 0) && ((timeout) == 0)) {                              \
164             __ret = 1;                                                             \
165         }                                                                          \
166                                                                                    \
167         for (;;) {                                                                 \
168             if (func(param) != 0) {                                                \
169                 __ret = osal_msecs_to_jiffies(__ret);                              \
170                 break;                                                             \
171             }                                                                      \
172             __ret = osal_wait_timeout_uninterruptible(wait, (func), param, __ret); \
173             if ((__ret == 0) || (__ret == -ERESTARTSYS)) {                         \
174                 break;                                                             \
175             }                                                                      \
176         }                                                                          \
177         __ret;                                                                     \
178     })
179 
180 extern void osal_wakeup(osal_wait_t *wait);  /* same as wake_up_all */
181 extern void osal_wait_destroy(osal_wait_t *wait);
182 
183 /* workqueue api */
184 typedef struct osal_work_struct {
185     int  queue_flag;
186     void *work;
187     void (*func)(struct osal_work_struct *work);
188 } osal_work_struct_t;
189 typedef void (*osal_work_func_t)(struct osal_work_struct *work);
190 
191 extern int osal_init_work(struct osal_work_struct *work, osal_work_func_t func);
192 
193 #define OSAL_INIT_WORK(_work, _func)      \
194     do {                                  \
195         osal_init_work((_work), (_func)); \
196     } while (0)
197 
198 extern int osal_schedule_work(struct osal_work_struct *work);
199 extern void osal_destroy_work(struct osal_work_struct *work);
200 
201 /* schedule */
202 extern void osal_yield(void);
203 
204 /* interrupt api */
205 enum osal_irqreturn {
206     OSAL_IRQ_NONE = (0 << 0),
207     OSAL_IRQ_HANDLED = (1 << 0),
208     OSAL_IRQ_WAKE_THREAD = (1 << 1),
209 };
210 
211 typedef int (*osal_irq_handler_t)(int, void *);
212 extern int osal_request_irq(unsigned int irq, osal_irq_handler_t handler, osal_irq_handler_t thread_fn,
213                             const char *name, void *dev);
214 extern void osal_free_irq(unsigned int irq, void *dev);
215 extern int osal_in_interrupt(void);
216 
217 #define OSAL_DIS_IRQ_CNT   2
218 typedef void (*osal_gic_handle_t)(unsigned int, unsigned int, void *);
219 extern int osal_register_gic_handle(unsigned int index, unsigned int irq, osal_gic_handle_t handle, const char *name,
220                                     void *dev);
221 extern int osal_unregister_gic_handle(unsigned int index, unsigned int irq, void *dev);
222 
223 /* task api */
224 typedef struct osal_task {
225     void *task_struct;
226 } osal_task_t;
227 typedef int (*threadfn_t)(void *data);
228 extern osal_task_t *osal_kthread_create(threadfn_t thread, void *data, const char *name);
229 extern void osal_kthread_destroy(osal_task_t *task, unsigned int stop_flag);
230 
231 /* string api */
232 extern int osal_strcmp(const char *s1, const char *s2);
233 extern int osal_strncmp(const char *s1, const char *s2, int size);
234 extern int osal_strnicmp(const char *s1, const char *s2, int size);
235 extern int osal_strcasecmp(const char *s1, const char *s2);
236 extern int osal_strncasecmp(const char *s1, const char *s2, int n);
237 extern char *osal_strchr(const char *s, int n);
238 extern char *osal_strnchr(const char *s, int count, int c);
239 extern char *osal_strrchr(const char *s, int c);
240 extern char *osal_strstr(const char *s1, const char *s2);
241 extern char *osal_strnstr(const char *s1, const char *s2, int n);
242 extern int osal_strlen(const char *s);
243 extern int osal_strnlen(const char *s, int size);
244 extern char *osal_strpbrk(const char *s1, const char *s2);
245 extern char *osal_strsep(char **s, const char *ct);
246 extern int osal_strspn(const char *s, const char *accept);
247 extern int osal_strcspn(const char *s, const char *reject);
248 extern void *osal_memscan(void *addr, int c, int size);
249 extern int osal_memcmp(const void *cs, const void *ct, int count);
250 extern void *osal_memchr(const void *s, int c, int n);
251 extern void *osal_memchr_inv(const void *s, int c, int n);
252 
253 extern unsigned long long osal_strtoull(const char *cp, char **endp, unsigned int base);
254 extern unsigned long osal_strtoul(const char *cp, char **endp, unsigned int base);
255 extern long osal_strtol(const char *cp, char **endp, unsigned int base);
256 extern long long osal_strtoll(const char *cp, char **endp, unsigned int base);
257 
258 /* addr translate */
259 extern void *osal_ioremap(unsigned long phys_addr, unsigned long size);
260 extern void *osal_ioremap_nocache(unsigned long phys_addr, unsigned long size);
261 extern void *osal_ioremap_cached(unsigned long phys_addr, unsigned long size);
262 extern void *osal_ioremap_wc(unsigned long phys_addr, unsigned long size);
263 extern void osal_iounmap(void *addr, unsigned long size);
264 
265 #define osal_readl(x) (*((volatile int *)(x)))
266 #define osal_writel(v, x) (*((volatile int *)(x)) = (v))
267 
268 extern unsigned long osal_copy_from_user(void *to, const void *from, unsigned long n);
269 extern unsigned long osal_copy_to_user(void *to, const void *from, unsigned long n);
270 
271 #define OSAL_VERIFY_READ   0
272 #define OSAL_VERIFY_WRITE  1
273 extern int osal_access_ok(int type, const void *addr, unsigned long size);
274 
275 /* cache api */
276 extern void osal_flush_dcache_area(void *kvirt, unsigned long phys_addr, unsigned long length);
277 
278 /* math */
279 extern unsigned long long osal_div_u64(unsigned long long dividend, unsigned int divisor);
280 extern long long osal_div_s64(long long dividend, int divisor);
281 extern unsigned long long osal_div64_u64(unsigned long long dividend, unsigned long long divisor);
282 extern long long osal_div64_s64(long long dividend, long long divisor);
283 extern unsigned long long osal_div_u64_rem(unsigned long long dividend, unsigned int divisor);
284 extern long long osal_div_s64_rem(long long dividend, int divisor);
285 extern unsigned long long osal_div64_u64_rem(unsigned long long dividend, unsigned long long divisor);
286 extern unsigned int osal_random(void);
287 
288 #define osal_max(x, y) ({                            \
289         __typeof__(x) _max1 = (x);                  \
290         __typeof__(y) _max2 = (y);                  \
291         (void) (&_max1 == &_max2);              \
292         _max1 > _max2 ? _max1 : _max2; })
293 
294 #define osal_min(x, y) ({            \
295     __typeof__(x) _min1 = (x);       \
296     __typeof__(y) _min2 = (y);       \
297     (void) (&_min1 == &_min2);       \
298     _min1 < _min2 ? _min1 : _min2; })
299 
300 #define osal_abs(x) ({                \
301     long ret;                         \
302     if (sizeof(x) == sizeof(long)) {  \
303         long __x = (x);               \
304         ret = (__x < 0) ? -__x : __x; \
305     } else {                          \
306         int __x = (x);                \
307         ret = (__x < 0) ? -__x : __x; \
308     }                                 \
309     ret;                              \
310 })
311 
312 /* barrier */
313 extern void osal_mb(void);
314 extern void osal_rmb(void);
315 extern void osal_wmb(void);
316 extern void osal_smp_mb(void);
317 extern void osal_smp_rmb(void);
318 extern void osal_smp_wmb(void);
319 extern void osal_isb(void);
320 extern void osal_dsb(void);
321 extern void osal_dmb(void);
322 
323 /* debug */
324 extern int osal_printk(const char *fmt, ...) __attribute__((format(printf, 1, 2)));
325 extern void osal_panic(const char *fmt, const char *fun, int line, const char *);
326 #define OSAL_BUG() \
327     do {           \
328     } while (1)
329 
330 #define OSAL_ASSERT(expr)                       \
331     do {                                        \
332         if (!(expr)) {                          \
333             osal_printk("\nASSERT failed at:\n" \
334                         "  >Condition: %s\n",   \
335                 #expr);                         \
336             OSAL_BUG();                         \
337         }                                       \
338     } while (0)
339 
340 #define OSAL_BUG_ON(expr)                                                               \
341     do {                                                                                \
342         if (expr) {                                                                     \
343             osal_printk("BUG: failure at %s:%d/%s()!\n", __FILE__, __LINE__, __func__); \
344             OSAL_BUG();                                                                 \
345         }                                                                               \
346     } while (0)
347 
348 #ifdef CONFIG_HI_LOG_TRACE_SUPPORT
349 #define osal_trace osal_printk
350 #else
351 #define osal_trace(str, fmt...)
352 #endif
353 
354 /* proc */
355 #define OSAL_MAX_PROC_NAME_LEN  50
356 typedef struct osal_proc_dir_entry {
357     char name[OSAL_MAX_PROC_NAME_LEN];
358     void *proc_dir_entry;
359     int (*open)(struct osal_proc_dir_entry *entry);
360     int (*read)(struct osal_proc_dir_entry *entry);
361     int (*write)(struct osal_proc_dir_entry *entry, const char *buf, int count, long long *);
362     void *private;
363     void *seqfile;
364     struct osal_list_head node;
365 } osal_proc_entry_t;
366 extern osal_proc_entry_t *osal_create_proc_entry(const char *name, osal_proc_entry_t *parent);
367 extern osal_proc_entry_t *osal_proc_mkdir(const char *name, osal_proc_entry_t *parent);
368 extern void osal_remove_proc_entry(const char *name, osal_proc_entry_t *parent);
369 extern void osal_seq_printf(osal_proc_entry_t *entry, const char *fmt, ...) __attribute__((format(printf, 2, 3)));
370 
371 /* device api */
372 #ifndef _IOC_TYPECHECK
373 #include "osal_ioctl.h"
374 #endif
375 #define OSAL_MAX_DEV_NAME_LEN   48
376 
377 typedef struct osal_dev {
378     struct osal_list_head list;
379     char name[OSAL_MAX_DEV_NAME_LEN];
380     void *dev;
381     unsigned int minor;
382     unsigned int count;
383     struct osal_fileops *fops;
384     struct osal_pmops *osal_pmops;
385 } osal_dev_t;
386 
387 typedef struct osal_vm {
388     void *vm;
389 } osal_vm_t;
390 
391 #define OSAL_POLLIN        0x0001U
392 #define OSAL_POLLPRI       0x0002U
393 #define OSAL_POLLOUT       0x0004U
394 #define OSAL_POLLERR       0x0008U
395 #define OSAL_POLLHUP       0x0010U
396 #define OSAL_POLLNVAL      0x0020U
397 #define OSAL_POLLRDNORM    0x0040U
398 #define OSAL_POLLRDBAND    0x0080U
399 #define OSAL_POLLWRNORM    0x0100U
400 
401 typedef struct osal_poll {
402     void *poll_table;
403     void *data;
404 } osal_poll_t;
405 
406 typedef struct osal_fileops {
407     int (*open)(void *private_data);
408     int (*read)(char *buf, int size, long *offset, void *private_data);
409     int (*write)(const char *buf, int size, long *offset, void *private_data);
410     long (*llseek)(long offset, int whence, void *private_data);
411     int (*release)(void *private_data);
412     long (*unlocked_ioctl)(unsigned int cmd, unsigned long arg, void *private_data);
413     unsigned int (*poll)(osal_poll_t *osal_poll, void *private_data);
414     int (*mmap)(osal_vm_t *vm, unsigned long start, unsigned long end, unsigned long vm_pgoff, void *private_data);
415 #ifdef CONFIG_COMPAT
416     long (*compat_ioctl)(unsigned int cmd, unsigned long arg, void *private_data);
417 #endif
418 } osal_fileops_t;
419 
420 typedef struct osal_pmops {
421     int (*pm_prepare)(osal_dev_t *dev);
422     void (*pm_complete)(osal_dev_t *dev);
423     int (*pm_suspend)(osal_dev_t *dev);
424     int (*pm_resume)(osal_dev_t *dev);
425     int (*pm_freeze)(osal_dev_t *dev);
426     int (*pm_thaw)(osal_dev_t *dev);
427     int (*pm_poweroff)(osal_dev_t *dev);
428     int (*pm_restore)(osal_dev_t *dev);
429     int (*pm_suspend_late)(osal_dev_t *dev);
430     int (*pm_resume_early)(osal_dev_t *dev);
431     int (*pm_freeze_late)(osal_dev_t *dev);
432     int (*pm_thaw_early)(osal_dev_t *dev);
433     int (*pm_poweroff_late)(osal_dev_t *dev);
434     int (*pm_restore_early)(osal_dev_t *dev);
435     int (*pm_suspend_noirq)(osal_dev_t *dev);
436     int (*pm_resume_noirq)(osal_dev_t *dev);
437     int (*pm_freeze_noirq)(osal_dev_t *dev);
438     int (*pm_thaw_noirq)(osal_dev_t *dev);
439     int (*pm_poweroff_noirq)(osal_dev_t *dev);
440     int (*pm_restore_noirq)(osal_dev_t *dev);
441 } osal_pmops_t;
442 
443 #define OSAL_SEEK_SET      0
444 #define OSAL_SEEK_CUR      1
445 #define OSAL_SEEK_END      2
446 
447 extern osal_dev_t *osal_createdev(const char *name);
448 extern int osal_destroydev(osal_dev_t *pdev);
449 extern int osal_registerdevice(osal_dev_t *pdev);
450 extern void osal_deregisterdevice(osal_dev_t *pdev);
451 extern void osal_poll_wait(osal_poll_t *table, osal_wait_t *wait);
452 extern void osal_pgprot_noncached(osal_vm_t *vm);
453 extern void osal_pgprot_cached(osal_vm_t *vm);
454 extern void osal_pgprot_writecombine(osal_vm_t *vm);
455 extern int osal_remap_pfn_range(osal_vm_t *vm, unsigned long addr, unsigned long pfn, unsigned long size);
456 
457 /* timer */
458 typedef struct osal_timer {
459     void *timer;
460     void (*function)(unsigned long);
461     unsigned long data;
462 } osal_timer_t;
463 
464 typedef struct osal_timeval {
465     long tv_sec;
466     long tv_usec;
467 } osal_timeval_t;
468 
469 typedef struct osal_rtc_time {
470     int tm_sec;
471     int tm_min;
472     int tm_hour;
473     int tm_mday;
474     int tm_mon;
475     int tm_year;
476     int tm_wday;
477     int tm_yday;
478     int tm_isdst;
479 } osal_rtc_time_t;
480 
481 /* Return values for the timer callback function */
482 typedef enum hiOSAL_HRTIMER_RESTART_E {
483     OSAL_HRTIMER_NORESTART, /* < The timer will not be restarted. */
484     OSAL_HRTIMER_RESTART /* < The timer must be restarted. */
485 } OSAL_HRTIMER_RESTART_E;
486 
487 /* hrtimer struct */
488 typedef struct osal_hrtimer {
489     void *timer;
490     OSAL_HRTIMER_RESTART_E (*function)(void *timer);
491     unsigned long interval; /* Unit ms */
492 } osal_hrtimer_t;
493 
494 extern int osal_hrtimer_create(osal_hrtimer_t *phrtimer);
495 extern int osal_hrtimer_start(osal_hrtimer_t *phrtimer);
496 extern int osal_hrtimer_destroy(osal_hrtimer_t *phrtimer);
497 
498 extern int osal_timer_init(osal_timer_t *timer);
499 extern int osal_set_timer(osal_timer_t *timer, unsigned long interval);  /* ms */
500 extern unsigned long osal_timer_get_private_data(void *data);
501 extern int osal_del_timer(osal_timer_t *timer);
502 extern int osal_timer_destroy(osal_timer_t *timer);
503 
504 extern unsigned long osal_msleep(unsigned int msecs);
505 extern void osal_udelay(unsigned int usecs);
506 extern void osal_mdelay(unsigned int msecs);
507 
508 extern unsigned int osal_get_tickcount(void);
509 extern unsigned long long osal_sched_clock(void);
510 extern void osal_gettimeofday(osal_timeval_t *tv);
511 extern void osal_rtc_time_to_tm(unsigned long time, osal_rtc_time_t *tm);
512 extern void osal_rtc_tm_to_time(osal_rtc_time_t *tm, unsigned long *time);
513 extern int osal_rtc_valid_tm(struct osal_rtc_time *tm);
514 extern void osal_getjiffies(unsigned long long *pjiffies);
515 
516 #define OSAL_O_ACCMODE     00000003
517 #define OSAL_O_RDONLY      00000000
518 #define OSAL_O_WRONLY      00000001
519 #define OSAL_O_RDWR        00000002
520 #define OSAL_O_CREAT       00000100
521 
522 extern void *osal_klib_fopen(const char *filename, int flags, int mode);
523 extern void osal_klib_fclose(void *filp);
524 extern int osal_klib_fwrite(const char *buf, int len, void *filp);
525 extern int osal_klib_fread(char *buf, unsigned int len, void *filp);
526 
527 /* reboot */
528 struct osal_notifier_block {
529     int (*notifier_call)(struct osal_notifier_block *nb, unsigned long action, void *data);
530     void *notifier_block;
531 };
532 typedef int (*osal_notifier_fn_t)(struct osal_notifier_block *nb, unsigned long action, void *data);
533 
534 extern int osal_register_reboot_notifier(struct osal_notifier_block *nb);
535 extern int osal_unregister_reboot_notifier(struct osal_notifier_block *nb);
536 
537 #include <stdarg.h>
538 
539 #ifndef _OSAL_VA_LIST
540 
541 #define _OSAL_VA_LIST
542 #define osal_va_list       va_list
543 #define osal_va_arg(ap, T) va_arg(ap, T)
544 #define osal_va_end(ap) va_end(ap)
545 #define osal_va_start(ap, A) va_start(ap, A)
546 
547 #endif /* va_arg */
548 
549 #define NULL_STRING        "NULL"
550 
551 extern void osal_vprintk(const char *fmt, osal_va_list args);
552 
553 #define osal_platform_get_module_param(pdev, name, type, value) \
554     osal_platform_get_modparam_##type(pdev, name, value)
555 
556 int osal_platform_get_modparam_uint(void *pdev, const char *name, unsigned int *value);
557 int osal_platform_get_modparam_int(void *pdev, const char *name, int *value);
558 int osal_platform_get_modparam_string(void *pdev, const char *name, unsigned int size, char *value);
559 int osal_platform_get_modparam_uchar(void *pdev, const char *name, unsigned char *value);
560 int osal_platform_get_modparam_ushort(void *pdev, const char *name, unsigned short *value);
561 /* of function */
562 int osal_of_property_read_u32(const void *np, const char *propname, unsigned int *value);
563 
564 int osal_platform_driver_register(void *drv);
565 void osal_platform_driver_unregister(void *drv);
566 void *osal_platform_get_resource_byname(void *dev, unsigned int type,
567                                         const char *name);
568 void *osal_platform_get_resource(void *dev, unsigned int type,
569                                  unsigned int num);
570 int osal_platform_get_irq(void *dev, unsigned int num);
571 int osal_platform_get_irq_byname(void *dev, const char *name);
572 
573 #define osal_module_driver(osal_driver, osal_register, osal_unregister, ...) \
574     static int __init osal_driver##_init(void)                               \
575     {                                                                        \
576         return osal_register(&(osal_driver));                                \
577     }                                                                        \
578     module_init(osal_driver##_init);                                         \
579     static void __exit osal_driver##_exit(void)                              \
580     {                                                                        \
581         osal_unregister(&(osal_driver));                                     \
582     }                                                                        \
583     module_exit(osal_driver##_exit);
584 
585 #define osal_module_platform_driver(platform_driver)                   \
586     osal_module_driver(platform_driver, osal_platform_driver_register, \
587         osal_platform_driver_unregister)
588 
589 /* mmz apis */
590 extern unsigned long long  cmpi_mmz_malloc(const char *mmz_name, const char *buf_name, unsigned long ul_size);
591 extern void cmpi_mmz_free(unsigned long long phy_addr, void *vir_addr);
592 extern int cmpi_mmz_malloc_nocache(const char *cp_mmz_name, const char *buf_name,
593                                    unsigned long long *phy_addr, void **pp_vir_addr, unsigned long ul_len);
594 extern int  cmpi_mmz_malloc_cached(const char *cp_mmz_name, const char *buf_name,
595                                    unsigned long long *phy_addr, void **pp_vir_addr, unsigned long ul_len);
596 extern int cmpi_check_mmz_phy_addr(unsigned long long phy_addr, unsigned int len);
597 
598 void *cmpi_remap_cached(unsigned long long phy_addr, unsigned long ul_size);
599 void *cmpi_remap_nocache(unsigned long long phy_addr, unsigned long ul_size);
600 void cmpi_unmap(void *virt_addr);
601 
602 #ifdef CONFIG_USER_SPACE
603 extern int cmpi_get_fd(void);
604 extern void cmpi_set_fd(int fd);
605 #endif
606 
607 #ifndef IORESOURCE_MEM
608 #define IORESOURCE_MEM  0x00000200
609 #endif
610 
611 #endif /* __HI_OSAL__ */
612