Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/evbmips/mipssim Add VirtIO devices to the MIPSSIM t...
details: https://anonhg.NetBSD.org/src/rev/27bfe7341376
branches: trunk
changeset: 959494:27bfe7341376
user: reinoud <reinoud%NetBSD.org@localhost>
date: Mon Feb 15 22:39:46 2021 +0000
description:
Add VirtIO devices to the MIPSSIM target for use in Qemu. Its supported by a
local patch starting at Qemu-5.1.0nb12
diffstat:
sys/arch/evbmips/mipssim/autoconf.h | 3 +-
sys/arch/evbmips/mipssim/machdep.c | 13 +-
sys/arch/evbmips/mipssim/mainbus.c | 16 ++-
sys/arch/evbmips/mipssim/mipssim_bus_io.c | 8 +-
sys/arch/evbmips/mipssim/mipssim_dma.c | 63 ++++++++++
sys/arch/evbmips/mipssim/mipssim_intr.c | 45 ++++--
sys/arch/evbmips/mipssim/mipssimreg.h | 18 ++-
sys/arch/evbmips/mipssim/mipssimvar.h | 8 +-
sys/arch/evbmips/mipssim/virtio_mainbus.c | 172 ++++++++++++++++++++++++++++++
9 files changed, 312 insertions(+), 34 deletions(-)
diffs (truncated from 573 to 300 lines):
diff -r a8a7f00ca55e -r 27bfe7341376 sys/arch/evbmips/mipssim/autoconf.h
--- a/sys/arch/evbmips/mipssim/autoconf.h Mon Feb 15 19:49:17 2021 +0000
+++ b/sys/arch/evbmips/mipssim/autoconf.h Mon Feb 15 22:39:46 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: autoconf.h,v 1.1 2021/01/27 05:24:16 simonb Exp $ */
+/* $NetBSD: autoconf.h,v 1.2 2021/02/15 22:39:46 reinoud Exp $ */
/*
* Copyright 2002 Wasabi Systems, Inc.
@@ -42,4 +42,5 @@
unsigned long ma_addr;
int ma_irq;
bus_space_tag_t ma_iot;
+ bus_dma_tag_t ma_dmat;
};
diff -r a8a7f00ca55e -r 27bfe7341376 sys/arch/evbmips/mipssim/machdep.c
--- a/sys/arch/evbmips/mipssim/machdep.c Mon Feb 15 19:49:17 2021 +0000
+++ b/sys/arch/evbmips/mipssim/machdep.c Mon Feb 15 22:39:46 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.1 2021/01/27 05:24:16 simonb Exp $ */
+/* $NetBSD: machdep.c,v 1.2 2021/02/15 22:39:46 reinoud Exp $ */
/*-
* Copyright (c) 2001,2021 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.1 2021/01/27 05:24:16 simonb Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.2 2021/02/15 22:39:46 reinoud Exp $");
#include "opt_ddb.h"
#include "opt_kgdb.h"
@@ -113,8 +113,11 @@
{
uint32_t cntfreq;
- /* Pick a random clock frequency. XXX Any better way? */
- cntfreq = curcpu()->ci_cpu_freq = 10 * 1000 * 1000;
+ /*
+ * Qemu seems to default to 200 MHz; wall clock looks the right speed
+ * but we don't have an RTC to check.
+ */
+ cntfreq = curcpu()->ci_cpu_freq = 200 * 1000 * 1000;
if (mips_options.mips_cpu_flags & CPU_MIPS_DOUBLE_COUNT)
cntfreq /= 2;
@@ -157,6 +160,8 @@
* Initialize bus space tags and bring up the main console.
*/
mipssim_bus_io_init(&mcp->mc_iot, mcp);
+ mipssim_dma_init(mcp);
+
if (comcnattach(&mcp->mc_iot, MIPSSIM_UART0_ADDR, COMCNRATE,
COM_FREQ, COM_TYPE_NORMAL,
(TTYDEF_CFLAG & ~(CSIZE | PARENB)) | CS8) != 0)
diff -r a8a7f00ca55e -r 27bfe7341376 sys/arch/evbmips/mipssim/mainbus.c
--- a/sys/arch/evbmips/mipssim/mainbus.c Mon Feb 15 19:49:17 2021 +0000
+++ b/sys/arch/evbmips/mipssim/mainbus.c Mon Feb 15 22:39:46 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: mainbus.c,v 1.1 2021/01/27 05:24:16 simonb Exp $ */
+/* $NetBSD: mainbus.c,v 1.2 2021/02/15 22:39:46 reinoud Exp $ */
/*-
* Copyright (c) 2021 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.1 2021/01/27 05:24:16 simonb Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.2 2021/02/15 22:39:46 reinoud Exp $");
#include <sys/param.h>
#include <sys/device.h>
@@ -84,11 +84,23 @@
mainbus_found = 1;
printf("\n");
+ /* attach children */
for (md = mainbusdevs; md->md_name != NULL; md++) {
maa.ma_name = md->md_name;
maa.ma_addr = md->md_addr;
maa.ma_irq = md->md_irq;
maa.ma_iot = &mcp->mc_iot;
+ maa.ma_dmat = &mcp->mc_dmat;
+ config_found_ia(self, "mainbus", &maa, mainbus_print);
+ }
+
+ /* attach virtio children */
+ for (int i = 0; i < VIRTIO_NUM_TRANSPORTS; i++) {
+ maa.ma_name = "virtio";
+ maa.ma_addr = MIPSSIM_VIRTIO_ADDR + VIRTIO_STRIDE * i;
+ maa.ma_irq = 1;
+ maa.ma_iot = &mcp->mc_iot;
+ maa.ma_dmat = &mcp->mc_dmat;
config_found_ia(self, "mainbus", &maa, mainbus_print);
}
}
diff -r a8a7f00ca55e -r 27bfe7341376 sys/arch/evbmips/mipssim/mipssim_bus_io.c
--- a/sys/arch/evbmips/mipssim/mipssim_bus_io.c Mon Feb 15 19:49:17 2021 +0000
+++ b/sys/arch/evbmips/mipssim/mipssim_bus_io.c Mon Feb 15 22:39:46 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: mipssim_bus_io.c,v 1.1 2021/01/27 05:24:16 simonb Exp $ */
+/* $NetBSD: mipssim_bus_io.c,v 1.2 2021/02/15 22:39:46 reinoud Exp $ */
/*-
* Copyright (c) 2001 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mipssim_bus_io.c,v 1.1 2021/01/27 05:24:16 simonb Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mipssim_bus_io.c,v 1.2 2021/02/15 22:39:46 reinoud Exp $");
#include <sys/param.h>
@@ -49,8 +49,8 @@
/* IO region 1 */
#define CHIP_W1_BUS_START(v) 0
-#define CHIP_W1_BUS_END(v) MIPSSIM_ISA_IO_SIZE
+#define CHIP_W1_BUS_END(v) (MIPSSIM_ISA_IO_SIZE + MIPSSIM_VIRTIO_IO_SIZE)
#define CHIP_W1_SYS_START(v) MIPSSIM_ISA_IO_BASE
-#define CHIP_W1_SYS_END(v) (CHIP_W1_SYS_START(v) + CHIP_W1_SYS_START(v))
+#define CHIP_W1_SYS_END(v) (CHIP_W1_SYS_START(v) + CHIP_W1_BUS_END(v))
#include <mips/mips/bus_space_alignstride_chipdep.c>
diff -r a8a7f00ca55e -r 27bfe7341376 sys/arch/evbmips/mipssim/mipssim_dma.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/arch/evbmips/mipssim/mipssim_dma.c Mon Feb 15 22:39:46 2021 +0000
@@ -0,0 +1,63 @@
+/* $NetBSD: mipssim_dma.c,v 1.1 2021/02/15 22:39:46 reinoud Exp $ */
+
+/*-
+ * Copyright (c) 2021 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Jason R. Thorpe.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * Platform-specific DMA support for the mipssim.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: mipssim_dma.c,v 1.1 2021/02/15 22:39:46 reinoud Exp $");
+
+#include <sys/param.h>
+#include <sys/device.h>
+
+#define _MIPS_BUS_DMA_PRIVATE
+#include <sys/bus.h>
+
+#include <dev/isa/isavar.h>
+
+#include <evbmips/mipssim/mipssimreg.h>
+#include <evbmips/mipssim/mipssimvar.h>
+
+void
+mipssim_dma_init(struct mipssim_config *mcp)
+{
+ bus_dma_tag_t t;
+
+ t = &mcp->mc_dmat;
+ t->_cookie = mcp;
+ t->_wbase = MIPSSIM_DMA_BASE;
+ t->_bounce_alloc_lo = MIPSSIM_DMA_PHYSBASE;
+ t->_bounce_alloc_hi = MIPSSIM_DMA_PHYSBASE + MIPSSIM_DMA_SIZE;
+ t->_dmamap_ops = mips_bus_dmamap_ops;
+ t->_dmamem_ops = mips_bus_dmamem_ops;
+ t->_dmatag_ops = mips_bus_dmatag_ops;
+}
diff -r a8a7f00ca55e -r 27bfe7341376 sys/arch/evbmips/mipssim/mipssim_intr.c
--- a/sys/arch/evbmips/mipssim/mipssim_intr.c Mon Feb 15 19:49:17 2021 +0000
+++ b/sys/arch/evbmips/mipssim/mipssim_intr.c Mon Feb 15 22:39:46 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: mipssim_intr.c,v 1.1 2021/01/27 05:24:16 simonb Exp $ */
+/* $NetBSD: mipssim_intr.c,v 1.2 2021/02/15 22:39:46 reinoud Exp $ */
/*-
* Copyright (c) 2014 Michael Lorenz
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mipssim_intr.c,v 1.1 2021/01/27 05:24:16 simonb Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mipssim_intr.c,v 1.2 2021/02/15 22:39:46 reinoud Exp $");
#define __INTR_PRIVATE
@@ -35,6 +35,7 @@
#include <sys/cpu.h>
#include <sys/kernel.h>
#include <sys/systm.h>
+#include <sys/kmem.h>
#include <mips/locore.h>
#include <machine/intr.h>
@@ -49,10 +50,11 @@
[IPL_SOFTCLOCK] = MIPS_SOFT_INT_MASK_0,
[IPL_SOFTNET] = MIPS_SOFT_INT_MASK,
[IPL_VM] = MIPS_SOFT_INT_MASK
- | MIPS_INT_MASK_0 | MIPS_INT_MASK_2,
+ | MIPS_INT_MASK_0 | MIPS_INT_MASK_1
+ | MIPS_INT_MASK_2,
[IPL_SCHED] = MIPS_SOFT_INT_MASK
- | MIPS_INT_MASK_0 | MIPS_INT_MASK_2
- | MIPS_INT_MASK_5,
+ | MIPS_INT_MASK_0 | MIPS_INT_MASK_1
+ | MIPS_INT_MASK_2 | MIPS_INT_MASK_5,
[IPL_DDB] = MIPS_INT_MASK,
[IPL_HIGH] = MIPS_INT_MASK,
},
@@ -61,7 +63,6 @@
/* XXX - add evcnt bits to <machine/intr.h> struct evbmips_intrhand */
struct intrhand {
LIST_ENTRY(intrhand) ih_q;
- struct evcnt ih_count;
int (*ih_func)(void *);
void *ih_arg;
int ih_irq;
@@ -74,10 +75,12 @@
*/
#define NINTR 5 /* MIPS INT0 - INT4 */
-struct intrhand intrs[NINTR];
+LIST_HEAD(intrlist, intrhand) intrs[NINTR];
+struct evcnt ih_count[NINTR];
+
const char * const intrnames[NINTR] = {
"int 0 (mipsnet)",
- "int 1 (unused)",
+ "int 1 (virtio)",
"int 2 (uart)",
"int 3 (unused)",
"int 4 (unused)",
@@ -94,10 +97,8 @@
/* zero all handlers */
for (i = 0; i < NINTR; i++) {
- intrs[i].ih_func = NULL;
- intrs[i].ih_arg = NULL;
- intrs[i].ih_irq = i;
- evcnt_attach_dynamic(&intrs[i].ih_count, EVCNT_TYPE_INTR,
+ LIST_INIT(&intrs[i]);
+ evcnt_attach_dynamic(&ih_count[i], EVCNT_TYPE_INTR,
NULL, "cpu", intrnames[i]);
}
}
@@ -105,6 +106,7 @@
void
evbmips_iointr(int ipl, uint32_t ipending, struct clockframe *cf)
{
+ struct intrlist *list;
for (int level = NINTR - 1; level >= 0; level--) {
struct intrhand *ih;
@@ -112,11 +114,13 @@
if ((ipending & (MIPS_INT_MASK_0 << level)) == 0)
continue;
- ih = &intrs[level];
+ ih_count[level].ev_count++;
+ list = &intrs[level];
- ih->ih_count.ev_count++;
- if (ih->ih_func) {
- (*ih->ih_func)(ih->ih_arg);
+ LIST_FOREACH(ih, list, ih_q) {
+ if (ih->ih_func) {
+ (*ih->ih_func)(ih->ih_arg);
+ }
}
}
}
@@ -124,6 +128,7 @@
void *
evbmips_intr_establish(int irq, int (*func)(void *), void *arg)
Home |
Main Index |
Thread Index |
Old Index