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