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