Lines Matching refs:ring

10 zx_status_t xhci_transfer_ring_init(xhci_transfer_ring_t* ring, zx_handle_t bti_handle, int count) {
11 zx_status_t status = io_buffer_init(&ring->buffer, bti_handle,
16 ring->start = io_buffer_virt(&ring->buffer);
17 ring->current = ring->start;
18 ring->dequeue_ptr = ring->start;
19 ring->full = false;
20 ring->size = count - 1; // subtract 1 for LINK TRB at the end
21 ring->pcs = TRB_C;
24 trb_set_ptr(&ring->start[count - 1], (void *)io_buffer_phys(&ring->buffer));
25 trb_set_control(&ring->start[count - 1], TRB_LINK, TRB_TC);
29 void xhci_transfer_ring_free(xhci_transfer_ring_t* ring) {
30 io_buffer_release(&ring->buffer);
33 // return the number of free TRBs in the ring
34 size_t xhci_transfer_ring_free_trbs(xhci_transfer_ring_t* ring) {
35 xhci_trb_t* current = ring->current;
36 xhci_trb_t* dequeue_ptr = ring->dequeue_ptr;
38 if (ring->full) {
43 int size = ring->size;
53 zx_status_t xhci_event_ring_init(xhci_event_ring_t* ring, zx_handle_t bti_handle,
56 zx_status_t status = io_buffer_init(&ring->buffer, bti_handle,
61 ring->start = io_buffer_virt(&ring->buffer);
62 XHCI_WRITE64(&erst_array[0].ptr, io_buffer_phys(&ring->buffer));
65 ring->current = ring->start;
66 ring->end = ring->start + count;
67 ring->ccs = TRB_C;
71 void xhci_event_ring_free(xhci_event_ring_t* ring) {
72 io_buffer_release(&ring->buffer);
93 void* xhci_read_trb_ptr(xhci_transfer_ring_t* ring, xhci_trb_t* trb) {
96 ptr += ((uint8_t *)io_buffer_virt(&ring->buffer) - (uint8_t *)io_buffer_phys(&ring->buffer));
100 xhci_trb_t* xhci_get_next_trb(xhci_transfer_ring_t* ring, xhci_trb_t* trb) {
104 trb = xhci_read_trb_ptr(ring, trb);
109 void xhci_increment_ring(xhci_transfer_ring_t* ring) {
110 xhci_trb_t* trb = ring->current;
113 if (ring->pcs) {
114 XHCI_WRITE32(&trb->control, control | ring->pcs);
116 trb = ++ring->current;
121 control = (control & ~(TRB_CHAIN | TRB_C)) | chain | ring->pcs;
126 ring->pcs ^= TRB_C;
128 ring->current = xhci_read_trb_ptr(ring, trb);
131 if (ring->current == ring->dequeue_ptr) {
133 // the ring must be full.
134 ring->full = true;
138 void xhci_set_dequeue_ptr(xhci_transfer_ring_t* ring, xhci_trb_t* new_ptr) {
139 ring->dequeue_ptr = new_ptr;
140 ring->full = false;
143 xhci_trb_t* xhci_transfer_ring_phys_to_trb(xhci_transfer_ring_t* ring, zx_paddr_t phys) {
144 zx_paddr_t first_trb_phys = xhci_transfer_ring_start_phys(ring);
146 // ring->size does not include the LINK TRB at the end of the ring.
147 zx_paddr_t last_trb_phys = first_trb_phys + (ring->size * sizeof(xhci_trb_t));
152 return ring->start + ((phys - first_trb_phys) / sizeof(xhci_trb_t));