xref: /dragonfly/sys/dev/netif/bwn/siba/siba_core.c (revision df052c2a)
1cab56aceSImre Vadasz /*-
2cab56aceSImre Vadasz  * Copyright (c) 2009-2010 Weongyo Jeong <weongyo@freebsd.org>
3cab56aceSImre Vadasz  * All rights reserved.
4cab56aceSImre Vadasz  *
5cab56aceSImre Vadasz  * Redistribution and use in source and binary forms, with or without
6cab56aceSImre Vadasz  * modification, are permitted provided that the following conditions
7cab56aceSImre Vadasz  * are met:
8cab56aceSImre Vadasz  * 1. Redistributions of source code must retain the above copyright
9cab56aceSImre Vadasz  *    notice, this list of conditions and the following disclaimer,
10cab56aceSImre Vadasz  *    without modification.
11cab56aceSImre Vadasz  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
12cab56aceSImre Vadasz  *    similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
13cab56aceSImre Vadasz  *    redistribution must be conditioned upon including a substantially
14cab56aceSImre Vadasz  *    similar Disclaimer requirement for further binary redistribution.
15cab56aceSImre Vadasz  *
16cab56aceSImre Vadasz  * NO WARRANTY
17cab56aceSImre Vadasz  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18cab56aceSImre Vadasz  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19*df052c2aSSascha Wildner  * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTABILITY
20cab56aceSImre Vadasz  * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
21cab56aceSImre Vadasz  * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
22cab56aceSImre Vadasz  * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23cab56aceSImre Vadasz  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24cab56aceSImre Vadasz  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25cab56aceSImre Vadasz  * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26cab56aceSImre Vadasz  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
27cab56aceSImre Vadasz  * THE POSSIBILITY OF SUCH DAMAGES.
28cab56aceSImre Vadasz  */
29cab56aceSImre Vadasz 
30cab56aceSImre Vadasz #include <sys/cdefs.h>
317872accfSImre Vadász __FBSDID("$FreeBSD: head/sys/dev/siba/siba_core.c 299541 2016-05-12 16:14:16Z adrian $");
32cab56aceSImre Vadasz 
33cab56aceSImre Vadasz /*
34cab56aceSImre Vadasz  * the Sonics Silicon Backplane driver.
35cab56aceSImre Vadasz  */
36cab56aceSImre Vadasz 
37a0ab8429SImre Vadasz #include "opt_siba.h"
38a0ab8429SImre Vadasz 
39cab56aceSImre Vadasz #include <sys/param.h>
40cab56aceSImre Vadasz #include <sys/systm.h>
41cab56aceSImre Vadasz #include <sys/malloc.h>
42cab56aceSImre Vadasz #include <sys/module.h>
43cab56aceSImre Vadasz #include <sys/kernel.h>
44cab56aceSImre Vadasz #include <sys/endian.h>
45cab56aceSImre Vadasz #include <sys/errno.h>
467872accfSImre Vadász #include <sys/lock.h>
477872accfSImre Vadász #if !defined(__DragonFly__)
487872accfSImre Vadász #include <machine/bus.h>
497872accfSImre Vadász #include <machine/resource.h>
507872accfSImre Vadász #endif
51cab56aceSImre Vadasz #include <sys/bus.h>
52cab56aceSImre Vadasz #include <sys/rman.h>
53cab56aceSImre Vadasz #include <sys/socket.h>
54cab56aceSImre Vadasz 
557872accfSImre Vadász #include <net/if.h>
567872accfSImre Vadász #include <net/if_media.h>
577872accfSImre Vadász #include <net/if_arp.h>
587872accfSImre Vadász 
597872accfSImre Vadász #if defined(__DragonFly__)
60a0ab8429SImre Vadasz #include <bus/pci/pcivar.h>
61a0ab8429SImre Vadasz #include <bus/pci/pcireg.h>
627872accfSImre Vadász #else
637872accfSImre Vadász #include <dev/pci/pcivar.h>
647872accfSImre Vadász #include <dev/pci/pcireg.h>
657872accfSImre Vadász #endif
66cab56aceSImre Vadasz 
677872accfSImre Vadász #if defined(__DragonFly__)
68296bc678SImre Vadasz #include "siba_ids.h"
69296bc678SImre Vadasz #include "sibareg.h"
70296bc678SImre Vadasz #include "sibavar.h"
717872accfSImre Vadász #else
727872accfSImre Vadász #include <dev/siba/siba_ids.h>
737872accfSImre Vadász #include <dev/siba/sibareg.h>
747872accfSImre Vadász #include <dev/siba/sibavar.h>
757872accfSImre Vadász #endif
76cab56aceSImre Vadasz 
77cab56aceSImre Vadasz enum {
78cab56aceSImre Vadasz 	SIBA_DEBUG_SCAN		= 0x00000001,	/* scan */
79cab56aceSImre Vadasz 	SIBA_DEBUG_PMU		= 0x00000002,	/* PMU */
80cab56aceSImre Vadasz 	SIBA_DEBUG_PLL		= 0x00000004,	/* PLL */
81cab56aceSImre Vadasz 	SIBA_DEBUG_SWITCHCORE	= 0x00000008,	/* switching core */
82cab56aceSImre Vadasz 	SIBA_DEBUG_SPROM	= 0x00000010,	/* SPROM */
83cab56aceSImre Vadasz 	SIBA_DEBUG_CORE		= 0x00000020,	/* handling cores */
84cab56aceSImre Vadasz 	SIBA_DEBUG_ANY		= 0xffffffff
85cab56aceSImre Vadasz };
8636537afdSadrian 
8736537afdSadrian #ifdef SIBA_DEBUG
8836537afdSadrian #define DPRINTF(siba, m,  ...) do {				\
897872accfSImre Vadász 	if (siba->siba_debug & (m))				\
9036537afdSadrian 		device_printf(siba->siba_dev, __VA_ARGS__);	\
91cab56aceSImre Vadasz } while (0)
92cab56aceSImre Vadasz #else
9336537afdSadrian #define DPRINTF(siba, m, ...) do { (void) siba; } while (0)
94cab56aceSImre Vadasz #endif
95cab56aceSImre Vadasz 
96cab56aceSImre Vadasz static void	siba_pci_gpio(struct siba_softc *, uint32_t, int);
97cab56aceSImre Vadasz static void	siba_scan(struct siba_softc *);
98cab56aceSImre Vadasz static int	siba_switchcore(struct siba_softc *, uint8_t);
99cab56aceSImre Vadasz static int	siba_pci_switchcore_sub(struct siba_softc *, uint8_t);
100cab56aceSImre Vadasz static uint32_t	siba_scan_read_4(struct siba_softc *, uint8_t, uint16_t);
101cab56aceSImre Vadasz static uint16_t	siba_dev2chipid(struct siba_softc *);
102cab56aceSImre Vadasz static uint16_t	siba_pci_read_2(struct siba_dev_softc *, uint16_t);
103cab56aceSImre Vadasz static uint32_t	siba_pci_read_4(struct siba_dev_softc *, uint16_t);
104cab56aceSImre Vadasz static void	siba_pci_write_2(struct siba_dev_softc *, uint16_t, uint16_t);
105cab56aceSImre Vadasz static void	siba_pci_write_4(struct siba_dev_softc *, uint16_t, uint32_t);
106cab56aceSImre Vadasz static void	siba_cc_clock(struct siba_cc *,
107cab56aceSImre Vadasz 		    enum siba_clock);
108cab56aceSImre Vadasz static void	siba_cc_pmu_init(struct siba_cc *);
109cab56aceSImre Vadasz static void	siba_cc_power_init(struct siba_cc *);
110cab56aceSImre Vadasz static void	siba_cc_powerup_delay(struct siba_cc *);
111cab56aceSImre Vadasz static int	siba_cc_clockfreq(struct siba_cc *, int);
112cab56aceSImre Vadasz static void	siba_cc_pmu1_pll0_init(struct siba_cc *, uint32_t);
113cab56aceSImre Vadasz static void	siba_cc_pmu0_pll0_init(struct siba_cc *, uint32_t);
114cab56aceSImre Vadasz static enum siba_clksrc siba_cc_clksrc(struct siba_cc *);
115cab56aceSImre Vadasz static const struct siba_cc_pmu1_plltab *siba_cc_pmu1_plltab_find(uint32_t);
116cab56aceSImre Vadasz static uint32_t	siba_cc_pll_read(struct siba_cc *, uint32_t);
117cab56aceSImre Vadasz static void	siba_cc_pll_write(struct siba_cc *, uint32_t,
118cab56aceSImre Vadasz 		    uint32_t);
119cab56aceSImre Vadasz static const struct siba_cc_pmu0_plltab *
120cab56aceSImre Vadasz 		siba_cc_pmu0_plltab_findentry(uint32_t);
121cab56aceSImre Vadasz static int	siba_pci_sprom(struct siba_softc *, struct siba_sprom *);
122cab56aceSImre Vadasz static int	siba_sprom_read(struct siba_softc *, uint16_t *, uint16_t);
123cab56aceSImre Vadasz static int	sprom_check_crc(const uint16_t *, size_t);
124cab56aceSImre Vadasz static uint8_t	siba_crc8(uint8_t, uint8_t);
125cab56aceSImre Vadasz static void	siba_sprom_r123(struct siba_sprom *, const uint16_t *);
126cab56aceSImre Vadasz static void	siba_sprom_r45(struct siba_sprom *, const uint16_t *);
127cab56aceSImre Vadasz static void	siba_sprom_r8(struct siba_sprom *, const uint16_t *);
128cab56aceSImre Vadasz static int8_t	siba_sprom_r123_antgain(uint8_t, const uint16_t *, uint16_t,
129cab56aceSImre Vadasz 		    uint16_t);
130cab56aceSImre Vadasz static uint32_t	siba_tmslow_reject_bitmask(struct siba_dev_softc *);
131cab56aceSImre Vadasz static uint32_t	siba_pcicore_read_4(struct siba_pci *, uint16_t);
132cab56aceSImre Vadasz static void	siba_pcicore_write_4(struct siba_pci *, uint16_t, uint32_t);
133cab56aceSImre Vadasz static uint32_t	siba_pcie_read(struct siba_pci *, uint32_t);
134cab56aceSImre Vadasz static void	siba_pcie_write(struct siba_pci *, uint32_t, uint32_t);
135cab56aceSImre Vadasz static void	siba_pcie_mdio_write(struct siba_pci *, uint8_t, uint8_t,
136cab56aceSImre Vadasz 		    uint16_t);
137cab56aceSImre Vadasz static void	siba_pci_read_multi_1(struct siba_dev_softc *, void *, size_t,
138cab56aceSImre Vadasz 		    uint16_t);
139cab56aceSImre Vadasz static void	siba_pci_read_multi_2(struct siba_dev_softc *, void *, size_t,
140cab56aceSImre Vadasz 		    uint16_t);
141cab56aceSImre Vadasz static void	siba_pci_read_multi_4(struct siba_dev_softc *, void *, size_t,
142cab56aceSImre Vadasz 		    uint16_t);
143cab56aceSImre Vadasz static void	siba_pci_write_multi_1(struct siba_dev_softc *, const void *,
144cab56aceSImre Vadasz 		    size_t, uint16_t);
145cab56aceSImre Vadasz static void	siba_pci_write_multi_2(struct siba_dev_softc *, const void *,
146cab56aceSImre Vadasz 		    size_t, uint16_t);
147cab56aceSImre Vadasz static void	siba_pci_write_multi_4(struct siba_dev_softc *, const void *,
148cab56aceSImre Vadasz 		    size_t, uint16_t);
149cab56aceSImre Vadasz static const char *siba_core_name(uint16_t);
150cab56aceSImre Vadasz static void	siba_pcicore_init(struct siba_pci *);
151cab56aceSImre Vadasz static uint32_t	siba_read_4_sub(struct siba_dev_softc *, uint16_t);
152cab56aceSImre Vadasz static void	siba_write_4_sub(struct siba_dev_softc *, uint16_t, uint32_t);
153cab56aceSImre Vadasz static void	siba_powerup_sub(struct siba_softc *, int);
154cab56aceSImre Vadasz static int	siba_powerdown_sub(struct siba_softc *);
155cab56aceSImre Vadasz static int	siba_dev_isup_sub(struct siba_dev_softc *);
156cab56aceSImre Vadasz static void	siba_dev_up_sub(struct siba_dev_softc *, uint32_t);
157cab56aceSImre Vadasz static void	siba_dev_down_sub(struct siba_dev_softc *, uint32_t);
158cab56aceSImre Vadasz int		siba_core_attach(struct siba_softc *);
159cab56aceSImre Vadasz int		siba_core_detach(struct siba_softc *);
160cab56aceSImre Vadasz int		siba_core_suspend(struct siba_softc *);
161cab56aceSImre Vadasz int		siba_core_resume(struct siba_softc *);
162cab56aceSImre Vadasz uint8_t		siba_getncores(device_t, uint16_t);
163cab56aceSImre Vadasz 
164cab56aceSImre Vadasz static const struct siba_bus_ops siba_pci_ops = {
165cab56aceSImre Vadasz 	.read_2		= siba_pci_read_2,
166cab56aceSImre Vadasz 	.read_4		= siba_pci_read_4,
167cab56aceSImre Vadasz 	.write_2	= siba_pci_write_2,
168cab56aceSImre Vadasz 	.write_4	= siba_pci_write_4,
169cab56aceSImre Vadasz 	.read_multi_1	= siba_pci_read_multi_1,
170cab56aceSImre Vadasz 	.read_multi_2	= siba_pci_read_multi_2,
171cab56aceSImre Vadasz 	.read_multi_4	= siba_pci_read_multi_4,
172cab56aceSImre Vadasz 	.write_multi_1	= siba_pci_write_multi_1,
173cab56aceSImre Vadasz 	.write_multi_2	= siba_pci_write_multi_2,
174cab56aceSImre Vadasz 	.write_multi_4	= siba_pci_write_multi_4,
175cab56aceSImre Vadasz };
176cab56aceSImre Vadasz 
177cab56aceSImre Vadasz static const struct siba_cc_pmu_res_updown siba_cc_pmu_4325_updown[] =
178cab56aceSImre Vadasz     SIBA_CC_PMU_4325_RES_UPDOWN;
179cab56aceSImre Vadasz static const struct siba_cc_pmu_res_depend siba_cc_pmu_4325_depend[] =
180cab56aceSImre Vadasz     SIBA_CC_PMU_4325_RES_DEPEND;
181cab56aceSImre Vadasz static const struct siba_cc_pmu_res_updown siba_cc_pmu_4328_updown[] =
182cab56aceSImre Vadasz     SIBA_CC_PMU_4328_RES_UPDOWN;
183cab56aceSImre Vadasz static const struct siba_cc_pmu_res_depend siba_cc_pmu_4328_depend[] =
184cab56aceSImre Vadasz     SIBA_CC_PMU_4328_RES_DEPEND;
185cab56aceSImre Vadasz static const struct siba_cc_pmu0_plltab siba_cc_pmu0_plltab[] =
186cab56aceSImre Vadasz     SIBA_CC_PMU0_PLLTAB_ENTRY;
187cab56aceSImre Vadasz static const struct siba_cc_pmu1_plltab siba_cc_pmu1_plltab[] =
188cab56aceSImre Vadasz     SIBA_CC_PMU1_PLLTAB_ENTRY;
189cab56aceSImre Vadasz 
190cab56aceSImre Vadasz int
siba_core_attach(struct siba_softc * siba)191cab56aceSImre Vadasz siba_core_attach(struct siba_softc *siba)
192cab56aceSImre Vadasz {
193cab56aceSImre Vadasz 	struct siba_cc *scc;
194cab56aceSImre Vadasz 	int error;
195cab56aceSImre Vadasz 
196cab56aceSImre Vadasz 	KASSERT(siba->siba_type == SIBA_TYPE_PCI,
197cab56aceSImre Vadasz 	    ("unsupported BUS type (%#x)", siba->siba_type));
198cab56aceSImre Vadasz 
199cab56aceSImre Vadasz 	siba->siba_ops = &siba_pci_ops;
200cab56aceSImre Vadasz 
201cab56aceSImre Vadasz 	siba_pci_gpio(siba, SIBA_GPIO_CRYSTAL | SIBA_GPIO_PLL, 1);
202cab56aceSImre Vadasz 	siba_scan(siba);
203cab56aceSImre Vadasz 
204cab56aceSImre Vadasz 	/* XXX init PCI or PCMCIA host devices */
205cab56aceSImre Vadasz 
206cab56aceSImre Vadasz 	siba_powerup_sub(siba, 0);
207cab56aceSImre Vadasz 
208cab56aceSImre Vadasz 	/* init ChipCommon */
209cab56aceSImre Vadasz 	scc = &siba->siba_cc;
210cab56aceSImre Vadasz 	if (scc->scc_dev != NULL) {
211cab56aceSImre Vadasz 		siba_cc_pmu_init(scc);
212cab56aceSImre Vadasz 		siba_cc_power_init(scc);
213cab56aceSImre Vadasz 		siba_cc_clock(scc, SIBA_CLOCK_FAST);
214cab56aceSImre Vadasz 		siba_cc_powerup_delay(scc);
215cab56aceSImre Vadasz 	}
216cab56aceSImre Vadasz 
217cab56aceSImre Vadasz 	error = siba_pci_sprom(siba, &siba->siba_sprom);
218cab56aceSImre Vadasz 	if (error) {
219cab56aceSImre Vadasz 		siba_powerdown_sub(siba);
220cab56aceSImre Vadasz 		return (error);
221cab56aceSImre Vadasz 	}
222cab56aceSImre Vadasz 
223cab56aceSImre Vadasz 	siba_pcicore_init(&siba->siba_pci);
224cab56aceSImre Vadasz 	siba_powerdown_sub(siba);
225cab56aceSImre Vadasz 
226cab56aceSImre Vadasz 	return (bus_generic_attach(siba->siba_dev));
227cab56aceSImre Vadasz }
228cab56aceSImre Vadasz 
229cab56aceSImre Vadasz int
siba_core_detach(struct siba_softc * siba)230cab56aceSImre Vadasz siba_core_detach(struct siba_softc *siba)
231cab56aceSImre Vadasz {
232cab56aceSImre Vadasz 	/* detach & delete all children */
233cab56aceSImre Vadasz 	device_delete_children(siba->siba_dev);
234cab56aceSImre Vadasz 	return (0);
235cab56aceSImre Vadasz }
236cab56aceSImre Vadasz 
237cab56aceSImre Vadasz static void
siba_pci_gpio(struct siba_softc * siba,uint32_t what,int on)238cab56aceSImre Vadasz siba_pci_gpio(struct siba_softc *siba, uint32_t what, int on)
239cab56aceSImre Vadasz {
240cab56aceSImre Vadasz 	uint32_t in, out;
241cab56aceSImre Vadasz 	uint16_t status;
242cab56aceSImre Vadasz 
243cab56aceSImre Vadasz 	if (siba->siba_type != SIBA_TYPE_PCI)
244cab56aceSImre Vadasz 		return;
245cab56aceSImre Vadasz 
246cab56aceSImre Vadasz 	out = pci_read_config(siba->siba_dev, SIBA_GPIO_OUT, 4);
247cab56aceSImre Vadasz 	if (on == 0) {
248cab56aceSImre Vadasz 		if (what & SIBA_GPIO_PLL)
249cab56aceSImre Vadasz 			out |= SIBA_GPIO_PLL;
250cab56aceSImre Vadasz 		if (what & SIBA_GPIO_CRYSTAL)
251cab56aceSImre Vadasz 			out &= ~SIBA_GPIO_CRYSTAL;
252cab56aceSImre Vadasz 		pci_write_config(siba->siba_dev, SIBA_GPIO_OUT, out, 4);
253cab56aceSImre Vadasz 		pci_write_config(siba->siba_dev, SIBA_GPIO_OUT_EN,
254cab56aceSImre Vadasz 		    pci_read_config(siba->siba_dev,
255cab56aceSImre Vadasz 			SIBA_GPIO_OUT_EN, 4) | what, 4);
256cab56aceSImre Vadasz 		return;
257cab56aceSImre Vadasz 	}
258cab56aceSImre Vadasz 
259cab56aceSImre Vadasz 	in = pci_read_config(siba->siba_dev, SIBA_GPIO_IN, 4);
260cab56aceSImre Vadasz 	if ((in & SIBA_GPIO_CRYSTAL) != SIBA_GPIO_CRYSTAL) {
261cab56aceSImre Vadasz 		if (what & SIBA_GPIO_CRYSTAL) {
262cab56aceSImre Vadasz 			out |= SIBA_GPIO_CRYSTAL;
263cab56aceSImre Vadasz 			if (what & SIBA_GPIO_PLL)
264cab56aceSImre Vadasz 				out |= SIBA_GPIO_PLL;
265cab56aceSImre Vadasz 			pci_write_config(siba->siba_dev, SIBA_GPIO_OUT, out, 4);
266cab56aceSImre Vadasz 			pci_write_config(siba->siba_dev,
267cab56aceSImre Vadasz 			    SIBA_GPIO_OUT_EN, pci_read_config(siba->siba_dev,
268cab56aceSImre Vadasz 				SIBA_GPIO_OUT_EN, 4) | what, 4);
269cab56aceSImre Vadasz 			DELAY(1000);
270cab56aceSImre Vadasz 		}
271cab56aceSImre Vadasz 		if (what & SIBA_GPIO_PLL) {
272cab56aceSImre Vadasz 			out &= ~SIBA_GPIO_PLL;
273cab56aceSImre Vadasz 			pci_write_config(siba->siba_dev, SIBA_GPIO_OUT, out, 4);
274cab56aceSImre Vadasz 			DELAY(5000);
275cab56aceSImre Vadasz 		}
276cab56aceSImre Vadasz 	}
277cab56aceSImre Vadasz 
278cab56aceSImre Vadasz 	status = pci_read_config(siba->siba_dev, PCIR_STATUS, 2);
279cab56aceSImre Vadasz 	status &= ~PCIM_STATUS_STABORT;
280cab56aceSImre Vadasz 	pci_write_config(siba->siba_dev, PCIR_STATUS, status, 2);
281cab56aceSImre Vadasz }
282cab56aceSImre Vadasz 
283cab56aceSImre Vadasz static void
siba_scan(struct siba_softc * siba)284cab56aceSImre Vadasz siba_scan(struct siba_softc *siba)
285cab56aceSImre Vadasz {
286cab56aceSImre Vadasz 	struct siba_dev_softc *sd;
287cab56aceSImre Vadasz 	uint32_t idhi, tmp;
288cab56aceSImre Vadasz 	device_t child;
289cab56aceSImre Vadasz 	int base, dev_i = 0, error, i, is_pcie, n_80211 = 0, n_cc = 0,
290cab56aceSImre Vadasz 	    n_pci = 0;
291cab56aceSImre Vadasz 
292cab56aceSImre Vadasz 	KASSERT(siba->siba_type == SIBA_TYPE_PCI,
293cab56aceSImre Vadasz 	    ("unsupported BUS type (%#x)", siba->siba_type));
294cab56aceSImre Vadasz 
295cab56aceSImre Vadasz 	siba->siba_ndevs = 0;
296cab56aceSImre Vadasz 	error = siba_switchcore(siba, 0); /* need the first core */
297cab56aceSImre Vadasz 	if (error)
298cab56aceSImre Vadasz 		return;
299cab56aceSImre Vadasz 
300cab56aceSImre Vadasz 	idhi = siba_scan_read_4(siba, 0, SIBA_IDHIGH);
301cab56aceSImre Vadasz 	if (SIBA_IDHIGH_CORECODE(idhi) == SIBA_DEVID_CHIPCOMMON) {
302cab56aceSImre Vadasz 		tmp = siba_scan_read_4(siba, 0, SIBA_CC_CHIPID);
303cab56aceSImre Vadasz 		siba->siba_chipid = SIBA_CC_ID(tmp);
304cab56aceSImre Vadasz 		siba->siba_chiprev = SIBA_CC_REV(tmp);
305cab56aceSImre Vadasz 		siba->siba_chippkg = SIBA_CC_PKG(tmp);
306cab56aceSImre Vadasz 		if (SIBA_IDHIGH_REV(idhi) >= 4)
307cab56aceSImre Vadasz 			siba->siba_ndevs = SIBA_CC_NCORES(tmp);
308cab56aceSImre Vadasz 		siba->siba_cc.scc_caps = siba_scan_read_4(siba, 0,
309cab56aceSImre Vadasz 		    SIBA_CC_CAPS);
310cab56aceSImre Vadasz 	} else {
311cab56aceSImre Vadasz 		if (siba->siba_type == SIBA_TYPE_PCI) {
312cab56aceSImre Vadasz 			siba->siba_chipid = siba_dev2chipid(siba);
313cab56aceSImre Vadasz 			siba->siba_chiprev = pci_read_config(siba->siba_dev,
314cab56aceSImre Vadasz 			    PCIR_REVID, 2);
315cab56aceSImre Vadasz 			siba->siba_chippkg = 0;
316cab56aceSImre Vadasz 		} else {
317cab56aceSImre Vadasz 			siba->siba_chipid = 0x4710;
318cab56aceSImre Vadasz 			siba->siba_chiprev = 0;
319cab56aceSImre Vadasz 			siba->siba_chippkg = 0;
320cab56aceSImre Vadasz 		}
321cab56aceSImre Vadasz 	}
322cab56aceSImre Vadasz 	if (siba->siba_ndevs == 0)
323cab56aceSImre Vadasz 		siba->siba_ndevs = siba_getncores(siba->siba_dev,
324cab56aceSImre Vadasz 		    siba->siba_chipid);
325cab56aceSImre Vadasz 	if (siba->siba_ndevs > SIBA_MAX_CORES) {
326cab56aceSImre Vadasz 		device_printf(siba->siba_dev,
327cab56aceSImre Vadasz 		    "too many siba cores (max %d %d)\n",
328cab56aceSImre Vadasz 		    SIBA_MAX_CORES, siba->siba_ndevs);
329cab56aceSImre Vadasz 		return;
330cab56aceSImre Vadasz 	}
331cab56aceSImre Vadasz 
332cab56aceSImre Vadasz 	/* looking basic information about each cores/devices */
333cab56aceSImre Vadasz 	for (i = 0; i < siba->siba_ndevs; i++) {
334cab56aceSImre Vadasz 		error = siba_switchcore(siba, i);
335cab56aceSImre Vadasz 		if (error)
336cab56aceSImre Vadasz 			return;
337cab56aceSImre Vadasz 		sd = &(siba->siba_devs[dev_i]);
338cab56aceSImre Vadasz 		idhi = siba_scan_read_4(siba, i, SIBA_IDHIGH);
339cab56aceSImre Vadasz 		sd->sd_bus = siba;
340cab56aceSImre Vadasz 		sd->sd_id.sd_device = SIBA_IDHIGH_CORECODE(idhi);
341cab56aceSImre Vadasz 		sd->sd_id.sd_rev = SIBA_IDHIGH_REV(idhi);
342cab56aceSImre Vadasz 		sd->sd_id.sd_vendor = SIBA_IDHIGH_VENDOR(idhi);
343cab56aceSImre Vadasz 		sd->sd_ops = siba->siba_ops;
344cab56aceSImre Vadasz 		sd->sd_coreidx = i;
345cab56aceSImre Vadasz 
346cab56aceSImre Vadasz 		DPRINTF(siba, SIBA_DEBUG_SCAN,
347cab56aceSImre Vadasz 		    "core %d (%s) found (cc %#xrev %#x vendor %#x)\n",
348cab56aceSImre Vadasz 		    i, siba_core_name(sd->sd_id.sd_device),
3499a1d456cSSascha Wildner 		    sd->sd_id.sd_device, sd->sd_id.sd_rev, sd->sd_id.sd_vendor);
350cab56aceSImre Vadasz 
351cab56aceSImre Vadasz 		switch (sd->sd_id.sd_device) {
352cab56aceSImre Vadasz 		case SIBA_DEVID_CHIPCOMMON:
353cab56aceSImre Vadasz 			n_cc++;
354cab56aceSImre Vadasz 			if (n_cc > 1) {
355cab56aceSImre Vadasz 				device_printf(siba->siba_dev,
356cab56aceSImre Vadasz 				    "warn: multiple ChipCommon\n");
357cab56aceSImre Vadasz 				break;
358cab56aceSImre Vadasz 			}
359cab56aceSImre Vadasz 			siba->siba_cc.scc_dev = sd;
360cab56aceSImre Vadasz 			break;
361cab56aceSImre Vadasz 		case SIBA_DEVID_80211:
362cab56aceSImre Vadasz 			n_80211++;
363cab56aceSImre Vadasz 			if (n_80211 > 1) {
364cab56aceSImre Vadasz 				device_printf(siba->siba_dev,
365cab56aceSImre Vadasz 				    "warn: multiple 802.11 core\n");
366cab56aceSImre Vadasz 				continue;
367cab56aceSImre Vadasz 			}
368cab56aceSImre Vadasz 			break;
369cab56aceSImre Vadasz 		case SIBA_DEVID_PCI:
370cab56aceSImre Vadasz 		case SIBA_DEVID_PCIE:
371cab56aceSImre Vadasz 			n_pci++;
3727872accfSImre Vadász #if defined(__DragonFly__)
373a0ab8429SImre Vadasz 			error = pci_find_extcap(siba->siba_dev, PCIY_EXPRESS,
374cab56aceSImre Vadasz 			    &base);
3757872accfSImre Vadász #else
3767872accfSImre Vadász 			error = pci_find_cap(siba->siba_dev, PCIY_EXPRESS,
3777872accfSImre Vadász 			    &base);
3787872accfSImre Vadász #endif
379cab56aceSImre Vadasz 			is_pcie = (error == 0) ? 1 : 0;
380cab56aceSImre Vadasz 
381cab56aceSImre Vadasz 			if (n_pci > 1) {
382cab56aceSImre Vadasz 				device_printf(siba->siba_dev,
383cab56aceSImre Vadasz 				    "warn: multiple PCI(E) cores\n");
384cab56aceSImre Vadasz 				break;
385cab56aceSImre Vadasz 			}
386cab56aceSImre Vadasz 			if (sd->sd_id.sd_device == SIBA_DEVID_PCI &&
387cab56aceSImre Vadasz 			    is_pcie == 1)
388cab56aceSImre Vadasz 				continue;
389cab56aceSImre Vadasz 			if (sd->sd_id.sd_device == SIBA_DEVID_PCIE &&
390cab56aceSImre Vadasz 			    is_pcie == 0)
391cab56aceSImre Vadasz 				continue;
392cab56aceSImre Vadasz 			siba->siba_pci.spc_dev = sd;
393cab56aceSImre Vadasz 			break;
394cab56aceSImre Vadasz 		case SIBA_DEVID_MODEM:
395cab56aceSImre Vadasz 		case SIBA_DEVID_PCMCIA:
396cab56aceSImre Vadasz 			break;
397cab56aceSImre Vadasz 		default:
398cab56aceSImre Vadasz 			device_printf(siba->siba_dev,
399cab56aceSImre Vadasz 			    "unsupported coreid (%s)\n",
400cab56aceSImre Vadasz 			    siba_core_name(sd->sd_id.sd_device));
401cab56aceSImre Vadasz 			break;
402cab56aceSImre Vadasz 		}
403cab56aceSImre Vadasz 		dev_i++;
404cab56aceSImre Vadasz 
405cab56aceSImre Vadasz 		child = device_add_child(siba->siba_dev, NULL, -1);
406cab56aceSImre Vadasz 		if (child == NULL) {
407cab56aceSImre Vadasz 			device_printf(siba->siba_dev, "child attach failed\n");
408cab56aceSImre Vadasz 			continue;
409cab56aceSImre Vadasz 		}
410cab56aceSImre Vadasz 
411cab56aceSImre Vadasz 		device_set_ivars(child, sd);
412cab56aceSImre Vadasz 	}
413cab56aceSImre Vadasz 	siba->siba_ndevs = dev_i;
414cab56aceSImre Vadasz }
415cab56aceSImre Vadasz 
416cab56aceSImre Vadasz static int
siba_switchcore(struct siba_softc * siba,uint8_t idx)417cab56aceSImre Vadasz siba_switchcore(struct siba_softc *siba, uint8_t idx)
418cab56aceSImre Vadasz {
419cab56aceSImre Vadasz 
420cab56aceSImre Vadasz 	switch (siba->siba_type) {
421cab56aceSImre Vadasz 	case SIBA_TYPE_PCI:
422cab56aceSImre Vadasz 		return (siba_pci_switchcore_sub(siba, idx));
423cab56aceSImre Vadasz 	default:
424cab56aceSImre Vadasz 		KASSERT(0 == 1,
425cab56aceSImre Vadasz 		    ("%s: unsupported bustype %#x", __func__,
426cab56aceSImre Vadasz 		    siba->siba_type));
427cab56aceSImre Vadasz 	}
428cab56aceSImre Vadasz 	return (0);
429cab56aceSImre Vadasz }
430cab56aceSImre Vadasz 
431cab56aceSImre Vadasz static int
siba_pci_switchcore_sub(struct siba_softc * siba,uint8_t idx)432cab56aceSImre Vadasz siba_pci_switchcore_sub(struct siba_softc *siba, uint8_t idx)
433cab56aceSImre Vadasz {
434cab56aceSImre Vadasz #define RETRY_MAX	50
435cab56aceSImre Vadasz 	int i;
436cab56aceSImre Vadasz 	uint32_t dir;
437cab56aceSImre Vadasz 
438cab56aceSImre Vadasz 	dir = SIBA_REGWIN(idx);
439cab56aceSImre Vadasz 
440cab56aceSImre Vadasz 	for (i = 0; i < RETRY_MAX; i++) {
441cab56aceSImre Vadasz 		pci_write_config(siba->siba_dev, SIBA_BAR0, dir, 4);
442cab56aceSImre Vadasz 		if (pci_read_config(siba->siba_dev, SIBA_BAR0, 4) == dir)
443cab56aceSImre Vadasz 			return (0);
444cab56aceSImre Vadasz 		DELAY(10);
445cab56aceSImre Vadasz 	}
446cab56aceSImre Vadasz 	return (ENODEV);
447cab56aceSImre Vadasz #undef RETRY_MAX
448cab56aceSImre Vadasz }
449cab56aceSImre Vadasz 
450cab56aceSImre Vadasz static int
siba_pci_switchcore(struct siba_softc * siba,struct siba_dev_softc * sd)451cab56aceSImre Vadasz siba_pci_switchcore(struct siba_softc *siba, struct siba_dev_softc *sd)
452cab56aceSImre Vadasz {
453cab56aceSImre Vadasz 	int error;
454cab56aceSImre Vadasz 
455cab56aceSImre Vadasz 	DPRINTF(siba, SIBA_DEBUG_SWITCHCORE, "Switching to %s core, index %d\n",
456cab56aceSImre Vadasz 	    siba_core_name(sd->sd_id.sd_device), sd->sd_coreidx);
457cab56aceSImre Vadasz 
458cab56aceSImre Vadasz 	error = siba_pci_switchcore_sub(siba, sd->sd_coreidx);
459cab56aceSImre Vadasz 	if (error == 0)
460cab56aceSImre Vadasz 		siba->siba_curdev = sd;
461cab56aceSImre Vadasz 
462cab56aceSImre Vadasz 	return (error);
463cab56aceSImre Vadasz }
464cab56aceSImre Vadasz 
465cab56aceSImre Vadasz static uint32_t
siba_scan_read_4(struct siba_softc * siba,uint8_t coreidx,uint16_t offset)466cab56aceSImre Vadasz siba_scan_read_4(struct siba_softc *siba, uint8_t coreidx,
467cab56aceSImre Vadasz     uint16_t offset)
468cab56aceSImre Vadasz {
469cab56aceSImre Vadasz 
470cab56aceSImre Vadasz 	(void)coreidx;
471cab56aceSImre Vadasz 	KASSERT(siba->siba_type == SIBA_TYPE_PCI,
472cab56aceSImre Vadasz 	    ("unsupported BUS type (%#x)", siba->siba_type));
473cab56aceSImre Vadasz 
474cab56aceSImre Vadasz 	return (SIBA_READ_4(siba, offset));
475cab56aceSImre Vadasz }
476cab56aceSImre Vadasz 
477cab56aceSImre Vadasz static uint16_t
siba_dev2chipid(struct siba_softc * siba)478cab56aceSImre Vadasz siba_dev2chipid(struct siba_softc *siba)
479cab56aceSImre Vadasz {
480cab56aceSImre Vadasz 	uint16_t chipid = 0;
481cab56aceSImre Vadasz 
482cab56aceSImre Vadasz 	switch (siba->siba_pci_did) {
483cab56aceSImre Vadasz 	case 0x4301:
484cab56aceSImre Vadasz 		chipid = 0x4301;
485cab56aceSImre Vadasz 		break;
486cab56aceSImre Vadasz 	case 0x4305:
487cab56aceSImre Vadasz 	case 0x4306:
488cab56aceSImre Vadasz 	case 0x4307:
489cab56aceSImre Vadasz 		chipid = 0x4307;
490cab56aceSImre Vadasz 		break;
491cab56aceSImre Vadasz 	case 0x4403:
492cab56aceSImre Vadasz 		chipid = 0x4402;
493cab56aceSImre Vadasz 		break;
494cab56aceSImre Vadasz 	case 0x4610:
495cab56aceSImre Vadasz 	case 0x4611:
496cab56aceSImre Vadasz 	case 0x4612:
497cab56aceSImre Vadasz 	case 0x4613:
498cab56aceSImre Vadasz 	case 0x4614:
499cab56aceSImre Vadasz 	case 0x4615:
500cab56aceSImre Vadasz 		chipid = 0x4610;
501cab56aceSImre Vadasz 		break;
502cab56aceSImre Vadasz 	case 0x4710:
503cab56aceSImre Vadasz 	case 0x4711:
504cab56aceSImre Vadasz 	case 0x4712:
505cab56aceSImre Vadasz 	case 0x4713:
506cab56aceSImre Vadasz 	case 0x4714:
507cab56aceSImre Vadasz 	case 0x4715:
508cab56aceSImre Vadasz 		chipid = 0x4710;
509cab56aceSImre Vadasz 		break;
510cab56aceSImre Vadasz 	case 0x4320:
511cab56aceSImre Vadasz 	case 0x4321:
512cab56aceSImre Vadasz 	case 0x4322:
513cab56aceSImre Vadasz 	case 0x4323:
514cab56aceSImre Vadasz 	case 0x4324:
515cab56aceSImre Vadasz 	case 0x4325:
516cab56aceSImre Vadasz 		chipid = 0x4309;
517cab56aceSImre Vadasz 		break;
518cab56aceSImre Vadasz 	case PCI_DEVICE_ID_BCM4401:
519cab56aceSImre Vadasz 	case PCI_DEVICE_ID_BCM4401B0:
520cab56aceSImre Vadasz 	case PCI_DEVICE_ID_BCM4401B1:
521cab56aceSImre Vadasz 		chipid = 0x4401;
522cab56aceSImre Vadasz 		break;
523cab56aceSImre Vadasz 	default:
524cab56aceSImre Vadasz 		device_printf(siba->siba_dev, "unknown PCI did (%d)\n",
525cab56aceSImre Vadasz 		    siba->siba_pci_did);
526cab56aceSImre Vadasz 	}
527cab56aceSImre Vadasz 
528cab56aceSImre Vadasz 	return (chipid);
529cab56aceSImre Vadasz }
530cab56aceSImre Vadasz 
531cab56aceSImre Vadasz /*
532cab56aceSImre Vadasz  * Earlier ChipCommon revisions have hardcoded number of cores
533cab56aceSImre Vadasz  * present dependent on the ChipCommon ID.
534cab56aceSImre Vadasz  */
535cab56aceSImre Vadasz uint8_t
siba_getncores(device_t dev,uint16_t chipid)536cab56aceSImre Vadasz siba_getncores(device_t dev, uint16_t chipid)
537cab56aceSImre Vadasz {
538cab56aceSImre Vadasz 	switch (chipid) {
539cab56aceSImre Vadasz 	case 0x4401:
540cab56aceSImre Vadasz 	case 0x4402:
541cab56aceSImre Vadasz 		return (3);
542cab56aceSImre Vadasz 	case 0x4301:
543cab56aceSImre Vadasz 	case 0x4307:
544cab56aceSImre Vadasz 		return (5);
545cab56aceSImre Vadasz 	case 0x4306:
546cab56aceSImre Vadasz 		return (6);
547cab56aceSImre Vadasz 	case SIBA_CCID_SENTRY5:
548cab56aceSImre Vadasz 		return (7);
549cab56aceSImre Vadasz 	case 0x4310:
550cab56aceSImre Vadasz 		return (8);
551cab56aceSImre Vadasz 	case SIBA_CCID_BCM4710:
552cab56aceSImre Vadasz 	case 0x4610:
553cab56aceSImre Vadasz 	case SIBA_CCID_BCM4704:
554cab56aceSImre Vadasz 		return (9);
555cab56aceSImre Vadasz 	default:
556cab56aceSImre Vadasz 		device_printf(dev, "unknown the chipset ID %#x\n", chipid);
557cab56aceSImre Vadasz 	}
558cab56aceSImre Vadasz 
559cab56aceSImre Vadasz 	return (1);
560cab56aceSImre Vadasz }
561cab56aceSImre Vadasz 
562cab56aceSImre Vadasz static const char *
siba_core_name(uint16_t coreid)563cab56aceSImre Vadasz siba_core_name(uint16_t coreid)
564cab56aceSImre Vadasz {
565cab56aceSImre Vadasz 
566cab56aceSImre Vadasz 	switch (coreid) {
567cab56aceSImre Vadasz 	case SIBA_DEVID_CHIPCOMMON:
568cab56aceSImre Vadasz 		return ("ChipCommon");
569cab56aceSImre Vadasz 	case SIBA_DEVID_ILINE20:
570cab56aceSImre Vadasz 		return ("ILine 20");
571cab56aceSImre Vadasz 	case SIBA_DEVID_SDRAM:
572cab56aceSImre Vadasz 		return ("SDRAM");
573cab56aceSImre Vadasz 	case SIBA_DEVID_PCI:
574cab56aceSImre Vadasz 		return ("PCI");
575cab56aceSImre Vadasz 	case SIBA_DEVID_MIPS:
576cab56aceSImre Vadasz 		return ("MIPS");
577cab56aceSImre Vadasz 	case SIBA_DEVID_ETHERNET:
578cab56aceSImre Vadasz 		return ("Fast Ethernet");
579cab56aceSImre Vadasz 	case SIBA_DEVID_MODEM:
580cab56aceSImre Vadasz 		return ("Modem");
581cab56aceSImre Vadasz 	case SIBA_DEVID_USB11_HOSTDEV:
582cab56aceSImre Vadasz 		return ("USB 1.1 Hostdev");
583cab56aceSImre Vadasz 	case SIBA_DEVID_ADSL:
584cab56aceSImre Vadasz 		return ("ADSL");
585cab56aceSImre Vadasz 	case SIBA_DEVID_ILINE100:
586cab56aceSImre Vadasz 		return ("ILine 100");
587cab56aceSImre Vadasz 	case SIBA_DEVID_IPSEC:
588cab56aceSImre Vadasz 		return ("IPSEC");
589cab56aceSImre Vadasz 	case SIBA_DEVID_PCMCIA:
590cab56aceSImre Vadasz 		return ("PCMCIA");
591cab56aceSImre Vadasz 	case SIBA_DEVID_INTERNAL_MEM:
592cab56aceSImre Vadasz 		return ("Internal Memory");
593cab56aceSImre Vadasz 	case SIBA_DEVID_SDRAMDDR:
594cab56aceSImre Vadasz 		return ("MEMC SDRAM");
595cab56aceSImre Vadasz 	case SIBA_DEVID_EXTIF:
596cab56aceSImre Vadasz 		return ("EXTIF");
597cab56aceSImre Vadasz 	case SIBA_DEVID_80211:
598cab56aceSImre Vadasz 		return ("IEEE 802.11");
599cab56aceSImre Vadasz 	case SIBA_DEVID_MIPS_3302:
600cab56aceSImre Vadasz 		return ("MIPS 3302");
601cab56aceSImre Vadasz 	case SIBA_DEVID_USB11_HOST:
602cab56aceSImre Vadasz 		return ("USB 1.1 Host");
603cab56aceSImre Vadasz 	case SIBA_DEVID_USB11_DEV:
604cab56aceSImre Vadasz 		return ("USB 1.1 Device");
605cab56aceSImre Vadasz 	case SIBA_DEVID_USB20_HOST:
606cab56aceSImre Vadasz 		return ("USB 2.0 Host");
607cab56aceSImre Vadasz 	case SIBA_DEVID_USB20_DEV:
608cab56aceSImre Vadasz 		return ("USB 2.0 Device");
609cab56aceSImre Vadasz 	case SIBA_DEVID_SDIO_HOST:
610cab56aceSImre Vadasz 		return ("SDIO Host");
611cab56aceSImre Vadasz 	case SIBA_DEVID_ROBOSWITCH:
612cab56aceSImre Vadasz 		return ("Roboswitch");
613cab56aceSImre Vadasz 	case SIBA_DEVID_PARA_ATA:
614cab56aceSImre Vadasz 		return ("PATA");
615cab56aceSImre Vadasz 	case SIBA_DEVID_SATA_XORDMA:
616cab56aceSImre Vadasz 		return ("SATA XOR-DMA");
617cab56aceSImre Vadasz 	case SIBA_DEVID_ETHERNET_GBIT:
618cab56aceSImre Vadasz 		return ("GBit Ethernet");
619cab56aceSImre Vadasz 	case SIBA_DEVID_PCIE:
620cab56aceSImre Vadasz 		return ("PCI-Express");
621cab56aceSImre Vadasz 	case SIBA_DEVID_MIMO_PHY:
622cab56aceSImre Vadasz 		return ("MIMO PHY");
623cab56aceSImre Vadasz 	case SIBA_DEVID_SRAM_CTRLR:
624cab56aceSImre Vadasz 		return ("SRAM Controller");
625cab56aceSImre Vadasz 	case SIBA_DEVID_MINI_MACPHY:
626cab56aceSImre Vadasz 		return ("Mini MACPHY");
627cab56aceSImre Vadasz 	case SIBA_DEVID_ARM_1176:
628cab56aceSImre Vadasz 		return ("ARM 1176");
629cab56aceSImre Vadasz 	case SIBA_DEVID_ARM_7TDMI:
630cab56aceSImre Vadasz 		return ("ARM 7TDMI");
631cab56aceSImre Vadasz 	}
632cab56aceSImre Vadasz 	return ("unknown");
633cab56aceSImre Vadasz }
634cab56aceSImre Vadasz 
635cab56aceSImre Vadasz static uint16_t
siba_pci_read_2(struct siba_dev_softc * sd,uint16_t offset)636cab56aceSImre Vadasz siba_pci_read_2(struct siba_dev_softc *sd, uint16_t offset)
637cab56aceSImre Vadasz {
638cab56aceSImre Vadasz 	struct siba_softc *siba = sd->sd_bus;
639cab56aceSImre Vadasz 
640cab56aceSImre Vadasz 	if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0)
641cab56aceSImre Vadasz 		return (0xffff);
642cab56aceSImre Vadasz 
643cab56aceSImre Vadasz 	return (SIBA_READ_2(siba, offset));
644cab56aceSImre Vadasz }
645cab56aceSImre Vadasz 
646cab56aceSImre Vadasz static uint32_t
siba_pci_read_4(struct siba_dev_softc * sd,uint16_t offset)647cab56aceSImre Vadasz siba_pci_read_4(struct siba_dev_softc *sd, uint16_t offset)
648cab56aceSImre Vadasz {
649cab56aceSImre Vadasz 	struct siba_softc *siba = sd->sd_bus;
650cab56aceSImre Vadasz 
651cab56aceSImre Vadasz 	if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0)
652cab56aceSImre Vadasz 		return (0xffff);
653cab56aceSImre Vadasz 
654cab56aceSImre Vadasz 	return (SIBA_READ_4(siba, offset));
655cab56aceSImre Vadasz }
656cab56aceSImre Vadasz 
657cab56aceSImre Vadasz static void
siba_pci_write_2(struct siba_dev_softc * sd,uint16_t offset,uint16_t value)658cab56aceSImre Vadasz siba_pci_write_2(struct siba_dev_softc *sd, uint16_t offset, uint16_t value)
659cab56aceSImre Vadasz {
660cab56aceSImre Vadasz 	struct siba_softc *siba = sd->sd_bus;
661cab56aceSImre Vadasz 
662cab56aceSImre Vadasz 	if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0)
663cab56aceSImre Vadasz 		return;
664cab56aceSImre Vadasz 
665cab56aceSImre Vadasz 	SIBA_WRITE_2(siba, offset, value);
666cab56aceSImre Vadasz }
667cab56aceSImre Vadasz 
668cab56aceSImre Vadasz static void
siba_pci_write_4(struct siba_dev_softc * sd,uint16_t offset,uint32_t value)669cab56aceSImre Vadasz siba_pci_write_4(struct siba_dev_softc *sd, uint16_t offset, uint32_t value)
670cab56aceSImre Vadasz {
671cab56aceSImre Vadasz 	struct siba_softc *siba = sd->sd_bus;
672cab56aceSImre Vadasz 
673cab56aceSImre Vadasz 	if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0)
674cab56aceSImre Vadasz 		return;
675cab56aceSImre Vadasz 
676cab56aceSImre Vadasz 	SIBA_WRITE_4(siba, offset, value);
677cab56aceSImre Vadasz }
678cab56aceSImre Vadasz 
679cab56aceSImre Vadasz static void
siba_pci_read_multi_1(struct siba_dev_softc * sd,void * buffer,size_t count,uint16_t offset)680cab56aceSImre Vadasz siba_pci_read_multi_1(struct siba_dev_softc *sd, void *buffer, size_t count,
681cab56aceSImre Vadasz     uint16_t offset)
682cab56aceSImre Vadasz {
683cab56aceSImre Vadasz 	struct siba_softc *siba = sd->sd_bus;
684cab56aceSImre Vadasz 
685cab56aceSImre Vadasz 	if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0) {
686cab56aceSImre Vadasz 		memset(buffer, 0xff, count);
687cab56aceSImre Vadasz 		return;
688cab56aceSImre Vadasz 	}
689cab56aceSImre Vadasz 
690cab56aceSImre Vadasz 	SIBA_READ_MULTI_1(siba, offset, buffer, count);
691cab56aceSImre Vadasz }
692cab56aceSImre Vadasz 
693cab56aceSImre Vadasz static void
siba_pci_read_multi_2(struct siba_dev_softc * sd,void * buffer,size_t count,uint16_t offset)694cab56aceSImre Vadasz siba_pci_read_multi_2(struct siba_dev_softc *sd, void *buffer, size_t count,
695cab56aceSImre Vadasz     uint16_t offset)
696cab56aceSImre Vadasz {
697cab56aceSImre Vadasz 	struct siba_softc *siba = sd->sd_bus;
698cab56aceSImre Vadasz 
699cab56aceSImre Vadasz 	if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0) {
700cab56aceSImre Vadasz 		memset(buffer, 0xff, count);
701cab56aceSImre Vadasz 		return;
702cab56aceSImre Vadasz 	}
703cab56aceSImre Vadasz 
704cab56aceSImre Vadasz 	KASSERT(!(count & 1), ("%s:%d: fail", __func__, __LINE__));
705cab56aceSImre Vadasz 	SIBA_READ_MULTI_2(siba, offset, buffer, count >> 1);
706cab56aceSImre Vadasz }
707cab56aceSImre Vadasz 
708cab56aceSImre Vadasz static void
siba_pci_read_multi_4(struct siba_dev_softc * sd,void * buffer,size_t count,uint16_t offset)709cab56aceSImre Vadasz siba_pci_read_multi_4(struct siba_dev_softc *sd, void *buffer, size_t count,
710cab56aceSImre Vadasz     uint16_t offset)
711cab56aceSImre Vadasz {
712cab56aceSImre Vadasz 	struct siba_softc *siba = sd->sd_bus;
713cab56aceSImre Vadasz 
714cab56aceSImre Vadasz 	if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0) {
715cab56aceSImre Vadasz 		memset(buffer, 0xff, count);
716cab56aceSImre Vadasz 		return;
717cab56aceSImre Vadasz 	}
718cab56aceSImre Vadasz 
719cab56aceSImre Vadasz 	KASSERT(!(count & 3), ("%s:%d: fail", __func__, __LINE__));
720cab56aceSImre Vadasz 	SIBA_READ_MULTI_4(siba, offset, buffer, count >> 2);
721cab56aceSImre Vadasz }
722cab56aceSImre Vadasz 
723cab56aceSImre Vadasz static void
siba_pci_write_multi_1(struct siba_dev_softc * sd,const void * buffer,size_t count,uint16_t offset)724cab56aceSImre Vadasz siba_pci_write_multi_1(struct siba_dev_softc *sd, const void *buffer,
725cab56aceSImre Vadasz     size_t count, uint16_t offset)
726cab56aceSImre Vadasz {
727cab56aceSImre Vadasz 	struct siba_softc *siba = sd->sd_bus;
728cab56aceSImre Vadasz 
729cab56aceSImre Vadasz 	if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0)
730cab56aceSImre Vadasz 		return;
731cab56aceSImre Vadasz 
732cab56aceSImre Vadasz 	SIBA_WRITE_MULTI_1(siba, offset, buffer, count);
733cab56aceSImre Vadasz }
734cab56aceSImre Vadasz 
735cab56aceSImre Vadasz static void
siba_pci_write_multi_2(struct siba_dev_softc * sd,const void * buffer,size_t count,uint16_t offset)736cab56aceSImre Vadasz siba_pci_write_multi_2(struct siba_dev_softc *sd, const void *buffer,
737cab56aceSImre Vadasz     size_t count, uint16_t offset)
738cab56aceSImre Vadasz {
739cab56aceSImre Vadasz 	struct siba_softc *siba = sd->sd_bus;
740cab56aceSImre Vadasz 
741cab56aceSImre Vadasz 	if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0)
742cab56aceSImre Vadasz 		return;
743cab56aceSImre Vadasz 
744cab56aceSImre Vadasz 	KASSERT(!(count & 1), ("%s:%d: fail", __func__, __LINE__));
745cab56aceSImre Vadasz 	SIBA_WRITE_MULTI_2(siba, offset, buffer, count >> 1);
746cab56aceSImre Vadasz }
747cab56aceSImre Vadasz 
748cab56aceSImre Vadasz static void
siba_pci_write_multi_4(struct siba_dev_softc * sd,const void * buffer,size_t count,uint16_t offset)749cab56aceSImre Vadasz siba_pci_write_multi_4(struct siba_dev_softc *sd, const void *buffer,
750cab56aceSImre Vadasz     size_t count, uint16_t offset)
751cab56aceSImre Vadasz {
752cab56aceSImre Vadasz 	struct siba_softc *siba = sd->sd_bus;
753cab56aceSImre Vadasz 
754cab56aceSImre Vadasz 	if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0)
755cab56aceSImre Vadasz 		return;
756cab56aceSImre Vadasz 
757cab56aceSImre Vadasz 	KASSERT(!(count & 3), ("%s:%d: fail", __func__, __LINE__));
758cab56aceSImre Vadasz 	SIBA_WRITE_MULTI_4(siba, offset, buffer, count >> 2);
759cab56aceSImre Vadasz }
760cab56aceSImre Vadasz 
761cab56aceSImre Vadasz void
siba_powerup(device_t dev,int dynamic)762cab56aceSImre Vadasz siba_powerup(device_t dev, int dynamic)
763cab56aceSImre Vadasz {
764cab56aceSImre Vadasz 	struct siba_dev_softc *sd = device_get_ivars(dev);
765cab56aceSImre Vadasz 	struct siba_softc *siba = sd->sd_bus;
766cab56aceSImre Vadasz 
767cab56aceSImre Vadasz 	siba_powerup_sub(siba, dynamic);
768cab56aceSImre Vadasz }
769cab56aceSImre Vadasz 
770cab56aceSImre Vadasz static void
siba_powerup_sub(struct siba_softc * siba,int dynamic)771cab56aceSImre Vadasz siba_powerup_sub(struct siba_softc *siba, int dynamic)
772cab56aceSImre Vadasz {
773cab56aceSImre Vadasz 
774cab56aceSImre Vadasz 	siba_pci_gpio(siba, SIBA_GPIO_CRYSTAL | SIBA_GPIO_PLL, 1);
775cab56aceSImre Vadasz 	siba_cc_clock(&siba->siba_cc,
776cab56aceSImre Vadasz 	    (dynamic != 0) ? SIBA_CLOCK_DYNAMIC : SIBA_CLOCK_FAST);
777cab56aceSImre Vadasz }
778cab56aceSImre Vadasz 
779cab56aceSImre Vadasz static void
siba_cc_clock(struct siba_cc * scc,enum siba_clock clock)780cab56aceSImre Vadasz siba_cc_clock(struct siba_cc *scc, enum siba_clock clock)
781cab56aceSImre Vadasz {
782cab56aceSImre Vadasz 	struct siba_dev_softc *sd = scc->scc_dev;
783cab56aceSImre Vadasz 	struct siba_softc *siba;
784cab56aceSImre Vadasz 	uint32_t tmp;
785cab56aceSImre Vadasz 
786cab56aceSImre Vadasz 	if (sd == NULL)
787cab56aceSImre Vadasz 		return;
788cab56aceSImre Vadasz 	siba = sd->sd_bus;
789cab56aceSImre Vadasz 	/*
790cab56aceSImre Vadasz 	 * chipcommon < r6 (no dynamic clock control)
791cab56aceSImre Vadasz 	 * chipcommon >= r10 (unknown)
792cab56aceSImre Vadasz 	 */
793cab56aceSImre Vadasz 	if (sd->sd_id.sd_rev < 6 || sd->sd_id.sd_rev >= 10 ||
794cab56aceSImre Vadasz 	    (scc->scc_caps & SIBA_CC_CAPS_PWCTL) == 0)
795cab56aceSImre Vadasz 		return;
796cab56aceSImre Vadasz 
797cab56aceSImre Vadasz 	switch (clock) {
798cab56aceSImre Vadasz 	case SIBA_CLOCK_DYNAMIC:
799cab56aceSImre Vadasz 		tmp = SIBA_CC_READ32(scc, SIBA_CC_CLKSLOW) &
800cab56aceSImre Vadasz 		    ~(SIBA_CC_CLKSLOW_ENXTAL | SIBA_CC_CLKSLOW_FSLOW |
801cab56aceSImre Vadasz 		    SIBA_CC_CLKSLOW_IPLL);
802cab56aceSImre Vadasz 		if ((tmp & SIBA_CC_CLKSLOW_SRC) != SIBA_CC_CLKSLOW_SRC_CRYSTAL)
803cab56aceSImre Vadasz 			tmp |= SIBA_CC_CLKSLOW_ENXTAL;
804cab56aceSImre Vadasz 		SIBA_CC_WRITE32(scc, SIBA_CC_CLKSLOW, tmp);
805cab56aceSImre Vadasz 		if (tmp & SIBA_CC_CLKSLOW_ENXTAL)
806cab56aceSImre Vadasz 			siba_pci_gpio(siba, SIBA_GPIO_CRYSTAL, 0);
807cab56aceSImre Vadasz 		break;
808cab56aceSImre Vadasz 	case SIBA_CLOCK_SLOW:
809cab56aceSImre Vadasz 		SIBA_CC_WRITE32(scc, SIBA_CC_CLKSLOW,
810cab56aceSImre Vadasz 		    SIBA_CC_READ32(scc, SIBA_CC_CLKSLOW) |
811cab56aceSImre Vadasz 		    SIBA_CC_CLKSLOW_FSLOW);
812cab56aceSImre Vadasz 		break;
813cab56aceSImre Vadasz 	case SIBA_CLOCK_FAST:
814cab56aceSImre Vadasz 		/* crystal on */
815cab56aceSImre Vadasz 		siba_pci_gpio(siba, SIBA_GPIO_CRYSTAL, 1);
816cab56aceSImre Vadasz 		SIBA_CC_WRITE32(scc, SIBA_CC_CLKSLOW,
817cab56aceSImre Vadasz 		    (SIBA_CC_READ32(scc, SIBA_CC_CLKSLOW) |
818cab56aceSImre Vadasz 			SIBA_CC_CLKSLOW_IPLL) & ~SIBA_CC_CLKSLOW_FSLOW);
819cab56aceSImre Vadasz 		break;
820cab56aceSImre Vadasz 	default:
821cab56aceSImre Vadasz 		KASSERT(0 == 1,
822cab56aceSImre Vadasz 		    ("%s: unsupported clock %#x", __func__, clock));
823cab56aceSImre Vadasz 	}
824cab56aceSImre Vadasz }
825cab56aceSImre Vadasz 
826cab56aceSImre Vadasz uint16_t
siba_read_2(device_t dev,uint16_t offset)827cab56aceSImre Vadasz siba_read_2(device_t dev, uint16_t offset)
828cab56aceSImre Vadasz {
829cab56aceSImre Vadasz 	struct siba_dev_softc *sd = device_get_ivars(dev);
830cab56aceSImre Vadasz 
831cab56aceSImre Vadasz 	return (sd->sd_ops->read_2(sd, offset));
832cab56aceSImre Vadasz }
833cab56aceSImre Vadasz 
834cab56aceSImre Vadasz uint32_t
siba_read_4(device_t dev,uint16_t offset)835cab56aceSImre Vadasz siba_read_4(device_t dev, uint16_t offset)
836cab56aceSImre Vadasz {
837cab56aceSImre Vadasz 	struct siba_dev_softc *sd = device_get_ivars(dev);
838cab56aceSImre Vadasz 
839cab56aceSImre Vadasz 	return (siba_read_4_sub(sd, offset));
840cab56aceSImre Vadasz }
841cab56aceSImre Vadasz 
842cab56aceSImre Vadasz static uint32_t
siba_read_4_sub(struct siba_dev_softc * sd,uint16_t offset)843cab56aceSImre Vadasz siba_read_4_sub(struct siba_dev_softc *sd, uint16_t offset)
844cab56aceSImre Vadasz {
845cab56aceSImre Vadasz 
846cab56aceSImre Vadasz 	return (sd->sd_ops->read_4(sd, offset));
847cab56aceSImre Vadasz }
848cab56aceSImre Vadasz 
849cab56aceSImre Vadasz void
siba_write_2(device_t dev,uint16_t offset,uint16_t value)850cab56aceSImre Vadasz siba_write_2(device_t dev, uint16_t offset, uint16_t value)
851cab56aceSImre Vadasz {
852cab56aceSImre Vadasz 	struct siba_dev_softc *sd = device_get_ivars(dev);
853cab56aceSImre Vadasz 
854cab56aceSImre Vadasz 	sd->sd_ops->write_2(sd, offset, value);
855cab56aceSImre Vadasz }
856cab56aceSImre Vadasz 
857cab56aceSImre Vadasz void
siba_write_4(device_t dev,uint16_t offset,uint32_t value)858cab56aceSImre Vadasz siba_write_4(device_t dev, uint16_t offset, uint32_t value)
859cab56aceSImre Vadasz {
860cab56aceSImre Vadasz 	struct siba_dev_softc *sd = device_get_ivars(dev);
861cab56aceSImre Vadasz 
862cab56aceSImre Vadasz 	return (siba_write_4_sub(sd, offset, value));
863cab56aceSImre Vadasz }
864cab56aceSImre Vadasz 
865cab56aceSImre Vadasz static void
siba_write_4_sub(struct siba_dev_softc * sd,uint16_t offset,uint32_t value)866cab56aceSImre Vadasz siba_write_4_sub(struct siba_dev_softc *sd, uint16_t offset, uint32_t value)
867cab56aceSImre Vadasz {
868cab56aceSImre Vadasz 
869cab56aceSImre Vadasz 	sd->sd_ops->write_4(sd, offset, value);
870cab56aceSImre Vadasz }
871cab56aceSImre Vadasz 
872cab56aceSImre Vadasz void
siba_read_multi_1(device_t dev,void * buffer,size_t count,uint16_t offset)873cab56aceSImre Vadasz siba_read_multi_1(device_t dev, void *buffer, size_t count,
874cab56aceSImre Vadasz     uint16_t offset)
875cab56aceSImre Vadasz {
876cab56aceSImre Vadasz 	struct siba_dev_softc *sd = device_get_ivars(dev);
877cab56aceSImre Vadasz 
878cab56aceSImre Vadasz 	sd->sd_ops->read_multi_1(sd, buffer, count, offset);
879cab56aceSImre Vadasz }
880cab56aceSImre Vadasz 
881cab56aceSImre Vadasz void
siba_read_multi_2(device_t dev,void * buffer,size_t count,uint16_t offset)882cab56aceSImre Vadasz siba_read_multi_2(device_t dev, void *buffer, size_t count,
883cab56aceSImre Vadasz     uint16_t offset)
884cab56aceSImre Vadasz {
885cab56aceSImre Vadasz 	struct siba_dev_softc *sd = device_get_ivars(dev);
886cab56aceSImre Vadasz 
887cab56aceSImre Vadasz 	sd->sd_ops->read_multi_2(sd, buffer, count, offset);
888cab56aceSImre Vadasz }
889cab56aceSImre Vadasz 
890cab56aceSImre Vadasz void
siba_read_multi_4(device_t dev,void * buffer,size_t count,uint16_t offset)891cab56aceSImre Vadasz siba_read_multi_4(device_t dev, void *buffer, size_t count,
892cab56aceSImre Vadasz     uint16_t offset)
893cab56aceSImre Vadasz {
894cab56aceSImre Vadasz 	struct siba_dev_softc *sd = device_get_ivars(dev);
895cab56aceSImre Vadasz 
896cab56aceSImre Vadasz 	sd->sd_ops->read_multi_4(sd, buffer, count, offset);
897cab56aceSImre Vadasz }
898cab56aceSImre Vadasz 
899cab56aceSImre Vadasz void
siba_write_multi_1(device_t dev,const void * buffer,size_t count,uint16_t offset)900cab56aceSImre Vadasz siba_write_multi_1(device_t dev, const void *buffer, size_t count,
901cab56aceSImre Vadasz     uint16_t offset)
902cab56aceSImre Vadasz {
903cab56aceSImre Vadasz 	struct siba_dev_softc *sd = device_get_ivars(dev);
904cab56aceSImre Vadasz 
905cab56aceSImre Vadasz 	sd->sd_ops->write_multi_1(sd, buffer, count, offset);
906cab56aceSImre Vadasz }
907cab56aceSImre Vadasz 
908cab56aceSImre Vadasz void
siba_write_multi_2(device_t dev,const void * buffer,size_t count,uint16_t offset)909cab56aceSImre Vadasz siba_write_multi_2(device_t dev, const void *buffer, size_t count,
910cab56aceSImre Vadasz     uint16_t offset)
911cab56aceSImre Vadasz {
912cab56aceSImre Vadasz 	struct siba_dev_softc *sd = device_get_ivars(dev);
913cab56aceSImre Vadasz 
914cab56aceSImre Vadasz 	sd->sd_ops->write_multi_2(sd, buffer, count, offset);
915cab56aceSImre Vadasz }
916cab56aceSImre Vadasz 
917cab56aceSImre Vadasz void
siba_write_multi_4(device_t dev,const void * buffer,size_t count,uint16_t offset)918cab56aceSImre Vadasz siba_write_multi_4(device_t dev, const void *buffer, size_t count,
919cab56aceSImre Vadasz     uint16_t offset)
920cab56aceSImre Vadasz {
921cab56aceSImre Vadasz 	struct siba_dev_softc *sd = device_get_ivars(dev);
922cab56aceSImre Vadasz 
923cab56aceSImre Vadasz 	sd->sd_ops->write_multi_4(sd, buffer, count, offset);
924cab56aceSImre Vadasz }
925cab56aceSImre Vadasz 
926cab56aceSImre Vadasz static void
siba_cc_pmu_init(struct siba_cc * scc)927cab56aceSImre Vadasz siba_cc_pmu_init(struct siba_cc *scc)
928cab56aceSImre Vadasz {
929cab56aceSImre Vadasz 	const struct siba_cc_pmu_res_updown *updown = NULL;
930cab56aceSImre Vadasz 	const struct siba_cc_pmu_res_depend *depend = NULL;
931cab56aceSImre Vadasz 	struct siba_dev_softc *sd = scc->scc_dev;
932cab56aceSImre Vadasz 	struct siba_softc *siba = sd->sd_bus;
933cab56aceSImre Vadasz 	uint32_t min = 0, max = 0, pmucap;
934cab56aceSImre Vadasz 	unsigned int i, updown_size, depend_size;
935cab56aceSImre Vadasz 
936cab56aceSImre Vadasz 	if ((scc->scc_caps & SIBA_CC_CAPS_PMU) == 0)
937cab56aceSImre Vadasz 		return;
938cab56aceSImre Vadasz 
939cab56aceSImre Vadasz 	pmucap = SIBA_CC_READ32(scc, SIBA_CC_PMUCAPS);
940cab56aceSImre Vadasz 	scc->scc_pmu.rev = (pmucap & SIBA_CC_PMUCAPS_REV);
941cab56aceSImre Vadasz 
942cab56aceSImre Vadasz 	DPRINTF(siba, SIBA_DEBUG_PMU, "PMU(r%u) found (caps %#x)\n",
943cab56aceSImre Vadasz 	    scc->scc_pmu.rev, pmucap);
944cab56aceSImre Vadasz 
945cab56aceSImre Vadasz 	if (scc->scc_pmu.rev >= 1) {
946cab56aceSImre Vadasz 		if (siba->siba_chiprev < 2 && siba->siba_chipid == 0x4325)
947cab56aceSImre Vadasz 			SIBA_CC_MASK32(scc, SIBA_CC_PMUCTL,
948cab56aceSImre Vadasz 			    ~SIBA_CC_PMUCTL_NOILP);
949cab56aceSImre Vadasz 		else
950cab56aceSImre Vadasz 			SIBA_CC_SET32(scc, SIBA_CC_PMUCTL,
951cab56aceSImre Vadasz 			    SIBA_CC_PMUCTL_NOILP);
952cab56aceSImre Vadasz 	}
953cab56aceSImre Vadasz 
954cab56aceSImre Vadasz 	/* initialize PLL & PMU resources */
955cab56aceSImre Vadasz 	switch (siba->siba_chipid) {
956cab56aceSImre Vadasz 	case 0x4312:
957cab56aceSImre Vadasz 		siba_cc_pmu1_pll0_init(scc, 0 /* use default */);
958cab56aceSImre Vadasz 		/* use the default: min = 0xcbb max = 0x7ffff */
959cab56aceSImre Vadasz 		break;
960cab56aceSImre Vadasz 	case 0x4325:
961cab56aceSImre Vadasz 		siba_cc_pmu1_pll0_init(scc, 0 /* use default */);
962cab56aceSImre Vadasz 
963cab56aceSImre Vadasz 		updown = siba_cc_pmu_4325_updown;
964249483dfSAaron LI 		updown_size = nitems(siba_cc_pmu_4325_updown);
965cab56aceSImre Vadasz 		depend = siba_cc_pmu_4325_depend;
966249483dfSAaron LI 		depend_size = nitems(siba_cc_pmu_4325_depend);
967cab56aceSImre Vadasz 
968cab56aceSImre Vadasz 		min = (1 << SIBA_CC_PMU_4325_BURST) |
969cab56aceSImre Vadasz 		    (1 << SIBA_CC_PMU_4325_LN);
970cab56aceSImre Vadasz 		if (SIBA_CC_READ32(scc, SIBA_CC_CHIPSTAT) &
971cab56aceSImre Vadasz 		    SIBA_CC_CHST_4325_PMUTOP_2B)
972cab56aceSImre Vadasz 			min |= (1 << SIBA_CC_PMU_4325_CLBURST);
973cab56aceSImre Vadasz 		max = 0xfffff;
974cab56aceSImre Vadasz 		break;
975cab56aceSImre Vadasz 	case 0x4328:
976cab56aceSImre Vadasz 		siba_cc_pmu0_pll0_init(scc, 0 /* use default */);
977cab56aceSImre Vadasz 
978cab56aceSImre Vadasz 		updown = siba_cc_pmu_4328_updown;
979249483dfSAaron LI 		updown_size = nitems(siba_cc_pmu_4328_updown);
980cab56aceSImre Vadasz 		depend = siba_cc_pmu_4328_depend;
981249483dfSAaron LI 		depend_size = nitems(siba_cc_pmu_4328_depend);
982cab56aceSImre Vadasz 
983cab56aceSImre Vadasz 		min = (1 << SIBA_CC_PMU_4328_EXT_SWITCH_PWM) |
984cab56aceSImre Vadasz 			  (1 << SIBA_CC_PMU_4328_BB_SWITCH_PWM) |
985cab56aceSImre Vadasz 			  (1 << SIBA_CC_PMU_4328_CRYSTAL_EN);
986cab56aceSImre Vadasz 
987cab56aceSImre Vadasz 		max = 0xfffff;
988cab56aceSImre Vadasz 		break;
989cab56aceSImre Vadasz 	case 0x5354:
990cab56aceSImre Vadasz 		siba_cc_pmu0_pll0_init(scc, 0 /* use default */);
991cab56aceSImre Vadasz 
992cab56aceSImre Vadasz 		max = 0xfffff;
993cab56aceSImre Vadasz 		break;
994cab56aceSImre Vadasz 	default:
995cab56aceSImre Vadasz 		device_printf(siba->siba_dev,
996cab56aceSImre Vadasz 		    "unknown chipid %#x for PLL & PMU init\n",
997cab56aceSImre Vadasz 		    siba->siba_chipid);
998cab56aceSImre Vadasz 	}
999cab56aceSImre Vadasz 
1000cab56aceSImre Vadasz 	if (updown) {
1001cab56aceSImre Vadasz 		for (i = 0; i < updown_size; i++) {
1002cab56aceSImre Vadasz 			SIBA_CC_WRITE32(scc, SIBA_CC_PMU_TABSEL,
1003cab56aceSImre Vadasz 			    updown[i].res);
1004cab56aceSImre Vadasz 			SIBA_CC_WRITE32(scc, SIBA_CC_PMU_UPDNTM,
1005cab56aceSImre Vadasz 			    updown[i].updown);
1006cab56aceSImre Vadasz 		}
1007cab56aceSImre Vadasz 	}
1008cab56aceSImre Vadasz 	if (depend) {
1009cab56aceSImre Vadasz 		for (i = 0; i < depend_size; i++) {
1010cab56aceSImre Vadasz 			SIBA_CC_WRITE32(scc, SIBA_CC_PMU_TABSEL,
1011cab56aceSImre Vadasz 			    depend[i].res);
1012cab56aceSImre Vadasz 			switch (depend[i].task) {
1013cab56aceSImre Vadasz 			case SIBA_CC_PMU_DEP_SET:
1014cab56aceSImre Vadasz 				SIBA_CC_WRITE32(scc, SIBA_CC_PMU_DEPMSK,
1015cab56aceSImre Vadasz 				    depend[i].depend);
1016cab56aceSImre Vadasz 				break;
1017cab56aceSImre Vadasz 			case SIBA_CC_PMU_DEP_ADD:
1018cab56aceSImre Vadasz 				SIBA_CC_SET32(scc, SIBA_CC_PMU_DEPMSK,
1019cab56aceSImre Vadasz 				    depend[i].depend);
1020cab56aceSImre Vadasz 				break;
1021cab56aceSImre Vadasz 			case SIBA_CC_PMU_DEP_REMOVE:
1022cab56aceSImre Vadasz 				SIBA_CC_MASK32(scc, SIBA_CC_PMU_DEPMSK,
1023cab56aceSImre Vadasz 				    ~(depend[i].depend));
1024cab56aceSImre Vadasz 				break;
1025cab56aceSImre Vadasz 			default:
1026cab56aceSImre Vadasz 				KASSERT(0 == 1,
1027cab56aceSImre Vadasz 				    ("%s:%d: assertion failed",
1028cab56aceSImre Vadasz 					__func__, __LINE__));
1029cab56aceSImre Vadasz 			}
1030cab56aceSImre Vadasz 		}
1031cab56aceSImre Vadasz 	}
1032cab56aceSImre Vadasz 
1033cab56aceSImre Vadasz 	if (min)
1034cab56aceSImre Vadasz 		SIBA_CC_WRITE32(scc, SIBA_CC_PMU_MINRES, min);
1035cab56aceSImre Vadasz 	if (max)
1036cab56aceSImre Vadasz 		SIBA_CC_WRITE32(scc, SIBA_CC_PMU_MAXRES, max);
1037cab56aceSImre Vadasz }
1038cab56aceSImre Vadasz 
1039cab56aceSImre Vadasz static void
siba_cc_power_init(struct siba_cc * scc)1040cab56aceSImre Vadasz siba_cc_power_init(struct siba_cc *scc)
1041cab56aceSImre Vadasz {
1042cab56aceSImre Vadasz 	struct siba_softc *siba = scc->scc_dev->sd_bus;
1043cab56aceSImre Vadasz 	int maxfreq;
1044cab56aceSImre Vadasz 
1045cab56aceSImre Vadasz 	if (siba->siba_chipid == 0x4321) {
1046cab56aceSImre Vadasz 		if (siba->siba_chiprev == 0)
1047cab56aceSImre Vadasz 			SIBA_CC_WRITE32(scc, SIBA_CC_CHIPCTL, 0x3a4);
1048cab56aceSImre Vadasz 		else if (siba->siba_chiprev == 1)
1049cab56aceSImre Vadasz 			SIBA_CC_WRITE32(scc, SIBA_CC_CHIPCTL, 0xa4);
1050cab56aceSImre Vadasz 	}
1051cab56aceSImre Vadasz 
1052cab56aceSImre Vadasz 	if ((scc->scc_caps & SIBA_CC_CAPS_PWCTL) == 0)
1053cab56aceSImre Vadasz 		return;
1054cab56aceSImre Vadasz 
1055cab56aceSImre Vadasz 	if (scc->scc_dev->sd_id.sd_rev >= 10)
1056cab56aceSImre Vadasz 		SIBA_CC_WRITE32(scc, SIBA_CC_CLKSYSCTL,
1057cab56aceSImre Vadasz 		    (SIBA_CC_READ32(scc, SIBA_CC_CLKSYSCTL) &
1058cab56aceSImre Vadasz 		    0xffff) | 0x40000);
1059cab56aceSImre Vadasz 	else {
1060cab56aceSImre Vadasz 		maxfreq = siba_cc_clockfreq(scc, 1);
1061cab56aceSImre Vadasz 		SIBA_CC_WRITE32(scc, SIBA_CC_PLLONDELAY,
1062cab56aceSImre Vadasz 		    (maxfreq * 150 + 999999) / 1000000);
1063cab56aceSImre Vadasz 		SIBA_CC_WRITE32(scc, SIBA_CC_FREFSELDELAY,
1064cab56aceSImre Vadasz 		    (maxfreq * 15 + 999999) / 1000000);
1065cab56aceSImre Vadasz 	}
1066cab56aceSImre Vadasz }
1067cab56aceSImre Vadasz 
1068cab56aceSImre Vadasz static void
siba_cc_powerup_delay(struct siba_cc * scc)1069cab56aceSImre Vadasz siba_cc_powerup_delay(struct siba_cc *scc)
1070cab56aceSImre Vadasz {
1071cab56aceSImre Vadasz 	struct siba_softc *siba = scc->scc_dev->sd_bus;
1072cab56aceSImre Vadasz 	int min;
1073cab56aceSImre Vadasz 
1074cab56aceSImre Vadasz 	if (siba->siba_type != SIBA_TYPE_PCI ||
1075cab56aceSImre Vadasz 	    !(scc->scc_caps & SIBA_CC_CAPS_PWCTL))
1076cab56aceSImre Vadasz 		return;
1077cab56aceSImre Vadasz 
1078cab56aceSImre Vadasz 	min = siba_cc_clockfreq(scc, 0);
1079cab56aceSImre Vadasz 	scc->scc_powerup_delay =
10807872accfSImre Vadász 	    howmany((SIBA_CC_READ32(scc, SIBA_CC_PLLONDELAY) + 2) * 1000000,
10817872accfSImre Vadász 	    min);
1082cab56aceSImre Vadasz }
1083cab56aceSImre Vadasz 
1084cab56aceSImre Vadasz static int
siba_cc_clockfreq(struct siba_cc * scc,int max)1085cab56aceSImre Vadasz siba_cc_clockfreq(struct siba_cc *scc, int max)
1086cab56aceSImre Vadasz {
1087cab56aceSImre Vadasz 	enum siba_clksrc src;
1088cab56aceSImre Vadasz 	int div = 1, limit = 0;
1089cab56aceSImre Vadasz 
1090cab56aceSImre Vadasz 	src = siba_cc_clksrc(scc);
1091cab56aceSImre Vadasz 	if (scc->scc_dev->sd_id.sd_rev < 6) {
1092cab56aceSImre Vadasz 		div = (src == SIBA_CC_CLKSRC_PCI) ? 64 :
1093cab56aceSImre Vadasz 		    (src == SIBA_CC_CLKSRC_CRYSTAL) ? 32 : 1;
1094cab56aceSImre Vadasz 		KASSERT(div != 1,
1095cab56aceSImre Vadasz 		    ("%s: unknown clock %d", __func__, src));
1096cab56aceSImre Vadasz 	} else if (scc->scc_dev->sd_id.sd_rev < 10) {
1097cab56aceSImre Vadasz 		switch (src) {
1098cab56aceSImre Vadasz 		case SIBA_CC_CLKSRC_CRYSTAL:
1099cab56aceSImre Vadasz 		case SIBA_CC_CLKSRC_PCI:
1100cab56aceSImre Vadasz 			div = ((SIBA_CC_READ32(scc, SIBA_CC_CLKSLOW) >> 16) +
1101cab56aceSImre Vadasz 			    1) * 4;
1102cab56aceSImre Vadasz 			break;
1103cab56aceSImre Vadasz 		case SIBA_CC_CLKSRC_LOWPW:
1104cab56aceSImre Vadasz 			break;
1105cab56aceSImre Vadasz 		}
1106cab56aceSImre Vadasz 	} else
1107cab56aceSImre Vadasz 		div = ((SIBA_CC_READ32(scc, SIBA_CC_CLKSYSCTL) >> 16) + 1) * 4;
1108cab56aceSImre Vadasz 
1109cab56aceSImre Vadasz 	switch (src) {
1110cab56aceSImre Vadasz 	case SIBA_CC_CLKSRC_CRYSTAL:
1111cab56aceSImre Vadasz 		limit = (max) ? 20200000 : 19800000;
1112cab56aceSImre Vadasz 		break;
1113cab56aceSImre Vadasz 	case SIBA_CC_CLKSRC_LOWPW:
1114cab56aceSImre Vadasz 		limit = (max) ? 43000 : 25000;
1115cab56aceSImre Vadasz 		break;
1116cab56aceSImre Vadasz 	case SIBA_CC_CLKSRC_PCI:
1117cab56aceSImre Vadasz 		limit = (max) ? 34000000 : 25000000;
1118cab56aceSImre Vadasz 		break;
1119cab56aceSImre Vadasz 	}
1120cab56aceSImre Vadasz 
1121cab56aceSImre Vadasz 	return (limit / div);
1122cab56aceSImre Vadasz }
1123cab56aceSImre Vadasz 
1124cab56aceSImre Vadasz static void
siba_cc_pmu1_pll0_init(struct siba_cc * scc,uint32_t freq)1125cab56aceSImre Vadasz siba_cc_pmu1_pll0_init(struct siba_cc *scc, uint32_t freq)
1126cab56aceSImre Vadasz {
1127cab56aceSImre Vadasz 	struct siba_dev_softc *sd = scc->scc_dev;
1128cab56aceSImre Vadasz 	struct siba_softc *siba = sd->sd_bus;
1129cab56aceSImre Vadasz 	const struct siba_cc_pmu1_plltab *e = NULL;
1130cab56aceSImre Vadasz 	uint32_t bufsth = 0, pll, pmu;
1131cab56aceSImre Vadasz 	unsigned int i;
1132cab56aceSImre Vadasz 
1133cab56aceSImre Vadasz 	KASSERT(freq == 0, ("%s:%d: assertion vail", __func__, __LINE__));
1134cab56aceSImre Vadasz 	if (siba->siba_chipid == 0x4312) {
1135cab56aceSImre Vadasz 		scc->scc_pmu.freq = 20000;
1136cab56aceSImre Vadasz 		return;
1137cab56aceSImre Vadasz 	}
1138cab56aceSImre Vadasz 
1139cab56aceSImre Vadasz 	e = siba_cc_pmu1_plltab_find(SIBA_CC_PMU1_DEFAULT_FREQ);
1140cab56aceSImre Vadasz 	KASSERT(e != NULL, ("%s:%d: assertion vail", __func__, __LINE__));
1141cab56aceSImre Vadasz 	scc->scc_pmu.freq = e->freq;
1142cab56aceSImre Vadasz 
1143cab56aceSImre Vadasz 	pmu = SIBA_CC_READ32(scc, SIBA_CC_PMUCTL);
1144cab56aceSImre Vadasz 	if (SIBA_CC_PMUCTL_XF_VAL(pmu) == e->xf)
1145cab56aceSImre Vadasz 		return;
1146cab56aceSImre Vadasz 
1147cab56aceSImre Vadasz 	DPRINTF(siba, SIBA_DEBUG_PLL, "change PLL value to %u.%03u MHz\n",
1148cab56aceSImre Vadasz 	    (e->freq / 1000), (e->freq % 1000));
1149cab56aceSImre Vadasz 
1150cab56aceSImre Vadasz 	/* turn PLL off */
1151cab56aceSImre Vadasz 	switch (siba->siba_chipid) {
1152cab56aceSImre Vadasz 	case 0x4325:
1153cab56aceSImre Vadasz 		bufsth = 0x222222;
1154cab56aceSImre Vadasz 		SIBA_CC_MASK32(scc, SIBA_CC_PMU_MINRES,
1155cab56aceSImre Vadasz 		    ~((1 << SIBA_CC_PMU_4325_BBPLL_PWR) |
1156cab56aceSImre Vadasz 		      (1 << SIBA_CC_PMU_4325_HT)));
1157cab56aceSImre Vadasz 		SIBA_CC_MASK32(scc, SIBA_CC_PMU_MAXRES,
1158cab56aceSImre Vadasz 		    ~((1 << SIBA_CC_PMU_4325_BBPLL_PWR) |
1159cab56aceSImre Vadasz 		      (1 << SIBA_CC_PMU_4325_HT)));
1160cab56aceSImre Vadasz 		break;
1161cab56aceSImre Vadasz 	default:
1162cab56aceSImre Vadasz 		KASSERT(0 == 1,
1163cab56aceSImre Vadasz 		    ("%s:%d: assertion failed", __func__, __LINE__));
1164cab56aceSImre Vadasz 	}
1165cab56aceSImre Vadasz 	for (i = 0; i < 1500; i++) {
1166cab56aceSImre Vadasz 		if (!(SIBA_CC_READ32(scc, SIBA_CC_CLKCTLSTATUS) &
1167cab56aceSImre Vadasz 		      SIBA_CC_CLKCTLSTATUS_HT))
1168cab56aceSImre Vadasz 			break;
1169cab56aceSImre Vadasz 		DELAY(10);
1170cab56aceSImre Vadasz 	}
1171cab56aceSImre Vadasz 	if (SIBA_CC_READ32(scc, SIBA_CC_CLKCTLSTATUS) & SIBA_CC_CLKCTLSTATUS_HT)
1172cab56aceSImre Vadasz 		device_printf(siba->siba_dev, "failed to turn PLL off!\n");
1173cab56aceSImre Vadasz 
1174cab56aceSImre Vadasz 	pll = siba_cc_pll_read(scc, SIBA_CC_PMU1_PLL0);
1175cab56aceSImre Vadasz 	pll &= ~(SIBA_CC_PMU1_PLL0_P1DIV | SIBA_CC_PMU1_PLL0_P2DIV);
1176cab56aceSImre Vadasz 	pll |= ((uint32_t)e->p1div << 20) & SIBA_CC_PMU1_PLL0_P1DIV;
1177cab56aceSImre Vadasz 	pll |= ((uint32_t)e->p2div << 24) & SIBA_CC_PMU1_PLL0_P2DIV;
1178cab56aceSImre Vadasz 	siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL0, pll);
1179cab56aceSImre Vadasz 
1180cab56aceSImre Vadasz 	pll = siba_cc_pll_read(scc, SIBA_CC_PMU1_PLL2);
1181cab56aceSImre Vadasz 	pll &= ~(SIBA_CC_PMU1_PLL2_NDIVINT | SIBA_CC_PMU1_PLL2_NDIVMODE);
1182cab56aceSImre Vadasz 	pll |= ((uint32_t)e->ndiv_int << 20) & SIBA_CC_PMU1_PLL2_NDIVINT;
1183cab56aceSImre Vadasz 	pll |= (1 << 17) & SIBA_CC_PMU1_PLL2_NDIVMODE;
1184cab56aceSImre Vadasz 	siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL2, pll);
1185cab56aceSImre Vadasz 
1186cab56aceSImre Vadasz 	pll = siba_cc_pll_read(scc, SIBA_CC_PMU1_PLL3);
1187cab56aceSImre Vadasz 	pll &= ~SIBA_CC_PMU1_PLL3_NDIVFRAC;
1188cab56aceSImre Vadasz 	pll |= ((uint32_t)e->ndiv_frac << 0) & SIBA_CC_PMU1_PLL3_NDIVFRAC;
1189cab56aceSImre Vadasz 	siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL3, pll);
1190cab56aceSImre Vadasz 
1191cab56aceSImre Vadasz 	if (bufsth) {
1192cab56aceSImre Vadasz 		pll = siba_cc_pll_read(scc, SIBA_CC_PMU1_PLL5);
1193cab56aceSImre Vadasz 		pll &= ~SIBA_CC_PMU1_PLL5_CLKDRV;
1194cab56aceSImre Vadasz 		pll |= (bufsth << 8) & SIBA_CC_PMU1_PLL5_CLKDRV;
1195cab56aceSImre Vadasz 		siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL5, pll);
1196cab56aceSImre Vadasz 	}
1197cab56aceSImre Vadasz 
1198cab56aceSImre Vadasz 	pmu = SIBA_CC_READ32(scc, SIBA_CC_PMUCTL);
1199cab56aceSImre Vadasz 	pmu &= ~(SIBA_CC_PMUCTL_ILP | SIBA_CC_PMUCTL_XF);
1200cab56aceSImre Vadasz 	pmu |= ((((uint32_t)e->freq + 127) / 128 - 1) << 16) &
1201cab56aceSImre Vadasz 	    SIBA_CC_PMUCTL_ILP;
1202cab56aceSImre Vadasz 	pmu |= ((uint32_t)e->xf << 2) & SIBA_CC_PMUCTL_XF;
1203cab56aceSImre Vadasz 	SIBA_CC_WRITE32(scc, SIBA_CC_PMUCTL, pmu);
1204cab56aceSImre Vadasz }
1205cab56aceSImre Vadasz 
1206cab56aceSImre Vadasz static void
siba_cc_pmu0_pll0_init(struct siba_cc * scc,uint32_t xtalfreq)1207cab56aceSImre Vadasz siba_cc_pmu0_pll0_init(struct siba_cc *scc, uint32_t xtalfreq)
1208cab56aceSImre Vadasz {
1209cab56aceSImre Vadasz 	struct siba_dev_softc *sd = scc->scc_dev;
1210cab56aceSImre Vadasz 	struct siba_softc *siba = sd->sd_bus;
1211cab56aceSImre Vadasz 	const struct siba_cc_pmu0_plltab *e = NULL;
1212cab56aceSImre Vadasz 	uint32_t pmu, tmp, pll;
1213cab56aceSImre Vadasz 	unsigned int i;
1214cab56aceSImre Vadasz 
1215cab56aceSImre Vadasz 	if ((siba->siba_chipid == 0x5354) && !xtalfreq)
1216cab56aceSImre Vadasz 		xtalfreq = 25000;
1217cab56aceSImre Vadasz 	if (xtalfreq)
1218cab56aceSImre Vadasz 		e = siba_cc_pmu0_plltab_findentry(xtalfreq);
12197872accfSImre Vadász 	if (!e)
1220cab56aceSImre Vadasz 		e = siba_cc_pmu0_plltab_findentry(
1221cab56aceSImre Vadasz 		    SIBA_CC_PMU0_DEFAULT_XTALFREQ);
1222cab56aceSImre Vadasz 	KASSERT(e != NULL, ("%s:%d: fail", __func__, __LINE__));
1223cab56aceSImre Vadasz 	xtalfreq = e->freq;
1224cab56aceSImre Vadasz 	scc->scc_pmu.freq = e->freq;
1225cab56aceSImre Vadasz 
1226cab56aceSImre Vadasz 	pmu = SIBA_CC_READ32(scc, SIBA_CC_PMUCTL);
1227cab56aceSImre Vadasz 	if (((pmu & SIBA_CC_PMUCTL_XF) >> 2) == e->xf)
1228cab56aceSImre Vadasz 		return;
1229cab56aceSImre Vadasz 
1230cab56aceSImre Vadasz 	DPRINTF(siba, SIBA_DEBUG_PLL, "change PLL value to %u.%03u MHz\n",
1231cab56aceSImre Vadasz 	    (xtalfreq / 1000), (xtalfreq % 1000));
1232cab56aceSImre Vadasz 
1233cab56aceSImre Vadasz 	KASSERT(siba->siba_chipid == 0x4328 || siba->siba_chipid == 0x5354,
1234cab56aceSImre Vadasz 	    ("%s:%d: fail", __func__, __LINE__));
1235cab56aceSImre Vadasz 
1236cab56aceSImre Vadasz 	switch (siba->siba_chipid) {
1237cab56aceSImre Vadasz 	case 0x4328:
1238cab56aceSImre Vadasz 		SIBA_CC_MASK32(scc, SIBA_CC_PMU_MINRES,
1239cab56aceSImre Vadasz 		    ~(1 << SIBA_CC_PMU_4328_BB_PLL_PU));
1240cab56aceSImre Vadasz 		SIBA_CC_MASK32(scc, SIBA_CC_PMU_MAXRES,
1241cab56aceSImre Vadasz 		    ~(1 << SIBA_CC_PMU_4328_BB_PLL_PU));
1242cab56aceSImre Vadasz 		break;
1243cab56aceSImre Vadasz 	case 0x5354:
1244cab56aceSImre Vadasz 		SIBA_CC_MASK32(scc, SIBA_CC_PMU_MINRES,
1245cab56aceSImre Vadasz 		    ~(1 << SIBA_CC_PMU_5354_BB_PLL_PU));
1246cab56aceSImre Vadasz 		SIBA_CC_MASK32(scc, SIBA_CC_PMU_MAXRES,
1247cab56aceSImre Vadasz 		    ~(1 << SIBA_CC_PMU_5354_BB_PLL_PU));
1248cab56aceSImre Vadasz 		break;
1249cab56aceSImre Vadasz 	}
1250cab56aceSImre Vadasz 	for (i = 1500; i; i--) {
1251cab56aceSImre Vadasz 		tmp = SIBA_CC_READ32(scc, SIBA_CC_CLKCTLSTATUS);
1252cab56aceSImre Vadasz 		if (!(tmp & SIBA_CC_CLKCTLSTATUS_HT))
1253cab56aceSImre Vadasz 			break;
1254cab56aceSImre Vadasz 		DELAY(10);
1255cab56aceSImre Vadasz 	}
1256cab56aceSImre Vadasz 	tmp = SIBA_CC_READ32(scc, SIBA_CC_CLKCTLSTATUS);
1257cab56aceSImre Vadasz 	if (tmp & SIBA_CC_CLKCTLSTATUS_HT)
1258cab56aceSImre Vadasz 		device_printf(siba->siba_dev, "failed to turn PLL off!\n");
1259cab56aceSImre Vadasz 
1260cab56aceSImre Vadasz 	/* set PDIV */
1261cab56aceSImre Vadasz 	pll = siba_cc_pll_read(scc, SIBA_CC_PMU0_PLL0);
1262cab56aceSImre Vadasz 	if (xtalfreq >= SIBA_CC_PMU0_PLL0_PDIV_FREQ)
1263cab56aceSImre Vadasz 		pll |= SIBA_CC_PMU0_PLL0_PDIV_MSK;
1264cab56aceSImre Vadasz 	else
1265cab56aceSImre Vadasz 		pll &= ~SIBA_CC_PMU0_PLL0_PDIV_MSK;
1266cab56aceSImre Vadasz 	siba_cc_pll_write(scc, SIBA_CC_PMU0_PLL0, pll);
1267cab56aceSImre Vadasz 
1268cab56aceSImre Vadasz 	/* set WILD */
1269cab56aceSImre Vadasz 	pll = siba_cc_pll_read(scc, SIBA_CC_PMU0_PLL1);
1270cab56aceSImre Vadasz 	pll &= ~(SIBA_CC_PMU0_PLL1_STOPMOD | SIBA_CC_PMU0_PLL1_IMSK |
1271cab56aceSImre Vadasz 	    SIBA_CC_PMU0_PLL1_FMSK);
1272cab56aceSImre Vadasz 	pll |= ((uint32_t)e->wb_int << 28) & SIBA_CC_PMU0_PLL1_IMSK;
1273cab56aceSImre Vadasz 	pll |= ((uint32_t)e->wb_frac << 8) & SIBA_CC_PMU0_PLL1_FMSK;
1274cab56aceSImre Vadasz 	if (e->wb_frac == 0)
1275cab56aceSImre Vadasz 		pll |= SIBA_CC_PMU0_PLL1_STOPMOD;
1276cab56aceSImre Vadasz 	siba_cc_pll_write(scc, SIBA_CC_PMU0_PLL1, pll);
1277cab56aceSImre Vadasz 
1278cab56aceSImre Vadasz 	/* set WILD */
1279cab56aceSImre Vadasz 	pll = siba_cc_pll_read(scc, SIBA_CC_PMU0_PLL2);
1280cab56aceSImre Vadasz 	pll &= ~SIBA_CC_PMU0_PLL2_IMSKHI;
1281cab56aceSImre Vadasz 	pll |= (((uint32_t)e->wb_int >> 4) << 0) & SIBA_CC_PMU0_PLL2_IMSKHI;
1282cab56aceSImre Vadasz 	siba_cc_pll_write(scc, SIBA_CC_PMU0_PLL2, pll);
1283cab56aceSImre Vadasz 
1284cab56aceSImre Vadasz 	/* set freq and divisor. */
1285cab56aceSImre Vadasz 	pmu = SIBA_CC_READ32(scc, SIBA_CC_PMUCTL);
1286cab56aceSImre Vadasz 	pmu &= ~SIBA_CC_PMUCTL_ILP;
1287cab56aceSImre Vadasz 	pmu |= (((xtalfreq + 127) / 128 - 1) << 16) & SIBA_CC_PMUCTL_ILP;
1288cab56aceSImre Vadasz 	pmu &= ~SIBA_CC_PMUCTL_XF;
1289cab56aceSImre Vadasz 	pmu |= ((uint32_t)e->xf << 2) & SIBA_CC_PMUCTL_XF;
1290cab56aceSImre Vadasz 	SIBA_CC_WRITE32(scc, SIBA_CC_PMUCTL, pmu);
1291cab56aceSImre Vadasz }
1292cab56aceSImre Vadasz 
1293cab56aceSImre Vadasz static enum siba_clksrc
siba_cc_clksrc(struct siba_cc * scc)1294cab56aceSImre Vadasz siba_cc_clksrc(struct siba_cc *scc)
1295cab56aceSImre Vadasz {
1296cab56aceSImre Vadasz 	struct siba_dev_softc *sd = scc->scc_dev;
1297cab56aceSImre Vadasz 	struct siba_softc *siba = sd->sd_bus;
1298cab56aceSImre Vadasz 
1299cab56aceSImre Vadasz 	if (sd->sd_id.sd_rev < 6) {
1300cab56aceSImre Vadasz 		if (siba->siba_type == SIBA_TYPE_PCI) {
1301cab56aceSImre Vadasz 			if (pci_read_config(siba->siba_dev, SIBA_GPIO_OUT, 4) &
1302cab56aceSImre Vadasz 			    0x10)
1303cab56aceSImre Vadasz 				return (SIBA_CC_CLKSRC_PCI);
1304cab56aceSImre Vadasz 			return (SIBA_CC_CLKSRC_CRYSTAL);
1305cab56aceSImre Vadasz 		}
1306cab56aceSImre Vadasz 		if (siba->siba_type == SIBA_TYPE_SSB ||
1307cab56aceSImre Vadasz 		    siba->siba_type == SIBA_TYPE_PCMCIA)
1308cab56aceSImre Vadasz 			return (SIBA_CC_CLKSRC_CRYSTAL);
1309cab56aceSImre Vadasz 	}
1310cab56aceSImre Vadasz 	if (sd->sd_id.sd_rev < 10) {
1311cab56aceSImre Vadasz 		switch (SIBA_CC_READ32(scc, SIBA_CC_CLKSLOW) & 0x7) {
1312cab56aceSImre Vadasz 		case 0:
1313cab56aceSImre Vadasz 			return (SIBA_CC_CLKSRC_LOWPW);
1314cab56aceSImre Vadasz 		case 1:
1315cab56aceSImre Vadasz 			return (SIBA_CC_CLKSRC_CRYSTAL);
1316cab56aceSImre Vadasz 		case 2:
1317cab56aceSImre Vadasz 			return (SIBA_CC_CLKSRC_PCI);
1318cab56aceSImre Vadasz 		default:
1319cab56aceSImre Vadasz 			break;
1320cab56aceSImre Vadasz 		}
1321cab56aceSImre Vadasz 	}
1322cab56aceSImre Vadasz 
1323cab56aceSImre Vadasz 	return (SIBA_CC_CLKSRC_CRYSTAL);
1324cab56aceSImre Vadasz }
1325cab56aceSImre Vadasz 
1326cab56aceSImre Vadasz static const struct siba_cc_pmu1_plltab *
siba_cc_pmu1_plltab_find(uint32_t crystalfreq)1327cab56aceSImre Vadasz siba_cc_pmu1_plltab_find(uint32_t crystalfreq)
1328cab56aceSImre Vadasz {
1329cab56aceSImre Vadasz 	const struct siba_cc_pmu1_plltab *e;
1330cab56aceSImre Vadasz 	unsigned int i;
1331cab56aceSImre Vadasz 
1332249483dfSAaron LI 	for (i = 0; i < nitems(siba_cc_pmu1_plltab); i++) {
1333cab56aceSImre Vadasz 		e = &siba_cc_pmu1_plltab[i];
1334cab56aceSImre Vadasz 		if (crystalfreq == e->freq)
1335cab56aceSImre Vadasz 			return (e);
1336cab56aceSImre Vadasz 	}
1337cab56aceSImre Vadasz 
1338cab56aceSImre Vadasz 	return (NULL);
1339cab56aceSImre Vadasz }
1340cab56aceSImre Vadasz 
1341cab56aceSImre Vadasz static uint32_t
siba_cc_pll_read(struct siba_cc * scc,uint32_t offset)1342cab56aceSImre Vadasz siba_cc_pll_read(struct siba_cc *scc, uint32_t offset)
1343cab56aceSImre Vadasz {
1344cab56aceSImre Vadasz 
1345cab56aceSImre Vadasz 	SIBA_CC_WRITE32(scc, SIBA_CC_PLLCTL_ADDR, offset);
1346cab56aceSImre Vadasz 	return (SIBA_CC_READ32(scc, SIBA_CC_PLLCTL_DATA));
1347cab56aceSImre Vadasz }
1348cab56aceSImre Vadasz 
1349cab56aceSImre Vadasz static void
siba_cc_pll_write(struct siba_cc * scc,uint32_t offset,uint32_t value)1350cab56aceSImre Vadasz siba_cc_pll_write(struct siba_cc *scc, uint32_t offset, uint32_t value)
1351cab56aceSImre Vadasz {
1352cab56aceSImre Vadasz 
1353cab56aceSImre Vadasz 	SIBA_CC_WRITE32(scc, SIBA_CC_PLLCTL_ADDR, offset);
1354cab56aceSImre Vadasz 	SIBA_CC_WRITE32(scc, SIBA_CC_PLLCTL_DATA, value);
1355cab56aceSImre Vadasz }
1356cab56aceSImre Vadasz 
1357cab56aceSImre Vadasz static const struct siba_cc_pmu0_plltab *
siba_cc_pmu0_plltab_findentry(uint32_t crystalfreq)1358cab56aceSImre Vadasz siba_cc_pmu0_plltab_findentry(uint32_t crystalfreq)
1359cab56aceSImre Vadasz {
1360cab56aceSImre Vadasz 	const struct siba_cc_pmu0_plltab *e;
1361cab56aceSImre Vadasz 	unsigned int i;
1362cab56aceSImre Vadasz 
1363249483dfSAaron LI 	for (i = 0; i < nitems(siba_cc_pmu0_plltab); i++) {
1364cab56aceSImre Vadasz 		e = &siba_cc_pmu0_plltab[i];
1365cab56aceSImre Vadasz 		if (e->freq == crystalfreq)
1366cab56aceSImre Vadasz 			return (e);
1367cab56aceSImre Vadasz 	}
1368cab56aceSImre Vadasz 
1369cab56aceSImre Vadasz 	return (NULL);
1370cab56aceSImre Vadasz }
1371cab56aceSImre Vadasz 
1372cab56aceSImre Vadasz static int
siba_pci_sprom(struct siba_softc * siba,struct siba_sprom * sprom)1373cab56aceSImre Vadasz siba_pci_sprom(struct siba_softc *siba, struct siba_sprom *sprom)
1374cab56aceSImre Vadasz {
1375cab56aceSImre Vadasz 	int error = ENOMEM;
1376cab56aceSImre Vadasz 	uint16_t *buf;
1377cab56aceSImre Vadasz 
1378a0ab8429SImre Vadasz 	buf = kmalloc(SIBA_SPROMSIZE_R123 * sizeof(uint16_t),
1379a0ab8429SImre Vadasz 	    M_DEVBUF, M_INTWAIT | M_ZERO);
13807872accfSImre Vadász 	if (buf == NULL)
13817872accfSImre Vadász 		return (ENOMEM);
1382cab56aceSImre Vadasz 	siba_sprom_read(siba, buf, SIBA_SPROMSIZE_R123);
1383cab56aceSImre Vadasz 	error = sprom_check_crc(buf, siba->siba_spromsize);
1384cab56aceSImre Vadasz 	if (error) {
1385a0ab8429SImre Vadasz 		kfree(buf, M_DEVBUF);
1386a0ab8429SImre Vadasz 		buf = kmalloc(SIBA_SPROMSIZE_R4 * sizeof(uint16_t),
1387a0ab8429SImre Vadasz 		    M_DEVBUF, M_INTWAIT | M_ZERO);
13887872accfSImre Vadász 		if (buf == NULL)
13897872accfSImre Vadász 			return (ENOMEM);
1390cab56aceSImre Vadasz 		siba_sprom_read(siba, buf, SIBA_SPROMSIZE_R4);
1391cab56aceSImre Vadasz 		error = sprom_check_crc(buf, siba->siba_spromsize);
1392cab56aceSImre Vadasz 		if (error)
1393cab56aceSImre Vadasz 			device_printf(siba->siba_dev, "warn: bad SPROM CRC\n");
1394cab56aceSImre Vadasz 	}
1395cab56aceSImre Vadasz 
1396cab56aceSImre Vadasz 	bzero(sprom, sizeof(*sprom));
1397cab56aceSImre Vadasz 
1398cab56aceSImre Vadasz 	sprom->rev = buf[siba->siba_spromsize - 1] & 0x00FF;
1399cab56aceSImre Vadasz 	DPRINTF(siba, SIBA_DEBUG_SPROM, "SPROM rev %d\n",
1400cab56aceSImre Vadasz 	    sprom->rev);
1401cab56aceSImre Vadasz 	memset(sprom->mac_eth, 0xff, 6);
1402cab56aceSImre Vadasz 	memset(sprom->mac_80211a, 0xff, 6);
1403cab56aceSImre Vadasz 	if ((siba->siba_chipid & 0xff00) == 0x4400) {
1404cab56aceSImre Vadasz 		sprom->rev = 1;
1405cab56aceSImre Vadasz 		siba_sprom_r123(sprom, buf);
1406cab56aceSImre Vadasz 	} else if (siba->siba_chipid == 0x4321) {
1407cab56aceSImre Vadasz 		sprom->rev = 4;
1408cab56aceSImre Vadasz 		siba_sprom_r45(sprom, buf);
1409cab56aceSImre Vadasz 	} else {
1410cab56aceSImre Vadasz 		switch (sprom->rev) {
1411cab56aceSImre Vadasz 		case 1:
1412cab56aceSImre Vadasz 		case 2:
1413cab56aceSImre Vadasz 		case 3:
1414cab56aceSImre Vadasz 			siba_sprom_r123(sprom, buf);
1415cab56aceSImre Vadasz 			break;
1416cab56aceSImre Vadasz 		case 4:
1417cab56aceSImre Vadasz 		case 5:
1418cab56aceSImre Vadasz 			siba_sprom_r45(sprom, buf);
1419cab56aceSImre Vadasz 			break;
1420cab56aceSImre Vadasz 		case 8:
1421cab56aceSImre Vadasz 			siba_sprom_r8(sprom, buf);
1422cab56aceSImre Vadasz 			break;
1423cab56aceSImre Vadasz 		default:
1424cab56aceSImre Vadasz 			device_printf(siba->siba_dev,
1425cab56aceSImre Vadasz 			    "unknown SPROM revision %d.\n", sprom->rev);
1426cab56aceSImre Vadasz 			siba_sprom_r123(sprom, buf);
1427cab56aceSImre Vadasz 		}
1428cab56aceSImre Vadasz 	}
1429cab56aceSImre Vadasz 
1430cab56aceSImre Vadasz 	if (sprom->bf_lo == 0xffff)
1431cab56aceSImre Vadasz 		sprom->bf_lo = 0;
1432cab56aceSImre Vadasz 	if (sprom->bf_hi == 0xffff)
1433cab56aceSImre Vadasz 		sprom->bf_hi = 0;
1434cab56aceSImre Vadasz 
1435a0ab8429SImre Vadasz 	kfree(buf, M_DEVBUF);
1436cab56aceSImre Vadasz 	return (error);
1437cab56aceSImre Vadasz }
1438cab56aceSImre Vadasz 
1439cab56aceSImre Vadasz static int
siba_sprom_read(struct siba_softc * siba,uint16_t * sprom,uint16_t len)1440cab56aceSImre Vadasz siba_sprom_read(struct siba_softc *siba, uint16_t *sprom, uint16_t len)
1441cab56aceSImre Vadasz {
1442cab56aceSImre Vadasz 	int i;
1443cab56aceSImre Vadasz 
1444cab56aceSImre Vadasz 	for (i = 0; i < len; i++)
1445cab56aceSImre Vadasz 		sprom[i] = SIBA_READ_2(siba, SIBA_SPROM_BASE + (i * 2));
1446cab56aceSImre Vadasz 
1447cab56aceSImre Vadasz 	siba->siba_spromsize = len;
1448cab56aceSImre Vadasz 	return (0);
1449cab56aceSImre Vadasz }
1450cab56aceSImre Vadasz 
1451cab56aceSImre Vadasz static int
sprom_check_crc(const uint16_t * sprom,size_t size)1452cab56aceSImre Vadasz sprom_check_crc(const uint16_t *sprom, size_t size)
1453cab56aceSImre Vadasz {
1454cab56aceSImre Vadasz 	int word;
1455cab56aceSImre Vadasz 	uint8_t crc0, crc1 = 0xff;
1456cab56aceSImre Vadasz 
1457cab56aceSImre Vadasz 	crc0 = (sprom[size - 1] & SIBA_SPROM_REV_CRC) >> 8;
1458cab56aceSImre Vadasz 	for (word = 0; word < size - 1; word++) {
1459cab56aceSImre Vadasz 		crc1 = siba_crc8(crc1, sprom[word] & 0x00ff);
1460cab56aceSImre Vadasz 		crc1 = siba_crc8(crc1, (sprom[word] & 0xff00) >> 8);
1461cab56aceSImre Vadasz 	}
1462cab56aceSImre Vadasz 	crc1 = siba_crc8(crc1, sprom[size - 1] & 0x00ff);
1463cab56aceSImre Vadasz 	crc1 ^= 0xff;
1464cab56aceSImre Vadasz 
1465cab56aceSImre Vadasz 	return ((crc0 != crc1) ? EPROTO : 0);
1466cab56aceSImre Vadasz }
1467cab56aceSImre Vadasz 
1468cab56aceSImre Vadasz static uint8_t
siba_crc8(uint8_t crc,uint8_t data)1469cab56aceSImre Vadasz siba_crc8(uint8_t crc, uint8_t data)
1470cab56aceSImre Vadasz {
1471cab56aceSImre Vadasz 	static const uint8_t ct[] = {
1472cab56aceSImre Vadasz 		0x00, 0xf7, 0xb9, 0x4e, 0x25, 0xd2, 0x9c, 0x6b,
1473cab56aceSImre Vadasz 		0x4a, 0xbd, 0xf3, 0x04, 0x6f, 0x98, 0xd6, 0x21,
1474cab56aceSImre Vadasz 		0x94, 0x63, 0x2d, 0xda, 0xb1, 0x46, 0x08, 0xff,
1475cab56aceSImre Vadasz 		0xde, 0x29, 0x67, 0x90, 0xfb, 0x0c, 0x42, 0xb5,
1476cab56aceSImre Vadasz 		0x7f, 0x88, 0xc6, 0x31, 0x5a, 0xad, 0xe3, 0x14,
1477cab56aceSImre Vadasz 		0x35, 0xc2, 0x8c, 0x7b, 0x10, 0xe7, 0xa9, 0x5e,
1478cab56aceSImre Vadasz 		0xeb, 0x1c, 0x52, 0xa5, 0xce, 0x39, 0x77, 0x80,
1479cab56aceSImre Vadasz 		0xa1, 0x56, 0x18, 0xef, 0x84, 0x73, 0x3d, 0xca,
1480cab56aceSImre Vadasz 		0xfe, 0x09, 0x47, 0xb0, 0xdb, 0x2c, 0x62, 0x95,
1481cab56aceSImre Vadasz 		0xb4, 0x43, 0x0d, 0xfa, 0x91, 0x66, 0x28, 0xdf,
1482cab56aceSImre Vadasz 		0x6a, 0x9d, 0xd3, 0x24, 0x4f, 0xb8, 0xf6, 0x01,
1483cab56aceSImre Vadasz 		0x20, 0xd7, 0x99, 0x6e, 0x05, 0xf2, 0xbc, 0x4b,
1484cab56aceSImre Vadasz 		0x81, 0x76, 0x38, 0xcf, 0xa4, 0x53, 0x1d, 0xea,
1485cab56aceSImre Vadasz 		0xcb, 0x3c, 0x72, 0x85, 0xee, 0x19, 0x57, 0xa0,
1486cab56aceSImre Vadasz 		0x15, 0xe2, 0xac, 0x5b, 0x30, 0xc7, 0x89, 0x7e,
1487cab56aceSImre Vadasz 		0x5f, 0xa8, 0xe6, 0x11, 0x7a, 0x8d, 0xc3, 0x34,
1488cab56aceSImre Vadasz 		0xab, 0x5c, 0x12, 0xe5, 0x8e, 0x79, 0x37, 0xc0,
1489cab56aceSImre Vadasz 		0xe1, 0x16, 0x58, 0xaf, 0xc4, 0x33, 0x7d, 0x8a,
1490cab56aceSImre Vadasz 		0x3f, 0xc8, 0x86, 0x71, 0x1a, 0xed, 0xa3, 0x54,
1491cab56aceSImre Vadasz 		0x75, 0x82, 0xcc, 0x3b, 0x50, 0xa7, 0xe9, 0x1e,
1492cab56aceSImre Vadasz 		0xd4, 0x23, 0x6d, 0x9a, 0xf1, 0x06, 0x48, 0xbf,
1493cab56aceSImre Vadasz 		0x9e, 0x69, 0x27, 0xd0, 0xbb, 0x4c, 0x02, 0xf5,
1494cab56aceSImre Vadasz 		0x40, 0xb7, 0xf9, 0x0e, 0x65, 0x92, 0xdc, 0x2b,
1495cab56aceSImre Vadasz 		0x0a, 0xfd, 0xb3, 0x44, 0x2f, 0xd8, 0x96, 0x61,
1496cab56aceSImre Vadasz 		0x55, 0xa2, 0xec, 0x1b, 0x70, 0x87, 0xc9, 0x3e,
1497cab56aceSImre Vadasz 		0x1f, 0xe8, 0xa6, 0x51, 0x3a, 0xcd, 0x83, 0x74,
1498cab56aceSImre Vadasz 		0xc1, 0x36, 0x78, 0x8f, 0xe4, 0x13, 0x5d, 0xaa,
1499cab56aceSImre Vadasz 		0x8b, 0x7c, 0x32, 0xc5, 0xae, 0x59, 0x17, 0xe0,
1500cab56aceSImre Vadasz 		0x2a, 0xdd, 0x93, 0x64, 0x0f, 0xf8, 0xb6, 0x41,
1501cab56aceSImre Vadasz 		0x60, 0x97, 0xd9, 0x2e, 0x45, 0xb2, 0xfc, 0x0b,
1502cab56aceSImre Vadasz 		0xbe, 0x49, 0x07, 0xf0, 0x9b, 0x6c, 0x22, 0xd5,
1503cab56aceSImre Vadasz 		0xf4, 0x03, 0x4d, 0xba, 0xd1, 0x26, 0x68, 0x9f,
1504cab56aceSImre Vadasz 	};
1505cab56aceSImre Vadasz 	return (ct[crc ^ data]);
1506cab56aceSImre Vadasz }
1507cab56aceSImre Vadasz 
1508cab56aceSImre Vadasz #define	SIBA_LOWEST_SET_BIT(__mask) ((((__mask) - 1) & (__mask)) ^ (__mask))
1509cab56aceSImre Vadasz #define SIBA_OFFSET(offset)	\
1510cab56aceSImre Vadasz 	(((offset) - SIBA_SPROM_BASE) / sizeof(uint16_t))
1511cab56aceSImre Vadasz #define	SIBA_SHIFTOUT_SUB(__x, __mask)					\
1512cab56aceSImre Vadasz 	(((__x) & (__mask)) / SIBA_LOWEST_SET_BIT(__mask))
1513cab56aceSImre Vadasz #define	SIBA_SHIFTOUT(_var, _offset, _mask)				\
1514cab56aceSImre Vadasz 	out->_var = SIBA_SHIFTOUT_SUB(in[SIBA_OFFSET(_offset)], (_mask))
1515cab56aceSImre Vadasz #define SIBA_SHIFTOUT_4(_var, _offset, _mask, _shift)			\
1516cab56aceSImre Vadasz 	out->_var = ((((uint32_t)in[SIBA_OFFSET((_offset)+2)] << 16 |	\
1517cab56aceSImre Vadasz 	    in[SIBA_OFFSET(_offset)]) & (_mask)) >> (_shift))
1518cab56aceSImre Vadasz 
1519cab56aceSImre Vadasz static void
siba_sprom_r123(struct siba_sprom * out,const uint16_t * in)1520cab56aceSImre Vadasz siba_sprom_r123(struct siba_sprom *out, const uint16_t *in)
1521cab56aceSImre Vadasz {
1522cab56aceSImre Vadasz 	int i;
1523cab56aceSImre Vadasz 	uint16_t v;
1524cab56aceSImre Vadasz 	int8_t gain;
1525cab56aceSImre Vadasz 	uint16_t loc[3];
1526cab56aceSImre Vadasz 
1527cab56aceSImre Vadasz 	if (out->rev == 3)
1528cab56aceSImre Vadasz 		loc[0] = SIBA_SPROM3_MAC_80211BG;
1529cab56aceSImre Vadasz 	else {
1530cab56aceSImre Vadasz 		loc[0] = SIBA_SPROM1_MAC_80211BG;
1531cab56aceSImre Vadasz 		loc[1] = SIBA_SPROM1_MAC_ETH;
1532cab56aceSImre Vadasz 		loc[2] = SIBA_SPROM1_MAC_80211A;
1533cab56aceSImre Vadasz 	}
1534cab56aceSImre Vadasz 	for (i = 0; i < 3; i++) {
1535cab56aceSImre Vadasz 		v = in[SIBA_OFFSET(loc[0]) + i];
1536cab56aceSImre Vadasz 		*(((uint16_t *)out->mac_80211bg) + i) = htobe16(v);
1537cab56aceSImre Vadasz 	}
1538cab56aceSImre Vadasz 	if (out->rev < 3) {
1539cab56aceSImre Vadasz 		for (i = 0; i < 3; i++) {
1540cab56aceSImre Vadasz 			v = in[SIBA_OFFSET(loc[1]) + i];
1541cab56aceSImre Vadasz 			*(((uint16_t *)out->mac_eth) + i) = htobe16(v);
1542cab56aceSImre Vadasz 		}
1543cab56aceSImre Vadasz 		for (i = 0; i < 3; i++) {
1544cab56aceSImre Vadasz 			v = in[SIBA_OFFSET(loc[2]) + i];
1545cab56aceSImre Vadasz 			*(((uint16_t *)out->mac_80211a) + i) = htobe16(v);
1546cab56aceSImre Vadasz 		}
1547cab56aceSImre Vadasz 	}
1548cab56aceSImre Vadasz 	SIBA_SHIFTOUT(mii_eth0, SIBA_SPROM1_ETHPHY,
1549cab56aceSImre Vadasz 	    SIBA_SPROM1_ETHPHY_MII_ETH0);
1550cab56aceSImre Vadasz 	SIBA_SHIFTOUT(mii_eth1, SIBA_SPROM1_ETHPHY,
1551cab56aceSImre Vadasz 	    SIBA_SPROM1_ETHPHY_MII_ETH1);
1552cab56aceSImre Vadasz 	SIBA_SHIFTOUT(mdio_eth0, SIBA_SPROM1_ETHPHY,
1553cab56aceSImre Vadasz 	    SIBA_SPROM1_ETHPHY_MDIO_ETH0);
1554cab56aceSImre Vadasz 	SIBA_SHIFTOUT(mdio_eth1, SIBA_SPROM1_ETHPHY,
1555cab56aceSImre Vadasz 	    SIBA_SPROM1_ETHPHY_MDIO_ETH1);
1556cab56aceSImre Vadasz 	SIBA_SHIFTOUT(brev, SIBA_SPROM1_BOARDINFO, SIBA_SPROM1_BOARDINFO_BREV);
1557cab56aceSImre Vadasz 	SIBA_SHIFTOUT(ccode, SIBA_SPROM1_BOARDINFO,
1558cab56aceSImre Vadasz 	    SIBA_SPROM1_BOARDINFO_CCODE);
1559cab56aceSImre Vadasz 	SIBA_SHIFTOUT(ant_a, SIBA_SPROM1_BOARDINFO, SIBA_SPROM1_BOARDINFO_ANTA);
1560cab56aceSImre Vadasz 	SIBA_SHIFTOUT(ant_bg, SIBA_SPROM1_BOARDINFO,
1561cab56aceSImre Vadasz 	    SIBA_SPROM1_BOARDINFO_ANTBG);
1562cab56aceSImre Vadasz 	SIBA_SHIFTOUT(pa0b0, SIBA_SPROM1_PA0B0, 0xffff);
1563cab56aceSImre Vadasz 	SIBA_SHIFTOUT(pa0b1, SIBA_SPROM1_PA0B1, 0xffff);
1564cab56aceSImre Vadasz 	SIBA_SHIFTOUT(pa0b2, SIBA_SPROM1_PA0B2, 0xffff);
1565cab56aceSImre Vadasz 	SIBA_SHIFTOUT(pa1b0, SIBA_SPROM1_PA1B0, 0xffff);
1566cab56aceSImre Vadasz 	SIBA_SHIFTOUT(pa1b1, SIBA_SPROM1_PA1B1, 0xffff);
1567cab56aceSImre Vadasz 	SIBA_SHIFTOUT(pa1b2, SIBA_SPROM1_PA1B2, 0xffff);
1568cab56aceSImre Vadasz 	SIBA_SHIFTOUT(gpio0, SIBA_SPROM1_GPIOA, SIBA_SPROM1_GPIOA_P0);
1569cab56aceSImre Vadasz 	SIBA_SHIFTOUT(gpio1, SIBA_SPROM1_GPIOA, SIBA_SPROM1_GPIOA_P1);
1570cab56aceSImre Vadasz 	SIBA_SHIFTOUT(gpio2, SIBA_SPROM1_GPIOB, SIBA_SPROM1_GPIOB_P2);
1571cab56aceSImre Vadasz 	SIBA_SHIFTOUT(gpio3, SIBA_SPROM1_GPIOB, SIBA_SPROM1_GPIOB_P3);
1572cab56aceSImre Vadasz 
1573cab56aceSImre Vadasz 	SIBA_SHIFTOUT(maxpwr_a, SIBA_SPROM1_MAXPWR, SIBA_SPROM1_MAXPWR_A);
1574cab56aceSImre Vadasz 	SIBA_SHIFTOUT(maxpwr_bg, SIBA_SPROM1_MAXPWR, SIBA_SPROM1_MAXPWR_BG);
1575cab56aceSImre Vadasz 	SIBA_SHIFTOUT(tssi_a, SIBA_SPROM1_TSSI, SIBA_SPROM1_TSSI_A);
1576cab56aceSImre Vadasz 	SIBA_SHIFTOUT(tssi_bg, SIBA_SPROM1_TSSI, SIBA_SPROM1_TSSI_BG);
1577cab56aceSImre Vadasz 	SIBA_SHIFTOUT(bf_lo, SIBA_SPROM1_BFLOW, 0xffff);
1578cab56aceSImre Vadasz 	if (out->rev >= 2)
1579cab56aceSImre Vadasz 		SIBA_SHIFTOUT(bf_hi, SIBA_SPROM2_BFHIGH, 0xffff);
1580cab56aceSImre Vadasz 
1581cab56aceSImre Vadasz 	/* antenna gain */
1582cab56aceSImre Vadasz 	gain = siba_sprom_r123_antgain(out->rev, in, SIBA_SPROM1_AGAIN_BG, 0);
1583cab56aceSImre Vadasz 	out->again.ghz24.a0 = out->again.ghz24.a1 = gain;
1584cab56aceSImre Vadasz 	out->again.ghz24.a2 = out->again.ghz24.a3 = gain;
1585cab56aceSImre Vadasz 	gain = siba_sprom_r123_antgain(out->rev, in, SIBA_SPROM1_AGAIN_A, 8);
1586cab56aceSImre Vadasz 	out->again.ghz5.a0 = out->again.ghz5.a1 = gain;
1587cab56aceSImre Vadasz 	out->again.ghz5.a2 = out->again.ghz5.a3 = gain;
1588cab56aceSImre Vadasz }
1589cab56aceSImre Vadasz 
1590cab56aceSImre Vadasz static void
siba_sprom_r458(struct siba_sprom * out,const uint16_t * in)15917872accfSImre Vadász siba_sprom_r458(struct siba_sprom *out, const uint16_t *in)
15927872accfSImre Vadász {
15937872accfSImre Vadász 
15947872accfSImre Vadász 	SIBA_SHIFTOUT(txpid2g[0], SIBA_SPROM4_TXPID2G01,
15957872accfSImre Vadász 	    SIBA_SPROM4_TXPID2G0);
15967872accfSImre Vadász 	SIBA_SHIFTOUT(txpid2g[1], SIBA_SPROM4_TXPID2G01,
15977872accfSImre Vadász 	    SIBA_SPROM4_TXPID2G1);
15987872accfSImre Vadász 	SIBA_SHIFTOUT(txpid2g[2], SIBA_SPROM4_TXPID2G23,
15997872accfSImre Vadász 	    SIBA_SPROM4_TXPID2G2);
16007872accfSImre Vadász 	SIBA_SHIFTOUT(txpid2g[3], SIBA_SPROM4_TXPID2G23,
16017872accfSImre Vadász 	    SIBA_SPROM4_TXPID2G3);
16027872accfSImre Vadász 
16037872accfSImre Vadász 	SIBA_SHIFTOUT(txpid5gl[0], SIBA_SPROM4_TXPID5GL01,
16047872accfSImre Vadász 	    SIBA_SPROM4_TXPID5GL0);
16057872accfSImre Vadász 	SIBA_SHIFTOUT(txpid5gl[1], SIBA_SPROM4_TXPID5GL01,
16067872accfSImre Vadász 	    SIBA_SPROM4_TXPID5GL1);
16077872accfSImre Vadász 	SIBA_SHIFTOUT(txpid5gl[2], SIBA_SPROM4_TXPID5GL23,
16087872accfSImre Vadász 	    SIBA_SPROM4_TXPID5GL2);
16097872accfSImre Vadász 	SIBA_SHIFTOUT(txpid5gl[3], SIBA_SPROM4_TXPID5GL23,
16107872accfSImre Vadász 	    SIBA_SPROM4_TXPID5GL3);
16117872accfSImre Vadász 
16127872accfSImre Vadász 	SIBA_SHIFTOUT(txpid5g[0], SIBA_SPROM4_TXPID5G01,
16137872accfSImre Vadász 	    SIBA_SPROM4_TXPID5G0);
16147872accfSImre Vadász 	SIBA_SHIFTOUT(txpid5g[1], SIBA_SPROM4_TXPID5G01,
16157872accfSImre Vadász 	    SIBA_SPROM4_TXPID5G1);
16167872accfSImre Vadász 	SIBA_SHIFTOUT(txpid5g[2], SIBA_SPROM4_TXPID5G23,
16177872accfSImre Vadász 	    SIBA_SPROM4_TXPID5G2);
16187872accfSImre Vadász 	SIBA_SHIFTOUT(txpid5g[3], SIBA_SPROM4_TXPID5G23,
16197872accfSImre Vadász 	    SIBA_SPROM4_TXPID5G3);
16207872accfSImre Vadász 
16217872accfSImre Vadász 	SIBA_SHIFTOUT(txpid5gh[0], SIBA_SPROM4_TXPID5GH01,
16227872accfSImre Vadász 	    SIBA_SPROM4_TXPID5GH0);
16237872accfSImre Vadász 	SIBA_SHIFTOUT(txpid5gh[1], SIBA_SPROM4_TXPID5GH01,
16247872accfSImre Vadász 	    SIBA_SPROM4_TXPID5GH1);
16257872accfSImre Vadász 	SIBA_SHIFTOUT(txpid5gh[2], SIBA_SPROM4_TXPID5GH23,
16267872accfSImre Vadász 	    SIBA_SPROM4_TXPID5GH2);
16277872accfSImre Vadász 	SIBA_SHIFTOUT(txpid5gh[3], SIBA_SPROM4_TXPID5GH23,
16287872accfSImre Vadász 	    SIBA_SPROM4_TXPID5GH3);
16297872accfSImre Vadász }
16307872accfSImre Vadász 
16317872accfSImre Vadász static void
siba_sprom_r45(struct siba_sprom * out,const uint16_t * in)1632cab56aceSImre Vadasz siba_sprom_r45(struct siba_sprom *out, const uint16_t *in)
1633cab56aceSImre Vadasz {
1634cab56aceSImre Vadasz 	int i;
1635cab56aceSImre Vadasz 	uint16_t v;
1636cab56aceSImre Vadasz 	uint16_t mac_80211bg_offset;
16377872accfSImre Vadász 	const uint16_t pwr_info_offset[] = {
16387872accfSImre Vadász 	    SIBA_SPROM4_PWR_INFO_CORE0, SIBA_SPROM4_PWR_INFO_CORE1,
16397872accfSImre Vadász 	    SIBA_SPROM4_PWR_INFO_CORE2, SIBA_SPROM4_PWR_INFO_CORE3
16407872accfSImre Vadász 	};
1641cab56aceSImre Vadasz 
1642cab56aceSImre Vadasz 	if (out->rev == 4)
1643cab56aceSImre Vadasz 		mac_80211bg_offset = SIBA_SPROM4_MAC_80211BG;
1644cab56aceSImre Vadasz 	else
1645cab56aceSImre Vadasz 		mac_80211bg_offset = SIBA_SPROM5_MAC_80211BG;
1646cab56aceSImre Vadasz 	for (i = 0; i < 3; i++) {
1647cab56aceSImre Vadasz 		v = in[SIBA_OFFSET(mac_80211bg_offset) + i];
1648cab56aceSImre Vadasz 		*(((uint16_t *)out->mac_80211bg) + i) = htobe16(v);
1649cab56aceSImre Vadasz 	}
1650cab56aceSImre Vadasz 	SIBA_SHIFTOUT(mii_eth0, SIBA_SPROM4_ETHPHY, SIBA_SPROM4_ETHPHY_ET0A);
1651cab56aceSImre Vadasz 	SIBA_SHIFTOUT(mii_eth1, SIBA_SPROM4_ETHPHY, SIBA_SPROM4_ETHPHY_ET1A);
1652cab56aceSImre Vadasz 	if (out->rev == 4) {
1653cab56aceSImre Vadasz 		SIBA_SHIFTOUT(ccode, SIBA_SPROM4_CCODE, 0xffff);
1654cab56aceSImre Vadasz 		SIBA_SHIFTOUT(bf_lo, SIBA_SPROM4_BFLOW, 0xffff);
1655cab56aceSImre Vadasz 		SIBA_SHIFTOUT(bf_hi, SIBA_SPROM4_BFHIGH, 0xffff);
1656cab56aceSImre Vadasz 	} else {
1657cab56aceSImre Vadasz 		SIBA_SHIFTOUT(ccode, SIBA_SPROM5_CCODE, 0xffff);
1658cab56aceSImre Vadasz 		SIBA_SHIFTOUT(bf_lo, SIBA_SPROM5_BFLOW, 0xffff);
1659cab56aceSImre Vadasz 		SIBA_SHIFTOUT(bf_hi, SIBA_SPROM5_BFHIGH, 0xffff);
1660cab56aceSImre Vadasz 	}
1661cab56aceSImre Vadasz 	SIBA_SHIFTOUT(ant_a, SIBA_SPROM4_ANTAVAIL, SIBA_SPROM4_ANTAVAIL_A);
1662cab56aceSImre Vadasz 	SIBA_SHIFTOUT(ant_bg, SIBA_SPROM4_ANTAVAIL, SIBA_SPROM4_ANTAVAIL_BG);
1663cab56aceSImre Vadasz 	SIBA_SHIFTOUT(maxpwr_bg, SIBA_SPROM4_MAXP_BG, SIBA_SPROM4_MAXP_BG_MASK);
1664cab56aceSImre Vadasz 	SIBA_SHIFTOUT(tssi_bg, SIBA_SPROM4_MAXP_BG, SIBA_SPROM4_TSSI_BG);
1665cab56aceSImre Vadasz 	SIBA_SHIFTOUT(maxpwr_a, SIBA_SPROM4_MAXP_A, SIBA_SPROM4_MAXP_A_MASK);
1666cab56aceSImre Vadasz 	SIBA_SHIFTOUT(tssi_a, SIBA_SPROM4_MAXP_A, SIBA_SPROM4_TSSI_A);
1667cab56aceSImre Vadasz 	if (out->rev == 4) {
1668cab56aceSImre Vadasz 		SIBA_SHIFTOUT(gpio0, SIBA_SPROM4_GPIOA, SIBA_SPROM4_GPIOA_P0);
1669cab56aceSImre Vadasz 		SIBA_SHIFTOUT(gpio1, SIBA_SPROM4_GPIOA, SIBA_SPROM4_GPIOA_P1);
1670cab56aceSImre Vadasz 		SIBA_SHIFTOUT(gpio2, SIBA_SPROM4_GPIOB, SIBA_SPROM4_GPIOB_P2);
1671cab56aceSImre Vadasz 		SIBA_SHIFTOUT(gpio3, SIBA_SPROM4_GPIOB, SIBA_SPROM4_GPIOB_P3);
1672cab56aceSImre Vadasz 	} else {
1673cab56aceSImre Vadasz 		SIBA_SHIFTOUT(gpio0, SIBA_SPROM5_GPIOA, SIBA_SPROM5_GPIOA_P0);
1674cab56aceSImre Vadasz 		SIBA_SHIFTOUT(gpio1, SIBA_SPROM5_GPIOA, SIBA_SPROM5_GPIOA_P1);
1675cab56aceSImre Vadasz 		SIBA_SHIFTOUT(gpio2, SIBA_SPROM5_GPIOB, SIBA_SPROM5_GPIOB_P2);
1676cab56aceSImre Vadasz 		SIBA_SHIFTOUT(gpio3, SIBA_SPROM5_GPIOB, SIBA_SPROM5_GPIOB_P3);
1677cab56aceSImre Vadasz 	}
1678cab56aceSImre Vadasz 
1679cab56aceSImre Vadasz 	/* antenna gain */
1680cab56aceSImre Vadasz 	SIBA_SHIFTOUT(again.ghz24.a0, SIBA_SPROM4_AGAIN01, SIBA_SPROM4_AGAIN0);
1681cab56aceSImre Vadasz 	SIBA_SHIFTOUT(again.ghz24.a1, SIBA_SPROM4_AGAIN01, SIBA_SPROM4_AGAIN1);
1682cab56aceSImre Vadasz 	SIBA_SHIFTOUT(again.ghz24.a2, SIBA_SPROM4_AGAIN23, SIBA_SPROM4_AGAIN2);
1683cab56aceSImre Vadasz 	SIBA_SHIFTOUT(again.ghz24.a3, SIBA_SPROM4_AGAIN23, SIBA_SPROM4_AGAIN3);
1684cab56aceSImre Vadasz 	bcopy(&out->again.ghz24, &out->again.ghz5, sizeof(out->again.ghz5));
16857872accfSImre Vadász 
16867872accfSImre Vadász 	/* Extract core power info */
16877872accfSImre Vadász 	for (i = 0; i < nitems(pwr_info_offset); i++) {
16887872accfSImre Vadász 		uint16_t o = pwr_info_offset[i];
16897872accfSImre Vadász 
16907872accfSImre Vadász 		SIBA_SHIFTOUT(core_pwr_info[i].itssi_2g, o + SIBA_SPROM4_2G_MAXP_ITSSI,
16917872accfSImre Vadász 			SIBA_SPROM4_2G_ITSSI);
16927872accfSImre Vadász 		SIBA_SHIFTOUT(core_pwr_info[i].maxpwr_2g, o + SIBA_SPROM4_2G_MAXP_ITSSI,
16937872accfSImre Vadász 			SIBA_SPROM4_2G_MAXP);
16947872accfSImre Vadász 
16957872accfSImre Vadász 		SIBA_SHIFTOUT(core_pwr_info[i].pa_2g[0], o + SIBA_SPROM4_2G_PA_0, ~0);
16967872accfSImre Vadász 		SIBA_SHIFTOUT(core_pwr_info[i].pa_2g[1], o + SIBA_SPROM4_2G_PA_1, ~0);
16977872accfSImre Vadász 		SIBA_SHIFTOUT(core_pwr_info[i].pa_2g[2], o + SIBA_SPROM4_2G_PA_2, ~0);
16987872accfSImre Vadász 		SIBA_SHIFTOUT(core_pwr_info[i].pa_2g[3], o + SIBA_SPROM4_2G_PA_3, ~0);
16997872accfSImre Vadász 
17007872accfSImre Vadász 		SIBA_SHIFTOUT(core_pwr_info[i].itssi_5g, o + SIBA_SPROM4_5G_MAXP_ITSSI,
17017872accfSImre Vadász 			SIBA_SPROM4_5G_ITSSI);
17027872accfSImre Vadász 		SIBA_SHIFTOUT(core_pwr_info[i].maxpwr_5g, o + SIBA_SPROM4_5G_MAXP_ITSSI,
17037872accfSImre Vadász 			SIBA_SPROM4_5G_MAXP);
17047872accfSImre Vadász 		SIBA_SHIFTOUT(core_pwr_info[i].maxpwr_5gh, o + SIBA_SPROM4_5GHL_MAXP,
17057872accfSImre Vadász 			SIBA_SPROM4_5GH_MAXP);
17067872accfSImre Vadász 		SIBA_SHIFTOUT(core_pwr_info[i].maxpwr_5gl, o + SIBA_SPROM4_5GHL_MAXP,
17077872accfSImre Vadász 			SIBA_SPROM4_5GL_MAXP);
17087872accfSImre Vadász 
17097872accfSImre Vadász 		SIBA_SHIFTOUT(core_pwr_info[i].pa_5gl[0], o + SIBA_SPROM4_5GL_PA_0, ~0);
17107872accfSImre Vadász 		SIBA_SHIFTOUT(core_pwr_info[i].pa_5gl[1], o + SIBA_SPROM4_5GL_PA_1, ~0);
17117872accfSImre Vadász 		SIBA_SHIFTOUT(core_pwr_info[i].pa_5gl[2], o + SIBA_SPROM4_5GL_PA_2, ~0);
17127872accfSImre Vadász 		SIBA_SHIFTOUT(core_pwr_info[i].pa_5gl[3], o + SIBA_SPROM4_5GL_PA_3, ~0);
17137872accfSImre Vadász 		SIBA_SHIFTOUT(core_pwr_info[i].pa_5g[0], o + SIBA_SPROM4_5G_PA_0, ~0);
17147872accfSImre Vadász 		SIBA_SHIFTOUT(core_pwr_info[i].pa_5g[1], o + SIBA_SPROM4_5G_PA_1, ~0);
17157872accfSImre Vadász 		SIBA_SHIFTOUT(core_pwr_info[i].pa_5g[2], o + SIBA_SPROM4_5G_PA_2, ~0);
17167872accfSImre Vadász 		SIBA_SHIFTOUT(core_pwr_info[i].pa_5g[3], o + SIBA_SPROM4_5G_PA_3, ~0);
17177872accfSImre Vadász 		SIBA_SHIFTOUT(core_pwr_info[i].pa_5gh[0], o + SIBA_SPROM4_5GH_PA_0, ~0);
17187872accfSImre Vadász 		SIBA_SHIFTOUT(core_pwr_info[i].pa_5gh[1], o + SIBA_SPROM4_5GH_PA_1, ~0);
17197872accfSImre Vadász 		SIBA_SHIFTOUT(core_pwr_info[i].pa_5gh[2], o + SIBA_SPROM4_5GH_PA_2, ~0);
17207872accfSImre Vadász 		SIBA_SHIFTOUT(core_pwr_info[i].pa_5gh[3], o + SIBA_SPROM4_5GH_PA_3, ~0);
17217872accfSImre Vadász 	}
17227872accfSImre Vadász 
17237872accfSImre Vadász 	siba_sprom_r458(out, in);
1724cab56aceSImre Vadasz }
1725cab56aceSImre Vadasz 
1726cab56aceSImre Vadasz static void
siba_sprom_r8(struct siba_sprom * out,const uint16_t * in)1727cab56aceSImre Vadasz siba_sprom_r8(struct siba_sprom *out, const uint16_t *in)
1728cab56aceSImre Vadasz {
1729cab56aceSImre Vadasz 	int i;
1730cab56aceSImre Vadasz 	uint16_t v;
17317872accfSImre Vadász 	uint16_t pwr_info_offset[] = {
17327872accfSImre Vadász 		SIBA_SROM8_PWR_INFO_CORE0, SIBA_SROM8_PWR_INFO_CORE1,
17337872accfSImre Vadász 		SIBA_SROM8_PWR_INFO_CORE2, SIBA_SROM8_PWR_INFO_CORE3
17347872accfSImre Vadász 	};
1735cab56aceSImre Vadasz 
1736cab56aceSImre Vadasz 	for (i = 0; i < 3; i++) {
1737cab56aceSImre Vadasz 		v = in[SIBA_OFFSET(SIBA_SPROM8_MAC_80211BG) + i];
1738cab56aceSImre Vadasz 		*(((uint16_t *)out->mac_80211bg) + i) = htobe16(v);
1739cab56aceSImre Vadasz 	}
1740cab56aceSImre Vadasz 	SIBA_SHIFTOUT(ccode, SIBA_SPROM8_CCODE, 0xffff);
1741cab56aceSImre Vadasz 	SIBA_SHIFTOUT(bf_lo, SIBA_SPROM8_BFLOW, 0xffff);
1742cab56aceSImre Vadasz 	SIBA_SHIFTOUT(bf_hi, SIBA_SPROM8_BFHIGH, 0xffff);
1743cab56aceSImre Vadasz 	SIBA_SHIFTOUT(bf2_lo, SIBA_SPROM8_BFL2LO, 0xffff);
1744cab56aceSImre Vadasz 	SIBA_SHIFTOUT(bf2_hi, SIBA_SPROM8_BFL2HI, 0xffff);
1745cab56aceSImre Vadasz 	SIBA_SHIFTOUT(ant_a, SIBA_SPROM8_ANTAVAIL, SIBA_SPROM8_ANTAVAIL_A);
1746cab56aceSImre Vadasz 	SIBA_SHIFTOUT(ant_bg, SIBA_SPROM8_ANTAVAIL, SIBA_SPROM8_ANTAVAIL_BG);
1747cab56aceSImre Vadasz 	SIBA_SHIFTOUT(maxpwr_bg, SIBA_SPROM8_MAXP_BG, SIBA_SPROM8_MAXP_BG_MASK);
1748cab56aceSImre Vadasz 	SIBA_SHIFTOUT(tssi_bg, SIBA_SPROM8_MAXP_BG, SIBA_SPROM8_TSSI_BG);
1749cab56aceSImre Vadasz 	SIBA_SHIFTOUT(maxpwr_a, SIBA_SPROM8_MAXP_A, SIBA_SPROM8_MAXP_A_MASK);
1750cab56aceSImre Vadasz 	SIBA_SHIFTOUT(tssi_a, SIBA_SPROM8_MAXP_A, SIBA_SPROM8_TSSI_A);
1751cab56aceSImre Vadasz 	SIBA_SHIFTOUT(maxpwr_ah, SIBA_SPROM8_MAXP_AHL,
1752cab56aceSImre Vadasz 	    SIBA_SPROM8_MAXP_AH_MASK);
1753cab56aceSImre Vadasz 	SIBA_SHIFTOUT(maxpwr_al, SIBA_SPROM8_MAXP_AHL,
1754cab56aceSImre Vadasz 	    SIBA_SPROM8_MAXP_AL_MASK);
1755cab56aceSImre Vadasz 	SIBA_SHIFTOUT(gpio0, SIBA_SPROM8_GPIOA, SIBA_SPROM8_GPIOA_P0);
1756cab56aceSImre Vadasz 	SIBA_SHIFTOUT(gpio1, SIBA_SPROM8_GPIOA, SIBA_SPROM8_GPIOA_P1);
1757cab56aceSImre Vadasz 	SIBA_SHIFTOUT(gpio2, SIBA_SPROM8_GPIOB, SIBA_SPROM8_GPIOB_P2);
1758cab56aceSImre Vadasz 	SIBA_SHIFTOUT(gpio3, SIBA_SPROM8_GPIOB, SIBA_SPROM8_GPIOB_P3);
1759cab56aceSImre Vadasz 	SIBA_SHIFTOUT(tri2g, SIBA_SPROM8_TRI25G, SIBA_SPROM8_TRI2G);
1760cab56aceSImre Vadasz 	SIBA_SHIFTOUT(tri5g, SIBA_SPROM8_TRI25G, SIBA_SPROM8_TRI5G);
1761cab56aceSImre Vadasz 	SIBA_SHIFTOUT(tri5gl, SIBA_SPROM8_TRI5GHL, SIBA_SPROM8_TRI5GL);
1762cab56aceSImre Vadasz 	SIBA_SHIFTOUT(tri5gh, SIBA_SPROM8_TRI5GHL, SIBA_SPROM8_TRI5GH);
1763cab56aceSImre Vadasz 	SIBA_SHIFTOUT(rxpo2g, SIBA_SPROM8_RXPO, SIBA_SPROM8_RXPO2G);
1764cab56aceSImre Vadasz 	SIBA_SHIFTOUT(rxpo5g, SIBA_SPROM8_RXPO, SIBA_SPROM8_RXPO5G);
17657872accfSImre Vadász 
1766cab56aceSImre Vadasz 	SIBA_SHIFTOUT(rssismf2g, SIBA_SPROM8_RSSIPARM2G, SIBA_SPROM8_RSSISMF2G);
1767cab56aceSImre Vadasz 	SIBA_SHIFTOUT(rssismc2g, SIBA_SPROM8_RSSIPARM2G, SIBA_SPROM8_RSSISMC2G);
1768cab56aceSImre Vadasz 	SIBA_SHIFTOUT(rssisav2g, SIBA_SPROM8_RSSIPARM2G, SIBA_SPROM8_RSSISAV2G);
1769cab56aceSImre Vadasz 	SIBA_SHIFTOUT(bxa2g, SIBA_SPROM8_RSSIPARM2G, SIBA_SPROM8_BXA2G);
1770cab56aceSImre Vadasz 	SIBA_SHIFTOUT(rssismf5g, SIBA_SPROM8_RSSIPARM5G, SIBA_SPROM8_RSSISMF5G);
1771cab56aceSImre Vadasz 	SIBA_SHIFTOUT(rssismc5g, SIBA_SPROM8_RSSIPARM5G, SIBA_SPROM8_RSSISMC5G);
1772cab56aceSImre Vadasz 	SIBA_SHIFTOUT(rssisav5g, SIBA_SPROM8_RSSIPARM5G, SIBA_SPROM8_RSSISAV5G);
1773cab56aceSImre Vadasz 	SIBA_SHIFTOUT(bxa5g, SIBA_SPROM8_RSSIPARM5G, SIBA_SPROM8_BXA5G);
1774cab56aceSImre Vadasz 
1775cab56aceSImre Vadasz 	SIBA_SHIFTOUT(pa0b0, SIBA_SPROM8_PA0B0, 0xffff);
1776cab56aceSImre Vadasz 	SIBA_SHIFTOUT(pa0b1, SIBA_SPROM8_PA0B1, 0xffff);
1777cab56aceSImre Vadasz 	SIBA_SHIFTOUT(pa0b2, SIBA_SPROM8_PA0B2, 0xffff);
1778cab56aceSImre Vadasz 	SIBA_SHIFTOUT(pa1b0, SIBA_SPROM8_PA1B0, 0xffff);
1779cab56aceSImre Vadasz 	SIBA_SHIFTOUT(pa1b1, SIBA_SPROM8_PA1B1, 0xffff);
1780cab56aceSImre Vadasz 	SIBA_SHIFTOUT(pa1b2, SIBA_SPROM8_PA1B2, 0xffff);
1781cab56aceSImre Vadasz 	SIBA_SHIFTOUT(pa1lob0, SIBA_SPROM8_PA1LOB0, 0xffff);
1782cab56aceSImre Vadasz 	SIBA_SHIFTOUT(pa1lob1, SIBA_SPROM8_PA1LOB1, 0xffff);
1783cab56aceSImre Vadasz 	SIBA_SHIFTOUT(pa1lob2, SIBA_SPROM8_PA1LOB2, 0xffff);
1784cab56aceSImre Vadasz 	SIBA_SHIFTOUT(pa1hib0, SIBA_SPROM8_PA1HIB0, 0xffff);
1785cab56aceSImre Vadasz 	SIBA_SHIFTOUT(pa1hib1, SIBA_SPROM8_PA1HIB1, 0xffff);
1786cab56aceSImre Vadasz 	SIBA_SHIFTOUT(pa1hib2, SIBA_SPROM8_PA1HIB2, 0xffff);
1787cab56aceSImre Vadasz 	SIBA_SHIFTOUT(cck2gpo, SIBA_SPROM8_CCK2GPO, 0xffff);
1788cab56aceSImre Vadasz 
1789cab56aceSImre Vadasz 	SIBA_SHIFTOUT_4(ofdm2gpo, SIBA_SPROM8_OFDM2GPO, 0xffffffff, 0);
1790cab56aceSImre Vadasz 	SIBA_SHIFTOUT_4(ofdm5glpo, SIBA_SPROM8_OFDM5GLPO, 0xffffffff, 0);
1791cab56aceSImre Vadasz 	SIBA_SHIFTOUT_4(ofdm5gpo, SIBA_SPROM8_OFDM5GPO, 0xffffffff, 0);
1792cab56aceSImre Vadasz 	SIBA_SHIFTOUT_4(ofdm5ghpo, SIBA_SPROM8_OFDM5GHPO, 0xffffffff, 0);
1793cab56aceSImre Vadasz 
1794cab56aceSImre Vadasz 	/* antenna gain */
1795cab56aceSImre Vadasz 	SIBA_SHIFTOUT(again.ghz24.a0, SIBA_SPROM8_AGAIN01, SIBA_SPROM8_AGAIN0);
1796cab56aceSImre Vadasz 	SIBA_SHIFTOUT(again.ghz24.a1, SIBA_SPROM8_AGAIN01, SIBA_SPROM8_AGAIN1);
1797cab56aceSImre Vadasz 	SIBA_SHIFTOUT(again.ghz24.a2, SIBA_SPROM8_AGAIN23, SIBA_SPROM8_AGAIN2);
1798cab56aceSImre Vadasz 	SIBA_SHIFTOUT(again.ghz24.a3, SIBA_SPROM8_AGAIN23, SIBA_SPROM8_AGAIN3);
1799cab56aceSImre Vadasz 	bcopy(&out->again.ghz24, &out->again.ghz5, sizeof(out->again.ghz5));
18007872accfSImre Vadász 
18017872accfSImre Vadász 	/* FEM */
18027872accfSImre Vadász 	SIBA_SHIFTOUT(fem.ghz2.tssipos, SIBA_SPROM8_FEM2G,
18037872accfSImre Vadász 	    SSB_SROM8_FEM_TSSIPOS);
18047872accfSImre Vadász 	SIBA_SHIFTOUT(fem.ghz2.extpa_gain, SIBA_SPROM8_FEM2G,
18057872accfSImre Vadász 	    SSB_SROM8_FEM_EXTPA_GAIN);
18067872accfSImre Vadász 	SIBA_SHIFTOUT(fem.ghz2.pdet_range, SIBA_SPROM8_FEM2G,
18077872accfSImre Vadász 	    SSB_SROM8_FEM_PDET_RANGE);
18087872accfSImre Vadász 	SIBA_SHIFTOUT(fem.ghz2.tr_iso, SIBA_SPROM8_FEM2G,
18097872accfSImre Vadász 	    SSB_SROM8_FEM_TR_ISO);
18107872accfSImre Vadász 	SIBA_SHIFTOUT(fem.ghz2.antswlut, SIBA_SPROM8_FEM2G,
18117872accfSImre Vadász 	    SSB_SROM8_FEM_ANTSWLUT);
18127872accfSImre Vadász 
18137872accfSImre Vadász 	SIBA_SHIFTOUT(fem.ghz5.tssipos, SIBA_SPROM8_FEM5G,
18147872accfSImre Vadász 	    SSB_SROM8_FEM_TSSIPOS);
18157872accfSImre Vadász 	SIBA_SHIFTOUT(fem.ghz5.extpa_gain, SIBA_SPROM8_FEM5G,
18167872accfSImre Vadász 	    SSB_SROM8_FEM_EXTPA_GAIN);
18177872accfSImre Vadász 	SIBA_SHIFTOUT(fem.ghz5.pdet_range, SIBA_SPROM8_FEM5G,
18187872accfSImre Vadász 	    SSB_SROM8_FEM_PDET_RANGE);
18197872accfSImre Vadász 	SIBA_SHIFTOUT(fem.ghz5.tr_iso, SIBA_SPROM8_FEM5G,
18207872accfSImre Vadász 	    SSB_SROM8_FEM_TR_ISO);
18217872accfSImre Vadász 	SIBA_SHIFTOUT(fem.ghz5.antswlut, SIBA_SPROM8_FEM5G,
18227872accfSImre Vadász 	    SSB_SROM8_FEM_ANTSWLUT);
18237872accfSImre Vadász 
18247872accfSImre Vadász 	/* Extract cores power info info */
18257872accfSImre Vadász 	for (i = 0; i < nitems(pwr_info_offset); i++) {
18267872accfSImre Vadász 		uint16_t o = pwr_info_offset[i];
18277872accfSImre Vadász 		SIBA_SHIFTOUT(core_pwr_info[i].itssi_2g, o + SIBA_SROM8_2G_MAXP_ITSSI,
18287872accfSImre Vadász 			SIBA_SPROM8_2G_ITSSI);
18297872accfSImre Vadász 		SIBA_SHIFTOUT(core_pwr_info[i].maxpwr_2g, o + SIBA_SROM8_2G_MAXP_ITSSI,
18307872accfSImre Vadász 			SIBA_SPROM8_2G_MAXP);
18317872accfSImre Vadász 
18327872accfSImre Vadász 		SIBA_SHIFTOUT(core_pwr_info[i].pa_2g[0], o + SIBA_SROM8_2G_PA_0, ~0);
18337872accfSImre Vadász 		SIBA_SHIFTOUT(core_pwr_info[i].pa_2g[1], o + SIBA_SROM8_2G_PA_1, ~0);
18347872accfSImre Vadász 		SIBA_SHIFTOUT(core_pwr_info[i].pa_2g[2], o + SIBA_SROM8_2G_PA_2, ~0);
18357872accfSImre Vadász 
18367872accfSImre Vadász 		SIBA_SHIFTOUT(core_pwr_info[i].itssi_5g, o + SIBA_SROM8_5G_MAXP_ITSSI,
18377872accfSImre Vadász 			SIBA_SPROM8_5G_ITSSI);
18387872accfSImre Vadász 		SIBA_SHIFTOUT(core_pwr_info[i].maxpwr_5g, o + SIBA_SROM8_5G_MAXP_ITSSI,
18397872accfSImre Vadász 			SIBA_SPROM8_5G_MAXP);
18407872accfSImre Vadász 		SIBA_SHIFTOUT(core_pwr_info[i].maxpwr_5gh, o + SIBA_SPROM8_5GHL_MAXP,
18417872accfSImre Vadász 			SIBA_SPROM8_5GH_MAXP);
18427872accfSImre Vadász 		SIBA_SHIFTOUT(core_pwr_info[i].maxpwr_5gl, o + SIBA_SPROM8_5GHL_MAXP,
18437872accfSImre Vadász 			SIBA_SPROM8_5GL_MAXP);
18447872accfSImre Vadász 
18457872accfSImre Vadász 		SIBA_SHIFTOUT(core_pwr_info[i].pa_5gl[0], o + SIBA_SROM8_5GL_PA_0, ~0);
18467872accfSImre Vadász 		SIBA_SHIFTOUT(core_pwr_info[i].pa_5gl[1], o + SIBA_SROM8_5GL_PA_1, ~0);
18477872accfSImre Vadász 		SIBA_SHIFTOUT(core_pwr_info[i].pa_5gl[2], o + SIBA_SROM8_5GL_PA_2, ~0);
18487872accfSImre Vadász 		SIBA_SHIFTOUT(core_pwr_info[i].pa_5g[0], o + SIBA_SROM8_5G_PA_0, ~0);
18497872accfSImre Vadász 		SIBA_SHIFTOUT(core_pwr_info[i].pa_5g[1], o + SIBA_SROM8_5G_PA_1, ~0);
18507872accfSImre Vadász 		SIBA_SHIFTOUT(core_pwr_info[i].pa_5g[2], o + SIBA_SROM8_5G_PA_2, ~0);
18517872accfSImre Vadász 		SIBA_SHIFTOUT(core_pwr_info[i].pa_5gh[0], o + SIBA_SROM8_5GH_PA_0, ~0);
18527872accfSImre Vadász 		SIBA_SHIFTOUT(core_pwr_info[i].pa_5gh[1], o + SIBA_SROM8_5GH_PA_1, ~0);
18537872accfSImre Vadász 		SIBA_SHIFTOUT(core_pwr_info[i].pa_5gh[2], o + SIBA_SROM8_5GH_PA_2, ~0);
18547872accfSImre Vadász 	}
18557872accfSImre Vadász 
18567872accfSImre Vadász 	SIBA_SHIFTOUT(cddpo, SIBA_SPROM8_CDDPO, ~0);
18577872accfSImre Vadász 	SIBA_SHIFTOUT(stbcpo, SIBA_SPROM8_STBCPO, ~0);
18587872accfSImre Vadász 
18597872accfSImre Vadász 	siba_sprom_r458(out, in);
1860cab56aceSImre Vadasz }
1861cab56aceSImre Vadasz 
1862cab56aceSImre Vadasz static int8_t
siba_sprom_r123_antgain(uint8_t sprom_revision,const uint16_t * in,uint16_t mask,uint16_t shift)1863cab56aceSImre Vadasz siba_sprom_r123_antgain(uint8_t sprom_revision, const uint16_t *in,
1864cab56aceSImre Vadasz     uint16_t mask, uint16_t shift)
1865cab56aceSImre Vadasz {
1866cab56aceSImre Vadasz 	uint16_t v;
1867cab56aceSImre Vadasz 	uint8_t gain;
1868cab56aceSImre Vadasz 
1869cab56aceSImre Vadasz 	v = in[SIBA_OFFSET(SIBA_SPROM1_AGAIN)];
1870cab56aceSImre Vadasz 	gain = (v & mask) >> shift;
1871cab56aceSImre Vadasz 	gain = (gain == 0xff) ? 2 : (sprom_revision == 1) ? gain << 2 :
1872cab56aceSImre Vadasz 	    ((gain & 0xc0) >> 6) | ((gain & 0x3f) << 2);
1873cab56aceSImre Vadasz 
1874cab56aceSImre Vadasz 	return ((int8_t)gain);
1875cab56aceSImre Vadasz }
1876cab56aceSImre Vadasz 
1877cab56aceSImre Vadasz #undef SIBA_LOWEST_SET_BIT
1878cab56aceSImre Vadasz #undef SIBA_OFFSET
1879cab56aceSImre Vadasz #undef SIBA_SHIFTOUT_SUB
1880cab56aceSImre Vadasz #undef SIBA_SHIFTOUT
1881cab56aceSImre Vadasz 
1882cab56aceSImre Vadasz int
siba_powerdown(device_t dev)1883cab56aceSImre Vadasz siba_powerdown(device_t dev)
1884cab56aceSImre Vadasz {
1885cab56aceSImre Vadasz 	struct siba_dev_softc *sd = device_get_ivars(dev);
1886cab56aceSImre Vadasz 	struct siba_softc *siba = sd->sd_bus;
1887cab56aceSImre Vadasz 
1888cab56aceSImre Vadasz 	return (siba_powerdown_sub(siba));
1889cab56aceSImre Vadasz }
1890cab56aceSImre Vadasz 
1891cab56aceSImre Vadasz static int
siba_powerdown_sub(struct siba_softc * siba)1892cab56aceSImre Vadasz siba_powerdown_sub(struct siba_softc *siba)
1893cab56aceSImre Vadasz {
1894cab56aceSImre Vadasz 	struct siba_cc *scc;
1895cab56aceSImre Vadasz 
1896cab56aceSImre Vadasz 	if (siba->siba_type == SIBA_TYPE_SSB)
1897cab56aceSImre Vadasz 		return (0);
1898cab56aceSImre Vadasz 
1899cab56aceSImre Vadasz 	scc = &siba->siba_cc;
19007872accfSImre Vadász 	if (!scc->scc_dev || scc->scc_dev->sd_id.sd_rev < 5)
1901cab56aceSImre Vadasz 		return (0);
1902cab56aceSImre Vadasz 	siba_cc_clock(scc, SIBA_CLOCK_SLOW);
1903cab56aceSImre Vadasz 	siba_pci_gpio(siba, SIBA_GPIO_CRYSTAL | SIBA_GPIO_PLL, 0);
1904cab56aceSImre Vadasz 	return (0);
1905cab56aceSImre Vadasz }
1906cab56aceSImre Vadasz 
1907cab56aceSImre Vadasz static void
siba_pcicore_init(struct siba_pci * spc)1908cab56aceSImre Vadasz siba_pcicore_init(struct siba_pci *spc)
1909cab56aceSImre Vadasz {
1910cab56aceSImre Vadasz 	struct siba_dev_softc *sd = spc->spc_dev;
1911cab56aceSImre Vadasz 
1912cab56aceSImre Vadasz 	if (sd == NULL)
1913cab56aceSImre Vadasz 		return;
1914cab56aceSImre Vadasz 
1915cab56aceSImre Vadasz 	if (!siba_dev_isup_sub(sd))
1916cab56aceSImre Vadasz 		siba_dev_up_sub(sd, 0);
1917cab56aceSImre Vadasz 
1918cab56aceSImre Vadasz 	KASSERT(spc->spc_hostmode == 0,
1919cab56aceSImre Vadasz 	    ("%s:%d: hostmode", __func__, __LINE__));
1920cab56aceSImre Vadasz 	/* disable PCI interrupt */
1921cab56aceSImre Vadasz 	siba_write_4_sub(spc->spc_dev, SIBA_INTR_MASK, 0);
1922cab56aceSImre Vadasz }
1923cab56aceSImre Vadasz 
1924cab56aceSImre Vadasz int
siba_dev_isup(device_t dev)1925cab56aceSImre Vadasz siba_dev_isup(device_t dev)
1926cab56aceSImre Vadasz {
1927cab56aceSImre Vadasz 	struct siba_dev_softc *sd = device_get_ivars(dev);
1928cab56aceSImre Vadasz 
1929cab56aceSImre Vadasz 	return (siba_dev_isup_sub(sd));
1930cab56aceSImre Vadasz }
1931cab56aceSImre Vadasz 
1932cab56aceSImre Vadasz static int
siba_dev_isup_sub(struct siba_dev_softc * sd)1933cab56aceSImre Vadasz siba_dev_isup_sub(struct siba_dev_softc *sd)
1934cab56aceSImre Vadasz {
1935cab56aceSImre Vadasz 	uint32_t reject, val;
1936cab56aceSImre Vadasz 
1937cab56aceSImre Vadasz 	reject = siba_tmslow_reject_bitmask(sd);
1938cab56aceSImre Vadasz 	val = siba_read_4_sub(sd, SIBA_TGSLOW);
1939cab56aceSImre Vadasz 	val &= SIBA_TGSLOW_CLOCK | SIBA_TGSLOW_RESET | reject;
1940cab56aceSImre Vadasz 
1941cab56aceSImre Vadasz 	return (val == SIBA_TGSLOW_CLOCK);
1942cab56aceSImre Vadasz }
1943cab56aceSImre Vadasz 
1944cab56aceSImre Vadasz void
siba_dev_up(device_t dev,uint32_t flags)1945cab56aceSImre Vadasz siba_dev_up(device_t dev, uint32_t flags)
1946cab56aceSImre Vadasz {
1947cab56aceSImre Vadasz 	struct siba_dev_softc *sd = device_get_ivars(dev);
1948cab56aceSImre Vadasz 
1949cab56aceSImre Vadasz 	siba_dev_up_sub(sd, flags);
1950cab56aceSImre Vadasz }
1951cab56aceSImre Vadasz 
1952cab56aceSImre Vadasz static void
siba_dev_up_sub(struct siba_dev_softc * sd,uint32_t flags)1953cab56aceSImre Vadasz siba_dev_up_sub(struct siba_dev_softc *sd, uint32_t flags)
1954cab56aceSImre Vadasz {
1955cab56aceSImre Vadasz 	uint32_t val;
1956cab56aceSImre Vadasz 
1957cab56aceSImre Vadasz 	siba_dev_down_sub(sd, flags);
1958cab56aceSImre Vadasz 	siba_write_4_sub(sd, SIBA_TGSLOW,
1959cab56aceSImre Vadasz 	    SIBA_TGSLOW_RESET | SIBA_TGSLOW_CLOCK | SIBA_TGSLOW_FGC | flags);
1960cab56aceSImre Vadasz 	siba_read_4_sub(sd, SIBA_TGSLOW);
1961cab56aceSImre Vadasz 	DELAY(1);
1962cab56aceSImre Vadasz 
1963cab56aceSImre Vadasz 	if (siba_read_4_sub(sd, SIBA_TGSHIGH) & SIBA_TGSHIGH_SERR)
1964cab56aceSImre Vadasz 		siba_write_4_sub(sd, SIBA_TGSHIGH, 0);
1965cab56aceSImre Vadasz 
1966cab56aceSImre Vadasz 	val = siba_read_4_sub(sd, SIBA_IAS);
1967cab56aceSImre Vadasz 	if (val & (SIBA_IAS_INBAND_ERR | SIBA_IAS_TIMEOUT)) {
1968cab56aceSImre Vadasz 		val &= ~(SIBA_IAS_INBAND_ERR | SIBA_IAS_TIMEOUT);
1969cab56aceSImre Vadasz 		siba_write_4_sub(sd, SIBA_IAS, val);
1970cab56aceSImre Vadasz 	}
1971cab56aceSImre Vadasz 
1972cab56aceSImre Vadasz 	siba_write_4_sub(sd, SIBA_TGSLOW,
1973cab56aceSImre Vadasz 	    SIBA_TGSLOW_CLOCK | SIBA_TGSLOW_FGC | flags);
1974cab56aceSImre Vadasz 	siba_read_4_sub(sd, SIBA_TGSLOW);
1975cab56aceSImre Vadasz 	DELAY(1);
1976cab56aceSImre Vadasz 
1977cab56aceSImre Vadasz 	siba_write_4_sub(sd, SIBA_TGSLOW, SIBA_TGSLOW_CLOCK | flags);
1978cab56aceSImre Vadasz 	siba_read_4_sub(sd, SIBA_TGSLOW);
1979cab56aceSImre Vadasz 	DELAY(1);
1980cab56aceSImre Vadasz }
1981cab56aceSImre Vadasz 
1982cab56aceSImre Vadasz static uint32_t
siba_tmslow_reject_bitmask(struct siba_dev_softc * sd)1983cab56aceSImre Vadasz siba_tmslow_reject_bitmask(struct siba_dev_softc *sd)
1984cab56aceSImre Vadasz {
1985cab56aceSImre Vadasz 	uint32_t rev = siba_read_4_sub(sd, SIBA_IDLOW) & SIBA_IDLOW_SSBREV;
1986cab56aceSImre Vadasz 
1987cab56aceSImre Vadasz 	switch (rev) {
1988cab56aceSImre Vadasz 	case SIBA_IDLOW_SSBREV_22:
1989cab56aceSImre Vadasz 		return (SIBA_TGSLOW_REJECT_22);
1990cab56aceSImre Vadasz 	case SIBA_IDLOW_SSBREV_23:
1991cab56aceSImre Vadasz 		return (SIBA_TGSLOW_REJECT_23);
1992cab56aceSImre Vadasz 	case SIBA_IDLOW_SSBREV_24:
1993cab56aceSImre Vadasz 	case SIBA_IDLOW_SSBREV_25:
1994cab56aceSImre Vadasz 	case SIBA_IDLOW_SSBREV_26:
1995cab56aceSImre Vadasz 	case SIBA_IDLOW_SSBREV_27:
1996cab56aceSImre Vadasz 		return (SIBA_TGSLOW_REJECT_23);
1997cab56aceSImre Vadasz 	default:
1998cab56aceSImre Vadasz 		KASSERT(0 == 1,
1999cab56aceSImre Vadasz 		    ("%s:%d: unknown backplane rev %#x\n",
2000cab56aceSImre Vadasz 			__func__, __LINE__, rev));
2001cab56aceSImre Vadasz 	}
2002cab56aceSImre Vadasz 	return (SIBA_TGSLOW_REJECT_22 | SIBA_TGSLOW_REJECT_23);
2003cab56aceSImre Vadasz }
2004cab56aceSImre Vadasz 
2005cab56aceSImre Vadasz void
siba_dev_down(device_t dev,uint32_t flags)2006cab56aceSImre Vadasz siba_dev_down(device_t dev, uint32_t flags)
2007cab56aceSImre Vadasz {
2008cab56aceSImre Vadasz 	struct siba_dev_softc *sd = device_get_ivars(dev);
2009cab56aceSImre Vadasz 
2010cab56aceSImre Vadasz 	siba_dev_down_sub(sd, flags);
2011cab56aceSImre Vadasz }
2012cab56aceSImre Vadasz 
2013cab56aceSImre Vadasz static void
siba_dev_down_sub(struct siba_dev_softc * sd,uint32_t flags)2014cab56aceSImre Vadasz siba_dev_down_sub(struct siba_dev_softc *sd, uint32_t flags)
2015cab56aceSImre Vadasz {
2016cab56aceSImre Vadasz 	struct siba_softc *siba = sd->sd_bus;
2017cab56aceSImre Vadasz 	uint32_t reject, val;
2018cab56aceSImre Vadasz 	int i;
2019cab56aceSImre Vadasz 
2020cab56aceSImre Vadasz 	if (siba_read_4_sub(sd, SIBA_TGSLOW) & SIBA_TGSLOW_RESET)
2021cab56aceSImre Vadasz 		return;
2022cab56aceSImre Vadasz 
2023cab56aceSImre Vadasz 	reject = siba_tmslow_reject_bitmask(sd);
2024cab56aceSImre Vadasz 	siba_write_4_sub(sd, SIBA_TGSLOW, reject | SIBA_TGSLOW_CLOCK);
2025cab56aceSImre Vadasz 
2026cab56aceSImre Vadasz 	for (i = 0; i < 1000; i++) {
2027cab56aceSImre Vadasz 		val = siba_read_4_sub(sd, SIBA_TGSLOW);
2028cab56aceSImre Vadasz 		if (val & reject)
2029cab56aceSImre Vadasz 			break;
2030cab56aceSImre Vadasz 		DELAY(10);
2031cab56aceSImre Vadasz 	}
2032cab56aceSImre Vadasz 	if ((val & reject) == 0) {
2033cab56aceSImre Vadasz 		device_printf(siba->siba_dev, "timeout (bit %#x reg %#x)\n",
2034cab56aceSImre Vadasz 		    reject, SIBA_TGSLOW);
2035cab56aceSImre Vadasz 	}
2036cab56aceSImre Vadasz 	for (i = 0; i < 1000; i++) {
2037cab56aceSImre Vadasz 		val = siba_read_4_sub(sd, SIBA_TGSHIGH);
2038cab56aceSImre Vadasz 		if (!(val & SIBA_TGSHIGH_BUSY))
2039cab56aceSImre Vadasz 			break;
2040cab56aceSImre Vadasz 		DELAY(10);
2041cab56aceSImre Vadasz 	}
2042cab56aceSImre Vadasz 	if ((val & SIBA_TGSHIGH_BUSY) != 0) {
2043cab56aceSImre Vadasz 		device_printf(siba->siba_dev, "timeout (bit %#x reg %#x)\n",
2044cab56aceSImre Vadasz 		    SIBA_TGSHIGH_BUSY, SIBA_TGSHIGH);
2045cab56aceSImre Vadasz 	}
2046cab56aceSImre Vadasz 
2047cab56aceSImre Vadasz 	siba_write_4_sub(sd, SIBA_TGSLOW, SIBA_TGSLOW_FGC | SIBA_TGSLOW_CLOCK |
2048cab56aceSImre Vadasz 	    reject | SIBA_TGSLOW_RESET | flags);
2049cab56aceSImre Vadasz 	siba_read_4_sub(sd, SIBA_TGSLOW);
2050cab56aceSImre Vadasz 	DELAY(1);
2051cab56aceSImre Vadasz 	siba_write_4_sub(sd, SIBA_TGSLOW, reject | SIBA_TGSLOW_RESET | flags);
2052cab56aceSImre Vadasz 	siba_read_4_sub(sd, SIBA_TGSLOW);
2053cab56aceSImre Vadasz 	DELAY(1);
2054cab56aceSImre Vadasz }
2055cab56aceSImre Vadasz 
2056cab56aceSImre Vadasz static void
siba_pcicore_setup(struct siba_pci * spc,struct siba_dev_softc * sd)2057cab56aceSImre Vadasz siba_pcicore_setup(struct siba_pci *spc, struct siba_dev_softc *sd)
2058cab56aceSImre Vadasz {
2059cab56aceSImre Vadasz 	struct siba_dev_softc *psd = spc->spc_dev;
2060cab56aceSImre Vadasz 	struct siba_softc *siba = psd->sd_bus;
2061cab56aceSImre Vadasz 	uint32_t tmp;
2062cab56aceSImre Vadasz 
2063cab56aceSImre Vadasz 	if (psd->sd_id.sd_device == SIBA_DEVID_PCI) {
2064cab56aceSImre Vadasz 		siba_pcicore_write_4(spc, SIBA_PCICORE_SBTOPCI2,
2065cab56aceSImre Vadasz 		    siba_pcicore_read_4(spc, SIBA_PCICORE_SBTOPCI2) |
2066cab56aceSImre Vadasz 		    SIBA_PCICORE_SBTOPCI_PREF | SIBA_PCICORE_SBTOPCI_BURST);
2067cab56aceSImre Vadasz 
2068cab56aceSImre Vadasz 		if (psd->sd_id.sd_rev < 5) {
2069cab56aceSImre Vadasz 			tmp = siba_read_4_sub(psd, SIBA_IMCFGLO);
2070cab56aceSImre Vadasz 			tmp &= ~SIBA_IMCFGLO_SERTO;
2071cab56aceSImre Vadasz 			tmp = (tmp | 2) & ~SIBA_IMCFGLO_REQTO;
2072cab56aceSImre Vadasz 			tmp |= 3 << 4 /* SIBA_IMCFGLO_REQTO_SHIFT */;
2073cab56aceSImre Vadasz 			siba_write_4_sub(psd, SIBA_IMCFGLO, tmp);
2074cab56aceSImre Vadasz 
2075cab56aceSImre Vadasz 			/* broadcast value */
2076cab56aceSImre Vadasz 			sd = (siba->siba_cc.scc_dev != NULL) ?
2077cab56aceSImre Vadasz 			    siba->siba_cc.scc_dev : siba->siba_pci.spc_dev;
2078cab56aceSImre Vadasz 			if (sd != NULL) {
2079cab56aceSImre Vadasz 				siba_write_4_sub(sd, SIBA_PCICORE_BCAST_ADDR,
2080cab56aceSImre Vadasz 				    0xfd8);
2081cab56aceSImre Vadasz 				siba_read_4_sub(sd, SIBA_PCICORE_BCAST_ADDR);
2082cab56aceSImre Vadasz 				siba_write_4_sub(sd,
2083cab56aceSImre Vadasz 				    SIBA_PCICORE_BCAST_DATA, 0);
2084cab56aceSImre Vadasz 				siba_read_4_sub(sd, SIBA_PCICORE_BCAST_DATA);
2085cab56aceSImre Vadasz 			}
2086cab56aceSImre Vadasz 		} else if (psd->sd_id.sd_rev >= 11) {
2087cab56aceSImre Vadasz 			tmp = siba_pcicore_read_4(spc, SIBA_PCICORE_SBTOPCI2);
2088cab56aceSImre Vadasz 			tmp |= SIBA_PCICORE_SBTOPCI_MRM;
2089cab56aceSImre Vadasz 			siba_pcicore_write_4(spc, SIBA_PCICORE_SBTOPCI2, tmp);
2090cab56aceSImre Vadasz 		}
2091cab56aceSImre Vadasz 	} else {
2092cab56aceSImre Vadasz 		KASSERT(psd->sd_id.sd_device == SIBA_DEVID_PCIE, ("only PCIE"));
2093cab56aceSImre Vadasz 		if ((psd->sd_id.sd_rev == 0) || (psd->sd_id.sd_rev == 1))
2094cab56aceSImre Vadasz 			siba_pcie_write(spc, 0x4,
2095cab56aceSImre Vadasz 			    siba_pcie_read(spc, 0x4) | 0x8);
2096cab56aceSImre Vadasz 		if (psd->sd_id.sd_rev == 0) {
2097cab56aceSImre Vadasz 			siba_pcie_mdio_write(spc, 0x1f, 2, 0x8128); /* Timer */
2098cab56aceSImre Vadasz 			siba_pcie_mdio_write(spc, 0x1f, 6, 0x0100); /* CDR */
2099cab56aceSImre Vadasz 			siba_pcie_mdio_write(spc, 0x1f, 7, 0x1466); /* CDR BW */
2100cab56aceSImre Vadasz 		} else if (psd->sd_id.sd_rev == 1)
2101cab56aceSImre Vadasz 			siba_pcie_write(spc, 0x100,
2102cab56aceSImre Vadasz 			    siba_pcie_read(spc, 0x100) | 0x40);
2103cab56aceSImre Vadasz 	}
2104cab56aceSImre Vadasz 	spc->spc_inited = 1;
2105cab56aceSImre Vadasz }
2106cab56aceSImre Vadasz 
2107cab56aceSImre Vadasz void
siba_pcicore_intr(device_t dev)2108cab56aceSImre Vadasz siba_pcicore_intr(device_t dev)
2109cab56aceSImre Vadasz {
2110cab56aceSImre Vadasz 	struct siba_dev_softc *sd = device_get_ivars(dev);
2111cab56aceSImre Vadasz 	struct siba_softc *siba = sd->sd_bus;
2112cab56aceSImre Vadasz 	struct siba_pci *spc = &siba->siba_pci;
2113cab56aceSImre Vadasz 	struct siba_dev_softc *psd = spc->spc_dev;
2114cab56aceSImre Vadasz 	uint32_t tmp;
2115cab56aceSImre Vadasz 
2116cab56aceSImre Vadasz 	if (siba->siba_type != SIBA_TYPE_PCI || !psd)
2117cab56aceSImre Vadasz 		return;
2118cab56aceSImre Vadasz 
2119cab56aceSImre Vadasz 	KASSERT(siba == psd->sd_bus, ("different pointers"));
2120cab56aceSImre Vadasz 
2121cab56aceSImre Vadasz 	/* enable interrupts */
2122cab56aceSImre Vadasz 	if (siba->siba_dev != NULL &&
2123cab56aceSImre Vadasz 	    (psd->sd_id.sd_rev >= 6 ||
2124cab56aceSImre Vadasz 	     psd->sd_id.sd_device == SIBA_DEVID_PCIE)) {
2125cab56aceSImre Vadasz 		tmp = pci_read_config(siba->siba_dev, SIBA_IRQMASK, 4);
2126cab56aceSImre Vadasz 		tmp |= (1 << sd->sd_coreidx) << 8;
2127cab56aceSImre Vadasz 		pci_write_config(siba->siba_dev, SIBA_IRQMASK, tmp, 4);
2128cab56aceSImre Vadasz 	} else {
2129cab56aceSImre Vadasz 		tmp = siba_read_4_sub(sd, SIBA_TPS);
2130cab56aceSImre Vadasz 		tmp &= SIBA_TPS_BPFLAG;
2131cab56aceSImre Vadasz 		siba_write_4_sub(psd, SIBA_INTR_MASK,
2132cab56aceSImre Vadasz 		    siba_read_4_sub(psd, SIBA_INTR_MASK) | (1 << tmp));
2133cab56aceSImre Vadasz 	}
2134cab56aceSImre Vadasz 
2135cab56aceSImre Vadasz 	/* setup PCIcore */
2136cab56aceSImre Vadasz 	if (spc->spc_inited == 0)
2137cab56aceSImre Vadasz 		siba_pcicore_setup(spc, sd);
2138cab56aceSImre Vadasz }
2139cab56aceSImre Vadasz 
2140cab56aceSImre Vadasz static uint32_t
siba_pcicore_read_4(struct siba_pci * spc,uint16_t offset)2141cab56aceSImre Vadasz siba_pcicore_read_4(struct siba_pci *spc, uint16_t offset)
2142cab56aceSImre Vadasz {
2143cab56aceSImre Vadasz 
2144cab56aceSImre Vadasz 	return (siba_read_4_sub(spc->spc_dev, offset));
2145cab56aceSImre Vadasz }
2146cab56aceSImre Vadasz 
2147cab56aceSImre Vadasz static void
siba_pcicore_write_4(struct siba_pci * spc,uint16_t offset,uint32_t value)2148cab56aceSImre Vadasz siba_pcicore_write_4(struct siba_pci *spc, uint16_t offset, uint32_t value)
2149cab56aceSImre Vadasz {
2150cab56aceSImre Vadasz 
2151cab56aceSImre Vadasz 	siba_write_4_sub(spc->spc_dev, offset, value);
2152cab56aceSImre Vadasz }
2153cab56aceSImre Vadasz 
2154cab56aceSImre Vadasz static uint32_t
siba_pcie_read(struct siba_pci * spc,uint32_t address)2155cab56aceSImre Vadasz siba_pcie_read(struct siba_pci *spc, uint32_t address)
2156cab56aceSImre Vadasz {
2157cab56aceSImre Vadasz 
2158cab56aceSImre Vadasz 	siba_pcicore_write_4(spc, 0x130, address);
2159cab56aceSImre Vadasz 	return (siba_pcicore_read_4(spc, 0x134));
2160cab56aceSImre Vadasz }
2161cab56aceSImre Vadasz 
2162cab56aceSImre Vadasz static void
siba_pcie_write(struct siba_pci * spc,uint32_t address,uint32_t data)2163cab56aceSImre Vadasz siba_pcie_write(struct siba_pci *spc, uint32_t address, uint32_t data)
2164cab56aceSImre Vadasz {
2165cab56aceSImre Vadasz 
2166cab56aceSImre Vadasz 	siba_pcicore_write_4(spc, 0x130, address);
2167cab56aceSImre Vadasz 	siba_pcicore_write_4(spc, 0x134, data);
2168cab56aceSImre Vadasz }
2169cab56aceSImre Vadasz 
2170cab56aceSImre Vadasz static void
siba_pcie_mdio_write(struct siba_pci * spc,uint8_t device,uint8_t address,uint16_t data)2171cab56aceSImre Vadasz siba_pcie_mdio_write(struct siba_pci *spc, uint8_t device, uint8_t address,
2172cab56aceSImre Vadasz     uint16_t data)
2173cab56aceSImre Vadasz {
2174cab56aceSImre Vadasz 	int i;
2175cab56aceSImre Vadasz 
2176cab56aceSImre Vadasz 	siba_pcicore_write_4(spc, SIBA_PCICORE_MDIO_CTL, 0x80 | 0x2);
2177cab56aceSImre Vadasz 	siba_pcicore_write_4(spc, SIBA_PCICORE_MDIO_DATA,
2178cab56aceSImre Vadasz 	    (1 << 30) | (1 << 28) |
2179cab56aceSImre Vadasz 	    ((uint32_t)device << 22) | ((uint32_t)address << 18) |
2180cab56aceSImre Vadasz 	    (1 << 17) | data);
2181cab56aceSImre Vadasz 	DELAY(10);
2182cab56aceSImre Vadasz 	for (i = 0; i < 10; i++) {
2183cab56aceSImre Vadasz 		if (siba_pcicore_read_4(spc, SIBA_PCICORE_MDIO_CTL) & 0x100)
2184cab56aceSImre Vadasz 			break;
2185cab56aceSImre Vadasz 		DELAY(1000);
2186cab56aceSImre Vadasz 	}
2187cab56aceSImre Vadasz 	siba_pcicore_write_4(spc, SIBA_PCICORE_MDIO_CTL, 0);
2188cab56aceSImre Vadasz }
2189cab56aceSImre Vadasz 
2190cab56aceSImre Vadasz uint32_t
siba_dma_translation(device_t dev)2191cab56aceSImre Vadasz siba_dma_translation(device_t dev)
2192cab56aceSImre Vadasz {
2193cab56aceSImre Vadasz #ifdef INVARIANTS
2194cab56aceSImre Vadasz 	struct siba_dev_softc *sd = device_get_ivars(dev);
2195cab56aceSImre Vadasz 	struct siba_softc *siba = sd->sd_bus;
2196cab56aceSImre Vadasz 
2197cab56aceSImre Vadasz 	KASSERT(siba->siba_type == SIBA_TYPE_PCI,
2198cab56aceSImre Vadasz 	    ("unsupported bustype %d\n", siba->siba_type));
2199cab56aceSImre Vadasz #endif
2200cab56aceSImre Vadasz 	return (SIBA_PCI_DMA);
2201cab56aceSImre Vadasz }
2202cab56aceSImre Vadasz 
2203cab56aceSImre Vadasz void
siba_barrier(device_t dev,int flags)2204cab56aceSImre Vadasz siba_barrier(device_t dev, int flags)
2205cab56aceSImre Vadasz {
2206cab56aceSImre Vadasz 	struct siba_dev_softc *sd = device_get_ivars(dev);
2207cab56aceSImre Vadasz 	struct siba_softc *siba = sd->sd_bus;
2208cab56aceSImre Vadasz 
2209cab56aceSImre Vadasz 	SIBA_BARRIER(siba, flags);
2210cab56aceSImre Vadasz }
2211cab56aceSImre Vadasz 
2212cab56aceSImre Vadasz static void
siba_cc_suspend(struct siba_cc * scc)2213cab56aceSImre Vadasz siba_cc_suspend(struct siba_cc *scc)
2214cab56aceSImre Vadasz {
2215cab56aceSImre Vadasz 
2216cab56aceSImre Vadasz 	siba_cc_clock(scc, SIBA_CLOCK_SLOW);
2217cab56aceSImre Vadasz }
2218cab56aceSImre Vadasz 
2219cab56aceSImre Vadasz static void
siba_cc_resume(struct siba_cc * scc)2220cab56aceSImre Vadasz siba_cc_resume(struct siba_cc *scc)
2221cab56aceSImre Vadasz {
2222cab56aceSImre Vadasz 
2223cab56aceSImre Vadasz 	siba_cc_power_init(scc);
2224cab56aceSImre Vadasz 	siba_cc_clock(scc, SIBA_CLOCK_FAST);
2225cab56aceSImre Vadasz }
2226cab56aceSImre Vadasz 
2227cab56aceSImre Vadasz int
siba_core_suspend(struct siba_softc * siba)2228cab56aceSImre Vadasz siba_core_suspend(struct siba_softc *siba)
2229cab56aceSImre Vadasz {
2230cab56aceSImre Vadasz 
2231cab56aceSImre Vadasz 	siba_cc_suspend(&siba->siba_cc);
2232cab56aceSImre Vadasz 	siba_pci_gpio(siba, SIBA_GPIO_CRYSTAL | SIBA_GPIO_PLL, 0);
2233cab56aceSImre Vadasz 	return (0);
2234cab56aceSImre Vadasz }
2235cab56aceSImre Vadasz 
2236cab56aceSImre Vadasz int
siba_core_resume(struct siba_softc * siba)2237cab56aceSImre Vadasz siba_core_resume(struct siba_softc *siba)
2238cab56aceSImre Vadasz {
2239cab56aceSImre Vadasz 
2240cab56aceSImre Vadasz 	siba->siba_pci.spc_inited = 0;
2241cab56aceSImre Vadasz 	siba->siba_curdev = NULL;
2242cab56aceSImre Vadasz 
2243cab56aceSImre Vadasz 	siba_powerup_sub(siba, 0);
2244cab56aceSImre Vadasz 	/* XXX setup H/W for PCMCIA??? */
2245cab56aceSImre Vadasz 	siba_cc_resume(&siba->siba_cc);
2246cab56aceSImre Vadasz 	siba_powerdown_sub(siba);
2247cab56aceSImre Vadasz 
2248cab56aceSImre Vadasz 	return (0);
2249cab56aceSImre Vadasz }
2250cab56aceSImre Vadasz 
2251cab56aceSImre Vadasz static void
siba_cc_regctl_setmask(struct siba_cc * cc,uint32_t offset,uint32_t mask,uint32_t set)2252cab56aceSImre Vadasz siba_cc_regctl_setmask(struct siba_cc *cc, uint32_t offset, uint32_t mask,
2253cab56aceSImre Vadasz     uint32_t set)
2254cab56aceSImre Vadasz {
2255cab56aceSImre Vadasz 
2256cab56aceSImre Vadasz 	SIBA_CC_READ32(cc, SIBA_CC_REGCTL_ADDR);
2257cab56aceSImre Vadasz 	SIBA_CC_WRITE32(cc, SIBA_CC_REGCTL_ADDR, offset);
2258cab56aceSImre Vadasz 	SIBA_CC_READ32(cc, SIBA_CC_REGCTL_ADDR);
2259cab56aceSImre Vadasz 	SIBA_CC_WRITE32(cc, SIBA_CC_REGCTL_DATA,
2260cab56aceSImre Vadasz 	    (SIBA_CC_READ32(cc, SIBA_CC_REGCTL_DATA) & mask) | set);
2261cab56aceSImre Vadasz 	SIBA_CC_READ32(cc, SIBA_CC_REGCTL_DATA);
2262cab56aceSImre Vadasz }
2263cab56aceSImre Vadasz 
2264cab56aceSImre Vadasz void
siba_cc_pmu_set_ldovolt(device_t dev,int id,uint32_t volt)2265cab56aceSImre Vadasz siba_cc_pmu_set_ldovolt(device_t dev, int id, uint32_t volt)
2266cab56aceSImre Vadasz {
2267cab56aceSImre Vadasz 	struct siba_dev_softc *sd = device_get_ivars(dev);
2268cab56aceSImre Vadasz 	struct siba_softc *siba = sd->sd_bus;
2269cab56aceSImre Vadasz 	struct siba_cc *scc = &siba->siba_cc;
2270cab56aceSImre Vadasz 	uint32_t *p = NULL, info[5][3] = {
2271cab56aceSImre Vadasz 		{ 2, 25,  0xf },
2272cab56aceSImre Vadasz 		{ 3,  1,  0xf },
2273cab56aceSImre Vadasz 		{ 3,  9,  0xf },
2274cab56aceSImre Vadasz 		{ 3, 17, 0x3f },
2275cab56aceSImre Vadasz 		{ 0, 21, 0x3f }
2276cab56aceSImre Vadasz 	};
2277cab56aceSImre Vadasz 
2278cab56aceSImre Vadasz 	if (siba->siba_chipid == 0x4312) {
2279cab56aceSImre Vadasz 		if (id != SIBA_LDO_PAREF)
2280cab56aceSImre Vadasz 			return;
2281cab56aceSImre Vadasz 		p = info[4];
2282cab56aceSImre Vadasz 		siba_cc_regctl_setmask(scc, p[0], ~(p[2] << p[1]),
2283cab56aceSImre Vadasz 		    (volt & p[2]) << p[1]);
2284cab56aceSImre Vadasz 		return;
2285cab56aceSImre Vadasz 	}
2286cab56aceSImre Vadasz 	if (siba->siba_chipid == 0x4328 || siba->siba_chipid == 0x5354) {
2287cab56aceSImre Vadasz 		switch (id) {
2288cab56aceSImre Vadasz 		case SIBA_LDO_PAREF:
2289cab56aceSImre Vadasz 			p = info[3];
2290cab56aceSImre Vadasz 			break;
2291cab56aceSImre Vadasz 		case SIBA_LDO_VOLT1:
2292cab56aceSImre Vadasz 			p = info[0];
2293cab56aceSImre Vadasz 			break;
2294cab56aceSImre Vadasz 		case SIBA_LDO_VOLT2:
2295cab56aceSImre Vadasz 			p = info[1];
2296cab56aceSImre Vadasz 			break;
2297cab56aceSImre Vadasz 		case SIBA_LDO_VOLT3:
2298cab56aceSImre Vadasz 			p = info[2];
2299cab56aceSImre Vadasz 			break;
2300cab56aceSImre Vadasz 		default:
2301cab56aceSImre Vadasz 			KASSERT(0 == 1,
2302cab56aceSImre Vadasz 			    ("%s: unsupported voltage ID %#x", __func__, id));
2303cab56aceSImre Vadasz 			return;
2304cab56aceSImre Vadasz 		}
2305cab56aceSImre Vadasz 		siba_cc_regctl_setmask(scc, p[0], ~(p[2] << p[1]),
2306cab56aceSImre Vadasz 		    (volt & p[2]) << p[1]);
2307cab56aceSImre Vadasz 	}
2308cab56aceSImre Vadasz }
2309cab56aceSImre Vadasz 
2310cab56aceSImre Vadasz void
siba_cc_pmu_set_ldoparef(device_t dev,uint8_t on)2311cab56aceSImre Vadasz siba_cc_pmu_set_ldoparef(device_t dev, uint8_t on)
2312cab56aceSImre Vadasz {
2313cab56aceSImre Vadasz 	struct siba_dev_softc *sd = device_get_ivars(dev);
2314cab56aceSImre Vadasz 	struct siba_softc *siba = sd->sd_bus;
2315cab56aceSImre Vadasz 	struct siba_cc *scc = &siba->siba_cc;
2316cab56aceSImre Vadasz 	int ldo;
2317cab56aceSImre Vadasz 
2318cab56aceSImre Vadasz 	ldo = ((siba->siba_chipid == 0x4312) ? SIBA_CC_PMU_4312_PA_REF :
2319cab56aceSImre Vadasz 	    ((siba->siba_chipid == 0x4328) ? SIBA_CC_PMU_4328_PA_REF :
2320cab56aceSImre Vadasz 	    ((siba->siba_chipid == 0x5354) ? SIBA_CC_PMU_5354_PA_REF : -1)));
2321cab56aceSImre Vadasz 	if (ldo == -1)
2322cab56aceSImre Vadasz 		return;
2323cab56aceSImre Vadasz 
2324cab56aceSImre Vadasz 	if (on)
2325cab56aceSImre Vadasz 		SIBA_CC_SET32(scc, SIBA_CC_PMU_MINRES, 1 << ldo);
2326cab56aceSImre Vadasz 	else
2327cab56aceSImre Vadasz 		SIBA_CC_MASK32(scc, SIBA_CC_PMU_MINRES, ~(1 << ldo));
2328cab56aceSImre Vadasz 	SIBA_CC_READ32(scc, SIBA_CC_PMU_MINRES);
2329cab56aceSImre Vadasz }
2330cab56aceSImre Vadasz 
2331cab56aceSImre Vadasz int
siba_read_sprom(device_t dev,device_t child,int which,uintptr_t * result)2332cab56aceSImre Vadasz siba_read_sprom(device_t dev, device_t child, int which, uintptr_t *result)
2333cab56aceSImre Vadasz {
2334cab56aceSImre Vadasz 	struct siba_dev_softc *sd = device_get_ivars(child);
2335cab56aceSImre Vadasz 	struct siba_softc *siba = sd->sd_bus;
2336cab56aceSImre Vadasz 
2337cab56aceSImre Vadasz 	switch (which) {
2338cab56aceSImre Vadasz 	case SIBA_SPROMVAR_REV:
2339cab56aceSImre Vadasz 		*result = siba->siba_sprom.rev;
2340cab56aceSImre Vadasz 		break;
2341cab56aceSImre Vadasz 	case SIBA_SPROMVAR_MAC_80211BG:
2342cab56aceSImre Vadasz 		*((uint8_t **) result) = siba->siba_sprom.mac_80211bg;
2343cab56aceSImre Vadasz 		break;
2344cab56aceSImre Vadasz 	case SIBA_SPROMVAR_MAC_ETH:
2345cab56aceSImre Vadasz 		*((uint8_t **) result) = siba->siba_sprom.mac_eth;
2346cab56aceSImre Vadasz 		break;
2347cab56aceSImre Vadasz 	case SIBA_SPROMVAR_MAC_80211A:
2348cab56aceSImre Vadasz 		*((uint8_t **) result) = siba->siba_sprom.mac_80211a;
2349cab56aceSImre Vadasz 		break;
2350cab56aceSImre Vadasz 	case SIBA_SPROMVAR_MII_ETH0:
2351cab56aceSImre Vadasz 		*result = siba->siba_sprom.mii_eth0;
2352cab56aceSImre Vadasz 		break;
2353cab56aceSImre Vadasz 	case SIBA_SPROMVAR_MII_ETH1:
2354cab56aceSImre Vadasz 		*result = siba->siba_sprom.mii_eth1;
2355cab56aceSImre Vadasz 		break;
2356cab56aceSImre Vadasz 	case SIBA_SPROMVAR_MDIO_ETH0:
2357cab56aceSImre Vadasz 		*result = siba->siba_sprom.mdio_eth0;
2358cab56aceSImre Vadasz 		break;
2359cab56aceSImre Vadasz 	case SIBA_SPROMVAR_MDIO_ETH1:
2360cab56aceSImre Vadasz 		*result = siba->siba_sprom.mdio_eth1;
2361cab56aceSImre Vadasz 		break;
2362cab56aceSImre Vadasz 	case SIBA_SPROMVAR_BREV:
2363cab56aceSImre Vadasz 		*result = siba->siba_sprom.brev;
2364cab56aceSImre Vadasz 		break;
2365cab56aceSImre Vadasz 	case SIBA_SPROMVAR_CCODE:
2366cab56aceSImre Vadasz 		*result = siba->siba_sprom.ccode;
2367cab56aceSImre Vadasz 		break;
2368cab56aceSImre Vadasz 	case SIBA_SPROMVAR_ANT_A:
2369cab56aceSImre Vadasz 		*result = siba->siba_sprom.ant_a;
2370cab56aceSImre Vadasz 		break;
2371cab56aceSImre Vadasz 	case SIBA_SPROMVAR_ANT_BG:
2372cab56aceSImre Vadasz 		*result = siba->siba_sprom.ant_bg;
2373cab56aceSImre Vadasz 		break;
2374cab56aceSImre Vadasz 	case SIBA_SPROMVAR_PA0B0:
2375cab56aceSImre Vadasz 		*result = siba->siba_sprom.pa0b0;
2376cab56aceSImre Vadasz 		break;
2377cab56aceSImre Vadasz 	case SIBA_SPROMVAR_PA0B1:
2378cab56aceSImre Vadasz 		*result = siba->siba_sprom.pa0b1;
2379cab56aceSImre Vadasz 		break;
2380cab56aceSImre Vadasz 	case SIBA_SPROMVAR_PA0B2:
2381cab56aceSImre Vadasz 		*result = siba->siba_sprom.pa0b2;
2382cab56aceSImre Vadasz 		break;
2383cab56aceSImre Vadasz 	case SIBA_SPROMVAR_PA1B0:
2384cab56aceSImre Vadasz 		*result = siba->siba_sprom.pa1b0;
2385cab56aceSImre Vadasz 		break;
2386cab56aceSImre Vadasz 	case SIBA_SPROMVAR_PA1B1:
2387cab56aceSImre Vadasz 		*result = siba->siba_sprom.pa1b1;
2388cab56aceSImre Vadasz 		break;
2389cab56aceSImre Vadasz 	case SIBA_SPROMVAR_PA1B2:
2390cab56aceSImre Vadasz 		*result = siba->siba_sprom.pa1b2;
2391cab56aceSImre Vadasz 		break;
2392cab56aceSImre Vadasz 	case SIBA_SPROMVAR_PA1LOB0:
2393cab56aceSImre Vadasz 		*result = siba->siba_sprom.pa1lob0;
2394cab56aceSImre Vadasz 		break;
2395cab56aceSImre Vadasz 	case SIBA_SPROMVAR_PA1LOB1:
2396cab56aceSImre Vadasz 		*result = siba->siba_sprom.pa1lob1;
2397cab56aceSImre Vadasz 		break;
2398cab56aceSImre Vadasz 	case SIBA_SPROMVAR_PA1LOB2:
2399cab56aceSImre Vadasz 		*result = siba->siba_sprom.pa1lob2;
2400cab56aceSImre Vadasz 		break;
2401cab56aceSImre Vadasz 	case SIBA_SPROMVAR_PA1HIB0:
2402cab56aceSImre Vadasz 		*result = siba->siba_sprom.pa1hib0;
2403cab56aceSImre Vadasz 		break;
2404cab56aceSImre Vadasz 	case SIBA_SPROMVAR_PA1HIB1:
2405cab56aceSImre Vadasz 		*result = siba->siba_sprom.pa1hib1;
2406cab56aceSImre Vadasz 		break;
2407cab56aceSImre Vadasz 	case SIBA_SPROMVAR_PA1HIB2:
2408cab56aceSImre Vadasz 		*result = siba->siba_sprom.pa1hib2;
2409cab56aceSImre Vadasz 		break;
2410cab56aceSImre Vadasz 	case SIBA_SPROMVAR_GPIO0:
2411cab56aceSImre Vadasz 		*result = siba->siba_sprom.gpio0;
2412cab56aceSImre Vadasz 		break;
2413cab56aceSImre Vadasz 	case SIBA_SPROMVAR_GPIO1:
2414cab56aceSImre Vadasz 		*result = siba->siba_sprom.gpio1;
2415cab56aceSImre Vadasz 		break;
2416cab56aceSImre Vadasz 	case SIBA_SPROMVAR_GPIO2:
2417cab56aceSImre Vadasz 		*result = siba->siba_sprom.gpio2;
2418cab56aceSImre Vadasz 		break;
2419cab56aceSImre Vadasz 	case SIBA_SPROMVAR_GPIO3:
2420cab56aceSImre Vadasz 		*result = siba->siba_sprom.gpio3;
2421cab56aceSImre Vadasz 		break;
2422cab56aceSImre Vadasz 	case SIBA_SPROMVAR_MAXPWR_AL:
2423cab56aceSImre Vadasz 		*result = siba->siba_sprom.maxpwr_al;
2424cab56aceSImre Vadasz 		break;
2425cab56aceSImre Vadasz 	case SIBA_SPROMVAR_MAXPWR_A:
2426cab56aceSImre Vadasz 		*result = siba->siba_sprom.maxpwr_a;
2427cab56aceSImre Vadasz 		break;
2428cab56aceSImre Vadasz 	case SIBA_SPROMVAR_MAXPWR_AH:
2429cab56aceSImre Vadasz 		*result = siba->siba_sprom.maxpwr_ah;
2430cab56aceSImre Vadasz 		break;
2431cab56aceSImre Vadasz 	case SIBA_SPROMVAR_MAXPWR_BG:
2432cab56aceSImre Vadasz 		*result = siba->siba_sprom.maxpwr_bg;
2433cab56aceSImre Vadasz 		break;
2434cab56aceSImre Vadasz 	case SIBA_SPROMVAR_RXPO2G:
2435cab56aceSImre Vadasz 		*result = siba->siba_sprom.rxpo2g;
2436cab56aceSImre Vadasz 		break;
2437cab56aceSImre Vadasz 	case SIBA_SPROMVAR_RXPO5G:
2438cab56aceSImre Vadasz 		*result = siba->siba_sprom.rxpo5g;
2439cab56aceSImre Vadasz 		break;
2440cab56aceSImre Vadasz 	case SIBA_SPROMVAR_TSSI_A:
2441cab56aceSImre Vadasz 		*result = siba->siba_sprom.tssi_a;
2442cab56aceSImre Vadasz 		break;
2443cab56aceSImre Vadasz 	case SIBA_SPROMVAR_TSSI_BG:
2444cab56aceSImre Vadasz 		*result = siba->siba_sprom.tssi_bg;
2445cab56aceSImre Vadasz 		break;
2446cab56aceSImre Vadasz 	case SIBA_SPROMVAR_TRI2G:
2447cab56aceSImre Vadasz 		*result = siba->siba_sprom.tri2g;
2448cab56aceSImre Vadasz 		break;
2449cab56aceSImre Vadasz 	case SIBA_SPROMVAR_TRI5GL:
2450cab56aceSImre Vadasz 		*result = siba->siba_sprom.tri5gl;
2451cab56aceSImre Vadasz 		break;
2452cab56aceSImre Vadasz 	case SIBA_SPROMVAR_TRI5G:
2453cab56aceSImre Vadasz 		*result = siba->siba_sprom.tri5g;
2454cab56aceSImre Vadasz 		break;
2455cab56aceSImre Vadasz 	case SIBA_SPROMVAR_TRI5GH:
2456cab56aceSImre Vadasz 		*result = siba->siba_sprom.tri5gh;
2457cab56aceSImre Vadasz 		break;
2458cab56aceSImre Vadasz 	case SIBA_SPROMVAR_RSSISAV2G:
2459cab56aceSImre Vadasz 		*result = siba->siba_sprom.rssisav2g;
2460cab56aceSImre Vadasz 		break;
2461cab56aceSImre Vadasz 	case SIBA_SPROMVAR_RSSISMC2G:
2462cab56aceSImre Vadasz 		*result = siba->siba_sprom.rssismc2g;
2463cab56aceSImre Vadasz 		break;
2464cab56aceSImre Vadasz 	case SIBA_SPROMVAR_RSSISMF2G:
2465cab56aceSImre Vadasz 		*result = siba->siba_sprom.rssismf2g;
2466cab56aceSImre Vadasz 		break;
2467cab56aceSImre Vadasz 	case SIBA_SPROMVAR_BXA2G:
2468cab56aceSImre Vadasz 		*result = siba->siba_sprom.bxa2g;
2469cab56aceSImre Vadasz 		break;
2470cab56aceSImre Vadasz 	case SIBA_SPROMVAR_RSSISAV5G:
2471cab56aceSImre Vadasz 		*result = siba->siba_sprom.rssisav5g;
2472cab56aceSImre Vadasz 		break;
2473cab56aceSImre Vadasz 	case SIBA_SPROMVAR_RSSISMC5G:
2474cab56aceSImre Vadasz 		*result = siba->siba_sprom.rssismc5g;
2475cab56aceSImre Vadasz 		break;
2476cab56aceSImre Vadasz 	case SIBA_SPROMVAR_RSSISMF5G:
2477cab56aceSImre Vadasz 		*result = siba->siba_sprom.rssismf5g;
2478cab56aceSImre Vadasz 		break;
2479cab56aceSImre Vadasz 	case SIBA_SPROMVAR_BXA5G:
2480cab56aceSImre Vadasz 		*result = siba->siba_sprom.bxa5g;
2481cab56aceSImre Vadasz 		break;
2482cab56aceSImre Vadasz 	case SIBA_SPROMVAR_CCK2GPO:
2483cab56aceSImre Vadasz 		*result = siba->siba_sprom.cck2gpo;
2484cab56aceSImre Vadasz 		break;
2485cab56aceSImre Vadasz 	case SIBA_SPROMVAR_OFDM2GPO:
2486cab56aceSImre Vadasz 		*result = siba->siba_sprom.ofdm2gpo;
2487cab56aceSImre Vadasz 		break;
2488cab56aceSImre Vadasz 	case SIBA_SPROMVAR_OFDM5GLPO:
2489cab56aceSImre Vadasz 		*result = siba->siba_sprom.ofdm5glpo;
2490cab56aceSImre Vadasz 		break;
2491cab56aceSImre Vadasz 	case SIBA_SPROMVAR_OFDM5GPO:
2492cab56aceSImre Vadasz 		*result = siba->siba_sprom.ofdm5gpo;
2493cab56aceSImre Vadasz 		break;
2494cab56aceSImre Vadasz 	case SIBA_SPROMVAR_OFDM5GHPO:
2495cab56aceSImre Vadasz 		*result = siba->siba_sprom.ofdm5ghpo;
2496cab56aceSImre Vadasz 		break;
2497cab56aceSImre Vadasz 	case SIBA_SPROMVAR_BF_LO:
2498cab56aceSImre Vadasz 		*result = siba->siba_sprom.bf_lo;
2499cab56aceSImre Vadasz 		break;
2500cab56aceSImre Vadasz 	case SIBA_SPROMVAR_BF_HI:
2501cab56aceSImre Vadasz 		*result = siba->siba_sprom.bf_hi;
2502cab56aceSImre Vadasz 		break;
2503cab56aceSImre Vadasz 	case SIBA_SPROMVAR_BF2_LO:
2504cab56aceSImre Vadasz 		*result = siba->siba_sprom.bf2_lo;
2505cab56aceSImre Vadasz 		break;
2506cab56aceSImre Vadasz 	case SIBA_SPROMVAR_BF2_HI:
2507cab56aceSImre Vadasz 		*result = siba->siba_sprom.bf2_hi;
2508cab56aceSImre Vadasz 		break;
25097872accfSImre Vadász 	case SIBA_SPROMVAR_FEM_2GHZ_TSSIPOS:
25107872accfSImre Vadász 		*result = siba->siba_sprom.fem.ghz2.tssipos;
25117872accfSImre Vadász 		break;
25127872accfSImre Vadász 	case SIBA_SPROMVAR_FEM_2GHZ_EXTPAGAIN:
25137872accfSImre Vadász 		*result = siba->siba_sprom.fem.ghz2.extpa_gain;
25147872accfSImre Vadász 		break;
25157872accfSImre Vadász 	case SIBA_SPROMVAR_FEM_2GHZ_PDET_RANGE:
25167872accfSImre Vadász 		*result = siba->siba_sprom.fem.ghz2.pdet_range;
25177872accfSImre Vadász 		break;
25187872accfSImre Vadász 	case SIBA_SPROMVAR_FEM_2GHZ_TR_ISO:
25197872accfSImre Vadász 		*result = siba->siba_sprom.fem.ghz2.tr_iso;
25207872accfSImre Vadász 		break;
25217872accfSImre Vadász 	case SIBA_SPROMVAR_FEM_2GHZ_ANTSWLUT:
25227872accfSImre Vadász 		*result = siba->siba_sprom.fem.ghz2.antswlut;
25237872accfSImre Vadász 		break;
25247872accfSImre Vadász 	case SIBA_SPROMVAR_FEM_5GHZ_TSSIPOS:
25257872accfSImre Vadász 		*result = siba->siba_sprom.fem.ghz5.tssipos;
25267872accfSImre Vadász 		break;
25277872accfSImre Vadász 	case SIBA_SPROMVAR_FEM_5GHZ_EXTPAGAIN:
25287872accfSImre Vadász 		*result = siba->siba_sprom.fem.ghz5.extpa_gain;
25297872accfSImre Vadász 		break;
25307872accfSImre Vadász 	case SIBA_SPROMVAR_FEM_5GHZ_PDET_RANGE:
25317872accfSImre Vadász 		*result = siba->siba_sprom.fem.ghz5.pdet_range;
25327872accfSImre Vadász 		break;
25337872accfSImre Vadász 	case SIBA_SPROMVAR_FEM_5GHZ_TR_ISO:
25347872accfSImre Vadász 		*result = siba->siba_sprom.fem.ghz5.tr_iso;
25357872accfSImre Vadász 		break;
25367872accfSImre Vadász 	case SIBA_SPROMVAR_FEM_5GHZ_ANTSWLUT:
25377872accfSImre Vadász 		*result = siba->siba_sprom.fem.ghz5.antswlut;
25387872accfSImre Vadász 		break;
25397872accfSImre Vadász 	case SIBA_SPROMVAR_TXPID_2G_0:
25407872accfSImre Vadász 		*result = siba->siba_sprom.txpid2g[0];
25417872accfSImre Vadász 		break;
25427872accfSImre Vadász 	case SIBA_SPROMVAR_TXPID_2G_1:
25437872accfSImre Vadász 		*result = siba->siba_sprom.txpid2g[1];
25447872accfSImre Vadász 		break;
25457872accfSImre Vadász 	case SIBA_SPROMVAR_TXPID_2G_2:
25467872accfSImre Vadász 		*result = siba->siba_sprom.txpid2g[2];
25477872accfSImre Vadász 		break;
25487872accfSImre Vadász 	case SIBA_SPROMVAR_TXPID_2G_3:
25497872accfSImre Vadász 		*result = siba->siba_sprom.txpid2g[3];
25507872accfSImre Vadász 		break;
25517872accfSImre Vadász 	case SIBA_SPROMVAR_TXPID_5GL_0:
25527872accfSImre Vadász 		*result = siba->siba_sprom.txpid5gl[0];
25537872accfSImre Vadász 		break;
25547872accfSImre Vadász 	case SIBA_SPROMVAR_TXPID_5GL_1:
25557872accfSImre Vadász 		*result = siba->siba_sprom.txpid5gl[1];
25567872accfSImre Vadász 		break;
25577872accfSImre Vadász 	case SIBA_SPROMVAR_TXPID_5GL_2:
25587872accfSImre Vadász 		*result = siba->siba_sprom.txpid5gl[2];
25597872accfSImre Vadász 		break;
25607872accfSImre Vadász 	case SIBA_SPROMVAR_TXPID_5GL_3:
25617872accfSImre Vadász 		*result = siba->siba_sprom.txpid5gl[3];
25627872accfSImre Vadász 		break;
25637872accfSImre Vadász 	case SIBA_SPROMVAR_TXPID_5G_0:
25647872accfSImre Vadász 		*result = siba->siba_sprom.txpid5g[0];
25657872accfSImre Vadász 		break;
25667872accfSImre Vadász 	case SIBA_SPROMVAR_TXPID_5G_1:
25677872accfSImre Vadász 		*result = siba->siba_sprom.txpid5g[1];
25687872accfSImre Vadász 		break;
25697872accfSImre Vadász 	case SIBA_SPROMVAR_TXPID_5G_2:
25707872accfSImre Vadász 		*result = siba->siba_sprom.txpid5g[2];
25717872accfSImre Vadász 		break;
25727872accfSImre Vadász 	case SIBA_SPROMVAR_TXPID_5G_3:
25737872accfSImre Vadász 		*result = siba->siba_sprom.txpid5g[3];
25747872accfSImre Vadász 		break;
25757872accfSImre Vadász 	case SIBA_SPROMVAR_TXPID_5GH_0:
25767872accfSImre Vadász 		*result = siba->siba_sprom.txpid5gh[0];
25777872accfSImre Vadász 		break;
25787872accfSImre Vadász 	case SIBA_SPROMVAR_TXPID_5GH_1:
25797872accfSImre Vadász 		*result = siba->siba_sprom.txpid5gh[1];
25807872accfSImre Vadász 		break;
25817872accfSImre Vadász 	case SIBA_SPROMVAR_TXPID_5GH_2:
25827872accfSImre Vadász 		*result = siba->siba_sprom.txpid5gh[2];
25837872accfSImre Vadász 		break;
25847872accfSImre Vadász 	case SIBA_SPROMVAR_TXPID_5GH_3:
25857872accfSImre Vadász 		*result = siba->siba_sprom.txpid5gh[3];
25867872accfSImre Vadász 		break;
25877872accfSImre Vadász 	case SIBA_SPROMVAR_STBCPO:
25887872accfSImre Vadász 		*result = siba->siba_sprom.stbcpo;
25897872accfSImre Vadász 		break;
25907872accfSImre Vadász 	case SIBA_SPROMVAR_CDDPO:
25917872accfSImre Vadász 		*result = siba->siba_sprom.cddpo;
25927872accfSImre Vadász 		break;
2593cab56aceSImre Vadasz 	default:
2594cab56aceSImre Vadasz 		return (ENOENT);
2595cab56aceSImre Vadasz 	}
2596cab56aceSImre Vadasz 	return (0);
2597cab56aceSImre Vadasz }
2598cab56aceSImre Vadasz 
2599cab56aceSImre Vadasz int
siba_write_sprom(device_t dev,device_t child,int which,uintptr_t value)2600cab56aceSImre Vadasz siba_write_sprom(device_t dev, device_t child, int which, uintptr_t value)
2601cab56aceSImre Vadasz {
2602cab56aceSImre Vadasz 	struct siba_dev_softc *sd = device_get_ivars(child);
2603cab56aceSImre Vadasz 	struct siba_softc *siba = sd->sd_bus;
2604cab56aceSImre Vadasz 
2605cab56aceSImre Vadasz 	switch (which) {
2606cab56aceSImre Vadasz 	case SIBA_SPROMVAR_REV:
2607cab56aceSImre Vadasz 		siba->siba_sprom.rev = value;
2608cab56aceSImre Vadasz 		break;
2609cab56aceSImre Vadasz 	case SIBA_SPROMVAR_MII_ETH0:
2610cab56aceSImre Vadasz 		siba->siba_sprom.mii_eth0 = value;
2611cab56aceSImre Vadasz 		break;
2612cab56aceSImre Vadasz 	case SIBA_SPROMVAR_MII_ETH1:
2613cab56aceSImre Vadasz 		siba->siba_sprom.mii_eth1 = value;
2614cab56aceSImre Vadasz 		break;
2615cab56aceSImre Vadasz 	case SIBA_SPROMVAR_MDIO_ETH0:
2616cab56aceSImre Vadasz 		siba->siba_sprom.mdio_eth0 = value;
2617cab56aceSImre Vadasz 		break;
2618cab56aceSImre Vadasz 	case SIBA_SPROMVAR_MDIO_ETH1:
2619cab56aceSImre Vadasz 		siba->siba_sprom.mdio_eth1 = value;
2620cab56aceSImre Vadasz 		break;
2621cab56aceSImre Vadasz 	case SIBA_SPROMVAR_BREV:
2622cab56aceSImre Vadasz 		siba->siba_sprom.brev = value;
2623cab56aceSImre Vadasz 		break;
2624cab56aceSImre Vadasz 	case SIBA_SPROMVAR_CCODE:
2625cab56aceSImre Vadasz 		siba->siba_sprom.ccode = value;
2626cab56aceSImre Vadasz 		break;
2627cab56aceSImre Vadasz 	case SIBA_SPROMVAR_ANT_A:
2628cab56aceSImre Vadasz 		siba->siba_sprom.ant_a = value;
2629cab56aceSImre Vadasz 		break;
2630cab56aceSImre Vadasz 	case SIBA_SPROMVAR_ANT_BG:
2631cab56aceSImre Vadasz 		siba->siba_sprom.ant_bg = value;
2632cab56aceSImre Vadasz 		break;
2633cab56aceSImre Vadasz 	case SIBA_SPROMVAR_PA0B0:
2634cab56aceSImre Vadasz 		siba->siba_sprom.pa0b0 = value;
2635cab56aceSImre Vadasz 		break;
2636cab56aceSImre Vadasz 	case SIBA_SPROMVAR_PA0B1:
2637cab56aceSImre Vadasz 		siba->siba_sprom.pa0b1 = value;
2638cab56aceSImre Vadasz 		break;
2639cab56aceSImre Vadasz 	case SIBA_SPROMVAR_PA0B2:
2640cab56aceSImre Vadasz 		siba->siba_sprom.pa0b2 = value;
2641cab56aceSImre Vadasz 		break;
2642cab56aceSImre Vadasz 	case SIBA_SPROMVAR_PA1B0:
2643cab56aceSImre Vadasz 		siba->siba_sprom.pa1b0 = value;
2644cab56aceSImre Vadasz 		break;
2645cab56aceSImre Vadasz 	case SIBA_SPROMVAR_PA1B1:
2646cab56aceSImre Vadasz 		siba->siba_sprom.pa1b1 = value;
2647cab56aceSImre Vadasz 		break;
2648cab56aceSImre Vadasz 	case SIBA_SPROMVAR_PA1B2:
2649cab56aceSImre Vadasz 		siba->siba_sprom.pa1b2 = value;
2650cab56aceSImre Vadasz 		break;
2651cab56aceSImre Vadasz 	case SIBA_SPROMVAR_PA1LOB0:
2652cab56aceSImre Vadasz 		siba->siba_sprom.pa1lob0 = value;
2653cab56aceSImre Vadasz 		break;
2654cab56aceSImre Vadasz 	case SIBA_SPROMVAR_PA1LOB1:
2655cab56aceSImre Vadasz 		siba->siba_sprom.pa1lob1 = value;
2656cab56aceSImre Vadasz 		break;
2657cab56aceSImre Vadasz 	case SIBA_SPROMVAR_PA1LOB2:
2658cab56aceSImre Vadasz 		siba->siba_sprom.pa1lob2 = value;
2659cab56aceSImre Vadasz 		break;
2660cab56aceSImre Vadasz 	case SIBA_SPROMVAR_PA1HIB0:
2661cab56aceSImre Vadasz 		siba->siba_sprom.pa1hib0 = value;
2662cab56aceSImre Vadasz 		break;
2663cab56aceSImre Vadasz 	case SIBA_SPROMVAR_PA1HIB1:
2664cab56aceSImre Vadasz 		siba->siba_sprom.pa1hib1 = value;
2665cab56aceSImre Vadasz 		break;
2666cab56aceSImre Vadasz 	case SIBA_SPROMVAR_PA1HIB2:
2667cab56aceSImre Vadasz 		siba->siba_sprom.pa1hib2 = value;
2668cab56aceSImre Vadasz 		break;
2669cab56aceSImre Vadasz 	case SIBA_SPROMVAR_GPIO0:
2670cab56aceSImre Vadasz 		siba->siba_sprom.gpio0 = value;
2671cab56aceSImre Vadasz 		break;
2672cab56aceSImre Vadasz 	case SIBA_SPROMVAR_GPIO1:
2673cab56aceSImre Vadasz 		siba->siba_sprom.gpio1 = value;
2674cab56aceSImre Vadasz 		break;
2675cab56aceSImre Vadasz 	case SIBA_SPROMVAR_GPIO2:
2676cab56aceSImre Vadasz 		siba->siba_sprom.gpio2 = value;
2677cab56aceSImre Vadasz 		break;
2678cab56aceSImre Vadasz 	case SIBA_SPROMVAR_GPIO3:
2679cab56aceSImre Vadasz 		siba->siba_sprom.gpio3 = value;
2680cab56aceSImre Vadasz 		break;
2681cab56aceSImre Vadasz 	case SIBA_SPROMVAR_MAXPWR_AL:
2682cab56aceSImre Vadasz 		siba->siba_sprom.maxpwr_al = value;
2683cab56aceSImre Vadasz 		break;
2684cab56aceSImre Vadasz 	case SIBA_SPROMVAR_MAXPWR_A:
2685cab56aceSImre Vadasz 		siba->siba_sprom.maxpwr_a = value;
2686cab56aceSImre Vadasz 		break;
2687cab56aceSImre Vadasz 	case SIBA_SPROMVAR_MAXPWR_AH:
2688cab56aceSImre Vadasz 		siba->siba_sprom.maxpwr_ah = value;
2689cab56aceSImre Vadasz 		break;
2690cab56aceSImre Vadasz 	case SIBA_SPROMVAR_MAXPWR_BG:
2691cab56aceSImre Vadasz 		siba->siba_sprom.maxpwr_bg = value;
2692cab56aceSImre Vadasz 		break;
2693cab56aceSImre Vadasz 	case SIBA_SPROMVAR_RXPO2G:
2694cab56aceSImre Vadasz 		siba->siba_sprom.rxpo2g = value;
2695cab56aceSImre Vadasz 		break;
2696cab56aceSImre Vadasz 	case SIBA_SPROMVAR_RXPO5G:
2697cab56aceSImre Vadasz 		siba->siba_sprom.rxpo5g = value;
2698cab56aceSImre Vadasz 		break;
2699cab56aceSImre Vadasz 	case SIBA_SPROMVAR_TSSI_A:
2700cab56aceSImre Vadasz 		siba->siba_sprom.tssi_a = value;
2701cab56aceSImre Vadasz 		break;
2702cab56aceSImre Vadasz 	case SIBA_SPROMVAR_TSSI_BG:
2703cab56aceSImre Vadasz 		siba->siba_sprom.tssi_bg = value;
2704cab56aceSImre Vadasz 		break;
2705cab56aceSImre Vadasz 	case SIBA_SPROMVAR_TRI2G:
2706cab56aceSImre Vadasz 		siba->siba_sprom.tri2g = value;
2707cab56aceSImre Vadasz 		break;
2708cab56aceSImre Vadasz 	case SIBA_SPROMVAR_TRI5GL:
2709cab56aceSImre Vadasz 		siba->siba_sprom.tri5gl = value;
2710cab56aceSImre Vadasz 		break;
2711cab56aceSImre Vadasz 	case SIBA_SPROMVAR_TRI5G:
2712cab56aceSImre Vadasz 		siba->siba_sprom.tri5g = value;
2713cab56aceSImre Vadasz 		break;
2714cab56aceSImre Vadasz 	case SIBA_SPROMVAR_TRI5GH:
2715cab56aceSImre Vadasz 		siba->siba_sprom.tri5gh = value;
2716cab56aceSImre Vadasz 		break;
2717cab56aceSImre Vadasz 	case SIBA_SPROMVAR_RSSISAV2G:
2718cab56aceSImre Vadasz 		siba->siba_sprom.rssisav2g = value;
2719cab56aceSImre Vadasz 		break;
2720cab56aceSImre Vadasz 	case SIBA_SPROMVAR_RSSISMC2G:
2721cab56aceSImre Vadasz 		siba->siba_sprom.rssismc2g = value;
2722cab56aceSImre Vadasz 		break;
2723cab56aceSImre Vadasz 	case SIBA_SPROMVAR_RSSISMF2G:
2724cab56aceSImre Vadasz 		siba->siba_sprom.rssismf2g = value;
2725cab56aceSImre Vadasz 		break;
2726cab56aceSImre Vadasz 	case SIBA_SPROMVAR_BXA2G:
2727cab56aceSImre Vadasz 		siba->siba_sprom.bxa2g = value;
2728cab56aceSImre Vadasz 		break;
2729cab56aceSImre Vadasz 	case SIBA_SPROMVAR_RSSISAV5G:
2730cab56aceSImre Vadasz 		siba->siba_sprom.rssisav5g = value;
2731cab56aceSImre Vadasz 		break;
2732cab56aceSImre Vadasz 	case SIBA_SPROMVAR_RSSISMC5G:
2733cab56aceSImre Vadasz 		siba->siba_sprom.rssismc5g = value;
2734cab56aceSImre Vadasz 		break;
2735cab56aceSImre Vadasz 	case SIBA_SPROMVAR_RSSISMF5G:
2736cab56aceSImre Vadasz 		siba->siba_sprom.rssismf5g = value;
2737cab56aceSImre Vadasz 		break;
2738cab56aceSImre Vadasz 	case SIBA_SPROMVAR_BXA5G:
2739cab56aceSImre Vadasz 		siba->siba_sprom.bxa5g = value;
2740cab56aceSImre Vadasz 		break;
2741cab56aceSImre Vadasz 	case SIBA_SPROMVAR_CCK2GPO:
2742cab56aceSImre Vadasz 		siba->siba_sprom.cck2gpo = value;
2743cab56aceSImre Vadasz 		break;
2744cab56aceSImre Vadasz 	case SIBA_SPROMVAR_OFDM2GPO:
2745cab56aceSImre Vadasz 		siba->siba_sprom.ofdm2gpo = value;
2746cab56aceSImre Vadasz 		break;
2747cab56aceSImre Vadasz 	case SIBA_SPROMVAR_OFDM5GLPO:
2748cab56aceSImre Vadasz 		siba->siba_sprom.ofdm5glpo = value;
2749cab56aceSImre Vadasz 		break;
2750cab56aceSImre Vadasz 	case SIBA_SPROMVAR_OFDM5GPO:
2751cab56aceSImre Vadasz 		siba->siba_sprom.ofdm5gpo = value;
2752cab56aceSImre Vadasz 		break;
2753cab56aceSImre Vadasz 	case SIBA_SPROMVAR_OFDM5GHPO:
2754cab56aceSImre Vadasz 		siba->siba_sprom.ofdm5ghpo = value;
2755cab56aceSImre Vadasz 		break;
2756cab56aceSImre Vadasz 	case SIBA_SPROMVAR_BF_LO:
2757cab56aceSImre Vadasz 		siba->siba_sprom.bf_lo = value;
2758cab56aceSImre Vadasz 		break;
2759cab56aceSImre Vadasz 	case SIBA_SPROMVAR_BF_HI:
2760cab56aceSImre Vadasz 		siba->siba_sprom.bf_hi = value;
2761cab56aceSImre Vadasz 		break;
2762cab56aceSImre Vadasz 	case SIBA_SPROMVAR_BF2_LO:
2763cab56aceSImre Vadasz 		siba->siba_sprom.bf2_lo = value;
2764cab56aceSImre Vadasz 		break;
2765cab56aceSImre Vadasz 	case SIBA_SPROMVAR_BF2_HI:
2766cab56aceSImre Vadasz 		siba->siba_sprom.bf2_hi = value;
2767cab56aceSImre Vadasz 		break;
2768cab56aceSImre Vadasz 	default:
2769cab56aceSImre Vadasz 		return (ENOENT);
2770cab56aceSImre Vadasz 	}
2771cab56aceSImre Vadasz 	return (0);
2772cab56aceSImre Vadasz }
2773cab56aceSImre Vadasz 
2774cab56aceSImre Vadasz #define	SIBA_GPIOCTL			0x06c
2775cab56aceSImre Vadasz 
2776cab56aceSImre Vadasz uint32_t
siba_gpio_get(device_t dev)2777cab56aceSImre Vadasz siba_gpio_get(device_t dev)
2778cab56aceSImre Vadasz {
2779cab56aceSImre Vadasz 	struct siba_dev_softc *sd = device_get_ivars(dev);
2780cab56aceSImre Vadasz 	struct siba_softc *siba = sd->sd_bus;
2781cab56aceSImre Vadasz 	struct siba_dev_softc *gpiodev, *pcidev = NULL;
2782cab56aceSImre Vadasz 
2783cab56aceSImre Vadasz 	pcidev = siba->siba_pci.spc_dev;
2784cab56aceSImre Vadasz 	gpiodev = siba->siba_cc.scc_dev ? siba->siba_cc.scc_dev : pcidev;
27857872accfSImre Vadász 	if (!gpiodev)
2786cab56aceSImre Vadasz 		return (-1);
2787cab56aceSImre Vadasz 	return (siba_read_4_sub(gpiodev, SIBA_GPIOCTL));
2788cab56aceSImre Vadasz }
2789cab56aceSImre Vadasz 
2790cab56aceSImre Vadasz void
siba_gpio_set(device_t dev,uint32_t value)2791cab56aceSImre Vadasz siba_gpio_set(device_t dev, uint32_t value)
2792cab56aceSImre Vadasz {
2793cab56aceSImre Vadasz 	struct siba_dev_softc *sd = device_get_ivars(dev);
2794cab56aceSImre Vadasz 	struct siba_softc *siba = sd->sd_bus;
2795cab56aceSImre Vadasz 	struct siba_dev_softc *gpiodev, *pcidev = NULL;
2796cab56aceSImre Vadasz 
2797cab56aceSImre Vadasz 	pcidev = siba->siba_pci.spc_dev;
2798cab56aceSImre Vadasz 	gpiodev = siba->siba_cc.scc_dev ? siba->siba_cc.scc_dev : pcidev;
27997872accfSImre Vadász 	if (!gpiodev)
2800cab56aceSImre Vadasz 		return;
2801cab56aceSImre Vadasz 	siba_write_4_sub(gpiodev, SIBA_GPIOCTL, value);
2802cab56aceSImre Vadasz }
2803cab56aceSImre Vadasz 
2804cab56aceSImre Vadasz void
siba_fix_imcfglobug(device_t dev)2805cab56aceSImre Vadasz siba_fix_imcfglobug(device_t dev)
2806cab56aceSImre Vadasz {
2807cab56aceSImre Vadasz 	struct siba_dev_softc *sd = device_get_ivars(dev);
2808cab56aceSImre Vadasz 	struct siba_softc *siba = sd->sd_bus;
2809cab56aceSImre Vadasz 	uint32_t tmp;
2810cab56aceSImre Vadasz 
2811cab56aceSImre Vadasz 	if (siba->siba_pci.spc_dev == NULL)
2812cab56aceSImre Vadasz 		return;
2813cab56aceSImre Vadasz 	if (siba->siba_pci.spc_dev->sd_id.sd_device != SIBA_DEVID_PCI ||
2814cab56aceSImre Vadasz 	    siba->siba_pci.spc_dev->sd_id.sd_rev > 5)
2815cab56aceSImre Vadasz 		return;
2816cab56aceSImre Vadasz 
2817cab56aceSImre Vadasz 	tmp = siba_read_4_sub(sd, SIBA_IMCFGLO) &
2818cab56aceSImre Vadasz 	    ~(SIBA_IMCFGLO_REQTO | SIBA_IMCFGLO_SERTO);
2819cab56aceSImre Vadasz 	switch (siba->siba_type) {
2820cab56aceSImre Vadasz 	case SIBA_TYPE_PCI:
2821cab56aceSImre Vadasz 	case SIBA_TYPE_PCMCIA:
2822cab56aceSImre Vadasz 		tmp |= 0x32;
2823cab56aceSImre Vadasz 		break;
2824cab56aceSImre Vadasz 	case SIBA_TYPE_SSB:
2825cab56aceSImre Vadasz 		tmp |= 0x53;
2826cab56aceSImre Vadasz 		break;
2827cab56aceSImre Vadasz 	}
2828cab56aceSImre Vadasz 	siba_write_4_sub(sd, SIBA_IMCFGLO, tmp);
2829cab56aceSImre Vadasz }
28307872accfSImre Vadász 
28317872accfSImre Vadász int
siba_sprom_get_core_power_info(device_t dev,int core,struct siba_sprom_core_pwr_info * c)28327872accfSImre Vadász siba_sprom_get_core_power_info(device_t dev, int core,
28337872accfSImre Vadász     struct siba_sprom_core_pwr_info *c)
28347872accfSImre Vadász {
28357872accfSImre Vadász 	struct siba_dev_softc *sd = device_get_ivars(dev);
28367872accfSImre Vadász 	struct siba_softc *siba = sd->sd_bus;
28377872accfSImre Vadász 
28387872accfSImre Vadász 	if (core < 0 || core > 3) {
28397872accfSImre Vadász 		return (EINVAL);
28407872accfSImre Vadász 	}
28417872accfSImre Vadász 	memcpy(c, &siba->siba_sprom.core_pwr_info[core], sizeof(*c));
28427872accfSImre Vadász 	return (0);
28437872accfSImre Vadász }
28447872accfSImre Vadász 
28457872accfSImre Vadász int
siba_sprom_get_mcs2gpo(device_t dev,uint16_t * c)28467872accfSImre Vadász siba_sprom_get_mcs2gpo(device_t dev, uint16_t *c)
28477872accfSImre Vadász {
28487872accfSImre Vadász 	struct siba_dev_softc *sd = device_get_ivars(dev);
28497872accfSImre Vadász 	struct siba_softc *siba = sd->sd_bus;
28507872accfSImre Vadász 
28517872accfSImre Vadász 	memcpy(c, &siba->siba_sprom.mcs2gpo, sizeof(uint16_t) * 8);
28527872accfSImre Vadász 	return (0);
28537872accfSImre Vadász }
28547872accfSImre Vadász 
28557872accfSImre Vadász int
siba_sprom_get_mcs5glpo(device_t dev,uint16_t * c)28567872accfSImre Vadász siba_sprom_get_mcs5glpo(device_t dev, uint16_t *c)
28577872accfSImre Vadász {
28587872accfSImre Vadász 	struct siba_dev_softc *sd = device_get_ivars(dev);
28597872accfSImre Vadász 	struct siba_softc *siba = sd->sd_bus;
28607872accfSImre Vadász 
28617872accfSImre Vadász 	memcpy(c, &siba->siba_sprom.mcs5glpo, sizeof(uint16_t) * 8);
28627872accfSImre Vadász 	return (0);
28637872accfSImre Vadász }
28647872accfSImre Vadász 
28657872accfSImre Vadász int
siba_sprom_get_mcs5gpo(device_t dev,uint16_t * c)28667872accfSImre Vadász siba_sprom_get_mcs5gpo(device_t dev, uint16_t *c)
28677872accfSImre Vadász {
28687872accfSImre Vadász 	struct siba_dev_softc *sd = device_get_ivars(dev);
28697872accfSImre Vadász 	struct siba_softc *siba = sd->sd_bus;
28707872accfSImre Vadász 
28717872accfSImre Vadász 	memcpy(c, &siba->siba_sprom.mcs5gpo, sizeof(uint16_t) * 8);
28727872accfSImre Vadász 	return (0);
28737872accfSImre Vadász }
28747872accfSImre Vadász 
28757872accfSImre Vadász int
siba_sprom_get_mcs5ghpo(device_t dev,uint16_t * c)28767872accfSImre Vadász siba_sprom_get_mcs5ghpo(device_t dev, uint16_t *c)
28777872accfSImre Vadász {
28787872accfSImre Vadász 	struct siba_dev_softc *sd = device_get_ivars(dev);
28797872accfSImre Vadász 	struct siba_softc *siba = sd->sd_bus;
28807872accfSImre Vadász 
28817872accfSImre Vadász 	memcpy(c, &siba->siba_sprom.mcs5ghpo, sizeof(uint16_t) * 8);
28827872accfSImre Vadász 	return (0);
28837872accfSImre Vadász }
28847872accfSImre Vadász 
28857872accfSImre Vadász void
siba_pmu_spuravoid_pllupdate(device_t dev,int spur_avoid)28867872accfSImre Vadász siba_pmu_spuravoid_pllupdate(device_t dev, int spur_avoid)
28877872accfSImre Vadász {
28887872accfSImre Vadász 	struct siba_dev_softc *sd = device_get_ivars(dev);
28897872accfSImre Vadász 	struct siba_softc *siba = sd->sd_bus;
28907872accfSImre Vadász 	struct siba_cc *scc;
28917872accfSImre Vadász 
28927872accfSImre Vadász 	scc = &siba->siba_cc;
28937872accfSImre Vadász 
28947872accfSImre Vadász 	if (scc->scc_dev == NULL) {
28957872accfSImre Vadász 		device_printf(dev, "%s: called; no pmu\n", __func__);
28967872accfSImre Vadász 		return;
28977872accfSImre Vadász 	}
28987872accfSImre Vadász 
28997872accfSImre Vadász 	switch (siba_get_chipid(dev)) {
29007872accfSImre Vadász 	case 0x4322:
29017872accfSImre Vadász 		siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL0, 0x11100070);
29027872accfSImre Vadász 		siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL1, 0x1014140a);
29037872accfSImre Vadász 		siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL5, 0x88888854);
29047872accfSImre Vadász 		if (spur_avoid == 1)
29057872accfSImre Vadász 			siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL2, 0x05201828);
29067872accfSImre Vadász 		else
29077872accfSImre Vadász 			siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL2, 0x05001828);
29087872accfSImre Vadász 		break;
29097872accfSImre Vadász 	case 43222:
29107872accfSImre Vadász 		if (spur_avoid == 1) {
29117872accfSImre Vadász 			siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL0, 0x11500008);
29127872accfSImre Vadász 			siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL1, 0x0C000C06);
29137872accfSImre Vadász 			siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL2, 0x0F600a08);
29147872accfSImre Vadász 			siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL3, 0x00000000);
29157872accfSImre Vadász 			siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL4, 0x2001E920);
29167872accfSImre Vadász 			siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL5, 0x88888815);
29177872accfSImre Vadász 		} else {
29187872accfSImre Vadász 			siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL0, 0x11100008);
29197872accfSImre Vadász 			siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL1, 0x0c000c06);
29207872accfSImre Vadász 			siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL2, 0x03000a08);
29217872accfSImre Vadász 			siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL3, 0x00000000);
29227872accfSImre Vadász 			siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL4, 0x200005c0);
29237872accfSImre Vadász 			siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL5, 0x88888855);
29247872accfSImre Vadász 		}
29257872accfSImre Vadász 		break;
29267872accfSImre Vadász 	default:
29277872accfSImre Vadász 		device_printf(dev,
29287872accfSImre Vadász 		    "%s: unknown spur avoidance settings for chip 0x%04x\n",
29297872accfSImre Vadász 		    __func__,
29307872accfSImre Vadász 		    siba_get_chipid(dev));
29317872accfSImre Vadász 		return;
29327872accfSImre Vadász 	}
29337872accfSImre Vadász 
29347872accfSImre Vadász 	/* Both chips above use the same update */
29357872accfSImre Vadász 	SIBA_CC_SET32(scc, SIBA_CC_PMUCTL, SIBA_CC_PMUCTL_PLL_UPD);
29367872accfSImre Vadász }
29377872accfSImre Vadász 
29387872accfSImre Vadász void
siba_cc_set32(device_t dev,uint32_t reg,uint32_t val)29397872accfSImre Vadász siba_cc_set32(device_t dev, uint32_t reg, uint32_t val)
29407872accfSImre Vadász {
29417872accfSImre Vadász 	struct siba_dev_softc *sd = device_get_ivars(dev);
29427872accfSImre Vadász 	struct siba_softc *siba = sd->sd_bus;
29437872accfSImre Vadász 	struct siba_cc *scc;
29447872accfSImre Vadász 
29457872accfSImre Vadász 	scc = &siba->siba_cc;
29467872accfSImre Vadász 
29477872accfSImre Vadász 	if (scc->scc_dev == NULL) {
29487872accfSImre Vadász 		device_printf(dev, "%s: called; no pmu\n", __func__);
29497872accfSImre Vadász 		return;
29507872accfSImre Vadász 	}
29517872accfSImre Vadász 
29527872accfSImre Vadász 	SIBA_CC_SET32(scc, reg, val);
29537872accfSImre Vadász }
29547872accfSImre Vadász 
29557872accfSImre Vadász void
siba_cc_mask32(device_t dev,uint32_t reg,uint32_t mask)29567872accfSImre Vadász siba_cc_mask32(device_t dev, uint32_t reg, uint32_t mask)
29577872accfSImre Vadász {
29587872accfSImre Vadász 	struct siba_dev_softc *sd = device_get_ivars(dev);
29597872accfSImre Vadász 	struct siba_softc *siba = sd->sd_bus;
29607872accfSImre Vadász 	struct siba_cc *scc;
29617872accfSImre Vadász 
29627872accfSImre Vadász 	scc = &siba->siba_cc;
29637872accfSImre Vadász 
29647872accfSImre Vadász 	if (scc->scc_dev == NULL) {
29657872accfSImre Vadász 		device_printf(dev, "%s: called; no pmu\n", __func__);
29667872accfSImre Vadász 		return;
29677872accfSImre Vadász 	}
29687872accfSImre Vadász 
29697872accfSImre Vadász 	SIBA_CC_MASK32(scc, reg, mask);
29707872accfSImre Vadász }
29717872accfSImre Vadász 
29727872accfSImre Vadász uint32_t
siba_cc_read32(device_t dev,uint32_t reg)29737872accfSImre Vadász siba_cc_read32(device_t dev, uint32_t reg)
29747872accfSImre Vadász {
29757872accfSImre Vadász 	struct siba_dev_softc *sd = device_get_ivars(dev);
29767872accfSImre Vadász 	struct siba_softc *siba = sd->sd_bus;
29777872accfSImre Vadász 	struct siba_cc *scc;
29787872accfSImre Vadász 
29797872accfSImre Vadász 	scc = &siba->siba_cc;
29807872accfSImre Vadász 
29817872accfSImre Vadász 	if (scc->scc_dev == NULL) {
29827872accfSImre Vadász 		device_printf(dev, "%s: called; no pmu\n", __func__);
29837872accfSImre Vadász 		return 0xffffffff;
29847872accfSImre Vadász 	}
29857872accfSImre Vadász 
29867872accfSImre Vadász 	return SIBA_CC_READ32(scc, reg);
29877872accfSImre Vadász }
29887872accfSImre Vadász 
29897872accfSImre Vadász void
siba_cc_write32(device_t dev,uint32_t reg,uint32_t val)29907872accfSImre Vadász siba_cc_write32(device_t dev, uint32_t reg, uint32_t val)
29917872accfSImre Vadász {
29927872accfSImre Vadász 	struct siba_dev_softc *sd = device_get_ivars(dev);
29937872accfSImre Vadász 	struct siba_softc *siba = sd->sd_bus;
29947872accfSImre Vadász 	struct siba_cc *scc;
29957872accfSImre Vadász 
29967872accfSImre Vadász 	scc = &siba->siba_cc;
29977872accfSImre Vadász 
29987872accfSImre Vadász 	if (scc->scc_dev == NULL) {
29997872accfSImre Vadász 		device_printf(dev, "%s: called; no pmu\n", __func__);
30007872accfSImre Vadász 		return;
30017872accfSImre Vadász 	}
30027872accfSImre Vadász 
30037872accfSImre Vadász 	SIBA_CC_WRITE32(scc, reg, val);
30047872accfSImre Vadász }
3005