mainbus.c revision 1.4
11.4Sjmcneill/*	$NetBSD: mainbus.c,v 1.4 2020/08/17 21:25:12 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.4Sjmcneill__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.4 2020/08/17 21:25:12 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.3Sjmcneill#include <mips/cavium/octeonvar.h>
411.1Shikaru
421.2Sjmcneill#include <dev/fdt/fdtvar.h>
431.2Sjmcneill
441.1Shikarustatic int	mainbus_match(device_t, struct cfdata *, void *);
451.1Shikarustatic void	mainbus_attach(device_t, device_t, void *);
461.2Sjmcneillstatic void	mainbus_attach_static(device_t);
471.2Sjmcneillstatic void	mainbus_attach_devicetree(device_t);
481.1Shikarustatic int	mainbus_submatch(device_t, cfdata_t, const int *, void *);
491.1Shikarustatic int	mainbus_print(void *, const char *);
501.1Shikaru
511.2Sjmcneillstatic void	simplebus_bus_io_init(bus_space_tag_t, void *);
521.2Sjmcneill
531.1ShikaruCFATTACH_DECL_NEW(mainbus, sizeof(device_t), mainbus_match, mainbus_attach,
541.1Shikaru    NULL, NULL);
551.1Shikaru
561.2Sjmcneillstatic struct mips_bus_space simplebus_bus_tag;
571.2Sjmcneill
581.2Sjmcneillstatic struct mips_bus_dma_tag simplebus_dma_tag = {
591.2Sjmcneill	._cookie = NULL,
601.2Sjmcneill	._wbase = 0,
611.2Sjmcneill	._bounce_alloc_lo = 0,
621.2Sjmcneill	._bounce_alloc_hi = 0,
631.2Sjmcneill	._dmamap_ops = _BUS_DMAMAP_OPS_INITIALIZER,
641.2Sjmcneill	._dmamem_ops = _BUS_DMAMEM_OPS_INITIALIZER,
651.2Sjmcneill	._dmatag_ops = _BUS_DMATAG_OPS_INITIALIZER,
661.2Sjmcneill};
671.2Sjmcneill
681.1Shikarustatic int
691.1Shikarumainbus_match(device_t parent, struct cfdata *match, void *aux)
701.1Shikaru{
711.1Shikaru	static int once = 0;
721.1Shikaru
731.1Shikaru	if (once != 0)
741.1Shikaru		return 0;
751.1Shikaru	once = 1;
761.1Shikaru
771.1Shikaru	return 1;
781.1Shikaru}
791.1Shikaru
801.1Shikarustatic void
811.1Shikarumainbus_attach(device_t parent, device_t self, void *aux)
821.1Shikaru{
831.2Sjmcneill	aprint_normal("\n");
841.2Sjmcneill
851.2Sjmcneill	if (fdtbus_get_data() != NULL) {
861.2Sjmcneill		mainbus_attach_devicetree(self);
871.2Sjmcneill	} else {
881.2Sjmcneill		mainbus_attach_static(self);
891.2Sjmcneill	}
901.2Sjmcneill}
911.2Sjmcneill
921.2Sjmcneillstatic void
931.2Sjmcneillmainbus_attach_static(device_t self)
941.2Sjmcneill{
951.2Sjmcneill	struct mainbus_attach_args aa;
961.1Shikaru	int i;
971.1Shikaru
981.1Shikaru	for (i = 0; i < (int)mainbus_ndevs; i++) {
991.1Shikaru		aa.aa_name = mainbus_devs[i];
1001.2Sjmcneill		config_found_sm_loc(self, "mainbus", NULL, &aa,
1011.1Shikaru		    mainbus_print, mainbus_submatch);
1021.1Shikaru	}
1031.1Shikaru}
1041.1Shikaru
1051.2Sjmcneillextern struct octeon_config octeon_configuration;
1061.2Sjmcneillextern void octpow_bootstrap(struct octeon_config *);
1071.2Sjmcneillextern void octfpa_bootstrap(struct octeon_config *);
1081.2Sjmcneill
1091.2Sjmcneillstatic void
1101.2Sjmcneillmainbus_attach_devicetree(device_t self)
1111.2Sjmcneill{
1121.3Sjmcneill	const struct fdt_console *cons = fdtbus_get_console();
1131.2Sjmcneill	struct mainbus_attach_args aa;
1141.2Sjmcneill	struct fdt_attach_args faa;
1151.3Sjmcneill	u_int uart_freq;
1161.2Sjmcneill
1171.2Sjmcneill	aa.aa_name = "cpunode";
1181.2Sjmcneill	config_found_sm_loc(self, "mainbus", NULL, &aa, mainbus_print,
1191.2Sjmcneill	    mainbus_submatch);
1201.2Sjmcneill
1211.4Sjmcneill	aa.aa_name = "iobus";
1221.4Sjmcneill	config_found_sm_loc(self, "mainbus", NULL, &aa, mainbus_print,
1231.4Sjmcneill	    mainbus_submatch);
1241.4Sjmcneill
1251.2Sjmcneill	octpow_bootstrap(&octeon_configuration);
1261.2Sjmcneill	octfpa_bootstrap(&octeon_configuration);
1271.2Sjmcneill
1281.2Sjmcneill	simplebus_bus_io_init(&simplebus_bus_tag, NULL);
1291.2Sjmcneill
1301.2Sjmcneill	faa.faa_bst = &simplebus_bus_tag;
1311.2Sjmcneill	faa.faa_a4x_bst = NULL;		/* XXX */
1321.2Sjmcneill	faa.faa_dmat = &simplebus_dma_tag;
1331.2Sjmcneill	faa.faa_name = "";
1341.3Sjmcneill
1351.3Sjmcneill	if (cons != NULL) {
1361.3Sjmcneill		faa.faa_phandle = fdtbus_get_stdout_phandle();
1371.3Sjmcneill
1381.3Sjmcneill		if (of_getprop_uint32(faa.faa_phandle, "clock-frequency",
1391.3Sjmcneill		    &uart_freq) != 0) {
1401.3Sjmcneill			uart_freq = octeon_ioclock_speed();
1411.3Sjmcneill		}
1421.3Sjmcneill
1431.3Sjmcneill		if (uart_freq > 0)
1441.3Sjmcneill			delay(640000000 / uart_freq);
1451.3Sjmcneill
1461.3Sjmcneill		cons->consinit(&faa, uart_freq);
1471.3Sjmcneill	}
1481.3Sjmcneill
1491.2Sjmcneill	faa.faa_phandle = OF_peer(0);
1501.2Sjmcneill	config_found(self, &faa, NULL);
1511.2Sjmcneill}
1521.2Sjmcneill
1531.1Shikarustatic int
1541.1Shikarumainbus_submatch(device_t parent, cfdata_t cf, const int *locs, void *aux)
1551.1Shikaru{
1561.1Shikaru	struct mainbus_attach_args *aa = aux;
1571.1Shikaru
1581.1Shikaru	if (strcmp(cf->cf_name, aa->aa_name) != 0)
1591.1Shikaru		return 0;
1601.1Shikaru
1611.1Shikaru	return config_match(parent, cf, aux);
1621.1Shikaru}
1631.1Shikaru
1641.1Shikarustatic int
1651.1Shikarumainbus_print(void *aux, const char *pnp)
1661.1Shikaru{
1671.1Shikaru	struct mainbus_attach_args *aa = aux;
1681.1Shikaru
1691.1Shikaru	if (pnp != 0)
1701.1Shikaru		return QUIET;
1711.1Shikaru
1721.1Shikaru	if (pnp)
1731.1Shikaru		aprint_normal("%s at %s", aa->aa_name, pnp);
1741.1Shikaru
1751.1Shikaru	return UNCONF;
1761.1Shikaru}
1771.2Sjmcneill
1781.2Sjmcneill/* ---- bus_space(9) */
1791.2Sjmcneill#define	CHIP			simplebus
1801.2Sjmcneill#define	CHIP_IO
1811.2Sjmcneill#define	CHIP_ACCESS_SIZE	8
1821.2Sjmcneill
1831.2Sjmcneill#define	CHIP_W1_BUS_START(v)	0x0000000000000000ULL
1841.2Sjmcneill#define	CHIP_W1_BUS_END(v)	0x7fffffffffffffffULL
1851.2Sjmcneill#define	CHIP_W1_SYS_START(v)	0x8000000000000000ULL
1861.2Sjmcneill#define	CHIP_W1_SYS_END(v)	0xffffffffffffffffULL
1871.2Sjmcneill
1881.2Sjmcneill#include <mips/mips/bus_space_alignstride_chipdep.c>
189