Author: ray
Date: Thu Mar 27 15:58:18 2014
New Revision: 263817
URL: http://svnweb.freebsd.org/changeset/base/263817

Log:
  MFC 219886, 226100, 226111, 226341, 242529, 259015, 259016, 259019, 259049,
   259071, 259102, 259110, 259129, 259130, 259178, 259179, 259203, 259221,
   259261, 259532, 259615, 259650, 259651, 259667, 259680, 259727, 259761,
   259772, 259776, 259777, 259830, 259882, 259915, 260160, 260449, 260450,
   260688, 260888, 260953, 261269, 261547, 261551, 261552, 261553, 261585
  o Merge vt(4) virtual terminal (a.k.a. newcons) to stable/9.
  o Merge teken updates.
  o Add few more tty methods required by vt(4).
  o Update syscons(4) to work with fresh teken.
  
  Sponsored by: The FreeBSD Foundation

Added:
  stable/9/sys/dev/fb/fb_if.m
     - copied unchanged from r259016, head/sys/dev/fb/fb_if.m
  stable/9/sys/dev/fb/fbd.c
     - copied, changed from r259016, head/sys/dev/fb/fbd.c
  stable/9/sys/dev/vt/
     - copied from r259016, head/sys/dev/vt/
  stable/9/sys/kern/subr_terminal.c
     - copied, changed from r259016, head/sys/kern/subr_terminal.c
  stable/9/sys/sys/terminal.h
     - copied, changed from r259016, head/sys/sys/terminal.h
  stable/9/tools/tools/vt/
     - copied from r259019, head/tools/tools/vt/
Modified:
  stable/9/sys/conf/files
  stable/9/sys/conf/files.amd64
  stable/9/sys/conf/files.arm
  stable/9/sys/conf/files.i386
  stable/9/sys/conf/files.powerpc
  stable/9/sys/conf/files.sparc64
  stable/9/sys/conf/kmod.mk
  stable/9/sys/conf/options
  stable/9/sys/dev/drm2/drmP.h
  stable/9/sys/dev/drm2/drm_fb_helper.c
  stable/9/sys/dev/drm2/drm_os_freebsd.h
  stable/9/sys/dev/drm2/i915/i915_drv.c
  stable/9/sys/dev/drm2/i915/intel_fb.c
  stable/9/sys/dev/drm2/radeon/radeon.h
  stable/9/sys/dev/drm2/radeon/radeon_drv.c
  stable/9/sys/dev/drm2/radeon/radeon_fb.c
  stable/9/sys/dev/drm2/radeon/radeon_pm.c
  stable/9/sys/dev/syscons/scterm-teken.c
  stable/9/sys/dev/syscons/scvidctl.c
  stable/9/sys/dev/vt/font/vt_font_default.c
  stable/9/sys/dev/vt/font/vt_mouse_cursor.c
  stable/9/sys/dev/vt/hw/fb/vt_fb.c
  stable/9/sys/dev/vt/hw/ofwfb/ofwfb.c   (contents, props changed)
  stable/9/sys/dev/vt/hw/vga/vga.c
  stable/9/sys/dev/vt/hw/xboxfb/xboxfb.c
  stable/9/sys/dev/vt/vt.h
  stable/9/sys/dev/vt/vt_buf.c
  stable/9/sys/dev/vt/vt_consolectl.c
  stable/9/sys/dev/vt/vt_core.c
  stable/9/sys/dev/vt/vt_font.c
  stable/9/sys/dev/vt/vt_sysmouse.c
  stable/9/sys/kern/tty.c
  stable/9/sys/modules/drm2/drm2/Makefile
  stable/9/sys/modules/drm2/i915kms/Makefile
  stable/9/sys/modules/drm2/radeonkms/Makefile
  stable/9/sys/sparc64/sparc64/machdep.c
  stable/9/sys/sys/consio.h
  stable/9/sys/sys/eventhandler.h
  stable/9/sys/sys/fbio.h
  stable/9/sys/sys/tty.h
  stable/9/sys/teken/demo/Makefile
  stable/9/sys/teken/demo/teken_demo.c
  stable/9/sys/teken/libteken/Symbol.map
  stable/9/sys/teken/stress/teken_stress.c
  stable/9/sys/teken/teken.c
  stable/9/sys/teken/teken.h
  stable/9/sys/teken/teken_subr.h
  stable/9/tools/tools/vt/mkkfont/mkkfont.c
Directory Properties:
  stable/9/sys/   (props changed)
  stable/9/sys/conf/   (props changed)
  stable/9/sys/dev/   (props changed)
  stable/9/sys/modules/   (props changed)
  stable/9/sys/sys/   (props changed)
  stable/9/tools/tools/   (props changed)

Modified: stable/9/sys/conf/files
==============================================================================
--- stable/9/sys/conf/files     Thu Mar 27 14:07:36 2014        (r263816)
+++ stable/9/sys/conf/files     Thu Mar 27 15:58:18 2014        (r263817)
@@ -87,7 +87,7 @@ pccarddevs.h                  standard                        
           \
        compile-with    "${AWK} -f $S/tools/pccarddevs2h.awk 
$S/dev/pccard/pccarddevs" \
        no-obj no-implicit-rule before-depend                              \
        clean           "pccarddevs.h"
-teken_state.h          optional sc                                        \
+teken_state.h          optional sc | vt                                   \
        dependency      "$S/teken/gensequences $S/teken/sequences" \
        compile-with    "${AWK} -f $S/teken/gensequences $S/teken/sequences > 
teken_state.h" \
        no-obj no-implicit-rule before-depend                              \
@@ -1143,7 +1143,9 @@ dev/ex/if_ex_isa.c                optional ex isa
 dev/ex/if_ex_pccard.c          optional ex pccard
 dev/exca/exca.c                        optional cbb
 dev/fatm/if_fatm.c             optional fatm pci
-dev/fb/splash.c                        optional splash
+dev/fb/fbd.c                   optional fbd | vt
+dev/fb/fb_if.m                 standard
+dev/fb/splash.c                        optional sc splash
 dev/fdt/fdt_common.c           optional fdt
 dev/fdt/fdt_pci.c              optional fdt pci
 dev/fdt/fdt_static_dtb.S       optional fdt fdt_dtb_static
@@ -2122,6 +2124,17 @@ dev/utopia/utopia.c              optional utopia
 dev/vge/if_vge.c               optional vge
 dev/vkbd/vkbd.c                        optional vkbd
 dev/vr/if_vr.c                 optional vr pci
+dev/vt/colors/vt_termcolors.c  optional vt
+dev/vt/font/vt_font_default.c  optional vt
+dev/vt/font/vt_mouse_cursor.c  optional vt
+dev/vt/hw/fb/vt_fb.c           optional vt
+dev/vt/hw/vga/vga.c            optional vt vt_vga
+dev/vt/logo/logo_freebsd.c     optional vt splash
+dev/vt/vt_buf.c                        optional vt
+dev/vt/vt_consolectl.c         optional vt
+dev/vt/vt_core.c               optional vt
+dev/vt/vt_font.c               optional vt
+dev/vt/vt_sysmouse.c           optional vt
 dev/vte/if_vte.c               optional vte pci
 dev/vx/if_vx.c                 optional vx
 dev/vx/if_vx_eisa.c            optional vx eisa
@@ -2543,6 +2556,7 @@ kern/subr_sleepqueue.c            standard
 kern/subr_smp.c                        standard
 kern/subr_stack.c              optional ddb | stack | ktr
 kern/subr_taskqueue.c          standard
+kern/subr_terminal.c           optional vt
 kern/subr_trap.c               standard
 kern/subr_turnstile.c          standard
 kern/subr_uio.c                        standard
@@ -3431,7 +3445,7 @@ security/mac_portacl/mac_portacl.c optio
 security/mac_seeotheruids/mac_seeotheruids.c optional mac_seeotheruids
 security/mac_stub/mac_stub.c   optional mac_stub
 security/mac_test/mac_test.c   optional mac_test
-teken/teken.c                  optional sc
+teken/teken.c                  optional sc | vt
 ufs/ffs/ffs_alloc.c            optional ffs
 ufs/ffs/ffs_balloc.c           optional ffs
 ufs/ffs/ffs_inode.c            optional ffs

Modified: stable/9/sys/conf/files.amd64
==============================================================================
--- stable/9/sys/conf/files.amd64       Thu Mar 27 14:07:36 2014        
(r263816)
+++ stable/9/sys/conf/files.amd64       Thu Mar 27 15:58:18 2014        
(r263817)
@@ -227,7 +227,7 @@ dev/hwpmc/hwpmc_uncore.c    optional        hwpmc
 dev/hwpmc/hwpmc_piv.c          optional        hwpmc
 dev/hwpmc/hwpmc_tsc.c          optional        hwpmc
 dev/hwpmc/hwpmc_x86.c          optional        hwpmc
-dev/kbd/kbd.c                  optional        atkbd | sc | ukbd
+dev/kbd/kbd.c                  optional        atkbd | sc | ukbd | vt
 dev/lindev/full.c              optional        lindev
 dev/lindev/lindev.c            optional        lindev
 dev/nfe/if_nfe.c               optional        nfe pci

Modified: stable/9/sys/conf/files.arm
==============================================================================
--- stable/9/sys/conf/files.arm Thu Mar 27 14:07:36 2014        (r263816)
+++ stable/9/sys/conf/files.arm Thu Mar 27 15:58:18 2014        (r263817)
@@ -58,6 +58,7 @@ geom/geom_bsd.c                       optional        geom_bsd
 geom/geom_bsd_enc.c            optional        geom_bsd
 geom/geom_mbr.c                        optional        geom_mbr
 geom/geom_mbr_enc.c            optional        geom_mbr
+dev/kbd/kbd.c                  optional        sc | vt
 libkern/arm/divsi3.S           standard
 libkern/arm/ffs.S              standard
 libkern/arm/muldi3.c           standard

Modified: stable/9/sys/conf/files.i386
==============================================================================
--- stable/9/sys/conf/files.i386        Thu Mar 27 14:07:36 2014        
(r263816)
+++ stable/9/sys/conf/files.i386        Thu Mar 27 15:58:18 2014        
(r263817)
@@ -232,7 +232,7 @@ dev/ipmi/ipmi_smbios.c              optional ipmi
 dev/ipmi/ipmi_ssif.c           optional ipmi smbus
 dev/ipmi/ipmi_pci.c            optional ipmi pci
 dev/ipmi/ipmi_linux.c          optional ipmi compat_linux
-dev/kbd/kbd.c                  optional atkbd | sc | ukbd
+dev/kbd/kbd.c                  optional atkbd | sc | ukbd | vt
 dev/le/if_le_isa.c             optional le isa
 dev/lindev/full.c              optional lindev
 dev/lindev/lindev.c            optional lindev
@@ -275,6 +275,7 @@ dev/uart/uart_cpu_i386.c    optional uart
 dev/viawd/viawd.c              optional viawd
 dev/acpica/acpi_if.m           standard
 dev/acpi_support/acpi_wmi_if.m standard
+dev/vt/hw/xboxfb/xboxfb.c      optional vt_xboxfb
 dev/wbwd/wbwd.c                        optional wbwd
 dev/wpi/if_wpi.c               optional wpi
 dev/isci/isci.c                                                        
optional isci

Modified: stable/9/sys/conf/files.powerpc
==============================================================================
--- stable/9/sys/conf/files.powerpc     Thu Mar 27 14:07:36 2014        
(r263816)
+++ stable/9/sys/conf/files.powerpc     Thu Mar 27 15:58:18 2014        
(r263817)
@@ -31,7 +31,7 @@ dev/hwpmc/hwpmc_powerpc.c     optional        hwpmc
 dev/iicbus/ad7417.c            optional        ad7417 powermac
 dev/iicbus/ds1775.c            optional        ds1775 powermac
 dev/iicbus/max6690.c           optional        max6690 powermac
-dev/kbd/kbd.c                  optional        sc
+dev/kbd/kbd.c                  optional        sc | vt
 dev/ofw/openfirm.c             optional        aim | fdt
 dev/ofw/openfirmio.c           optional        aim | fdt
 dev/ofw/ofw_bus_if.m           optional        aim | fdt
@@ -57,6 +57,7 @@ dev/syscons/scvtb.c           optional        sc
 dev/tsec/if_tsec.c             optional        tsec
 dev/tsec/if_tsec_fdt.c         optional        tsec fdt
 dev/uart/uart_cpu_powerpc.c    optional        uart aim
+dev/vt/hw/ofwfb/ofwfb.c                optional        vt aim
 kern/kern_clocksource.c                standard
 kern/subr_dummy_vdso_tc.c      standard
 kern/syscalls.c                        optional        ktr

Modified: stable/9/sys/conf/files.sparc64
==============================================================================
--- stable/9/sys/conf/files.sparc64     Thu Mar 27 14:07:36 2014        
(r263816)
+++ stable/9/sys/conf/files.sparc64     Thu Mar 27 15:58:18 2014        
(r263817)
@@ -38,7 +38,7 @@ dev/fb/fb.c                   optional        sc
 dev/fb/gallant12x22.c          optional        sc
 dev/fb/machfb.c                        optional        machfb sc
 dev/hwpmc/hwpmc_sparc64.c      optional        hwpmc
-dev/kbd/kbd.c                  optional        atkbd | sc | ukbd
+dev/kbd/kbd.c                  optional        atkbd | sc | ukbd | vt
 dev/le/if_le_lebuffer.c                optional        le sbus
 dev/le/if_le_ledma.c           optional        le sbus
 dev/le/lebuffer_sbus.c         optional        le sbus
@@ -58,7 +58,8 @@ dev/syscons/scgfbrndr.c               optional        sc
 dev/syscons/scterm-teken.c     optional        sc
 dev/syscons/scvtb.c            optional        sc
 dev/uart/uart_cpu_sparc64.c    optional        uart
-dev/uart/uart_kbd_sun.c                optional        uart sc
+dev/uart/uart_kbd_sun.c                optional        uart sc | vt
+dev/vt/hw/ofwfb/ofwfb.c                optional        vt
 kern/kern_clocksource.c                standard
 kern/subr_dummy_vdso_tc.c      standard
 kern/syscalls.c                        optional        ktr

Modified: stable/9/sys/conf/kmod.mk
==============================================================================
--- stable/9/sys/conf/kmod.mk   Thu Mar 27 14:07:36 2014        (r263816)
+++ stable/9/sys/conf/kmod.mk   Thu Mar 27 15:58:18 2014        (r263817)
@@ -346,6 +346,7 @@ CFLAGS+=    ${CONF_CFLAGS}
 
 MFILES?= dev/acpica/acpi_if.m dev/acpi_support/acpi_wmi_if.m \
        dev/agp/agp_if.m dev/ata/ata_if.m dev/eisa/eisa_if.m \
+       dev/fb/fb_if.m \
        dev/iicbus/iicbb_if.m dev/iicbus/iicbus_if.m \
        dev/mmc/mmcbr_if.m dev/mmc/mmcbus_if.m \
        dev/mii/miibus_if.m dev/mvs/mvs_if.m dev/ofw/ofw_bus_if.m \

Modified: stable/9/sys/conf/options
==============================================================================
--- stable/9/sys/conf/options   Thu Mar 27 14:07:36 2014        (r263816)
+++ stable/9/sys/conf/options   Thu Mar 27 15:58:18 2014        (r263817)
@@ -730,8 +730,10 @@ SAFE_DEBUG         opt_safe.h
 SAFE_NO_RNG            opt_safe.h
 SAFE_RNDTEST           opt_safe.h
 
-# syscons options
+# syscons/vt options
 MAXCONS                        opt_syscons.h
+VT_FB_DEFAULT_WIDTH    opt_syscons.h
+VT_FB_DEFAULT_HEIGHT   opt_syscons.h
 SC_ALT_MOUSE_IMAGE     opt_syscons.h
 SC_CUT_SPACES2TABS     opt_syscons.h
 SC_CUT_SEPCHARS                opt_syscons.h
@@ -754,6 +756,9 @@ SC_NORM_REV_ATTR    opt_syscons.h
 SC_PIXEL_MODE          opt_syscons.h
 SC_RENDER_DEBUG                opt_syscons.h
 SC_TWOBUTTON_MOUSE     opt_syscons.h
+DEV_SC                 opt_syscons.h
+DEV_VT                 opt_syscons.h
+
 
 # teken terminal emulator options
 TEKEN_CONS25           opt_teken.h

Modified: stable/9/sys/dev/drm2/drmP.h
==============================================================================
--- stable/9/sys/dev/drm2/drmP.h        Thu Mar 27 14:07:36 2014        
(r263816)
+++ stable/9/sys/dev/drm2/drmP.h        Thu Mar 27 15:58:18 2014        
(r263817)
@@ -112,6 +112,7 @@ struct drm_device;
 
 #include "opt_compat.h"
 #include "opt_drm.h"
+#include "opt_syscons.h"
 #ifdef DRM_DEBUG
 #undef DRM_DEBUG
 #define DRM_DEBUG_DEFAULT_ON 1

Modified: stable/9/sys/dev/drm2/drm_fb_helper.c
==============================================================================
--- stable/9/sys/dev/drm2/drm_fb_helper.c       Thu Mar 27 14:07:36 2014        
(r263816)
+++ stable/9/sys/dev/drm2/drm_fb_helper.c       Thu Mar 27 15:58:18 2014        
(r263817)
@@ -36,6 +36,41 @@ __FBSDID("$FreeBSD$");
 #include <dev/drm2/drm_fb_helper.h>
 #include <dev/drm2/drm_crtc_helper.h>
 
+#if defined(__FreeBSD__)
+struct vt_kms_softc {
+       struct drm_fb_helper *fb_helper;
+       struct task     fb_mode_task;
+};
+
+static fb_enter_t      vt_kms_postswitch;
+static void vt_restore_fbdev_mode(void *, int);
+
+/* Call restore out of vt(9) locks. */
+static void
+vt_restore_fbdev_mode(void *arg, int pending)
+{
+       struct drm_fb_helper *fb_helper;
+       struct vt_kms_softc *sc;
+
+       sc = (struct vt_kms_softc *)arg;
+       fb_helper = sc->fb_helper;
+       sx_xlock(&fb_helper->dev->mode_config.mutex);
+       drm_fb_helper_restore_fbdev_mode(fb_helper);
+       sx_xunlock(&fb_helper->dev->mode_config.mutex);
+}
+
+static int
+vt_kms_postswitch(void *arg)
+{
+       struct vt_kms_softc *sc;
+
+       sc = (struct vt_kms_softc *)arg;
+       taskqueue_enqueue_fast(taskqueue_thread, &sc->fb_mode_task);
+
+       return (0);
+}
+#endif
+
 static DRM_LIST_HEAD(kernel_fb_helper_list);
 
 /* simple single crtc case helper function */
@@ -216,6 +251,10 @@ static int
 fb_get_options(const char *connector_name, char **option)
 {
 
+       /*
+        * TODO: store mode options pointer in ${option} for connector with
+        * name ${connector_name}
+        */
        return (1);
 }
 
@@ -892,11 +931,13 @@ int drm_fb_helper_single_fb_probe(struct
        int new_fb = 0;
        int crtc_count = 0;
        int i;
-#if 0
        struct fb_info *info;
-#endif
        struct drm_fb_helper_surface_size sizes;
        int gamma_size = 0;
+#if defined(__FreeBSD__)
+       struct vt_kms_softc *sc;
+       device_t kdev;
+#endif
 
        memset(&sizes, 0, sizeof(struct drm_fb_helper_surface_size));
        sizes.surface_depth = 24;
@@ -973,8 +1014,21 @@ int drm_fb_helper_single_fb_probe(struct
        if (new_fb < 0)
                return new_fb;
 
-#if 0
+#if defined(__FreeBSD__)
+       sc = malloc(sizeof(struct vt_kms_softc), DRM_MEM_KMS,
+           M_WAITOK | M_ZERO);
+       sc->fb_helper = fb_helper;
+       TASK_INIT(&sc->fb_mode_task, 0, vt_restore_fbdev_mode, sc);
+
        info = fb_helper->fbdev;
+
+       info->fb_name = device_get_nameunit(fb_helper->dev->device);
+       info->fb_depth = fb_helper->fb->bits_per_pixel;
+       info->fb_height = fb_helper->fb->height;
+       info->fb_width = fb_helper->fb->width;
+       info->fb_stride = fb_helper->fb->pitches[0];
+       info->fb_priv = sc;
+       info->enter = &vt_kms_postswitch;
 #endif
 
        /* set the fb pointer */
@@ -982,7 +1036,23 @@ int drm_fb_helper_single_fb_probe(struct
                fb_helper->crtc_info[i].mode_set.fb = fb_helper->fb;
        }
 
-#if 0
+#if defined(__FreeBSD__)
+       if (new_fb) {
+               device_t fbd;
+               int ret;
+
+               kdev = fb_helper->dev->device;
+               fbd = device_add_child(kdev, "fbd", device_get_unit(kdev));
+               if (fbd != NULL) 
+                       ret = device_probe_and_attach(fbd);
+               else
+                       ret = ENODEV;
+#ifdef DEV_VT
+               if (ret != 0)
+                       DRM_ERROR("Failed to attach fbd device: %d\n", ret);
+#endif
+       }
+#else
        if (new_fb) {
                info->var.pixclock = 0;
                if (register_framebuffer(info) < 0) {
@@ -1006,7 +1076,6 @@ int drm_fb_helper_single_fb_probe(struct
        if (new_fb)
                list_add(&fb_helper->kernel_fb_list, &kernel_fb_helper_list);
 #endif
-
        return 0;
 }
 

Modified: stable/9/sys/dev/drm2/drm_os_freebsd.h
==============================================================================
--- stable/9/sys/dev/drm2/drm_os_freebsd.h      Thu Mar 27 14:07:36 2014        
(r263816)
+++ stable/9/sys/dev/drm2/drm_os_freebsd.h      Thu Mar 27 15:58:18 2014        
(r263817)
@@ -6,6 +6,8 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
+#include <sys/fbio.h>
+
 #if _BYTE_ORDER == _BIG_ENDIAN
 #define        __BIG_ENDIAN 4321
 #else

Modified: stable/9/sys/dev/drm2/i915/i915_drv.c
==============================================================================
--- stable/9/sys/dev/drm2/i915/i915_drv.c       Thu Mar 27 14:07:36 2014        
(r263816)
+++ stable/9/sys/dev/drm2/i915/i915_drv.c       Thu Mar 27 15:58:18 2014        
(r263817)
@@ -40,6 +40,8 @@ __FBSDID("$FreeBSD$");
 #include <dev/drm2/drm_pciids.h>
 #include <dev/drm2/i915/intel_drv.h>
 
+#include "fb_if.h"
+
 /* drv_PCI_IDs comes from drm_pciids.h, generated from drm_pciids.txt. */
 static drm_pci_id_list_t i915_pciidlist[] = {
        i915_PCI_IDS
@@ -380,6 +382,25 @@ i915_attach(device_t kdev)
        return (drm_attach(kdev, i915_pciidlist));
 }
 
+static struct fb_info *
+i915_fb_helper_getinfo(device_t kdev)
+{
+       struct intel_fbdev *ifbdev;
+       drm_i915_private_t *dev_priv;
+       struct drm_device *dev;
+       struct fb_info *info;
+
+       dev = device_get_softc(kdev);
+       dev_priv = dev->dev_private;
+       ifbdev = dev_priv->fbdev;
+       if (ifbdev == NULL)
+               return (NULL);
+
+       info = ifbdev->helper.fbdev;
+
+       return (info);
+}
+
 const struct intel_device_info *
 i915_get_device_id(int device)
 {
@@ -400,6 +421,10 @@ static device_method_t i915_methods[] = 
        DEVMETHOD(device_suspend,       i915_suspend),
        DEVMETHOD(device_resume,        i915_resume),
        DEVMETHOD(device_detach,        drm_detach),
+
+       /* Framebuffer service methods */
+       DEVMETHOD(fb_getinfo,           i915_fb_helper_getinfo),
+
        DEVMETHOD_END
 };
 

Modified: stable/9/sys/dev/drm2/i915/intel_fb.c
==============================================================================
--- stable/9/sys/dev/drm2/i915/intel_fb.c       Thu Mar 27 14:07:36 2014        
(r263816)
+++ stable/9/sys/dev/drm2/i915/intel_fb.c       Thu Mar 27 15:58:18 2014        
(r263817)
@@ -41,8 +41,8 @@ static int intelfb_create(struct intel_f
        struct drm_device *dev = ifbdev->helper.dev;
 #if 0
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct fb_info *info;
 #endif
+       struct fb_info *info;
        struct drm_framebuffer *fb;
        struct drm_mode_fb_cmd2 mode_cmd;
        struct drm_i915_gem_object *obj;
@@ -86,6 +86,16 @@ static int intelfb_create(struct intel_f
        }
 
        info->par = ifbdev;
+#else
+       info = malloc(sizeof(struct fb_info), DRM_MEM_KMS, M_WAITOK | M_ZERO);
+       info->fb_size = size;
+       info->fb_bpp = sizes->surface_bpp;
+       info->fb_width = sizes->fb_width;
+       info->fb_height = sizes->fb_height;
+       info->fb_pbase = dev->agp->base + obj->gtt_offset;
+       info->fb_vbase = (vm_offset_t)pmap_mapdev_attr(info->fb_pbase, size,
+           PAT_WRITE_COMBINING);
+
 #endif
 
        ret = intel_framebuffer_init(dev, &ifbdev->ifb, &mode_cmd, obj);
@@ -95,8 +105,8 @@ static int intelfb_create(struct intel_f
        fb = &ifbdev->ifb.base;
 
        ifbdev->helper.fb = fb;
-#if 0
        ifbdev->helper.fbdev = info;
+#if 0
 
        strcpy(info->fix.id, "inteldrmfb");
 
@@ -135,9 +145,8 @@ static int intelfb_create(struct intel_f
 
        /* Use default scratch pixmap (info->pixmap.flags = FB_PIXMAP_SYSTEM) */
 #endif
-
-       DRM_DEBUG_KMS("allocated %dx%d fb: 0x%08x, bo %p\n",
-                     fb->width, fb->height,
+       DRM_DEBUG_KMS("allocated %dx%d (s %dbits) fb: 0x%08x, bo %p\n",
+                     fb->width, fb->height, fb->depth,
                      obj->gtt_offset, obj);
 
        DRM_UNLOCK(dev);

Modified: stable/9/sys/dev/drm2/radeon/radeon.h
==============================================================================
--- stable/9/sys/dev/drm2/radeon/radeon.h       Thu Mar 27 14:07:36 2014        
(r263816)
+++ stable/9/sys/dev/drm2/radeon/radeon.h       Thu Mar 27 15:58:18 2014        
(r263817)
@@ -2041,6 +2041,9 @@ void      radeon_pm_acpi_event_handler(struct
 int    radeon_ttm_init(struct radeon_device *rdev);
 void   radeon_ttm_fini(struct radeon_device *rdev);
 
+/* radeon_fb.c */
+struct fb_info *       radeon_fb_helper_getinfo(device_t kdev);
+
 /* r600.c */
 int r600_ih_ring_alloc(struct radeon_device *rdev);
 void r600_ih_ring_fini(struct radeon_device *rdev);

Modified: stable/9/sys/dev/drm2/radeon/radeon_drv.c
==============================================================================
--- stable/9/sys/dev/drm2/radeon/radeon_drv.c   Thu Mar 27 14:07:36 2014        
(r263816)
+++ stable/9/sys/dev/drm2/radeon/radeon_drv.c   Thu Mar 27 15:58:18 2014        
(r263817)
@@ -41,6 +41,7 @@ __FBSDID("$FreeBSD$");
 
 #include <dev/drm2/drm_pciids.h>
 
+#include "fb_if.h"
 
 /*
  * KMS wrapper.
@@ -495,6 +496,8 @@ radeon_resume(device_t kdev)
        return (-ret);
 }
 
+extern struct fb_info *        radeon_fb_helper_getinfo(device_t kdev);
+
 static device_method_t radeon_methods[] = {
        /* Device interface */
        DEVMETHOD(device_probe,         radeon_probe),
@@ -502,6 +505,10 @@ static device_method_t radeon_methods[] 
        DEVMETHOD(device_suspend,       radeon_suspend),
        DEVMETHOD(device_resume,        radeon_resume),
        DEVMETHOD(device_detach,        drm_detach),
+
+       /* Framebuffer service methods */
+       DEVMETHOD(fb_getinfo,           radeon_fb_helper_getinfo),
+
        DEVMETHOD_END
 };
 

Modified: stable/9/sys/dev/drm2/radeon/radeon_fb.c
==============================================================================
--- stable/9/sys/dev/drm2/radeon/radeon_fb.c    Thu Mar 27 14:07:36 2014        
(r263816)
+++ stable/9/sys/dev/drm2/radeon/radeon_fb.c    Thu Mar 27 15:58:18 2014        
(r263817)
@@ -27,6 +27,8 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
+#include <machine/_inttypes.h>
+
 #include <dev/drm2/drmP.h>
 #include <dev/drm2/drm_crtc.h>
 #include <dev/drm2/drm_crtc_helper.h>
@@ -46,7 +48,7 @@ struct radeon_fbdev {
        struct radeon_device *rdev;
 };
 
-#ifdef DUMBBELL_WIP
+#if defined(__linux__)
 static struct fb_ops radeonfb_ops = {
        .owner = THIS_MODULE,
        .fb_check_var = drm_fb_helper_check_var,
@@ -60,7 +62,7 @@ static struct fb_ops radeonfb_ops = {
        .fb_debug_enter = drm_fb_helper_debug_enter,
        .fb_debug_leave = drm_fb_helper_debug_leave,
 };
-#endif /* DUMBBELL_WIP */
+#endif
 
 
 int radeon_align_pitch(struct radeon_device *rdev, int width, int bpp, bool 
tiled)
@@ -191,20 +193,13 @@ static int radeonfb_create(struct radeon
                           struct drm_fb_helper_surface_size *sizes)
 {
        struct radeon_device *rdev = rfbdev->rdev;
-#ifdef DUMBBELL_WIP
        struct fb_info *info;
-#endif /* DUMBBELL_WIP */
        struct drm_framebuffer *fb = NULL;
        struct drm_mode_fb_cmd2 mode_cmd;
        struct drm_gem_object *gobj = NULL;
        struct radeon_bo *rbo = NULL;
-#ifdef DUMBBELL_WIP
-       device_t device = rdev->dev;
-#endif /* DUMBBELL_WIP */
        int ret;
-#ifdef DUMBBELL_WIP
        unsigned long tmp;
-#endif /* DUMBBELL_WIP */
 
        mode_cmd.width = sizes->surface_width;
        mode_cmd.height = sizes->surface_height;
@@ -224,16 +219,7 @@ static int radeonfb_create(struct radeon
 
        rbo = gem_to_radeon_bo(gobj);
 
-#ifdef DUMBBELL_WIP
-       /* okay we have an object now allocate the framebuffer */
-       info = framebuffer_alloc(0, device);
-       if (info == NULL) {
-               ret = -ENOMEM;
-               goto out_unref;
-       }
-
-       info->par = rfbdev;
-#endif /* DUMBBELL_WIP */
+       info = malloc(sizeof(*info), DRM_MEM_KMS, M_WAITOK | M_ZERO);
 
        ret = radeon_framebuffer_init(rdev->ddev, &rfbdev->rfb, &mode_cmd, 
gobj);
        if (ret) {
@@ -245,61 +231,29 @@ static int radeonfb_create(struct radeon
 
        /* setup helper */
        rfbdev->helper.fb = fb;
-#ifdef DUMBBELL_WIP
        rfbdev->helper.fbdev = info;
 
-       memset_io(rbo->kptr, 0x0, radeon_bo_size(rbo));
-
-       strcpy(info->fix.id, "radeondrmfb");
-
-       drm_fb_helper_fill_fix(info, fb->pitches[0], fb->depth);
-
-       info->flags = FBINFO_DEFAULT | FBINFO_CAN_FORCE_OUTPUT;
-       info->fbops = &radeonfb_ops;
+       memset(rbo->kptr, 0x0, radeon_bo_size(rbo));
 
        tmp = radeon_bo_gpu_offset(rbo) - rdev->mc.vram_start;
-       info->fix.smem_start = rdev->mc.aper_base + tmp;
-       info->fix.smem_len = radeon_bo_size(rbo);
-       info->screen_base = rbo->kptr;
-       info->screen_size = radeon_bo_size(rbo);
-
-       drm_fb_helper_fill_var(info, &rfbdev->helper, sizes->fb_width, 
sizes->fb_height);
-
-       /* setup aperture base/size for vesafb takeover */
-       info->apertures = alloc_apertures(1);
-       if (!info->apertures) {
-               ret = -ENOMEM;
-               goto out_unref;
-       }
-       info->apertures->ranges[0].base = rdev->ddev->mode_config.fb_base;
-       info->apertures->ranges[0].size = rdev->mc.aper_size;
+       info->fb_size  = radeon_bo_size(rbo);
+       info->fb_bpp = sizes->surface_bpp;
+       info->fb_width = sizes->surface_width;
+       info->fb_height = sizes->surface_height;
+       info->fb_pbase = rdev->mc.aper_base + tmp;
+       info->fb_vbase = (vm_offset_t)rbo->kptr;
 
-       /* Use default scratch pixmap (info->pixmap.flags = FB_PIXMAP_SYSTEM) */
-
-       if (info->screen_base == NULL) {
-               ret = -ENOSPC;
-               goto out_unref;
-       }
-
-       ret = fb_alloc_cmap(&info->cmap, 256, 0);
-       if (ret) {
-               ret = -ENOMEM;
-               goto out_unref;
-       }
-
-       DRM_INFO("fb mappable at 0x%lX\n",  info->fix.smem_start);
+       DRM_INFO("fb mappable at 0x%" PRIXPTR "\n",  info->fb_pbase);
        DRM_INFO("vram apper at 0x%lX\n",  (unsigned long)rdev->mc.aper_base);
        DRM_INFO("size %lu\n", (unsigned long)radeon_bo_size(rbo));
        DRM_INFO("fb depth is %d\n", fb->depth);
        DRM_INFO("   pitch is %d\n", fb->pitches[0]);
 
-       vga_switcheroo_client_fb_set(rdev->ddev->pdev, info);
-#endif /* DUMBBELL_WIP */
        return 0;
 
 out_unref:
        if (rbo) {
-
+               /* TODO? dumbbell@ */
        }
        if (fb && ret) {
                drm_gem_object_unreference(gobj);
@@ -332,21 +286,13 @@ void radeon_fb_output_poll_changed(struc
 
 static int radeon_fbdev_destroy(struct drm_device *dev, struct radeon_fbdev 
*rfbdev)
 {
-#ifdef DUMBBELL_WIP
        struct fb_info *info;
-#endif /* DUMBBELL_WIP */
        struct radeon_framebuffer *rfb = &rfbdev->rfb;
 
-#ifdef DUMBBELL_WIP
        if (rfbdev->helper.fbdev) {
                info = rfbdev->helper.fbdev;
-
-               unregister_framebuffer(info);
-               if (info->cmap.len)
-                       fb_dealloc_cmap(&info->cmap);
-               framebuffer_release(info);
+               free(info, DRM_MEM_KMS);
        }
-#endif /* DUMBBELL_WIP */
 
        if (rfb->obj) {
                DRM_UNLOCK(dev); /* Work around lock recursion. dumbbell@ */
@@ -431,3 +377,22 @@ bool radeon_fbdev_robj_is_fb(struct rade
                return true;
        return false;
 }
+
+struct fb_info *
+radeon_fb_helper_getinfo(device_t kdev)
+{
+       struct drm_device *dev;
+       struct radeon_device *rdev;
+       struct radeon_fbdev *rfbdev;
+       struct fb_info *info;
+
+       dev = device_get_softc(kdev);
+       rdev = dev->dev_private;
+       rfbdev = rdev->mode_info.rfbdev;
+       if (rfbdev == NULL)
+               return (NULL);
+
+       info = rfbdev->helper.fbdev;
+
+       return (info);
+}

Modified: stable/9/sys/dev/drm2/radeon/radeon_pm.c
==============================================================================
--- stable/9/sys/dev/drm2/radeon/radeon_pm.c    Thu Mar 27 14:07:36 2014        
(r263816)
+++ stable/9/sys/dev/drm2/radeon/radeon_pm.c    Thu Mar 27 15:58:18 2014        
(r263817)
@@ -248,7 +248,7 @@ static void radeon_pm_set_clocks(struct 
            (rdev->pm.requested_power_state_index == 
rdev->pm.current_power_state_index))
                return;
 
-       DRM_LOCK(rdev->ddev);
+       //DRM_LOCK(rdev->ddev); XXX Recursion, already locked in 
drm_attach/drm_load -- dumbbell@
        sx_xlock(&rdev->pm.mclk_lock);
        sx_xlock(&rdev->ring_lock);
 
@@ -263,7 +263,7 @@ static void radeon_pm_set_clocks(struct 
                        /* needs a GPU reset dont reset here */
                        sx_xunlock(&rdev->ring_lock);
                        sx_xunlock(&rdev->pm.mclk_lock);
-                       DRM_UNLOCK(rdev->ddev);
+                       //DRM_UNLOCK(rdev->ddev); XXX Recursion, already locked 
in drm_attach/drm_load -- dumbbell@
                        return;
                }
        }
@@ -299,7 +299,7 @@ static void radeon_pm_set_clocks(struct 
 
        sx_xunlock(&rdev->ring_lock);
        sx_xunlock(&rdev->pm.mclk_lock);
-       DRM_UNLOCK(rdev->ddev);
+       //DRM_UNLOCK(rdev->ddev); XXX Recursion, already locked in 
drm_attach/drm_load -- dumbbell@
 }
 
 static void radeon_pm_print_states(struct radeon_device *rdev)

Copied: stable/9/sys/dev/fb/fb_if.m (from r259016, head/sys/dev/fb/fb_if.m)
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ stable/9/sys/dev/fb/fb_if.m Thu Mar 27 15:58:18 2014        (r263817, copy 
of r259016, head/sys/dev/fb/fb_if.m)
@@ -0,0 +1,13 @@
+#include <sys/bus.h>
+#include <sys/fbio.h>
+
+INTERFACE fb;
+
+METHOD int pin_max {
+       device_t dev;
+       int *npins;
+};
+
+METHOD struct fb_info * getinfo {
+       device_t dev;
+};

Copied and modified: stable/9/sys/dev/fb/fbd.c (from r259016, 
head/sys/dev/fb/fbd.c)
==============================================================================
--- head/sys/dev/fb/fbd.c       Thu Dec  5 22:38:53 2013        (r259016, copy 
source)
+++ stable/9/sys/dev/fb/fbd.c   Thu Mar 27 15:58:18 2014        (r263817)
@@ -255,8 +255,12 @@ fb_probe(struct fb_info *info)
                info->wr4 = &vt_fb_indir_wr4;
                info->copy = &vt_fb_indir_copy;
        } else if (info->fb_vbase != 0) {
-               if (info->fb_pbase == 0)
+               if (info->fb_pbase == 0) {
                        info->fb_flags |= FB_FLAG_NOMMAP;
+               } else {
+                       if (info->fb_mmap == NULL)
+                               info->fb_mmap = &fb_mmap;
+               }
                info->wr1 = &vt_fb_mem_wr1;
                info->wr2 = &vt_fb_mem_wr2;
                info->wr4 = &vt_fb_mem_wr4;
@@ -264,6 +268,10 @@ fb_probe(struct fb_info *info)
        } else
                return (ENXIO);
 
+       if (info->fb_ioctl == NULL)
+               info->fb_ioctl = &fb_ioctl;
+
+
        return (0);
 }
 
@@ -277,6 +285,7 @@ fb_init(struct fb_list_entry *entry, int
        entry->fb_si = make_dev(&fb_cdevsw, unit, UID_ROOT, GID_WHEEL,
            0600, "fb%d", unit);
        entry->fb_si->si_drv1 = info;
+       info->fb_cdev = entry->fb_si;
 
        return (0);
 }

Modified: stable/9/sys/dev/syscons/scterm-teken.c
==============================================================================
--- stable/9/sys/dev/syscons/scterm-teken.c     Thu Mar 27 14:07:36 2014        
(r263816)
+++ stable/9/sys/dev/syscons/scterm-teken.c     Thu Mar 27 15:58:18 2014        
(r263817)
@@ -542,7 +542,14 @@ scteken_putchar(void *arg, const teken_p
        vm_offset_t p;
        int cursor, attr;
 
+       /*
+        * No support for printing right hand sides for CJK fullwidth
+        * characters. Simply print a space and assume that the left
+        * hand side describes the entire character.
+        */
        attr = scteken_attr(a) << 8;
+       if (a->ta_format & TF_CJK_RIGHT)
+               c = ' ';
 #ifdef TEKEN_UTF8
        scteken_get_cp437(&c, &attr);
 #endif /* TEKEN_UTF8 */

Modified: stable/9/sys/dev/syscons/scvidctl.c
==============================================================================
--- stable/9/sys/dev/syscons/scvidctl.c Thu Mar 27 14:07:36 2014        
(r263816)
+++ stable/9/sys/dev/syscons/scvidctl.c Thu Mar 27 15:58:18 2014        
(r263817)
@@ -137,6 +137,7 @@ sc_set_text_mode(scr_stat *scp, struct t
                 int fontsize, int fontwidth)
 {
     video_info_t info;
+    struct winsize wsz;
     u_char *font;
     int prev_ysize;
     int error;
@@ -234,16 +235,9 @@ sc_set_text_mode(scr_stat *scp, struct t
 
     if (tp == NULL)
        return 0;
-    DPRINTF(5, ("ws_*size (%d,%d), size (%d,%d)\n",
-       tp->t_winsize.ws_col, tp->t_winsize.ws_row, scp->xsize, scp->ysize));
-    if (tp->t_winsize.ws_col != scp->xsize
-       || tp->t_winsize.ws_row != scp->ysize) {
-       tp->t_winsize.ws_col = scp->xsize;
-       tp->t_winsize.ws_row = scp->ysize;
-
-       tty_signal_pgrp(tp, SIGWINCH);
-    }
-
+    wsz.ws_col = scp->xsize;
+    wsz.ws_row = scp->ysize;
+    tty_set_winsize(tp, &wsz);
     return 0;
 }
 
@@ -254,6 +248,7 @@ sc_set_graphics_mode(scr_stat *scp, stru
     return ENODEV;
 #else
     video_info_t info;
+    struct winsize wsz;
     int error;
     int s;
 
@@ -300,14 +295,9 @@ sc_set_graphics_mode(scr_stat *scp, stru
 
     if (tp == NULL)
        return 0;
-    if (tp->t_winsize.ws_xpixel != scp->xpixel
-       || tp->t_winsize.ws_ypixel != scp->ypixel) {
-       tp->t_winsize.ws_xpixel = scp->xpixel;
-       tp->t_winsize.ws_ypixel = scp->ypixel;
-
-       tty_signal_pgrp(tp, SIGWINCH);
-    }
-
+    wsz.ws_col = scp->xsize;
+    wsz.ws_row = scp->ysize;
+    tty_set_winsize(tp, &wsz);
     return 0;
 #endif /* SC_NO_MODE_CHANGE */
 }
@@ -320,7 +310,7 @@ sc_set_pixel_mode(scr_stat *scp, struct 
     return ENODEV;
 #else
     video_info_t info;
-    ksiginfo_t ksi;
+    struct winsize wsz;
     u_char *font;
     int prev_ysize;
     int error;
@@ -425,20 +415,9 @@ sc_set_pixel_mode(scr_stat *scp, struct 
 
     if (tp == NULL)
        return 0;
-    if (tp->t_winsize.ws_col != scp->xsize
-       || tp->t_winsize.ws_row != scp->ysize) {
-       tp->t_winsize.ws_col = scp->xsize;
-       tp->t_winsize.ws_row = scp->ysize;
-       if (tp->t_pgrp != NULL) {
-           ksiginfo_init(&ksi);
-           ksi.ksi_signo = SIGWINCH;
-           ksi.ksi_code = SI_KERNEL;
-           PGRP_LOCK(tp->t_pgrp);
-           pgsignal(tp->t_pgrp, SIGWINCH, 1, &ksi);
-           PGRP_UNLOCK(tp->t_pgrp);
-       }
-    }
-
+    wsz.ws_col = scp->xsize;
+    wsz.ws_row = scp->ysize;
+    tty_set_winsize(tp, &wsz);
     return 0;
 #endif /* SC_PIXEL_MODE */
 }

Modified: stable/9/sys/dev/vt/font/vt_font_default.c
==============================================================================
--- head/sys/dev/vt/font/vt_font_default.c      Thu Dec  5 22:38:53 2013        
(r259016)
+++ stable/9/sys/dev/vt/font/vt_font_default.c  Thu Mar 27 15:58:18 2014        
(r263817)
@@ -2194,9 +2194,12 @@ struct vt_font vt_font_default = {
        .vf_width               = 8,
        .vf_height              = 16,
        .vf_bytes               = font_bytes,
-       .vf_normal              = font_mapping_normal,
-       .vf_normal_length       = 248,
-       .vf_bold                = font_mapping_bold,
-       .vf_bold_length         = 260,
+       .vf_map                 = {
+                                   font_mapping_normal,
+                                   NULL,
+                                   font_mapping_bold,
+                                   NULL,
+                                 },
+       .vf_map_count           = { 248, 0, 260, 0 },
        .vf_refcount            = 1,
 };

Modified: stable/9/sys/dev/vt/font/vt_mouse_cursor.c
==============================================================================
--- head/sys/dev/vt/font/vt_mouse_cursor.c      Thu Dec  5 22:38:53 2013        
(r259016)
+++ stable/9/sys/dev/vt/font/vt_mouse_cursor.c  Thu Mar 27 15:58:18 2014        
(r263817)
@@ -32,6 +32,7 @@ __FBSDID("$FreeBSD$");
 
 #include <dev/vt/vt.h>
 
+#ifndef SC_NO_CUTPASTE
 struct mouse_cursor vt_default_mouse_pointer = {
        .map = {
                0x00, /* "__      " */
@@ -66,3 +67,4 @@ struct mouse_cursor vt_default_mouse_poi
        .w = 8,
        .h = 13,
 };
+#endif

Modified: stable/9/sys/dev/vt/hw/fb/vt_fb.c
==============================================================================
--- head/sys/dev/vt/hw/fb/vt_fb.c       Thu Dec  5 22:38:53 2013        
(r259016)
+++ stable/9/sys/dev/vt/hw/fb/vt_fb.c   Thu Mar 27 15:58:18 2014        
(r263817)
@@ -41,14 +41,103 @@ __FBSDID("$FreeBSD$");
 #include <dev/vt/hw/fb/vt_fb.h>
 #include <dev/vt/colors/vt_termcolors.h>
 
+static int vt_fb_ioctl(struct vt_device *vd, u_long cmd, caddr_t data,
+    struct thread *td);
+static int vt_fb_mmap(struct vt_device *vd, vm_ooffset_t offset,
+    vm_paddr_t *paddr, int prot, vm_memattr_t *memattr);
+void vt_fb_drawrect(struct vt_device *vd, int x1, int y1, int x2, int y2,
+    int fill, term_color_t color);
+void vt_fb_setpixel(struct vt_device *vd, int x, int y, term_color_t color);
+
 static struct vt_driver vt_fb_driver = {
        .vd_init = vt_fb_init,
        .vd_blank = vt_fb_blank,
        .vd_bitbltchr = vt_fb_bitbltchr,
+       .vd_drawrect = vt_fb_drawrect,
+       .vd_setpixel = vt_fb_setpixel,
        .vd_postswitch = vt_fb_postswitch,
        .vd_priority = VD_PRIORITY_GENERIC+10,
+       .vd_fb_ioctl = vt_fb_ioctl,
+       .vd_fb_mmap = vt_fb_mmap,
 };
 
+static int
+vt_fb_ioctl(struct vt_device *vd, u_long cmd, caddr_t data, struct thread *td)
+{
+       struct fb_info *info;
+
+       info = vd->vd_softc;
+
+       if (info->fb_ioctl == NULL)
+               return (-1);
+
+       return (info->fb_ioctl(info->fb_cdev, cmd, data, 0, td));
+}
+
+static int
+vt_fb_mmap(struct vt_device *vd, vm_ooffset_t offset, vm_paddr_t *paddr,
+    int prot, vm_memattr_t *memattr)
+{
+       struct fb_info *info;
+
+       info = vd->vd_softc;
+
+       if (info->fb_ioctl == NULL)
+               return (ENXIO);
+
+       return (info->fb_mmap(info->fb_cdev, offset, paddr, prot, memattr));
+}
+
+void
+vt_fb_setpixel(struct vt_device *vd, int x, int y, term_color_t color)
+{
+       struct fb_info *info;
+       uint32_t c;
+       u_int o;
+
+       info = vd->vd_softc;
+       c = info->fb_cmap[color];
+       o = info->fb_stride * y + x * FBTYPE_GET_BYTESPP(info);
+
+       switch (FBTYPE_GET_BYTESPP(info)) {
+       case 1:
+               info->wr1(info, o, c);
+               break;
+       case 2:
+               info->wr2(info, o, c);
+               break;
+       case 3:
+               info->wr1(info, o, (c >> 16) & 0xff);
+               info->wr1(info, o + 1, (c >> 8) & 0xff);
+               info->wr1(info, o + 2, c & 0xff);
+               break;
+       case 4:
+               info->wr4(info, o, c);
+               break;
+       default:
+               /* panic? */
+               return;
+       }
+
+}
+
+void
+vt_fb_drawrect(struct vt_device *vd, int x1, int y1, int x2, int y2, int fill,
+    term_color_t color)
+{
+       int x, y;
+
+       for (y = y1; y <= y2; y++) {
+               if (fill || (y == y1) || (y == y2)) {
+                       for (x = x1; x <= x2; x++)
+                               vt_fb_setpixel(vd, x, y, color);
+               } else {
+                       vt_fb_setpixel(vd, x1, y, color);
+                       vt_fb_setpixel(vd, x2, y, color);
+               }
+       }
+}
+
 void
 vt_fb_blank(struct vt_device *vd, term_color_t color)
 {

Modified: stable/9/sys/dev/vt/hw/ofwfb/ofwfb.c
==============================================================================
--- head/sys/dev/vt/hw/ofwfb/ofwfb.c    Thu Dec  5 22:38:53 2013        
(r259016)
+++ stable/9/sys/dev/vt/hw/ofwfb/ofwfb.c        Thu Mar 27 15:58:18 2014        
(r263817)
@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: user/ed/newcons/sys/dev/vt/hw/ofwfb/ofwfb.c 219888 
2011-03-22 21:31:31Z ed $");
+__FBSDID("$FreeBSD$");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -78,17 +78,19 @@ static void
 ofwfb_blank(struct vt_device *vd, term_color_t color)
 {
        struct ofwfb_softc *sc = vd->vd_softc;
-       u_int ofs;
+       u_int ofs, size;
        uint32_t c;
 
+       size = sc->sc_stride * vd->vd_height;
        switch (sc->sc_depth) {
        case 8:
-               for (ofs = 0; ofs < sc->sc_stride*vd->vd_height; ofs++)
-                       *(uint8_t *)(sc->sc_addr + ofs) = color;
+               c = (color << 24) | (color << 16) | (color << 8) | color;
+               for (ofs = 0; ofs < size/4; ofs++)
+                       *(uint32_t *)(sc->sc_addr + 4*ofs) = c;
                break;
        case 32:

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to