pchb.c revision 1.10 1 1.10 cegger /* $NetBSD: pchb.c,v 1.10 2008/04/16 16:06:51 cegger Exp $ */
2 1.1 xtraeme
3 1.1 xtraeme /*-
4 1.1 xtraeme * Copyright (c) 1996, 1998, 2000 The NetBSD Foundation, Inc.
5 1.1 xtraeme * All rights reserved.
6 1.1 xtraeme *
7 1.1 xtraeme * This code is derived from software contributed to The NetBSD Foundation
8 1.1 xtraeme * by Jason R. Thorpe.
9 1.1 xtraeme *
10 1.1 xtraeme * Redistribution and use in source and binary forms, with or without
11 1.1 xtraeme * modification, are permitted provided that the following conditions
12 1.1 xtraeme * are met:
13 1.1 xtraeme * 1. Redistributions of source code must retain the above copyright
14 1.1 xtraeme * notice, this list of conditions and the following disclaimer.
15 1.1 xtraeme * 2. Redistributions in binary form must reproduce the above copyright
16 1.1 xtraeme * notice, this list of conditions and the following disclaimer in the
17 1.1 xtraeme * documentation and/or other materials provided with the distribution.
18 1.1 xtraeme * 3. All advertising materials mentioning features or use of this software
19 1.1 xtraeme * must display the following acknowledgement:
20 1.1 xtraeme * This product includes software developed by the NetBSD
21 1.1 xtraeme * Foundation, Inc. and its contributors.
22 1.1 xtraeme * 4. Neither the name of The NetBSD Foundation nor the names of its
23 1.1 xtraeme * contributors may be used to endorse or promote products derived
24 1.1 xtraeme * from this software without specific prior written permission.
25 1.1 xtraeme *
26 1.1 xtraeme * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
27 1.1 xtraeme * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28 1.1 xtraeme * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 1.1 xtraeme * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
30 1.1 xtraeme * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31 1.1 xtraeme * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32 1.1 xtraeme * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33 1.1 xtraeme * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34 1.1 xtraeme * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35 1.1 xtraeme * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36 1.1 xtraeme * POSSIBILITY OF SUCH DAMAGE.
37 1.1 xtraeme */
38 1.1 xtraeme
39 1.1 xtraeme #include <sys/cdefs.h>
40 1.10 cegger __KERNEL_RCSID(0, "$NetBSD: pchb.c,v 1.10 2008/04/16 16:06:51 cegger Exp $");
41 1.1 xtraeme
42 1.1 xtraeme #include <sys/types.h>
43 1.1 xtraeme #include <sys/param.h>
44 1.1 xtraeme #include <sys/systm.h>
45 1.1 xtraeme #include <sys/device.h>
46 1.1 xtraeme
47 1.1 xtraeme #include <machine/bus.h>
48 1.1 xtraeme
49 1.1 xtraeme #include <dev/pci/pcivar.h>
50 1.1 xtraeme #include <dev/pci/pcireg.h>
51 1.1 xtraeme
52 1.1 xtraeme #include <dev/pci/pcidevs.h>
53 1.1 xtraeme
54 1.1 xtraeme #include <dev/pci/agpreg.h>
55 1.1 xtraeme #include <dev/pci/agpvar.h>
56 1.1 xtraeme
57 1.1 xtraeme #include <arch/x86/pci/pchbvar.h>
58 1.1 xtraeme
59 1.1 xtraeme #include "rnd.h"
60 1.1 xtraeme
61 1.1 xtraeme #define PCISET_BRIDGETYPE_MASK 0x3
62 1.1 xtraeme #define PCISET_TYPE_COMPAT 0x1
63 1.1 xtraeme #define PCISET_TYPE_AUX 0x2
64 1.1 xtraeme
65 1.1 xtraeme #define PCISET_BUSCONFIG_REG 0x48
66 1.1 xtraeme #define PCISET_BRIDGE_NUMBER(reg) (((reg) >> 8) & 0xff)
67 1.1 xtraeme #define PCISET_PCI_BUS_NUMBER(reg) (((reg) >> 16) & 0xff)
68 1.1 xtraeme
69 1.1 xtraeme /* XXX should be in dev/ic/i82443reg.h */
70 1.7 drochner #define I82443BX_SDRAMC_REG 0x74 /* upper 16 bits */
71 1.1 xtraeme
72 1.1 xtraeme /* XXX should be in dev/ic/i82424{reg.var}.h */
73 1.1 xtraeme #define I82424_CPU_BCTL_REG 0x53
74 1.1 xtraeme #define I82424_PCI_BCTL_REG 0x54
75 1.1 xtraeme
76 1.1 xtraeme #define I82424_BCTL_CPUMEM_POSTEN 0x01
77 1.1 xtraeme #define I82424_BCTL_CPUPCI_POSTEN 0x02
78 1.1 xtraeme #define I82424_BCTL_PCIMEM_BURSTEN 0x01
79 1.1 xtraeme #define I82424_BCTL_PCI_BURSTEN 0x02
80 1.1 xtraeme
81 1.9 cube int pchbmatch(device_t, cfdata_t, void *);
82 1.9 cube void pchbattach(device_t, device_t, void *);
83 1.6 dyoung int pchbdetach(device_t, int);
84 1.1 xtraeme
85 1.8 dyoung static bool pchb_resume(device_t PMF_FN_ARGS);
86 1.8 dyoung static bool pchb_suspend(device_t PMF_FN_ARGS);
87 1.5 jmcneill
88 1.9 cube CFATTACH_DECL_NEW(pchb, sizeof(struct pchb_softc),
89 1.6 dyoung pchbmatch, pchbattach, pchbdetach, NULL);
90 1.1 xtraeme
91 1.1 xtraeme int
92 1.9 cube pchbmatch(device_t parent, cfdata_t match, void *aux)
93 1.1 xtraeme {
94 1.1 xtraeme struct pci_attach_args *pa = aux;
95 1.1 xtraeme
96 1.1 xtraeme if (PCI_CLASS(pa->pa_class) == PCI_CLASS_BRIDGE &&
97 1.1 xtraeme PCI_SUBCLASS(pa->pa_class) == PCI_SUBCLASS_BRIDGE_HOST)
98 1.1 xtraeme return 1;
99 1.1 xtraeme
100 1.1 xtraeme return 0;
101 1.1 xtraeme }
102 1.1 xtraeme
103 1.1 xtraeme void
104 1.9 cube pchbattach(device_t parent, device_t self, void *aux)
105 1.1 xtraeme {
106 1.9 cube struct pchb_softc *sc = device_private(self);
107 1.1 xtraeme struct pci_attach_args *pa = aux;
108 1.1 xtraeme char devinfo[256];
109 1.1 xtraeme struct pcibus_attach_args pba;
110 1.1 xtraeme struct agpbus_attach_args apa;
111 1.1 xtraeme pcireg_t bcreg;
112 1.1 xtraeme u_char bdnum, pbnum = 0; /* XXX: gcc */
113 1.1 xtraeme pcitag_t tag;
114 1.1 xtraeme int doattach, attachflags, has_agp;
115 1.1 xtraeme
116 1.1 xtraeme aprint_naive("\n");
117 1.1 xtraeme aprint_normal("\n");
118 1.1 xtraeme
119 1.1 xtraeme doattach = 0;
120 1.1 xtraeme has_agp = 0;
121 1.1 xtraeme attachflags = pa->pa_flags;
122 1.1 xtraeme
123 1.9 cube sc->sc_dev = self;
124 1.9 cube
125 1.1 xtraeme /*
126 1.1 xtraeme * Print out a description, and configure certain chipsets which
127 1.1 xtraeme * have auxiliary PCI buses.
128 1.1 xtraeme */
129 1.1 xtraeme
130 1.1 xtraeme pci_devinfo(pa->pa_id, pa->pa_class, 0, devinfo, sizeof(devinfo));
131 1.9 cube aprint_normal_dev(self, "%s (rev. 0x%02x)\n", devinfo,
132 1.1 xtraeme PCI_REVISION(pa->pa_class));
133 1.1 xtraeme
134 1.1 xtraeme switch (PCI_VENDOR(pa->pa_id)) {
135 1.1 xtraeme /*
136 1.1 xtraeme * i386 stuff.
137 1.1 xtraeme */
138 1.1 xtraeme case PCI_VENDOR_SERVERWORKS:
139 1.1 xtraeme pbnum = pci_conf_read(pa->pa_pc, pa->pa_tag, 0x44) & 0xff;
140 1.1 xtraeme
141 1.1 xtraeme if (pbnum == 0)
142 1.1 xtraeme break;
143 1.1 xtraeme
144 1.1 xtraeme /*
145 1.1 xtraeme * This host bridge has a second PCI bus.
146 1.1 xtraeme * Configure it.
147 1.1 xtraeme */
148 1.1 xtraeme switch (PCI_PRODUCT(pa->pa_id)) {
149 1.1 xtraeme case PCI_PRODUCT_SERVERWORKS_CSB5:
150 1.1 xtraeme case PCI_PRODUCT_SERVERWORKS_CSB6:
151 1.1 xtraeme /* These devices show up as host bridges, but are
152 1.1 xtraeme really southbridges. */
153 1.1 xtraeme break;
154 1.1 xtraeme case PCI_PRODUCT_SERVERWORKS_CMIC_HE:
155 1.1 xtraeme case PCI_PRODUCT_SERVERWORKS_CMIC_LE:
156 1.1 xtraeme case PCI_PRODUCT_SERVERWORKS_CMIC_SL:
157 1.1 xtraeme /* CNBs and CIOBs are connected to these using a
158 1.1 xtraeme private bus. The bus number register is that of
159 1.1 xtraeme the first PCI bus hanging off the CIOB. We let
160 1.1 xtraeme the CIOB attachment handle configuring the PCI
161 1.1 xtraeme buses. */
162 1.1 xtraeme break;
163 1.1 xtraeme default:
164 1.9 cube aprint_error_dev(self,
165 1.9 cube "unknown ServerWorks chip ID 0x%04x; trying "
166 1.9 cube "to attach PCI buses behind it\n",
167 1.9 cube PCI_PRODUCT(pa->pa_id));
168 1.1 xtraeme /* FALLTHROUGH */
169 1.1 xtraeme case PCI_PRODUCT_SERVERWORKS_CNB20_LE_AGP:
170 1.1 xtraeme case PCI_PRODUCT_SERVERWORKS_CNB30_LE_PCI:
171 1.1 xtraeme case PCI_PRODUCT_SERVERWORKS_CNB20_LE_PCI:
172 1.1 xtraeme case PCI_PRODUCT_SERVERWORKS_CNB20_HE_PCI:
173 1.1 xtraeme case PCI_PRODUCT_SERVERWORKS_CNB20_HE_AGP:
174 1.1 xtraeme case PCI_PRODUCT_SERVERWORKS_CIOB_X:
175 1.1 xtraeme case PCI_PRODUCT_SERVERWORKS_CNB30_HE:
176 1.1 xtraeme case PCI_PRODUCT_SERVERWORKS_CNB20_HE_PCI2:
177 1.1 xtraeme case PCI_PRODUCT_SERVERWORKS_CIOB_X2:
178 1.1 xtraeme case PCI_PRODUCT_SERVERWORKS_CIOB_E:
179 1.1 xtraeme switch (attachflags &
180 1.1 xtraeme (PCI_FLAGS_IO_ENABLED | PCI_FLAGS_MEM_ENABLED)) {
181 1.1 xtraeme case 0:
182 1.1 xtraeme /* Doesn't smell like there's anything there. */
183 1.1 xtraeme break;
184 1.1 xtraeme case PCI_FLAGS_MEM_ENABLED:
185 1.1 xtraeme attachflags |= PCI_FLAGS_IO_ENABLED;
186 1.1 xtraeme /* FALLTHROUGH */
187 1.1 xtraeme default:
188 1.1 xtraeme doattach = 1;
189 1.1 xtraeme break;
190 1.1 xtraeme }
191 1.1 xtraeme break;
192 1.1 xtraeme }
193 1.1 xtraeme break;
194 1.1 xtraeme case PCI_VENDOR_INTEL:
195 1.1 xtraeme switch (PCI_PRODUCT(pa->pa_id)) {
196 1.1 xtraeme case PCI_PRODUCT_INTEL_82452_PB:
197 1.1 xtraeme bcreg = pci_conf_read(pa->pa_pc, pa->pa_tag, 0x40);
198 1.1 xtraeme pbnum = PCISET_BRIDGE_NUMBER(bcreg);
199 1.1 xtraeme if (pbnum != 0xff) {
200 1.1 xtraeme pbnum++;
201 1.1 xtraeme doattach = 1;
202 1.1 xtraeme }
203 1.1 xtraeme break;
204 1.1 xtraeme case PCI_PRODUCT_INTEL_82443BX_AGP:
205 1.1 xtraeme case PCI_PRODUCT_INTEL_82443BX_NOAGP:
206 1.1 xtraeme /*
207 1.1 xtraeme * http://www.intel.com/design/chipsets/specupdt/290639.htm
208 1.1 xtraeme * says this bug is fixed in steppings >= C0 (erratum 11),
209 1.1 xtraeme * so don't tweak the bits in that case.
210 1.1 xtraeme */
211 1.1 xtraeme if (!(PCI_REVISION(pa->pa_class) >= 0x03)) {
212 1.1 xtraeme /*
213 1.1 xtraeme * BIOS BUG WORKAROUND! The 82443BX
214 1.1 xtraeme * datasheet indicates that the only
215 1.1 xtraeme * legal setting for the "Idle/Pipeline
216 1.1 xtraeme * DRAM Leadoff Timing (IPLDT)" parameter
217 1.1 xtraeme * (bits 9:8) is 01. Unfortunately, some
218 1.1 xtraeme * BIOSs do not set these bits properly.
219 1.1 xtraeme */
220 1.1 xtraeme bcreg = pci_conf_read(pa->pa_pc, pa->pa_tag,
221 1.1 xtraeme I82443BX_SDRAMC_REG);
222 1.7 drochner if ((bcreg & 0x03000000) != 0x01000000) {
223 1.10 cegger aprint_verbose_dev(self, "fixing "
224 1.1 xtraeme "Idle/Pipeline DRAM "
225 1.10 cegger "Leadoff Timing\n");
226 1.7 drochner bcreg &= ~0x03000000;
227 1.7 drochner bcreg |= 0x01000000;
228 1.1 xtraeme pci_conf_write(pa->pa_pc, pa->pa_tag,
229 1.1 xtraeme I82443BX_SDRAMC_REG, bcreg);
230 1.1 xtraeme }
231 1.1 xtraeme }
232 1.1 xtraeme break;
233 1.1 xtraeme
234 1.1 xtraeme case PCI_PRODUCT_INTEL_PCI450_PB:
235 1.1 xtraeme bcreg = pci_conf_read(pa->pa_pc, pa->pa_tag,
236 1.1 xtraeme PCISET_BUSCONFIG_REG);
237 1.1 xtraeme bdnum = PCISET_BRIDGE_NUMBER(bcreg);
238 1.1 xtraeme pbnum = PCISET_PCI_BUS_NUMBER(bcreg);
239 1.1 xtraeme switch (bdnum & PCISET_BRIDGETYPE_MASK) {
240 1.1 xtraeme default:
241 1.9 cube aprint_error_dev(self, "bdnum=%x (reserved)\n",
242 1.9 cube bdnum);
243 1.1 xtraeme break;
244 1.1 xtraeme case PCISET_TYPE_COMPAT:
245 1.9 cube aprint_verbose_dev(self,
246 1.9 cube "Compatibility PB (bus %d)\n", pbnum);
247 1.1 xtraeme break;
248 1.1 xtraeme case PCISET_TYPE_AUX:
249 1.9 cube aprint_verbose_dev(self,
250 1.9 cube "Auxiliary PB (bus %d)\n",pbnum);
251 1.1 xtraeme /*
252 1.1 xtraeme * This host bridge has a second PCI bus.
253 1.1 xtraeme * Configure it.
254 1.1 xtraeme */
255 1.1 xtraeme doattach = 1;
256 1.1 xtraeme break;
257 1.1 xtraeme }
258 1.1 xtraeme break;
259 1.1 xtraeme case PCI_PRODUCT_INTEL_CDC:
260 1.1 xtraeme bcreg = pci_conf_read(pa->pa_pc, pa->pa_tag,
261 1.1 xtraeme I82424_CPU_BCTL_REG);
262 1.1 xtraeme if (bcreg & I82424_BCTL_CPUPCI_POSTEN) {
263 1.1 xtraeme bcreg &= ~I82424_BCTL_CPUPCI_POSTEN;
264 1.1 xtraeme pci_conf_write(pa->pa_pc, pa->pa_tag,
265 1.1 xtraeme I82424_CPU_BCTL_REG, bcreg);
266 1.9 cube aprint_verbose_dev(self,
267 1.9 cube "disabled CPU-PCI write posting\n");
268 1.1 xtraeme }
269 1.1 xtraeme break;
270 1.1 xtraeme case PCI_PRODUCT_INTEL_82451NX_PXB:
271 1.1 xtraeme /*
272 1.1 xtraeme * The NX chipset supports up to 2 "PXB" chips
273 1.1 xtraeme * which can drive 2 PCI buses each. Each bus
274 1.1 xtraeme * shows up as logical PCI device, with fixed
275 1.1 xtraeme * device numbers between 18 and 21.
276 1.1 xtraeme * See the datasheet at
277 1.1 xtraeme ftp://download.intel.com/design/chipsets/datashts/24377102.pdf
278 1.1 xtraeme * for details.
279 1.1 xtraeme * (It would be easier to attach all the buses
280 1.1 xtraeme * at the MIOC, but less aesthetical imho.)
281 1.1 xtraeme */
282 1.1 xtraeme if ((attachflags &
283 1.1 xtraeme (PCI_FLAGS_IO_ENABLED | PCI_FLAGS_MEM_ENABLED)) ==
284 1.1 xtraeme PCI_FLAGS_MEM_ENABLED)
285 1.1 xtraeme attachflags |= PCI_FLAGS_IO_ENABLED;
286 1.1 xtraeme
287 1.1 xtraeme pbnum = 0;
288 1.1 xtraeme switch (pa->pa_device) {
289 1.1 xtraeme case 18: /* PXB 0 bus A - primary bus */
290 1.1 xtraeme break;
291 1.1 xtraeme case 19: /* PXB 0 bus B */
292 1.1 xtraeme /* read SUBA0 from MIOC */
293 1.1 xtraeme tag = pci_make_tag(pa->pa_pc, 0, 16, 0);
294 1.1 xtraeme bcreg = pci_conf_read(pa->pa_pc, tag, 0xd0);
295 1.1 xtraeme pbnum = ((bcreg & 0x0000ff00) >> 8) + 1;
296 1.1 xtraeme break;
297 1.1 xtraeme case 20: /* PXB 1 bus A */
298 1.1 xtraeme /* read BUSNO1 from MIOC */
299 1.1 xtraeme tag = pci_make_tag(pa->pa_pc, 0, 16, 0);
300 1.1 xtraeme bcreg = pci_conf_read(pa->pa_pc, tag, 0xd0);
301 1.1 xtraeme pbnum = (bcreg & 0xff000000) >> 24;
302 1.1 xtraeme break;
303 1.1 xtraeme case 21: /* PXB 1 bus B */
304 1.1 xtraeme /* read SUBA1 from MIOC */
305 1.1 xtraeme tag = pci_make_tag(pa->pa_pc, 0, 16, 0);
306 1.1 xtraeme bcreg = pci_conf_read(pa->pa_pc, tag, 0xd4);
307 1.1 xtraeme pbnum = (bcreg & 0x000000ff) + 1;
308 1.1 xtraeme break;
309 1.1 xtraeme }
310 1.1 xtraeme if (pbnum != 0)
311 1.1 xtraeme doattach = 1;
312 1.1 xtraeme break;
313 1.1 xtraeme
314 1.1 xtraeme /*
315 1.1 xtraeme * i386 and amd64 stuff.
316 1.1 xtraeme */
317 1.1 xtraeme case PCI_PRODUCT_INTEL_82810_MCH:
318 1.1 xtraeme case PCI_PRODUCT_INTEL_82810_DC100_MCH:
319 1.1 xtraeme case PCI_PRODUCT_INTEL_82810E_MCH:
320 1.1 xtraeme case PCI_PRODUCT_INTEL_82815_FULL_HUB:
321 1.1 xtraeme case PCI_PRODUCT_INTEL_82830MP_IO_1:
322 1.1 xtraeme case PCI_PRODUCT_INTEL_82845G_DRAM:
323 1.1 xtraeme case PCI_PRODUCT_INTEL_82855GM_MCH:
324 1.1 xtraeme case PCI_PRODUCT_INTEL_82865_HB:
325 1.1 xtraeme case PCI_PRODUCT_INTEL_82915G_HB:
326 1.1 xtraeme case PCI_PRODUCT_INTEL_82915GM_HB:
327 1.1 xtraeme case PCI_PRODUCT_INTEL_82945P_MCH:
328 1.1 xtraeme case PCI_PRODUCT_INTEL_82945GM_HB:
329 1.1 xtraeme case PCI_PRODUCT_INTEL_82965Q_HB:
330 1.2 jnemeth case PCI_PRODUCT_INTEL_82965G_HB:
331 1.3 joerg case PCI_PRODUCT_INTEL_82965PM_HB:
332 1.4 markd case PCI_PRODUCT_INTEL_82Q35_HB:
333 1.4 markd case PCI_PRODUCT_INTEL_82G33_HB:
334 1.4 markd case PCI_PRODUCT_INTEL_82Q33_HB:
335 1.1 xtraeme /*
336 1.1 xtraeme * The host bridge is either in GFX mode (internal
337 1.1 xtraeme * graphics) or in AGP mode. In GFX mode, we pretend
338 1.1 xtraeme * to have AGP because the graphics memory access
339 1.1 xtraeme * is very similar and the AGP GATT code will
340 1.1 xtraeme * deal with this. In the latter case, the
341 1.1 xtraeme * pci_get_capability(PCI_CAP_AGP) test below will
342 1.1 xtraeme * fire, so we do no harm by already setting the flag.
343 1.1 xtraeme */
344 1.1 xtraeme has_agp = 1;
345 1.1 xtraeme break;
346 1.1 xtraeme }
347 1.1 xtraeme break;
348 1.1 xtraeme }
349 1.1 xtraeme
350 1.1 xtraeme #if NRND > 0
351 1.1 xtraeme /*
352 1.1 xtraeme * Attach a random number generator, if there is one.
353 1.1 xtraeme */
354 1.1 xtraeme pchb_attach_rnd(sc, pa);
355 1.1 xtraeme #endif
356 1.1 xtraeme
357 1.5 jmcneill if (!pmf_device_register(self, pchb_suspend, pchb_resume))
358 1.5 jmcneill aprint_error_dev(self, "couldn't establish power handler\n");
359 1.5 jmcneill
360 1.1 xtraeme /*
361 1.1 xtraeme * If we haven't detected AGP yet (via a product ID),
362 1.1 xtraeme * then check for AGP capability on the device.
363 1.1 xtraeme */
364 1.1 xtraeme if (has_agp ||
365 1.1 xtraeme pci_get_capability(pa->pa_pc, pa->pa_tag, PCI_CAP_AGP,
366 1.1 xtraeme NULL, NULL) != 0) {
367 1.1 xtraeme apa.apa_pci_args = *pa;
368 1.1 xtraeme config_found_ia(self, "agpbus", &apa, agpbusprint);
369 1.1 xtraeme }
370 1.1 xtraeme
371 1.1 xtraeme if (doattach) {
372 1.1 xtraeme pba.pba_iot = pa->pa_iot;
373 1.1 xtraeme pba.pba_memt = pa->pa_memt;
374 1.1 xtraeme pba.pba_dmat = pa->pa_dmat;
375 1.1 xtraeme pba.pba_dmat64 = pa->pa_dmat64;
376 1.1 xtraeme pba.pba_pc = pa->pa_pc;
377 1.1 xtraeme pba.pba_flags = attachflags;
378 1.1 xtraeme pba.pba_bus = pbnum;
379 1.1 xtraeme pba.pba_bridgetag = NULL;
380 1.1 xtraeme pba.pba_pc = pa->pa_pc;
381 1.1 xtraeme pba.pba_intrswiz = 0;
382 1.1 xtraeme memset(&pba.pba_intrtag, 0, sizeof(pba.pba_intrtag));
383 1.1 xtraeme config_found_ia(self, "pcibus", &pba, pcibusprint);
384 1.1 xtraeme }
385 1.1 xtraeme }
386 1.5 jmcneill
387 1.6 dyoung int
388 1.6 dyoung pchbdetach(device_t self, int flags)
389 1.6 dyoung {
390 1.6 dyoung int rc;
391 1.6 dyoung #if NRND > 0
392 1.6 dyoung struct pchb_softc *sc = device_private(self);
393 1.6 dyoung #endif
394 1.6 dyoung
395 1.6 dyoung if ((rc = config_detach_children(self, flags)) != 0)
396 1.6 dyoung return rc;
397 1.6 dyoung
398 1.6 dyoung pmf_device_deregister(self);
399 1.6 dyoung
400 1.6 dyoung #if NRND > 0
401 1.6 dyoung /*
402 1.6 dyoung * Attach a random number generator, if there is one.
403 1.6 dyoung */
404 1.6 dyoung pchb_detach_rnd(sc);
405 1.6 dyoung #endif
406 1.6 dyoung return 0;
407 1.6 dyoung }
408 1.6 dyoung
409 1.5 jmcneill static bool
410 1.8 dyoung pchb_suspend(device_t dv PMF_FN_ARGS)
411 1.5 jmcneill {
412 1.5 jmcneill struct pchb_softc *sc = device_private(dv);
413 1.5 jmcneill pci_chipset_tag_t pc;
414 1.5 jmcneill pcitag_t tag;
415 1.5 jmcneill int off;
416 1.5 jmcneill
417 1.5 jmcneill pc = sc->sc_pc;
418 1.5 jmcneill tag = sc->sc_tag;
419 1.5 jmcneill
420 1.5 jmcneill for (off = 0x40; off <= 0xff; off += 4)
421 1.5 jmcneill sc->sc_pciconfext[(off - 0x40) / 4] = pci_conf_read(pc, tag, off);
422 1.5 jmcneill
423 1.5 jmcneill return true;
424 1.5 jmcneill }
425 1.5 jmcneill
426 1.5 jmcneill static bool
427 1.8 dyoung pchb_resume(device_t dv PMF_FN_ARGS)
428 1.5 jmcneill {
429 1.5 jmcneill struct pchb_softc *sc = device_private(dv);
430 1.5 jmcneill pci_chipset_tag_t pc;
431 1.5 jmcneill pcitag_t tag;
432 1.5 jmcneill int off;
433 1.5 jmcneill
434 1.5 jmcneill pc = sc->sc_pc;
435 1.5 jmcneill tag = sc->sc_tag;
436 1.5 jmcneill
437 1.5 jmcneill for (off = 0x40; off <= 0xff; off += 4)
438 1.5 jmcneill pci_conf_write(pc, tag, off, sc->sc_pciconfext[(off - 0x40) / 4]);
439 1.5 jmcneill
440 1.5 jmcneill return true;
441 1.5 jmcneill }
442