2 * Copyright (c) 2009-2010 Weongyo Jeong <weongyo@freebsd.org>
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 * without modification.
11 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
12 * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
13 * redistribution must be conditioned upon including a substantially
14 * similar Disclaimer requirement for further binary redistribution.
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19 * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
20 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
21 * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
22 * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
27 * THE POSSIBILITY OF SUCH DAMAGES.
30 #include <sys/cdefs.h>
31 __FBSDID("$FreeBSD$");
34 * the Sonics Silicon Backplane driver.
39 #include <sys/param.h>
40 #include <sys/systm.h>
41 #include <sys/malloc.h>
42 #include <sys/module.h>
43 #include <sys/kernel.h>
44 #include <sys/endian.h>
45 #include <sys/errno.h>
47 #include <sys/mutex.h>
48 #include <machine/bus.h>
49 #include <machine/resource.h>
52 #include <sys/socket.h>
55 #include <net/if_media.h>
56 #include <net/if_arp.h>
58 #include <dev/pci/pcivar.h>
59 #include <dev/pci/pcireg.h>
61 #include <dev/siba/siba_ids.h>
62 #include <dev/siba/sibareg.h>
63 #include <dev/siba/sibavar.h>
66 SIBA_DEBUG_SCAN = 0x00000001, /* scan */
67 SIBA_DEBUG_PMU = 0x00000002, /* PMU */
68 SIBA_DEBUG_PLL = 0x00000004, /* PLL */
69 SIBA_DEBUG_SWITCHCORE = 0x00000008, /* switching core */
70 SIBA_DEBUG_SPROM = 0x00000010, /* SPROM */
71 SIBA_DEBUG_CORE = 0x00000020, /* handling cores */
72 SIBA_DEBUG_DMA = 0x00000040, /* DMA bits */
73 SIBA_DEBUG_ANY = 0xffffffff
77 #define DPRINTF(siba, m, ...) do { \
78 if (siba->siba_debug & (m)) \
79 device_printf(siba->siba_dev, __VA_ARGS__); \
82 #define DPRINTF(siba, m, ...) do { (void) siba; } while (0)
85 #define N(a) (sizeof(a) / sizeof(a[0]))
87 static void siba_pci_gpio(struct siba_softc *, uint32_t, int);
88 static void siba_scan(struct siba_softc *);
89 static int siba_switchcore(struct siba_softc *, uint8_t);
90 static int siba_pci_switchcore_sub(struct siba_softc *, uint8_t);
91 static uint32_t siba_scan_read_4(struct siba_softc *, uint8_t, uint16_t);
92 static uint16_t siba_dev2chipid(struct siba_softc *);
93 static uint16_t siba_pci_read_2(struct siba_dev_softc *, uint16_t);
94 static uint32_t siba_pci_read_4(struct siba_dev_softc *, uint16_t);
95 static void siba_pci_write_2(struct siba_dev_softc *, uint16_t, uint16_t);
96 static void siba_pci_write_4(struct siba_dev_softc *, uint16_t, uint32_t);
97 static void siba_cc_clock(struct siba_cc *,
99 static void siba_cc_pmu_init(struct siba_cc *);
100 static void siba_cc_power_init(struct siba_cc *);
101 static void siba_cc_powerup_delay(struct siba_cc *);
102 static int siba_cc_clockfreq(struct siba_cc *, int);
103 static void siba_cc_pmu1_pll0_init(struct siba_cc *, uint32_t);
104 static void siba_cc_pmu0_pll0_init(struct siba_cc *, uint32_t);
105 static enum siba_clksrc siba_cc_clksrc(struct siba_cc *);
106 static const struct siba_cc_pmu1_plltab *siba_cc_pmu1_plltab_find(uint32_t);
107 static uint32_t siba_cc_pll_read(struct siba_cc *, uint32_t);
108 static void siba_cc_pll_write(struct siba_cc *, uint32_t,
110 static const struct siba_cc_pmu0_plltab *
111 siba_cc_pmu0_plltab_findentry(uint32_t);
112 static int siba_pci_sprom(struct siba_softc *, struct siba_sprom *);
113 static int siba_sprom_read(struct siba_softc *, uint16_t *, uint16_t);
114 static int sprom_check_crc(const uint16_t *, size_t);
115 static uint8_t siba_crc8(uint8_t, uint8_t);
116 static void siba_sprom_r123(struct siba_sprom *, const uint16_t *);
117 static void siba_sprom_r45(struct siba_sprom *, const uint16_t *);
118 static void siba_sprom_r8(struct siba_sprom *, const uint16_t *);
119 static int8_t siba_sprom_r123_antgain(uint8_t, const uint16_t *, uint16_t,
121 static uint32_t siba_tmslow_reject_bitmask(struct siba_dev_softc *);
122 static uint32_t siba_pcicore_read_4(struct siba_pci *, uint16_t);
123 static void siba_pcicore_write_4(struct siba_pci *, uint16_t, uint32_t);
124 static uint32_t siba_pcie_read(struct siba_pci *, uint32_t);
125 static void siba_pcie_write(struct siba_pci *, uint32_t, uint32_t);
126 static void siba_pcie_mdio_write(struct siba_pci *, uint8_t, uint8_t,
128 static void siba_pci_read_multi_1(struct siba_dev_softc *, void *, size_t,
130 static void siba_pci_read_multi_2(struct siba_dev_softc *, void *, size_t,
132 static void siba_pci_read_multi_4(struct siba_dev_softc *, void *, size_t,
134 static void siba_pci_write_multi_1(struct siba_dev_softc *, const void *,
136 static void siba_pci_write_multi_2(struct siba_dev_softc *, const void *,
138 static void siba_pci_write_multi_4(struct siba_dev_softc *, const void *,
140 static const char *siba_core_name(uint16_t);
141 static void siba_pcicore_init(struct siba_pci *);
142 static uint32_t siba_read_4_sub(struct siba_dev_softc *, uint16_t);
143 static void siba_write_4_sub(struct siba_dev_softc *, uint16_t, uint32_t);
144 static void siba_powerup_sub(struct siba_softc *, int);
145 static int siba_powerdown_sub(struct siba_softc *);
146 static int siba_dev_isup_sub(struct siba_dev_softc *);
147 static void siba_dev_up_sub(struct siba_dev_softc *, uint32_t);
148 static void siba_dev_down_sub(struct siba_dev_softc *, uint32_t);
149 int siba_core_attach(struct siba_softc *);
150 int siba_core_detach(struct siba_softc *);
151 int siba_core_suspend(struct siba_softc *);
152 int siba_core_resume(struct siba_softc *);
153 uint8_t siba_getncores(device_t, uint16_t);
155 static const struct siba_bus_ops siba_pci_ops = {
156 .read_2 = siba_pci_read_2,
157 .read_4 = siba_pci_read_4,
158 .write_2 = siba_pci_write_2,
159 .write_4 = siba_pci_write_4,
160 .read_multi_1 = siba_pci_read_multi_1,
161 .read_multi_2 = siba_pci_read_multi_2,
162 .read_multi_4 = siba_pci_read_multi_4,
163 .write_multi_1 = siba_pci_write_multi_1,
164 .write_multi_2 = siba_pci_write_multi_2,
165 .write_multi_4 = siba_pci_write_multi_4,
168 static const struct siba_cc_pmu_res_updown siba_cc_pmu_4325_updown[] =
169 SIBA_CC_PMU_4325_RES_UPDOWN;
170 static const struct siba_cc_pmu_res_depend siba_cc_pmu_4325_depend[] =
171 SIBA_CC_PMU_4325_RES_DEPEND;
172 static const struct siba_cc_pmu_res_updown siba_cc_pmu_4328_updown[] =
173 SIBA_CC_PMU_4328_RES_UPDOWN;
174 static const struct siba_cc_pmu_res_depend siba_cc_pmu_4328_depend[] =
175 SIBA_CC_PMU_4328_RES_DEPEND;
176 static const struct siba_cc_pmu0_plltab siba_cc_pmu0_plltab[] =
177 SIBA_CC_PMU0_PLLTAB_ENTRY;
178 static const struct siba_cc_pmu1_plltab siba_cc_pmu1_plltab[] =
179 SIBA_CC_PMU1_PLLTAB_ENTRY;
182 siba_core_attach(struct siba_softc *siba)
187 KASSERT(siba->siba_type == SIBA_TYPE_PCI,
188 ("unsupported BUS type (%#x)", siba->siba_type));
190 siba->siba_ops = &siba_pci_ops;
192 siba_pci_gpio(siba, SIBA_GPIO_CRYSTAL | SIBA_GPIO_PLL, 1);
195 /* XXX init PCI or PCMCIA host devices */
197 siba_powerup_sub(siba, 0);
199 /* init ChipCommon */
200 scc = &siba->siba_cc;
201 if (scc->scc_dev != NULL) {
202 siba_cc_pmu_init(scc);
203 siba_cc_power_init(scc);
204 siba_cc_clock(scc, SIBA_CLOCK_FAST);
205 siba_cc_powerup_delay(scc);
208 error = siba_pci_sprom(siba, &siba->siba_sprom);
210 siba_powerdown_sub(siba);
214 siba_pcicore_init(&siba->siba_pci);
215 siba_powerdown_sub(siba);
217 return (bus_generic_attach(siba->siba_dev));
221 siba_core_detach(struct siba_softc *siba)
223 /* detach & delete all children */
224 device_delete_children(siba->siba_dev);
229 siba_pci_gpio(struct siba_softc *siba, uint32_t what, int on)
234 if (siba->siba_type != SIBA_TYPE_PCI)
237 out = pci_read_config(siba->siba_dev, SIBA_GPIO_OUT, 4);
239 if (what & SIBA_GPIO_PLL)
240 out |= SIBA_GPIO_PLL;
241 if (what & SIBA_GPIO_CRYSTAL)
242 out &= ~SIBA_GPIO_CRYSTAL;
243 pci_write_config(siba->siba_dev, SIBA_GPIO_OUT, out, 4);
244 pci_write_config(siba->siba_dev, SIBA_GPIO_OUT_EN,
245 pci_read_config(siba->siba_dev,
246 SIBA_GPIO_OUT_EN, 4) | what, 4);
250 in = pci_read_config(siba->siba_dev, SIBA_GPIO_IN, 4);
251 if ((in & SIBA_GPIO_CRYSTAL) != SIBA_GPIO_CRYSTAL) {
252 if (what & SIBA_GPIO_CRYSTAL) {
253 out |= SIBA_GPIO_CRYSTAL;
254 if (what & SIBA_GPIO_PLL)
255 out |= SIBA_GPIO_PLL;
256 pci_write_config(siba->siba_dev, SIBA_GPIO_OUT, out, 4);
257 pci_write_config(siba->siba_dev,
258 SIBA_GPIO_OUT_EN, pci_read_config(siba->siba_dev,
259 SIBA_GPIO_OUT_EN, 4) | what, 4);
262 if (what & SIBA_GPIO_PLL) {
263 out &= ~SIBA_GPIO_PLL;
264 pci_write_config(siba->siba_dev, SIBA_GPIO_OUT, out, 4);
269 status = pci_read_config(siba->siba_dev, PCIR_STATUS, 2);
270 status &= ~PCIM_STATUS_STABORT;
271 pci_write_config(siba->siba_dev, PCIR_STATUS, status, 2);
275 siba_scan(struct siba_softc *siba)
277 struct siba_dev_softc *sd;
280 int base, dev_i = 0, error, i, is_pcie, n_80211 = 0, n_cc = 0,
283 KASSERT(siba->siba_type == SIBA_TYPE_PCI,
284 ("unsupported BUS type (%#x)", siba->siba_type));
286 siba->siba_ndevs = 0;
287 error = siba_switchcore(siba, 0); /* need the first core */
291 idhi = siba_scan_read_4(siba, 0, SIBA_IDHIGH);
292 if (SIBA_IDHIGH_CORECODE(idhi) == SIBA_DEVID_CHIPCOMMON) {
293 tmp = siba_scan_read_4(siba, 0, SIBA_CC_CHIPID);
294 siba->siba_chipid = SIBA_CC_ID(tmp);
295 siba->siba_chiprev = SIBA_CC_REV(tmp);
296 siba->siba_chippkg = SIBA_CC_PKG(tmp);
297 if (SIBA_IDHIGH_REV(idhi) >= 4)
298 siba->siba_ndevs = SIBA_CC_NCORES(tmp);
299 siba->siba_cc.scc_caps = siba_scan_read_4(siba, 0,
302 if (siba->siba_type == SIBA_TYPE_PCI) {
303 siba->siba_chipid = siba_dev2chipid(siba);
304 siba->siba_chiprev = pci_read_config(siba->siba_dev,
306 siba->siba_chippkg = 0;
308 siba->siba_chipid = 0x4710;
309 siba->siba_chiprev = 0;
310 siba->siba_chippkg = 0;
313 if (siba->siba_ndevs == 0)
314 siba->siba_ndevs = siba_getncores(siba->siba_dev,
316 if (siba->siba_ndevs > SIBA_MAX_CORES) {
317 device_printf(siba->siba_dev,
318 "too many siba cores (max %d %d)\n",
319 SIBA_MAX_CORES, siba->siba_ndevs);
323 /* looking basic information about each cores/devices */
324 for (i = 0; i < siba->siba_ndevs; i++) {
325 error = siba_switchcore(siba, i);
328 sd = &(siba->siba_devs[dev_i]);
329 idhi = siba_scan_read_4(siba, i, SIBA_IDHIGH);
331 sd->sd_id.sd_device = SIBA_IDHIGH_CORECODE(idhi);
332 sd->sd_id.sd_rev = SIBA_IDHIGH_REV(idhi);
333 sd->sd_id.sd_vendor = SIBA_IDHIGH_VENDOR(idhi);
334 sd->sd_ops = siba->siba_ops;
337 DPRINTF(siba, SIBA_DEBUG_SCAN,
338 "core %d (%s) found (cc %#x rev %#x vendor %#x)\n",
339 i, siba_core_name(sd->sd_id.sd_device),
340 sd->sd_id.sd_device, sd->sd_id.sd_rev,
341 sd->sd_id.sd_vendor);
343 switch (sd->sd_id.sd_device) {
344 case SIBA_DEVID_CHIPCOMMON:
347 device_printf(siba->siba_dev,
348 "warn: multiple ChipCommon\n");
351 siba->siba_cc.scc_dev = sd;
353 case SIBA_DEVID_80211:
356 device_printf(siba->siba_dev,
357 "warn: multiple 802.11 core\n");
362 case SIBA_DEVID_PCIE:
364 error = pci_find_cap(siba->siba_dev, PCIY_EXPRESS,
366 is_pcie = (error == 0) ? 1 : 0;
369 device_printf(siba->siba_dev,
370 "warn: multiple PCI(E) cores\n");
373 if (sd->sd_id.sd_device == SIBA_DEVID_PCI &&
376 if (sd->sd_id.sd_device == SIBA_DEVID_PCIE &&
379 siba->siba_pci.spc_dev = sd;
381 case SIBA_DEVID_MODEM:
382 case SIBA_DEVID_PCMCIA:
385 device_printf(siba->siba_dev,
386 "unsupported coreid (%s)\n",
387 siba_core_name(sd->sd_id.sd_device));
392 child = device_add_child(siba->siba_dev, NULL, -1);
394 device_printf(siba->siba_dev, "child attach failed\n");
398 device_set_ivars(child, sd);
400 siba->siba_ndevs = dev_i;
404 siba_switchcore(struct siba_softc *siba, uint8_t idx)
407 switch (siba->siba_type) {
409 return (siba_pci_switchcore_sub(siba, idx));
412 ("%s: unsupported bustype %#x", __func__,
419 siba_pci_switchcore_sub(struct siba_softc *siba, uint8_t idx)
425 dir = SIBA_REGWIN(idx);
427 for (i = 0; i < RETRY_MAX; i++) {
428 pci_write_config(siba->siba_dev, SIBA_BAR0, dir, 4);
429 if (pci_read_config(siba->siba_dev, SIBA_BAR0, 4) == dir)
433 DPRINTF(siba, SIBA_DEBUG_SWITCHCORE, "%s: idx %d, failed\n", __func__, idx);
439 siba_pci_switchcore(struct siba_softc *siba, struct siba_dev_softc *sd)
443 DPRINTF(siba, SIBA_DEBUG_SWITCHCORE, "Switching to %s core, index %d\n",
444 siba_core_name(sd->sd_id.sd_device), sd->sd_coreidx);
446 error = siba_pci_switchcore_sub(siba, sd->sd_coreidx);
448 siba->siba_curdev = sd;
454 siba_scan_read_4(struct siba_softc *siba, uint8_t coreidx,
459 KASSERT(siba->siba_type == SIBA_TYPE_PCI,
460 ("unsupported BUS type (%#x)", siba->siba_type));
462 return (SIBA_READ_4(siba, offset));
466 siba_dev2chipid(struct siba_softc *siba)
470 switch (siba->siba_pci_did) {
506 case PCI_DEVICE_ID_BCM4401:
507 case PCI_DEVICE_ID_BCM4401B0:
508 case PCI_DEVICE_ID_BCM4401B1:
512 device_printf(siba->siba_dev, "unknown PCI did (%d)\n",
520 * Earlier ChipCommon revisions have hardcoded number of cores
521 * present dependent on the ChipCommon ID.
524 siba_getncores(device_t dev, uint16_t chipid)
535 case SIBA_CCID_SENTRY5:
539 case SIBA_CCID_BCM4710:
541 case SIBA_CCID_BCM4704:
544 device_printf(dev, "unknown the chipset ID %#x\n", chipid);
551 siba_core_name(uint16_t coreid)
555 case SIBA_DEVID_CHIPCOMMON:
556 return ("ChipCommon");
557 case SIBA_DEVID_ILINE20:
559 case SIBA_DEVID_SDRAM:
563 case SIBA_DEVID_MIPS:
565 case SIBA_DEVID_ETHERNET:
566 return ("Fast Ethernet");
567 case SIBA_DEVID_MODEM:
569 case SIBA_DEVID_USB11_HOSTDEV:
570 return ("USB 1.1 Hostdev");
571 case SIBA_DEVID_ADSL:
573 case SIBA_DEVID_ILINE100:
574 return ("ILine 100");
575 case SIBA_DEVID_IPSEC:
577 case SIBA_DEVID_PCMCIA:
579 case SIBA_DEVID_INTERNAL_MEM:
580 return ("Internal Memory");
581 case SIBA_DEVID_SDRAMDDR:
582 return ("MEMC SDRAM");
583 case SIBA_DEVID_EXTIF:
585 case SIBA_DEVID_80211:
586 return ("IEEE 802.11");
587 case SIBA_DEVID_MIPS_3302:
588 return ("MIPS 3302");
589 case SIBA_DEVID_USB11_HOST:
590 return ("USB 1.1 Host");
591 case SIBA_DEVID_USB11_DEV:
592 return ("USB 1.1 Device");
593 case SIBA_DEVID_USB20_HOST:
594 return ("USB 2.0 Host");
595 case SIBA_DEVID_USB20_DEV:
596 return ("USB 2.0 Device");
597 case SIBA_DEVID_SDIO_HOST:
598 return ("SDIO Host");
599 case SIBA_DEVID_ROBOSWITCH:
600 return ("Roboswitch");
601 case SIBA_DEVID_PARA_ATA:
603 case SIBA_DEVID_SATA_XORDMA:
604 return ("SATA XOR-DMA");
605 case SIBA_DEVID_ETHERNET_GBIT:
606 return ("GBit Ethernet");
607 case SIBA_DEVID_PCIE:
608 return ("PCI-Express");
609 case SIBA_DEVID_MIMO_PHY:
611 case SIBA_DEVID_SRAM_CTRLR:
612 return ("SRAM Controller");
613 case SIBA_DEVID_MINI_MACPHY:
614 return ("Mini MACPHY");
615 case SIBA_DEVID_ARM_1176:
617 case SIBA_DEVID_ARM_7TDMI:
618 return ("ARM 7TDMI");
624 siba_pci_read_2(struct siba_dev_softc *sd, uint16_t offset)
626 struct siba_softc *siba = sd->sd_bus;
628 if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0)
631 return (SIBA_READ_2(siba, offset));
635 siba_pci_read_4(struct siba_dev_softc *sd, uint16_t offset)
637 struct siba_softc *siba = sd->sd_bus;
639 if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0)
642 return (SIBA_READ_4(siba, offset));
646 siba_pci_write_2(struct siba_dev_softc *sd, uint16_t offset, uint16_t value)
648 struct siba_softc *siba = sd->sd_bus;
650 if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0)
653 SIBA_WRITE_2(siba, offset, value);
657 siba_pci_write_4(struct siba_dev_softc *sd, uint16_t offset, uint32_t value)
659 struct siba_softc *siba = sd->sd_bus;
661 if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0)
664 SIBA_WRITE_4(siba, offset, value);
668 siba_pci_read_multi_1(struct siba_dev_softc *sd, void *buffer, size_t count,
671 struct siba_softc *siba = sd->sd_bus;
673 if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0) {
674 memset(buffer, 0xff, count);
678 SIBA_READ_MULTI_1(siba, offset, buffer, count);
682 siba_pci_read_multi_2(struct siba_dev_softc *sd, void *buffer, size_t count,
685 struct siba_softc *siba = sd->sd_bus;
687 if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0) {
688 memset(buffer, 0xff, count);
692 KASSERT(!(count & 1), ("%s:%d: fail", __func__, __LINE__));
693 SIBA_READ_MULTI_2(siba, offset, buffer, count >> 1);
697 siba_pci_read_multi_4(struct siba_dev_softc *sd, void *buffer, size_t count,
700 struct siba_softc *siba = sd->sd_bus;
702 if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0) {
703 memset(buffer, 0xff, count);
707 KASSERT(!(count & 3), ("%s:%d: fail", __func__, __LINE__));
708 SIBA_READ_MULTI_4(siba, offset, buffer, count >> 2);
712 siba_pci_write_multi_1(struct siba_dev_softc *sd, const void *buffer,
713 size_t count, uint16_t offset)
715 struct siba_softc *siba = sd->sd_bus;
717 if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0)
720 SIBA_WRITE_MULTI_1(siba, offset, buffer, count);
724 siba_pci_write_multi_2(struct siba_dev_softc *sd, const void *buffer,
725 size_t count, uint16_t offset)
727 struct siba_softc *siba = sd->sd_bus;
729 if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0)
732 KASSERT(!(count & 1), ("%s:%d: fail", __func__, __LINE__));
733 SIBA_WRITE_MULTI_2(siba, offset, buffer, count >> 1);
737 siba_pci_write_multi_4(struct siba_dev_softc *sd, const void *buffer,
738 size_t count, uint16_t offset)
740 struct siba_softc *siba = sd->sd_bus;
742 if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0)
745 KASSERT(!(count & 3), ("%s:%d: fail", __func__, __LINE__));
746 SIBA_WRITE_MULTI_4(siba, offset, buffer, count >> 2);
750 siba_powerup(device_t dev, int dynamic)
752 struct siba_dev_softc *sd = device_get_ivars(dev);
753 struct siba_softc *siba = sd->sd_bus;
755 siba_powerup_sub(siba, dynamic);
759 siba_powerup_sub(struct siba_softc *siba, int dynamic)
762 siba_pci_gpio(siba, SIBA_GPIO_CRYSTAL | SIBA_GPIO_PLL, 1);
763 siba_cc_clock(&siba->siba_cc,
764 (dynamic != 0) ? SIBA_CLOCK_DYNAMIC : SIBA_CLOCK_FAST);
768 siba_cc_clock(struct siba_cc *scc, enum siba_clock clock)
770 struct siba_dev_softc *sd = scc->scc_dev;
771 struct siba_softc *siba;
779 * PMU controls clockmode; separate function is needed
781 if (scc->scc_caps & SIBA_CC_CAPS_PMU)
785 * chipcommon < r6 (no dynamic clock control)
786 * chipcommon >= r10 (unknown)
788 if (sd->sd_id.sd_rev < 6 || sd->sd_id.sd_rev >= 10 ||
789 (scc->scc_caps & SIBA_CC_CAPS_PWCTL) == 0)
793 case SIBA_CLOCK_DYNAMIC:
794 tmp = SIBA_CC_READ32(scc, SIBA_CC_CLKSLOW) &
795 ~(SIBA_CC_CLKSLOW_ENXTAL | SIBA_CC_CLKSLOW_FSLOW |
796 SIBA_CC_CLKSLOW_IPLL);
797 if ((tmp & SIBA_CC_CLKSLOW_SRC) != SIBA_CC_CLKSLOW_SRC_CRYSTAL)
798 tmp |= SIBA_CC_CLKSLOW_ENXTAL;
799 SIBA_CC_WRITE32(scc, SIBA_CC_CLKSLOW, tmp);
800 if (tmp & SIBA_CC_CLKSLOW_ENXTAL)
801 siba_pci_gpio(siba, SIBA_GPIO_CRYSTAL, 0);
803 case SIBA_CLOCK_SLOW:
804 SIBA_CC_WRITE32(scc, SIBA_CC_CLKSLOW,
805 SIBA_CC_READ32(scc, SIBA_CC_CLKSLOW) |
806 SIBA_CC_CLKSLOW_FSLOW);
808 case SIBA_CLOCK_FAST:
810 siba_pci_gpio(siba, SIBA_GPIO_CRYSTAL, 1);
811 SIBA_CC_WRITE32(scc, SIBA_CC_CLKSLOW,
812 (SIBA_CC_READ32(scc, SIBA_CC_CLKSLOW) |
813 SIBA_CC_CLKSLOW_IPLL) & ~SIBA_CC_CLKSLOW_FSLOW);
817 ("%s: unsupported clock %#x", __func__, clock));
822 siba_read_2(device_t dev, uint16_t offset)
824 struct siba_dev_softc *sd = device_get_ivars(dev);
826 return (sd->sd_ops->read_2(sd, offset));
830 siba_read_4(device_t dev, uint16_t offset)
832 struct siba_dev_softc *sd = device_get_ivars(dev);
834 return (siba_read_4_sub(sd, offset));
838 siba_read_4_sub(struct siba_dev_softc *sd, uint16_t offset)
841 return (sd->sd_ops->read_4(sd, offset));
845 siba_write_2(device_t dev, uint16_t offset, uint16_t value)
847 struct siba_dev_softc *sd = device_get_ivars(dev);
849 sd->sd_ops->write_2(sd, offset, value);
853 siba_write_4(device_t dev, uint16_t offset, uint32_t value)
855 struct siba_dev_softc *sd = device_get_ivars(dev);
857 return (siba_write_4_sub(sd, offset, value));
861 siba_write_4_sub(struct siba_dev_softc *sd, uint16_t offset, uint32_t value)
864 sd->sd_ops->write_4(sd, offset, value);
868 siba_read_multi_1(device_t dev, void *buffer, size_t count,
871 struct siba_dev_softc *sd = device_get_ivars(dev);
873 sd->sd_ops->read_multi_1(sd, buffer, count, offset);
877 siba_read_multi_2(device_t dev, void *buffer, size_t count,
880 struct siba_dev_softc *sd = device_get_ivars(dev);
882 sd->sd_ops->read_multi_2(sd, buffer, count, offset);
886 siba_read_multi_4(device_t dev, void *buffer, size_t count,
889 struct siba_dev_softc *sd = device_get_ivars(dev);
891 sd->sd_ops->read_multi_4(sd, buffer, count, offset);
895 siba_write_multi_1(device_t dev, const void *buffer, size_t count,
898 struct siba_dev_softc *sd = device_get_ivars(dev);
900 sd->sd_ops->write_multi_1(sd, buffer, count, offset);
904 siba_write_multi_2(device_t dev, const void *buffer, size_t count,
907 struct siba_dev_softc *sd = device_get_ivars(dev);
909 sd->sd_ops->write_multi_2(sd, buffer, count, offset);
913 siba_write_multi_4(device_t dev, const void *buffer, size_t count,
916 struct siba_dev_softc *sd = device_get_ivars(dev);
918 sd->sd_ops->write_multi_4(sd, buffer, count, offset);
922 siba_cc_pmu_init(struct siba_cc *scc)
924 const struct siba_cc_pmu_res_updown *updown = NULL;
925 const struct siba_cc_pmu_res_depend *depend = NULL;
926 struct siba_dev_softc *sd = scc->scc_dev;
927 struct siba_softc *siba = sd->sd_bus;
928 uint32_t min = 0, max = 0, pmucap;
929 unsigned int i, updown_size, depend_size;
931 if ((scc->scc_caps & SIBA_CC_CAPS_PMU) == 0)
934 pmucap = SIBA_CC_READ32(scc, SIBA_CC_PMUCAPS);
935 scc->scc_pmu.rev = (pmucap & SIBA_CC_PMUCAPS_REV);
937 DPRINTF(siba, SIBA_DEBUG_PMU, "PMU(r%u) found (caps %#x)\n",
938 scc->scc_pmu.rev, pmucap);
941 if (scc->scc_pmu.rev >= 1) {
942 if (siba->siba_chiprev < 2 && siba->siba_chipid == 0x4325)
943 SIBA_CC_MASK32(scc, SIBA_CC_PMUCTL,
944 ~SIBA_CC_PMUCTL_NOILP);
946 SIBA_CC_SET32(scc, SIBA_CC_PMUCTL,
947 SIBA_CC_PMUCTL_NOILP);
950 if (scc->scc_pmu.rev == 1) {
951 SIBA_CC_MASK32(scc, SIBA_CC_PMUCTL, ~SIBA_CC_PMUCTL_NOILP);
953 SIBA_CC_SET32(scc, SIBA_CC_PMUCTL, SIBA_CC_PMUCTL_NOILP);
956 /* initialize PLL & PMU resources */
957 switch (siba->siba_chipid) {
959 siba_cc_pmu1_pll0_init(scc, 0 /* use default */);
960 /* use the default: min = 0xcbb max = 0x7ffff */
963 if (scc->scc_pmu.rev == 2) {
964 DPRINTF(siba, SIBA_DEBUG_PMU, "%s: chipid 0x4322; PLLing\n",
966 SIBA_CC_WRITE32(scc, SIBA_CC_PLLCTL_ADDR, 0x0000000a);
967 SIBA_CC_WRITE32(scc, SIBA_CC_PLLCTL_DATA, 0x380005c0);
969 /* use the default: min = 0xcbb max = 0x7ffff */
974 siba_cc_pmu1_pll0_init(scc, 0 /* use default */);
976 updown = siba_cc_pmu_4325_updown;
977 updown_size = N(siba_cc_pmu_4325_updown);
978 depend = siba_cc_pmu_4325_depend;
979 depend_size = N(siba_cc_pmu_4325_depend);
981 min = (1 << SIBA_CC_PMU_4325_BURST) |
982 (1 << SIBA_CC_PMU_4325_LN);
983 if (SIBA_CC_READ32(scc, SIBA_CC_CHIPSTAT) &
984 SIBA_CC_CHST_4325_PMUTOP_2B)
985 min |= (1 << SIBA_CC_PMU_4325_CLBURST);
989 siba_cc_pmu0_pll0_init(scc, 0 /* use default */);
991 updown = siba_cc_pmu_4328_updown;
992 updown_size = N(siba_cc_pmu_4328_updown);
993 depend = siba_cc_pmu_4328_depend;
994 depend_size = N(siba_cc_pmu_4328_depend);
996 min = (1 << SIBA_CC_PMU_4328_EXT_SWITCH_PWM) |
997 (1 << SIBA_CC_PMU_4328_BB_SWITCH_PWM) |
998 (1 << SIBA_CC_PMU_4328_CRYSTAL_EN);
1003 siba_cc_pmu0_pll0_init(scc, 0 /* use default */);
1008 device_printf(siba->siba_dev,
1009 "unknown chipid %#x for PLL & PMU init\n",
1014 for (i = 0; i < updown_size; i++) {
1015 SIBA_CC_WRITE32(scc, SIBA_CC_PMU_TABSEL,
1017 SIBA_CC_WRITE32(scc, SIBA_CC_PMU_UPDNTM,
1022 for (i = 0; i < depend_size; i++) {
1023 SIBA_CC_WRITE32(scc, SIBA_CC_PMU_TABSEL,
1025 switch (depend[i].task) {
1026 case SIBA_CC_PMU_DEP_SET:
1027 SIBA_CC_WRITE32(scc, SIBA_CC_PMU_DEPMSK,
1030 case SIBA_CC_PMU_DEP_ADD:
1031 SIBA_CC_SET32(scc, SIBA_CC_PMU_DEPMSK,
1034 case SIBA_CC_PMU_DEP_REMOVE:
1035 SIBA_CC_MASK32(scc, SIBA_CC_PMU_DEPMSK,
1036 ~(depend[i].depend));
1040 ("%s:%d: assertion failed",
1041 __func__, __LINE__));
1047 SIBA_CC_WRITE32(scc, SIBA_CC_PMU_MINRES, min);
1049 SIBA_CC_WRITE32(scc, SIBA_CC_PMU_MAXRES, max);
1053 siba_cc_power_init(struct siba_cc *scc)
1055 struct siba_softc *siba = scc->scc_dev->sd_bus;
1058 if (siba->siba_chipid == 0x4321) {
1059 if (siba->siba_chiprev == 0)
1060 SIBA_CC_WRITE32(scc, SIBA_CC_CHIPCTL, 0x3a4);
1061 else if (siba->siba_chiprev == 1)
1062 SIBA_CC_WRITE32(scc, SIBA_CC_CHIPCTL, 0xa4);
1065 if ((scc->scc_caps & SIBA_CC_CAPS_PWCTL) == 0)
1068 if (scc->scc_dev->sd_id.sd_rev >= 10)
1069 SIBA_CC_WRITE32(scc, SIBA_CC_CLKSYSCTL,
1070 (SIBA_CC_READ32(scc, SIBA_CC_CLKSYSCTL) &
1073 maxfreq = siba_cc_clockfreq(scc, 1);
1074 SIBA_CC_WRITE32(scc, SIBA_CC_PLLONDELAY,
1075 (maxfreq * 150 + 999999) / 1000000);
1076 SIBA_CC_WRITE32(scc, SIBA_CC_FREFSELDELAY,
1077 (maxfreq * 15 + 999999) / 1000000);
1082 siba_cc_powerup_delay(struct siba_cc *scc)
1084 struct siba_softc *siba = scc->scc_dev->sd_bus;
1087 if (siba->siba_type != SIBA_TYPE_PCI)
1090 if (scc->scc_caps & SIBA_CC_CAPS_PMU) {
1091 if ((siba->siba_chipid == 0x4312) ||
1092 (siba->siba_chipid == 0x4322) ||
1093 (siba->siba_chipid == 0x4328)) {
1094 scc->scc_powerup_delay = 7000;
1096 /* 0x4325 is marked as TODO */
1097 scc->scc_powerup_delay = 15000;
1102 if (!(scc->scc_caps & SIBA_CC_CAPS_PWCTL))
1105 min = siba_cc_clockfreq(scc, 0);
1106 scc->scc_powerup_delay =
1107 howmany((SIBA_CC_READ32(scc, SIBA_CC_PLLONDELAY) + 2) * 1000000,
1112 siba_cc_clockfreq(struct siba_cc *scc, int max)
1114 enum siba_clksrc src;
1115 int div = 1, limit = 0;
1117 src = siba_cc_clksrc(scc);
1118 if (scc->scc_dev->sd_id.sd_rev < 6) {
1119 div = (src == SIBA_CC_CLKSRC_PCI) ? 64 :
1120 (src == SIBA_CC_CLKSRC_CRYSTAL) ? 32 : 1;
1122 ("%s: unknown clock %d", __func__, src));
1123 } else if (scc->scc_dev->sd_id.sd_rev < 10) {
1125 case SIBA_CC_CLKSRC_CRYSTAL:
1126 case SIBA_CC_CLKSRC_PCI:
1127 div = ((SIBA_CC_READ32(scc, SIBA_CC_CLKSLOW) >> 16) +
1130 case SIBA_CC_CLKSRC_LOWPW:
1134 div = ((SIBA_CC_READ32(scc, SIBA_CC_CLKSYSCTL) >> 16) + 1) * 4;
1137 case SIBA_CC_CLKSRC_CRYSTAL:
1138 limit = (max) ? 20200000 : 19800000;
1140 case SIBA_CC_CLKSRC_LOWPW:
1141 limit = (max) ? 43000 : 25000;
1143 case SIBA_CC_CLKSRC_PCI:
1144 limit = (max) ? 34000000 : 25000000;
1148 return (limit / div);
1152 siba_cc_pmu1_pll0_init(struct siba_cc *scc, uint32_t freq)
1154 struct siba_dev_softc *sd = scc->scc_dev;
1155 struct siba_softc *siba = sd->sd_bus;
1156 const struct siba_cc_pmu1_plltab *e = NULL;
1157 uint32_t bufsth = 0, pll, pmu;
1160 KASSERT(freq == 0, ("%s:%d: assertion vail", __func__, __LINE__));
1161 if (siba->siba_chipid == 0x4312) {
1162 scc->scc_pmu.freq = 20000;
1166 e = siba_cc_pmu1_plltab_find(SIBA_CC_PMU1_DEFAULT_FREQ);
1167 KASSERT(e != NULL, ("%s:%d: assertion vail", __func__, __LINE__));
1168 scc->scc_pmu.freq = e->freq;
1170 pmu = SIBA_CC_READ32(scc, SIBA_CC_PMUCTL);
1171 if (SIBA_CC_PMUCTL_XF_VAL(pmu) == e->xf)
1174 DPRINTF(siba, SIBA_DEBUG_PLL, "change PLL value to %u.%03u MHz\n",
1175 (e->freq / 1000), (e->freq % 1000));
1178 switch (siba->siba_chipid) {
1181 SIBA_CC_MASK32(scc, SIBA_CC_PMU_MINRES,
1182 ~((1 << SIBA_CC_PMU_4325_BBPLL_PWR) |
1183 (1 << SIBA_CC_PMU_4325_HT)));
1184 SIBA_CC_MASK32(scc, SIBA_CC_PMU_MAXRES,
1185 ~((1 << SIBA_CC_PMU_4325_BBPLL_PWR) |
1186 (1 << SIBA_CC_PMU_4325_HT)));
1190 ("%s:%d: assertion failed", __func__, __LINE__));
1192 for (i = 0; i < 1500; i++) {
1193 if (!(SIBA_CC_READ32(scc, SIBA_CC_CLKCTLSTATUS) &
1194 SIBA_CC_CLKCTLSTATUS_HT))
1198 if (SIBA_CC_READ32(scc, SIBA_CC_CLKCTLSTATUS) & SIBA_CC_CLKCTLSTATUS_HT)
1199 device_printf(siba->siba_dev, "failed to turn PLL off!\n");
1201 pll = siba_cc_pll_read(scc, SIBA_CC_PMU1_PLL0);
1202 pll &= ~(SIBA_CC_PMU1_PLL0_P1DIV | SIBA_CC_PMU1_PLL0_P2DIV);
1203 pll |= ((uint32_t)e->p1div << 20) & SIBA_CC_PMU1_PLL0_P1DIV;
1204 pll |= ((uint32_t)e->p2div << 24) & SIBA_CC_PMU1_PLL0_P2DIV;
1205 siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL0, pll);
1207 pll = siba_cc_pll_read(scc, SIBA_CC_PMU1_PLL2);
1208 pll &= ~(SIBA_CC_PMU1_PLL2_NDIVINT | SIBA_CC_PMU1_PLL2_NDIVMODE);
1209 pll |= ((uint32_t)e->ndiv_int << 20) & SIBA_CC_PMU1_PLL2_NDIVINT;
1210 pll |= (1 << 17) & SIBA_CC_PMU1_PLL2_NDIVMODE;
1211 siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL2, pll);
1213 pll = siba_cc_pll_read(scc, SIBA_CC_PMU1_PLL3);
1214 pll &= ~SIBA_CC_PMU1_PLL3_NDIVFRAC;
1215 pll |= ((uint32_t)e->ndiv_frac << 0) & SIBA_CC_PMU1_PLL3_NDIVFRAC;
1216 siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL3, pll);
1219 pll = siba_cc_pll_read(scc, SIBA_CC_PMU1_PLL5);
1220 pll &= ~SIBA_CC_PMU1_PLL5_CLKDRV;
1221 pll |= (bufsth << 8) & SIBA_CC_PMU1_PLL5_CLKDRV;
1222 siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL5, pll);
1225 pmu = SIBA_CC_READ32(scc, SIBA_CC_PMUCTL);
1226 pmu &= ~(SIBA_CC_PMUCTL_ILP | SIBA_CC_PMUCTL_XF);
1227 pmu |= ((((uint32_t)e->freq + 127) / 128 - 1) << 16) &
1229 pmu |= ((uint32_t)e->xf << 2) & SIBA_CC_PMUCTL_XF;
1230 SIBA_CC_WRITE32(scc, SIBA_CC_PMUCTL, pmu);
1234 siba_cc_pmu0_pll0_init(struct siba_cc *scc, uint32_t xtalfreq)
1236 struct siba_dev_softc *sd = scc->scc_dev;
1237 struct siba_softc *siba = sd->sd_bus;
1238 const struct siba_cc_pmu0_plltab *e = NULL;
1239 uint32_t pmu, tmp, pll;
1242 if ((siba->siba_chipid == 0x5354) && !xtalfreq)
1245 e = siba_cc_pmu0_plltab_findentry(xtalfreq);
1247 e = siba_cc_pmu0_plltab_findentry(
1248 SIBA_CC_PMU0_DEFAULT_XTALFREQ);
1249 KASSERT(e != NULL, ("%s:%d: fail", __func__, __LINE__));
1251 scc->scc_pmu.freq = e->freq;
1253 pmu = SIBA_CC_READ32(scc, SIBA_CC_PMUCTL);
1254 if (((pmu & SIBA_CC_PMUCTL_XF) >> 2) == e->xf)
1257 DPRINTF(siba, SIBA_DEBUG_PLL, "change PLL value to %u.%03u MHz\n",
1258 (xtalfreq / 1000), (xtalfreq % 1000));
1260 KASSERT(siba->siba_chipid == 0x4328 || siba->siba_chipid == 0x5354,
1261 ("%s:%d: fail", __func__, __LINE__));
1263 switch (siba->siba_chipid) {
1265 SIBA_CC_MASK32(scc, SIBA_CC_PMU_MINRES,
1266 ~(1 << SIBA_CC_PMU_4328_BB_PLL_PU));
1267 SIBA_CC_MASK32(scc, SIBA_CC_PMU_MAXRES,
1268 ~(1 << SIBA_CC_PMU_4328_BB_PLL_PU));
1271 SIBA_CC_MASK32(scc, SIBA_CC_PMU_MINRES,
1272 ~(1 << SIBA_CC_PMU_5354_BB_PLL_PU));
1273 SIBA_CC_MASK32(scc, SIBA_CC_PMU_MAXRES,
1274 ~(1 << SIBA_CC_PMU_5354_BB_PLL_PU));
1277 for (i = 1500; i; i--) {
1278 tmp = SIBA_CC_READ32(scc, SIBA_CC_CLKCTLSTATUS);
1279 if (!(tmp & SIBA_CC_CLKCTLSTATUS_HT))
1283 tmp = SIBA_CC_READ32(scc, SIBA_CC_CLKCTLSTATUS);
1284 if (tmp & SIBA_CC_CLKCTLSTATUS_HT)
1285 device_printf(siba->siba_dev, "failed to turn PLL off!\n");
1288 pll = siba_cc_pll_read(scc, SIBA_CC_PMU0_PLL0);
1289 if (xtalfreq >= SIBA_CC_PMU0_PLL0_PDIV_FREQ)
1290 pll |= SIBA_CC_PMU0_PLL0_PDIV_MSK;
1292 pll &= ~SIBA_CC_PMU0_PLL0_PDIV_MSK;
1293 siba_cc_pll_write(scc, SIBA_CC_PMU0_PLL0, pll);
1296 pll = siba_cc_pll_read(scc, SIBA_CC_PMU0_PLL1);
1297 pll &= ~(SIBA_CC_PMU0_PLL1_STOPMOD | SIBA_CC_PMU0_PLL1_IMSK |
1298 SIBA_CC_PMU0_PLL1_FMSK);
1299 pll |= ((uint32_t)e->wb_int << 28) & SIBA_CC_PMU0_PLL1_IMSK;
1300 pll |= ((uint32_t)e->wb_frac << 8) & SIBA_CC_PMU0_PLL1_FMSK;
1301 if (e->wb_frac == 0)
1302 pll |= SIBA_CC_PMU0_PLL1_STOPMOD;
1303 siba_cc_pll_write(scc, SIBA_CC_PMU0_PLL1, pll);
1306 pll = siba_cc_pll_read(scc, SIBA_CC_PMU0_PLL2);
1307 pll &= ~SIBA_CC_PMU0_PLL2_IMSKHI;
1308 pll |= (((uint32_t)e->wb_int >> 4) << 0) & SIBA_CC_PMU0_PLL2_IMSKHI;
1309 siba_cc_pll_write(scc, SIBA_CC_PMU0_PLL2, pll);
1311 /* set freq and divisor. */
1312 pmu = SIBA_CC_READ32(scc, SIBA_CC_PMUCTL);
1313 pmu &= ~SIBA_CC_PMUCTL_ILP;
1314 pmu |= (((xtalfreq + 127) / 128 - 1) << 16) & SIBA_CC_PMUCTL_ILP;
1315 pmu &= ~SIBA_CC_PMUCTL_XF;
1316 pmu |= ((uint32_t)e->xf << 2) & SIBA_CC_PMUCTL_XF;
1317 SIBA_CC_WRITE32(scc, SIBA_CC_PMUCTL, pmu);
1320 static enum siba_clksrc
1321 siba_cc_clksrc(struct siba_cc *scc)
1323 struct siba_dev_softc *sd = scc->scc_dev;
1324 struct siba_softc *siba = sd->sd_bus;
1326 if (sd->sd_id.sd_rev < 6) {
1327 if (siba->siba_type == SIBA_TYPE_PCI) {
1328 if (pci_read_config(siba->siba_dev, SIBA_GPIO_OUT, 4) &
1330 return (SIBA_CC_CLKSRC_PCI);
1331 return (SIBA_CC_CLKSRC_CRYSTAL);
1333 if (siba->siba_type == SIBA_TYPE_SSB ||
1334 siba->siba_type == SIBA_TYPE_PCMCIA)
1335 return (SIBA_CC_CLKSRC_CRYSTAL);
1337 if (sd->sd_id.sd_rev < 10) {
1338 switch (SIBA_CC_READ32(scc, SIBA_CC_CLKSLOW) & 0x7) {
1340 return (SIBA_CC_CLKSRC_LOWPW);
1342 return (SIBA_CC_CLKSRC_CRYSTAL);
1344 return (SIBA_CC_CLKSRC_PCI);
1350 return (SIBA_CC_CLKSRC_CRYSTAL);
1353 static const struct siba_cc_pmu1_plltab *
1354 siba_cc_pmu1_plltab_find(uint32_t crystalfreq)
1356 const struct siba_cc_pmu1_plltab *e;
1359 for (i = 0; i < N(siba_cc_pmu1_plltab); i++) {
1360 e = &siba_cc_pmu1_plltab[i];
1361 if (crystalfreq == e->freq)
1369 siba_cc_pll_read(struct siba_cc *scc, uint32_t offset)
1372 SIBA_CC_WRITE32(scc, SIBA_CC_PLLCTL_ADDR, offset);
1373 return (SIBA_CC_READ32(scc, SIBA_CC_PLLCTL_DATA));
1377 siba_cc_pll_write(struct siba_cc *scc, uint32_t offset, uint32_t value)
1380 SIBA_CC_WRITE32(scc, SIBA_CC_PLLCTL_ADDR, offset);
1381 SIBA_CC_WRITE32(scc, SIBA_CC_PLLCTL_DATA, value);
1384 static const struct siba_cc_pmu0_plltab *
1385 siba_cc_pmu0_plltab_findentry(uint32_t crystalfreq)
1387 const struct siba_cc_pmu0_plltab *e;
1390 for (i = 0; i < N(siba_cc_pmu0_plltab); i++) {
1391 e = &siba_cc_pmu0_plltab[i];
1392 if (e->freq == crystalfreq)
1400 siba_pci_sprom(struct siba_softc *siba, struct siba_sprom *sprom)
1405 buf = malloc(SIBA_SPROMSIZE_R123 * sizeof(uint16_t),
1406 M_DEVBUF, M_NOWAIT | M_ZERO);
1409 siba_sprom_read(siba, buf, SIBA_SPROMSIZE_R123);
1410 error = sprom_check_crc(buf, siba->siba_spromsize);
1412 free(buf, M_DEVBUF);
1413 buf = malloc(SIBA_SPROMSIZE_R4 * sizeof(uint16_t),
1414 M_DEVBUF, M_NOWAIT | M_ZERO);
1417 siba_sprom_read(siba, buf, SIBA_SPROMSIZE_R4);
1418 error = sprom_check_crc(buf, siba->siba_spromsize);
1420 device_printf(siba->siba_dev, "warn: bad SPROM CRC\n");
1423 bzero(sprom, sizeof(*sprom));
1425 sprom->rev = buf[siba->siba_spromsize - 1] & 0x00FF;
1426 DPRINTF(siba, SIBA_DEBUG_SPROM, "SPROM rev %d\n",
1428 memset(sprom->mac_eth, 0xff, 6);
1429 memset(sprom->mac_80211a, 0xff, 6);
1430 if ((siba->siba_chipid & 0xff00) == 0x4400) {
1432 siba_sprom_r123(sprom, buf);
1433 } else if (siba->siba_chipid == 0x4321) {
1435 siba_sprom_r45(sprom, buf);
1437 switch (sprom->rev) {
1441 siba_sprom_r123(sprom, buf);
1445 siba_sprom_r45(sprom, buf);
1448 siba_sprom_r8(sprom, buf);
1451 device_printf(siba->siba_dev,
1452 "unknown SPROM revision %d.\n", sprom->rev);
1453 siba_sprom_r123(sprom, buf);
1457 if (sprom->bf_lo == 0xffff)
1459 if (sprom->bf_hi == 0xffff)
1462 free(buf, M_DEVBUF);
1467 siba_sprom_read(struct siba_softc *siba, uint16_t *sprom, uint16_t len)
1471 for (i = 0; i < len; i++)
1472 sprom[i] = SIBA_READ_2(siba, SIBA_SPROM_BASE + (i * 2));
1474 siba->siba_spromsize = len;
1479 sprom_check_crc(const uint16_t *sprom, size_t size)
1482 uint8_t crc0, crc1 = 0xff;
1484 crc0 = (sprom[size - 1] & SIBA_SPROM_REV_CRC) >> 8;
1485 for (word = 0; word < size - 1; word++) {
1486 crc1 = siba_crc8(crc1, sprom[word] & 0x00ff);
1487 crc1 = siba_crc8(crc1, (sprom[word] & 0xff00) >> 8);
1489 crc1 = siba_crc8(crc1, sprom[size - 1] & 0x00ff);
1492 return ((crc0 != crc1) ? EPROTO : 0);
1496 siba_crc8(uint8_t crc, uint8_t data)
1498 static const uint8_t ct[] = {
1499 0x00, 0xf7, 0xb9, 0x4e, 0x25, 0xd2, 0x9c, 0x6b,
1500 0x4a, 0xbd, 0xf3, 0x04, 0x6f, 0x98, 0xd6, 0x21,
1501 0x94, 0x63, 0x2d, 0xda, 0xb1, 0x46, 0x08, 0xff,
1502 0xde, 0x29, 0x67, 0x90, 0xfb, 0x0c, 0x42, 0xb5,
1503 0x7f, 0x88, 0xc6, 0x31, 0x5a, 0xad, 0xe3, 0x14,
1504 0x35, 0xc2, 0x8c, 0x7b, 0x10, 0xe7, 0xa9, 0x5e,
1505 0xeb, 0x1c, 0x52, 0xa5, 0xce, 0x39, 0x77, 0x80,
1506 0xa1, 0x56, 0x18, 0xef, 0x84, 0x73, 0x3d, 0xca,
1507 0xfe, 0x09, 0x47, 0xb0, 0xdb, 0x2c, 0x62, 0x95,
1508 0xb4, 0x43, 0x0d, 0xfa, 0x91, 0x66, 0x28, 0xdf,
1509 0x6a, 0x9d, 0xd3, 0x24, 0x4f, 0xb8, 0xf6, 0x01,
1510 0x20, 0xd7, 0x99, 0x6e, 0x05, 0xf2, 0xbc, 0x4b,
1511 0x81, 0x76, 0x38, 0xcf, 0xa4, 0x53, 0x1d, 0xea,
1512 0xcb, 0x3c, 0x72, 0x85, 0xee, 0x19, 0x57, 0xa0,
1513 0x15, 0xe2, 0xac, 0x5b, 0x30, 0xc7, 0x89, 0x7e,
1514 0x5f, 0xa8, 0xe6, 0x11, 0x7a, 0x8d, 0xc3, 0x34,
1515 0xab, 0x5c, 0x12, 0xe5, 0x8e, 0x79, 0x37, 0xc0,
1516 0xe1, 0x16, 0x58, 0xaf, 0xc4, 0x33, 0x7d, 0x8a,
1517 0x3f, 0xc8, 0x86, 0x71, 0x1a, 0xed, 0xa3, 0x54,
1518 0x75, 0x82, 0xcc, 0x3b, 0x50, 0xa7, 0xe9, 0x1e,
1519 0xd4, 0x23, 0x6d, 0x9a, 0xf1, 0x06, 0x48, 0xbf,
1520 0x9e, 0x69, 0x27, 0xd0, 0xbb, 0x4c, 0x02, 0xf5,
1521 0x40, 0xb7, 0xf9, 0x0e, 0x65, 0x92, 0xdc, 0x2b,
1522 0x0a, 0xfd, 0xb3, 0x44, 0x2f, 0xd8, 0x96, 0x61,
1523 0x55, 0xa2, 0xec, 0x1b, 0x70, 0x87, 0xc9, 0x3e,
1524 0x1f, 0xe8, 0xa6, 0x51, 0x3a, 0xcd, 0x83, 0x74,
1525 0xc1, 0x36, 0x78, 0x8f, 0xe4, 0x13, 0x5d, 0xaa,
1526 0x8b, 0x7c, 0x32, 0xc5, 0xae, 0x59, 0x17, 0xe0,
1527 0x2a, 0xdd, 0x93, 0x64, 0x0f, 0xf8, 0xb6, 0x41,
1528 0x60, 0x97, 0xd9, 0x2e, 0x45, 0xb2, 0xfc, 0x0b,
1529 0xbe, 0x49, 0x07, 0xf0, 0x9b, 0x6c, 0x22, 0xd5,
1530 0xf4, 0x03, 0x4d, 0xba, 0xd1, 0x26, 0x68, 0x9f,
1532 return (ct[crc ^ data]);
1535 #define SIBA_LOWEST_SET_BIT(__mask) ((((__mask) - 1) & (__mask)) ^ (__mask))
1536 #define SIBA_OFFSET(offset) \
1537 (((offset) - SIBA_SPROM_BASE) / sizeof(uint16_t))
1538 #define SIBA_SHIFTOUT_SUB(__x, __mask) \
1539 (((__x) & (__mask)) / SIBA_LOWEST_SET_BIT(__mask))
1540 #define SIBA_SHIFTOUT(_var, _offset, _mask) \
1541 out->_var = SIBA_SHIFTOUT_SUB(in[SIBA_OFFSET(_offset)], (_mask))
1542 #define SIBA_SHIFTOUT_4(_var, _offset, _mask, _shift) \
1543 out->_var = ((((uint32_t)in[SIBA_OFFSET((_offset)+2)] << 16 | \
1544 in[SIBA_OFFSET(_offset)]) & (_mask)) >> (_shift))
1547 siba_sprom_r123(struct siba_sprom *out, const uint16_t *in)
1555 loc[0] = SIBA_SPROM3_MAC_80211BG;
1557 loc[0] = SIBA_SPROM1_MAC_80211BG;
1558 loc[1] = SIBA_SPROM1_MAC_ETH;
1559 loc[2] = SIBA_SPROM1_MAC_80211A;
1561 for (i = 0; i < 3; i++) {
1562 v = in[SIBA_OFFSET(loc[0]) + i];
1563 *(((uint16_t *)out->mac_80211bg) + i) = htobe16(v);
1566 for (i = 0; i < 3; i++) {
1567 v = in[SIBA_OFFSET(loc[1]) + i];
1568 *(((uint16_t *)out->mac_eth) + i) = htobe16(v);
1570 for (i = 0; i < 3; i++) {
1571 v = in[SIBA_OFFSET(loc[2]) + i];
1572 *(((uint16_t *)out->mac_80211a) + i) = htobe16(v);
1575 SIBA_SHIFTOUT(mii_eth0, SIBA_SPROM1_ETHPHY,
1576 SIBA_SPROM1_ETHPHY_MII_ETH0);
1577 SIBA_SHIFTOUT(mii_eth1, SIBA_SPROM1_ETHPHY,
1578 SIBA_SPROM1_ETHPHY_MII_ETH1);
1579 SIBA_SHIFTOUT(mdio_eth0, SIBA_SPROM1_ETHPHY,
1580 SIBA_SPROM1_ETHPHY_MDIO_ETH0);
1581 SIBA_SHIFTOUT(mdio_eth1, SIBA_SPROM1_ETHPHY,
1582 SIBA_SPROM1_ETHPHY_MDIO_ETH1);
1583 SIBA_SHIFTOUT(brev, SIBA_SPROM1_BOARDINFO, SIBA_SPROM1_BOARDINFO_BREV);
1584 SIBA_SHIFTOUT(ccode, SIBA_SPROM1_BOARDINFO,
1585 SIBA_SPROM1_BOARDINFO_CCODE);
1586 SIBA_SHIFTOUT(ant_a, SIBA_SPROM1_BOARDINFO, SIBA_SPROM1_BOARDINFO_ANTA);
1587 SIBA_SHIFTOUT(ant_bg, SIBA_SPROM1_BOARDINFO,
1588 SIBA_SPROM1_BOARDINFO_ANTBG);
1589 SIBA_SHIFTOUT(pa0b0, SIBA_SPROM1_PA0B0, 0xffff);
1590 SIBA_SHIFTOUT(pa0b1, SIBA_SPROM1_PA0B1, 0xffff);
1591 SIBA_SHIFTOUT(pa0b2, SIBA_SPROM1_PA0B2, 0xffff);
1592 SIBA_SHIFTOUT(pa1b0, SIBA_SPROM1_PA1B0, 0xffff);
1593 SIBA_SHIFTOUT(pa1b1, SIBA_SPROM1_PA1B1, 0xffff);
1594 SIBA_SHIFTOUT(pa1b2, SIBA_SPROM1_PA1B2, 0xffff);
1595 SIBA_SHIFTOUT(gpio0, SIBA_SPROM1_GPIOA, SIBA_SPROM1_GPIOA_P0);
1596 SIBA_SHIFTOUT(gpio1, SIBA_SPROM1_GPIOA, SIBA_SPROM1_GPIOA_P1);
1597 SIBA_SHIFTOUT(gpio2, SIBA_SPROM1_GPIOB, SIBA_SPROM1_GPIOB_P2);
1598 SIBA_SHIFTOUT(gpio3, SIBA_SPROM1_GPIOB, SIBA_SPROM1_GPIOB_P3);
1600 SIBA_SHIFTOUT(maxpwr_a, SIBA_SPROM1_MAXPWR, SIBA_SPROM1_MAXPWR_A);
1601 SIBA_SHIFTOUT(maxpwr_bg, SIBA_SPROM1_MAXPWR, SIBA_SPROM1_MAXPWR_BG);
1602 SIBA_SHIFTOUT(tssi_a, SIBA_SPROM1_TSSI, SIBA_SPROM1_TSSI_A);
1603 SIBA_SHIFTOUT(tssi_bg, SIBA_SPROM1_TSSI, SIBA_SPROM1_TSSI_BG);
1604 SIBA_SHIFTOUT(bf_lo, SIBA_SPROM1_BFLOW, 0xffff);
1606 SIBA_SHIFTOUT(bf_hi, SIBA_SPROM2_BFHIGH, 0xffff);
1609 gain = siba_sprom_r123_antgain(out->rev, in, SIBA_SPROM1_AGAIN_BG, 0);
1610 out->again.ghz24.a0 = out->again.ghz24.a1 = gain;
1611 out->again.ghz24.a2 = out->again.ghz24.a3 = gain;
1612 gain = siba_sprom_r123_antgain(out->rev, in, SIBA_SPROM1_AGAIN_A, 8);
1613 out->again.ghz5.a0 = out->again.ghz5.a1 = gain;
1614 out->again.ghz5.a2 = out->again.ghz5.a3 = gain;
1618 siba_sprom_r458(struct siba_sprom *out, const uint16_t *in)
1621 SIBA_SHIFTOUT(txpid2g[0], SIBA_SPROM4_TXPID2G01,
1622 SIBA_SPROM4_TXPID2G0);
1623 SIBA_SHIFTOUT(txpid2g[1], SIBA_SPROM4_TXPID2G01,
1624 SIBA_SPROM4_TXPID2G1);
1625 SIBA_SHIFTOUT(txpid2g[2], SIBA_SPROM4_TXPID2G23,
1626 SIBA_SPROM4_TXPID2G2);
1627 SIBA_SHIFTOUT(txpid2g[3], SIBA_SPROM4_TXPID2G23,
1628 SIBA_SPROM4_TXPID2G3);
1630 SIBA_SHIFTOUT(txpid5gl[0], SIBA_SPROM4_TXPID5GL01,
1631 SIBA_SPROM4_TXPID5GL0);
1632 SIBA_SHIFTOUT(txpid5gl[1], SIBA_SPROM4_TXPID5GL01,
1633 SIBA_SPROM4_TXPID5GL1);
1634 SIBA_SHIFTOUT(txpid5gl[2], SIBA_SPROM4_TXPID5GL23,
1635 SIBA_SPROM4_TXPID5GL2);
1636 SIBA_SHIFTOUT(txpid5gl[3], SIBA_SPROM4_TXPID5GL23,
1637 SIBA_SPROM4_TXPID5GL3);
1639 SIBA_SHIFTOUT(txpid5g[0], SIBA_SPROM4_TXPID5G01,
1640 SIBA_SPROM4_TXPID5G0);
1641 SIBA_SHIFTOUT(txpid5g[1], SIBA_SPROM4_TXPID5G01,
1642 SIBA_SPROM4_TXPID5G1);
1643 SIBA_SHIFTOUT(txpid5g[2], SIBA_SPROM4_TXPID5G23,
1644 SIBA_SPROM4_TXPID5G2);
1645 SIBA_SHIFTOUT(txpid5g[3], SIBA_SPROM4_TXPID5G23,
1646 SIBA_SPROM4_TXPID5G3);
1648 SIBA_SHIFTOUT(txpid5gh[0], SIBA_SPROM4_TXPID5GH01,
1649 SIBA_SPROM4_TXPID5GH0);
1650 SIBA_SHIFTOUT(txpid5gh[1], SIBA_SPROM4_TXPID5GH01,
1651 SIBA_SPROM4_TXPID5GH1);
1652 SIBA_SHIFTOUT(txpid5gh[2], SIBA_SPROM4_TXPID5GH23,
1653 SIBA_SPROM4_TXPID5GH2);
1654 SIBA_SHIFTOUT(txpid5gh[3], SIBA_SPROM4_TXPID5GH23,
1655 SIBA_SPROM4_TXPID5GH3);
1659 siba_sprom_r45(struct siba_sprom *out, const uint16_t *in)
1663 uint16_t mac_80211bg_offset;
1664 const uint16_t pwr_info_offset[] = {
1665 SIBA_SPROM4_PWR_INFO_CORE0, SIBA_SPROM4_PWR_INFO_CORE1,
1666 SIBA_SPROM4_PWR_INFO_CORE2, SIBA_SPROM4_PWR_INFO_CORE3
1670 mac_80211bg_offset = SIBA_SPROM4_MAC_80211BG;
1672 mac_80211bg_offset = SIBA_SPROM5_MAC_80211BG;
1673 for (i = 0; i < 3; i++) {
1674 v = in[SIBA_OFFSET(mac_80211bg_offset) + i];
1675 *(((uint16_t *)out->mac_80211bg) + i) = htobe16(v);
1677 SIBA_SHIFTOUT(mii_eth0, SIBA_SPROM4_ETHPHY, SIBA_SPROM4_ETHPHY_ET0A);
1678 SIBA_SHIFTOUT(mii_eth1, SIBA_SPROM4_ETHPHY, SIBA_SPROM4_ETHPHY_ET1A);
1679 if (out->rev == 4) {
1680 SIBA_SHIFTOUT(ccode, SIBA_SPROM4_CCODE, 0xffff);
1681 SIBA_SHIFTOUT(bf_lo, SIBA_SPROM4_BFLOW, 0xffff);
1682 SIBA_SHIFTOUT(bf_hi, SIBA_SPROM4_BFHIGH, 0xffff);
1684 SIBA_SHIFTOUT(ccode, SIBA_SPROM5_CCODE, 0xffff);
1685 SIBA_SHIFTOUT(bf_lo, SIBA_SPROM5_BFLOW, 0xffff);
1686 SIBA_SHIFTOUT(bf_hi, SIBA_SPROM5_BFHIGH, 0xffff);
1688 SIBA_SHIFTOUT(ant_a, SIBA_SPROM4_ANTAVAIL, SIBA_SPROM4_ANTAVAIL_A);
1689 SIBA_SHIFTOUT(ant_bg, SIBA_SPROM4_ANTAVAIL, SIBA_SPROM4_ANTAVAIL_BG);
1690 SIBA_SHIFTOUT(maxpwr_bg, SIBA_SPROM4_MAXP_BG, SIBA_SPROM4_MAXP_BG_MASK);
1691 SIBA_SHIFTOUT(tssi_bg, SIBA_SPROM4_MAXP_BG, SIBA_SPROM4_TSSI_BG);
1692 SIBA_SHIFTOUT(maxpwr_a, SIBA_SPROM4_MAXP_A, SIBA_SPROM4_MAXP_A_MASK);
1693 SIBA_SHIFTOUT(tssi_a, SIBA_SPROM4_MAXP_A, SIBA_SPROM4_TSSI_A);
1694 if (out->rev == 4) {
1695 SIBA_SHIFTOUT(gpio0, SIBA_SPROM4_GPIOA, SIBA_SPROM4_GPIOA_P0);
1696 SIBA_SHIFTOUT(gpio1, SIBA_SPROM4_GPIOA, SIBA_SPROM4_GPIOA_P1);
1697 SIBA_SHIFTOUT(gpio2, SIBA_SPROM4_GPIOB, SIBA_SPROM4_GPIOB_P2);
1698 SIBA_SHIFTOUT(gpio3, SIBA_SPROM4_GPIOB, SIBA_SPROM4_GPIOB_P3);
1700 SIBA_SHIFTOUT(gpio0, SIBA_SPROM5_GPIOA, SIBA_SPROM5_GPIOA_P0);
1701 SIBA_SHIFTOUT(gpio1, SIBA_SPROM5_GPIOA, SIBA_SPROM5_GPIOA_P1);
1702 SIBA_SHIFTOUT(gpio2, SIBA_SPROM5_GPIOB, SIBA_SPROM5_GPIOB_P2);
1703 SIBA_SHIFTOUT(gpio3, SIBA_SPROM5_GPIOB, SIBA_SPROM5_GPIOB_P3);
1707 SIBA_SHIFTOUT(again.ghz24.a0, SIBA_SPROM4_AGAIN01, SIBA_SPROM4_AGAIN0);
1708 SIBA_SHIFTOUT(again.ghz24.a1, SIBA_SPROM4_AGAIN01, SIBA_SPROM4_AGAIN1);
1709 SIBA_SHIFTOUT(again.ghz24.a2, SIBA_SPROM4_AGAIN23, SIBA_SPROM4_AGAIN2);
1710 SIBA_SHIFTOUT(again.ghz24.a3, SIBA_SPROM4_AGAIN23, SIBA_SPROM4_AGAIN3);
1711 bcopy(&out->again.ghz24, &out->again.ghz5, sizeof(out->again.ghz5));
1713 /* Extract core power info */
1714 for (i = 0; i < nitems(pwr_info_offset); i++) {
1715 uint16_t o = pwr_info_offset[i];
1717 SIBA_SHIFTOUT(core_pwr_info[i].itssi_2g, o + SIBA_SPROM4_2G_MAXP_ITSSI,
1718 SIBA_SPROM4_2G_ITSSI);
1719 SIBA_SHIFTOUT(core_pwr_info[i].maxpwr_2g, o + SIBA_SPROM4_2G_MAXP_ITSSI,
1720 SIBA_SPROM4_2G_MAXP);
1722 SIBA_SHIFTOUT(core_pwr_info[i].pa_2g[0], o + SIBA_SPROM4_2G_PA_0, ~0);
1723 SIBA_SHIFTOUT(core_pwr_info[i].pa_2g[1], o + SIBA_SPROM4_2G_PA_1, ~0);
1724 SIBA_SHIFTOUT(core_pwr_info[i].pa_2g[2], o + SIBA_SPROM4_2G_PA_2, ~0);
1725 SIBA_SHIFTOUT(core_pwr_info[i].pa_2g[3], o + SIBA_SPROM4_2G_PA_3, ~0);
1727 SIBA_SHIFTOUT(core_pwr_info[i].itssi_5g, o + SIBA_SPROM4_5G_MAXP_ITSSI,
1728 SIBA_SPROM4_5G_ITSSI);
1729 SIBA_SHIFTOUT(core_pwr_info[i].maxpwr_5g, o + SIBA_SPROM4_5G_MAXP_ITSSI,
1730 SIBA_SPROM4_5G_MAXP);
1731 SIBA_SHIFTOUT(core_pwr_info[i].maxpwr_5gh, o + SIBA_SPROM4_5GHL_MAXP,
1732 SIBA_SPROM4_5GH_MAXP);
1733 SIBA_SHIFTOUT(core_pwr_info[i].maxpwr_5gl, o + SIBA_SPROM4_5GHL_MAXP,
1734 SIBA_SPROM4_5GL_MAXP);
1736 SIBA_SHIFTOUT(core_pwr_info[i].pa_5gl[0], o + SIBA_SPROM4_5GL_PA_0, ~0);
1737 SIBA_SHIFTOUT(core_pwr_info[i].pa_5gl[1], o + SIBA_SPROM4_5GL_PA_1, ~0);
1738 SIBA_SHIFTOUT(core_pwr_info[i].pa_5gl[2], o + SIBA_SPROM4_5GL_PA_2, ~0);
1739 SIBA_SHIFTOUT(core_pwr_info[i].pa_5gl[3], o + SIBA_SPROM4_5GL_PA_3, ~0);
1740 SIBA_SHIFTOUT(core_pwr_info[i].pa_5g[0], o + SIBA_SPROM4_5G_PA_0, ~0);
1741 SIBA_SHIFTOUT(core_pwr_info[i].pa_5g[1], o + SIBA_SPROM4_5G_PA_1, ~0);
1742 SIBA_SHIFTOUT(core_pwr_info[i].pa_5g[2], o + SIBA_SPROM4_5G_PA_2, ~0);
1743 SIBA_SHIFTOUT(core_pwr_info[i].pa_5g[3], o + SIBA_SPROM4_5G_PA_3, ~0);
1744 SIBA_SHIFTOUT(core_pwr_info[i].pa_5gh[0], o + SIBA_SPROM4_5GH_PA_0, ~0);
1745 SIBA_SHIFTOUT(core_pwr_info[i].pa_5gh[1], o + SIBA_SPROM4_5GH_PA_1, ~0);
1746 SIBA_SHIFTOUT(core_pwr_info[i].pa_5gh[2], o + SIBA_SPROM4_5GH_PA_2, ~0);
1747 SIBA_SHIFTOUT(core_pwr_info[i].pa_5gh[3], o + SIBA_SPROM4_5GH_PA_3, ~0);
1750 siba_sprom_r458(out, in);
1754 siba_sprom_r8(struct siba_sprom *out, const uint16_t *in)
1758 uint16_t pwr_info_offset[] = {
1759 SIBA_SROM8_PWR_INFO_CORE0, SIBA_SROM8_PWR_INFO_CORE1,
1760 SIBA_SROM8_PWR_INFO_CORE2, SIBA_SROM8_PWR_INFO_CORE3
1763 for (i = 0; i < 3; i++) {
1764 v = in[SIBA_OFFSET(SIBA_SPROM8_MAC_80211BG) + i];
1765 *(((uint16_t *)out->mac_80211bg) + i) = htobe16(v);
1767 SIBA_SHIFTOUT(ccode, SIBA_SPROM8_CCODE, 0xffff);
1768 SIBA_SHIFTOUT(bf_lo, SIBA_SPROM8_BFLOW, 0xffff);
1769 SIBA_SHIFTOUT(bf_hi, SIBA_SPROM8_BFHIGH, 0xffff);
1770 SIBA_SHIFTOUT(bf2_lo, SIBA_SPROM8_BFL2LO, 0xffff);
1771 SIBA_SHIFTOUT(bf2_hi, SIBA_SPROM8_BFL2HI, 0xffff);
1772 SIBA_SHIFTOUT(ant_a, SIBA_SPROM8_ANTAVAIL, SIBA_SPROM8_ANTAVAIL_A);
1773 SIBA_SHIFTOUT(ant_bg, SIBA_SPROM8_ANTAVAIL, SIBA_SPROM8_ANTAVAIL_BG);
1774 SIBA_SHIFTOUT(maxpwr_bg, SIBA_SPROM8_MAXP_BG, SIBA_SPROM8_MAXP_BG_MASK);
1775 SIBA_SHIFTOUT(tssi_bg, SIBA_SPROM8_MAXP_BG, SIBA_SPROM8_TSSI_BG);
1776 SIBA_SHIFTOUT(maxpwr_a, SIBA_SPROM8_MAXP_A, SIBA_SPROM8_MAXP_A_MASK);
1777 SIBA_SHIFTOUT(tssi_a, SIBA_SPROM8_MAXP_A, SIBA_SPROM8_TSSI_A);
1778 SIBA_SHIFTOUT(maxpwr_ah, SIBA_SPROM8_MAXP_AHL,
1779 SIBA_SPROM8_MAXP_AH_MASK);
1780 SIBA_SHIFTOUT(maxpwr_al, SIBA_SPROM8_MAXP_AHL,
1781 SIBA_SPROM8_MAXP_AL_MASK);
1782 SIBA_SHIFTOUT(gpio0, SIBA_SPROM8_GPIOA, SIBA_SPROM8_GPIOA_P0);
1783 SIBA_SHIFTOUT(gpio1, SIBA_SPROM8_GPIOA, SIBA_SPROM8_GPIOA_P1);
1784 SIBA_SHIFTOUT(gpio2, SIBA_SPROM8_GPIOB, SIBA_SPROM8_GPIOB_P2);
1785 SIBA_SHIFTOUT(gpio3, SIBA_SPROM8_GPIOB, SIBA_SPROM8_GPIOB_P3);
1786 SIBA_SHIFTOUT(tri2g, SIBA_SPROM8_TRI25G, SIBA_SPROM8_TRI2G);
1787 SIBA_SHIFTOUT(tri5g, SIBA_SPROM8_TRI25G, SIBA_SPROM8_TRI5G);
1788 SIBA_SHIFTOUT(tri5gl, SIBA_SPROM8_TRI5GHL, SIBA_SPROM8_TRI5GL);
1789 SIBA_SHIFTOUT(tri5gh, SIBA_SPROM8_TRI5GHL, SIBA_SPROM8_TRI5GH);
1790 SIBA_SHIFTOUT(rxpo2g, SIBA_SPROM8_RXPO, SIBA_SPROM8_RXPO2G);
1791 SIBA_SHIFTOUT(rxpo5g, SIBA_SPROM8_RXPO, SIBA_SPROM8_RXPO5G);
1793 SIBA_SHIFTOUT(rssismf2g, SIBA_SPROM8_RSSIPARM2G, SIBA_SPROM8_RSSISMF2G);
1794 SIBA_SHIFTOUT(rssismc2g, SIBA_SPROM8_RSSIPARM2G, SIBA_SPROM8_RSSISMC2G);
1795 SIBA_SHIFTOUT(rssisav2g, SIBA_SPROM8_RSSIPARM2G, SIBA_SPROM8_RSSISAV2G);
1796 SIBA_SHIFTOUT(bxa2g, SIBA_SPROM8_RSSIPARM2G, SIBA_SPROM8_BXA2G);
1797 SIBA_SHIFTOUT(rssismf5g, SIBA_SPROM8_RSSIPARM5G, SIBA_SPROM8_RSSISMF5G);
1798 SIBA_SHIFTOUT(rssismc5g, SIBA_SPROM8_RSSIPARM5G, SIBA_SPROM8_RSSISMC5G);
1799 SIBA_SHIFTOUT(rssisav5g, SIBA_SPROM8_RSSIPARM5G, SIBA_SPROM8_RSSISAV5G);
1800 SIBA_SHIFTOUT(bxa5g, SIBA_SPROM8_RSSIPARM5G, SIBA_SPROM8_BXA5G);
1802 SIBA_SHIFTOUT(pa0b0, SIBA_SPROM8_PA0B0, 0xffff);
1803 SIBA_SHIFTOUT(pa0b1, SIBA_SPROM8_PA0B1, 0xffff);
1804 SIBA_SHIFTOUT(pa0b2, SIBA_SPROM8_PA0B2, 0xffff);
1805 SIBA_SHIFTOUT(pa1b0, SIBA_SPROM8_PA1B0, 0xffff);
1806 SIBA_SHIFTOUT(pa1b1, SIBA_SPROM8_PA1B1, 0xffff);
1807 SIBA_SHIFTOUT(pa1b2, SIBA_SPROM8_PA1B2, 0xffff);
1808 SIBA_SHIFTOUT(pa1lob0, SIBA_SPROM8_PA1LOB0, 0xffff);
1809 SIBA_SHIFTOUT(pa1lob1, SIBA_SPROM8_PA1LOB1, 0xffff);
1810 SIBA_SHIFTOUT(pa1lob2, SIBA_SPROM8_PA1LOB2, 0xffff);
1811 SIBA_SHIFTOUT(pa1hib0, SIBA_SPROM8_PA1HIB0, 0xffff);
1812 SIBA_SHIFTOUT(pa1hib1, SIBA_SPROM8_PA1HIB1, 0xffff);
1813 SIBA_SHIFTOUT(pa1hib2, SIBA_SPROM8_PA1HIB2, 0xffff);
1814 SIBA_SHIFTOUT(cck2gpo, SIBA_SPROM8_CCK2GPO, 0xffff);
1816 SIBA_SHIFTOUT_4(ofdm2gpo, SIBA_SPROM8_OFDM2GPO, 0xffffffff, 0);
1817 SIBA_SHIFTOUT_4(ofdm5glpo, SIBA_SPROM8_OFDM5GLPO, 0xffffffff, 0);
1818 SIBA_SHIFTOUT_4(ofdm5gpo, SIBA_SPROM8_OFDM5GPO, 0xffffffff, 0);
1819 SIBA_SHIFTOUT_4(ofdm5ghpo, SIBA_SPROM8_OFDM5GHPO, 0xffffffff, 0);
1822 SIBA_SHIFTOUT(again.ghz24.a0, SIBA_SPROM8_AGAIN01, SIBA_SPROM8_AGAIN0);
1823 SIBA_SHIFTOUT(again.ghz24.a1, SIBA_SPROM8_AGAIN01, SIBA_SPROM8_AGAIN1);
1824 SIBA_SHIFTOUT(again.ghz24.a2, SIBA_SPROM8_AGAIN23, SIBA_SPROM8_AGAIN2);
1825 SIBA_SHIFTOUT(again.ghz24.a3, SIBA_SPROM8_AGAIN23, SIBA_SPROM8_AGAIN3);
1826 bcopy(&out->again.ghz24, &out->again.ghz5, sizeof(out->again.ghz5));
1829 SIBA_SHIFTOUT(fem.ghz2.tssipos, SIBA_SPROM8_FEM2G,
1830 SIBA_SROM8_FEM_TSSIPOS);
1831 SIBA_SHIFTOUT(fem.ghz2.extpa_gain, SIBA_SPROM8_FEM2G,
1832 SIBA_SROM8_FEM_EXTPA_GAIN);
1833 SIBA_SHIFTOUT(fem.ghz2.pdet_range, SIBA_SPROM8_FEM2G,
1834 SIBA_SROM8_FEM_PDET_RANGE);
1835 SIBA_SHIFTOUT(fem.ghz2.tr_iso, SIBA_SPROM8_FEM2G,
1836 SIBA_SROM8_FEM_TR_ISO);
1837 SIBA_SHIFTOUT(fem.ghz2.antswlut, SIBA_SPROM8_FEM2G,
1838 SIBA_SROM8_FEM_ANTSWLUT);
1840 SIBA_SHIFTOUT(fem.ghz5.tssipos, SIBA_SPROM8_FEM5G,
1841 SIBA_SROM8_FEM_TSSIPOS);
1842 SIBA_SHIFTOUT(fem.ghz5.extpa_gain, SIBA_SPROM8_FEM5G,
1843 SIBA_SROM8_FEM_EXTPA_GAIN);
1844 SIBA_SHIFTOUT(fem.ghz5.pdet_range, SIBA_SPROM8_FEM5G,
1845 SIBA_SROM8_FEM_PDET_RANGE);
1846 SIBA_SHIFTOUT(fem.ghz5.tr_iso, SIBA_SPROM8_FEM5G,
1847 SIBA_SROM8_FEM_TR_ISO);
1848 SIBA_SHIFTOUT(fem.ghz5.antswlut, SIBA_SPROM8_FEM5G,
1849 SIBA_SROM8_FEM_ANTSWLUT);
1851 /* Extract cores power info info */
1852 for (i = 0; i < nitems(pwr_info_offset); i++) {
1853 uint16_t o = pwr_info_offset[i];
1854 SIBA_SHIFTOUT(core_pwr_info[i].itssi_2g, o + SIBA_SROM8_2G_MAXP_ITSSI,
1855 SIBA_SPROM8_2G_ITSSI);
1856 SIBA_SHIFTOUT(core_pwr_info[i].maxpwr_2g, o + SIBA_SROM8_2G_MAXP_ITSSI,
1857 SIBA_SPROM8_2G_MAXP);
1859 SIBA_SHIFTOUT(core_pwr_info[i].pa_2g[0], o + SIBA_SROM8_2G_PA_0, ~0);
1860 SIBA_SHIFTOUT(core_pwr_info[i].pa_2g[1], o + SIBA_SROM8_2G_PA_1, ~0);
1861 SIBA_SHIFTOUT(core_pwr_info[i].pa_2g[2], o + SIBA_SROM8_2G_PA_2, ~0);
1863 SIBA_SHIFTOUT(core_pwr_info[i].itssi_5g, o + SIBA_SROM8_5G_MAXP_ITSSI,
1864 SIBA_SPROM8_5G_ITSSI);
1865 SIBA_SHIFTOUT(core_pwr_info[i].maxpwr_5g, o + SIBA_SROM8_5G_MAXP_ITSSI,
1866 SIBA_SPROM8_5G_MAXP);
1867 SIBA_SHIFTOUT(core_pwr_info[i].maxpwr_5gh, o + SIBA_SPROM8_5GHL_MAXP,
1868 SIBA_SPROM8_5GH_MAXP);
1869 SIBA_SHIFTOUT(core_pwr_info[i].maxpwr_5gl, o + SIBA_SPROM8_5GHL_MAXP,
1870 SIBA_SPROM8_5GL_MAXP);
1872 SIBA_SHIFTOUT(core_pwr_info[i].pa_5gl[0], o + SIBA_SROM8_5GL_PA_0, ~0);
1873 SIBA_SHIFTOUT(core_pwr_info[i].pa_5gl[1], o + SIBA_SROM8_5GL_PA_1, ~0);
1874 SIBA_SHIFTOUT(core_pwr_info[i].pa_5gl[2], o + SIBA_SROM8_5GL_PA_2, ~0);
1875 SIBA_SHIFTOUT(core_pwr_info[i].pa_5g[0], o + SIBA_SROM8_5G_PA_0, ~0);
1876 SIBA_SHIFTOUT(core_pwr_info[i].pa_5g[1], o + SIBA_SROM8_5G_PA_1, ~0);
1877 SIBA_SHIFTOUT(core_pwr_info[i].pa_5g[2], o + SIBA_SROM8_5G_PA_2, ~0);
1878 SIBA_SHIFTOUT(core_pwr_info[i].pa_5gh[0], o + SIBA_SROM8_5GH_PA_0, ~0);
1879 SIBA_SHIFTOUT(core_pwr_info[i].pa_5gh[1], o + SIBA_SROM8_5GH_PA_1, ~0);
1880 SIBA_SHIFTOUT(core_pwr_info[i].pa_5gh[2], o + SIBA_SROM8_5GH_PA_2, ~0);
1883 SIBA_SHIFTOUT(cddpo, SIBA_SPROM8_CDDPO, ~0);
1884 SIBA_SHIFTOUT(stbcpo, SIBA_SPROM8_STBCPO, ~0);
1886 siba_sprom_r458(out, in);
1890 siba_sprom_r123_antgain(uint8_t sprom_revision, const uint16_t *in,
1891 uint16_t mask, uint16_t shift)
1896 v = in[SIBA_OFFSET(SIBA_SPROM1_AGAIN)];
1897 gain = (v & mask) >> shift;
1898 gain = (gain == 0xff) ? 2 : (sprom_revision == 1) ? gain << 2 :
1899 ((gain & 0xc0) >> 6) | ((gain & 0x3f) << 2);
1901 return ((int8_t)gain);
1904 #undef SIBA_LOWEST_SET_BIT
1906 #undef SIBA_SHIFTOUT_SUB
1907 #undef SIBA_SHIFTOUT
1910 siba_powerdown(device_t dev)
1912 struct siba_dev_softc *sd = device_get_ivars(dev);
1913 struct siba_softc *siba = sd->sd_bus;
1915 return (siba_powerdown_sub(siba));
1919 siba_powerdown_sub(struct siba_softc *siba)
1921 struct siba_cc *scc;
1923 if (siba->siba_type == SIBA_TYPE_SSB)
1926 scc = &siba->siba_cc;
1927 if (!scc->scc_dev || scc->scc_dev->sd_id.sd_rev < 5)
1929 siba_cc_clock(scc, SIBA_CLOCK_SLOW);
1930 siba_pci_gpio(siba, SIBA_GPIO_CRYSTAL | SIBA_GPIO_PLL, 0);
1935 siba_pcicore_init(struct siba_pci *spc)
1937 struct siba_dev_softc *sd = spc->spc_dev;
1942 if (!siba_dev_isup_sub(sd))
1943 siba_dev_up_sub(sd, 0);
1945 KASSERT(spc->spc_hostmode == 0,
1946 ("%s:%d: hostmode", __func__, __LINE__));
1947 /* disable PCI interrupt */
1948 siba_write_4_sub(spc->spc_dev, SIBA_INTR_MASK, 0);
1952 siba_dev_isup(device_t dev)
1954 struct siba_dev_softc *sd = device_get_ivars(dev);
1956 return (siba_dev_isup_sub(sd));
1960 siba_dev_isup_sub(struct siba_dev_softc *sd)
1962 uint32_t reject, val;
1964 reject = siba_tmslow_reject_bitmask(sd);
1965 val = siba_read_4_sub(sd, SIBA_TGSLOW);
1966 val &= SIBA_TGSLOW_CLOCK | SIBA_TGSLOW_RESET | reject;
1968 return (val == SIBA_TGSLOW_CLOCK);
1972 siba_dev_up(device_t dev, uint32_t flags)
1974 struct siba_dev_softc *sd = device_get_ivars(dev);
1976 siba_dev_up_sub(sd, flags);
1980 siba_dev_up_sub(struct siba_dev_softc *sd, uint32_t flags)
1984 siba_dev_down_sub(sd, flags);
1985 siba_write_4_sub(sd, SIBA_TGSLOW,
1986 SIBA_TGSLOW_RESET | SIBA_TGSLOW_CLOCK | SIBA_TGSLOW_FGC | flags);
1987 siba_read_4_sub(sd, SIBA_TGSLOW);
1990 if (siba_read_4_sub(sd, SIBA_TGSHIGH) & SIBA_TGSHIGH_SERR)
1991 siba_write_4_sub(sd, SIBA_TGSHIGH, 0);
1993 val = siba_read_4_sub(sd, SIBA_IAS);
1994 if (val & (SIBA_IAS_INBAND_ERR | SIBA_IAS_TIMEOUT)) {
1995 val &= ~(SIBA_IAS_INBAND_ERR | SIBA_IAS_TIMEOUT);
1996 siba_write_4_sub(sd, SIBA_IAS, val);
1999 siba_write_4_sub(sd, SIBA_TGSLOW,
2000 SIBA_TGSLOW_CLOCK | SIBA_TGSLOW_FGC | flags);
2001 siba_read_4_sub(sd, SIBA_TGSLOW);
2004 siba_write_4_sub(sd, SIBA_TGSLOW, SIBA_TGSLOW_CLOCK | flags);
2005 siba_read_4_sub(sd, SIBA_TGSLOW);
2010 siba_tmslow_reject_bitmask(struct siba_dev_softc *sd)
2012 uint32_t rev = siba_read_4_sub(sd, SIBA_IDLOW) & SIBA_IDLOW_SSBREV;
2015 case SIBA_IDLOW_SSBREV_22:
2016 return (SIBA_TGSLOW_REJECT_22);
2017 case SIBA_IDLOW_SSBREV_23:
2018 return (SIBA_TGSLOW_REJECT_23);
2019 case SIBA_IDLOW_SSBREV_24:
2020 case SIBA_IDLOW_SSBREV_25:
2021 case SIBA_IDLOW_SSBREV_26:
2022 case SIBA_IDLOW_SSBREV_27:
2023 return (SIBA_TGSLOW_REJECT_23);
2026 ("%s:%d: unknown backplane rev %#x\n",
2027 __func__, __LINE__, rev));
2029 return (SIBA_TGSLOW_REJECT_22 | SIBA_TGSLOW_REJECT_23);
2033 siba_dev_down(device_t dev, uint32_t flags)
2035 struct siba_dev_softc *sd = device_get_ivars(dev);
2037 siba_dev_down_sub(sd, flags);
2041 siba_dev_down_sub(struct siba_dev_softc *sd, uint32_t flags)
2043 struct siba_softc *siba = sd->sd_bus;
2044 uint32_t reject, val;
2047 if (siba_read_4_sub(sd, SIBA_TGSLOW) & SIBA_TGSLOW_RESET)
2050 reject = siba_tmslow_reject_bitmask(sd);
2051 siba_write_4_sub(sd, SIBA_TGSLOW, reject | SIBA_TGSLOW_CLOCK);
2053 for (i = 0; i < 1000; i++) {
2054 val = siba_read_4_sub(sd, SIBA_TGSLOW);
2059 if ((val & reject) == 0) {
2060 device_printf(siba->siba_dev, "timeout (bit %#x reg %#x)\n",
2061 reject, SIBA_TGSLOW);
2063 for (i = 0; i < 1000; i++) {
2064 val = siba_read_4_sub(sd, SIBA_TGSHIGH);
2065 if (!(val & SIBA_TGSHIGH_BUSY))
2069 if ((val & SIBA_TGSHIGH_BUSY) != 0) {
2070 device_printf(siba->siba_dev, "timeout (bit %#x reg %#x)\n",
2071 SIBA_TGSHIGH_BUSY, SIBA_TGSHIGH);
2074 siba_write_4_sub(sd, SIBA_TGSLOW, SIBA_TGSLOW_FGC | SIBA_TGSLOW_CLOCK |
2075 reject | SIBA_TGSLOW_RESET | flags);
2076 siba_read_4_sub(sd, SIBA_TGSLOW);
2078 siba_write_4_sub(sd, SIBA_TGSLOW, reject | SIBA_TGSLOW_RESET | flags);
2079 siba_read_4_sub(sd, SIBA_TGSLOW);
2084 siba_pcicore_setup(struct siba_pci *spc, struct siba_dev_softc *sd)
2086 struct siba_dev_softc *psd = spc->spc_dev;
2087 struct siba_softc *siba = psd->sd_bus;
2090 if (psd->sd_id.sd_device == SIBA_DEVID_PCI) {
2091 siba_pcicore_write_4(spc, SIBA_PCICORE_SBTOPCI2,
2092 siba_pcicore_read_4(spc, SIBA_PCICORE_SBTOPCI2) |
2093 SIBA_PCICORE_SBTOPCI_PREF | SIBA_PCICORE_SBTOPCI_BURST);
2095 if (psd->sd_id.sd_rev < 5) {
2096 tmp = siba_read_4_sub(psd, SIBA_IMCFGLO);
2097 tmp &= ~SIBA_IMCFGLO_SERTO;
2098 tmp = (tmp | 2) & ~SIBA_IMCFGLO_REQTO;
2099 tmp |= 3 << 4 /* SIBA_IMCFGLO_REQTO_SHIFT */;
2100 siba_write_4_sub(psd, SIBA_IMCFGLO, tmp);
2102 /* broadcast value */
2103 sd = (siba->siba_cc.scc_dev != NULL) ?
2104 siba->siba_cc.scc_dev : siba->siba_pci.spc_dev;
2106 siba_write_4_sub(sd, SIBA_PCICORE_BCAST_ADDR,
2108 siba_read_4_sub(sd, SIBA_PCICORE_BCAST_ADDR);
2109 siba_write_4_sub(sd,
2110 SIBA_PCICORE_BCAST_DATA, 0);
2111 siba_read_4_sub(sd, SIBA_PCICORE_BCAST_DATA);
2113 } else if (psd->sd_id.sd_rev >= 11) {
2114 tmp = siba_pcicore_read_4(spc, SIBA_PCICORE_SBTOPCI2);
2115 tmp |= SIBA_PCICORE_SBTOPCI_MRM;
2116 siba_pcicore_write_4(spc, SIBA_PCICORE_SBTOPCI2, tmp);
2119 KASSERT(psd->sd_id.sd_device == SIBA_DEVID_PCIE, ("only PCIE"));
2120 if ((psd->sd_id.sd_rev == 0) || (psd->sd_id.sd_rev == 1))
2121 siba_pcie_write(spc, 0x4,
2122 siba_pcie_read(spc, 0x4) | 0x8);
2123 if (psd->sd_id.sd_rev == 0) {
2124 siba_pcie_mdio_write(spc, 0x1f, 2, 0x8128); /* Timer */
2125 siba_pcie_mdio_write(spc, 0x1f, 6, 0x0100); /* CDR */
2126 siba_pcie_mdio_write(spc, 0x1f, 7, 0x1466); /* CDR BW */
2127 } else if (psd->sd_id.sd_rev == 1)
2128 siba_pcie_write(spc, 0x100,
2129 siba_pcie_read(spc, 0x100) | 0x40);
2131 spc->spc_inited = 1;
2135 siba_pcicore_intr(device_t dev)
2137 struct siba_dev_softc *sd = device_get_ivars(dev);
2138 struct siba_softc *siba = sd->sd_bus;
2139 struct siba_pci *spc = &siba->siba_pci;
2140 struct siba_dev_softc *psd = spc->spc_dev;
2143 if (siba->siba_type != SIBA_TYPE_PCI || !psd)
2146 KASSERT(siba == psd->sd_bus, ("different pointers"));
2148 /* enable interrupts */
2149 if (siba->siba_dev != NULL &&
2150 (psd->sd_id.sd_rev >= 6 ||
2151 psd->sd_id.sd_device == SIBA_DEVID_PCIE)) {
2152 tmp = pci_read_config(siba->siba_dev, SIBA_IRQMASK, 4);
2153 tmp |= (1 << sd->sd_coreidx) << 8;
2154 pci_write_config(siba->siba_dev, SIBA_IRQMASK, tmp, 4);
2156 tmp = siba_read_4_sub(sd, SIBA_TPS);
2157 tmp &= SIBA_TPS_BPFLAG;
2158 siba_write_4_sub(psd, SIBA_INTR_MASK,
2159 siba_read_4_sub(psd, SIBA_INTR_MASK) | (1 << tmp));
2163 if (spc->spc_inited == 0)
2164 siba_pcicore_setup(spc, sd);
2168 siba_pcicore_read_4(struct siba_pci *spc, uint16_t offset)
2171 return (siba_read_4_sub(spc->spc_dev, offset));
2175 siba_pcicore_write_4(struct siba_pci *spc, uint16_t offset, uint32_t value)
2178 siba_write_4_sub(spc->spc_dev, offset, value);
2182 siba_pcie_read(struct siba_pci *spc, uint32_t address)
2185 siba_pcicore_write_4(spc, 0x130, address);
2186 return (siba_pcicore_read_4(spc, 0x134));
2190 siba_pcie_write(struct siba_pci *spc, uint32_t address, uint32_t data)
2193 siba_pcicore_write_4(spc, 0x130, address);
2194 siba_pcicore_write_4(spc, 0x134, data);
2198 siba_pcie_mdio_write(struct siba_pci *spc, uint8_t device, uint8_t address,
2203 siba_pcicore_write_4(spc, SIBA_PCICORE_MDIO_CTL, 0x80 | 0x2);
2204 siba_pcicore_write_4(spc, SIBA_PCICORE_MDIO_DATA,
2205 (1 << 30) | (1 << 28) |
2206 ((uint32_t)device << 22) | ((uint32_t)address << 18) |
2209 for (i = 0; i < 10; i++) {
2210 if (siba_pcicore_read_4(spc, SIBA_PCICORE_MDIO_CTL) & 0x100)
2214 siba_pcicore_write_4(spc, SIBA_PCICORE_MDIO_CTL, 0);
2218 siba_dma_translation(device_t dev)
2221 struct siba_dev_softc *sd = device_get_ivars(dev);
2222 struct siba_softc *siba = sd->sd_bus;
2224 KASSERT(siba->siba_type == SIBA_TYPE_PCI,
2225 ("unsupported bustype %d\n", siba->siba_type));
2229 return (SIBA_PCI_DMA);
2233 siba_barrier(device_t dev, int flags)
2235 struct siba_dev_softc *sd = device_get_ivars(dev);
2236 struct siba_softc *siba = sd->sd_bus;
2238 SIBA_BARRIER(siba, flags);
2242 siba_cc_suspend(struct siba_cc *scc)
2245 siba_cc_clock(scc, SIBA_CLOCK_SLOW);
2249 siba_cc_resume(struct siba_cc *scc)
2252 siba_cc_power_init(scc);
2253 siba_cc_clock(scc, SIBA_CLOCK_FAST);
2257 siba_core_suspend(struct siba_softc *siba)
2260 siba_cc_suspend(&siba->siba_cc);
2261 siba_pci_gpio(siba, SIBA_GPIO_CRYSTAL | SIBA_GPIO_PLL, 0);
2266 siba_core_resume(struct siba_softc *siba)
2269 siba->siba_pci.spc_inited = 0;
2270 siba->siba_curdev = NULL;
2272 siba_powerup_sub(siba, 0);
2273 /* XXX setup H/W for PCMCIA??? */
2274 siba_cc_resume(&siba->siba_cc);
2275 siba_powerdown_sub(siba);
2281 siba_cc_regctl_setmask(struct siba_cc *cc, uint32_t offset, uint32_t mask,
2285 SIBA_CC_READ32(cc, SIBA_CC_REGCTL_ADDR);
2286 SIBA_CC_WRITE32(cc, SIBA_CC_REGCTL_ADDR, offset);
2287 SIBA_CC_READ32(cc, SIBA_CC_REGCTL_ADDR);
2288 SIBA_CC_WRITE32(cc, SIBA_CC_REGCTL_DATA,
2289 (SIBA_CC_READ32(cc, SIBA_CC_REGCTL_DATA) & mask) | set);
2290 SIBA_CC_READ32(cc, SIBA_CC_REGCTL_DATA);
2294 siba_cc_pmu_set_ldovolt(device_t dev, int id, uint32_t volt)
2296 struct siba_dev_softc *sd = device_get_ivars(dev);
2297 struct siba_softc *siba = sd->sd_bus;
2298 struct siba_cc *scc = &siba->siba_cc;
2299 uint32_t *p = NULL, info[5][3] = {
2307 if (siba->siba_chipid == 0x4312) {
2308 if (id != SIBA_LDO_PAREF)
2311 siba_cc_regctl_setmask(scc, p[0], ~(p[2] << p[1]),
2312 (volt & p[2]) << p[1]);
2315 if (siba->siba_chipid == 0x4328 || siba->siba_chipid == 0x5354) {
2317 case SIBA_LDO_PAREF:
2320 case SIBA_LDO_VOLT1:
2323 case SIBA_LDO_VOLT2:
2326 case SIBA_LDO_VOLT3:
2331 ("%s: unsupported voltage ID %#x", __func__, id));
2334 siba_cc_regctl_setmask(scc, p[0], ~(p[2] << p[1]),
2335 (volt & p[2]) << p[1]);
2340 siba_cc_pmu_set_ldoparef(device_t dev, uint8_t on)
2342 struct siba_dev_softc *sd = device_get_ivars(dev);
2343 struct siba_softc *siba = sd->sd_bus;
2344 struct siba_cc *scc = &siba->siba_cc;
2347 ldo = ((siba->siba_chipid == 0x4312) ? SIBA_CC_PMU_4312_PA_REF :
2348 ((siba->siba_chipid == 0x4328) ? SIBA_CC_PMU_4328_PA_REF :
2349 ((siba->siba_chipid == 0x5354) ? SIBA_CC_PMU_5354_PA_REF : -1)));
2354 SIBA_CC_SET32(scc, SIBA_CC_PMU_MINRES, 1 << ldo);
2356 SIBA_CC_MASK32(scc, SIBA_CC_PMU_MINRES, ~(1 << ldo));
2357 SIBA_CC_READ32(scc, SIBA_CC_PMU_MINRES);
2361 siba_read_sprom(device_t dev, device_t child, int which, uintptr_t *result)
2363 struct siba_dev_softc *sd = device_get_ivars(child);
2364 struct siba_softc *siba = sd->sd_bus;
2367 case SIBA_SPROMVAR_REV:
2368 *result = siba->siba_sprom.rev;
2370 case SIBA_SPROMVAR_MAC_80211BG:
2371 *((uint8_t **) result) = siba->siba_sprom.mac_80211bg;
2373 case SIBA_SPROMVAR_MAC_ETH:
2374 *((uint8_t **) result) = siba->siba_sprom.mac_eth;
2376 case SIBA_SPROMVAR_MAC_80211A:
2377 *((uint8_t **) result) = siba->siba_sprom.mac_80211a;
2379 case SIBA_SPROMVAR_MII_ETH0:
2380 *result = siba->siba_sprom.mii_eth0;
2382 case SIBA_SPROMVAR_MII_ETH1:
2383 *result = siba->siba_sprom.mii_eth1;
2385 case SIBA_SPROMVAR_MDIO_ETH0:
2386 *result = siba->siba_sprom.mdio_eth0;
2388 case SIBA_SPROMVAR_MDIO_ETH1:
2389 *result = siba->siba_sprom.mdio_eth1;
2391 case SIBA_SPROMVAR_BREV:
2392 *result = siba->siba_sprom.brev;
2394 case SIBA_SPROMVAR_CCODE:
2395 *result = siba->siba_sprom.ccode;
2397 case SIBA_SPROMVAR_ANT_A:
2398 *result = siba->siba_sprom.ant_a;
2400 case SIBA_SPROMVAR_ANT_BG:
2401 *result = siba->siba_sprom.ant_bg;
2403 case SIBA_SPROMVAR_PA0B0:
2404 *result = siba->siba_sprom.pa0b0;
2406 case SIBA_SPROMVAR_PA0B1:
2407 *result = siba->siba_sprom.pa0b1;
2409 case SIBA_SPROMVAR_PA0B2:
2410 *result = siba->siba_sprom.pa0b2;
2412 case SIBA_SPROMVAR_PA1B0:
2413 *result = siba->siba_sprom.pa1b0;
2415 case SIBA_SPROMVAR_PA1B1:
2416 *result = siba->siba_sprom.pa1b1;
2418 case SIBA_SPROMVAR_PA1B2:
2419 *result = siba->siba_sprom.pa1b2;
2421 case SIBA_SPROMVAR_PA1LOB0:
2422 *result = siba->siba_sprom.pa1lob0;
2424 case SIBA_SPROMVAR_PA1LOB1:
2425 *result = siba->siba_sprom.pa1lob1;
2427 case SIBA_SPROMVAR_PA1LOB2:
2428 *result = siba->siba_sprom.pa1lob2;
2430 case SIBA_SPROMVAR_PA1HIB0:
2431 *result = siba->siba_sprom.pa1hib0;
2433 case SIBA_SPROMVAR_PA1HIB1:
2434 *result = siba->siba_sprom.pa1hib1;
2436 case SIBA_SPROMVAR_PA1HIB2:
2437 *result = siba->siba_sprom.pa1hib2;
2439 case SIBA_SPROMVAR_GPIO0:
2440 *result = siba->siba_sprom.gpio0;
2442 case SIBA_SPROMVAR_GPIO1:
2443 *result = siba->siba_sprom.gpio1;
2445 case SIBA_SPROMVAR_GPIO2:
2446 *result = siba->siba_sprom.gpio2;
2448 case SIBA_SPROMVAR_GPIO3:
2449 *result = siba->siba_sprom.gpio3;
2451 case SIBA_SPROMVAR_MAXPWR_AL:
2452 *result = siba->siba_sprom.maxpwr_al;
2454 case SIBA_SPROMVAR_MAXPWR_A:
2455 *result = siba->siba_sprom.maxpwr_a;
2457 case SIBA_SPROMVAR_MAXPWR_AH:
2458 *result = siba->siba_sprom.maxpwr_ah;
2460 case SIBA_SPROMVAR_MAXPWR_BG:
2461 *result = siba->siba_sprom.maxpwr_bg;
2463 case SIBA_SPROMVAR_RXPO2G:
2464 *result = siba->siba_sprom.rxpo2g;
2466 case SIBA_SPROMVAR_RXPO5G:
2467 *result = siba->siba_sprom.rxpo5g;
2469 case SIBA_SPROMVAR_TSSI_A:
2470 *result = siba->siba_sprom.tssi_a;
2472 case SIBA_SPROMVAR_TSSI_BG:
2473 *result = siba->siba_sprom.tssi_bg;
2475 case SIBA_SPROMVAR_TRI2G:
2476 *result = siba->siba_sprom.tri2g;
2478 case SIBA_SPROMVAR_TRI5GL:
2479 *result = siba->siba_sprom.tri5gl;
2481 case SIBA_SPROMVAR_TRI5G:
2482 *result = siba->siba_sprom.tri5g;
2484 case SIBA_SPROMVAR_TRI5GH:
2485 *result = siba->siba_sprom.tri5gh;
2487 case SIBA_SPROMVAR_RSSISAV2G:
2488 *result = siba->siba_sprom.rssisav2g;
2490 case SIBA_SPROMVAR_RSSISMC2G:
2491 *result = siba->siba_sprom.rssismc2g;
2493 case SIBA_SPROMVAR_RSSISMF2G:
2494 *result = siba->siba_sprom.rssismf2g;
2496 case SIBA_SPROMVAR_BXA2G:
2497 *result = siba->siba_sprom.bxa2g;
2499 case SIBA_SPROMVAR_RSSISAV5G:
2500 *result = siba->siba_sprom.rssisav5g;
2502 case SIBA_SPROMVAR_RSSISMC5G:
2503 *result = siba->siba_sprom.rssismc5g;
2505 case SIBA_SPROMVAR_RSSISMF5G:
2506 *result = siba->siba_sprom.rssismf5g;
2508 case SIBA_SPROMVAR_BXA5G:
2509 *result = siba->siba_sprom.bxa5g;
2511 case SIBA_SPROMVAR_CCK2GPO:
2512 *result = siba->siba_sprom.cck2gpo;
2514 case SIBA_SPROMVAR_OFDM2GPO:
2515 *result = siba->siba_sprom.ofdm2gpo;
2517 case SIBA_SPROMVAR_OFDM5GLPO:
2518 *result = siba->siba_sprom.ofdm5glpo;
2520 case SIBA_SPROMVAR_OFDM5GPO:
2521 *result = siba->siba_sprom.ofdm5gpo;
2523 case SIBA_SPROMVAR_OFDM5GHPO:
2524 *result = siba->siba_sprom.ofdm5ghpo;
2526 case SIBA_SPROMVAR_BF_LO:
2527 *result = siba->siba_sprom.bf_lo;
2529 case SIBA_SPROMVAR_BF_HI:
2530 *result = siba->siba_sprom.bf_hi;
2532 case SIBA_SPROMVAR_BF2_LO:
2533 *result = siba->siba_sprom.bf2_lo;
2535 case SIBA_SPROMVAR_BF2_HI:
2536 *result = siba->siba_sprom.bf2_hi;
2538 case SIBA_SPROMVAR_FEM_2GHZ_TSSIPOS:
2539 *result = siba->siba_sprom.fem.ghz2.tssipos;
2541 case SIBA_SPROMVAR_FEM_2GHZ_EXTPAGAIN:
2542 *result = siba->siba_sprom.fem.ghz2.extpa_gain;
2544 case SIBA_SPROMVAR_FEM_2GHZ_PDET_RANGE:
2545 *result = siba->siba_sprom.fem.ghz2.pdet_range;
2547 case SIBA_SPROMVAR_FEM_2GHZ_TR_ISO:
2548 *result = siba->siba_sprom.fem.ghz2.tr_iso;
2550 case SIBA_SPROMVAR_FEM_2GHZ_ANTSWLUT:
2551 *result = siba->siba_sprom.fem.ghz2.antswlut;
2553 case SIBA_SPROMVAR_FEM_5GHZ_TSSIPOS:
2554 *result = siba->siba_sprom.fem.ghz5.tssipos;
2556 case SIBA_SPROMVAR_FEM_5GHZ_EXTPAGAIN:
2557 *result = siba->siba_sprom.fem.ghz5.extpa_gain;
2559 case SIBA_SPROMVAR_FEM_5GHZ_PDET_RANGE:
2560 *result = siba->siba_sprom.fem.ghz5.pdet_range;
2562 case SIBA_SPROMVAR_FEM_5GHZ_TR_ISO:
2563 *result = siba->siba_sprom.fem.ghz5.tr_iso;
2565 case SIBA_SPROMVAR_FEM_5GHZ_ANTSWLUT:
2566 *result = siba->siba_sprom.fem.ghz5.antswlut;
2568 case SIBA_SPROMVAR_TXPID_2G_0:
2569 *result = siba->siba_sprom.txpid2g[0];
2571 case SIBA_SPROMVAR_TXPID_2G_1:
2572 *result = siba->siba_sprom.txpid2g[1];
2574 case SIBA_SPROMVAR_TXPID_2G_2:
2575 *result = siba->siba_sprom.txpid2g[2];
2577 case SIBA_SPROMVAR_TXPID_2G_3:
2578 *result = siba->siba_sprom.txpid2g[3];
2580 case SIBA_SPROMVAR_TXPID_5GL_0:
2581 *result = siba->siba_sprom.txpid5gl[0];
2583 case SIBA_SPROMVAR_TXPID_5GL_1:
2584 *result = siba->siba_sprom.txpid5gl[1];
2586 case SIBA_SPROMVAR_TXPID_5GL_2:
2587 *result = siba->siba_sprom.txpid5gl[2];
2589 case SIBA_SPROMVAR_TXPID_5GL_3:
2590 *result = siba->siba_sprom.txpid5gl[3];
2592 case SIBA_SPROMVAR_TXPID_5G_0:
2593 *result = siba->siba_sprom.txpid5g[0];
2595 case SIBA_SPROMVAR_TXPID_5G_1:
2596 *result = siba->siba_sprom.txpid5g[1];
2598 case SIBA_SPROMVAR_TXPID_5G_2:
2599 *result = siba->siba_sprom.txpid5g[2];
2601 case SIBA_SPROMVAR_TXPID_5G_3:
2602 *result = siba->siba_sprom.txpid5g[3];
2604 case SIBA_SPROMVAR_TXPID_5GH_0:
2605 *result = siba->siba_sprom.txpid5gh[0];
2607 case SIBA_SPROMVAR_TXPID_5GH_1:
2608 *result = siba->siba_sprom.txpid5gh[1];
2610 case SIBA_SPROMVAR_TXPID_5GH_2:
2611 *result = siba->siba_sprom.txpid5gh[2];
2613 case SIBA_SPROMVAR_TXPID_5GH_3:
2614 *result = siba->siba_sprom.txpid5gh[3];
2616 case SIBA_SPROMVAR_STBCPO:
2617 *result = siba->siba_sprom.stbcpo;
2619 case SIBA_SPROMVAR_CDDPO:
2620 *result = siba->siba_sprom.cddpo;
2629 siba_write_sprom(device_t dev, device_t child, int which, uintptr_t value)
2631 struct siba_dev_softc *sd = device_get_ivars(child);
2632 struct siba_softc *siba = sd->sd_bus;
2635 case SIBA_SPROMVAR_REV:
2636 siba->siba_sprom.rev = value;
2638 case SIBA_SPROMVAR_MII_ETH0:
2639 siba->siba_sprom.mii_eth0 = value;
2641 case SIBA_SPROMVAR_MII_ETH1:
2642 siba->siba_sprom.mii_eth1 = value;
2644 case SIBA_SPROMVAR_MDIO_ETH0:
2645 siba->siba_sprom.mdio_eth0 = value;
2647 case SIBA_SPROMVAR_MDIO_ETH1:
2648 siba->siba_sprom.mdio_eth1 = value;
2650 case SIBA_SPROMVAR_BREV:
2651 siba->siba_sprom.brev = value;
2653 case SIBA_SPROMVAR_CCODE:
2654 siba->siba_sprom.ccode = value;
2656 case SIBA_SPROMVAR_ANT_A:
2657 siba->siba_sprom.ant_a = value;
2659 case SIBA_SPROMVAR_ANT_BG:
2660 siba->siba_sprom.ant_bg = value;
2662 case SIBA_SPROMVAR_PA0B0:
2663 siba->siba_sprom.pa0b0 = value;
2665 case SIBA_SPROMVAR_PA0B1:
2666 siba->siba_sprom.pa0b1 = value;
2668 case SIBA_SPROMVAR_PA0B2:
2669 siba->siba_sprom.pa0b2 = value;
2671 case SIBA_SPROMVAR_PA1B0:
2672 siba->siba_sprom.pa1b0 = value;
2674 case SIBA_SPROMVAR_PA1B1:
2675 siba->siba_sprom.pa1b1 = value;
2677 case SIBA_SPROMVAR_PA1B2:
2678 siba->siba_sprom.pa1b2 = value;
2680 case SIBA_SPROMVAR_PA1LOB0:
2681 siba->siba_sprom.pa1lob0 = value;
2683 case SIBA_SPROMVAR_PA1LOB1:
2684 siba->siba_sprom.pa1lob1 = value;
2686 case SIBA_SPROMVAR_PA1LOB2:
2687 siba->siba_sprom.pa1lob2 = value;
2689 case SIBA_SPROMVAR_PA1HIB0:
2690 siba->siba_sprom.pa1hib0 = value;
2692 case SIBA_SPROMVAR_PA1HIB1:
2693 siba->siba_sprom.pa1hib1 = value;
2695 case SIBA_SPROMVAR_PA1HIB2:
2696 siba->siba_sprom.pa1hib2 = value;
2698 case SIBA_SPROMVAR_GPIO0:
2699 siba->siba_sprom.gpio0 = value;
2701 case SIBA_SPROMVAR_GPIO1:
2702 siba->siba_sprom.gpio1 = value;
2704 case SIBA_SPROMVAR_GPIO2:
2705 siba->siba_sprom.gpio2 = value;
2707 case SIBA_SPROMVAR_GPIO3:
2708 siba->siba_sprom.gpio3 = value;
2710 case SIBA_SPROMVAR_MAXPWR_AL:
2711 siba->siba_sprom.maxpwr_al = value;
2713 case SIBA_SPROMVAR_MAXPWR_A:
2714 siba->siba_sprom.maxpwr_a = value;
2716 case SIBA_SPROMVAR_MAXPWR_AH:
2717 siba->siba_sprom.maxpwr_ah = value;
2719 case SIBA_SPROMVAR_MAXPWR_BG:
2720 siba->siba_sprom.maxpwr_bg = value;
2722 case SIBA_SPROMVAR_RXPO2G:
2723 siba->siba_sprom.rxpo2g = value;
2725 case SIBA_SPROMVAR_RXPO5G:
2726 siba->siba_sprom.rxpo5g = value;
2728 case SIBA_SPROMVAR_TSSI_A:
2729 siba->siba_sprom.tssi_a = value;
2731 case SIBA_SPROMVAR_TSSI_BG:
2732 siba->siba_sprom.tssi_bg = value;
2734 case SIBA_SPROMVAR_TRI2G:
2735 siba->siba_sprom.tri2g = value;
2737 case SIBA_SPROMVAR_TRI5GL:
2738 siba->siba_sprom.tri5gl = value;
2740 case SIBA_SPROMVAR_TRI5G:
2741 siba->siba_sprom.tri5g = value;
2743 case SIBA_SPROMVAR_TRI5GH:
2744 siba->siba_sprom.tri5gh = value;
2746 case SIBA_SPROMVAR_RSSISAV2G:
2747 siba->siba_sprom.rssisav2g = value;
2749 case SIBA_SPROMVAR_RSSISMC2G:
2750 siba->siba_sprom.rssismc2g = value;
2752 case SIBA_SPROMVAR_RSSISMF2G:
2753 siba->siba_sprom.rssismf2g = value;
2755 case SIBA_SPROMVAR_BXA2G:
2756 siba->siba_sprom.bxa2g = value;
2758 case SIBA_SPROMVAR_RSSISAV5G:
2759 siba->siba_sprom.rssisav5g = value;
2761 case SIBA_SPROMVAR_RSSISMC5G:
2762 siba->siba_sprom.rssismc5g = value;
2764 case SIBA_SPROMVAR_RSSISMF5G:
2765 siba->siba_sprom.rssismf5g = value;
2767 case SIBA_SPROMVAR_BXA5G:
2768 siba->siba_sprom.bxa5g = value;
2770 case SIBA_SPROMVAR_CCK2GPO:
2771 siba->siba_sprom.cck2gpo = value;
2773 case SIBA_SPROMVAR_OFDM2GPO:
2774 siba->siba_sprom.ofdm2gpo = value;
2776 case SIBA_SPROMVAR_OFDM5GLPO:
2777 siba->siba_sprom.ofdm5glpo = value;
2779 case SIBA_SPROMVAR_OFDM5GPO:
2780 siba->siba_sprom.ofdm5gpo = value;
2782 case SIBA_SPROMVAR_OFDM5GHPO:
2783 siba->siba_sprom.ofdm5ghpo = value;
2785 case SIBA_SPROMVAR_BF_LO:
2786 siba->siba_sprom.bf_lo = value;
2788 case SIBA_SPROMVAR_BF_HI:
2789 siba->siba_sprom.bf_hi = value;
2791 case SIBA_SPROMVAR_BF2_LO:
2792 siba->siba_sprom.bf2_lo = value;
2794 case SIBA_SPROMVAR_BF2_HI:
2795 siba->siba_sprom.bf2_hi = value;
2803 #define SIBA_GPIOCTL 0x06c
2806 siba_gpio_get(device_t dev)
2808 struct siba_dev_softc *sd = device_get_ivars(dev);
2809 struct siba_softc *siba = sd->sd_bus;
2810 struct siba_dev_softc *gpiodev, *pcidev = NULL;
2812 pcidev = siba->siba_pci.spc_dev;
2813 gpiodev = siba->siba_cc.scc_dev ? siba->siba_cc.scc_dev : pcidev;
2816 return (siba_read_4_sub(gpiodev, SIBA_GPIOCTL));
2820 siba_gpio_set(device_t dev, uint32_t value)
2822 struct siba_dev_softc *sd = device_get_ivars(dev);
2823 struct siba_softc *siba = sd->sd_bus;
2824 struct siba_dev_softc *gpiodev, *pcidev = NULL;
2826 pcidev = siba->siba_pci.spc_dev;
2827 gpiodev = siba->siba_cc.scc_dev ? siba->siba_cc.scc_dev : pcidev;
2830 siba_write_4_sub(gpiodev, SIBA_GPIOCTL, value);
2834 siba_fix_imcfglobug(device_t dev)
2836 struct siba_dev_softc *sd = device_get_ivars(dev);
2837 struct siba_softc *siba = sd->sd_bus;
2840 if (siba->siba_pci.spc_dev == NULL)
2842 if (siba->siba_pci.spc_dev->sd_id.sd_device != SIBA_DEVID_PCI ||
2843 siba->siba_pci.spc_dev->sd_id.sd_rev > 5)
2846 tmp = siba_read_4_sub(sd, SIBA_IMCFGLO) &
2847 ~(SIBA_IMCFGLO_REQTO | SIBA_IMCFGLO_SERTO);
2848 switch (siba->siba_type) {
2850 case SIBA_TYPE_PCMCIA:
2857 siba_write_4_sub(sd, SIBA_IMCFGLO, tmp);
2861 siba_sprom_get_core_power_info(device_t dev, int core,
2862 struct siba_sprom_core_pwr_info *c)
2864 struct siba_dev_softc *sd = device_get_ivars(dev);
2865 struct siba_softc *siba = sd->sd_bus;
2867 if (core < 0 || core > 3) {
2870 memcpy(c, &siba->siba_sprom.core_pwr_info[core], sizeof(*c));
2875 siba_sprom_get_mcs2gpo(device_t dev, uint16_t *c)
2877 struct siba_dev_softc *sd = device_get_ivars(dev);
2878 struct siba_softc *siba = sd->sd_bus;
2880 memcpy(c, &siba->siba_sprom.mcs2gpo, sizeof(uint16_t) * 8);
2885 siba_sprom_get_mcs5glpo(device_t dev, uint16_t *c)
2887 struct siba_dev_softc *sd = device_get_ivars(dev);
2888 struct siba_softc *siba = sd->sd_bus;
2890 memcpy(c, &siba->siba_sprom.mcs5glpo, sizeof(uint16_t) * 8);
2895 siba_sprom_get_mcs5gpo(device_t dev, uint16_t *c)
2897 struct siba_dev_softc *sd = device_get_ivars(dev);
2898 struct siba_softc *siba = sd->sd_bus;
2900 memcpy(c, &siba->siba_sprom.mcs5gpo, sizeof(uint16_t) * 8);
2905 siba_sprom_get_mcs5ghpo(device_t dev, uint16_t *c)
2907 struct siba_dev_softc *sd = device_get_ivars(dev);
2908 struct siba_softc *siba = sd->sd_bus;
2910 memcpy(c, &siba->siba_sprom.mcs5ghpo, sizeof(uint16_t) * 8);
2915 siba_pmu_spuravoid_pllupdate(device_t dev, int spur_avoid)
2917 struct siba_dev_softc *sd = device_get_ivars(dev);
2918 struct siba_softc *siba = sd->sd_bus;
2919 struct siba_cc *scc;
2921 scc = &siba->siba_cc;
2923 if (scc->scc_dev == NULL) {
2924 device_printf(dev, "%s: called; no pmu\n", __func__);
2928 switch (siba_get_chipid(dev)) {
2930 siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL0, 0x11100070);
2931 siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL1, 0x1014140a);
2932 siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL5, 0x88888854);
2933 if (spur_avoid == 1)
2934 siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL2, 0x05201828);
2936 siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL2, 0x05001828);
2939 if (spur_avoid == 1) {
2940 siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL0, 0x11500008);
2941 siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL1, 0x0C000C06);
2942 siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL2, 0x0F600a08);
2943 siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL3, 0x00000000);
2944 siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL4, 0x2001E920);
2945 siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL5, 0x88888815);
2947 siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL0, 0x11100008);
2948 siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL1, 0x0c000c06);
2949 siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL2, 0x03000a08);
2950 siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL3, 0x00000000);
2951 siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL4, 0x200005c0);
2952 siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL5, 0x88888855);
2957 "%s: unknown spur avoidance settings for chip 0x%04x\n",
2959 siba_get_chipid(dev));
2963 /* Both chips above use the same update */
2964 SIBA_CC_SET32(scc, SIBA_CC_PMUCTL, SIBA_CC_PMUCTL_PLL_UPD);
2968 siba_cc_set32(device_t dev, uint32_t reg, uint32_t val)
2970 struct siba_dev_softc *sd = device_get_ivars(dev);
2971 struct siba_softc *siba = sd->sd_bus;
2972 struct siba_cc *scc;
2974 scc = &siba->siba_cc;
2976 if (scc->scc_dev == NULL) {
2977 device_printf(dev, "%s: called; no pmu\n", __func__);
2981 SIBA_CC_SET32(scc, reg, val);
2985 siba_cc_mask32(device_t dev, uint32_t reg, uint32_t mask)
2987 struct siba_dev_softc *sd = device_get_ivars(dev);
2988 struct siba_softc *siba = sd->sd_bus;
2989 struct siba_cc *scc;
2991 scc = &siba->siba_cc;
2993 if (scc->scc_dev == NULL) {
2994 device_printf(dev, "%s: called; no pmu\n", __func__);
2998 SIBA_CC_MASK32(scc, reg, mask);
3002 siba_cc_read32(device_t dev, uint32_t reg)
3004 struct siba_dev_softc *sd = device_get_ivars(dev);
3005 struct siba_softc *siba = sd->sd_bus;
3006 struct siba_cc *scc;
3008 scc = &siba->siba_cc;
3010 if (scc->scc_dev == NULL) {
3011 device_printf(dev, "%s: called; no pmu\n", __func__);
3015 return SIBA_CC_READ32(scc, reg);
3019 siba_cc_write32(device_t dev, uint32_t reg, uint32_t val)
3021 struct siba_dev_softc *sd = device_get_ivars(dev);
3022 struct siba_softc *siba = sd->sd_bus;
3023 struct siba_cc *scc;
3025 scc = &siba->siba_cc;
3027 if (scc->scc_dev == NULL) {
3028 device_printf(dev, "%s: called; no pmu\n", __func__);
3032 SIBA_CC_WRITE32(scc, reg, val);