Sync usage with man page.
[netbsd-mini2440.git] / sys / arch / evbmips / malta / dev / mainbus.c
blob88fb38eda2d6a2583964e58cb4ca713dae19c8e7
1 /* $NetBSD: mainbus.c,v 1.10 2005/12/11 12:17:11 christos Exp $ */
3 /*
4 * Copyright 2002 Wasabi Systems, Inc.
5 * All rights reserved.
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
11 * are met:
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
23 * written permission.
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 $");
41 #include "opt_pci.h"
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>
49 #endif
51 #include <dev/pci/pcivar.h>
52 #if defined(PCI_NETBSD_CONFIGURE)
53 #include <dev/pci/pciconf.h>
54 #endif
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 */
67 #include "locators.h"
68 #include "pci.h"
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 *,
73 const int *, void *);
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. */
80 int mainbus_found;
82 struct mainbusdev {
83 const char *md_name;
84 bus_addr_t md_addr;
85 int md_intr;
88 struct mainbusdev mainbusdevs[] = {
89 { "cpu", -1, -1 },
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 },
94 { NULL, 0, 0 },
97 static int
98 mainbus_match(struct device *parent, struct cfdata *match, void *aux)
101 if (mainbus_found)
102 return (0);
104 return (1);
107 static void
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;
114 #endif
115 #if defined(PCI_NETBSD_ENABLE_IDE)
116 struct malta_config *mcp = &malta_configuration;
117 pci_chipset_tag_t pc = &mcp->mc_pc;
118 pcitag_t idetag;
119 pcireg_t idetim;
120 #endif
122 mainbus_found = 1;
123 printf("\n");
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.
145 idetim = 0;
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);
154 #endif
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);
164 static int
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)
172 return (0);
174 return (config_match(parent, cf, aux));
177 static int
178 mainbus_print(void *aux, const char *pnp)
180 struct mainbus_attach_args *ma = aux;
182 if (pnp != 0)
183 return QUIET;
185 if (pnp)
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);
190 return (UNCONF);