Merge branch 'vendor/LIBRESSL'
[dragonfly.git] / sys / dev / sound / clone.h
1 /*-
2  * Copyright (c) 2007 Ariff Abdullah <ariff@FreeBSD.org>
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  *
26  * $FreeBSD: head/sys/dev/sound/clone.h 170719 2007-06-14 11:10:21Z ariff $
27  */
28
29 #ifndef _SND_CLONE_H_
30 #define _SND_CLONE_H_
31
32 struct snd_clone_entry;
33 struct snd_clone;
34
35 /*
36  * 750 milisecond default deadline. Short enough to not cause excessive
37  * garbage collection, long enough to indicate stalled VFS.
38  */
39 #define SND_CLONE_DEADLINE_DEFAULT      750
40
41 /*
42  * Fit within 24bit MAXMINOR.  In DragonFly the minor mask
43  * is 0xffff00ff so set this to something that won't mess up.
44  * (the assertions should just be removed, frankly).
45  */
46 #define SND_CLONE_MAXUNIT               0xffffffff
47
48 /*
49  * Creation flags, mostly related to the behaviour of garbage collector.
50  *
51  * SND_CLONE_ENABLE     - Enable clone allocation.
52  * SND_CLONE_GC_ENABLE  - Enable garbage collector operation, automatically
53  *                        or if explicitly called upon.
54  * SND_CLONE_GC_UNREF   - Garbage collect during unref operation.
55  * SND_CLONE_GC_LASTREF - Garbage collect during last reference
56  *                        (refcount = 0)
57  * SND_CLONE_GC_EXPIRED - Don't garbage collect unless the global clone
58  *                        handler has been expired.
59  * SND_CLONE_GC_REVOKE  - Revoke clone invocation status which has been
60  *                        expired instead of removing and freeing it.
61  * SND_CLONE_WAITOK     - malloc() is allowed to sleep while allocating
62  *                        clone entry.
63  */
64 #define SND_CLONE_ENABLE        0x00000001
65 #define SND_CLONE_GC_ENABLE     0x00000002
66 #define SND_CLONE_GC_UNREF      0x00000004
67 #define SND_CLONE_GC_LASTREF    0x00000008
68 #define SND_CLONE_GC_EXPIRED    0x00000010
69 #define SND_CLONE_GC_REVOKE     0x00000020
70 #define SND_CLONE_WAITOK        0x80000000
71
72 #define SND_CLONE_GC_MASK       (SND_CLONE_GC_ENABLE  |                 \
73                                  SND_CLONE_GC_UNREF   |                 \
74                                  SND_CLONE_GC_LASTREF |                 \
75                                  SND_CLONE_GC_EXPIRED |                 \
76                                  SND_CLONE_GC_REVOKE)
77
78 #define SND_CLONE_MASK          (SND_CLONE_ENABLE | SND_CLONE_GC_MASK | \
79                                  SND_CLONE_WAITOK)
80
81 /*
82  * Runtime clone device flags
83  *
84  * These are mostly private to the clone manager operation:
85  *
86  * SND_CLONE_NEW    - New clone allocation in progress.
87  * SND_CLONE_INVOKE - Cloning being invoked, waiting for next VFS operation.
88  * SND_CLONE_BUSY   - In progress, being referenced by living thread/proc.
89  */
90 #define SND_CLONE_NEW           0x00000001
91 #define SND_CLONE_INVOKE        0x00000002
92 #define SND_CLONE_BUSY          0x00000004
93
94 /*
95  * Nothing important, just for convenience.
96  */
97 #define SND_CLONE_ALLOC         (SND_CLONE_NEW | SND_CLONE_INVOKE |     \
98                                  SND_CLONE_BUSY)
99
100 #define SND_CLONE_DEVMASK       SND_CLONE_ALLOC
101
102
103 void snd_timestamp(struct timespec *);
104
105 struct snd_clone *snd_clone_create(int, int, int, uint32_t);
106 int snd_clone_busy(struct snd_clone *);
107 int snd_clone_enable(struct snd_clone *);
108 int snd_clone_disable(struct snd_clone *);
109 int snd_clone_getsize(struct snd_clone *);
110 int snd_clone_getmaxunit(struct snd_clone *);
111 int snd_clone_setmaxunit(struct snd_clone *, int);
112 int snd_clone_getdeadline(struct snd_clone *);
113 int snd_clone_setdeadline(struct snd_clone *, int);
114 int snd_clone_gettime(struct snd_clone *, struct timespec *);
115 uint32_t snd_clone_getflags(struct snd_clone *);
116 uint32_t snd_clone_setflags(struct snd_clone *, uint32_t);
117 int snd_clone_getdevtime(struct cdev *, struct timespec *);
118 uint32_t snd_clone_getdevflags(struct cdev *);
119 uint32_t snd_clone_setdevflags(struct cdev *, uint32_t);
120 int snd_clone_gc(struct snd_clone *);
121 void snd_clone_destroy(struct snd_clone *);
122 int snd_clone_acquire(struct cdev *);
123 int snd_clone_release(struct cdev *);
124 int snd_clone_ref(struct cdev *);
125 int snd_clone_unref(struct cdev *);
126 void snd_clone_register(struct snd_clone_entry *, struct cdev *);
127 struct snd_clone_entry *snd_clone_alloc(struct snd_clone *, struct cdev **,
128     int *, int);
129
130 #define snd_clone_enabled(x)    ((x) != NULL &&                         \
131                                 (snd_clone_getflags(x) & SND_CLONE_ENABLE))
132 #define snd_clone_disabled(x)   (!snd_clone_enabled(x))
133
134 #endif /* !_SND_CLONE_H */