1183371Simp/*-
2183371Simp * Copyright (c) 2007 Bruce M. Simpson.
3183371Simp * All rights reserved.
4183371Simp *
5183371Simp * Redistribution and use in source and binary forms, with or without
6183371Simp * modification, are permitted provided that the following conditions
7183371Simp * are met:
8183371Simp * 1. Redistributions of source code must retain the above copyright
9183371Simp *    notice, this list of conditions and the following disclaimer.
10183371Simp * 2. Redistributions in binary form must reproduce the above copyright
11183371Simp *    notice, this list of conditions and the following disclaimer in the
12183371Simp *    documentation and/or other materials provided with the distribution.
13183371Simp *
14183371Simp * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15183371Simp * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16183371Simp * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17183371Simp * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18183371Simp * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19183371Simp * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20183371Simp * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21183371Simp * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22183371Simp * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23183371Simp * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24183371Simp * SUCH DAMAGE.
25183371Simp *
26183371Simp * $FreeBSD$
27183371Simp */
28183371Simp
29183371Simp#ifndef _SIBA_SIBAVAR_H_
30183371Simp#define _SIBA_SIBAVAR_H_
31183371Simp
32183371Simp#include <sys/rman.h>
33183371Simp
34203319Sweongyostruct siba_softc;
35203319Sweongyostruct siba_dev_softc;
36183371Simp
37204922Sweongyoenum siba_type {
38204922Sweongyo	SIBA_TYPE_SSB,
39204922Sweongyo	SIBA_TYPE_PCI,
40204922Sweongyo	SIBA_TYPE_PCMCIA,
41204922Sweongyo};
42204922Sweongyo
43203319Sweongyoenum siba_device_ivars {
44203319Sweongyo	SIBA_IVAR_VENDOR,
45203319Sweongyo	SIBA_IVAR_DEVICE,
46203319Sweongyo	SIBA_IVAR_REVID,
47204922Sweongyo	SIBA_IVAR_CORE_INDEX,
48204922Sweongyo	SIBA_IVAR_PCI_VENDOR,
49204922Sweongyo	SIBA_IVAR_PCI_DEVICE,
50204922Sweongyo	SIBA_IVAR_PCI_SUBVENDOR,
51204922Sweongyo	SIBA_IVAR_PCI_SUBDEVICE,
52204922Sweongyo	SIBA_IVAR_PCI_REVID,
53204922Sweongyo	SIBA_IVAR_CHIPID,
54204922Sweongyo	SIBA_IVAR_CHIPREV,
55204922Sweongyo	SIBA_IVAR_CHIPPKG,
56204922Sweongyo	SIBA_IVAR_TYPE,
57204922Sweongyo	SIBA_IVAR_CC_PMUFREQ,
58204922Sweongyo	SIBA_IVAR_CC_CAPS,
59204922Sweongyo	SIBA_IVAR_CC_POWERDELAY,
60204922Sweongyo	SIBA_IVAR_PCICORE_REVID
61183371Simp};
62183371Simp
63203319Sweongyo#define	SIBA_ACCESSOR(var, ivar, type)				\
64203319Sweongyo	__BUS_ACCESSOR(siba, var, SIBA, ivar, type)
65183371Simp
66203319SweongyoSIBA_ACCESSOR(vendor,		VENDOR,		uint16_t)
67203319SweongyoSIBA_ACCESSOR(device,		DEVICE,		uint16_t)
68203319SweongyoSIBA_ACCESSOR(revid,		REVID,		uint8_t)
69203319SweongyoSIBA_ACCESSOR(core_index,	CORE_INDEX,	uint8_t)
70204922SweongyoSIBA_ACCESSOR(pci_vendor,	PCI_VENDOR,	uint16_t)
71204922SweongyoSIBA_ACCESSOR(pci_device,	PCI_DEVICE,	uint16_t)
72204922SweongyoSIBA_ACCESSOR(pci_subvendor,	PCI_SUBVENDOR,	uint16_t)
73204922SweongyoSIBA_ACCESSOR(pci_subdevice,	PCI_SUBDEVICE,	uint16_t)
74204922SweongyoSIBA_ACCESSOR(pci_revid,	PCI_REVID,	uint8_t)
75204922SweongyoSIBA_ACCESSOR(chipid,		CHIPID,		uint16_t)
76204922SweongyoSIBA_ACCESSOR(chiprev,		CHIPREV,	uint16_t)
77204922SweongyoSIBA_ACCESSOR(chippkg,		CHIPPKG,	uint8_t)
78204922SweongyoSIBA_ACCESSOR(type,		TYPE,		enum siba_type)
79204922SweongyoSIBA_ACCESSOR(cc_pmufreq,	CC_PMUFREQ,	uint32_t)
80204922SweongyoSIBA_ACCESSOR(cc_caps,		CC_CAPS,	uint32_t)
81204922SweongyoSIBA_ACCESSOR(cc_powerdelay,	CC_POWERDELAY,	uint16_t)
82204922SweongyoSIBA_ACCESSOR(pcicore_revid,	PCICORE_REVID,	uint8_t)
83203319Sweongyo
84203319Sweongyo#undef SIBA_ACCESSOR
85203319Sweongyo
86203319Sweongyo/* XXX just for SPROM1? */
87203319Sweongyoenum {
88203319Sweongyo	SIBA_CCODE_WORLD,
89203319Sweongyo	SIBA_CCODE_THAILAND,
90203319Sweongyo	SIBA_CCODE_ISRAEL,
91203319Sweongyo	SIBA_CCODE_JORDAN,
92203319Sweongyo	SIBA_CCODE_CHINA,
93203319Sweongyo	SIBA_CCODE_JAPAN,
94203319Sweongyo	SIBA_CCODE_USA_CANADA_ANZ,
95203319Sweongyo	SIBA_CCODE_EUROPE,
96203319Sweongyo	SIBA_CCODE_USA_LOW,
97203319Sweongyo	SIBA_CCODE_JAPAN_HIGH,
98203319Sweongyo	SIBA_CCODE_ALL,
99203319Sweongyo	SIBA_CCODE_NONE,
100183371Simp};
101183371Simp
102203319Sweongyo#define siba_mips_read_2(sc, core, reg)				\
103203319Sweongyo	bus_space_read_2((sc)->siba_mem_bt, (sc)->siba_mem_bh,	\
104183371Simp			 (core * SIBA_CORE_LEN) + (reg))
105183371Simp
106203319Sweongyo#define siba_mips_read_4(sc, core, reg)				\
107203319Sweongyo	bus_space_read_4((sc)->siba_mem_bt, (sc)->siba_mem_bh,	\
108183371Simp			 (core * SIBA_CORE_LEN) + (reg))
109183371Simp
110203319Sweongyo#define siba_mips_write_2(sc, core, reg, val)			\
111203319Sweongyo	bus_space_write_2((sc)->siba_mem_bt, (sc)->siba_mem_bh,	\
112183371Simp			 (core * SIBA_CORE_LEN) + (reg), (val))
113183371Simp
114203319Sweongyo#define siba_mips_write_4(sc, core, reg, val)			\
115203319Sweongyo	bus_space_write_4((sc)->siba_mem_bt, (sc)->siba_mem_bh,	\
116183371Simp			 (core * SIBA_CORE_LEN) + (reg), (val))
117183371Simp
118203319Sweongyo#define	SIBA_READ_4(siba, reg)		\
119203319Sweongyo	bus_space_read_4((siba)->siba_mem_bt, (siba)->siba_mem_bh, (reg))
120203319Sweongyo#define	SIBA_READ_2(siba, reg)		\
121203319Sweongyo	bus_space_read_2((siba)->siba_mem_bt, (siba)->siba_mem_bh, (reg))
122203319Sweongyo#define	SIBA_READ_MULTI_1(siba, reg, addr, count)			\
123203319Sweongyo	bus_space_read_multi_1((siba)->siba_mem_bt, (siba)->siba_mem_bh,\
124203319Sweongyo	    (reg), (addr), (count))
125203319Sweongyo#define	SIBA_READ_MULTI_2(siba, reg, addr, count)			\
126203319Sweongyo	bus_space_read_multi_2((siba)->siba_mem_bt, (siba)->siba_mem_bh,\
127203319Sweongyo	    (reg), (addr), (count))
128203319Sweongyo#define	SIBA_READ_MULTI_4(siba, reg, addr, count)			\
129203319Sweongyo	bus_space_read_multi_4((siba)->siba_mem_bt, (siba)->siba_mem_bh,\
130203319Sweongyo	    (reg), (addr), (count))
131203319Sweongyo
132203319Sweongyo#define	SIBA_WRITE_4(siba, reg, val)	\
133203319Sweongyo	bus_space_write_4((siba)->siba_mem_bt, (siba)->siba_mem_bh,	\
134203319Sweongyo	    (reg), (val))
135203319Sweongyo#define	SIBA_WRITE_2(siba, reg, val)	\
136203319Sweongyo	bus_space_write_2((siba)->siba_mem_bt, (siba)->siba_mem_bh,	\
137203319Sweongyo	    (reg), (val))
138203319Sweongyo#define	SIBA_WRITE_MULTI_1(siba, reg, addr, count)			\
139203319Sweongyo	bus_space_write_multi_1((siba)->siba_mem_bt, (siba)->siba_mem_bh,\
140203319Sweongyo	    (reg), (addr), (count))
141203319Sweongyo#define	SIBA_WRITE_MULTI_2(siba, reg, addr, count)			\
142203319Sweongyo	bus_space_write_multi_2((siba)->siba_mem_bt, (siba)->siba_mem_bh,\
143203319Sweongyo	    (reg), (addr), (count))
144203319Sweongyo#define	SIBA_WRITE_MULTI_4(siba, reg, addr, count)			\
145203319Sweongyo	bus_space_write_multi_4((siba)->siba_mem_bt, (siba)->siba_mem_bh,\
146203319Sweongyo	    (reg), (addr), (count))
147203319Sweongyo
148203319Sweongyo#define	SIBA_BARRIER(siba, flags)					\
149203319Sweongyo	bus_space_barrier((siba)->siba_mem_bt, (siba)->siba_mem_bh, (0),\
150203319Sweongyo	    (0), (flags))
151203319Sweongyo
152203319Sweongyo#define	SIBA_SETBITS_4(siba, reg, bits)	\
153203319Sweongyo	SIBA_WRITE_4((siba), (reg), SIBA_READ_4((siba), (reg)) | (bits))
154203319Sweongyo#define	SIBA_SETBITS_2(siba, reg, bits)	\
155203319Sweongyo	SIBA_WRITE_2((siba), (reg), SIBA_READ_2((siba), (reg)) | (bits))
156203319Sweongyo
157203319Sweongyo#define	SIBA_FILT_SETBITS_4(siba, reg, filt, bits) \
158203319Sweongyo	SIBA_WRITE_4((siba), (reg), (SIBA_READ_4((siba),	\
159203319Sweongyo	    (reg)) & (filt)) | (bits))
160203319Sweongyo#define	SIBA_FILT_SETBITS_2(siba, reg, filt, bits)	\
161203319Sweongyo	SIBA_WRITE_2((siba), (reg), (SIBA_READ_2((siba),	\
162203319Sweongyo	    (reg)) & (filt)) | (bits))
163203319Sweongyo
164203319Sweongyo#define	SIBA_CLRBITS_4(siba, reg, bits)	\
165203319Sweongyo	SIBA_WRITE_4((siba), (reg), SIBA_READ_4((siba), (reg)) & ~(bits))
166203319Sweongyo#define	SIBA_CLRBITS_2(siba, reg, bits)	\
167203319Sweongyo	SIBA_WRITE_2((siba), (reg), SIBA_READ_2((siba), (reg)) & ~(bits))
168203319Sweongyo
169203319Sweongyo#define	SIBA_CC_READ32(scc, offset) \
170204922Sweongyo	siba_read_4_sub((scc)->scc_dev, offset)
171203319Sweongyo#define	SIBA_CC_WRITE32(scc, offset, val) \
172204922Sweongyo	siba_write_4_sub((scc)->scc_dev, offset, val)
173203319Sweongyo#define	SIBA_CC_MASK32(scc, offset, mask) \
174203319Sweongyo	SIBA_CC_WRITE32(scc, offset, SIBA_CC_READ32(scc, offset) & (mask))
175203319Sweongyo#define	SIBA_CC_SET32(scc, offset, set) \
176203319Sweongyo	SIBA_CC_WRITE32(scc, offset, SIBA_CC_READ32(scc, offset) | (set))
177203319Sweongyo#define	SIBA_CC_MASKSET32(scc, offset, mask, set)	\
178203319Sweongyo	SIBA_CC_WRITE32(scc, offset,			\
179203319Sweongyo	    (SIBA_CC_READ32(scc, offset) & (mask)) | (set))
180203319Sweongyo
181203319Sweongyoenum siba_clock {
182203319Sweongyo	SIBA_CLOCK_DYNAMIC,
183203319Sweongyo	SIBA_CLOCK_SLOW,
184203319Sweongyo	SIBA_CLOCK_FAST,
185203319Sweongyo};
186183371Simp
187203319Sweongyoenum siba_clksrc {
188203319Sweongyo	SIBA_CC_CLKSRC_PCI,
189203319Sweongyo	SIBA_CC_CLKSRC_CRYSTAL,
190203319Sweongyo	SIBA_CC_CLKSRC_LOWPW,
191203319Sweongyo};
192183371Simp
193203319Sweongyostruct siba_cc_pmu0_plltab {
194203319Sweongyo	uint16_t		freq;	/* in kHz.*/
195203319Sweongyo	uint8_t			xf;	/* crystal frequency */
196203319Sweongyo	uint8_t			wb_int;
197203319Sweongyo	uint32_t		wb_frac;
198203319Sweongyo};
199183371Simp
200203319Sweongyostruct siba_cc_pmu1_plltab {
201203319Sweongyo	uint16_t		freq;
202203319Sweongyo	uint8_t			xf;
203203319Sweongyo	uint8_t			p1div;
204203319Sweongyo	uint8_t			p2div;
205203319Sweongyo	uint8_t			ndiv_int;
206203319Sweongyo	uint32_t		ndiv_frac;
207203319Sweongyo};
208203319Sweongyo
209203319Sweongyostruct siba_cc_pmu_res_updown {
210203319Sweongyo	uint8_t			res;
211203319Sweongyo	uint16_t		updown;
212203319Sweongyo};
213203319Sweongyo
214203319Sweongyo#define	SIBA_CC_PMU_DEP_SET	1
215203319Sweongyo#define	SIBA_CC_PMU_DEP_ADD	2
216203319Sweongyo#define	SIBA_CC_PMU_DEP_REMOVE	3
217203319Sweongyo
218203319Sweongyostruct siba_cc_pmu_res_depend {
219203319Sweongyo	uint8_t			res;
220203319Sweongyo	uint8_t			task;
221203319Sweongyo	uint32_t		depend;
222203319Sweongyo};
223203319Sweongyo
224204922Sweongyoenum siba_sprom_vars {
225204922Sweongyo	SIBA_SPROMVAR_REV,
226204922Sweongyo	SIBA_SPROMVAR_MAC_80211BG,
227204922Sweongyo	SIBA_SPROMVAR_MAC_ETH,
228204922Sweongyo	SIBA_SPROMVAR_MAC_80211A,
229204922Sweongyo	SIBA_SPROMVAR_MII_ETH0,
230204922Sweongyo	SIBA_SPROMVAR_MII_ETH1,
231204922Sweongyo	SIBA_SPROMVAR_MDIO_ETH0,
232204922Sweongyo	SIBA_SPROMVAR_MDIO_ETH1,
233204922Sweongyo	SIBA_SPROMVAR_BREV,
234204922Sweongyo	SIBA_SPROMVAR_CCODE,
235204922Sweongyo	SIBA_SPROMVAR_ANT_A,
236204922Sweongyo	SIBA_SPROMVAR_ANT_BG,
237204922Sweongyo	SIBA_SPROMVAR_PA0B0,
238204922Sweongyo	SIBA_SPROMVAR_PA0B1,
239204922Sweongyo	SIBA_SPROMVAR_PA0B2,
240204922Sweongyo	SIBA_SPROMVAR_PA1B0,
241204922Sweongyo	SIBA_SPROMVAR_PA1B1,
242204922Sweongyo	SIBA_SPROMVAR_PA1B2,
243204922Sweongyo	SIBA_SPROMVAR_PA1LOB0,
244204922Sweongyo	SIBA_SPROMVAR_PA1LOB1,
245204922Sweongyo	SIBA_SPROMVAR_PA1LOB2,
246204922Sweongyo	SIBA_SPROMVAR_PA1HIB0,
247204922Sweongyo	SIBA_SPROMVAR_PA1HIB1,
248204922Sweongyo	SIBA_SPROMVAR_PA1HIB2,
249204922Sweongyo	SIBA_SPROMVAR_GPIO0,
250204922Sweongyo	SIBA_SPROMVAR_GPIO1,
251204922Sweongyo	SIBA_SPROMVAR_GPIO2,
252204922Sweongyo	SIBA_SPROMVAR_GPIO3,
253204922Sweongyo	SIBA_SPROMVAR_MAXPWR_AL,
254204922Sweongyo	SIBA_SPROMVAR_MAXPWR_A,
255204922Sweongyo	SIBA_SPROMVAR_MAXPWR_AH,
256204922Sweongyo	SIBA_SPROMVAR_MAXPWR_BG,
257204922Sweongyo	SIBA_SPROMVAR_RXPO2G,
258204922Sweongyo	SIBA_SPROMVAR_RXPO5G,
259204922Sweongyo	SIBA_SPROMVAR_TSSI_A,
260204922Sweongyo	SIBA_SPROMVAR_TSSI_BG,
261204922Sweongyo	SIBA_SPROMVAR_TRI2G,
262204922Sweongyo	SIBA_SPROMVAR_TRI5GL,
263204922Sweongyo	SIBA_SPROMVAR_TRI5G,
264204922Sweongyo	SIBA_SPROMVAR_TRI5GH,
265204922Sweongyo	SIBA_SPROMVAR_RSSISAV2G,
266204922Sweongyo	SIBA_SPROMVAR_RSSISMC2G,
267204922Sweongyo	SIBA_SPROMVAR_RSSISMF2G,
268204922Sweongyo	SIBA_SPROMVAR_BXA2G,
269204922Sweongyo	SIBA_SPROMVAR_RSSISAV5G,
270204922Sweongyo	SIBA_SPROMVAR_RSSISMC5G,
271204922Sweongyo	SIBA_SPROMVAR_RSSISMF5G,
272204922Sweongyo	SIBA_SPROMVAR_BXA5G,
273204922Sweongyo	SIBA_SPROMVAR_CCK2GPO,
274204922Sweongyo	SIBA_SPROMVAR_OFDM2GPO,
275204922Sweongyo	SIBA_SPROMVAR_OFDM5GLPO,
276204922Sweongyo	SIBA_SPROMVAR_OFDM5GPO,
277204922Sweongyo	SIBA_SPROMVAR_OFDM5GHPO,
278204922Sweongyo	SIBA_SPROMVAR_BF_LO,
279204922Sweongyo	SIBA_SPROMVAR_BF_HI,
280204922Sweongyo	SIBA_SPROMVAR_BF2_LO,
281204922Sweongyo	SIBA_SPROMVAR_BF2_HI
282204922Sweongyo};
283204922Sweongyo
284204922Sweongyoint		siba_read_sprom(device_t, device_t, int, uintptr_t *);
285204922Sweongyoint		siba_write_sprom(device_t, device_t, int, uintptr_t);
286204922Sweongyo
287204922Sweongyo/**
288204922Sweongyo * Generic sprom accessor generation macros for siba(4) drivers
289204922Sweongyo */
290204922Sweongyo#define __SPROM_ACCESSOR(varp, var, ivarp, ivar, type)			\
291204922Sweongyo									\
292204922Sweongyostatic __inline type varp ## _get_ ## var(device_t dev)			\
293204922Sweongyo{									\
294204922Sweongyo	uintptr_t v;							\
295204922Sweongyo	siba_read_sprom(device_get_parent(dev), dev,			\
296204922Sweongyo	    ivarp ## _SPROMVAR_ ## ivar, &v);				\
297204922Sweongyo	return ((type) v);						\
298204922Sweongyo}									\
299204922Sweongyo									\
300204922Sweongyostatic __inline void varp ## _set_ ## var(device_t dev, type t)		\
301204922Sweongyo{									\
302204922Sweongyo	uintptr_t v = (uintptr_t) t;					\
303204922Sweongyo	siba_write_sprom(device_get_parent(dev), dev,			\
304204922Sweongyo	    ivarp ## _SPROMVAR_ ## ivar, v);				\
305204922Sweongyo}
306204922Sweongyo
307204922Sweongyo#define	SIBA_SPROM_ACCESSOR(var, ivar, type)				\
308204922Sweongyo	__SPROM_ACCESSOR(siba_sprom, var, SIBA, ivar, type)
309204922Sweongyo
310204922SweongyoSIBA_SPROM_ACCESSOR(rev,	REV,		uint8_t);
311204922SweongyoSIBA_SPROM_ACCESSOR(mac_80211bg,	MAC_80211BG,	uint8_t *);
312204922SweongyoSIBA_SPROM_ACCESSOR(mac_eth,	MAC_ETH,	uint8_t *);
313204922SweongyoSIBA_SPROM_ACCESSOR(mac_80211a,	MAC_80211A,	uint8_t *);
314204922SweongyoSIBA_SPROM_ACCESSOR(mii_eth0,	MII_ETH0,	uint8_t);
315204922SweongyoSIBA_SPROM_ACCESSOR(mii_eth1,	MII_ETH1,	uint8_t);
316204922SweongyoSIBA_SPROM_ACCESSOR(mdio_eth0,	MDIO_ETH0,	uint8_t);
317204922SweongyoSIBA_SPROM_ACCESSOR(mdio_eth1,	MDIO_ETH1,	uint8_t);
318204922SweongyoSIBA_SPROM_ACCESSOR(brev,	BREV,		uint8_t);
319204922SweongyoSIBA_SPROM_ACCESSOR(ccode,	CCODE,		uint8_t);
320204922SweongyoSIBA_SPROM_ACCESSOR(ant_a,	ANT_A,		uint8_t);
321204922SweongyoSIBA_SPROM_ACCESSOR(ant_bg,	ANT_BG,		uint8_t);
322204922SweongyoSIBA_SPROM_ACCESSOR(pa0b0,	PA0B0,		uint16_t);
323204922SweongyoSIBA_SPROM_ACCESSOR(pa0b1,	PA0B1,		uint16_t);
324204922SweongyoSIBA_SPROM_ACCESSOR(pa0b2,	PA0B2,		uint16_t);
325204922SweongyoSIBA_SPROM_ACCESSOR(pa1b0,	PA1B0,		uint16_t);
326204922SweongyoSIBA_SPROM_ACCESSOR(pa1b1,	PA1B1,		uint16_t);
327204922SweongyoSIBA_SPROM_ACCESSOR(pa1b2,	PA1B2,		uint16_t);
328204922SweongyoSIBA_SPROM_ACCESSOR(pa1lob0,	PA1LOB0,	uint16_t);
329204922SweongyoSIBA_SPROM_ACCESSOR(pa1lob1,	PA1LOB1,	uint16_t);
330204922SweongyoSIBA_SPROM_ACCESSOR(pa1lob2,	PA1LOB2,	uint16_t);
331204922SweongyoSIBA_SPROM_ACCESSOR(pa1hib0,	PA1HIB0,	uint16_t);
332204922SweongyoSIBA_SPROM_ACCESSOR(pa1hib1,	PA1HIB1,	uint16_t);
333204922SweongyoSIBA_SPROM_ACCESSOR(pa1hib2,	PA1HIB2,	uint16_t);
334204922SweongyoSIBA_SPROM_ACCESSOR(gpio0,	GPIO0,		uint8_t);
335204922SweongyoSIBA_SPROM_ACCESSOR(gpio1,	GPIO1,		uint8_t);
336204922SweongyoSIBA_SPROM_ACCESSOR(gpio2,	GPIO2,		uint8_t);
337204922SweongyoSIBA_SPROM_ACCESSOR(gpio3,	GPIO3,		uint8_t);
338204922SweongyoSIBA_SPROM_ACCESSOR(maxpwr_al,	MAXPWR_AL,	uint16_t);
339204922SweongyoSIBA_SPROM_ACCESSOR(maxpwr_a,	MAXPWR_A,	uint16_t);
340204922SweongyoSIBA_SPROM_ACCESSOR(maxpwr_ah,	MAXPWR_AH,	uint16_t);
341204922SweongyoSIBA_SPROM_ACCESSOR(maxpwr_bg,	MAXPWR_BG,	uint16_t);
342204922SweongyoSIBA_SPROM_ACCESSOR(rxpo2g,	RXPO2G,		uint8_t);
343204922SweongyoSIBA_SPROM_ACCESSOR(rxpo5g,	RXPO5G,		uint8_t);
344204922SweongyoSIBA_SPROM_ACCESSOR(tssi_a,	TSSI_A,		uint8_t);
345204922SweongyoSIBA_SPROM_ACCESSOR(tssi_bg,	TSSI_BG,	uint8_t);
346204922SweongyoSIBA_SPROM_ACCESSOR(tri2g,	TRI2G,		uint8_t);
347204922SweongyoSIBA_SPROM_ACCESSOR(tri5gl,	TRI5GL,		uint8_t);
348204922SweongyoSIBA_SPROM_ACCESSOR(tri5g,	TRI5G,		uint8_t);
349204922SweongyoSIBA_SPROM_ACCESSOR(tri5gh,	TRI5GH,		uint8_t);
350204922SweongyoSIBA_SPROM_ACCESSOR(rssisav2g,	RSSISAV2G,	uint8_t);
351204922SweongyoSIBA_SPROM_ACCESSOR(rssismc2g,	RSSISMC2G,	uint8_t);
352204922SweongyoSIBA_SPROM_ACCESSOR(rssismf2g,	RSSISMF2G,	uint8_t);
353204922SweongyoSIBA_SPROM_ACCESSOR(bxa2g,	BXA2G,		uint8_t);
354204922SweongyoSIBA_SPROM_ACCESSOR(rssisav5g,	RSSISAV5G,	uint8_t);
355204922SweongyoSIBA_SPROM_ACCESSOR(rssismc5g,	RSSISMC5G,	uint8_t);
356204922SweongyoSIBA_SPROM_ACCESSOR(rssismf5g,	RSSISMF5G,	uint8_t);
357204922SweongyoSIBA_SPROM_ACCESSOR(bxa5g,	BXA5G,		uint8_t);
358204922SweongyoSIBA_SPROM_ACCESSOR(cck2gpo,	CCK2GPO,	uint16_t);
359204922SweongyoSIBA_SPROM_ACCESSOR(ofdm2gpo,	OFDM2GPO,	uint32_t);
360204922SweongyoSIBA_SPROM_ACCESSOR(ofdm5glpo,	OFDM5GLPO,	uint32_t);
361204922SweongyoSIBA_SPROM_ACCESSOR(ofdm5gpo,	OFDM5GPO,	uint32_t);
362204922SweongyoSIBA_SPROM_ACCESSOR(ofdm5ghpo,	OFDM5GHPO,	uint32_t);
363204922SweongyoSIBA_SPROM_ACCESSOR(bf_lo,	BF_LO,		uint16_t);
364204922SweongyoSIBA_SPROM_ACCESSOR(bf_hi,	BF_HI,		uint16_t);
365204922SweongyoSIBA_SPROM_ACCESSOR(bf2_lo,	BF2_LO,		uint16_t);
366204922SweongyoSIBA_SPROM_ACCESSOR(bf2_hi,	BF2_HI,		uint16_t);
367204922Sweongyo
368204922Sweongyo#undef SIBA_SPROM_ACCESSOR
369204922Sweongyo
370203319Sweongyostruct siba_sprom {
371203319Sweongyo	uint8_t			rev;		/* revision */
372203319Sweongyo	uint8_t			mac_80211bg[6];	/* address for 802.11b/g */
373203319Sweongyo	uint8_t			mac_eth[6];	/* address for Ethernet */
374203319Sweongyo	uint8_t			mac_80211a[6];	/* address for 802.11a */
375203319Sweongyo	uint8_t			mii_eth0;	/* MII address for eth0 */
376203319Sweongyo	uint8_t			mii_eth1;	/* MII address for eth1 */
377203319Sweongyo	uint8_t			mdio_eth0;	/* MDIO for eth0 */
378203319Sweongyo	uint8_t			mdio_eth1;	/* MDIO for eth1 */
379203319Sweongyo	uint8_t			brev;		/* board revision */
380203319Sweongyo	uint8_t			ccode;		/* Country Code */
381203319Sweongyo	uint8_t			ant_a;		/* A-PHY antenna */
382203319Sweongyo	uint8_t			ant_bg;		/* B/G-PHY antenna */
383203319Sweongyo	uint16_t		pa0b0;
384203319Sweongyo	uint16_t		pa0b1;
385203319Sweongyo	uint16_t		pa0b2;
386203319Sweongyo	uint16_t		pa1b0;
387203319Sweongyo	uint16_t		pa1b1;
388203319Sweongyo	uint16_t		pa1b2;
389203944Sweongyo	uint16_t		pa1lob0;
390203944Sweongyo	uint16_t		pa1lob1;
391203944Sweongyo	uint16_t		pa1lob2;
392203944Sweongyo	uint16_t		pa1hib0;
393203944Sweongyo	uint16_t		pa1hib1;
394203944Sweongyo	uint16_t		pa1hib2;
395203319Sweongyo	uint8_t			gpio0;
396203319Sweongyo	uint8_t			gpio1;
397203319Sweongyo	uint8_t			gpio2;
398203319Sweongyo	uint8_t			gpio3;
399203944Sweongyo	uint16_t		maxpwr_al;
400203319Sweongyo	uint16_t		maxpwr_a;	/* A-PHY Max Power */
401203944Sweongyo	uint16_t		maxpwr_ah;
402203319Sweongyo	uint16_t		maxpwr_bg;	/* BG-PHY Max Power */
403203944Sweongyo	uint8_t			rxpo2g;
404203944Sweongyo	uint8_t			rxpo5g;
405203319Sweongyo	uint8_t			tssi_a;		/* Idle TSSI */
406203319Sweongyo	uint8_t			tssi_bg;	/* Idle TSSI */
407203944Sweongyo	uint8_t			tri2g;
408203944Sweongyo	uint8_t			tri5gl;
409203944Sweongyo	uint8_t			tri5g;
410203944Sweongyo	uint8_t			tri5gh;
411203944Sweongyo	uint8_t			rssisav2g;
412203944Sweongyo	uint8_t			rssismc2g;
413203944Sweongyo	uint8_t			rssismf2g;
414203944Sweongyo	uint8_t			bxa2g;
415203944Sweongyo	uint8_t			rssisav5g;
416203944Sweongyo	uint8_t			rssismc5g;
417203944Sweongyo	uint8_t			rssismf5g;
418203944Sweongyo	uint8_t			bxa5g;
419203944Sweongyo	uint16_t		cck2gpo;
420203944Sweongyo	uint32_t		ofdm2gpo;
421203944Sweongyo	uint32_t		ofdm5glpo;
422203944Sweongyo	uint32_t		ofdm5gpo;
423203944Sweongyo	uint32_t		ofdm5ghpo;
424203319Sweongyo	uint16_t		bf_lo;		/* boardflags */
425203319Sweongyo	uint16_t		bf_hi;		/* boardflags */
426203944Sweongyo	uint16_t		bf2_lo;
427203944Sweongyo	uint16_t		bf2_hi;
428203944Sweongyo
429203319Sweongyo	struct {
430203319Sweongyo		struct {
431203319Sweongyo			int8_t a0, a1, a2, a3;
432203319Sweongyo		} ghz24;
433203319Sweongyo		struct {
434203319Sweongyo			int8_t a0, a1, a2, a3;
435203319Sweongyo		} ghz5;
436203319Sweongyo	} again;	/* antenna gain */
437203319Sweongyo};
438203319Sweongyo
439203944Sweongyo#define	SIBA_LDO_PAREF			0
440203944Sweongyo#define	SIBA_LDO_VOLT1			1
441203944Sweongyo#define	SIBA_LDO_VOLT2			2
442203944Sweongyo#define	SIBA_LDO_VOLT3			3
443203944Sweongyo
444203319Sweongyostruct siba_cc_pmu {
445203319Sweongyo	uint8_t				rev;	/* PMU rev */
446203319Sweongyo	uint32_t			freq;	/* crystal freq in kHz */
447203319Sweongyo};
448203319Sweongyo
449203319Sweongyostruct siba_cc {
450203319Sweongyo	struct siba_dev_softc		*scc_dev;
451203319Sweongyo	uint32_t			scc_caps;
452203319Sweongyo	struct siba_cc_pmu		scc_pmu;
453203319Sweongyo	uint16_t			scc_powerup_delay;
454203319Sweongyo};
455203319Sweongyo
456203319Sweongyostruct siba_pci {
457203319Sweongyo	struct siba_dev_softc		*spc_dev;
458203319Sweongyo	uint8_t				spc_inited;
459203319Sweongyo	uint8_t				spc_hostmode;
460203319Sweongyo};
461203319Sweongyo
462203319Sweongyostruct siba_bus_ops {
463203319Sweongyo	uint16_t		(*read_2)(struct siba_dev_softc *,
464203319Sweongyo				    uint16_t);
465203319Sweongyo	uint32_t		(*read_4)(struct siba_dev_softc *,
466203319Sweongyo				    uint16_t);
467203319Sweongyo	void			(*write_2)(struct siba_dev_softc *,
468203319Sweongyo				    uint16_t, uint16_t);
469203319Sweongyo	void			(*write_4)(struct siba_dev_softc *,
470203319Sweongyo				    uint16_t, uint32_t);
471203319Sweongyo	void			(*read_multi_1)(struct siba_dev_softc *,
472203319Sweongyo				    void *, size_t, uint16_t);
473203319Sweongyo	void			(*read_multi_2)(struct siba_dev_softc *,
474203319Sweongyo				    void *, size_t, uint16_t);
475203319Sweongyo	void			(*read_multi_4)(struct siba_dev_softc *,
476203319Sweongyo				    void *, size_t, uint16_t);
477203319Sweongyo	void			(*write_multi_1)(struct siba_dev_softc *,
478203319Sweongyo				    const void *, size_t, uint16_t);
479203319Sweongyo	void			(*write_multi_2)(struct siba_dev_softc *,
480203319Sweongyo				    const void *, size_t, uint16_t);
481203319Sweongyo	void			(*write_multi_4)(struct siba_dev_softc *,
482203319Sweongyo				    const void *, size_t, uint16_t);
483203319Sweongyo};
484203319Sweongyo
485203319Sweongyostruct siba_dev_softc {
486203319Sweongyo	struct siba_softc		*sd_bus;
487203319Sweongyo	struct siba_devid		sd_id;
488203319Sweongyo	const struct siba_bus_ops	*sd_ops;
489203319Sweongyo
490203319Sweongyo	uint8_t				sd_coreidx;
491203319Sweongyo};
492203319Sweongyo
493203319Sweongyostruct siba_devinfo {
494203319Sweongyo	struct resource_list		 sdi_rl;
495203319Sweongyo	/*devhandle_t			 sdi_devhandle; XXX*/
496203319Sweongyo	/*struct rman sdi_intr_rman;*/
497203319Sweongyo
498203319Sweongyo	/* Accessors are needed for ivars below. */
499203319Sweongyo	uint16_t			 sdi_vid;
500203319Sweongyo	uint16_t			 sdi_devid;
501203319Sweongyo	uint8_t				 sdi_rev;
502203319Sweongyo	uint8_t				 sdi_idx;	/* core index on bus */
503203319Sweongyo	uint8_t				 sdi_irq;	/* TODO */
504203319Sweongyo};
505203319Sweongyo
506203319Sweongyostruct siba_softc {
507203319Sweongyo	/*
508203319Sweongyo	 * common variables which used for siba(4) bus and siba_bwn bridge.
509203319Sweongyo	 */
510203319Sweongyo	device_t			siba_dev;	/* Device ID */
511203319Sweongyo	struct resource			*siba_mem_res;
512203319Sweongyo	bus_space_tag_t			siba_mem_bt;
513203319Sweongyo	bus_space_handle_t		siba_mem_bh;
514203319Sweongyo	bus_addr_t			siba_maddr;
515203319Sweongyo	bus_size_t			siba_msize;
516203319Sweongyo	uint8_t				siba_ncores;
517203319Sweongyo
518203319Sweongyo	/*
519203319Sweongyo	 * the following variables are only used for siba_bwn bridge.
520203319Sweongyo	 */
521203319Sweongyo
522203319Sweongyo	enum siba_type			siba_type;
523203319Sweongyo	int				siba_invalid;
524203319Sweongyo
525203319Sweongyo	struct siba_dev_softc		*siba_curdev;	/* only for PCI */
526203319Sweongyo	struct siba_dev_softc		siba_devs[SIBA_MAX_CORES];
527203319Sweongyo	int				siba_ndevs;
528203319Sweongyo
529203319Sweongyo	uint16_t			siba_pci_vid;
530203319Sweongyo	uint16_t			siba_pci_did;
531203319Sweongyo	uint16_t			siba_pci_subvid;
532203319Sweongyo	uint16_t			siba_pci_subdid;
533204922Sweongyo	uint8_t				siba_pci_revid;
534203319Sweongyo	int				siba_mem_rid;
535203319Sweongyo
536203319Sweongyo	uint16_t			siba_chipid;	/* for CORE 0 */
537203319Sweongyo	uint16_t			siba_chiprev;
538203319Sweongyo	uint8_t				siba_chippkg;
539203319Sweongyo
540203319Sweongyo	struct siba_cc			siba_cc;		/* ChipCommon */
541203319Sweongyo	struct siba_pci			siba_pci;	/* PCI-core */
542203319Sweongyo	const struct siba_bus_ops	*siba_ops;
543203319Sweongyo
544203319Sweongyo	struct siba_sprom		siba_sprom;	/* SPROM */
545203319Sweongyo	uint16_t			siba_spromsize;	/* in word size */
546203319Sweongyo};
547203319Sweongyo
548204922Sweongyovoid		siba_powerup(device_t, int);
549204922Sweongyoint		siba_powerdown(device_t);
550204922Sweongyouint16_t	siba_read_2(device_t, uint16_t);
551204922Sweongyovoid		siba_write_2(device_t, uint16_t, uint16_t);
552204922Sweongyouint32_t	siba_read_4(device_t, uint16_t);
553204922Sweongyovoid		siba_write_4(device_t, uint16_t, uint32_t);
554204922Sweongyovoid		siba_dev_up(device_t, uint32_t);
555204922Sweongyovoid		siba_dev_down(device_t, uint32_t);
556204922Sweongyoint		siba_dev_isup(device_t);
557204922Sweongyovoid		siba_pcicore_intr(device_t);
558204922Sweongyouint32_t	siba_dma_translation(device_t);
559204922Sweongyovoid		siba_read_multi_1(device_t, void *, size_t, uint16_t);
560204922Sweongyovoid		siba_read_multi_2(device_t, void *, size_t, uint16_t);
561204922Sweongyovoid		siba_read_multi_4(device_t, void *, size_t, uint16_t);
562204922Sweongyovoid		siba_write_multi_1(device_t, const void *, size_t, uint16_t);
563204922Sweongyovoid		siba_write_multi_2(device_t, const void *, size_t, uint16_t);
564204922Sweongyovoid		siba_write_multi_4(device_t, const void *, size_t, uint16_t);
565204922Sweongyovoid		siba_barrier(device_t, int);
566204922Sweongyovoid		siba_cc_pmu_set_ldovolt(device_t, int, uint32_t);
567204922Sweongyovoid		siba_cc_pmu_set_ldoparef(device_t, uint8_t);
568204922Sweongyovoid		siba_gpio_set(device_t, uint32_t);
569204922Sweongyouint32_t	siba_gpio_get(device_t);
570204922Sweongyovoid		siba_fix_imcfglobug(device_t);
571203319Sweongyo
572183371Simp#endif /* _SIBA_SIBAVAR_H_ */
573