be289f3d1d0d7a7f09d83b498b405c3aa271062f
[dragonfly.git] / sys / bus / u4b / controller / ohci.h
1 /*-
2  * Copyright (c) 1998 The NetBSD Foundation, Inc.
3  * All rights reserved.
4  *
5  * This code is derived from software contributed to The NetBSD Foundation
6  * by Lennart Augustsson (lennart@augustsson.net) at
7  * Carlstedt Research & Technology.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in the
16  *    documentation and/or other materials provided with the distribution.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
19  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
20  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
22  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28  * POSSIBILITY OF SUCH DAMAGE.
29  */
30
31 #ifndef _OHCI_H_
32 #define _OHCI_H_
33
34 #define OHCI_MAX_DEVICES MIN(USB_MAX_DEVICES, 128)
35
36 #define OHCI_NO_INTRS           32
37 #define OHCI_HCCA_SIZE          256
38
39 /* Structures alignment (bytes) */
40 #define OHCI_HCCA_ALIGN         256
41 #define OHCI_ED_ALIGN           16
42 #define OHCI_TD_ALIGN           16
43 #define OHCI_ITD_ALIGN          32
44
45 #define OHCI_PAGE_SIZE          0x1000
46 #define OHCI_PAGE(x)            ((x) &~ 0xfff)
47 #define OHCI_PAGE_OFFSET(x)     ((x) & 0xfff)
48 #define OHCI_PAGE_MASK(x)       ((x) & 0xfff)
49
50 #if     ((USB_PAGE_SIZE < OHCI_ED_ALIGN) || (OHCI_ED_ALIGN == 0) ||     \
51         (USB_PAGE_SIZE < OHCI_TD_ALIGN) || (OHCI_TD_ALIGN == 0) ||      \
52         (USB_PAGE_SIZE < OHCI_ITD_ALIGN) || (OHCI_ITD_ALIGN == 0) ||    \
53         (USB_PAGE_SIZE < OHCI_PAGE_SIZE) || (OHCI_PAGE_SIZE == 0))
54 #error  "Invalid USB page size!"
55 #endif
56
57 #define OHCI_VIRTUAL_FRAMELIST_COUNT 128/* dummy */
58
59 #if (OHCI_VIRTUAL_FRAMELIST_COUNT < USB_MAX_FS_ISOC_FRAMES_PER_XFER)
60 #error "maximum number of full-speed isochronous frames is higher than supported!"
61 #endif
62
63 struct ohci_hcca {
64         volatile uint32_t hcca_interrupt_table[OHCI_NO_INTRS];
65         volatile uint32_t hcca_frame_number;
66         volatile uint32_t hcca_done_head;
67 #define OHCI_DONE_INTRS         1
68 } __aligned(OHCI_HCCA_ALIGN);
69
70 typedef struct ohci_hcca ohci_hcca_t;
71
72 struct ohci_ed {
73         volatile uint32_t ed_flags;
74 #define OHCI_ED_GET_FA(s)       ((s) & 0x7f)
75 #define OHCI_ED_ADDRMASK        0x0000007f
76 #define OHCI_ED_SET_FA(s)       (s)
77 #define OHCI_ED_GET_EN(s)       (((s) >> 7) & 0xf)
78 #define OHCI_ED_SET_EN(s)       ((s) << 7)
79 #define OHCI_ED_DIR_MASK        0x00001800
80 #define OHCI_ED_DIR_TD          0x00000000
81 #define OHCI_ED_DIR_OUT         0x00000800
82 #define OHCI_ED_DIR_IN          0x00001000
83 #define OHCI_ED_SPEED           0x00002000
84 #define OHCI_ED_SKIP            0x00004000
85 #define OHCI_ED_FORMAT_GEN      0x00000000
86 #define OHCI_ED_FORMAT_ISO      0x00008000
87 #define OHCI_ED_GET_MAXP(s)     (((s) >> 16) & 0x07ff)
88 #define OHCI_ED_SET_MAXP(s)     ((s) << 16)
89 #define OHCI_ED_MAXPMASK        (0x7ff << 16)
90         volatile uint32_t ed_tailp;
91         volatile uint32_t ed_headp;
92 #define OHCI_HALTED             0x00000001
93 #define OHCI_TOGGLECARRY        0x00000002
94 #define OHCI_HEADMASK           0xfffffffc
95         volatile uint32_t ed_next;
96 /*
97  * Extra information needed:
98  */
99         struct ohci_ed *next;
100         struct ohci_ed *prev;
101         struct ohci_ed *obj_next;
102         struct usb_page_cache *page_cache;
103         uint32_t ed_self;
104 } __aligned(OHCI_ED_ALIGN);
105
106 typedef struct ohci_ed ohci_ed_t;
107
108 struct ohci_td {
109         volatile uint32_t td_flags;
110 #define OHCI_TD_R               0x00040000      /* Buffer Rounding  */
111 #define OHCI_TD_DP_MASK         0x00180000      /* Direction / PID */
112 #define OHCI_TD_SETUP           0x00000000
113 #define OHCI_TD_OUT             0x00080000
114 #define OHCI_TD_IN              0x00100000
115 #define OHCI_TD_GET_DI(x)       (((x) >> 21) & 7)       /* Delay Interrupt */
116 #define OHCI_TD_SET_DI(x)       ((x) << 21)
117 #define OHCI_TD_NOINTR          0x00e00000
118 #define OHCI_TD_INTR_MASK       0x00e00000
119 #define OHCI_TD_TOGGLE_CARRY    0x00000000
120 #define OHCI_TD_TOGGLE_0        0x02000000
121 #define OHCI_TD_TOGGLE_1        0x03000000
122 #define OHCI_TD_TOGGLE_MASK     0x03000000
123 #define OHCI_TD_GET_EC(x)       (((x) >> 26) & 3)       /* Error Count */
124 #define OHCI_TD_GET_CC(x)       ((x) >> 28)     /* Condition Code */
125 #define OHCI_TD_SET_CC(x)       ((x) << 28)
126 #define OHCI_TD_NOCC            0xf0000000
127         volatile uint32_t td_cbp;       /* Current Buffer Pointer */
128         volatile uint32_t td_next;      /* Next TD */
129 #define OHCI_TD_NEXT_END        0
130         volatile uint32_t td_be;        /* Buffer End */
131 /*
132  * Extra information needed:
133  */
134         struct ohci_td *obj_next;
135         struct ohci_td *alt_next;
136         struct usb_page_cache *page_cache;
137         uint32_t td_self;
138         uint16_t len;
139 } __aligned(OHCI_TD_ALIGN);
140
141 typedef struct ohci_td ohci_td_t;
142
143 struct ohci_itd {
144         volatile uint32_t itd_flags;
145 #define OHCI_ITD_GET_SF(x)      ((x) & 0x0000ffff)
146 #define OHCI_ITD_SET_SF(x)      ((x) & 0xffff)
147 #define OHCI_ITD_GET_DI(x)      (((x) >> 21) & 7)       /* Delay Interrupt */
148 #define OHCI_ITD_SET_DI(x)      ((x) << 21)
149 #define OHCI_ITD_NOINTR         0x00e00000
150 #define OHCI_ITD_GET_FC(x)      ((((x) >> 24) & 7)+1)   /* Frame Count */
151 #define OHCI_ITD_SET_FC(x)      (((x)-1) << 24)
152 #define OHCI_ITD_GET_CC(x)      ((x) >> 28)     /* Condition Code */
153 #define OHCI_ITD_NOCC           0xf0000000
154 #define OHCI_ITD_NOFFSET        8
155         volatile uint32_t itd_bp0;      /* Buffer Page 0 */
156         volatile uint32_t itd_next;     /* Next ITD */
157         volatile uint32_t itd_be;       /* Buffer End */
158         volatile uint16_t itd_offset[OHCI_ITD_NOFFSET]; /* Buffer offsets and
159                                                          * Status */
160 #define OHCI_ITD_PAGE_SELECT    0x00001000
161 #define OHCI_ITD_MK_OFFS(len)   (0xe000 | ((len) & 0x1fff))
162 #define OHCI_ITD_PSW_LENGTH(x)  ((x) & 0xfff)   /* Transfer length */
163 #define OHCI_ITD_PSW_GET_CC(x)  ((x) >> 12)     /* Condition Code */
164 /*
165  * Extra information needed:
166  */
167         struct ohci_itd *obj_next;
168         struct usb_page_cache *page_cache;
169         uint32_t itd_self;
170         uint8_t frames;
171 } __aligned(OHCI_ITD_ALIGN);
172
173 typedef struct ohci_itd ohci_itd_t;
174
175 #define OHCI_CC_NO_ERROR                0
176 #define OHCI_CC_CRC                     1
177 #define OHCI_CC_BIT_STUFFING            2
178 #define OHCI_CC_DATA_TOGGLE_MISMATCH    3
179 #define OHCI_CC_STALL                   4
180 #define OHCI_CC_DEVICE_NOT_RESPONDING   5
181 #define OHCI_CC_PID_CHECK_FAILURE       6
182 #define OHCI_CC_UNEXPECTED_PID          7
183 #define OHCI_CC_DATA_OVERRUN            8
184 #define OHCI_CC_DATA_UNDERRUN           9
185 #define OHCI_CC_BUFFER_OVERRUN          12
186 #define OHCI_CC_BUFFER_UNDERRUN         13
187 #define OHCI_CC_NOT_ACCESSED            15
188
189 /* Some delay needed when changing certain registers. */
190 #define OHCI_ENABLE_POWER_DELAY         5
191 #define OHCI_READ_DESC_DELAY            5
192
193 #define OHCI_NO_EDS                     (2*OHCI_NO_INTRS)
194
195 struct ohci_hw_softc {
196         struct usb_page_cache hcca_pc;
197         struct usb_page_cache ctrl_start_pc;
198         struct usb_page_cache bulk_start_pc;
199         struct usb_page_cache isoc_start_pc;
200         struct usb_page_cache intr_start_pc[OHCI_NO_EDS];
201
202         struct usb_page hcca_pg;
203         struct usb_page ctrl_start_pg;
204         struct usb_page bulk_start_pg;
205         struct usb_page isoc_start_pg;
206         struct usb_page intr_start_pg[OHCI_NO_EDS];
207 };
208
209 struct ohci_config_desc {
210         struct usb_config_descriptor confd;
211         struct usb_interface_descriptor ifcd;
212         struct usb_endpoint_descriptor endpd;
213 } __packed;
214
215 union ohci_hub_desc {
216         struct usb_status stat;
217         struct usb_port_status ps;
218         struct usb_hub_descriptor hubd;
219         uint8_t temp[128];
220 };
221
222 typedef struct ohci_softc {
223         struct ohci_hw_softc sc_hw;
224         struct usb_bus sc_bus;          /* base device */
225         struct usb_callout sc_tmo_rhsc;
226         union ohci_hub_desc sc_hub_desc;
227
228         struct usb_device *sc_devices[OHCI_MAX_DEVICES];
229         struct resource *sc_io_res;
230         struct resource *sc_irq_res;
231         struct ohci_hcca *sc_hcca_p;
232         struct ohci_ed *sc_ctrl_p_last;
233         struct ohci_ed *sc_bulk_p_last;
234         struct ohci_ed *sc_isoc_p_last;
235         struct ohci_ed *sc_intr_p_last[OHCI_NO_EDS];
236         void   *sc_intr_hdl;
237         device_t sc_dev;
238         bus_size_t sc_io_size;
239         bus_space_tag_t sc_io_tag;
240         bus_space_handle_t sc_io_hdl;
241
242         uint32_t sc_eintrs;             /* enabled interrupts */
243
244         uint16_t sc_intr_stat[OHCI_NO_EDS];
245         uint16_t sc_id_vendor;
246
247         uint8_t sc_noport;
248         uint8_t sc_addr;                /* device address */
249         uint8_t sc_conf;                /* device configuration */
250         uint8_t sc_hub_idata[32];
251
252         char    sc_vendor[16];
253
254 } ohci_softc_t;
255
256 usb_bus_mem_cb_t ohci_iterate_hw_softc;
257
258 usb_error_t ohci_init(ohci_softc_t *sc);
259 void    ohci_detach(struct ohci_softc *sc);
260 void    ohci_interrupt(ohci_softc_t *sc);
261
262 #endif                                  /* _OHCI_H_ */