2 * Copyright (c) 2007 Bruce M. Simpson.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 #ifndef _SIBA_SIBAVAR_H_
30 #define _SIBA_SIBAVAR_H_
35 struct siba_dev_softc;
43 enum siba_device_ivars {
50 SIBA_IVAR_PCI_SUBVENDOR,
51 SIBA_IVAR_PCI_SUBDEVICE,
59 SIBA_IVAR_CC_POWERDELAY,
60 SIBA_IVAR_PCICORE_REVID
63 #define SIBA_ACCESSOR(var, ivar, type) \
64 __BUS_ACCESSOR(siba, var, SIBA, ivar, type)
66 SIBA_ACCESSOR(vendor, VENDOR, uint16_t)
67 SIBA_ACCESSOR(device, DEVICE, uint16_t)
68 SIBA_ACCESSOR(revid, REVID, uint8_t)
69 SIBA_ACCESSOR(core_index, CORE_INDEX, uint8_t)
70 SIBA_ACCESSOR(pci_vendor, PCI_VENDOR, uint16_t)
71 SIBA_ACCESSOR(pci_device, PCI_DEVICE, uint16_t)
72 SIBA_ACCESSOR(pci_subvendor, PCI_SUBVENDOR, uint16_t)
73 SIBA_ACCESSOR(pci_subdevice, PCI_SUBDEVICE, uint16_t)
74 SIBA_ACCESSOR(pci_revid, PCI_REVID, uint8_t)
75 SIBA_ACCESSOR(chipid, CHIPID, uint16_t)
76 SIBA_ACCESSOR(chiprev, CHIPREV, uint16_t)
77 SIBA_ACCESSOR(chippkg, CHIPPKG, uint8_t)
78 SIBA_ACCESSOR(type, TYPE, enum siba_type)
79 SIBA_ACCESSOR(cc_pmufreq, CC_PMUFREQ, uint32_t)
80 SIBA_ACCESSOR(cc_caps, CC_CAPS, uint32_t)
81 SIBA_ACCESSOR(cc_powerdelay, CC_POWERDELAY, uint16_t)
82 SIBA_ACCESSOR(pcicore_revid, PCICORE_REVID, uint8_t)
86 /* XXX just for SPROM1? */
94 SIBA_CCODE_USA_CANADA_ANZ,
97 SIBA_CCODE_JAPAN_HIGH,
102 #define siba_mips_read_2(sc, core, reg) \
103 bus_space_read_2((sc)->siba_mem_bt, (sc)->siba_mem_bh, \
104 (core * SIBA_CORE_LEN) + (reg))
106 #define siba_mips_read_4(sc, core, reg) \
107 bus_space_read_4((sc)->siba_mem_bt, (sc)->siba_mem_bh, \
108 (core * SIBA_CORE_LEN) + (reg))
110 #define siba_mips_write_2(sc, core, reg, val) \
111 bus_space_write_2((sc)->siba_mem_bt, (sc)->siba_mem_bh, \
112 (core * SIBA_CORE_LEN) + (reg), (val))
114 #define siba_mips_write_4(sc, core, reg, val) \
115 bus_space_write_4((sc)->siba_mem_bt, (sc)->siba_mem_bh, \
116 (core * SIBA_CORE_LEN) + (reg), (val))
118 #define SIBA_READ_4(siba, reg) \
119 bus_space_read_4((siba)->siba_mem_bt, (siba)->siba_mem_bh, (reg))
120 #define SIBA_READ_2(siba, reg) \
121 bus_space_read_2((siba)->siba_mem_bt, (siba)->siba_mem_bh, (reg))
122 #define SIBA_READ_MULTI_1(siba, reg, addr, count) \
123 bus_space_read_multi_1((siba)->siba_mem_bt, (siba)->siba_mem_bh,\
124 (reg), (addr), (count))
125 #define SIBA_READ_MULTI_2(siba, reg, addr, count) \
126 bus_space_read_multi_2((siba)->siba_mem_bt, (siba)->siba_mem_bh,\
127 (reg), (addr), (count))
128 #define SIBA_READ_MULTI_4(siba, reg, addr, count) \
129 bus_space_read_multi_4((siba)->siba_mem_bt, (siba)->siba_mem_bh,\
130 (reg), (addr), (count))
132 #define SIBA_WRITE_4(siba, reg, val) \
133 bus_space_write_4((siba)->siba_mem_bt, (siba)->siba_mem_bh, \
135 #define SIBA_WRITE_2(siba, reg, val) \
136 bus_space_write_2((siba)->siba_mem_bt, (siba)->siba_mem_bh, \
138 #define SIBA_WRITE_MULTI_1(siba, reg, addr, count) \
139 bus_space_write_multi_1((siba)->siba_mem_bt, (siba)->siba_mem_bh,\
140 (reg), (addr), (count))
141 #define SIBA_WRITE_MULTI_2(siba, reg, addr, count) \
142 bus_space_write_multi_2((siba)->siba_mem_bt, (siba)->siba_mem_bh,\
143 (reg), (addr), (count))
144 #define SIBA_WRITE_MULTI_4(siba, reg, addr, count) \
145 bus_space_write_multi_4((siba)->siba_mem_bt, (siba)->siba_mem_bh,\
146 (reg), (addr), (count))
148 #define SIBA_BARRIER(siba, flags) \
149 bus_space_barrier((siba)->siba_mem_bt, (siba)->siba_mem_bh, (0),\
152 #define SIBA_SETBITS_4(siba, reg, bits) \
153 SIBA_WRITE_4((siba), (reg), SIBA_READ_4((siba), (reg)) | (bits))
154 #define SIBA_SETBITS_2(siba, reg, bits) \
155 SIBA_WRITE_2((siba), (reg), SIBA_READ_2((siba), (reg)) | (bits))
157 #define SIBA_FILT_SETBITS_4(siba, reg, filt, bits) \
158 SIBA_WRITE_4((siba), (reg), (SIBA_READ_4((siba), \
159 (reg)) & (filt)) | (bits))
160 #define SIBA_FILT_SETBITS_2(siba, reg, filt, bits) \
161 SIBA_WRITE_2((siba), (reg), (SIBA_READ_2((siba), \
162 (reg)) & (filt)) | (bits))
164 #define SIBA_CLRBITS_4(siba, reg, bits) \
165 SIBA_WRITE_4((siba), (reg), SIBA_READ_4((siba), (reg)) & ~(bits))
166 #define SIBA_CLRBITS_2(siba, reg, bits) \
167 SIBA_WRITE_2((siba), (reg), SIBA_READ_2((siba), (reg)) & ~(bits))
169 #define SIBA_CC_READ32(scc, offset) \
170 siba_read_4_sub((scc)->scc_dev, offset)
171 #define SIBA_CC_WRITE32(scc, offset, val) \
172 siba_write_4_sub((scc)->scc_dev, offset, val)
173 #define SIBA_CC_MASK32(scc, offset, mask) \
174 SIBA_CC_WRITE32(scc, offset, SIBA_CC_READ32(scc, offset) & (mask))
175 #define SIBA_CC_SET32(scc, offset, set) \
176 SIBA_CC_WRITE32(scc, offset, SIBA_CC_READ32(scc, offset) | (set))
177 #define SIBA_CC_MASKSET32(scc, offset, mask, set) \
178 SIBA_CC_WRITE32(scc, offset, \
179 (SIBA_CC_READ32(scc, offset) & (mask)) | (set))
189 SIBA_CC_CLKSRC_CRYSTAL,
190 SIBA_CC_CLKSRC_LOWPW,
193 struct siba_cc_pmu0_plltab {
194 uint16_t freq; /* in kHz.*/
195 uint8_t xf; /* crystal frequency */
200 struct siba_cc_pmu1_plltab {
209 struct siba_cc_pmu_res_updown {
214 #define SIBA_CC_PMU_DEP_SET 1
215 #define SIBA_CC_PMU_DEP_ADD 2
216 #define SIBA_CC_PMU_DEP_REMOVE 3
218 struct siba_cc_pmu_res_depend {
224 enum siba_sprom_vars {
226 SIBA_SPROMVAR_MAC_80211BG,
227 SIBA_SPROMVAR_MAC_ETH,
228 SIBA_SPROMVAR_MAC_80211A,
229 SIBA_SPROMVAR_MII_ETH0,
230 SIBA_SPROMVAR_MII_ETH1,
231 SIBA_SPROMVAR_MDIO_ETH0,
232 SIBA_SPROMVAR_MDIO_ETH1,
236 SIBA_SPROMVAR_ANT_BG,
243 SIBA_SPROMVAR_PA1LOB0,
244 SIBA_SPROMVAR_PA1LOB1,
245 SIBA_SPROMVAR_PA1LOB2,
246 SIBA_SPROMVAR_PA1HIB0,
247 SIBA_SPROMVAR_PA1HIB1,
248 SIBA_SPROMVAR_PA1HIB2,
253 SIBA_SPROMVAR_MAXPWR_AL,
254 SIBA_SPROMVAR_MAXPWR_A,
255 SIBA_SPROMVAR_MAXPWR_AH,
256 SIBA_SPROMVAR_MAXPWR_BG,
257 SIBA_SPROMVAR_RXPO2G,
258 SIBA_SPROMVAR_RXPO5G,
259 SIBA_SPROMVAR_TSSI_A,
260 SIBA_SPROMVAR_TSSI_BG,
262 SIBA_SPROMVAR_TRI5GL,
264 SIBA_SPROMVAR_TRI5GH,
265 SIBA_SPROMVAR_RSSISAV2G,
266 SIBA_SPROMVAR_RSSISMC2G,
267 SIBA_SPROMVAR_RSSISMF2G,
269 SIBA_SPROMVAR_RSSISAV5G,
270 SIBA_SPROMVAR_RSSISMC5G,
271 SIBA_SPROMVAR_RSSISMF5G,
273 SIBA_SPROMVAR_CCK2GPO,
274 SIBA_SPROMVAR_OFDM2GPO,
275 SIBA_SPROMVAR_OFDM5GLPO,
276 SIBA_SPROMVAR_OFDM5GPO,
277 SIBA_SPROMVAR_OFDM5GHPO,
280 SIBA_SPROMVAR_BF2_LO,
284 int siba_read_sprom(device_t, device_t, int, uintptr_t *);
285 int siba_write_sprom(device_t, device_t, int, uintptr_t);
288 * Generic sprom accessor generation macros for siba(4) drivers
290 #define __SPROM_ACCESSOR(varp, var, ivarp, ivar, type) \
292 static __inline type varp ## _get_ ## var(device_t dev) \
295 siba_read_sprom(device_get_parent(dev), dev, \
296 ivarp ## _SPROMVAR_ ## ivar, &v); \
300 static __inline void varp ## _set_ ## var(device_t dev, type t) \
302 uintptr_t v = (uintptr_t) t; \
303 siba_write_sprom(device_get_parent(dev), dev, \
304 ivarp ## _SPROMVAR_ ## ivar, v); \
307 #define SIBA_SPROM_ACCESSOR(var, ivar, type) \
308 __SPROM_ACCESSOR(siba_sprom, var, SIBA, ivar, type)
310 SIBA_SPROM_ACCESSOR(rev, REV, uint8_t);
311 SIBA_SPROM_ACCESSOR(mac_80211bg, MAC_80211BG, uint8_t *);
312 SIBA_SPROM_ACCESSOR(mac_eth, MAC_ETH, uint8_t *);
313 SIBA_SPROM_ACCESSOR(mac_80211a, MAC_80211A, uint8_t *);
314 SIBA_SPROM_ACCESSOR(mii_eth0, MII_ETH0, uint8_t);
315 SIBA_SPROM_ACCESSOR(mii_eth1, MII_ETH1, uint8_t);
316 SIBA_SPROM_ACCESSOR(mdio_eth0, MDIO_ETH0, uint8_t);
317 SIBA_SPROM_ACCESSOR(mdio_eth1, MDIO_ETH1, uint8_t);
318 SIBA_SPROM_ACCESSOR(brev, BREV, uint8_t);
319 SIBA_SPROM_ACCESSOR(ccode, CCODE, uint8_t);
320 SIBA_SPROM_ACCESSOR(ant_a, ANT_A, uint8_t);
321 SIBA_SPROM_ACCESSOR(ant_bg, ANT_BG, uint8_t);
322 SIBA_SPROM_ACCESSOR(pa0b0, PA0B0, uint16_t);
323 SIBA_SPROM_ACCESSOR(pa0b1, PA0B1, uint16_t);
324 SIBA_SPROM_ACCESSOR(pa0b2, PA0B2, uint16_t);
325 SIBA_SPROM_ACCESSOR(pa1b0, PA1B0, uint16_t);
326 SIBA_SPROM_ACCESSOR(pa1b1, PA1B1, uint16_t);
327 SIBA_SPROM_ACCESSOR(pa1b2, PA1B2, uint16_t);
328 SIBA_SPROM_ACCESSOR(pa1lob0, PA1LOB0, uint16_t);
329 SIBA_SPROM_ACCESSOR(pa1lob1, PA1LOB1, uint16_t);
330 SIBA_SPROM_ACCESSOR(pa1lob2, PA1LOB2, uint16_t);
331 SIBA_SPROM_ACCESSOR(pa1hib0, PA1HIB0, uint16_t);
332 SIBA_SPROM_ACCESSOR(pa1hib1, PA1HIB1, uint16_t);
333 SIBA_SPROM_ACCESSOR(pa1hib2, PA1HIB2, uint16_t);
334 SIBA_SPROM_ACCESSOR(gpio0, GPIO0, uint8_t);
335 SIBA_SPROM_ACCESSOR(gpio1, GPIO1, uint8_t);
336 SIBA_SPROM_ACCESSOR(gpio2, GPIO2, uint8_t);
337 SIBA_SPROM_ACCESSOR(gpio3, GPIO3, uint8_t);
338 SIBA_SPROM_ACCESSOR(maxpwr_al, MAXPWR_AL, uint16_t);
339 SIBA_SPROM_ACCESSOR(maxpwr_a, MAXPWR_A, uint16_t);
340 SIBA_SPROM_ACCESSOR(maxpwr_ah, MAXPWR_AH, uint16_t);
341 SIBA_SPROM_ACCESSOR(maxpwr_bg, MAXPWR_BG, uint16_t);
342 SIBA_SPROM_ACCESSOR(rxpo2g, RXPO2G, uint8_t);
343 SIBA_SPROM_ACCESSOR(rxpo5g, RXPO5G, uint8_t);
344 SIBA_SPROM_ACCESSOR(tssi_a, TSSI_A, uint8_t);
345 SIBA_SPROM_ACCESSOR(tssi_bg, TSSI_BG, uint8_t);
346 SIBA_SPROM_ACCESSOR(tri2g, TRI2G, uint8_t);
347 SIBA_SPROM_ACCESSOR(tri5gl, TRI5GL, uint8_t);
348 SIBA_SPROM_ACCESSOR(tri5g, TRI5G, uint8_t);
349 SIBA_SPROM_ACCESSOR(tri5gh, TRI5GH, uint8_t);
350 SIBA_SPROM_ACCESSOR(rssisav2g, RSSISAV2G, uint8_t);
351 SIBA_SPROM_ACCESSOR(rssismc2g, RSSISMC2G, uint8_t);
352 SIBA_SPROM_ACCESSOR(rssismf2g, RSSISMF2G, uint8_t);
353 SIBA_SPROM_ACCESSOR(bxa2g, BXA2G, uint8_t);
354 SIBA_SPROM_ACCESSOR(rssisav5g, RSSISAV5G, uint8_t);
355 SIBA_SPROM_ACCESSOR(rssismc5g, RSSISMC5G, uint8_t);
356 SIBA_SPROM_ACCESSOR(rssismf5g, RSSISMF5G, uint8_t);
357 SIBA_SPROM_ACCESSOR(bxa5g, BXA5G, uint8_t);
358 SIBA_SPROM_ACCESSOR(cck2gpo, CCK2GPO, uint16_t);
359 SIBA_SPROM_ACCESSOR(ofdm2gpo, OFDM2GPO, uint32_t);
360 SIBA_SPROM_ACCESSOR(ofdm5glpo, OFDM5GLPO, uint32_t);
361 SIBA_SPROM_ACCESSOR(ofdm5gpo, OFDM5GPO, uint32_t);
362 SIBA_SPROM_ACCESSOR(ofdm5ghpo, OFDM5GHPO, uint32_t);
363 SIBA_SPROM_ACCESSOR(bf_lo, BF_LO, uint16_t);
364 SIBA_SPROM_ACCESSOR(bf_hi, BF_HI, uint16_t);
365 SIBA_SPROM_ACCESSOR(bf2_lo, BF2_LO, uint16_t);
366 SIBA_SPROM_ACCESSOR(bf2_hi, BF2_HI, uint16_t);
368 #undef SIBA_SPROM_ACCESSOR
371 uint8_t rev; /* revision */
372 uint8_t mac_80211bg[6]; /* address for 802.11b/g */
373 uint8_t mac_eth[6]; /* address for Ethernet */
374 uint8_t mac_80211a[6]; /* address for 802.11a */
375 uint8_t mii_eth0; /* MII address for eth0 */
376 uint8_t mii_eth1; /* MII address for eth1 */
377 uint8_t mdio_eth0; /* MDIO for eth0 */
378 uint8_t mdio_eth1; /* MDIO for eth1 */
379 uint8_t brev; /* board revision */
380 uint8_t ccode; /* Country Code */
381 uint8_t ant_a; /* A-PHY antenna */
382 uint8_t ant_bg; /* B/G-PHY antenna */
400 uint16_t maxpwr_a; /* A-PHY Max Power */
402 uint16_t maxpwr_bg; /* BG-PHY Max Power */
405 uint8_t tssi_a; /* Idle TSSI */
406 uint8_t tssi_bg; /* Idle TSSI */
424 uint16_t bf_lo; /* boardflags */
425 uint16_t bf_hi; /* boardflags */
431 int8_t a0, a1, a2, a3;
434 int8_t a0, a1, a2, a3;
436 } again; /* antenna gain */
439 #define SIBA_LDO_PAREF 0
440 #define SIBA_LDO_VOLT1 1
441 #define SIBA_LDO_VOLT2 2
442 #define SIBA_LDO_VOLT3 3
445 uint8_t rev; /* PMU rev */
446 uint32_t freq; /* crystal freq in kHz */
450 struct siba_dev_softc *scc_dev;
452 struct siba_cc_pmu scc_pmu;
453 uint16_t scc_powerup_delay;
457 struct siba_dev_softc *spc_dev;
459 uint8_t spc_hostmode;
462 struct siba_bus_ops {
463 uint16_t (*read_2)(struct siba_dev_softc *,
465 uint32_t (*read_4)(struct siba_dev_softc *,
467 void (*write_2)(struct siba_dev_softc *,
469 void (*write_4)(struct siba_dev_softc *,
471 void (*read_multi_1)(struct siba_dev_softc *,
472 void *, size_t, uint16_t);
473 void (*read_multi_2)(struct siba_dev_softc *,
474 void *, size_t, uint16_t);
475 void (*read_multi_4)(struct siba_dev_softc *,
476 void *, size_t, uint16_t);
477 void (*write_multi_1)(struct siba_dev_softc *,
478 const void *, size_t, uint16_t);
479 void (*write_multi_2)(struct siba_dev_softc *,
480 const void *, size_t, uint16_t);
481 void (*write_multi_4)(struct siba_dev_softc *,
482 const void *, size_t, uint16_t);
485 struct siba_dev_softc {
486 struct siba_softc *sd_bus;
487 struct siba_devid sd_id;
488 const struct siba_bus_ops *sd_ops;
493 struct siba_devinfo {
494 struct resource_list sdi_rl;
495 /*devhandle_t sdi_devhandle; XXX*/
496 /*struct rman sdi_intr_rman;*/
498 /* Accessors are needed for ivars below. */
502 uint8_t sdi_idx; /* core index on bus */
503 uint8_t sdi_irq; /* TODO */
508 * common variables which used for siba(4) bus and siba_bwn bridge.
510 device_t siba_dev; /* Device ID */
511 struct resource *siba_mem_res;
512 bus_space_tag_t siba_mem_bt;
513 bus_space_handle_t siba_mem_bh;
514 bus_addr_t siba_maddr;
515 bus_size_t siba_msize;
519 * the following variables are only used for siba_bwn bridge.
522 enum siba_type siba_type;
525 struct siba_dev_softc *siba_curdev; /* only for PCI */
526 struct siba_dev_softc siba_devs[SIBA_MAX_CORES];
529 uint16_t siba_pci_vid;
530 uint16_t siba_pci_did;
531 uint16_t siba_pci_subvid;
532 uint16_t siba_pci_subdid;
533 uint8_t siba_pci_revid;
536 uint16_t siba_chipid; /* for CORE 0 */
537 uint16_t siba_chiprev;
538 uint8_t siba_chippkg;
540 struct siba_cc siba_cc; /* ChipCommon */
541 struct siba_pci siba_pci; /* PCI-core */
542 const struct siba_bus_ops *siba_ops;
544 struct siba_sprom siba_sprom; /* SPROM */
545 uint16_t siba_spromsize; /* in word size */
548 void siba_powerup(device_t, int);
549 int siba_powerdown(device_t);
550 uint16_t siba_read_2(device_t, uint16_t);
551 void siba_write_2(device_t, uint16_t, uint16_t);
552 uint32_t siba_read_4(device_t, uint16_t);
553 void siba_write_4(device_t, uint16_t, uint32_t);
554 void siba_dev_up(device_t, uint32_t);
555 void siba_dev_down(device_t, uint32_t);
556 int siba_dev_isup(device_t);
557 void siba_pcicore_intr(device_t);
558 uint32_t siba_dma_translation(device_t);
559 void siba_read_multi_1(device_t, void *, size_t, uint16_t);
560 void siba_read_multi_2(device_t, void *, size_t, uint16_t);
561 void siba_read_multi_4(device_t, void *, size_t, uint16_t);
562 void siba_write_multi_1(device_t, const void *, size_t, uint16_t);
563 void siba_write_multi_2(device_t, const void *, size_t, uint16_t);
564 void siba_write_multi_4(device_t, const void *, size_t, uint16_t);
565 void siba_barrier(device_t, int);
566 void siba_cc_pmu_set_ldovolt(device_t, int, uint32_t);
567 void siba_cc_pmu_set_ldoparef(device_t, uint8_t);
568 void siba_gpio_set(device_t, uint32_t);
569 uint32_t siba_gpio_get(device_t);
570 void siba_fix_imcfglobug(device_t);
572 #endif /* _SIBA_SIBAVAR_H_ */