/* Cesar project {{{ * * Copyright (C) 2011 Spidcom * * <<>> * * }}} */ /** * \file common/ipmbox/src/queue.c * \brief IPMbox queue management */ #include "common/universe.h" #include "common/ipmbox/queue.h" void ipmbox_queue_copy_to (ipmbox_queue_t *queue, u32 *data, unsigned int size) { u32 *end, *tail; /* Check parameters. */ dbg_claim (queue); dbg_claim (data); dbg_claim (size && size < queue->size); /* Initialize local pointers. */ end = queue->end_ptr; tail = ipmbox_queue_phys_to_virt (queue, queue->ptr->tail); /* Copy each data. */ while (size--) { /* Copy data. */ *tail++ = *data++; /* If we reach end of queue, rollover. */ if (tail == end) tail = queue->base_ptr; } /* Update tail pointer. */ arch_reorder_barrier (); queue->ptr->tail = ipmbox_queue_virt_to_phys (queue, tail); } void ipmbox_queue_copy_from (ipmbox_queue_t *queue, u32 *data, unsigned int size) { u32 *end, *head; /* Check parameters. */ dbg_claim (queue); dbg_claim (data); dbg_claim (size && size < queue->size); /* Initialize local queue pointer. */ head = ipmbox_queue_phys_to_virt (queue, queue->ptr->head); end = queue->end_ptr; /* Get data. */ while (size--) { /* Get data. */ *data++ = *head++; /* If we reach end of queue, rollover. */ if (head == end) head = queue->base_ptr; } /* Update head pointer. */ arch_reorder_barrier (); queue->ptr->head = ipmbox_queue_virt_to_phys (queue, head); }