Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/dev/wscons Revert previous and introduce vcons_earlyinit...
details: https://anonhg.NetBSD.org/src/rev/72616cfdff3a
branches: trunk
changeset: 1017984:72616cfdff3a
user: jmcneill <jmcneill%NetBSD.org@localhost>
date: Sun Jan 17 19:03:32 2021 +0000
description:
Revert previous and introduce vcons_earlyinit, which is like vcons_init
except it does not setup a vcons_intr thread.
diffstat:
sys/dev/wscons/wsdisplay_vcons.c | 65 +++++++++++++++++++++---------------
sys/dev/wscons/wsdisplay_vconsvar.h | 6 ++-
2 files changed, 42 insertions(+), 29 deletions(-)
diffs (135 lines):
diff -r 0ede679855c1 -r 72616cfdff3a sys/dev/wscons/wsdisplay_vcons.c
--- a/sys/dev/wscons/wsdisplay_vcons.c Sun Jan 17 17:16:47 2021 +0000
+++ b/sys/dev/wscons/wsdisplay_vcons.c Sun Jan 17 19:03:32 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: wsdisplay_vcons.c,v 1.46 2021/01/17 16:51:12 jmcneill Exp $ */
+/* $NetBSD: wsdisplay_vcons.c,v 1.47 2021/01/17 19:03:32 jmcneill Exp $ */
/*-
* Copyright (c) 2005, 2006 Michael Lorenz
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: wsdisplay_vcons.c,v 1.46 2021/01/17 16:51:12 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: wsdisplay_vcons.c,v 1.47 2021/01/17 19:03:32 jmcneill Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -121,17 +121,18 @@
#ifdef VCONS_DRAW_INTR
static void vcons_intr(void *);
static void vcons_softintr(void *);
-static int vcons_intr_enable(device_t);
+static void vcons_init_thread(void *);
#endif
-int
-vcons_init(struct vcons_data *vd, void *cookie, struct wsscreen_descr *def,
- struct wsdisplay_accessops *ao)
+static int
+vcons_init_common(struct vcons_data *vd, void *cookie,
+ struct wsscreen_descr *def, struct wsdisplay_accessops *ao,
+ int enable_intr)
{
/* zero out everything so we can rely on untouched fields being 0 */
memset(vd, 0, sizeof(struct vcons_data));
-
+
vd->cookie = cookie;
vd->init_screen = vcons_dummy_init_screen;
@@ -174,26 +175,37 @@
vd->switch_poll_count = 0;
#endif
#ifdef VCONS_DRAW_INTR
- vd->intr_softint = softint_establish(SOFTINT_SERIAL,
- vcons_softintr, vd);
- callout_init(&vd->intr, CALLOUT_MPSAFE);
- callout_setfunc(&vd->intr, vcons_intr, vd);
- vd->intr_valid = 1;
+ if (enable_intr) {
+ vd->intr_softint = softint_establish(SOFTINT_SERIAL,
+ vcons_softintr, vd);
+ callout_init(&vd->intr, CALLOUT_MPSAFE);
+ callout_setfunc(&vd->intr, vcons_intr, vd);
+ vd->intr_valid = 1;
- /*
- * Defer intr drawing until after autoconfiguration has completed
- * to serialize device attachment messages w/ the initial screen
- * redraw as a workaround for the lack of MP-safeness in this
- * subsystem. To register with autoconf, we need to create a fake
- * device_t and pass that in as a handle to config_interrupts.
- */
- snprintf(vd->fake_dev.dv_xname, sizeof(vd->fake_dev.dv_xname), "vcons");
- vd->fake_dev.dv_private = vd;
- config_finalize_register(&vd->fake_dev, vcons_intr_enable);
+ if (kthread_create(PRI_NONE, 0, NULL, vcons_init_thread, vd,
+ NULL, "vcons_init") != 0) {
+ printf("%s: unable to create thread.\n", __func__);
+ return -1;
+ }
+ }
#endif
return 0;
}
+int
+vcons_init(struct vcons_data *vd, void *cookie,
+ struct wsscreen_descr *def, struct wsdisplay_accessops *ao)
+{
+ return vcons_init_common(vd, cookie, def, ao, 1);
+}
+
+int
+vcons_earlyinit(struct vcons_data *vd, void *cookie,
+ struct wsscreen_descr *def, struct wsdisplay_accessops *ao)
+{
+ return vcons_init_common(vd, cookie, def, ao, 0);
+}
+
static void
vcons_lock(struct vcons_screen *scr)
{
@@ -1498,15 +1510,14 @@
callout_schedule(&vd->intr, mstohz(33));
}
-static int
-vcons_intr_enable(device_t fake_dev)
+static void
+vcons_init_thread(void *cookie)
{
- struct vcons_data *vd = device_private(fake_dev);
+ struct vcons_data *vd = (struct vcons_data *)cookie;
vd->use_intr = 2;
callout_schedule(&vd->intr, mstohz(33));
-
- return 0;
+ kthread_exit(0);
}
#endif /* VCONS_DRAW_INTR */
diff -r 0ede679855c1 -r 72616cfdff3a sys/dev/wscons/wsdisplay_vconsvar.h
--- a/sys/dev/wscons/wsdisplay_vconsvar.h Sun Jan 17 17:16:47 2021 +0000
+++ b/sys/dev/wscons/wsdisplay_vconsvar.h Sun Jan 17 19:03:32 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: wsdisplay_vconsvar.h,v 1.29 2021/01/17 15:13:15 jmcneill Exp $ */
+/* $NetBSD: wsdisplay_vconsvar.h,v 1.30 2021/01/17 19:03:32 jmcneill Exp $ */
/*-
* Copyright (c) 2005, 2006 Michael Lorenz
@@ -143,7 +143,9 @@
#endif
};
-int vcons_init(struct vcons_data *, void *cookie, struct wsscreen_descr *,
+int vcons_init(struct vcons_data *, void *, struct wsscreen_descr *,
+ struct wsdisplay_accessops *);
+int vcons_earlyinit(struct vcons_data *, void *, struct wsscreen_descr *,
struct wsdisplay_accessops *);
int vcons_init_screen(struct vcons_data *, struct vcons_screen *, int,
Home |
Main Index |
Thread Index |
Old Index