mainbus.c revision 1.2
11.2Sjmcneill/*	$NetBSD: mainbus.c,v 1.2 2020/07/16 11:49:37 jmcneill Exp $	*/
21.1Shikaru
31.1Shikaru/*
41.1Shikaru * Copyright (c) 2007
51.1Shikaru *      Internet Initiative Japan, Inc.  All rights reserved.
61.1Shikaru *
71.1Shikaru * Redistribution and use in source and binary forms, with or without
81.1Shikaru * modification, are permitted provided that the following conditions
91.1Shikaru * are met:
101.1Shikaru * 1. Redistributions of source code must retain the above copyright
111.1Shikaru *    notice, this list of conditions and the following disclaimer.
121.1Shikaru * 2. Redistributions in binary form must reproduce the above copyright
131.1Shikaru *    notice, this list of conditions and the following disclaimer in the
141.1Shikaru *    documentation and/or other materials provided with the distribution.
151.1Shikaru *
161.1Shikaru * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
171.1Shikaru * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
181.1Shikaru * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
191.1Shikaru * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
201.1Shikaru * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
211.1Shikaru * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
221.1Shikaru * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
231.1Shikaru * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
241.1Shikaru * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
251.1Shikaru * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
261.1Shikaru * SUCH DAMAGE.
271.1Shikaru */
281.1Shikaru
291.1Shikaru#include <sys/cdefs.h>
301.2Sjmcneill__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.2 2020/07/16 11:49:37 jmcneill Exp $");
311.2Sjmcneill
321.2Sjmcneill#define	_MIPS_BUS_DMA_PRIVATE
331.1Shikaru
341.1Shikaru#include <sys/param.h>
351.1Shikaru#include <sys/systm.h>
361.1Shikaru#include <sys/device.h>
371.2Sjmcneill#include <sys/bus.h>
381.1Shikaru
391.1Shikaru#include <mips/cavium/include/mainbusvar.h>
401.1Shikaru
411.2Sjmcneill#include <dev/fdt/fdtvar.h>
421.2Sjmcneill
431.1Shikarustatic int	mainbus_match(device_t, struct cfdata *, void *);
441.1Shikarustatic void	mainbus_attach(device_t, device_t, void *);
451.2Sjmcneillstatic void	mainbus_attach_static(device_t);
461.2Sjmcneillstatic void	mainbus_attach_devicetree(device_t);
471.1Shikarustatic int	mainbus_submatch(device_t, cfdata_t, const int *, void *);
481.1Shikarustatic int	mainbus_print(void *, const char *);
491.1Shikaru
501.2Sjmcneillstatic void	simplebus_bus_io_init(bus_space_tag_t, void *);
511.2Sjmcneill
521.1ShikaruCFATTACH_DECL_NEW(mainbus, sizeof(device_t), mainbus_match, mainbus_attach,
531.1Shikaru    NULL, NULL);
541.1Shikaru
551.2Sjmcneillstatic struct mips_bus_space simplebus_bus_tag;
561.2Sjmcneill
571.2Sjmcneillstatic struct mips_bus_dma_tag simplebus_dma_tag = {
581.2Sjmcneill	._cookie = NULL,
591.2Sjmcneill	._wbase = 0,
601.2Sjmcneill	._bounce_alloc_lo = 0,
611.2Sjmcneill	._bounce_alloc_hi = 0,
621.2Sjmcneill	._dmamap_ops = _BUS_DMAMAP_OPS_INITIALIZER,
631.2Sjmcneill	._dmamem_ops = _BUS_DMAMEM_OPS_INITIALIZER,
641.2Sjmcneill	._dmatag_ops = _BUS_DMATAG_OPS_INITIALIZER,
651.2Sjmcneill};
661.2Sjmcneill
671.1Shikarustatic int
681.1Shikarumainbus_match(device_t parent, struct cfdata *match, void *aux)
691.1Shikaru{
701.1Shikaru	static int once = 0;
711.1Shikaru
721.1Shikaru	if (once != 0)
731.1Shikaru		return 0;
741.1Shikaru	once = 1;
751.1Shikaru
761.1Shikaru	return 1;
771.1Shikaru}
781.1Shikaru
791.1Shikarustatic void
801.1Shikarumainbus_attach(device_t parent, device_t self, void *aux)
811.1Shikaru{
821.2Sjmcneill	aprint_normal("\n");
831.2Sjmcneill
841.2Sjmcneill	if (fdtbus_get_data() != NULL) {
851.2Sjmcneill		mainbus_attach_devicetree(self);
861.2Sjmcneill	} else {
871.2Sjmcneill		mainbus_attach_static(self);
881.2Sjmcneill	}
891.2Sjmcneill}
901.2Sjmcneill
911.2Sjmcneillstatic void
921.2Sjmcneillmainbus_attach_static(device_t self)
931.2Sjmcneill{
941.2Sjmcneill	struct mainbus_attach_args aa;
951.1Shikaru	int i;
961.1Shikaru
971.1Shikaru	for (i = 0; i < (int)mainbus_ndevs; i++) {
981.1Shikaru		aa.aa_name = mainbus_devs[i];
991.2Sjmcneill		config_found_sm_loc(self, "mainbus", NULL, &aa,
1001.1Shikaru		    mainbus_print, mainbus_submatch);
1011.1Shikaru	}
1021.1Shikaru}
1031.1Shikaru
1041.2Sjmcneillextern struct octeon_config octeon_configuration;
1051.2Sjmcneillextern void octpow_bootstrap(struct octeon_config *);
1061.2Sjmcneillextern void octfpa_bootstrap(struct octeon_config *);
1071.2Sjmcneill
1081.2Sjmcneillstatic void
1091.2Sjmcneillmainbus_attach_devicetree(device_t self)
1101.2Sjmcneill{
1111.2Sjmcneill	struct mainbus_attach_args aa;
1121.2Sjmcneill	struct fdt_attach_args faa;
1131.2Sjmcneill
1141.2Sjmcneill	aa.aa_name = "cpunode";
1151.2Sjmcneill	config_found_sm_loc(self, "mainbus", NULL, &aa, mainbus_print,
1161.2Sjmcneill	    mainbus_submatch);
1171.2Sjmcneill
1181.2Sjmcneill	octpow_bootstrap(&octeon_configuration);
1191.2Sjmcneill	octfpa_bootstrap(&octeon_configuration);
1201.2Sjmcneill
1211.2Sjmcneill	simplebus_bus_io_init(&simplebus_bus_tag, NULL);
1221.2Sjmcneill
1231.2Sjmcneill	faa.faa_bst = &simplebus_bus_tag;
1241.2Sjmcneill	faa.faa_a4x_bst = NULL;		/* XXX */
1251.2Sjmcneill	faa.faa_dmat = &simplebus_dma_tag;
1261.2Sjmcneill	faa.faa_name = "";
1271.2Sjmcneill	faa.faa_phandle = OF_peer(0);
1281.2Sjmcneill	config_found(self, &faa, NULL);
1291.2Sjmcneill}
1301.2Sjmcneill
1311.1Shikarustatic int
1321.1Shikarumainbus_submatch(device_t parent, cfdata_t cf, const int *locs, void *aux)
1331.1Shikaru{
1341.1Shikaru	struct mainbus_attach_args *aa = aux;
1351.1Shikaru
1361.1Shikaru	if (strcmp(cf->cf_name, aa->aa_name) != 0)
1371.1Shikaru		return 0;
1381.1Shikaru
1391.1Shikaru	return config_match(parent, cf, aux);
1401.1Shikaru}
1411.1Shikaru
1421.1Shikarustatic int
1431.1Shikarumainbus_print(void *aux, const char *pnp)
1441.1Shikaru{
1451.1Shikaru	struct mainbus_attach_args *aa = aux;
1461.1Shikaru
1471.1Shikaru	if (pnp != 0)
1481.1Shikaru		return QUIET;
1491.1Shikaru
1501.1Shikaru	if (pnp)
1511.1Shikaru		aprint_normal("%s at %s", aa->aa_name, pnp);
1521.1Shikaru
1531.1Shikaru	return UNCONF;
1541.1Shikaru}
1551.2Sjmcneill
1561.2Sjmcneill/* ---- bus_space(9) */
1571.2Sjmcneill#define	CHIP			simplebus
1581.2Sjmcneill#define	CHIP_IO
1591.2Sjmcneill#define	CHIP_ACCESS_SIZE	8
1601.2Sjmcneill
1611.2Sjmcneill#define	CHIP_W1_BUS_START(v)	0x0000000000000000ULL
1621.2Sjmcneill#define	CHIP_W1_BUS_END(v)	0x7fffffffffffffffULL
1631.2Sjmcneill#define	CHIP_W1_SYS_START(v)	0x8000000000000000ULL
1641.2Sjmcneill#define	CHIP_W1_SYS_END(v)	0xffffffffffffffffULL
1651.2Sjmcneill
1661.2Sjmcneill#include <mips/mips/bus_space_alignstride_chipdep.c>
167