mainbus.c revision 1.7
11.7Sthorpej/*	$NetBSD: mainbus.c,v 1.7 2021/04/24 23:36:42 thorpej 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.7Sthorpej__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.7 2021/04/24 23:36:42 thorpej 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.7Sthorpej		config_found(self, &aa, mainbus_print,
1011.7Sthorpej		    CFARG_SUBMATCH, mainbus_submatch,
1021.7Sthorpej			CFARG_IATTR, "mainbus",
1031.7Sthorpej			CFARG_EOL);
1041.1Shikaru	}
1051.1Shikaru}
1061.1Shikaru
1071.2Sjmcneillextern struct octeon_config octeon_configuration;
1081.2Sjmcneillextern void octpow_bootstrap(struct octeon_config *);
1091.2Sjmcneillextern void octfpa_bootstrap(struct octeon_config *);
1101.2Sjmcneill
1111.2Sjmcneillstatic void
1121.2Sjmcneillmainbus_attach_devicetree(device_t self)
1131.2Sjmcneill{
1141.3Sjmcneill	const struct fdt_console *cons = fdtbus_get_console();
1151.2Sjmcneill	struct mainbus_attach_args aa;
1161.2Sjmcneill	struct fdt_attach_args faa;
1171.3Sjmcneill	u_int uart_freq;
1181.2Sjmcneill
1191.2Sjmcneill	aa.aa_name = "cpunode";
1201.7Sthorpej	config_found(self, &aa, mainbus_print,
1211.7Sthorpej	    CFARG_SUBMATCH, mainbus_submatch,
1221.7Sthorpej	    CFARG_IATTR, "mainbus",
1231.7Sthorpej	    CFARG_EOL);
1241.2Sjmcneill
1251.4Sjmcneill	aa.aa_name = "iobus";
1261.7Sthorpej	config_found(self, &aa, mainbus_print,
1271.7Sthorpej	    CFARG_SUBMATCH, mainbus_submatch,
1281.7Sthorpej	    CFARG_IATTR, "mainbus",
1291.7Sthorpej	    CFARG_EOL);
1301.4Sjmcneill
1311.2Sjmcneill	simplebus_bus_io_init(&simplebus_bus_tag, NULL);
1321.2Sjmcneill
1331.2Sjmcneill	faa.faa_bst = &simplebus_bus_tag;
1341.2Sjmcneill	faa.faa_dmat = &simplebus_dma_tag;
1351.2Sjmcneill	faa.faa_name = "";
1361.3Sjmcneill
1371.3Sjmcneill	if (cons != NULL) {
1381.3Sjmcneill		faa.faa_phandle = fdtbus_get_stdout_phandle();
1391.3Sjmcneill
1401.3Sjmcneill		if (of_getprop_uint32(faa.faa_phandle, "clock-frequency",
1411.3Sjmcneill		    &uart_freq) != 0) {
1421.3Sjmcneill			uart_freq = octeon_ioclock_speed();
1431.3Sjmcneill		}
1441.3Sjmcneill
1451.3Sjmcneill		if (uart_freq > 0)
1461.3Sjmcneill			delay(640000000 / uart_freq);
1471.3Sjmcneill
1481.3Sjmcneill		cons->consinit(&faa, uart_freq);
1491.3Sjmcneill	}
1501.3Sjmcneill
1511.2Sjmcneill	faa.faa_phandle = OF_peer(0);
1521.7Sthorpej	config_found(self, &faa, NULL, CFARG_EOL);
1531.2Sjmcneill}
1541.2Sjmcneill
1551.1Shikarustatic int
1561.1Shikarumainbus_submatch(device_t parent, cfdata_t cf, const int *locs, void *aux)
1571.1Shikaru{
1581.1Shikaru	struct mainbus_attach_args *aa = aux;
1591.1Shikaru
1601.1Shikaru	if (strcmp(cf->cf_name, aa->aa_name) != 0)
1611.1Shikaru		return 0;
1621.1Shikaru
1631.1Shikaru	return config_match(parent, cf, aux);
1641.1Shikaru}
1651.1Shikaru
1661.1Shikarustatic int
1671.1Shikarumainbus_print(void *aux, const char *pnp)
1681.1Shikaru{
1691.1Shikaru	struct mainbus_attach_args *aa = aux;
1701.1Shikaru
1711.1Shikaru	if (pnp != 0)
1721.1Shikaru		return QUIET;
1731.1Shikaru
1741.1Shikaru	if (pnp)
1751.1Shikaru		aprint_normal("%s at %s", aa->aa_name, pnp);
1761.1Shikaru
1771.1Shikaru	return UNCONF;
1781.1Shikaru}
1791.2Sjmcneill
1801.2Sjmcneill/* ---- bus_space(9) */
1811.2Sjmcneill#define	CHIP			simplebus
1821.2Sjmcneill#define	CHIP_IO
1831.2Sjmcneill#define	CHIP_ACCESS_SIZE	8
1841.2Sjmcneill
1851.2Sjmcneill#define	CHIP_W1_BUS_START(v)	0x0000000000000000ULL
1861.2Sjmcneill#define	CHIP_W1_BUS_END(v)	0x7fffffffffffffffULL
1871.2Sjmcneill#define	CHIP_W1_SYS_START(v)	0x8000000000000000ULL
1881.2Sjmcneill#define	CHIP_W1_SYS_END(v)	0xffffffffffffffffULL
1891.2Sjmcneill
1901.2Sjmcneill#include <mips/mips/bus_space_alignstride_chipdep.c>
191