xref: /netbsd-src/sys/arch/x68k/dev/neptune.c (revision c7fb772b85b2b5d4cfb282f868f454b4701534fd)
1*c7fb772bSthorpej /*	$NetBSD: neptune.c,v 1.23 2021/08/07 16:19:07 thorpej Exp $	*/
2ba80d2c6Sminoura 
32a71e2c1Sminoura /*-
4673523f5Smartin  * Copyright (c) 1998 The NetBSD Foundation, Inc.
5ba80d2c6Sminoura  * All rights reserved.
6ba80d2c6Sminoura  *
7ba80d2c6Sminoura  * This code is derived from software contributed to The NetBSD Foundation
8ba80d2c6Sminoura  * by Minoura Makoto.
9ba80d2c6Sminoura  *
10ba80d2c6Sminoura  * Redistribution and use in source and binary forms, with or without
11ba80d2c6Sminoura  * modification, are permitted provided that the following conditions
12ba80d2c6Sminoura  * are met:
13ba80d2c6Sminoura  * 1. Redistributions of source code must retain the above copyright
14ba80d2c6Sminoura  *    notice, this list of conditions and the following disclaimer.
15ba80d2c6Sminoura  * 2. Redistributions in binary form must reproduce the above copyright
16ba80d2c6Sminoura  *    notice, this list of conditions and the following disclaimer in the
17ba80d2c6Sminoura  *    documentation and/or other materials provided with the distribution.
18ba80d2c6Sminoura  *
192a71e2c1Sminoura  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
202a71e2c1Sminoura  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
212a71e2c1Sminoura  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
222a71e2c1Sminoura  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
232a71e2c1Sminoura  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
242a71e2c1Sminoura  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
252a71e2c1Sminoura  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
262a71e2c1Sminoura  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
272a71e2c1Sminoura  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
282a71e2c1Sminoura  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
292a71e2c1Sminoura  * POSSIBILITY OF SUCH DAMAGE.
30ba80d2c6Sminoura  */
31ba80d2c6Sminoura 
32ba80d2c6Sminoura /*
33ba80d2c6Sminoura  * Neptune-X -- X68k-ISA Bus Bridge
34ba80d2c6Sminoura  */
35ba80d2c6Sminoura 
36ab48a212Slukem #include <sys/cdefs.h>
37*c7fb772bSthorpej __KERNEL_RCSID(0, "$NetBSD: neptune.c,v 1.23 2021/08/07 16:19:07 thorpej Exp $");
38ab48a212Slukem 
39ba80d2c6Sminoura #include <sys/param.h>
40ba80d2c6Sminoura #include <sys/systm.h>
41ba80d2c6Sminoura #include <sys/device.h>
42ba80d2c6Sminoura #include <sys/malloc.h>
43ba80d2c6Sminoura 
44ba80d2c6Sminoura #include <machine/bus.h>
45ba80d2c6Sminoura #include <machine/cpu.h>
46ba80d2c6Sminoura #include <machine/frame.h>
47ba80d2c6Sminoura 
48ba80d2c6Sminoura #include <arch/x68k/dev/intiovar.h>
49ba80d2c6Sminoura #include <arch/x68k/dev/neptunevar.h>
50ba80d2c6Sminoura 
51ba80d2c6Sminoura /* bus_space stuff */
52d57ca0cfSchs static int neptune_bus_space_map(bus_space_tag_t, bus_addr_t, bus_size_t,
53d57ca0cfSchs 	int, bus_space_handle_t *);
54d57ca0cfSchs static void neptune_bus_space_unmap(bus_space_tag_t, bus_space_handle_t,
55d57ca0cfSchs 	bus_size_t);
56d57ca0cfSchs static int neptune_bus_space_subregion(bus_space_tag_t, bus_space_handle_t,
57d57ca0cfSchs 	bus_size_t, bus_size_t, bus_space_handle_t *);
58ba80d2c6Sminoura 
59ba80d2c6Sminoura static struct x68k_bus_space neptune_bus = {
60ba80d2c6Sminoura #if 0
61ba80d2c6Sminoura 	X68K_NEPUTUNE_BUS,
62ba80d2c6Sminoura #endif
63ba80d2c6Sminoura 	neptune_bus_space_map, neptune_bus_space_unmap,
64ba80d2c6Sminoura 	neptune_bus_space_subregion,
65ba80d2c6Sminoura 	x68k_bus_space_alloc, x68k_bus_space_free,
66ba80d2c6Sminoura };
67ba80d2c6Sminoura 
68ba80d2c6Sminoura 
692830b81aSisaki static int neptune_match(device_t, cfdata_t, void *);
702830b81aSisaki static void neptune_attach(device_t, device_t, void *);
712830b81aSisaki static int neptune_search(device_t, cfdata_t, const int *, void *);
72d57ca0cfSchs static int neptune_print(void *, const char *);
73ba80d2c6Sminoura 
742830b81aSisaki CFATTACH_DECL_NEW(neptune, sizeof(struct neptune_softc),
754bf871a7Sthorpej     neptune_match, neptune_attach, NULL, NULL);
76ba80d2c6Sminoura 
77ba80d2c6Sminoura static int
neptune_match(device_t parent,cfdata_t cf,void * aux)782830b81aSisaki neptune_match(device_t parent, cfdata_t cf, void *aux)
79ba80d2c6Sminoura {
80ba80d2c6Sminoura 	struct intio_attach_args *ia = aux;
81ba80d2c6Sminoura 
82ba80d2c6Sminoura 	if (strcmp(ia->ia_name, "neptune") != 0)
83ba80d2c6Sminoura 		return 0;
84ba80d2c6Sminoura 
85ba80d2c6Sminoura 	ia->ia_size = 0x400;
86ba80d2c6Sminoura 	if (intio_map_allocate_region(parent, ia, INTIO_MAP_TESTONLY))
87ba80d2c6Sminoura 		return 0;
88ba80d2c6Sminoura 
89ba80d2c6Sminoura 	/* Neptune is a virtual device.  Always there. */
90ba80d2c6Sminoura 
91ba80d2c6Sminoura 	return (1);
92ba80d2c6Sminoura }
93ba80d2c6Sminoura 
94ba80d2c6Sminoura 
95ba80d2c6Sminoura static void
neptune_attach(device_t parent,device_t self,void * aux)962830b81aSisaki neptune_attach(device_t parent, device_t self, void *aux)
97ba80d2c6Sminoura {
982830b81aSisaki 	struct neptune_softc *sc = device_private(self);
99ba80d2c6Sminoura 	struct intio_attach_args *ia = aux;
100ba80d2c6Sminoura 	struct neptune_attach_args na;
1014c3cdcf0Schristos 	int r __diagused;
1022830b81aSisaki 	cfdata_t cf;
103ba80d2c6Sminoura 
104ba80d2c6Sminoura 	ia->ia_size = 0x400;
105ba80d2c6Sminoura 	r = intio_map_allocate_region(parent, ia, INTIO_MAP_ALLOCATE);
106ba80d2c6Sminoura #ifdef DIAGNOSTIC
107ba80d2c6Sminoura 	if (r)
108ba80d2c6Sminoura 		panic("IO map for Neptune corruption??");
109ba80d2c6Sminoura #endif
110ba80d2c6Sminoura 
111d47bcd29Schs 	sc->sc_bst = malloc(sizeof(struct x68k_bus_space), M_DEVBUF, M_WAITOK);
112ba80d2c6Sminoura 	*sc->sc_bst = neptune_bus;
113ba80d2c6Sminoura 	sc->sc_bst->x68k_bus_device = self;
114ba80d2c6Sminoura 
1153b878f89Sisaki 	sc->sc_addr = (vaddr_t)IIOV(ia->ia_addr);
116ba80d2c6Sminoura 
117ba80d2c6Sminoura 	na.na_bst = sc->sc_bst;
118ba80d2c6Sminoura 	na.na_intr = ia->ia_intr;
119ba80d2c6Sminoura 
1202685996bSthorpej 	cf = config_search(self, &na,
121*c7fb772bSthorpej 	    CFARGS(.submatch = neptune_search));
122ba80d2c6Sminoura 	if (cf) {
1232830b81aSisaki 		aprint_normal(": Neptune-X ISA bridge\n");
124*c7fb772bSthorpej 		config_attach(self, cf, &na, neptune_print, CFARGS_NONE);
125ba80d2c6Sminoura 	} else {
1262830b81aSisaki 		aprint_normal(": no device found.\n");
127ba80d2c6Sminoura 		intio_map_free_region(parent, ia);
128ba80d2c6Sminoura 	}
129ba80d2c6Sminoura }
130ba80d2c6Sminoura 
131ba80d2c6Sminoura static int
neptune_search(device_t parent,cfdata_t cf,const int * ldesc,void * aux)1322830b81aSisaki neptune_search(device_t parent, cfdata_t cf, const int *ldesc, void *aux)
133ba80d2c6Sminoura {
134ba80d2c6Sminoura 	struct neptune_attach_args *na = aux;
135ba80d2c6Sminoura 
136ba80d2c6Sminoura 	na->na_addr = cf->neptune_cf_addr;
137ba80d2c6Sminoura 
1386c88de3bSthorpej 	return config_match(parent, cf, na);
139ba80d2c6Sminoura }
140ba80d2c6Sminoura 
141ba80d2c6Sminoura static int
neptune_print(void * aux,const char * name)142d57ca0cfSchs neptune_print(void *aux, const char *name)
143ba80d2c6Sminoura {
144ba80d2c6Sminoura 	struct neptune_attach_args *na = aux;
145ba80d2c6Sminoura 
146ba80d2c6Sminoura /*	if (na->na_addr > 0)	*/
14798b0e9afSthorpej 		aprint_normal(" addr 0x%06x", na->na_addr);
148ba80d2c6Sminoura 
149ba80d2c6Sminoura 	return (QUIET);
150ba80d2c6Sminoura }
151ba80d2c6Sminoura 
152ba80d2c6Sminoura 
153ba80d2c6Sminoura /*
154ba80d2c6Sminoura  * neptune bus space stuff.
155ba80d2c6Sminoura  */
156ba80d2c6Sminoura static int
neptune_bus_space_map(bus_space_tag_t t,bus_addr_t bpa,bus_size_t size,int flags,bus_space_handle_t * bshp)157d57ca0cfSchs neptune_bus_space_map(bus_space_tag_t t, bus_addr_t bpa, bus_size_t size,
158d57ca0cfSchs     int flags, bus_space_handle_t *bshp)
159ba80d2c6Sminoura {
1602830b81aSisaki 	struct neptune_softc *sc = device_private(t->x68k_bus_device);
1612830b81aSisaki 	vaddr_t start = sc->sc_addr;
162ba80d2c6Sminoura 
163ba80d2c6Sminoura 	/*
164ba80d2c6Sminoura 	 * Neptune bus is mapped permanently.
165ba80d2c6Sminoura 	 */
166ba80d2c6Sminoura 	*bshp = (bus_space_handle_t) ((u_int)start + ((u_int)bpa - 0x200) * 2);
167ba80d2c6Sminoura 
168df3cf436She 	if (badaddr((void *)*bshp)) {
169ba80d2c6Sminoura 		return 1;
170ba80d2c6Sminoura 	}
171ba80d2c6Sminoura 
172ba80d2c6Sminoura 	*bshp |= 0x80000000;	/* higher byte (= even address) only */
173ba80d2c6Sminoura 
174ba80d2c6Sminoura 	return (0);
175ba80d2c6Sminoura }
176ba80d2c6Sminoura 
177ba80d2c6Sminoura static void
neptune_bus_space_unmap(bus_space_tag_t t,bus_space_handle_t bsh,bus_size_t size)178d57ca0cfSchs neptune_bus_space_unmap(bus_space_tag_t t, bus_space_handle_t bsh,
179d57ca0cfSchs     bus_size_t size)
180ba80d2c6Sminoura {
181ba80d2c6Sminoura 	return;
182ba80d2c6Sminoura }
183ba80d2c6Sminoura 
184ba80d2c6Sminoura static int
neptune_bus_space_subregion(bus_space_tag_t t,bus_space_handle_t bsh,bus_size_t offset,bus_size_t size,bus_space_handle_t * nbshp)185d57ca0cfSchs neptune_bus_space_subregion(bus_space_tag_t t, bus_space_handle_t bsh,
186d57ca0cfSchs     bus_size_t offset, bus_size_t size, bus_space_handle_t *nbshp)
187ba80d2c6Sminoura {
188ba80d2c6Sminoura 
189ba80d2c6Sminoura 	*nbshp = bsh + offset*2;
190ba80d2c6Sminoura 	return (0);
191ba80d2c6Sminoura }
192