xref: /openbsd/sys/dev/ic/silireg.h (revision 404b540a)
1 /*	$OpenBSD: silireg.h,v 1.20 2007/04/07 13:02:52 pascoe Exp $ */
2 
3 /*
4  * Copyright (c) 2007 David Gwynne <dlg@openbsd.org>
5  *
6  * Permission to use, copy, modify, and distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 /* PCI Registers */
20 #define SILI_PCI_BAR_GLOBAL	0x10 /* Global Registers address */
21 #define SILI_PCI_BAR_PORT	0x18 /* Port Registers address */
22 #define SILI_PCI_BAR_INDIRECT	0x20 /* Indirect IO Registers address */
23 
24 /* Global Registers */
25 #define SILI_REG_PORT0_STATUS	0x00 /* Port 0 Slot Status */
26 #define SILI_REG_PORT1_STATUS	0x04 /* Port 1 Slot Status */
27 #define SILI_REG_PORT2_STATUS	0x08 /* Port 2 Slot Status */
28 #define SILI_REG_PORT3_STATUS	0x0c /* Port 3 Slot Status */
29 #define SILI_REG_GC		0x40 /* Global Control */
30 #define  SILI_REG_GC_GR			(1<<31) /* Global Reset */
31 #define  SILI_REG_GC_MSIACK		(1<<30) /* MSI Acknowledge */
32 #define  SILI_REG_GC_I2CINT		(1<<29) /* I2C Interrupt Enable */
33 #define  SILI_REG_GC_PERRDIS		(1<<28) /* PCI Error Report Disable */
34 #define  SILI_REG_GC_REQ64		(1<<20) /* latched PCI REQ64 */
35 #define  SILI_REG_GC_DEVSEL		(1<<19) /* latched PCI DEVSEL */
36 #define  SILI_REG_GC_STOP		(1<<18) /* latched PCI STOP */
37 #define  SILI_REG_GC_TRDY		(1<<17) /* latched PCI TRDY */
38 #define  SILI_REG_GC_M66EN		(1<<16) /* M66EN PCI bus signal */
39 #define  SILI_REG_GC_PIE_MASK		0x0f
40 #define SILI_FMT_GC		"\020" "\040GR" "\037MSIACK" "\036I2CINT" \
41 				    "\035PERRDIS" "\025REQ64" "\024DEVSEL" \
42 				    "\023STOP" "\022TRDY" "\021M66EN" \
43 				    "\004P3IE" "\003P2IE" "\002P1IE" "\001P0IE"
44 #define SILI_REG_GIS		0x44 /* Global Interrupt Status */
45 #define  SILI_REG_GIS_I2C		(1 << 29)
46 #define  SILI_REG_GIS_PIS_MASK		0x0f
47 #define SILI_REG_PHYCONF	0x48 /* PHY Configuration */
48 #define SILI_REG_BISTCTL	0x50 /* BIST Control */
49 #define SILI_REG_BISTPATTERN	0x54 /* BIST Pattern */
50 #define SILI_REG_BISTSTAT	0x58 /* BIST Status */
51 #define SILI_REG_FLASHADDR	0x70 /* Flash Address */
52 #define SILI_REG_FLASHDATA	0x74 /* Flash Memory Data / GPIO Control */
53 #define SILI_REG_GPIOCTL	SILI_REG_FLASHDATA
54 #define SILI_REG_IICADDR	0x78 /* I2C Address */
55 #define SILI_REG_IIC		0x7c /* I2C Data / Control */
56 
57 #define SILI_PORT_SIZE		0x2000
58 #define SILI_PORT_OFFSET(_p)	((_p) * SILI_PORT_SIZE)
59 
60 /* Port Registers */
61 #define SILI_PREG_LRAM		0x0000 /* Port LRAM */
62 #define SILI_PREG_SLOT_WIDTH	0x80
63 #define SILI_PREG_SLOT(_s)	(SILI_PREG_LRAM + (_s) * SILI_PREG_SLOT_WIDTH)
64 #define SILI_PREG_RX_COUNT(_s)	(SILI_PREG_SLOT(_s) + 0x04)
65 #define SILI_PREG_SIG_HI(_s)	(SILI_PREG_SLOT(_s) + 0x0c)
66 #define SILI_PREG_SIG_HI_SHIFT	8
67 #define SILI_PREG_SIG_LO(_s)	(SILI_PREG_SLOT(_s) + 0x14)
68 #define SILI_PREG_SIG_LO_MASK	0xff
69 /* XXX PMP Bits */
70 #define SILI_PREG_PCS		0x1000 /* Port Control Set / Status */
71 #define  SILI_PREG_PCS_PORTRDY		(1<<31) /* Port Ready */
72 #define  SILI_PREG_PCS_OOBB		(1<<25) /* OOB Bypass */
73 #define  SILI_PREG_PCS_ACTIVE(_x)	(((_x)>>16) & 0x1f) /* Active Slot */
74 #define  SILI_PREG_PCS_LED_ON		(1<<15) /* LED On */
75 #define  SILI_PREG_PCS_AIA		(1<<14) /* Auto Interlock Accept */
76 #define  SILI_PREG_PCS_PMEN		(1<<13) /* Port Mult Enable */
77 #define  SILI_PREG_PCS_IA		(1<<12) /* Interlock Accept */
78 #define  SILI_PREG_PCS_IR		(1<<11) /* Interlock Reject */
79 #define  SILI_PREG_PCS_A32B		(1<<10) /* 32-bit Activation */
80 #define  SILI_PREG_PCS_SD		(1<<9) /* Scrambler Disable */
81 #define  SILI_PREG_PCS_CD		(1<<8) /* CONT Disable */
82 #define  SILI_PREG_PCS_TB		(1<<7) /* Transmit BIST */
83 #define  SILI_PREG_PCS_RESUME		(1<<6) /* Resume */
84 #define  SILI_PREG_PCS_PLEN		(1<<5) /* Packet Length */
85 #define  SILI_PREG_PCS_LEDDISABLE	(1<<4) /* LED Disable */
86 #define  SILI_PREG_PCS_NOINTCLR		(1<<3) /* No Intr Clear on Read */
87 #define  SILI_PREG_PCS_PORTINIT		(1<<2) /* Port Initialize */
88 #define  SILI_PREG_PCS_DEVRESET		(1<<1) /* Device Reset */
89 #define  SILI_PREG_PCS_PORTRESET	(1<<0) /* Port Reset */
90 #define SILI_PFMT_PCS		"\020" "\032OOBB" "\020LED_ON" "\017AIA" \
91 				    "\016PMEN" "\015IA" "\014IR" "\013A32B" \
92 				    "\012SD" "\011CD" "\010TB" "\007RESUME" \
93 				    "\006PLEN" "\005LEDDISABLE" \
94 				    "\004NOINTCLR" "\003PORTINIT" \
95 				    "\002PORTINIT" "\001PORTRESET"
96 #define SILI_PREG_PCC		0x1004 /* Port Control Clear */
97 #define  SILI_PREG_PCC_OOBB		(1<<25) /* OOB Bypass */
98 #define  SILI_PREG_PCC_LED_ON		(1<<15) /* LED On */
99 #define  SILI_PREG_PCC_AIA		(1<<14) /* Auto Interlock Accept */
100 #define  SILI_PREG_PCC_PMEN		(1<<13) /* Port Mult Enable */
101 #define  SILI_PREG_PCC_IA		(1<<12) /* Interlock Accept */
102 #define  SILI_PREG_PCC_IR		(1<<11) /* Interlock Reject */
103 #define  SILI_PREG_PCC_A32B		(1<<10) /* 32-bit Activation */
104 #define  SILI_PREG_PCC_SD		(1<<9) /* Scrambler Disable */
105 #define  SILI_PREG_PCC_CD		(1<<8) /* CONT Disable */
106 #define  SILI_PREG_PCC_TB		(1<<7) /* Transmit BIST */
107 #define  SILI_PREG_PCC_RESUME		(1<<6) /* Resume */
108 #define  SILI_PREG_PCC_PLEN		(1<<5) /* Packet Length */
109 #define  SILI_PREG_PCC_LEDDISABLE	(1<<4) /* LED Disable */
110 #define  SILI_PREG_PCC_NOINTCLR		(1<<3) /* No Intr Clear on Read */
111 #define  SILI_PREG_PCC_PORTINIT		(1<<2) /* Port Initialize */
112 #define  SILI_PREG_PCC_DEVRESET		(1<<1) /* Device Reset */
113 #define  SILI_PREG_PCC_PORTRESET	(1<<0) /* Port Reset */
114 #define SILI_PREG_IS		0x1008 /* Interrupt Status */
115 #define  SILI_PREG_IS_SDB		(1<<11) /* SDB Notify */
116 #define  SILI_PREG_IS_HANDSHAKE		(1<<10) /* Handshake error threshold */
117 #define  SILI_PREG_IS_CRC		(1<<9) /* CRC error threshold */
118 #define  SILI_PREG_IS_DEC		(1<<8) /* 8b/10b decode error thresh */
119 #define  SILI_PREG_IS_DEVXCHG		(1<<7) /* Device Exchanged */
120 #define  SILI_PREG_IS_UNRECFIS		(1<<6) /* Unrecognized FIS Type */
121 #define  SILI_PREG_IS_COMWAKE		(1<<5) /* ComWake */
122 #define  SILI_PREG_IS_PHYRDYCHG		(1<<4) /* Phy Ready Change */
123 #define  SILI_PREG_IS_PMCHG		(1<<3) /* Power Mmgt Change */
124 #define  SILI_PREG_IS_PORTRDY		(1<<2) /* Port Ready */
125 #define  SILI_PREG_IS_CMDERR		(1<<1) /* Command Error */
126 #define  SILI_PREG_IS_CMDCOMP		(1<<0) /* Command Completion */
127 #define SILI_PFMT_IS		"\020" "\014SDB" "\013HANDSHAKE" \
128 				    "\012CRC" "\011DECODE" \
129 				    "\010DEVXCHG" "\007UNRECFIS" \
130 				    "\006COMWAKE" "\005PHYRDYCHG" \
131 				    "\004PMCHG" "\003PORTRDY" \
132 				    "\002CMDERR" "\001CMDCOMP"
133 #define SILI_PREG_IES		0x1010 /* Interrupt Enable Set */
134 #define SILI_PREG_IEC		0x1014 /* Interrupt Enable Clear */
135 #define  SILI_PREG_IE_SDB		(1<<11) /* SDB Notify */
136 #define  SILI_PREG_IE_DEVXCHG		(1<<7) /* Device Exchange */
137 #define  SILI_PREG_IE_UNRECFIS		(1<<6) /* Unrecognized FIS Type */
138 #define  SILI_PREG_IE_COMWAKE		(1<<5) /* ComWake */
139 #define  SILI_PREG_IE_PHYRDYCHG		(1<<4) /* Phy Ready Change */
140 #define  SILI_PREG_IE_PMCHG		(1<<3) /* Power Mmgt Change */
141 #define  SILI_PREG_IE_PORTRDY		(1<<2) /* Port Ready */
142 #define  SILI_PREG_IE_CMDERR		(1<<1) /* Command Error */
143 #define  SILI_PREG_IE_CMDCOMP		(1<<0) /* Command Completion */
144 #define  SILI_PREG_IE_ALL		0x08ff
145 #define SILI_PREG_AUA		0x101c /* Activation Upper Address */
146 #define SILI_PREG_FIFO		0x1020 /* Command Execution FIFO */
147 #define SILI_PREG_CE		0x1024 /* Command Error */
148 #define  SILI_PREG_CE_DEVICEERROR		1
149 #define  SILI_PREG_CE_SDBERROR			2
150 #define  SILI_PREG_CE_DATAFISERROR		3
151 #define SILI_PREG_FC		0x1028 /* FIS Configuration */
152 #define SILI_PREG_RFT		0x102c /* Request FIFO Threshold */
153 #define SILI_PREG_DEC		0x1040 /* 8b/10b Decode Error Counter */
154 #define SILI_PREG_CEC		0x1044 /* CRC Error Counter */
155 #define SILI_PREG_HEC		0x1048 /* Handshake Error Counter */
156 #define SILI_PREG_PHYCONF	0x1050 /* Port PHY Configuration */
157 #define SILI_PREG_PSS		0x1800 /* Port Slot Status */
158 #define SILI_PREG_PSS_ATTENTION		(1 << 31)
159 #define SILI_PREG_PSS_ALL_SLOTS		0x7fffffff
160 #define SILI_PREG_CAR_LO(_s)	(0x1c00 + ((_s) * 0x8)) /* Cmd Activate Reg */
161 #define SILI_PREG_CAR_HI(_s)	(0x1c00 + ((_s) * 0x8) + 0x4)
162 #define SILI_PREG_CONTEXT	0x1e0f /* Port Context Register */
163 #define SILI_PREG_SCTL		0x1f00 /* SControl */
164 #define SILI_PREG_SSTS		0x1f04 /* SStatus */
165 #define SILI_PREG_SERR		0x1f08 /* SError */
166 #define SILI_PREG_SACT		0x1f0c /* SActive */
167 
168 
169 struct sili_sge {
170 	u_int32_t		addr_lo;
171 	u_int32_t		addr_hi;
172 	u_int32_t		data_count;
173 	u_int32_t		flags;
174 #define SILI_SGE_TRM			(1<<31)
175 #define SILI_SGE_LNK			(1<<30)
176 #define SILI_SGE_DRD			(1<<29)
177 #define SILI_SGE_XCF			(1<<28)
178 } __packed;
179 
180 #define SILI_SGT_SGLLEN		4
181 
182 struct sili_sgt {
183 	struct sili_sge		sgl[SILI_SGT_SGLLEN];
184 } __packed;
185 
186 #define SILI_PRB_PROTOCOL_OVERRIDE	(1<<0)
187 #define SILI_PRB_RETRANSMIT		(1<<1)
188 #define SILI_PRB_EXTERNAL_COMMAND	(1<<2)
189 #define SILI_PRB_RECEIVE		(1<<3)
190 #define SILI_PRB_PACKET_READ		(1<<4)
191 #define SILI_PRB_PACKET_WRITE		(1<<5)
192 #define SILI_PRB_INTERRUPT_MASK		(1<<6)
193 #define SILI_PRB_SOFT_RESET		(1<<7)
194 
195 struct sili_prb { /* this is just a useful template */
196 	u_int16_t		control;
197 	u_int16_t		reserved1;
198 	u_int32_t		reserved2;
199 
200 	u_int8_t		fis[ATA_FIS_LENGTH];
201 
202 	u_int32_t		reserved3[9];
203 } __packed;
204 
205 struct sili_prb_ata {
206 	u_int16_t		control;
207 	u_int16_t		protocol_override;
208 	u_int32_t		rx_count;
209 
210 	u_int8_t		fis[ATA_FIS_LENGTH];
211 
212 	u_int32_t		reserved;
213 
214 	struct sili_sge		sgl[2];
215 } __packed;
216 
217 struct sili_prb_packet {
218 	u_int16_t		control;
219 	u_int16_t		protocol_override;
220 	u_int32_t		rx_count;
221 
222 	u_int8_t		fis[ATA_FIS_LENGTH];
223 
224 	u_int32_t		reserved;
225 
226 	u_int8_t		cdb[16];
227 
228 	struct sili_sge		sgl[1];
229 } __packed;
230 
231 struct sili_prb_softreset {
232 	u_int16_t		control;
233 	u_int16_t		reserved1;
234 	u_int32_t		reserved2;
235 
236 	u_int8_t		fis[ATA_FIS_LENGTH];
237 
238 	u_int32_t		reserved3[9];
239 } __packed;
240 
241 #define SILI_MAX_CMDS		31
242 #define SILI_PRB_LENGTH		64
243 #define SILI_PRB_ALIGN		8
244 #define SILI_SGT_LENGTH		64
245