1 /* The industrial I/O simple minimally locked ring buffer.
3 * Copyright (c) 2008 Jonathan Cameron
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 as published by
7 * the Free Software Foundation.
9 * This code is deliberately kept separate from the main industrialio I/O core
10 * as it is intended that in the future a number of different software ring
11 * buffer implementations will exist with different characteristics to suit
12 * different applications.
14 * This particular one was designed for a data capture application where it was
15 * particularly important that no userspace reads would interrupt the capture
16 * process. To this end the ring is not locked during a read.
18 * Comments on this buffer design welcomed. It's far from efficient and some of
19 * my understanding of the effects of scheduling on this are somewhat limited.
20 * Frankly, to my mind, this is the current weak point in the industrial I/O
24 #ifndef _IIO_RING_SW_H_
25 #define _IIO_RING_SW_H_
27 /* The intention is that this should be a separate module from the iio core.
28 * This is a bit like supporting algorithms dependent on what the device
29 * driver requests - some may support multiple options */
32 #include <linux/autoconf.h>
34 #include "ring_generic.h"
36 #if defined CONFIG_IIO_SW_RING || defined CONFIG_IIO_SW_RING_MODULE
39 * iio_create_sw_rb() software ring buffer allocation
40 * @r: pointer to ring buffer pointer
42 int iio_create_sw_rb(struct iio_ring_buffer
**r
);
45 * iio_init_sw_rb() initialize the software ring buffer
46 * @r: pointer to a software ring buffer created by an
47 * iio_create_sw_rb call.
49 int iio_init_sw_rb(struct iio_ring_buffer
*r
, struct iio_dev
*indio_dev
);
51 * iio_exit_sw_rb() reverse what was done in iio_init_sw_rb
53 void iio_exit_sw_rb(struct iio_ring_buffer
*r
);
56 * iio_free_sw_rb() free memory occupied by the core ring buffer struct
58 void iio_free_sw_rb(struct iio_ring_buffer
*r
);
61 * iio_mark_sw_rb_in_use() reference counting to prevent incorrect chances
63 void iio_mark_sw_rb_in_use(struct iio_ring_buffer
*r
);
66 * iio_unmark_sw_rb_in_use() notify the ring buffer that we don't care anymore
68 void iio_unmark_sw_rb_in_use(struct iio_ring_buffer
*r
);
71 * iio_read_last_from_sw_rb() attempt to read the last stored datum from the rb
73 int iio_read_last_from_sw_rb(struct iio_ring_buffer
*r
, u8
*data
);
76 * iio_store_to_sw_rb() store a new datum to the ring buffer
77 * @rb: pointer to ring buffer instance
78 * @data: the datum to be stored including timestamp if relevant.
79 * @timestamp: timestamp which will be attached to buffer events if relevant.
81 int iio_store_to_sw_rb(struct iio_ring_buffer
*r
, u8
*data
, s64 timestamp
);
84 * iio_rip_sw_rb() attempt to read data from the ring buffer
85 * @r: ring buffer instance
86 * @count: number of datum's to try and read
87 * @data: where the data will be stored.
88 * @dead_offset: how much of the stored data was possibly invalidated by
89 * the end of the copy.
91 int iio_rip_sw_rb(struct iio_ring_buffer
*r
,
97 * iio_request_update_sw_rb() update params if update needed
99 int iio_request_update_sw_rb(struct iio_ring_buffer
*r
);
102 * iio_mark_update_needed_sw_rb() tell the ring buffer it needs a param update
104 int iio_mark_update_needed_sw_rb(struct iio_ring_buffer
*r
);
108 * iio_get_bpd_sw_rb() get the datum size in bytes
110 int iio_get_bpd_sw_rb(struct iio_ring_buffer
*r
);
113 * iio_set_bpd_sw_rb() set the datum size in bytes
115 int iio_set_bpd_sw_rb(struct iio_ring_buffer
*r
, size_t bpd
);
118 * iio_get_length_sw_rb() get how many datums the rb may contain
120 int iio_get_length_sw_rb(struct iio_ring_buffer
*r
);
123 * iio_set_length_sw_rb() set how many datums the rb may contain
125 int iio_set_length_sw_rb(struct iio_ring_buffer
*r
, int length
);
128 * iio_ring_sw_register_funcs() helper function to set up rb access
130 static inline void iio_ring_sw_register_funcs(struct iio_ring_access_funcs
*ra
)
132 ra
->mark_in_use
= &iio_mark_sw_rb_in_use
;
133 ra
->unmark_in_use
= &iio_unmark_sw_rb_in_use
;
135 ra
->store_to
= &iio_store_to_sw_rb
;
136 ra
->read_last
= &iio_read_last_from_sw_rb
;
137 ra
->rip_lots
= &iio_rip_sw_rb
;
139 ra
->mark_param_change
= &iio_mark_update_needed_sw_rb
;
140 ra
->request_update
= &iio_request_update_sw_rb
;
142 ra
->get_bpd
= &iio_get_bpd_sw_rb
;
143 ra
->set_bpd
= &iio_set_bpd_sw_rb
;
145 ra
->get_length
= &iio_get_length_sw_rb
;
146 ra
->set_length
= &iio_set_length_sw_rb
;
150 * struct iio_sw_ring_buffer - software ring buffer
151 * @buf: generic ring buffer elements
152 * @data: the ring buffer memory
153 * @read_p: read pointer (oldest available)
154 * @write_p: write pointer
155 * @last_written_p: read pointer (newest available)
156 * @half_p: half buffer length behind write_p (event generation)
157 * @use_count: reference count to prevent resizing when in use
158 * @update_needed: flag to indicated change in size requested
159 * @use_lock: lock to prevent change in size when in use
161 * Note that the first element of all ring buffers must be a
162 * struct iio_ring_buffer.
165 struct iio_sw_ring_buffer
{
166 struct iio_ring_buffer buf
;
168 unsigned char *read_p
;
169 unsigned char *write_p
;
170 unsigned char *last_written_p
;
171 /* used to act as a point at which to signal an event */
172 unsigned char *half_p
;
178 #define iio_to_sw_ring(r) container_of(r, struct iio_sw_ring_buffer, buf)
180 struct iio_ring_buffer
*iio_sw_rb_allocate(struct iio_dev
*indio_dev
);
181 void iio_sw_rb_free(struct iio_ring_buffer
*ring
);
185 #else /* CONFIG_IIO_RING_BUFFER*/
186 static inline void iio_ring_sw_register_funcs(struct iio_ring_access_funcs
*ra
)
188 #endif /* !CONFIG_IIO_RING_BUFFER */
189 #endif /* _IIO_RING_SW_H_ */