siisatareg.h revision 1.2.12.3 1 1.2.12.3 yamt /* $NetBSD: siisatareg.h,v 1.2.12.3 2009/06/20 07:20:22 yamt Exp $ */
2 1.2.12.2 yamt /* Id: siisatareg.h,v 1.10 2008/05/21 15:51:36 jakllsch Exp */
3 1.2.12.2 yamt
4 1.2.12.2 yamt /*-
5 1.2.12.2 yamt * Copyright (c) 2007, 2008 Jonathan A. Kollasch.
6 1.2.12.2 yamt * All rights reserved.
7 1.2.12.2 yamt *
8 1.2.12.2 yamt * Redistribution and use in source and binary forms, with or without
9 1.2.12.2 yamt * modification, are permitted provided that the following conditions
10 1.2.12.2 yamt * are met:
11 1.2.12.2 yamt * 1. Redistributions of source code must retain the above copyright
12 1.2.12.2 yamt * notice, this list of conditions and the following disclaimer.
13 1.2.12.2 yamt * 2. Redistributions in binary form must reproduce the above copyright
14 1.2.12.2 yamt * notice, this list of conditions and the following disclaimer in the
15 1.2.12.2 yamt * documentation and/or other materials provided with the distribution.
16 1.2.12.2 yamt *
17 1.2.12.2 yamt * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 1.2.12.2 yamt * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 1.2.12.2 yamt * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 1.2.12.2 yamt * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 1.2.12.2 yamt * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 1.2.12.2 yamt * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 1.2.12.2 yamt * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 1.2.12.2 yamt * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 1.2.12.2 yamt * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 1.2.12.2 yamt * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 1.2.12.2 yamt *
28 1.2.12.2 yamt */
29 1.2.12.2 yamt
30 1.2.12.2 yamt /* Silicon Image SATA 2 controller register defines */
31 1.2.12.2 yamt
32 1.2.12.2 yamt #include <sys/cdefs.h>
33 1.2.12.2 yamt
34 1.2.12.2 yamt /* the SiI3124 has 4 ports, all others so far have less */
35 1.2.12.2 yamt #define SIISATA_MAX_PORTS 4
36 1.2.12.3 yamt /* all parts have a full complement of slots (so far) */
37 1.2.12.2 yamt #define SIISATA_MAX_SLOTS 31
38 1.2.12.2 yamt
39 1.2.12.2 yamt /* structures */
40 1.2.12.2 yamt
41 1.2.12.2 yamt /* Scatter/Gather Entry */
42 1.2.12.2 yamt struct siisata_sge {
43 1.2.12.2 yamt #if 0
44 1.2.12.2 yamt uint32_t sge_dal; /* data address low */
45 1.2.12.2 yamt uint32_t sge_dah; /* " " high */
46 1.2.12.2 yamt #else
47 1.2.12.2 yamt uint64_t sge_da;
48 1.2.12.2 yamt #endif
49 1.2.12.2 yamt uint32_t sge_dc; /* data count (bytes) */
50 1.2.12.2 yamt uint32_t sge_flags; /* */
51 1.2.12.2 yamt #define SGE_FLAG_TRM __BIT(31)
52 1.2.12.2 yamt #define SGE_FLAG_LNK __BIT(30)
53 1.2.12.2 yamt #define SGE_FLAG_DRD __BIT(29)
54 1.2.12.2 yamt #define SGE_FLAG_XCF __BIT(28)
55 1.2.12.2 yamt } __packed;
56 1.2.12.2 yamt
57 1.2.12.2 yamt /* Scatter/Gather Table */
58 1.2.12.2 yamt /* must be aligned to 64-bit boundary */
59 1.2.12.2 yamt struct siisata_sgt {
60 1.2.12.2 yamt struct siisata_sge sgt_sge[4];
61 1.2.12.2 yamt } __packed;
62 1.2.12.2 yamt
63 1.2.12.2 yamt /* Port Request Block */
64 1.2.12.2 yamt struct siisata_prb {
65 1.2.12.2 yamt uint16_t prb_control; /* Control Field */
66 1.2.12.2 yamt #define PRB_CF_PROTOCOL_OVERRIDE __BIT(0)
67 1.2.12.2 yamt #define PRB_CF_RETRANSMIT __BIT(1)
68 1.2.12.2 yamt #define PRB_CF_EXTERNAL_COMMAND __BIT(2)
69 1.2.12.2 yamt #define PRB_CF_RECEIVE __BIT(3)
70 1.2.12.2 yamt #define PRB_CF_PACKET_READ __BIT(4)
71 1.2.12.2 yamt #define PRB_CF_PACKET_WRITE __BIT(5)
72 1.2.12.2 yamt #define PRB_CF_INTERRUPT_MASK __BIT(6)
73 1.2.12.2 yamt #define PRB_CF_SOFT_RESET __BIT(7)
74 1.2.12.2 yamt uint16_t prb_protocol_override;
75 1.2.12.2 yamt #define PRB_PO_PACKET __BIT(0)
76 1.2.12.2 yamt #define PRB_PO_LCQ __BIT(1)
77 1.2.12.2 yamt #define PRB_PO_NCQ __BIT(2)
78 1.2.12.2 yamt #define PRB_PO_READ __BIT(3)
79 1.2.12.2 yamt #define PRB_PO_WRITE __BIT(4)
80 1.2.12.2 yamt #define PRB_PO_TRANSPARENT __BIT(5)
81 1.2.12.2 yamt uint32_t prb_transfer_count;
82 1.2.12.2 yamt uint8_t prb_fis[20];
83 1.2.12.2 yamt uint32_t prb_reserved_0x1C; /* "must be zero" */
84 1.2.12.2 yamt /* First SGE in PRB is always reserved for ATAPI in this implementation. */
85 1.2.12.2 yamt uint8_t prb_atapi[16]; /* zero for non-ATAPI */
86 1.2.12.2 yamt struct siisata_sge prb_sge[1]; /* extended to NSGE */
87 1.2.12.2 yamt } __packed;
88 1.2.12.2 yamt
89 1.2.12.2 yamt
90 1.2.12.2 yamt #define SIISATA_NSGE ((MAXPHYS/PAGE_SIZE) + 1)
91 1.2.12.2 yamt #define SIISATA_CMD_ALIGN 0x7f
92 1.2.12.2 yamt #define SIISATA_CMD_SIZE \
93 1.2.12.2 yamt ( ( sizeof(struct siisata_prb) + (SIISATA_NSGE - 1) * sizeof(struct siisata_sge) + SIISATA_CMD_ALIGN ) & ~SIISATA_CMD_ALIGN )
94 1.2.12.2 yamt
95 1.2.12.2 yamt /* PCI stuff */
96 1.2.12.2 yamt #define SIISATA_PCI_BAR0 0x10
97 1.2.12.2 yamt #define SIISATA_PCI_BAR1 0x18
98 1.2.12.2 yamt #define SIISATA_PCI_BAR2 0x20
99 1.2.12.2 yamt
100 1.2.12.2 yamt /* BAR 0 */
101 1.2.12.2 yamt
102 1.2.12.2 yamt /* port n slot status */
103 1.2.12.2 yamt #define GR_PXSS(n) (n*4)
104 1.2.12.2 yamt /* global control */
105 1.2.12.2 yamt #define GR_GC 0x40
106 1.2.12.2 yamt /* global interrupt status */
107 1.2.12.2 yamt #define GR_GIS 0x44
108 1.2.12.2 yamt /* phy config - don't touch */
109 1.2.12.2 yamt #define GR_PHYC 0x48
110 1.2.12.2 yamt /* BIST */
111 1.2.12.2 yamt #define GR_BIST_CONTROL 0x50
112 1.2.12.2 yamt #define GR_BIST_PATTERN 0x54
113 1.2.12.2 yamt #define GR_BIST_STATUS 0x58
114 1.2.12.2 yamt /* I2C SiI3132 */
115 1.2.12.2 yamt #define GR_SII3132_IICCONTROL 0x60
116 1.2.12.2 yamt #define GR_SII3132_IICSTATUS 0x64
117 1.2.12.2 yamt #define GR_SII3132_IICSLAVEADDR 0x68
118 1.2.12.2 yamt #define GR_SII3132_IICDATA 0x6c
119 1.2.12.2 yamt /* Flash */
120 1.2.12.2 yamt #define GR_FLSHADDR 0x70
121 1.2.12.2 yamt #define GR_FLSHDATA 0x74
122 1.2.12.2 yamt /* I2C SiI3124 */
123 1.2.12.2 yamt #define GR_SII3124_IICADDR 0x78
124 1.2.12.2 yamt #define GR_SII3124_IICDATA 0x7c
125 1.2.12.2 yamt
126 1.2.12.2 yamt
127 1.2.12.2 yamt /* GR_GC bits */
128 1.2.12.2 yamt #define GR_GC_GLBLRST __BIT(31)
129 1.2.12.2 yamt #define GR_GC_MSIACK __BIT(30)
130 1.2.12.2 yamt #define GR_GC_I2CINTEN __BIT(29)
131 1.2.12.2 yamt #define GR_GC_PERRRPTDSBL __BIT(28)
132 1.2.12.2 yamt #define GR_GC_3GBPS __BIT(24)
133 1.2.12.2 yamt #define GR_GC_REQ64 __BIT(20)
134 1.2.12.2 yamt #define GR_GC_DEVSEL __BIT(19)
135 1.2.12.2 yamt #define GR_GC_STOP __BIT(18)
136 1.2.12.2 yamt #define GR_GC_TRDY __BIT(17)
137 1.2.12.2 yamt #define GR_GC_M66EN __BIT(16)
138 1.2.12.2 yamt #define GR_GC_PXIE_MASK __BITS(SIISATA_MAX_PORTS - 1, 0)
139 1.2.12.2 yamt #define GR_GC_PXIE(n) __SHIFTIN(__BIT(n), GR_GC_PXIE_MASK)
140 1.2.12.2 yamt
141 1.2.12.2 yamt /* GR_GIS bits */
142 1.2.12.2 yamt #define GR_GIS_I2C __BIT(29)
143 1.2.12.2 yamt #define GR_GIS_PXIS_MASK __BITS(SIISATA_MAX_PORTS - 1, 0)
144 1.2.12.2 yamt #define GR_GIS_PXIS(n) __SHIFTIN(__BIT(n), GR_GIS_PXIS_MASK)
145 1.2.12.2 yamt
146 1.2.12.2 yamt
147 1.2.12.2 yamt /* BAR 1 */
148 1.2.12.2 yamt
149 1.2.12.2 yamt /* hmm, this could use a better name */
150 1.2.12.2 yamt #define PR_PORT_SIZE 0x2000
151 1.2.12.2 yamt #define PR_SLOT_SIZE 0x80
152 1.2.12.2 yamt /* get the register by port number and offset */
153 1.2.12.2 yamt #define PRO(p) (PR_PORT_SIZE * p)
154 1.2.12.2 yamt #define PRX(p,r) (PRO(p) + r)
155 1.2.12.2 yamt #define PRSX(p,s,o) (PRX(p, PR_SLOT_SIZE * s + o))
156 1.2.12.2 yamt
157 1.2.12.2 yamt #define PRSO_RTC 0x04 /* recieved transfer count */
158 1.2.12.2 yamt #define PRSO_FIS 0x08 /* base of FIS */
159 1.2.12.2 yamt
160 1.2.12.2 yamt #define PRO_PCS 0x1000 /* (write) port control set */
161 1.2.12.2 yamt #define PRO_PS PRO_PCS /* (read) port status */
162 1.2.12.2 yamt #define PRO_PCC 0x1004 /* port control clear */
163 1.2.12.2 yamt #define PRO_PIS 0x1008 /* port interrupt status */
164 1.2.12.2 yamt #define PRO_PIES 0x1010 /* port interrupt enable set */
165 1.2.12.2 yamt #define PRO_PIEC 0x1014 /* port interrupt enable clear */
166 1.2.12.2 yamt #define PRO_32BAUA 0x101c /* 32-bit activation upper address */
167 1.2.12.2 yamt #define PRO_PCEF 0x1020 /* port command execution fifo */
168 1.2.12.2 yamt #define PRO_PCE 0x1024 /* port command error */
169 1.2.12.2 yamt #define PRO_PFISC 0x1028 /* port FIS config */
170 1.2.12.2 yamt #define PRO_PCIRFIFOT 0x102c /* pci request fifo threshhold */
171 1.2.12.2 yamt #define PRO_P8B10BDEC 0x1040 /* port 8B/10B decode error counter */
172 1.2.12.2 yamt #define PRO_PCRCEC 0x1044 /* port crc error count */
173 1.2.12.2 yamt #define PRO_PHEC 0x1048 /* port handshake error count */
174 1.2.12.2 yamt #define PRO_PPHYC 0x1050 /* phy config */
175 1.2.12.2 yamt #define PRO_PSS 0x1800 /* port slot status */
176 1.2.12.2 yamt /* technically this is a shadow of the CAR */
177 1.2.12.2 yamt #define PRO_CAR 0x1c00
178 1.2.12.2 yamt
179 1.2.12.2 yamt #define PRO_CARX(p,s) (PRX(p, PRO_CAR) + s * sizeof(uint64_t))
180 1.2.12.2 yamt
181 1.2.12.2 yamt #define PRO_PCR 0x1e04 /* port context register */
182 1.2.12.2 yamt #define PRO_SCONTROL 0x1f00 /* SControl */
183 1.2.12.2 yamt #define PRO_SSTATUS 0x1f04 /* SStatus */
184 1.2.12.2 yamt #define PRO_SERROR 0x1f08 /* SError */
185 1.2.12.2 yamt #define PRO_SACTIVE 0x1f0c /* SActive */
186 1.2.12.2 yamt
187 1.2.12.2 yamt
188 1.2.12.2 yamt /* Port Command Error */
189 1.2.12.2 yamt #define PR_PCE_DEVICEERROR 1
190 1.2.12.2 yamt #define PR_PCE_SDBERROR 2
191 1.2.12.2 yamt #define PR_PCE_DATAFISERROR 3
192 1.2.12.2 yamt #define PR_PCE_SENDFISERROR 4
193 1.2.12.2 yamt #define PR_PCE_INCONSISTENTSTATE 5
194 1.2.12.2 yamt #define PR_PCE_DIRECTIONERROR 6
195 1.2.12.2 yamt #define PR_PCE_UNDERRUNERROR 7
196 1.2.12.2 yamt #define PR_PCE_OVERRUNERROR 8
197 1.2.12.2 yamt #define PR_PCE_LINKFIFOOVERRUN 9
198 1.2.12.2 yamt #define PR_PCE_PACKETPROTOCOLERROR 11
199 1.2.12.2 yamt #define PR_PCE_PLDSGTERRORBOUNDARY 16
200 1.2.12.2 yamt #define PR_PCE_PLDSGTERRORTARGETABORT 17
201 1.2.12.2 yamt #define PR_PCE_PLDSGTERRORMASTERABORT 18
202 1.2.12.2 yamt #define PR_PCE_PLDSGTERRORPCIPERR 19
203 1.2.12.2 yamt #define PR_PCE_PLDCMDERRORBOUNDARY 24
204 1.2.12.2 yamt #define PR_PCE_PLDCMDERRORTARGETABORT 25
205 1.2.12.2 yamt #define PR_PCE_PLDCMDERRORMASTERABORT 26
206 1.2.12.2 yamt #define PR_PCE_PLDCMDERRORPCIPERR 27
207 1.2.12.2 yamt #define PR_PCE_PSDERRORTARGETABORT 33
208 1.2.12.2 yamt #define PR_PCE_PSDERRORMASTERABORT 34
209 1.2.12.2 yamt #define PR_PCE_PSDERRORPCIPERR 35
210 1.2.12.2 yamt #define PR_PCE_SENDSERVICEERROROR 36
211 1.2.12.2 yamt
212 1.2.12.2 yamt
213 1.2.12.2 yamt #define PR_PIS_UNMASKED_SHIFT 16
214 1.2.12.2 yamt #define PR_PIS_CMDCMPL __BIT(0) /* command completion */
215 1.2.12.2 yamt #define PR_PIS_CMDERRR __BIT(1) /* command error */
216 1.2.12.2 yamt #define PR_PIS_PRTRDY __BIT(2) /* port ready */
217 1.2.12.2 yamt #define PR_PIS_PMCHNG __BIT(3) /* power management state change */
218 1.2.12.2 yamt #define PR_PIS_PHYRDYCHG __BIT(4)
219 1.2.12.2 yamt #define PR_PIS_COMWAKE __BIT(5)
220 1.2.12.2 yamt #define PR_PIS_UNRECFIS __BIT(6)
221 1.2.12.2 yamt #define PR_PIS_DEVEXCHG __BIT(7)
222 1.2.12.2 yamt #define PR_PIS_8B10BDET __BIT(8)
223 1.2.12.2 yamt #define PR_PIS_CRCET __BIT(9)
224 1.2.12.2 yamt #define PR_PIS_HET __BIT(10)
225 1.2.12.2 yamt #define PR_PIS_SDBN __BIT(11)
226 1.2.12.2 yamt
227 1.2.12.2 yamt #define PR_PC_PORT_RESET __BIT(0)
228 1.2.12.2 yamt #define PR_PC_DEVICE_RESET __BIT(1)
229 1.2.12.2 yamt #define PR_PC_PORT_INITIALIZE __BIT(2)
230 1.2.12.2 yamt #define PR_PC_INCOR __BIT(3)
231 1.2.12.2 yamt #define PR_PC_LED_DISABLE __BIT(4)
232 1.2.12.2 yamt #define PR_PC_PACKET_LENGTH __BIT(5)
233 1.2.12.2 yamt #define PR_PC_RESUME __BIT(6)
234 1.2.12.2 yamt #define PR_PC_TXBIST __BIT(7)
235 1.2.12.2 yamt #define PR_PC_CONT_DISABLE __BIT(8)
236 1.2.12.2 yamt #define PR_PC_SCRAMBLER_DISABLE __BIT(9)
237 1.2.12.2 yamt #define PR_PC_32BA __BIT(10)
238 1.2.12.2 yamt #define PR_PC_INTERLOCK_REJECT __BIT(11)
239 1.2.12.2 yamt #define PR_PC_INTERLOCK_ACCEPT __BIT(12)
240 1.2.12.2 yamt #define PR_PC_PMP_ENABLE __BIT(13)
241 1.2.12.2 yamt #define PR_PC_AIA __BIT(14)
242 1.2.12.2 yamt #define PR_PC_LED_ON __BIT(15)
243 1.2.12.2 yamt #define PR_PC_OOB_BYPASS __BIT(25)
244 1.2.12.2 yamt #define PR_PS_PORT_READY __BIT(31)
245 1.2.12.2 yamt
246 1.2.12.2 yamt #define PR_PSS_ATTENTION __BIT(31)
247 1.2.12.2 yamt #define PR_PSS_SLOT_MASK __BITS(30, 0)
248 1.2.12.2 yamt #define PR_PXSS(n) __SHIFTIN(__BIT(n), PR_PSS_SLOT_MASK)
249