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);
63 struct qxl_ring *ring;
65 ring = kmalloc(sizeof(*ring), GFP_KERNEL);
66 if (!ring)
69 ring->ring = (struct ring *)header;
70 ring->element_size = element_size;
71 ring->n_elements = n_elements;
72 ring->prod_notify = prod_notify;
73 ring->push_event = push_event;
74 spin_lock_init(&ring->lock);
75 return ring;
78 static int qxl_check_header(struct qxl_ring *ring)
81 struct qxl_ring_header *header = &(ring->ring->header);
84 spin_lock_irqsave(&ring->lock, flags);
88 spin_unlock_irqrestore(&ring->lock, flags);
92 int qxl_check_idle(struct qxl_ring *ring)
95 struct qxl_ring_header *header = &(ring->ring->header);
98 spin_lock_irqsave(&ring->lock, flags);
100 spin_unlock_irqrestore(&ring->lock, flags);
104 int qxl_ring_push(struct qxl_ring *ring,
107 struct qxl_ring_header *header = &(ring->ring->header);
112 spin_lock_irqsave(&ring->lock, flags);
116 spin_unlock_irqrestore(&ring->lock, flags);
118 while (!qxl_check_header(ring))
122 ret = wait_event_interruptible(*ring->push_event,
123 qxl_check_header(ring));
127 wait_event(*ring->push_event,
128 qxl_check_header(ring));
132 spin_lock_irqsave(&ring->lock, flags);
135 idx = header->prod & (ring->n_elements - 1);
136 elt = ring->ring->elements + idx * ring->element_size;
138 memcpy((void *)elt, new_elt, ring->element_size);
145 outb(0, ring->prod_notify);
147 spin_unlock_irqrestore(&ring->lock, flags);
151 static bool qxl_ring_pop(struct qxl_ring *ring,
154 volatile struct qxl_ring_header *header = &(ring->ring->header);
159 spin_lock_irqsave(&ring->lock, flags);
162 spin_unlock_irqrestore(&ring->lock, flags);
166 idx = header->cons & (ring->n_elements - 1);
167 ring_elt = ring->ring->elements + idx * ring->element_size;
169 memcpy(element, (void *)ring_elt, ring->element_size);
173 spin_unlock_irqrestore(&ring->lock, flags);