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