Lines Matching refs:ring
26 /* QXL cmd/ring handling */
37 struct ring {
43 struct ring *ring;
51 void qxl_ring_free(struct qxl_ring *ring)
53 kfree(ring);
56 void qxl_ring_init_hdr(struct qxl_ring *ring)
58 ring->ring->header.notify_on_prod = ring->n_elements;
69 struct qxl_ring *ring;
71 ring = kmalloc(sizeof(*ring), GFP_KERNEL);
72 if (!ring)
75 ring->ring = (struct ring *)header;
76 ring->element_size = element_size;
77 ring->n_elements = n_elements;
78 ring->prod_notify = prod_notify;
79 ring->push_event = push_event;
81 qxl_ring_init_hdr(ring);
82 spin_lock_init(&ring->lock);
83 return ring;
86 static int qxl_check_header(struct qxl_ring *ring)
89 struct qxl_ring_header *header = &(ring->ring->header);
92 spin_lock_irqsave(&ring->lock, flags);
96 spin_unlock_irqrestore(&ring->lock, flags);
100 int qxl_check_idle(struct qxl_ring *ring)
103 struct qxl_ring_header *header = &(ring->ring->header);
106 spin_lock_irqsave(&ring->lock, flags);
108 spin_unlock_irqrestore(&ring->lock, flags);
112 int qxl_ring_push(struct qxl_ring *ring,
115 struct qxl_ring_header *header = &(ring->ring->header);
120 spin_lock_irqsave(&ring->lock, flags);
124 spin_unlock_irqrestore(&ring->lock, flags);
126 while (!qxl_check_header(ring))
130 ret = wait_event_interruptible(*ring->push_event,
131 qxl_check_header(ring));
135 wait_event(*ring->push_event,
136 qxl_check_header(ring));
140 spin_lock_irqsave(&ring->lock, flags);
143 idx = header->prod & (ring->n_elements - 1);
144 elt = ring->ring->elements + idx * ring->element_size;
146 memcpy((void *)elt, new_elt, ring->element_size);
153 outb(0, ring->prod_notify);
155 spin_unlock_irqrestore(&ring->lock, flags);
159 static bool qxl_ring_pop(struct qxl_ring *ring,
162 volatile struct qxl_ring_header *header = &(ring->ring->header);
167 spin_lock_irqsave(&ring->lock, flags);
170 spin_unlock_irqrestore(&ring->lock, flags);
174 idx = header->cons & (ring->n_elements - 1);
175 ring_elt = ring->ring->elements + idx * ring->element_size;
177 memcpy(element, (void *)ring_elt, ring->element_size);
181 spin_unlock_irqrestore(&ring->lock, flags);