Lines Matching full:rb
30 * @rb: ring buffer
36 void scif_rb_init(struct scif_rb *rb, u32 *read_ptr, u32 *write_ptr, in scif_rb_init() argument
39 rb->rb_base = rb_base; in scif_rb_init()
40 rb->size = (1 << size); in scif_rb_init()
41 rb->read_ptr = read_ptr; in scif_rb_init()
42 rb->write_ptr = write_ptr; in scif_rb_init()
43 rb->current_read_offset = *read_ptr; in scif_rb_init()
44 rb->current_write_offset = *write_ptr; in scif_rb_init()
48 static void memcpy_torb(struct scif_rb *rb, void *header, in memcpy_torb() argument
53 if (header + size >= rb->rb_base + rb->size) { in memcpy_torb()
55 size1 = (u32)(rb->rb_base + rb->size - header); in memcpy_torb()
58 memcpy_toio((void __iomem __force *)rb->rb_base, in memcpy_torb()
66 static void memcpy_fromrb(struct scif_rb *rb, void *header, in memcpy_fromrb() argument
71 if (header + size >= rb->rb_base + rb->size) { in memcpy_fromrb()
73 size1 = (u32)(rb->rb_base + rb->size - header); in memcpy_fromrb()
77 (void __iomem __force *)rb->rb_base, size2); in memcpy_fromrb()
84 * scif_rb_space - Query space available for writing to the RB
85 * @rb: ring buffer
87 * Return: size available for writing to RB in bytes.
89 u32 scif_rb_space(struct scif_rb *rb) in scif_rb_space() argument
91 rb->current_read_offset = *rb->read_ptr; in scif_rb_space()
98 return scif_rb_ring_space(rb->current_write_offset, in scif_rb_space()
99 rb->current_read_offset, rb->size); in scif_rb_space()
103 * scif_rb_write - Write a message to the RB
104 * @rb: ring buffer
106 * @size: the size (in bytes) to be copied to the RB
108 * This API does not block if there isn't enough space in the RB.
111 int scif_rb_write(struct scif_rb *rb, void *msg, u32 size) in scif_rb_write() argument
115 if (scif_rb_space(rb) < size) in scif_rb_write()
117 header = rb->rb_base + rb->current_write_offset; in scif_rb_write()
118 memcpy_torb(rb, header, msg, size); in scif_rb_write()
123 rb->current_write_offset = in scif_rb_write()
124 (rb->current_write_offset + size) & (rb->size - 1); in scif_rb_write()
130 * @rb: ring buffer
132 void scif_rb_commit(struct scif_rb *rb) in scif_rb_commit() argument
141 WRITE_ONCE(*rb->write_ptr, rb->current_write_offset); in scif_rb_commit()
150 WRITE_ONCE(*rb->write_ptr, rb->current_write_offset); in scif_rb_commit()
156 * @rb: ring buffer
162 static void *scif_rb_get(struct scif_rb *rb, u32 size) in scif_rb_get() argument
166 if (scif_rb_count(rb, size) >= size) in scif_rb_get()
167 header = rb->rb_base + rb->current_read_offset; in scif_rb_get()
173 * @rb: ring buffer
180 u32 scif_rb_get_next(struct scif_rb *rb, void *msg, u32 size) in scif_rb_get_next() argument
185 header = scif_rb_get(rb, size); in scif_rb_get_next()
188 (rb->current_read_offset + size) & (rb->size - 1); in scif_rb_get_next()
191 rb->current_read_offset = next_cmd_offset; in scif_rb_get_next()
192 memcpy_fromrb(rb, header, msg, size); in scif_rb_get_next()
199 * @rb: ring buffer
201 void scif_rb_update_read_ptr(struct scif_rb *rb) in scif_rb_update_read_ptr() argument
205 new_offset = rb->current_read_offset; in scif_rb_update_read_ptr()
213 WRITE_ONCE(*rb->read_ptr, new_offset); in scif_rb_update_read_ptr()
222 WRITE_ONCE(*rb->read_ptr, new_offset); in scif_rb_update_read_ptr()
228 * @rb: ring buffer
231 * Return: number of bytes that can be read from the RB
233 u32 scif_rb_count(struct scif_rb *rb, u32 size) in scif_rb_count() argument
235 if (scif_rb_ring_cnt(rb->current_write_offset, in scif_rb_count()
236 rb->current_read_offset, in scif_rb_count()
237 rb->size) < size) { in scif_rb_count()
238 rb->current_write_offset = *rb->write_ptr; in scif_rb_count()
246 return scif_rb_ring_cnt(rb->current_write_offset, in scif_rb_count()
247 rb->current_read_offset, in scif_rb_count()
248 rb->size); in scif_rb_count()