1 /* $NetBSD: ffb_mainbus.c,v 1.1.2.4 2005/11/10 13:59:18 skrll Exp $ */
2 /* $OpenBSD: creator_mainbus.c,v 1.4 2002/07/26 16:39:04 jason Exp $ */
5 * Copyright (c) 2002 Jason L. Wright (jason@thought.net),
6 * Federico G. Schwindt (fgsch@openbsd.org)
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 by Jason L. Wright
20 * 4. The name of the author may not be used to endorse or promote products
21 * derived from this software without specific prior written permission.
23 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
24 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
27 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
29 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
31 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
32 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33 * POSSIBILITY OF SUCH DAMAGE.
36 #include <sys/cdefs.h>
37 __KERNEL_RCSID(0, "$NetBSD: ffb_mainbus.c,v 1.1.2.4 2005/11/10 13:59:18 skrll Exp $");
39 #include <sys/types.h>
40 #include <sys/param.h>
41 #include <sys/systm.h>
42 #include <sys/kernel.h>
43 #include <sys/device.h>
45 #include <machine/bus.h>
46 #include <machine/autoconf.h>
47 #include <machine/openfirm.h>
49 #include <dev/wscons/wsconsio.h>
50 #include <dev/sun/fbio.h>
51 #include <dev/sun/fbvar.h>
53 #include <sparc64/dev/ffbreg.h>
54 #include <sparc64/dev/ffbvar.h>
56 extern int prom_stdout_node
;
58 int ffb_mainbus_match(struct device
*, struct cfdata
*, void *);
59 void ffb_mainbus_attach(struct device
*, struct device
*, void *);
61 CFATTACH_DECL(ffb_mainbus
, sizeof(struct ffb_softc
),
62 ffb_mainbus_match
, ffb_mainbus_attach
, NULL
, NULL
);
65 ffb_mainbus_match(struct device
*parent
, struct cfdata
*match
, void *aux
)
67 struct mainbus_attach_args
*ma
= aux
;
69 if (strcmp(ma
->ma_name
, "SUNW,ffb") == 0 ||
70 strcmp(ma
->ma_name
, "SUNW,afb") == 0)
76 ffb_mainbus_attach(struct device
*parent
, struct device
*self
, void *aux
)
78 struct ffb_softc
*sc
= (struct ffb_softc
*)self
;
79 struct mainbus_attach_args
*ma
= aux
;
82 sc
->sc_bt
= ma
->ma_bustag
;
84 nregs
= min(ma
->ma_nreg
, FFB_NREGS
);
86 if (nregs
< FFB_REG_DFB24
) {
87 printf(": no dfb24 regs found\n");
91 if (bus_space_map(sc
->sc_bt
, ma
->ma_reg
[FFB_REG_DFB24
].ur_paddr
,
92 ma
->ma_reg
[FFB_REG_DFB24
].ur_len
, BUS_SPACE_MAP_LINEAR
,
94 printf(": failed to map dfb24\n");
98 if (bus_space_map(sc
->sc_bt
, ma
->ma_reg
[FFB_REG_FBC
].ur_paddr
,
99 ma
->ma_reg
[FFB_REG_FBC
].ur_len
, 0, &sc
->sc_fbc_h
)) {
100 printf(": failed to map fbc\n");
104 if (bus_space_map(sc
->sc_bt
, ma
->ma_reg
[FFB_REG_DAC
].ur_paddr
,
105 ma
->ma_reg
[FFB_REG_DAC
].ur_len
, 0, &sc
->sc_dac_h
)) {
106 printf(": failed to map dac\n");
110 for (i
= 0; i
< nregs
; i
++) {
111 sc
->sc_addrs
[i
] = ma
->ma_reg
[i
].ur_paddr
;
112 sc
->sc_sizes
[i
] = ma
->ma_reg
[i
].ur_len
;
116 sc
->sc_console
= (prom_stdout_node
== ma
->ma_node
);
117 sc
->sc_node
= ma
->ma_node
;
119 if (strcmp(ma
->ma_name
, "SUNW,afb") == 0)
120 sc
->sc_type
= FFB_AFB
;
128 bus_space_unmap(sc
->sc_bt
, sc
->sc_dac_h
,
129 ma
->ma_reg
[FFB_REG_DAC
].ur_len
);
132 bus_space_unmap(sc
->sc_bt
, sc
->sc_fbc_h
,
133 ma
->ma_reg
[FFB_REG_FBC
].ur_len
);
135 bus_space_unmap(sc
->sc_bt
, sc
->sc_pixel_h
,
136 ma
->ma_reg
[FFB_REG_DFB24
].ur_len
);