xref: /openbsd-src/sys/dev/usb/ohcireg.h (revision ab0b1be78a33b04be9f7ec4a3d24ce14843759cb)
1*ab0b1be7Smglocker /*	$OpenBSD: ohcireg.h,v 1.14 2013/04/15 09:23:01 mglocker Exp $ */
254ac236cSnate /*	$NetBSD: ohcireg.h,v 1.19 2002/07/11 21:14:27 augustss Exp $	*/
35deafb75Saaron /*	$FreeBSD: src/sys/dev/usb/ohcireg.h,v 1.8 1999/11/17 22:33:40 n_hibma Exp $	*/
45deafb75Saaron 
512fe8f0eSfgsch 
612fe8f0eSfgsch /*
712fe8f0eSfgsch  * Copyright (c) 1998 The NetBSD Foundation, Inc.
812fe8f0eSfgsch  * All rights reserved.
912fe8f0eSfgsch  *
1012fe8f0eSfgsch  * This code is derived from software contributed to The NetBSD Foundation
1182426cf3Sfgsch  * by Lennart Augustsson (lennart@augustsson.net) at
1212fe8f0eSfgsch  * Carlstedt Research & Technology.
1312fe8f0eSfgsch  *
1412fe8f0eSfgsch  * Redistribution and use in source and binary forms, with or without
1512fe8f0eSfgsch  * modification, are permitted provided that the following conditions
1612fe8f0eSfgsch  * are met:
1712fe8f0eSfgsch  * 1. Redistributions of source code must retain the above copyright
1812fe8f0eSfgsch  *    notice, this list of conditions and the following disclaimer.
1912fe8f0eSfgsch  * 2. Redistributions in binary form must reproduce the above copyright
2012fe8f0eSfgsch  *    notice, this list of conditions and the following disclaimer in the
2112fe8f0eSfgsch  *    documentation and/or other materials provided with the distribution.
2212fe8f0eSfgsch  *
2312fe8f0eSfgsch  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
2412fe8f0eSfgsch  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
2512fe8f0eSfgsch  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
2612fe8f0eSfgsch  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
2712fe8f0eSfgsch  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2812fe8f0eSfgsch  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2912fe8f0eSfgsch  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
3012fe8f0eSfgsch  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
3112fe8f0eSfgsch  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
3212fe8f0eSfgsch  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
3312fe8f0eSfgsch  * POSSIBILITY OF SUCH DAMAGE.
3412fe8f0eSfgsch  */
3512fe8f0eSfgsch 
3612fe8f0eSfgsch #ifndef _DEV_PCI_OHCIREG_H_
3712fe8f0eSfgsch #define _DEV_PCI_OHCIREG_H_
3812fe8f0eSfgsch 
3912fe8f0eSfgsch /*** PCI config registers ***/
4012fe8f0eSfgsch 
4112fe8f0eSfgsch #define PCI_CBMEM		0x10	/* configuration base memory */
4212fe8f0eSfgsch 
4312fe8f0eSfgsch #define PCI_INTERFACE_OHCI	0x10
4412fe8f0eSfgsch 
4512fe8f0eSfgsch /*** OHCI registers */
4612fe8f0eSfgsch 
4712fe8f0eSfgsch #define OHCI_REVISION		0x00	/* OHCI revision # */
4812fe8f0eSfgsch #define  OHCI_REV_LO(rev)	((rev)&0xf)
4912fe8f0eSfgsch #define  OHCI_REV_HI(rev)	(((rev)>>4)&0xf)
5012fe8f0eSfgsch #define  OHCI_REV_LEGACY(rev)	((rev) & 0x100)
5112fe8f0eSfgsch 
5212fe8f0eSfgsch #define OHCI_CONTROL		0x04
5312fe8f0eSfgsch #define  OHCI_CBSR_MASK		0x00000003 /* Control/Bulk Service Ratio */
5412fe8f0eSfgsch #define  OHCI_RATIO_1_1		0x00000000
5512fe8f0eSfgsch #define  OHCI_RATIO_1_2		0x00000001
5612fe8f0eSfgsch #define  OHCI_RATIO_1_3		0x00000002
5712fe8f0eSfgsch #define  OHCI_RATIO_1_4		0x00000003
5812fe8f0eSfgsch #define  OHCI_PLE		0x00000004 /* Periodic List Enable */
5912fe8f0eSfgsch #define  OHCI_IE		0x00000008 /* Isochronous Enable */
6012fe8f0eSfgsch #define  OHCI_CLE		0x00000010 /* Control List Enable */
6112fe8f0eSfgsch #define  OHCI_BLE		0x00000020 /* Bulk List Enable */
6212fe8f0eSfgsch #define  OHCI_HCFS_MASK		0x000000c0 /* HostControllerFunctionalState */
6312fe8f0eSfgsch #define  OHCI_HCFS_RESET	0x00000000
6412fe8f0eSfgsch #define  OHCI_HCFS_RESUME	0x00000040
6512fe8f0eSfgsch #define  OHCI_HCFS_OPERATIONAL	0x00000080
6612fe8f0eSfgsch #define  OHCI_HCFS_SUSPEND	0x000000c0
6712fe8f0eSfgsch #define  OHCI_IR		0x00000100 /* Interrupt Routing */
6812fe8f0eSfgsch #define  OHCI_RWC		0x00000200 /* Remote Wakeup Connected */
6912fe8f0eSfgsch #define  OHCI_RWE		0x00000400 /* Remote Wakeup Enabled */
7012fe8f0eSfgsch #define OHCI_COMMAND_STATUS	0x08
7112fe8f0eSfgsch #define  OHCI_HCR		0x00000001 /* Host Controller Reset */
7212fe8f0eSfgsch #define  OHCI_CLF		0x00000002 /* Control List Filled */
7312fe8f0eSfgsch #define  OHCI_BLF		0x00000004 /* Bulk List Filled */
7412fe8f0eSfgsch #define  OHCI_OCR		0x00000008 /* Ownership Change Request */
7512fe8f0eSfgsch #define  OHCI_SOC_MASK		0x00030000 /* Scheduling Overrun Count */
7612fe8f0eSfgsch #define OHCI_INTERRUPT_STATUS	0x0c
7712fe8f0eSfgsch #define  OHCI_SO		0x00000001 /* Scheduling Overrun */
7812fe8f0eSfgsch #define  OHCI_WDH		0x00000002 /* Writeback Done Head */
7912fe8f0eSfgsch #define  OHCI_SF		0x00000004 /* Start of Frame */
8012fe8f0eSfgsch #define  OHCI_RD		0x00000008 /* Resume Detected */
8112fe8f0eSfgsch #define  OHCI_UE		0x00000010 /* Unrecoverable Error */
8212fe8f0eSfgsch #define  OHCI_FNO		0x00000020 /* Frame Number Overflow */
8312fe8f0eSfgsch #define  OHCI_RHSC		0x00000040 /* Root Hub Status Change */
8412fe8f0eSfgsch #define  OHCI_OC		0x40000000 /* Ownership Change */
8512fe8f0eSfgsch #define  OHCI_MIE		0x80000000 /* Master Interrupt Enable */
8612fe8f0eSfgsch #define OHCI_INTERRUPT_ENABLE	0x10
8712fe8f0eSfgsch #define OHCI_INTERRUPT_DISABLE	0x14
8812fe8f0eSfgsch #define OHCI_HCCA		0x18
8912fe8f0eSfgsch #define OHCI_PERIOD_CURRENT_ED	0x1c
9012fe8f0eSfgsch #define OHCI_CONTROL_HEAD_ED	0x20
9112fe8f0eSfgsch #define OHCI_CONTROL_CURRENT_ED	0x24
9212fe8f0eSfgsch #define OHCI_BULK_HEAD_ED	0x28
9312fe8f0eSfgsch #define OHCI_BULK_CURRENT_ED	0x2c
9412fe8f0eSfgsch #define OHCI_DONE_HEAD		0x30
9512fe8f0eSfgsch #define OHCI_FM_INTERVAL	0x34
9612fe8f0eSfgsch #define  OHCI_GET_IVAL(s)	((s) & 0x3fff)
9712fe8f0eSfgsch #define  OHCI_GET_FSMPS(s)	(((s) >> 16) & 0x7fff)
9812fe8f0eSfgsch #define  OHCI_FIT		0x80000000
9912fe8f0eSfgsch #define OHCI_FM_REMAINING	0x38
10012fe8f0eSfgsch #define OHCI_FM_NUMBER		0x3c
10112fe8f0eSfgsch #define OHCI_PERIODIC_START	0x40
10212fe8f0eSfgsch #define OHCI_LS_THRESHOLD	0x44
10312fe8f0eSfgsch #define OHCI_RH_DESCRIPTOR_A	0x48
10412fe8f0eSfgsch #define  OHCI_GET_NDP(s)	((s) & 0xff)
10512fe8f0eSfgsch #define  OHCI_PSM		0x0100     /* Power Switching Mode */
10612fe8f0eSfgsch #define  OHCI_NPS		0x0200	   /* No Power Switching */
107eff3e1aaSaaron #define  OHCI_DT		0x0400     /* Device Type */
108eff3e1aaSaaron #define  OHCI_OCPM		0x0800     /* Overcurrent Protection Mode */
109eff3e1aaSaaron #define  OHCI_NOCP		0x1000     /* No Overcurrent Protection */
11012fe8f0eSfgsch #define  OHCI_GET_POTPGT(s)	((s) >> 24)
11112fe8f0eSfgsch #define OHCI_RH_DESCRIPTOR_B	0x4c
11212fe8f0eSfgsch #define OHCI_RH_STATUS		0x50
11312fe8f0eSfgsch #define  OHCI_LPS		0x00000001 /* Local Power Status */
11412fe8f0eSfgsch #define  OHCI_OCI		0x00000002 /* OverCurrent Indicator */
11512fe8f0eSfgsch #define  OHCI_DRWE		0x00008000 /* Device Remote Wakeup Enable */
11612fe8f0eSfgsch #define  OHCI_LPSC		0x00010000 /* Local Power Status Change */
11712fe8f0eSfgsch #define  OHCI_CCIC		0x00020000 /* OverCurrent Indicator Change */
11812fe8f0eSfgsch #define  OHCI_CRWE		0x80000000 /* Clear Remote Wakeup Enable */
11912fe8f0eSfgsch #define OHCI_RH_PORT_STATUS(n)	(0x50 + (n)*4) /* 1 based indexing */
12012fe8f0eSfgsch 
12112fe8f0eSfgsch #define OHCI_LES (OHCI_PLE | OHCI_IE | OHCI_CLE | OHCI_BLE)
12212fe8f0eSfgsch #define OHCI_ALL_INTRS (OHCI_SO | OHCI_WDH | OHCI_SF | OHCI_RD | OHCI_UE | \
12312fe8f0eSfgsch                         OHCI_FNO | OHCI_RHSC | OHCI_OC)
12412fe8f0eSfgsch #define OHCI_NORMAL_INTRS (OHCI_SO | OHCI_WDH | OHCI_RD | OHCI_UE | OHCI_RHSC)
12512fe8f0eSfgsch 
12612fe8f0eSfgsch #define OHCI_FSMPS(i) (((i-210)*6/7) << 16)
12712fe8f0eSfgsch #define OHCI_PERIODIC(i) ((i)*9/10)
12812fe8f0eSfgsch 
12912fe8f0eSfgsch typedef u_int32_t ohci_physaddr_t;
13012fe8f0eSfgsch 
13112fe8f0eSfgsch #define OHCI_NO_INTRS 32
13212fe8f0eSfgsch struct ohci_hcca {
13312fe8f0eSfgsch 	ohci_physaddr_t	hcca_interrupt_table[OHCI_NO_INTRS];
13412fe8f0eSfgsch 	u_int32_t	hcca_frame_number;
13512fe8f0eSfgsch 	ohci_physaddr_t	hcca_done_head;
13612fe8f0eSfgsch #define OHCI_DONE_INTRS 1
13712fe8f0eSfgsch };
13812fe8f0eSfgsch #define OHCI_HCCA_SIZE 256
13912fe8f0eSfgsch #define OHCI_HCCA_ALIGN 256
14012fe8f0eSfgsch 
141ce4d7038Sfgsch #define OHCI_PAGE_SIZE 0x1000
142ce4d7038Sfgsch #define OHCI_PAGE(x) ((x) &~ 0xfff)
143fcda16d4Saaron #define OHCI_PAGE_OFFSET(x) ((x) & 0xfff)
144ce4d7038Sfgsch 
145*ab0b1be7Smglocker struct ohci_ed {
14612fe8f0eSfgsch 	u_int32_t	ed_flags;
14712fe8f0eSfgsch #define OHCI_ED_GET_FA(s)	((s) & 0x7f)
14812fe8f0eSfgsch #define OHCI_ED_ADDRMASK	0x0000007f
14912fe8f0eSfgsch #define OHCI_ED_SET_FA(s)	(s)
15012fe8f0eSfgsch #define OHCI_ED_GET_EN(s)	(((s) >> 7) & 0xf)
15112fe8f0eSfgsch #define OHCI_ED_SET_EN(s)	((s) << 7)
15212fe8f0eSfgsch #define OHCI_ED_DIR_MASK	0x00001800
15312fe8f0eSfgsch #define  OHCI_ED_DIR_TD		0x00000000
15412fe8f0eSfgsch #define  OHCI_ED_DIR_OUT	0x00000800
15512fe8f0eSfgsch #define  OHCI_ED_DIR_IN		0x00001000
15612fe8f0eSfgsch #define OHCI_ED_SPEED		0x00002000
15712fe8f0eSfgsch #define OHCI_ED_SKIP		0x00004000
15812fe8f0eSfgsch #define OHCI_ED_FORMAT_GEN	0x00000000
15912fe8f0eSfgsch #define OHCI_ED_FORMAT_ISO	0x00008000
16012fe8f0eSfgsch #define OHCI_ED_GET_MAXP(s)	(((s) >> 16) & 0x07ff)
16112fe8f0eSfgsch #define OHCI_ED_SET_MAXP(s)	((s) << 16)
16212fe8f0eSfgsch #define OHCI_ED_MAXPMASK	(0x7ff << 16)
16312fe8f0eSfgsch 	ohci_physaddr_t	ed_tailp;
16412fe8f0eSfgsch 	ohci_physaddr_t	ed_headp;
165eff3e1aaSaaron #define OHCI_HALTED		0x00000001
166eff3e1aaSaaron #define OHCI_TOGGLECARRY	0x00000002
167eff3e1aaSaaron #define OHCI_HEADMASK		0xfffffffc
16812fe8f0eSfgsch 	ohci_physaddr_t	ed_nexted;
169*ab0b1be7Smglocker };
170f8958cb1Sfgsch /* #define OHCI_ED_SIZE 16 */
17112fe8f0eSfgsch #define OHCI_ED_ALIGN 16
17212fe8f0eSfgsch 
173*ab0b1be7Smglocker struct ohci_td {
17412fe8f0eSfgsch 	u_int32_t	td_flags;
17512fe8f0eSfgsch #define OHCI_TD_R		0x00040000		/* Buffer Rounding  */
17612fe8f0eSfgsch #define OHCI_TD_DP_MASK		0x00180000		/* Direction / PID */
17712fe8f0eSfgsch #define  OHCI_TD_SETUP		0x00000000
17812fe8f0eSfgsch #define  OHCI_TD_OUT		0x00080000
17912fe8f0eSfgsch #define  OHCI_TD_IN		0x00100000
18012fe8f0eSfgsch #define OHCI_TD_GET_DI(x)	(((x) >> 21) & 7)	/* Delay Interrupt */
18112fe8f0eSfgsch #define OHCI_TD_SET_DI(x)	((x) << 21)
18212fe8f0eSfgsch #define  OHCI_TD_NOINTR		0x00e00000
183eff3e1aaSaaron #define  OHCI_TD_INTR_MASK	0x00e00000
18412fe8f0eSfgsch #define OHCI_TD_TOGGLE_CARRY	0x00000000
18512fe8f0eSfgsch #define OHCI_TD_TOGGLE_0	0x02000000
18612fe8f0eSfgsch #define OHCI_TD_TOGGLE_1	0x03000000
187eff3e1aaSaaron #define OHCI_TD_TOGGLE_MASK	0x03000000
18812fe8f0eSfgsch #define OHCI_TD_GET_EC(x)	(((x) >> 26) & 3)	/* Error Count */
18912fe8f0eSfgsch #define OHCI_TD_GET_CC(x)	((x) >> 28)		/* Condition Code */
19012fe8f0eSfgsch #define  OHCI_TD_NOCC		0xf0000000
19112fe8f0eSfgsch 	ohci_physaddr_t	td_cbp;		/* Current Buffer Pointer */
19212fe8f0eSfgsch 	ohci_physaddr_t td_nexttd;	/* Next TD */
19312fe8f0eSfgsch 	ohci_physaddr_t td_be;		/* Buffer End */
194*ab0b1be7Smglocker };
195f8958cb1Sfgsch /* #define OHCI_TD_SIZE 16 */
19612fe8f0eSfgsch #define OHCI_TD_ALIGN 16
19712fe8f0eSfgsch 
198eff3e1aaSaaron #define OHCI_ITD_NOFFSET 8
199*ab0b1be7Smglocker struct ohci_itd {
200eff3e1aaSaaron 	u_int32_t	itd_flags;
201eff3e1aaSaaron #define OHCI_ITD_GET_SF(x)	((x) & 0x0000ffff)
202eff3e1aaSaaron #define OHCI_ITD_SET_SF(x)	((x) & 0xffff)
2035deafb75Saaron #define OHCI_ITD_GET_DI(x)	(((x) >> 21) & 7)	/* Delay Interrupt */
204eff3e1aaSaaron #define OHCI_ITD_SET_DI(x)	((x) << 21)
205eff3e1aaSaaron #define  OHCI_ITD_NOINTR	0x00e00000
206eff3e1aaSaaron #define OHCI_ITD_GET_FC(x)	((((x) >> 24) & 7)+1)	/* Frame Count */
207eff3e1aaSaaron #define OHCI_ITD_SET_FC(x)	(((x)-1) << 24)
208eff3e1aaSaaron #define OHCI_ITD_GET_CC(x)	((x) >> 28)		/* Condition Code */
209eff3e1aaSaaron #define  OHCI_ITD_NOCC		0xf0000000
210eff3e1aaSaaron 	ohci_physaddr_t	itd_bp0;			/* Buffer Page 0 */
211eff3e1aaSaaron 	ohci_physaddr_t	itd_nextitd;			/* Next ITD */
212eff3e1aaSaaron 	ohci_physaddr_t	itd_be;				/* Buffer End */
213eff3e1aaSaaron 	u_int16_t	itd_offset[OHCI_ITD_NOFFSET];	/* Buffer offsets */
214eff3e1aaSaaron #define itd_pswn itd_offset				/* Packet Status Word*/
215eff3e1aaSaaron #define OHCI_ITD_PAGE_SELECT	0x00001000
216fcda16d4Saaron #define OHCI_ITD_MK_OFFS(len)	(0xe000 | ((len) & 0x1fff))
217eff3e1aaSaaron #define OHCI_ITD_PSW_LENGTH(x)	((x) & 0xfff)		/* Transfer length */
218eff3e1aaSaaron #define OHCI_ITD_PSW_GET_CC(x)	((x) >> 12)		/* Condition Code */
219*ab0b1be7Smglocker };
220eff3e1aaSaaron /* #define OHCI_ITD_SIZE 32 */
221eff3e1aaSaaron #define OHCI_ITD_ALIGN 32
222eff3e1aaSaaron 
2235deafb75Saaron 
22412fe8f0eSfgsch #define OHCI_CC_NO_ERROR		0
22512fe8f0eSfgsch #define OHCI_CC_CRC			1
22612fe8f0eSfgsch #define OHCI_CC_BIT_STUFFING		2
22712fe8f0eSfgsch #define OHCI_CC_DATA_TOGGLE_MISMATCH	3
22812fe8f0eSfgsch #define OHCI_CC_STALL			4
22912fe8f0eSfgsch #define OHCI_CC_DEVICE_NOT_RESPONDING	5
23012fe8f0eSfgsch #define OHCI_CC_PID_CHECK_FAILURE	6
23112fe8f0eSfgsch #define OHCI_CC_UNEXPECTED_PID		7
23212fe8f0eSfgsch #define OHCI_CC_DATA_OVERRUN		8
23312fe8f0eSfgsch #define OHCI_CC_DATA_UNDERRUN		9
23412fe8f0eSfgsch #define OHCI_CC_BUFFER_OVERRUN		12
23512fe8f0eSfgsch #define OHCI_CC_BUFFER_UNDERRUN		13
236c32d9e24Spascoe #define OHCI_CC_NOT_ACCESSED		14
237c32d9e24Spascoe #define OHCI_CC_NOT_ACCESSED_MASK	14
23812fe8f0eSfgsch 
23949761770Saaron /* Some delay needed when changing certain registers. */
24049761770Saaron #define OHCI_ENABLE_POWER_DELAY	5
24149761770Saaron #define OHCI_READ_DESC_DELAY	5
24249761770Saaron 
24312fe8f0eSfgsch #endif /* _DEV_PCI_OHCIREG_H_ */
244