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