xref: /netbsd-src/sys/arch/sparc64/dev/ffb_mainbus.c (revision d1579b2d70337e1b895f03478838f880e450f6da)
1*d1579b2dSriastradh /*	$NetBSD: ffb_mainbus.c,v 1.15 2018/09/03 16:29:27 riastradh Exp $	*/
249f3f8ccSpetrov /*	$OpenBSD: creator_mainbus.c,v 1.4 2002/07/26 16:39:04 jason Exp $	*/
349f3f8ccSpetrov 
449f3f8ccSpetrov /*
549f3f8ccSpetrov  * Copyright (c) 2002 Jason L. Wright (jason@thought.net),
649f3f8ccSpetrov  *  Federico G. Schwindt (fgsch@openbsd.org)
749f3f8ccSpetrov  * All rights reserved.
849f3f8ccSpetrov  *
949f3f8ccSpetrov  * Redistribution and use in source and binary forms, with or without
1049f3f8ccSpetrov  * modification, are permitted provided that the following conditions
1149f3f8ccSpetrov  * are met:
1249f3f8ccSpetrov  * 1. Redistributions of source code must retain the above copyright
1349f3f8ccSpetrov  *    notice, this list of conditions and the following disclaimer.
1449f3f8ccSpetrov  * 2. Redistributions in binary form must reproduce the above copyright
1549f3f8ccSpetrov  *    notice, this list of conditions and the following disclaimer in the
1649f3f8ccSpetrov  *    documentation and/or other materials provided with the distribution.
1749f3f8ccSpetrov  * 3. All advertising materials mentioning features or use of this software
1849f3f8ccSpetrov  *    must display the following acknowledgement:
1949f3f8ccSpetrov  *	This product includes software developed by Jason L. Wright
2049f3f8ccSpetrov  * 4. The name of the author may not be used to endorse or promote products
2149f3f8ccSpetrov  *    derived from this software without specific prior written permission.
2249f3f8ccSpetrov  *
2349f3f8ccSpetrov  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
2449f3f8ccSpetrov  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
2549f3f8ccSpetrov  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
2649f3f8ccSpetrov  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
2749f3f8ccSpetrov  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
2849f3f8ccSpetrov  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
2949f3f8ccSpetrov  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
3049f3f8ccSpetrov  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
3149f3f8ccSpetrov  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
3249f3f8ccSpetrov  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
3349f3f8ccSpetrov  * POSSIBILITY OF SUCH DAMAGE.
3449f3f8ccSpetrov  */
3549f3f8ccSpetrov 
36ed517291Slukem #include <sys/cdefs.h>
37*d1579b2dSriastradh __KERNEL_RCSID(0, "$NetBSD: ffb_mainbus.c,v 1.15 2018/09/03 16:29:27 riastradh Exp $");
38ed517291Slukem 
3949f3f8ccSpetrov #include <sys/types.h>
4049f3f8ccSpetrov #include <sys/param.h>
4149f3f8ccSpetrov #include <sys/systm.h>
4249f3f8ccSpetrov #include <sys/kernel.h>
4349f3f8ccSpetrov #include <sys/device.h>
4449f3f8ccSpetrov 
45b6584574Sdyoung #include <sys/bus.h>
4649f3f8ccSpetrov #include <machine/autoconf.h>
4749f3f8ccSpetrov #include <machine/openfirm.h>
4849f3f8ccSpetrov 
4949f3f8ccSpetrov #include <dev/wscons/wsconsio.h>
5021d2a323Smartin #include <dev/sun/fbio.h>
5121d2a323Smartin #include <dev/sun/fbvar.h>
5249f3f8ccSpetrov 
5349f3f8ccSpetrov #include <sparc64/dev/ffbreg.h>
5449f3f8ccSpetrov #include <sparc64/dev/ffbvar.h>
5549f3f8ccSpetrov 
562f1de3c8Spetrov extern int prom_stdout_node;
572f1de3c8Spetrov 
58817999e9Schristos int	ffb_mainbus_match(device_t, cfdata_t, void *);
59817999e9Schristos void	ffb_mainbus_attach(device_t, device_t, void *);
6049f3f8ccSpetrov 
61817999e9Schristos CFATTACH_DECL_NEW(ffb_mainbus, sizeof(struct ffb_softc),
6249f3f8ccSpetrov     ffb_mainbus_match, ffb_mainbus_attach, NULL, NULL);
6349f3f8ccSpetrov 
6449f3f8ccSpetrov int
ffb_mainbus_match(device_t parent,cfdata_t match,void * aux)65817999e9Schristos ffb_mainbus_match(device_t parent, cfdata_t match, void *aux)
6649f3f8ccSpetrov {
6749f3f8ccSpetrov 	struct mainbus_attach_args *ma = aux;
6849f3f8ccSpetrov 
6949f3f8ccSpetrov 	if (strcmp(ma->ma_name, "SUNW,ffb") == 0 ||
7049f3f8ccSpetrov 	    strcmp(ma->ma_name, "SUNW,afb") == 0)
71817999e9Schristos 		return 1;
72817999e9Schristos 	return 0;
7349f3f8ccSpetrov }
7449f3f8ccSpetrov 
7549f3f8ccSpetrov void
ffb_mainbus_attach(device_t parent,device_t self,void * aux)76817999e9Schristos ffb_mainbus_attach(device_t parent, device_t self, void *aux)
7749f3f8ccSpetrov {
78817999e9Schristos 	struct ffb_softc *sc = device_private(self);
7949f3f8ccSpetrov 	struct mainbus_attach_args *ma = aux;
8049f3f8ccSpetrov 	int i, nregs;
8149f3f8ccSpetrov 
82817999e9Schristos 	sc->sc_dev = self;
8349f3f8ccSpetrov 	sc->sc_bt = ma->ma_bustag;
8449f3f8ccSpetrov 
85*d1579b2dSriastradh 	nregs = uimin(ma->ma_nreg, FFB_NREGS);
8649f3f8ccSpetrov 
8749f3f8ccSpetrov 	if (nregs < FFB_REG_DFB24) {
8849f3f8ccSpetrov 		printf(": no dfb24 regs found\n");
8949f3f8ccSpetrov 		goto fail1;
9049f3f8ccSpetrov 	}
9149f3f8ccSpetrov 
9249f3f8ccSpetrov 
9349f3f8ccSpetrov 	if (bus_space_map(sc->sc_bt, ma->ma_reg[FFB_REG_FBC].ur_paddr,
9449f3f8ccSpetrov 	    ma->ma_reg[FFB_REG_FBC].ur_len, 0, &sc->sc_fbc_h)) {
9549f3f8ccSpetrov 		printf(": failed to map fbc\n");
969912ffbbSmacallan 		goto fail1;
97a60b59ccSheas 	}
98a60b59ccSheas 
99a60b59ccSheas 	if (bus_space_map(sc->sc_bt, ma->ma_reg[FFB_REG_DAC].ur_paddr,
100ae5ea826Sheas 	    ma->ma_reg[FFB_REG_DAC].ur_len, 0, &sc->sc_dac_h)) {
101a60b59ccSheas 		printf(": failed to map dac\n");
102a60b59ccSheas 		goto unmap_fbc;
10349f3f8ccSpetrov 	}
10449f3f8ccSpetrov 
105fa70cee0Smacallan 	if (bus_space_map(sc->sc_bt, ma->ma_reg[FFB_REG_SFB32].ur_paddr,
106acc190f4Smacallan 	    ma->ma_reg[FFB_REG_SFB32].ur_len,
107acc190f4Smacallan 	    BUS_SPACE_MAP_LINEAR | BUS_SPACE_MAP_PREFETCHABLE,
108fa70cee0Smacallan 	    &sc->sc_sfb32_h)) {
109fa70cee0Smacallan 		panic(": failed to map SFB32\n");
110fa70cee0Smacallan 		goto unmap_dac;
111fa70cee0Smacallan 	}
112fa70cee0Smacallan 	sc->sc_sfb32 = bus_space_vaddr(sc->sc_bt, sc->sc_sfb32_h);
113fa70cee0Smacallan 
11449f3f8ccSpetrov 	for (i = 0; i < nregs; i++) {
11549f3f8ccSpetrov 		sc->sc_addrs[i] = ma->ma_reg[i].ur_paddr;
11649f3f8ccSpetrov 		sc->sc_sizes[i] = ma->ma_reg[i].ur_len;
11749f3f8ccSpetrov 	}
11849f3f8ccSpetrov 	sc->sc_nreg = nregs;
11949f3f8ccSpetrov 
1202f1de3c8Spetrov 	sc->sc_console = (prom_stdout_node == ma->ma_node);
12149f3f8ccSpetrov 	sc->sc_node = ma->ma_node;
12249f3f8ccSpetrov 
12349f3f8ccSpetrov 	if (strcmp(ma->ma_name, "SUNW,afb") == 0)
12449f3f8ccSpetrov 		sc->sc_type = FFB_AFB;
12549f3f8ccSpetrov 
126d436f96fSjdc 	ffb_attach(self);
12749f3f8ccSpetrov 
12849f3f8ccSpetrov 	return;
12949f3f8ccSpetrov 
130a60b59ccSheas unmap_dac:
131a60b59ccSheas 	bus_space_unmap(sc->sc_bt, sc->sc_dac_h,
132a60b59ccSheas 		    ma->ma_reg[FFB_REG_DAC].ur_len);
133fa70cee0Smacallan 
134a60b59ccSheas unmap_fbc:
13549f3f8ccSpetrov 	bus_space_unmap(sc->sc_bt, sc->sc_fbc_h,
13649f3f8ccSpetrov 		    ma->ma_reg[FFB_REG_FBC].ur_len);
13749f3f8ccSpetrov fail1:
13849f3f8ccSpetrov 	return;
13949f3f8ccSpetrov }
140