Author: jhb
Date: Thu Mar  6 18:30:56 2014
New Revision: 262861
URL: http://svnweb.freebsd.org/changeset/base/262861

Log:
  MFC 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:
  Merge the vt(4) driver (newcons) to stable/10.
  
  Approved by:  ray

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

Copied: stable/10/sys/amd64/conf/VT (from r260888, head/sys/amd64/conf/VT)
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ stable/10/sys/amd64/conf/VT Thu Mar  6 18:30:56 2014        (r262861, copy 
of r260888, head/sys/amd64/conf/VT)
@@ -0,0 +1,14 @@
+# VT -- kernel config using the vt(9) system console instead of legacy syscons
+#                                                                              
+# For more information see https://wiki.freebsd.org/Newcons
+#
+# $FreeBSD$
+
+include                GENERIC
+ident          VT
+
+nodevice       sc
+nodevice       vga
+
+device         vt
+device         vt_vga

Modified: stable/10/sys/conf/files
==============================================================================
--- stable/10/sys/conf/files    Thu Mar  6 17:33:27 2014        (r262860)
+++ stable/10/sys/conf/files    Thu Mar  6 18:30:56 2014        (r262861)
@@ -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                              \
@@ -1400,7 +1400,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_ic_if.m            optional fdt
 dev/fdt/fdt_pci.c              optional fdt pci
@@ -2500,6 +2502,17 @@ 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
@@ -2936,6 +2949,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
@@ -3842,7 +3856,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/10/sys/conf/files.amd64
==============================================================================
--- stable/10/sys/conf/files.amd64      Thu Mar  6 17:33:27 2014        
(r262860)
+++ stable/10/sys/conf/files.amd64      Thu Mar  6 18:30:56 2014        
(r262861)
@@ -241,7 +241,7 @@ dev/hyperv/vmbus/hv_connection.c                    optio
 dev/hyperv/vmbus/hv_hv.c                               optional        hyperv
 dev/hyperv/vmbus/hv_ring_buffer.c                      optional        hyperv
 dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c                        optional        
hyperv
-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/10/sys/conf/files.arm
==============================================================================
--- stable/10/sys/conf/files.arm        Thu Mar  6 17:33:27 2014        
(r262860)
+++ stable/10/sys/conf/files.arm        Thu Mar  6 18:30:56 2014        
(r262861)
@@ -62,7 +62,7 @@ crypto/blowfish/bf_enc.c      optional        crypto
 crypto/des/des_enc.c           optional        crypto | ipsec | netsmb
 dev/fb/fb.c                    optional        sc
 dev/hwpmc/hwpmc_arm.c          optional        hwpmc
-dev/kbd/kbd.c                  optional        sc
+dev/kbd/kbd.c                  optional        sc | vt
 dev/syscons/scgfbrndr.c                optional        sc
 dev/syscons/scterm-teken.c     optional        sc
 dev/syscons/scvtb.c            optional        sc

Modified: stable/10/sys/conf/files.i386
==============================================================================
--- stable/10/sys/conf/files.i386       Thu Mar  6 17:33:27 2014        
(r262860)
+++ stable/10/sys/conf/files.i386       Thu Mar  6 18:30:56 2014        
(r262861)
@@ -249,7 +249,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
@@ -293,6 +293,7 @@ dev/viawd/viawd.c           optional viawd
 dev/vmware/vmxnet3/if_vmx.c    optional vmx
 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/10/sys/conf/files.powerpc
==============================================================================
--- stable/10/sys/conf/files.powerpc    Thu Mar  6 17:33:27 2014        
(r262860)
+++ stable/10/sys/conf/files.powerpc    Thu Mar  6 18:30:56 2014        
(r262861)
@@ -35,7 +35,7 @@ dev/iicbus/ad7417.c           optional        ad7417 pow
 dev/iicbus/ds1631.c            optional        ds1631 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/nand/nfc_fsl.c             optional        nand mpc85xx
 # ofw can be either aim or fdt: fdt case handled in files. aim only powerpc 
specific.
 dev/ofw/openfirm.c             optional        aim
@@ -65,6 +65,7 @@ dev/tsec/if_tsec_fdt.c                optional        tsec fd
 dev/uart/uart_cpu_fdt.c                optional        uart fdt
 dev/uart/uart_cpu_powerpc.c    optional        uart aim
 dev/usb/controller/ehci_fsl.c  optional        ehci mpc85xx
+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/10/sys/conf/files.sparc64
==============================================================================
--- stable/10/sys/conf/files.sparc64    Thu Mar  6 17:33:27 2014        
(r262860)
+++ stable/10/sys/conf/files.sparc64    Thu Mar  6 18:30:56 2014        
(r262861)
@@ -39,7 +39,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
@@ -59,7 +59,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/10/sys/conf/kmod.mk
==============================================================================
--- stable/10/sys/conf/kmod.mk  Thu Mar  6 17:33:27 2014        (r262860)
+++ stable/10/sys/conf/kmod.mk  Thu Mar  6 18:30:56 2014        (r262861)
@@ -340,7 +340,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/gpio/gpio_if.m dev/gpio/gpiobus_if.m \
+       dev/fb/fb_if.m dev/gpio/gpio_if.m dev/gpio/gpiobus_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/10/sys/conf/options
==============================================================================
--- stable/10/sys/conf/options  Thu Mar  6 17:33:27 2014        (r262860)
+++ stable/10/sys/conf/options  Thu Mar  6 18:30:56 2014        (r262861)
@@ -732,8 +732,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
@@ -756,6 +758,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/10/sys/dev/drm2/drmP.h
==============================================================================
--- stable/10/sys/dev/drm2/drmP.h       Thu Mar  6 17:33:27 2014        
(r262860)
+++ stable/10/sys/dev/drm2/drmP.h       Thu Mar  6 18:30:56 2014        
(r262861)
@@ -113,6 +113,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/10/sys/dev/drm2/drm_fb_helper.c
==============================================================================
--- stable/10/sys/dev/drm2/drm_fb_helper.c      Thu Mar  6 17:33:27 2014        
(r262860)
+++ stable/10/sys/dev/drm2/drm_fb_helper.c      Thu Mar  6 18:30:56 2014        
(r262861)
@@ -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/10/sys/dev/drm2/drm_os_freebsd.h
==============================================================================
--- stable/10/sys/dev/drm2/drm_os_freebsd.h     Thu Mar  6 17:33:27 2014        
(r262860)
+++ stable/10/sys/dev/drm2/drm_os_freebsd.h     Thu Mar  6 18:30:56 2014        
(r262861)
@@ -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/10/sys/dev/drm2/i915/i915_drv.c
==============================================================================
--- stable/10/sys/dev/drm2/i915/i915_drv.c      Thu Mar  6 17:33:27 2014        
(r262860)
+++ stable/10/sys/dev/drm2/i915/i915_drv.c      Thu Mar  6 18:30:56 2014        
(r262861)
@@ -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/10/sys/dev/drm2/i915/intel_fb.c
==============================================================================
--- stable/10/sys/dev/drm2/i915/intel_fb.c      Thu Mar  6 17:33:27 2014        
(r262860)
+++ stable/10/sys/dev/drm2/i915/intel_fb.c      Thu Mar  6 18:30:56 2014        
(r262861)
@@ -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/10/sys/dev/drm2/radeon/radeon.h
==============================================================================
--- stable/10/sys/dev/drm2/radeon/radeon.h      Thu Mar  6 17:33:27 2014        
(r262860)
+++ stable/10/sys/dev/drm2/radeon/radeon.h      Thu Mar  6 18:30:56 2014        
(r262861)
@@ -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/10/sys/dev/drm2/radeon/radeon_drv.c
==============================================================================
--- stable/10/sys/dev/drm2/radeon/radeon_drv.c  Thu Mar  6 17:33:27 2014        
(r262860)
+++ stable/10/sys/dev/drm2/radeon/radeon_drv.c  Thu Mar  6 18:30:56 2014        
(r262861)
@@ -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/10/sys/dev/drm2/radeon/radeon_fb.c
==============================================================================
--- stable/10/sys/dev/drm2/radeon/radeon_fb.c   Thu Mar  6 17:33:27 2014        
(r262860)
+++ stable/10/sys/dev/drm2/radeon/radeon_fb.c   Thu Mar  6 18:30:56 2014        
(r262861)
@@ -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/10/sys/dev/drm2/radeon/radeon_pm.c
==============================================================================
--- stable/10/sys/dev/drm2/radeon/radeon_pm.c   Thu Mar  6 17:33:27 2014        
(r262860)
+++ stable/10/sys/dev/drm2/radeon/radeon_pm.c   Thu Mar  6 18:30:56 2014        
(r262861)
@@ -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/10/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/10/sys/dev/fb/fb_if.m        Thu Mar  6 18:30:56 2014        
(r262861, 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/10/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/10/sys/dev/fb/fbd.c  Thu Mar  6 18:30:56 2014        (r262861)
@@ -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/10/sys/dev/syscons/scterm-teken.c
==============================================================================
--- stable/10/sys/dev/syscons/scterm-teken.c    Thu Mar  6 17:33:27 2014        
(r262860)
+++ stable/10/sys/dev/syscons/scterm-teken.c    Thu Mar  6 18:30:56 2014        
(r262861)
@@ -553,7 +553,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/10/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/10/sys/dev/vt/font/vt_font_default.c Thu Mar  6 18:30:56 2014        
(r262861)
@@ -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/10/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/10/sys/dev/vt/font/vt_mouse_cursor.c Thu Mar  6 18:30:56 2014        
(r262861)
@@ -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/10/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/10/sys/dev/vt/hw/fb/vt_fb.c  Thu Mar  6 18:30:56 2014        
(r262861)
@@ -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/10/sys/dev/vt/hw/ofwfb/ofwfb.c
==============================================================================
--- head/sys/dev/vt/hw/ofwfb/ofwfb.c    Thu Dec  5 22:38:53 2013        
(r259016)
+++ stable/10/sys/dev/vt/hw/ofwfb/ofwfb.c       Thu Mar  6 18:30:56 2014        
(r262861)
@@ -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:
                c = sc->sc_colormap[color];
-               for (ofs = 0; ofs < sc->sc_stride*vd->vd_height; ofs++)
+               for (ofs = 0; ofs < size; ofs++)
                        *(uint32_t *)(sc->sc_addr + 4*ofs) = c;
                break;
        default:

Modified: stable/10/sys/dev/vt/hw/vga/vga.c
==============================================================================
--- head/sys/dev/vt/hw/vga/vga.c        Thu Dec  5 22:38:53 2013        
(r259016)
+++ stable/10/sys/dev/vt/hw/vga/vga.c   Thu Mar  6 18:30:56 2014        
(r262861)
@@ -74,13 +74,19 @@ struct vga_softc {
 static vd_init_t       vga_init;
 static vd_blank_t      vga_blank;
 static vd_bitbltchr_t  vga_bitbltchr;
+static vd_drawrect_t   vga_drawrect;
+static vd_setpixel_t   vga_setpixel;
 static vd_putchar_t    vga_putchar;
+static vd_postswitch_t vga_postswitch;
 
 static const struct vt_driver vt_vga_driver = {
        .vd_init        = vga_init,
        .vd_blank       = vga_blank,
        .vd_bitbltchr   = vga_bitbltchr,
+       .vd_drawrect    = vga_drawrect,
+       .vd_setpixel    = vga_setpixel,
        .vd_putchar     = vga_putchar,
+       .vd_postswitch  = vga_postswitch,
        .vd_priority    = VD_PRIORITY_GENERIC,
 };
 
@@ -137,6 +143,31 @@ vga_bitblt_put(struct vt_device *vd, u_l
        }
 }
 
+static void
+vga_setpixel(struct vt_device *vd, int x, int y, term_color_t color)
+{
+
+       vga_bitblt_put(vd, (y * VT_VGA_WIDTH / 8) + (x / 8), color,
+           0x80 >> (x % 8));
+}
+
+static void
+vga_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++)
+                               vga_setpixel(vd, x, y, color);
+               } else {
+                       vga_setpixel(vd, x1, y, color);
+                       vga_setpixel(vd, x2, y, color);
+               }
+       }
+}
+
 static inline void
 vga_bitblt_draw(struct vt_device *vd, const uint8_t *src,
     u_long ldst, uint8_t shift, unsigned int width, unsigned int height,
@@ -602,3 +633,13 @@ vga_init(struct vt_device *vd)
 
        return (CN_INTERNAL);
 }
+
+static void
+vga_postswitch(struct vt_device *vd)
+{
+
+       /* Reinit VGA mode, to restore view after app which change mode. */

*** 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