1 /* $NetBSD: mainbus.c,v 1.10 2005/12/11 12:17:11 christos Exp $ */
4 * Copyright 2002 Wasabi Systems, Inc.
7 * Written by Simon Burge for Wasabi Systems, Inc.
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 * 3. All advertising materials mentioning features or use of this software
18 * must display the following acknowledgement:
19 * This product includes software developed for the NetBSD Project by
20 * Wasabi Systems, Inc.
21 * 4. The name of Wasabi Systems, Inc. may not be used to endorse
22 * or promote products derived from this software without specific prior
25 * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
26 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
27 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC
29 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35 * POSSIBILITY OF SUCH DAMAGE.
38 #include <sys/cdefs.h>
39 __KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.10 2005/12/11 12:17:11 christos Exp $");
43 #include <sys/param.h>
44 #include <sys/systm.h>
45 #include <sys/device.h>
46 #if defined(PCI_NETBSD_CONFIGURE)
47 #include <sys/extent.h>
48 #include <sys/malloc.h>
51 #include <dev/pci/pcivar.h>
52 #if defined(PCI_NETBSD_CONFIGURE)
53 #include <dev/pci/pciconf.h>
56 #include <mips/cache.h>
57 #include <mips/cpuregs.h>
59 #include <evbmips/malta/autoconf.h>
60 #include <evbmips/malta/maltareg.h>
61 #include <evbmips/malta/maltavar.h>
63 #if defined(PCI_NETBSD_ENABLE_IDE)
64 #include <dev/pci/pciide_piix_reg.h>
65 #endif /* PCI_NETBSD_ENABLE_IDE */
70 static int mainbus_match(struct device
*, struct cfdata
*, void *);
71 static void mainbus_attach(struct device
*, struct device
*, void *);
72 static int mainbus_submatch(struct device
*, struct cfdata
*,
74 static int mainbus_print(void *, const char *);
76 CFATTACH_DECL(mainbus
, sizeof(struct device
),
77 mainbus_match
, mainbus_attach
, NULL
, NULL
);
79 /* There can be only one. */
88 struct mainbusdev mainbusdevs
[] = {
90 { "gt", MALTA_CORECTRL_BASE
, -1 },
91 { "com", MALTA_CBUSUART
, MALTA_CBUSUART_INTR
},
92 { "i2c", MALTA_I2C_BASE
, -1 },
93 { "gpio", MALTA_GPIO_BASE
, -1 },
98 mainbus_match(struct device
*parent
, struct cfdata
*match
, void *aux
)
108 mainbus_attach(struct device
*parent
, struct device
*self
, void *aux
)
110 struct mainbus_attach_args ma
;
111 struct mainbusdev
*md
;
112 #if defined(PCI_NETBSD_CONFIGURE)
113 struct extent
*ioext
, *memext
;
115 #if defined(PCI_NETBSD_ENABLE_IDE)
116 struct malta_config
*mcp
= &malta_configuration
;
117 pci_chipset_tag_t pc
= &mcp
->mc_pc
;
125 #if defined(PCI_NETBSD_CONFIGURE)
126 ioext
= extent_create("pciio", 0x00001000, 0x0000efff,
127 M_DEVBUF
, NULL
, 0, EX_NOWAIT
);
128 memext
= extent_create("pcimem", MALTA_PCIMEM1_BASE
,
129 MALTA_PCIMEM1_BASE
+ MALTA_PCIMEM1_SIZE
,
130 M_DEVBUF
, NULL
, 0, EX_NOWAIT
);
132 pci_configure_bus(pc
, ioext
, memext
, NULL
, 0, mips_dcache_align
);
133 extent_destroy(ioext
);
134 extent_destroy(memext
);
135 #endif /* PCI_NETBSD_CONFIGURE */
137 #if defined(PCI_NETBSD_ENABLE_IDE)
139 * Perhaps PMON has not enabled the IDE controller. Easy to
140 * fix -- just set the ENABLE bits for each channel in the
141 * IDETIM register. Just clear all the bits for the channel
142 * except for the ENABLE bits -- the `pciide' driver will
143 * properly configure it later.
146 if (PCI_NETBSD_ENABLE_IDE
& 0x01)
147 idetim
= PIIX_IDETIM_SET(idetim
, PIIX_IDETIM_IDE
, 0);
148 if (PCI_NETBSD_ENABLE_IDE
& 0x02)
149 idetim
= PIIX_IDETIM_SET(idetim
, PIIX_IDETIM_IDE
, 1);
151 /* pciide0 is pci device 10, function 1 */
152 idetag
= pci_make_tag(pc
, 0, 10, 1);
153 pci_conf_write(pc
, idetag
, PIIX_IDETIM
, idetim
);
155 for (md
= mainbusdevs
; md
->md_name
!= NULL
; md
++) {
156 ma
.ma_name
= md
->md_name
;
157 ma
.ma_addr
= md
->md_addr
;
158 ma
.ma_intr
= md
->md_intr
;
159 (void) config_found_sm_loc(self
, "mainbus", NULL
, &ma
,
160 mainbus_print
, mainbus_submatch
);
165 mainbus_submatch(struct device
*parent
, struct cfdata
*cf
,
166 const int *ldesc
, void *aux
)
168 struct mainbus_attach_args
*ma
= aux
;
170 if (cf
->cf_loc
[MAINBUSCF_ADDR
] != MAINBUSCF_ADDR_DEFAULT
&&
171 cf
->cf_loc
[MAINBUSCF_ADDR
] != ma
->ma_addr
)
174 return (config_match(parent
, cf
, aux
));
178 mainbus_print(void *aux
, const char *pnp
)
180 struct mainbus_attach_args
*ma
= aux
;
186 aprint_normal("%s at %s", ma
->ma_name
, pnp
);
187 if (ma
->ma_addr
!= MAINBUSCF_ADDR_DEFAULT
)
188 aprint_normal(" addr 0x%lx", ma
->ma_addr
);