| @@ -1,14 +1,14 @@ | | | @@ -1,14 +1,14 @@ |
1 | /* $NetBSD: ehcireg.h,v 1.37 2016/04/23 10:15:31 skrll Exp $ */ | | 1 | /* $NetBSD: ehcireg.h,v 1.38 2024/02/05 23:07:42 jmcneill Exp $ */ |
2 | | | 2 | |
3 | /* | | 3 | /* |
4 | * Copyright (c) 2001, 2004 The NetBSD Foundation, Inc. | | 4 | * Copyright (c) 2001, 2004 The NetBSD Foundation, Inc. |
5 | * All rights reserved. | | 5 | * All rights reserved. |
6 | * | | 6 | * |
7 | * This code is derived from software contributed to The NetBSD Foundation | | 7 | * This code is derived from software contributed to The NetBSD Foundation |
8 | * by Lennart Augustsson (lennart@augustsson.net). | | 8 | * by Lennart Augustsson (lennart@augustsson.net). |
9 | * | | 9 | * |
10 | * Redistribution and use in source and binary forms, with or without | | 10 | * Redistribution and use in source and binary forms, with or without |
11 | * modification, are permitted provided that the following conditions | | 11 | * modification, are permitted provided that the following conditions |
12 | * are met: | | 12 | * are met: |
13 | * 1. Redistributions of source code must retain the above copyright | | 13 | * 1. Redistributions of source code must retain the above copyright |
14 | * notice, this list of conditions and the following disclaimer. | | 14 | * notice, this list of conditions and the following disclaimer. |
| @@ -193,26 +193,27 @@ typedef uint32_t ehci_link_t; | | | @@ -193,26 +193,27 @@ typedef uint32_t ehci_link_t; |
193 | #define EHCI_LINK_TYPE(x) ((x) & 0x00000006) | | 193 | #define EHCI_LINK_TYPE(x) ((x) & 0x00000006) |
194 | #define EHCI_LINK_ITD 0x0 | | 194 | #define EHCI_LINK_ITD 0x0 |
195 | #define EHCI_LINK_QH 0x2 | | 195 | #define EHCI_LINK_QH 0x2 |
196 | #define EHCI_LINK_SITD 0x4 | | 196 | #define EHCI_LINK_SITD 0x4 |
197 | #define EHCI_LINK_FSTN 0x6 | | 197 | #define EHCI_LINK_FSTN 0x6 |
198 | #define EHCI_LINK_ADDR(x) ((x) &~ 0x1f) | | 198 | #define EHCI_LINK_ADDR(x) ((x) &~ 0x1f) |
199 | | | 199 | |
200 | typedef uint32_t ehci_physaddr_t; | | 200 | typedef uint32_t ehci_physaddr_t; |
201 | | | 201 | |
202 | typedef uint32_t ehci_isoc_trans_t; | | 202 | typedef uint32_t ehci_isoc_trans_t; |
203 | typedef uint32_t ehci_isoc_bufr_ptr_t; | | 203 | typedef uint32_t ehci_isoc_bufr_ptr_t; |
204 | | | 204 | |
205 | /* Isochronous Transfer Descriptor */ | | 205 | /* Isochronous Transfer Descriptor */ |
| | | 206 | #define EHCI_ITD_ALIGN 32 |
206 | #define EHCI_ITD_NUFRAMES USB_UFRAMES_PER_FRAME | | 207 | #define EHCI_ITD_NUFRAMES USB_UFRAMES_PER_FRAME |
207 | #define EHCI_ITD_NBUFFERS 7 | | 208 | #define EHCI_ITD_NBUFFERS 7 |
208 | typedef struct { | | 209 | typedef struct { |
209 | volatile ehci_link_t itd_next; | | 210 | volatile ehci_link_t itd_next; |
210 | volatile ehci_isoc_trans_t itd_ctl[EHCI_ITD_NUFRAMES]; | | 211 | volatile ehci_isoc_trans_t itd_ctl[EHCI_ITD_NUFRAMES]; |
211 | #define EHCI_ITD_STATUS_MASK __BITS(31,28) | | 212 | #define EHCI_ITD_STATUS_MASK __BITS(31,28) |
212 | #define EHCI_ITD_GET_STATUS(x) __SHIFTOUT((x), EHCI_ITD_STATUS_MASK) | | 213 | #define EHCI_ITD_GET_STATUS(x) __SHIFTOUT((x), EHCI_ITD_STATUS_MASK) |
213 | #define EHCI_ITD_SET_STATUS(x) __SHIFTIN((x), EHCI_ITD_STATUS_MASK) | | 214 | #define EHCI_ITD_SET_STATUS(x) __SHIFTIN((x), EHCI_ITD_STATUS_MASK) |
214 | #define EHCI_ITD_ACTIVE __BIT(31) | | 215 | #define EHCI_ITD_ACTIVE __BIT(31) |
215 | #define EHCI_ITD_BUF_ERR __BIT(30) | | 216 | #define EHCI_ITD_BUF_ERR __BIT(30) |
216 | #define EHCI_ITD_BABBLE __BIT(29) | | 217 | #define EHCI_ITD_BABBLE __BIT(29) |
217 | #define EHCI_ITD_ERROR __BIT(28) | | 218 | #define EHCI_ITD_ERROR __BIT(28) |
218 | #define EHCI_ITD_LEN_MASK __BITS(27,16) | | 219 | #define EHCI_ITD_LEN_MASK __BITS(27,16) |
| @@ -237,30 +238,30 @@ typedef struct { | | | @@ -237,30 +238,30 @@ typedef struct { |
237 | #define EHCI_ITD_DADDR_MASK __BITS(6,0) | | 238 | #define EHCI_ITD_DADDR_MASK __BITS(6,0) |
238 | #define EHCI_ITD_GET_DADDR(x) __SHIFTOUT((x), EHCI_ITD_DADDR_MASK) | | 239 | #define EHCI_ITD_GET_DADDR(x) __SHIFTOUT((x), EHCI_ITD_DADDR_MASK) |
239 | #define EHCI_ITD_SET_DADDR(x) __SHIFTIN((x), EHCI_ITD_DADDR_MASK) | | 240 | #define EHCI_ITD_SET_DADDR(x) __SHIFTIN((x), EHCI_ITD_DADDR_MASK) |
240 | #define EHCI_ITD_DIR_MASK __BIT(11) | | 241 | #define EHCI_ITD_DIR_MASK __BIT(11) |
241 | #define EHCI_ITD_GET_DIR(x) __SHIFTOUT((x), EHCI_ITD_DIR_MASK) | | 242 | #define EHCI_ITD_GET_DIR(x) __SHIFTOUT((x), EHCI_ITD_DIR_MASK) |
242 | #define EHCI_ITD_SET_DIR(x) __SHIFTIN((x), EHCI_ITD_DIR_MASK) | | 243 | #define EHCI_ITD_SET_DIR(x) __SHIFTIN((x), EHCI_ITD_DIR_MASK) |
243 | #define EHCI_ITD_MAXPKT_MASK __BITS(10,0) | | 244 | #define EHCI_ITD_MAXPKT_MASK __BITS(10,0) |
244 | #define EHCI_ITD_GET_MAXPKT(x) __SHIFTOUT((x), EHCI_ITD_MAXPKT_MASK) | | 245 | #define EHCI_ITD_GET_MAXPKT(x) __SHIFTOUT((x), EHCI_ITD_MAXPKT_MASK) |
245 | #define EHCI_ITD_SET_MAXPKT(x) __SHIFTIN((x), EHCI_ITD_MAXPKT_MASK) | | 246 | #define EHCI_ITD_SET_MAXPKT(x) __SHIFTIN((x), EHCI_ITD_MAXPKT_MASK) |
246 | #define EHCI_ITD_MULTI_MASK __BITS(1,0) | | 247 | #define EHCI_ITD_MULTI_MASK __BITS(1,0) |
247 | #define EHCI_ITD_GET_MULTI(x) __SHIFTOUT((x), EHCI_ITD_MULTI_MASK) | | 248 | #define EHCI_ITD_GET_MULTI(x) __SHIFTOUT((x), EHCI_ITD_MULTI_MASK) |
248 | #define EHCI_ITD_SET_MULTI(x) __SHIFTIN((x), EHCI_ITD_MULTI_MASK) | | 249 | #define EHCI_ITD_SET_MULTI(x) __SHIFTIN((x), EHCI_ITD_MULTI_MASK) |
249 | volatile ehci_isoc_bufr_ptr_t itd_bufr_hi[EHCI_ITD_NBUFFERS]; | | 250 | volatile ehci_isoc_bufr_ptr_t itd_bufr_hi[EHCI_ITD_NBUFFERS]; |
250 | } ehci_itd_t; | | 251 | } __aligned(EHCI_ITD_ALIGN) ehci_itd_t; |
251 | #define EHCI_ITD_ALIGN 32 | | | |
252 | | | 252 | |
253 | /* Split Transaction Isochronous Transfer Descriptor */ | | 253 | /* Split Transaction Isochronous Transfer Descriptor */ |
| | | 254 | #define EHCI_SITD_ALIGN 32 |
254 | typedef struct { | | 255 | typedef struct { |
255 | volatile ehci_link_t sitd_next; | | 256 | volatile ehci_link_t sitd_next; |
256 | volatile uint32_t sitd_endp; | | 257 | volatile uint32_t sitd_endp; |
257 | #define EHCI_SITD_DIR_MASK __BIT(31) | | 258 | #define EHCI_SITD_DIR_MASK __BIT(31) |
258 | #define EHCI_SITD_PORT_MASK __BITS(30,24) | | 259 | #define EHCI_SITD_PORT_MASK __BITS(30,24) |
259 | #define EHCI_SITD_HUBA_MASK __BITS(22,16) | | 260 | #define EHCI_SITD_HUBA_MASK __BITS(22,16) |
260 | #define EHCI_SITD_ENDPT_MASK __BITS(11,8) | | 261 | #define EHCI_SITD_ENDPT_MASK __BITS(11,8) |
261 | #define EHCI_SITD_DADDR_MASK __BITS(6,0) | | 262 | #define EHCI_SITD_DADDR_MASK __BITS(6,0) |
262 | #define EHCI_SITD_SET_DIR(x) __SHIFTIN((x), EHCI_SITD_DIR_MASK) | | 263 | #define EHCI_SITD_SET_DIR(x) __SHIFTIN((x), EHCI_SITD_DIR_MASK) |
263 | #define EHCI_SITD_SET_PORT(x) __SHIFTIN((x), EHCI_SITD_PORT_MASK) | | 264 | #define EHCI_SITD_SET_PORT(x) __SHIFTIN((x), EHCI_SITD_PORT_MASK) |
264 | #define EHCI_SITD_SET_HUBA(x) __SHIFTIN((x), EHCI_SITD_HUBA_MASK) | | 265 | #define EHCI_SITD_SET_HUBA(x) __SHIFTIN((x), EHCI_SITD_HUBA_MASK) |
265 | #define EHCI_SITD_SET_ENDPT(x) __SHIFTIN((x), EHCI_SITD_ENDPT_MASK) | | 266 | #define EHCI_SITD_SET_ENDPT(x) __SHIFTIN((x), EHCI_SITD_ENDPT_MASK) |
266 | #define EHCI_SITD_SET_DADDR(x) __SHIFTIN((x), EHCI_SITD_DADDR_MASK) | | 267 | #define EHCI_SITD_SET_DADDR(x) __SHIFTIN((x), EHCI_SITD_DADDR_MASK) |
| @@ -284,32 +285,32 @@ typedef struct { | | | @@ -284,32 +285,32 @@ typedef struct { |
284 | #define EHCI_SITD_MISS 0x00000004 | | 285 | #define EHCI_SITD_MISS 0x00000004 |
285 | #define EHCI_SITD_SPLITXSTATE 0x00000002 | | 286 | #define EHCI_SITD_SPLITXSTATE 0x00000002 |
286 | | | 287 | |
287 | #define EHCI_SITD_BUFFERS 2 | | 288 | #define EHCI_SITD_BUFFERS 2 |
288 | | | 289 | |
289 | volatile uint32_t sitd_buffer[EHCI_SITD_BUFFERS]; | | 290 | volatile uint32_t sitd_buffer[EHCI_SITD_BUFFERS]; |
290 | #define EHCI_SITD_SET_BPTR(x) ((x) & 0xfffff000) | | 291 | #define EHCI_SITD_SET_BPTR(x) ((x) & 0xfffff000) |
291 | #define EHCI_SITD_SET_OFFS(x) ((x) & 0xfff) | | 292 | #define EHCI_SITD_SET_OFFS(x) ((x) & 0xfff) |
292 | #define EHCI_SITD_TP_MASK __BITS(4,3) | | 293 | #define EHCI_SITD_TP_MASK __BITS(4,3) |
293 | #define EHCI_SITD_TCOUNT_MASK __BITS(2,0) | | 294 | #define EHCI_SITD_TCOUNT_MASK __BITS(2,0) |
294 | | | 295 | |
295 | volatile ehci_link_t sitd_back; | | 296 | volatile ehci_link_t sitd_back; |
296 | volatile uint32_t sitd_buffer_hi[EHCI_SITD_BUFFERS]; | | 297 | volatile uint32_t sitd_buffer_hi[EHCI_SITD_BUFFERS]; |
297 | } ehci_sitd_t; | | 298 | } __aligned(EHCI_SITD_ALIGN) ehci_sitd_t; |
298 | #define EHCI_SITD_ALIGN 32 | | | |
299 | | | 299 | |
300 | /* Queue Element Transfer Descriptor */ | | 300 | /* Queue Element Transfer Descriptor */ |
301 | #define EHCI_QTD_NBUFFERS 5 | | 301 | #define EHCI_QTD_NBUFFERS 5 |
302 | #define EHCI_QTD_MAXTRANSFER (EHCI_QTD_NBUFFERS * EHCI_PAGE_SIZE) | | 302 | #define EHCI_QTD_MAXTRANSFER (EHCI_QTD_NBUFFERS * EHCI_PAGE_SIZE) |
| | | 303 | #define EHCI_QTD_ALIGN 32 |
303 | typedef struct { | | 304 | typedef struct { |
304 | volatile ehci_link_t qtd_next; | | 305 | volatile ehci_link_t qtd_next; |
305 | volatile ehci_link_t qtd_altnext; | | 306 | volatile ehci_link_t qtd_altnext; |
306 | volatile uint32_t qtd_status; | | 307 | volatile uint32_t qtd_status; |
307 | #define EHCI_QTD_STATUS_MASK __BITS(7,0) | | 308 | #define EHCI_QTD_STATUS_MASK __BITS(7,0) |
308 | #define EHCI_QTD_GET_STATUS(x) __SHIFTOUT((x), EHCI_QTD_STATUS_MASK) | | 309 | #define EHCI_QTD_GET_STATUS(x) __SHIFTOUT((x), EHCI_QTD_STATUS_MASK) |
309 | #define EHCI_QTD_SET_STATUS(x) __SHIFTIN((x), EHCI_QTD_STATUS_MASK) | | 310 | #define EHCI_QTD_SET_STATUS(x) __SHIFTIN((x), EHCI_QTD_STATUS_MASK) |
310 | #define EHCI_QTD_ACTIVE 0x80 | | 311 | #define EHCI_QTD_ACTIVE 0x80 |
311 | #define EHCI_QTD_HALTED 0x40 | | 312 | #define EHCI_QTD_HALTED 0x40 |
312 | #define EHCI_QTD_BUFERR 0x20 | | 313 | #define EHCI_QTD_BUFERR 0x20 |
313 | #define EHCI_QTD_BABBLE 0x10 | | 314 | #define EHCI_QTD_BABBLE 0x10 |
314 | #define EHCI_QTD_XACTERR 0x08 | | 315 | #define EHCI_QTD_XACTERR 0x08 |
315 | #define EHCI_QTD_MISSEDMICRO 0x04 | | 316 | #define EHCI_QTD_MISSEDMICRO 0x04 |
| @@ -328,30 +329,30 @@ typedef struct { | | | @@ -328,30 +329,30 @@ typedef struct { |
328 | #define EHCI_QTD_C_PAGE_MASK __BITS(14,12) | | 329 | #define EHCI_QTD_C_PAGE_MASK __BITS(14,12) |
329 | #define EHCI_QTD_GET_C_PAGE(x) __SHIFTOUT((x), EHCI_QTD_C_PAGE_MASK) | | 330 | #define EHCI_QTD_GET_C_PAGE(x) __SHIFTOUT((x), EHCI_QTD_C_PAGE_MASK) |
330 | #define EHCI_QTD_SET_C_PAGE(x) __SHIFTIN((x), EHCI_QTD_C_PAGE_MASK) | | 331 | #define EHCI_QTD_SET_C_PAGE(x) __SHIFTIN((x), EHCI_QTD_C_PAGE_MASK) |
331 | #define EHCI_QTD_IOC __BIT(15) | | 332 | #define EHCI_QTD_IOC __BIT(15) |
332 | #define EHCI_QTD_GET_IOC(x) __SHIFTOUT((x), EHCI_QTD_IOC) | | 333 | #define EHCI_QTD_GET_IOC(x) __SHIFTOUT((x), EHCI_QTD_IOC) |
333 | #define EHCI_QTD_BYTES_MASK __BITS(30,16) | | 334 | #define EHCI_QTD_BYTES_MASK __BITS(30,16) |
334 | #define EHCI_QTD_GET_BYTES(x) __SHIFTOUT((x), EHCI_QTD_BYTES_MASK) | | 335 | #define EHCI_QTD_GET_BYTES(x) __SHIFTOUT((x), EHCI_QTD_BYTES_MASK) |
335 | #define EHCI_QTD_SET_BYTES(x) __SHIFTIN((x), EHCI_QTD_BYTES_MASK) | | 336 | #define EHCI_QTD_SET_BYTES(x) __SHIFTIN((x), EHCI_QTD_BYTES_MASK) |
336 | #define EHCI_QTD_TOGGLE_MASK __BIT(31) | | 337 | #define EHCI_QTD_TOGGLE_MASK __BIT(31) |
337 | #define EHCI_QTD_GET_TOGGLE(x) __SHIFTOUT((x), EHCI_QTD_TOGGLE_MASK) | | 338 | #define EHCI_QTD_GET_TOGGLE(x) __SHIFTOUT((x), EHCI_QTD_TOGGLE_MASK) |
338 | #define EHCI_QTD_SET_TOGGLE(x) __SHIFTIN((x), EHCI_QTD_TOGGLE_MASK) | | 339 | #define EHCI_QTD_SET_TOGGLE(x) __SHIFTIN((x), EHCI_QTD_TOGGLE_MASK) |
339 | volatile ehci_physaddr_t qtd_buffer[EHCI_QTD_NBUFFERS]; | | 340 | volatile ehci_physaddr_t qtd_buffer[EHCI_QTD_NBUFFERS]; |
340 | volatile ehci_physaddr_t qtd_buffer_hi[EHCI_QTD_NBUFFERS]; | | 341 | volatile ehci_physaddr_t qtd_buffer_hi[EHCI_QTD_NBUFFERS]; |
341 | } ehci_qtd_t; | | 342 | } __aligned(EHCI_QTD_ALIGN) ehci_qtd_t; |
342 | #define EHCI_QTD_ALIGN 32 | | | |
343 | | | 343 | |
344 | /* Queue Head */ | | 344 | /* Queue Head */ |
| | | 345 | #define EHCI_QH_ALIGN 32 |
345 | typedef struct { | | 346 | typedef struct { |
346 | volatile ehci_link_t qh_link; | | 347 | volatile ehci_link_t qh_link; |
347 | volatile uint32_t qh_endp; | | 348 | volatile uint32_t qh_endp; |
348 | #define EHCI_QH_ADDR_MASK __BITS(6,0) /* endpoint addr */ | | 349 | #define EHCI_QH_ADDR_MASK __BITS(6,0) /* endpoint addr */ |
349 | #define EHCI_QH_GET_ADDR(x) __SHIFTOUT((x), EHCI_QH_ADDR_MASK) | | 350 | #define EHCI_QH_GET_ADDR(x) __SHIFTOUT((x), EHCI_QH_ADDR_MASK) |
350 | #define EHCI_QH_SET_ADDR(x) __SHIFTIN((x), EHCI_QH_ADDR_MASK) | | 351 | #define EHCI_QH_SET_ADDR(x) __SHIFTIN((x), EHCI_QH_ADDR_MASK) |
351 | #define EHCI_QH_INACT __BIT(7) /* inactivate on next */ | | 352 | #define EHCI_QH_INACT __BIT(7) /* inactivate on next */ |
352 | #define EHCI_QH_GET_INACT(x) __SHIFTOUT((x), EHCI_QH_INACT) | | 353 | #define EHCI_QH_GET_INACT(x) __SHIFTOUT((x), EHCI_QH_INACT) |
353 | #define EHCI_QH_ENDPT_MASK __BITS(11,8) /* endpoint no */ | | 354 | #define EHCI_QH_ENDPT_MASK __BITS(11,8) /* endpoint no */ |
354 | #define EHCI_QH_GET_ENDPT(x) __SHIFTOUT((x), EHCI_QH_ENDPT_MASK) | | 355 | #define EHCI_QH_GET_ENDPT(x) __SHIFTOUT((x), EHCI_QH_ENDPT_MASK) |
355 | #define EHCI_QH_SET_ENDPT(x) __SHIFTIN((x), EHCI_QH_ENDPT_MASK) | | 356 | #define EHCI_QH_SET_ENDPT(x) __SHIFTIN((x), EHCI_QH_ENDPT_MASK) |
356 | #define EHCI_QH_EPS_MASK __BITS(13,12) /* endpoint speed */ | | 357 | #define EHCI_QH_EPS_MASK __BITS(13,12) /* endpoint speed */ |
357 | #define EHCI_QH_GET_EPS(x) __SHIFTOUT((x), EHCI_QH_EPS_MASK) | | 358 | #define EHCI_QH_GET_EPS(x) __SHIFTOUT((x), EHCI_QH_EPS_MASK) |
| @@ -378,36 +379,46 @@ typedef struct { | | | @@ -378,36 +379,46 @@ typedef struct { |
378 | #define EHCI_QH_CMASK_MASK __BITS(15,8) /* split completion mask */ | | 379 | #define EHCI_QH_CMASK_MASK __BITS(15,8) /* split completion mask */ |
379 | #define EHCI_QH_GET_CMASK(x) __SHIFTOUT((x), EHCI_QH_CMASK_MASK) | | 380 | #define EHCI_QH_GET_CMASK(x) __SHIFTOUT((x), EHCI_QH_CMASK_MASK) |
380 | #define EHCI_QH_SET_CMASK(x) __SHIFTIN((x), EHCI_QH_CMASK_MASK) | | 381 | #define EHCI_QH_SET_CMASK(x) __SHIFTIN((x), EHCI_QH_CMASK_MASK) |
381 | #define EHCI_QH_HUBA_MASK __BITS(22,16) /* hub address */ | | 382 | #define EHCI_QH_HUBA_MASK __BITS(22,16) /* hub address */ |
382 | #define EHCI_QH_GET_HUBA(x) __SHIFTOUT((x), EHCI_QH_HUBA_MASK) | | 383 | #define EHCI_QH_GET_HUBA(x) __SHIFTOUT((x), EHCI_QH_HUBA_MASK) |
383 | #define EHCI_QH_SET_HUBA(x) __SHIFTIN((x), EHCI_QH_HUBA_MASK) | | 384 | #define EHCI_QH_SET_HUBA(x) __SHIFTIN((x), EHCI_QH_HUBA_MASK) |
384 | #define EHCI_QH_PORT_MASK __BITS(29,23) /* hub port */ | | 385 | #define EHCI_QH_PORT_MASK __BITS(29,23) /* hub port */ |
385 | #define EHCI_QH_GET_PORT(x) __SHIFTOUT((x), EHCI_QH_PORT_MASK) | | 386 | #define EHCI_QH_GET_PORT(x) __SHIFTOUT((x), EHCI_QH_PORT_MASK) |
386 | #define EHCI_QH_SET_PORT(x) __SHIFTIN((x), EHCI_QH_PORT_MASK) | | 387 | #define EHCI_QH_SET_PORT(x) __SHIFTIN((x), EHCI_QH_PORT_MASK) |
387 | #define EHCI_QH_MULTI_MASK __BITS(31,30) /* pipe multiplier */ | | 388 | #define EHCI_QH_MULTI_MASK __BITS(31,30) /* pipe multiplier */ |
388 | #define EHCI_QH_GET_MULT(x) __SHIFTOUT((x), EHCI_QH_MULTI_MASK) | | 389 | #define EHCI_QH_GET_MULT(x) __SHIFTOUT((x), EHCI_QH_MULTI_MASK) |
389 | #define EHCI_QH_SET_MULT(x) __SHIFTIN((x), EHCI_QH_MULTI_MASK) | | 390 | #define EHCI_QH_SET_MULT(x) __SHIFTIN((x), EHCI_QH_MULTI_MASK) |
390 | volatile ehci_link_t qh_curqtd; | | 391 | volatile ehci_link_t qh_curqtd; |
391 | ehci_qtd_t qh_qtd; | | 392 | /* |
392 | } ehci_qh_t; | | 393 | * The QH descriptor contains a TD overlay, but it is not |
393 | #define EHCI_QH_ALIGN 32 | | 394 | * 32-byte aligned, so declare the fields instead of embedding |
| | | 395 | * a ehci_qtd_t directly. |
| | | 396 | */ |
| | | 397 | struct { |
| | | 398 | volatile ehci_link_t qtd_next; |
| | | 399 | volatile ehci_link_t qtd_altnext; |
| | | 400 | volatile uint32_t qtd_status; |
| | | 401 | volatile ehci_physaddr_t qtd_buffer[EHCI_QTD_NBUFFERS]; |
| | | 402 | volatile ehci_physaddr_t qtd_buffer_hi[EHCI_QTD_NBUFFERS]; |
| | | 403 | } qh_qtd; |
| | | 404 | } __aligned(EHCI_QH_ALIGN) ehci_qh_t; |
394 | | | 405 | |
395 | /* Periodic Frame Span Traversal Node */ | | 406 | /* Periodic Frame Span Traversal Node */ |
| | | 407 | #define EHCI_FSTN_ALIGN 32 |
396 | typedef struct { | | 408 | typedef struct { |
397 | volatile ehci_link_t fstn_link; | | 409 | volatile ehci_link_t fstn_link; |
398 | volatile ehci_link_t fstn_back; | | 410 | volatile ehci_link_t fstn_back; |
399 | } ehci_fstn_t; | | 411 | } __aligned(EHCI_FSTN_ALIGN) ehci_fstn_t; |
400 | #define EHCI_FSTN_ALIGN 32 | | | |
401 | | | 412 | |
402 | /* Debug Port */ | | 413 | /* Debug Port */ |
403 | #define PCI_CAP_DEBUGPORT_OFFSET __BITS(28,16) | | 414 | #define PCI_CAP_DEBUGPORT_OFFSET __BITS(28,16) |
404 | #define PCI_CAP_DEBUGPORT_BAR __BITS(31,29) | | 415 | #define PCI_CAP_DEBUGPORT_BAR __BITS(31,29) |
405 | /* Debug Port Registers, offset into DEBUGPORT_BAR at DEBUGPORT_OFFSET */ | | 416 | /* Debug Port Registers, offset into DEBUGPORT_BAR at DEBUGPORT_OFFSET */ |
406 | #define EHCI_DEBUG_SC 0x00 | | 417 | #define EHCI_DEBUG_SC 0x00 |
407 | /* Status/Control Register */ | | 418 | /* Status/Control Register */ |
408 | #define EHCI_DSC_DATA_LENGTH __BITS(3,0) | | 419 | #define EHCI_DSC_DATA_LENGTH __BITS(3,0) |
409 | #define EHCI_DSC_WRITE __BIT(4) | | 420 | #define EHCI_DSC_WRITE __BIT(4) |
410 | #define EHCI_DSC_GO __BIT(5) | | 421 | #define EHCI_DSC_GO __BIT(5) |
411 | #define EHCI_DSC_ERROR __BIT(6) | | 422 | #define EHCI_DSC_ERROR __BIT(6) |
412 | #define EHCI_DSC_EXCEPTION __BITS(9,7) | | 423 | #define EHCI_DSC_EXCEPTION __BITS(9,7) |
413 | #define EHCI_DSC_EXCEPTION_NONE 0 | | 424 | #define EHCI_DSC_EXCEPTION_NONE 0 |