From owner-svn-src-user@FreeBSD.ORG Thu Nov 7 21:08:54 2013 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 612EFE6A; Thu, 7 Nov 2013 21:08:54 +0000 (UTC) (envelope-from ray@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 3F22F2E40; Thu, 7 Nov 2013 21:08:54 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id rA7L8sMs057253; Thu, 7 Nov 2013 21:08:54 GMT (envelope-from ray@svn.freebsd.org) Received: (from ray@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id rA7L8rI9057248; Thu, 7 Nov 2013 21:08:53 GMT (envelope-from ray@svn.freebsd.org) Message-Id: <201311072108.rA7L8rI9057248@svn.freebsd.org> From: Aleksandr Rybalko Date: Thu, 7 Nov 2013 21:08:53 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r257815 - in user/ed/newcons/sys/dev: fb vt vt/hw/fb X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 07 Nov 2013 21:08:54 -0000 Author: ray Date: Thu Nov 7 21:08:52 2013 New Revision: 257815 URL: http://svnweb.freebsd.org/changeset/base/257815 Log: Handle suspend/resume. Switch to console window before suspend, switch back on resume. That fix issue with broken Xorg image after resume. Fix some style whilst here. Sponsored by: The FreeBSD Foundation Modified: user/ed/newcons/sys/dev/fb/fbd.c user/ed/newcons/sys/dev/vt/hw/fb/vt_fb.c user/ed/newcons/sys/dev/vt/hw/fb/vt_fb.h user/ed/newcons/sys/dev/vt/vt.h user/ed/newcons/sys/dev/vt/vt_core.c Modified: user/ed/newcons/sys/dev/fb/fbd.c ============================================================================== --- user/ed/newcons/sys/dev/fb/fbd.c Thu Nov 7 21:08:12 2013 (r257814) +++ user/ed/newcons/sys/dev/fb/fbd.c Thu Nov 7 21:08:52 2013 (r257815) @@ -393,6 +393,21 @@ fbd_detach(device_t dev) return (err); } +static int +fbd_suspend(device_t dev) +{ + + vt_fb_suspend(); + return (bus_generic_suspend(dev)); +} + +static int +fbd_resume(device_t dev) +{ + + vt_fb_resume(); + return (bus_generic_resume(dev)); +} static device_method_t fbd_methods[] = { /* Device interface */ @@ -401,8 +416,8 @@ static device_method_t fbd_methods[] = { DEVMETHOD(device_detach, fbd_detach), DEVMETHOD(device_shutdown, bus_generic_shutdown), - DEVMETHOD(device_suspend, bus_generic_suspend), - DEVMETHOD(device_resume, bus_generic_resume), + DEVMETHOD(device_suspend, fbd_suspend), + DEVMETHOD(device_resume, fbd_resume), { 0, 0 } }; Modified: user/ed/newcons/sys/dev/vt/hw/fb/vt_fb.c ============================================================================== --- user/ed/newcons/sys/dev/vt/hw/fb/vt_fb.c Thu Nov 7 21:08:12 2013 (r257814) +++ user/ed/newcons/sys/dev/vt/hw/fb/vt_fb.c Thu Nov 7 21:08:52 2013 (r257815) @@ -211,3 +211,17 @@ vt_fb_attach(struct fb_info *info) return (0); } + +void +vt_fb_resume(void) +{ + + vt_resume(); +} + +void +vt_fb_suspend(void) +{ + + vt_suspend(); +} Modified: user/ed/newcons/sys/dev/vt/hw/fb/vt_fb.h ============================================================================== --- user/ed/newcons/sys/dev/vt/hw/fb/vt_fb.h Thu Nov 7 21:08:12 2013 (r257814) +++ user/ed/newcons/sys/dev/vt/hw/fb/vt_fb.h Thu Nov 7 21:08:52 2013 (r257815) @@ -33,6 +33,8 @@ #define _DEV_VT_HW_FB_VT_FB_H_ /* Generic framebuffer interface call vt_fb_attach to init VT(9) */ int vt_fb_attach(struct fb_info *info); +void vt_fb_resume(void); +void vt_fb_suspend(void); int fb_probe(struct fb_info *info); Modified: user/ed/newcons/sys/dev/vt/vt.h ============================================================================== --- user/ed/newcons/sys/dev/vt/vt.h Thu Nov 7 21:08:12 2013 (r257814) +++ user/ed/newcons/sys/dev/vt/vt.h Thu Nov 7 21:08:52 2013 (r257815) @@ -61,6 +61,8 @@ TUNABLE_INT("kern.vt." #_name, &vt_##_na struct vt_driver; void vt_allocate(struct vt_driver *, void *); +void vt_resume(void); +void vt_suspend(void); typedef unsigned int vt_axis_t; @@ -81,6 +83,7 @@ typedef unsigned int vt_axis_t; struct vt_device { struct vt_window *vd_windows[VT_MAXWINDOWS]; /* (c) Windows. */ struct vt_window *vd_curwindow; /* (d) Current window. */ + struct vt_window *vd_savedwindow;/* (?) Saved for suspend. */ const struct vt_driver *vd_driver; /* (c) Graphics driver. */ void *vd_softc; /* (u) Driver data. */ vt_axis_t vd_width; /* (?) Screen width. */ Modified: user/ed/newcons/sys/dev/vt/vt_core.c ============================================================================== --- user/ed/newcons/sys/dev/vt/vt_core.c Thu Nov 7 21:08:12 2013 (r257814) +++ user/ed/newcons/sys/dev/vt/vt_core.c Thu Nov 7 21:08:52 2013 (r257815) @@ -977,6 +977,7 @@ vt_proc_alive(struct vt_window *vw) static int signal_vt_rel(struct vt_window *vw) { + if (vw->vw_smode.mode != VT_PROCESS) return FALSE; if (vw->vw_proc == NULL || vt_proc_alive(vw) == FALSE) { @@ -995,6 +996,7 @@ signal_vt_rel(struct vt_window *vw) static int signal_vt_acq(struct vt_window *vw) { + if (vw->vw_smode.mode != VT_PROCESS) return FALSE; if (vw == vw->vw_device->vd_windows[VT_CONSWINDOW]) @@ -1015,6 +1017,7 @@ signal_vt_acq(struct vt_window *vw) static int finish_vt_rel(struct vt_window *vw, int release, int *s) { + if (vw->vw_flags & VWF_SWWAIT_REL) { vw->vw_flags &= ~VWF_SWWAIT_REL; if (release) { @@ -1029,6 +1032,7 @@ finish_vt_rel(struct vt_window *vw, int static int finish_vt_acq(struct vt_window *vw) { + if (vw->vw_flags & VWF_SWWAIT_ACQ) { vw->vw_flags &= ~VWF_SWWAIT_ACQ; return 0; @@ -1463,3 +1467,23 @@ vt_allocate(struct vt_driver *drv, void vt_winsize(vd, vd->vd_windows[VT_CONSWINDOW]->vw_font, &wsz); terminal_set_winsize(vd->vd_windows[VT_CONSWINDOW]->vw_terminal, &wsz); } + +void +vt_suspend() +{ + + /* Save current window. */ + main_vd->vd_savedwindow = main_vd->vd_curwindow; + /* Ask holding process to free window and switch to console window */ + vt_proc_window_switch(main_vd->vd_windows[VT_CONSWINDOW]); +} + +void +vt_resume() +{ + + /* Switch back to saved window */ + if (main_vd->vd_savedwindow != NULL) + vt_proc_window_switch(main_vd->vd_savedwindow); + main_vd->vd_savedwindow = NULL; +}