This source file includes following definitions.
- ba5_read_4_ind
- ba5_read_4
- ba5_write_4_ind
- ba5_write_4
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 #ifndef _DEV_PCI_PCIIDE_SII3112_REG_H_
40 #define _DEV_PCI_PCIIDE_SII3112_REG_H_
41
42
43
44
45
46 #define SII3112_PCI_CFGCTL 0x40
47 #define CFGCTL_CFGWREN (1U << 0)
48 #define CFGCTL_BA5INDEN (1U << 1)
49
50 #define SII3112_PCI_SWDATA 0x44
51
52 #define SII3112_PCI_BM_IDE0 0x70
53
54
55 #define SII3112_PCI_PRD_IDE0 0x74
56
57
58 #define SII3112_PCI_BM_IDE1 0x78
59
60
61 #define SII3112_PCI_PRD_IDE1 0x7c
62
63
64 #define SII3112_DTM_IDE0 0x80
65 #define SII3112_DTM_IDE1 0x84
66 #define DTM_IDEx_PIO 0x00000000
67 #define DTM_IDEx_DMA 0x00000002
68
69
70 #define SII3112_SCS_CMD 0x88
71 #define SCS_CMD_PBM_RESET (1U << 0)
72 #define SCS_CMD_ARB_RESET (1U << 1)
73 #define SCS_CMD_FF1_RESET (1U << 4)
74 #define SCS_CMD_FF0_RESET (1U << 5)
75 #define SCS_CMD_IDE1_RESET (1U << 6)
76 #define SCS_CMD_IDE0_RESET (1U << 7)
77 #define SCS_CMD_FF3_RESET (1U << 8)
78 #define SCS_CMD_FF2_RESET (1U << 9)
79 #define SCS_CMD_IDE3_RESET (1U << 10)
80 #define SCS_CMD_IDE2_RESET (1U << 11)
81 #define SCS_CMD_BA5_EN (1U << 16)
82 #define SCS_CMD_M66EN (1U << 16)
83 #define SCS_CMD_IDE0_INT_BLOCK (1U << 22)
84 #define SCS_CMD_IDE1_INT_BLOCK (1U << 23)
85 #define SCS_CMD_IDE2_INT_BLOCK (1U << 24)
86 #define SCS_CMD_IDE3_INT_BLOCK (1U << 25)
87
88 #define SII3112_SSDR 0x8c
89
90 #define SII3112_FMA_CSR 0x90
91
92 #define SII3112_FM_DATA 0x94
93
94 #define SII3112_EEA_CSR 0x98
95
96 #define SII3112_EE_DATA 0x9c
97
98 #define SII3112_TCS_IDE0 0xa0
99 #define SII3112_TCS_IDE1 0xb0
100 #define TCS_IDEx_BCA (1U << 1)
101 #define TCS_IDEx_CH_RESET (1U << 2)
102 #define TCS_IDEx_VDMA_INT (1U << 10)
103 #define TCS_IDEx_INT (1U << 11)
104 #define TCS_IDEx_WTT (1U << 12)
105 #define TCS_IDEx_WTEN (1U << 13)
106 #define TCS_IDEx_WTINTEN (1U << 14)
107
108 #define SII3112_BA5_IND_ADDR 0xc0
109
110 #define SII3112_BA5_IND_DATA 0xc4
111
112
113
114
115 static const struct {
116 bus_addr_t ba5_IDEDMA_CMD;
117 bus_addr_t ba5_IDEDMA_CTL;
118 bus_addr_t ba5_IDEDMA_TBL;
119 bus_addr_t ba5_IDEDMA_CMD2;
120 bus_addr_t ba5_IDEDMA_CTL2;
121 bus_addr_t ba5_IDE_TF0;
122 bus_addr_t ba5_IDE_TF1;
123 bus_addr_t ba5_IDE_TF2;
124 bus_addr_t ba5_IDE_TF3;
125 bus_addr_t ba5_IDE_TF4;
126 bus_addr_t ba5_IDE_TF5;
127 bus_addr_t ba5_IDE_TF6;
128 bus_addr_t ba5_IDE_TF7;
129 bus_addr_t ba5_IDE_TF8;
130 bus_addr_t ba5_IDE_RAD;
131 bus_addr_t ba5_IDE_TF9;
132 bus_addr_t ba5_IDE_TF10;
133 bus_addr_t ba5_IDE_TF11;
134 bus_addr_t ba5_IDE_TF12;
135 bus_addr_t ba5_IDE_TF13;
136 bus_addr_t ba5_IDE_TF14;
137 bus_addr_t ba5_IDE_TF15;
138 bus_addr_t ba5_IDE_TF16;
139 bus_addr_t ba5_IDE_TF17;
140 bus_addr_t ba5_IDE_TF18;
141 bus_addr_t ba5_IDE_TF19;
142 bus_addr_t ba5_IDE_RABC;
143 bus_addr_t ba5_IDE_CMD_STS;
144 bus_addr_t ba5_IDE_CFG_STS;
145 bus_addr_t ba5_IDE_DTM;
146 bus_addr_t ba5_SControl;
147 bus_addr_t ba5_SStatus;
148 bus_addr_t ba5_SError;
149 bus_addr_t ba5_SActive;
150 bus_addr_t ba5_SMisc;
151 bus_addr_t ba5_PHY_CONFIG;
152 bus_addr_t ba5_SIEN;
153 bus_addr_t ba5_SFISCfg;
154 } satalink_ba5_regmap[] = {
155 {
156 .ba5_IDEDMA_CMD = 0x000,
157 .ba5_IDEDMA_CTL = 0x002,
158 .ba5_IDEDMA_TBL = 0x004,
159 .ba5_IDEDMA_CMD2 = 0x010,
160 .ba5_IDEDMA_CTL2 = 0x012,
161 .ba5_IDE_TF0 = 0x080,
162 .ba5_IDE_TF1 = 0x081,
163 .ba5_IDE_TF2 = 0x082,
164 .ba5_IDE_TF3 = 0x083,
165 .ba5_IDE_TF4 = 0x084,
166 .ba5_IDE_TF5 = 0x085,
167 .ba5_IDE_TF6 = 0x086,
168 .ba5_IDE_TF7 = 0x087,
169 .ba5_IDE_TF8 = 0x08a,
170 .ba5_IDE_RAD = 0x08c,
171 .ba5_IDE_TF9 = 0x091,
172 .ba5_IDE_TF10 = 0x092,
173 .ba5_IDE_TF11 = 0x093,
174 .ba5_IDE_TF12 = 0x094,
175 .ba5_IDE_TF13 = 0x095,
176 .ba5_IDE_TF14 = 0x096,
177 .ba5_IDE_TF15 = 0x097,
178 .ba5_IDE_TF16 = 0x098,
179 .ba5_IDE_TF17 = 0x099,
180 .ba5_IDE_TF18 = 0x09a,
181 .ba5_IDE_TF19 = 0x09b,
182 .ba5_IDE_RABC = 0x09c,
183 .ba5_IDE_CMD_STS = 0x0a0,
184 .ba5_IDE_CFG_STS = 0x0a1,
185 .ba5_IDE_DTM = 0x0b4,
186 .ba5_SControl = 0x100,
187 .ba5_SStatus = 0x104,
188 .ba5_SError = 0x108,
189 .ba5_SActive = 0x10c,
190 .ba5_SMisc = 0x140,
191 .ba5_PHY_CONFIG = 0x144,
192 .ba5_SIEN = 0x148,
193 .ba5_SFISCfg = 0x14c,
194 },
195 {
196 .ba5_IDEDMA_CMD = 0x008,
197 .ba5_IDEDMA_CTL = 0x00a,
198 .ba5_IDEDMA_TBL = 0x00c,
199 .ba5_IDEDMA_CMD2 = 0x018,
200 .ba5_IDEDMA_CTL2 = 0x01a,
201 .ba5_IDE_TF0 = 0x0c0,
202 .ba5_IDE_TF1 = 0x0c1,
203 .ba5_IDE_TF2 = 0x0c2,
204 .ba5_IDE_TF3 = 0x0c3,
205 .ba5_IDE_TF4 = 0x0c4,
206 .ba5_IDE_TF5 = 0x0c5,
207 .ba5_IDE_TF6 = 0x0c6,
208 .ba5_IDE_TF7 = 0x0c7,
209 .ba5_IDE_TF8 = 0x0ca,
210 .ba5_IDE_RAD = 0x0cc,
211 .ba5_IDE_TF9 = 0x0d1,
212 .ba5_IDE_TF10 = 0x0d2,
213 .ba5_IDE_TF11 = 0x0d3,
214 .ba5_IDE_TF12 = 0x0d4,
215 .ba5_IDE_TF13 = 0x0d5,
216 .ba5_IDE_TF14 = 0x0d6,
217 .ba5_IDE_TF15 = 0x0d7,
218 .ba5_IDE_TF16 = 0x0d8,
219 .ba5_IDE_TF17 = 0x0d9,
220 .ba5_IDE_TF18 = 0x0da,
221 .ba5_IDE_TF19 = 0x0db,
222 .ba5_IDE_RABC = 0x0dc,
223 .ba5_IDE_CMD_STS = 0x0e0,
224 .ba5_IDE_CFG_STS = 0x0e1,
225 .ba5_IDE_DTM = 0x0f4,
226 .ba5_SControl = 0x180,
227 .ba5_SStatus = 0x184,
228 .ba5_SError = 0x188,
229 .ba5_SActive = 0x18c,
230 .ba5_SMisc = 0x1c0,
231 .ba5_PHY_CONFIG = 0x1c4,
232 .ba5_SIEN = 0x1c8,
233 .ba5_SFISCfg = 0x1cc,
234 },
235 {
236 .ba5_IDEDMA_CMD = 0x200,
237 .ba5_IDEDMA_CTL = 0x202,
238 .ba5_IDEDMA_TBL = 0x204,
239 .ba5_IDEDMA_CMD2 = 0x210,
240 .ba5_IDEDMA_CTL2 = 0x212,
241 .ba5_IDE_TF0 = 0x280,
242 .ba5_IDE_TF1 = 0x281,
243 .ba5_IDE_TF2 = 0x282,
244 .ba5_IDE_TF3 = 0x283,
245 .ba5_IDE_TF4 = 0x284,
246 .ba5_IDE_TF5 = 0x285,
247 .ba5_IDE_TF6 = 0x286,
248 .ba5_IDE_TF7 = 0x287,
249 .ba5_IDE_TF8 = 0x28a,
250 .ba5_IDE_RAD = 0x28c,
251 .ba5_IDE_TF9 = 0x291,
252 .ba5_IDE_TF10 = 0x292,
253 .ba5_IDE_TF11 = 0x293,
254 .ba5_IDE_TF12 = 0x294,
255 .ba5_IDE_TF13 = 0x295,
256 .ba5_IDE_TF14 = 0x296,
257 .ba5_IDE_TF15 = 0x297,
258 .ba5_IDE_TF16 = 0x298,
259 .ba5_IDE_TF17 = 0x299,
260 .ba5_IDE_TF18 = 0x29a,
261 .ba5_IDE_TF19 = 0x29b,
262 .ba5_IDE_RABC = 0x29c,
263 .ba5_IDE_CMD_STS = 0x2a0,
264 .ba5_IDE_CFG_STS = 0x2a1,
265 .ba5_IDE_DTM = 0x2b4,
266 .ba5_SControl = 0x300,
267 .ba5_SStatus = 0x304,
268 .ba5_SError = 0x308,
269 .ba5_SActive = 0x30c,
270 .ba5_SMisc = 0x340,
271 .ba5_PHY_CONFIG = 0x344,
272 .ba5_SIEN = 0x348,
273 .ba5_SFISCfg = 0x34c,
274 },
275 {
276 .ba5_IDEDMA_CMD = 0x208,
277 .ba5_IDEDMA_CTL = 0x20a,
278 .ba5_IDEDMA_TBL = 0x20c,
279 .ba5_IDEDMA_CMD2 = 0x218,
280 .ba5_IDEDMA_CTL2 = 0x21a,
281 .ba5_IDE_TF0 = 0x2c0,
282 .ba5_IDE_TF1 = 0x2c1,
283 .ba5_IDE_TF2 = 0x2c2,
284 .ba5_IDE_TF3 = 0x2c3,
285 .ba5_IDE_TF4 = 0x2c4,
286 .ba5_IDE_TF5 = 0x2c5,
287 .ba5_IDE_TF6 = 0x2c6,
288 .ba5_IDE_TF7 = 0x2c7,
289 .ba5_IDE_TF8 = 0x2ca,
290 .ba5_IDE_RAD = 0x2cc,
291 .ba5_IDE_TF9 = 0x2d1,
292 .ba5_IDE_TF10 = 0x2d2,
293 .ba5_IDE_TF11 = 0x2d3,
294 .ba5_IDE_TF12 = 0x2d4,
295 .ba5_IDE_TF13 = 0x2d5,
296 .ba5_IDE_TF14 = 0x2d6,
297 .ba5_IDE_TF15 = 0x2d7,
298 .ba5_IDE_TF16 = 0x2d8,
299 .ba5_IDE_TF17 = 0x2d9,
300 .ba5_IDE_TF18 = 0x2da,
301 .ba5_IDE_TF19 = 0x2db,
302 .ba5_IDE_RABC = 0x2dc,
303 .ba5_IDE_CMD_STS = 0x2e0,
304 .ba5_IDE_CFG_STS = 0x2e1,
305 .ba5_IDE_DTM = 0x2f4,
306 .ba5_SControl = 0x380,
307 .ba5_SStatus = 0x384,
308 .ba5_SError = 0x388,
309 .ba5_SActive = 0x38c,
310 .ba5_SMisc = 0x3c0,
311 .ba5_PHY_CONFIG = 0x3c4,
312 .ba5_SIEN = 0x3c8,
313 .ba5_SFISCfg = 0x3cc,
314 },
315 };
316
317 #define ba5_SIS 0x214
318
319
320 #define IDEDMA_CMD_INT_STEER (1U << 1)
321
322
323 struct pciide_satalink {
324 bus_space_tag_t ba5_st;
325 bus_space_handle_t ba5_sh;
326 int ba5_en;
327
328 struct {
329 bus_space_tag_t cmd_iot;
330 bus_space_handle_t cmd_baseioh;
331 bus_space_handle_t cmd_iohs[WDC_NREG+WDC_NSHADOWREG];
332
333 bus_space_tag_t ctl_iot;
334 bus_space_handle_t ctl_ioh;
335
336 bus_space_handle_t dma_iohs[IDEDMA_NREGS];
337 } regs[4];
338 };
339
340 static INLINE uint32_t
341 ba5_read_4_ind(struct pciide_softc *sc, pcireg_t reg)
342 {
343 uint32_t rv;
344 int s;
345
346 s = splbio();
347 pci_conf_write(sc->sc_pc, sc->sc_tag, SII3112_BA5_IND_ADDR, reg);
348 rv = pci_conf_read(sc->sc_pc, sc->sc_tag, SII3112_BA5_IND_DATA);
349 splx(s);
350
351 return (rv);
352 }
353
354 static INLINE uint32_t
355 ba5_read_4(struct pciide_softc *sc, bus_size_t reg)
356 {
357 struct pciide_satalink *sl = sc->sc_cookie;
358
359 if (__predict_true(sl->ba5_en != 0))
360 return (bus_space_read_4(sl->ba5_st, sl->ba5_sh, reg));
361
362 return (ba5_read_4_ind(sc, reg));
363 }
364
365 #define BA5_READ_4(sc, chan, reg) \
366 ba5_read_4((sc), satalink_ba5_regmap[(chan)].reg)
367
368 static INLINE void
369 ba5_write_4_ind(struct pciide_softc *sc, pcireg_t reg, uint32_t val)
370 {
371 int s;
372
373 s = splbio();
374 pci_conf_write(sc->sc_pc, sc->sc_tag, SII3112_BA5_IND_ADDR, reg);
375 pci_conf_write(sc->sc_pc, sc->sc_tag, SII3112_BA5_IND_DATA, val);
376 splx(s);
377 }
378
379 static INLINE void
380 ba5_write_4(struct pciide_softc *sc, bus_size_t reg, uint32_t val)
381 {
382 struct pciide_satalink *sl = sc->sc_cookie;
383
384 if (__predict_true(sl->ba5_en != 0))
385 bus_space_write_4(sl->ba5_st, sl->ba5_sh, reg, val);
386 else
387 ba5_write_4_ind(sc, reg, val);
388 }
389
390 #define BA5_WRITE_4(sc, chan, reg, val) \
391 ba5_write_4((sc), satalink_ba5_regmap[(chan)].reg, (val))
392
393 u_int8_t sii3114_read_reg(struct channel_softc *, enum wdc_regs);
394 void sii3114_write_reg(struct channel_softc *, enum wdc_regs, u_int8_t);
395
396 struct channel_softc_vtbl wdc_sii3114_vtbl = {
397 sii3114_read_reg,
398 sii3114_write_reg,
399 wdc_default_lba48_write_reg,
400 wdc_default_read_raw_multi_2,
401 wdc_default_write_raw_multi_2,
402 wdc_default_read_raw_multi_4,
403 wdc_default_write_raw_multi_4
404 };
405
406 #endif