source: mainline/uspace/drv/bus/usb/xhci/trb_ring.h@ 5cbccd4

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 5cbccd4 was f4eb6c93, checked in by Ondřej Hlavatý <aearsis@…>, 8 years ago

xhci: hardware data structures and trb ring management

  • Property mode set to 100644
File size: 3.5 KB
Line 
1/*
2 * Copyright (c) 2017 Ondrej Hlavaty
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @addtogroup drvusbxhci
30 * @{
31 */
32/** @file
33 * TRB Ring is a data structure for communication between HC and software.
34 *
35 * Despite this description, it is not used as an hardware structure - all but
36 * the Event ring is used as buffer of the TRBs itself, linked by Link TRB to
37 * form a (possibly multi-segment) circular buffer.
38 *
39 * This data structure abstracts this behavior.
40 */
41
42#ifndef XHCI_TRB_RING_H
43#define XHCI_TRB_RING_H
44
45#include <adt/list.h>
46#include <libarch/config.h>
47#include "hw_struct/trb.h"
48
49typedef struct trb_segment trb_segment_t;
50
51/**
52 * A TRB ring of which the software is a producer - command / transfer.
53 */
54typedef struct xhci_trb_ring {
55 list_t segments; /* List of assigned segments */
56
57 /*
58 * As the link TRBs connect physical addresses, we need to keep track of
59 * active segment in virtual memory. The enqueue ptr should always belong
60 * to the enqueue segment.
61 */
62 trb_segment_t *enqueue_segment;
63 xhci_trb_t *enqueue_trb;
64
65 uintptr_t dequeue; /* Last reported position of the dequeue pointer */
66 bool pcs; /* Producer Cycle State: section 4.9.2 */
67} xhci_trb_ring_t;
68
69/**
70 * Initializes the ring.
71 * Allocates one page as the first segment.
72 */
73int trb_ring_init(xhci_trb_ring_t *ring);
74int trb_ring_fini(xhci_trb_ring_t *ring);
75
76/**
77 * Enqueue a TD composed of TRBs.
78 *
79 * This will copy all TRBs chained together into the ring. The cycle flag in
80 * TRBs may be changed.
81 *
82 * The chained TRBs must be contiguous in memory, and must not contain Link TRBs.
83 *
84 * We cannot avoid the copying, because the TRB in ring should be updated atomically.
85 *
86 * @param td the first TRB of TD
87 * @return EOK on success,
88 * EAGAIN when the ring is too full to fit all TRBs (temporary)
89 */
90int trb_ring_enqueue(xhci_trb_ring_t *ring, xhci_trb_t *td);
91
92/**
93 * When an event is received by the upper layer, it needs to update the dequeue
94 * pointer inside the ring. Otherwise, the ring will soon show up as full.
95 */
96void trb_ring_update_dequeue(xhci_trb_ring_t *ring, uintptr_t dequeue);
97
98
99#endif
Note: See TracBrowser for help on using the repository browser.