Lines Matching refs:ivc

74 static inline bool ivc_channel_empty(const struct ivc *ivc,  in ivc_channel_empty()  argument
86 (void)ivc; in ivc_channel_empty()
98 if (((wr_count - rd_count) > ivc->nframes) || (wr_count == rd_count)) { in ivc_channel_empty()
105 static inline bool ivc_channel_full(const struct ivc *ivc, in ivc_channel_full() argument
111 (void)ivc; in ivc_channel_full()
117 return ((wr_count - rd_count) >= ivc->nframes); in ivc_channel_full()
120 static inline uint32_t ivc_channel_avail_count(const struct ivc *ivc, in ivc_channel_avail_count() argument
126 (void)ivc; in ivc_channel_avail_count()
137 static inline void ivc_advance_tx(struct ivc *ivc) in ivc_advance_tx() argument
139 ivc->tx_channel->w_count++; in ivc_advance_tx()
141 if (ivc->w_pos == (ivc->nframes - (uint32_t)1U)) { in ivc_advance_tx()
142 ivc->w_pos = 0U; in ivc_advance_tx()
144 ivc->w_pos++; in ivc_advance_tx()
148 static inline void ivc_advance_rx(struct ivc *ivc) in ivc_advance_rx() argument
150 ivc->rx_channel->r_count++; in ivc_advance_rx()
152 if (ivc->r_pos == (ivc->nframes - (uint32_t)1U)) { in ivc_advance_rx()
153 ivc->r_pos = 0U; in ivc_advance_rx()
155 ivc->r_pos++; in ivc_advance_rx()
159 static inline int32_t ivc_check_read(const struct ivc *ivc) in ivc_check_read() argument
169 if (ivc->tx_channel->state != ivc_state_established) { in ivc_check_read()
179 if (!ivc_channel_empty(ivc, ivc->rx_channel)) { in ivc_check_read()
183 return ivc_channel_empty(ivc, ivc->rx_channel) ? -ENOMEM : 0; in ivc_check_read()
186 static inline int32_t ivc_check_write(const struct ivc *ivc) in ivc_check_write() argument
188 if (ivc->tx_channel->state != ivc_state_established) { in ivc_check_write()
192 if (!ivc_channel_full(ivc, ivc->tx_channel)) { in ivc_check_write()
196 return ivc_channel_full(ivc, ivc->tx_channel) ? -ENOMEM : 0; in ivc_check_write()
199 bool tegra_ivc_can_read(const struct ivc *ivc) in tegra_ivc_can_read() argument
201 return ivc_check_read(ivc) == 0; in tegra_ivc_can_read()
204 bool tegra_ivc_can_write(const struct ivc *ivc) in tegra_ivc_can_write() argument
206 return ivc_check_write(ivc) == 0; in tegra_ivc_can_write()
209 bool tegra_ivc_tx_empty(const struct ivc *ivc) in tegra_ivc_tx_empty() argument
211 return ivc_channel_empty(ivc, ivc->tx_channel); in tegra_ivc_tx_empty()
221 static void *ivc_frame_pointer(const struct ivc *ivc, in ivc_frame_pointer() argument
225 assert(frame < ivc->nframes); in ivc_frame_pointer()
227 calc_frame_offset(frame, ivc->frame_size, 0)); in ivc_frame_pointer()
230 int32_t tegra_ivc_read(struct ivc *ivc, void *buf, size_t max_read) in tegra_ivc_read() argument
239 if (max_read > ivc->frame_size) { in tegra_ivc_read()
243 result = ivc_check_read(ivc); in tegra_ivc_read()
254 src = ivc_frame_pointer(ivc, ivc->rx_channel, ivc->r_pos); in tegra_ivc_read()
258 ivc_advance_rx(ivc); in tegra_ivc_read()
270 if (ivc_channel_avail_count(ivc, ivc->rx_channel) == (ivc->nframes - (uint32_t)1U)) { in tegra_ivc_read()
271 ivc->notify(ivc); in tegra_ivc_read()
278 void *tegra_ivc_read_get_next_frame(const struct ivc *ivc) in tegra_ivc_read_get_next_frame() argument
280 if (ivc_check_read(ivc) != 0) { in tegra_ivc_read_get_next_frame()
290 return ivc_frame_pointer(ivc, ivc->rx_channel, ivc->r_pos); in tegra_ivc_read_get_next_frame()
293 int32_t tegra_ivc_read_advance(struct ivc *ivc) in tegra_ivc_read_advance() argument
300 int32_t result = ivc_check_read(ivc); in tegra_ivc_read_advance()
305 ivc_advance_rx(ivc); in tegra_ivc_read_advance()
317 if (ivc_channel_avail_count(ivc, ivc->rx_channel) == (ivc->nframes - (uint32_t)1U)) { in tegra_ivc_read_advance()
318 ivc->notify(ivc); in tegra_ivc_read_advance()
324 int32_t tegra_ivc_write(struct ivc *ivc, const void *buf, size_t size) in tegra_ivc_write() argument
329 if ((buf == NULL) || (ivc == NULL)) { in tegra_ivc_write()
333 if (size > ivc->frame_size) { in tegra_ivc_write()
337 result = ivc_check_write(ivc); in tegra_ivc_write()
342 p = ivc_frame_pointer(ivc, ivc->tx_channel, ivc->w_pos); in tegra_ivc_write()
344 (void)memset(p, 0, ivc->frame_size); in tegra_ivc_write()
353 ivc_advance_tx(ivc); in tegra_ivc_write()
365 if (ivc_channel_avail_count(ivc, ivc->tx_channel) == 1U) { in tegra_ivc_write()
366 ivc->notify(ivc); in tegra_ivc_write()
373 void *tegra_ivc_write_get_next_frame(const struct ivc *ivc) in tegra_ivc_write_get_next_frame() argument
375 if (ivc_check_write(ivc) != 0) { in tegra_ivc_write_get_next_frame()
379 return ivc_frame_pointer(ivc, ivc->tx_channel, ivc->w_pos); in tegra_ivc_write_get_next_frame()
383 int32_t tegra_ivc_write_advance(struct ivc *ivc) in tegra_ivc_write_advance() argument
385 int32_t result = ivc_check_write(ivc); in tegra_ivc_write_advance()
396 ivc_advance_tx(ivc); in tegra_ivc_write_advance()
408 if (ivc_channel_avail_count(ivc, ivc->tx_channel) == (uint32_t)1U) { in tegra_ivc_write_advance()
409 ivc->notify(ivc); in tegra_ivc_write_advance()
415 void tegra_ivc_channel_reset(const struct ivc *ivc) in tegra_ivc_channel_reset() argument
417 ivc->tx_channel->state = ivc_state_sync; in tegra_ivc_channel_reset()
418 ivc->notify(ivc); in tegra_ivc_channel_reset()
440 int32_t tegra_ivc_channel_notified(struct ivc *ivc) in tegra_ivc_channel_notified() argument
445 peer_state = ivc->rx_channel->state; in tegra_ivc_channel_notified()
459 ivc->tx_channel->w_count = 0U; in tegra_ivc_channel_notified()
460 ivc->rx_channel->r_count = 0U; in tegra_ivc_channel_notified()
462 ivc->w_pos = 0U; in tegra_ivc_channel_notified()
463 ivc->r_pos = 0U; in tegra_ivc_channel_notified()
475 ivc->tx_channel->state = ivc_state_ack; in tegra_ivc_channel_notified()
480 ivc->notify(ivc); in tegra_ivc_channel_notified()
482 } else if ((ivc->tx_channel->state == (uint32_t)ivc_state_sync) && in tegra_ivc_channel_notified()
495 ivc->tx_channel->w_count = 0U; in tegra_ivc_channel_notified()
496 ivc->rx_channel->r_count = 0U; in tegra_ivc_channel_notified()
498 ivc->w_pos = 0U; in tegra_ivc_channel_notified()
499 ivc->r_pos = 0U; in tegra_ivc_channel_notified()
512 ivc->tx_channel->state = ivc_state_established; in tegra_ivc_channel_notified()
517 ivc->notify(ivc); in tegra_ivc_channel_notified()
519 } else if (ivc->tx_channel->state == (uint32_t)ivc_state_ack) { in tegra_ivc_channel_notified()
533 ivc->tx_channel->state = ivc_state_established; in tegra_ivc_channel_notified()
538 ivc->notify(ivc); in tegra_ivc_channel_notified()
549 return ((ivc->tx_channel->state == (uint32_t)ivc_state_established) ? 0 : -EAGAIN); in tegra_ivc_channel_notified()
619 int32_t tegra_ivc_init(struct ivc *ivc, uintptr_t rx_base, uintptr_t tx_base, in tegra_ivc_init() argument
626 if ((ivc == NULL) || (notify == NULL)) { in tegra_ivc_init()
643 ivc->rx_channel = (struct ivc_channel_header *)rx_base; in tegra_ivc_init()
644 ivc->tx_channel = (struct ivc_channel_header *)tx_base; in tegra_ivc_init()
645 ivc->notify = notify; in tegra_ivc_init()
646 ivc->frame_size = frame_size; in tegra_ivc_init()
647 ivc->nframes = nframes; in tegra_ivc_init()
648 ivc->w_pos = 0U; in tegra_ivc_init()
649 ivc->r_pos = 0U; in tegra_ivc_init()