Hiho! :-)

Thanks a lot for working on this!

As soon as X is started, things work fine. Before that (as soon as vt
is initialized after the boot menu), output on all ttys is flickering,
resolution is at 640x480 (guessing here) and changing anything via
vidcontrol fails with "inappropriate ioctl for device". Also, screen
output starts overlapping, but a "clear" command fixes that
temporarily. The "Alt-Gr" key does nothing, manually entering ascii
keycodes via alt+number (e.g. alt-124 for |) works.

Relevant pciconf output:

vgapci0@pci0:0:2:0:     class=0x030000 card=0x40011297 chip=0x2e328086
rev=0x03 hdr=0x00 vendor     = 'Intel Corporation'
    device     = '4 Series Chipset Integrated Graphics Controller'
    class      = display
    subclass   = VGA

vgapci1@pci0:0:2:1:     class=0x038000 card=0x40011297 chip=0x2e338086
rev=0x03 hdr=0x00 vendor     = 'Intel Corporation'
    device     = '4 Series Chipset Integrated Graphics Controller'
    class      = display

Best regards,
Marc


> Author: ray
> Date: Thu Dec  5 22:38:53 2013
> New Revision: 259016
> URL: http://svnweb.freebsd.org/changeset/base/259016
> 
> Log:
>   Merge VT(9) project (a.k.a. newcons).
>   
>   Reviewed by:        nwhitehorn
>   MFC_to_10_after:    re approval
>   
>   Sponsored by:       The FreeBSD Foundation
> 
> Added:
>   head/sys/dev/fb/fb_if.m
>      - copied unchanged from r259015, user/ed/newcons/sys/dev/fb/fb_if.m
>   head/sys/dev/fb/fbd.c
>      - copied unchanged from r259015, user/ed/newcons/sys/dev/fb/fbd.c
>   head/sys/dev/vt/
>      - copied from r259015, user/ed/newcons/sys/dev/vt/
>   head/sys/kern/subr_terminal.c
>      - copied unchanged from r259015, user/ed/newcons/sys/kern/subr_terminal.c
>   head/sys/sys/terminal.h
>      - copied unchanged from r259015, user/ed/newcons/sys/sys/terminal.h
> Modified:
>   head/sys/conf/files
>   head/sys/conf/files.amd64
>   head/sys/conf/files.arm
>   head/sys/conf/files.i386
>   head/sys/conf/files.powerpc
>   head/sys/conf/files.sparc64
>   head/sys/conf/kmod.mk
>   head/sys/conf/options
>   head/sys/dev/drm2/drm_fb_helper.c
>   head/sys/dev/drm2/drm_os_freebsd.h
>   head/sys/dev/drm2/i915/i915_drv.c
>   head/sys/dev/drm2/i915/intel_fb.c
>   head/sys/dev/drm2/radeon/radeon.h
>   head/sys/dev/drm2/radeon/radeon_drv.c
>   head/sys/dev/drm2/radeon/radeon_fb.c
>   head/sys/dev/drm2/radeon/radeon_pm.c
>   head/sys/modules/drm2/i915kms/Makefile
>   head/sys/modules/drm2/radeonkms/Makefile
>   head/sys/sparc64/sparc64/machdep.c
>   head/sys/sys/consio.h
>   head/sys/sys/eventhandler.h
>   head/sys/sys/fbio.h
>   head/sys/sys/tty.h
>   head/sys/teken/teken.c
>   head/sys/teken/teken.h
>   head/sys/teken/teken_subr.h
> Directory Properties:
>   head/sys/   (props changed)
>   head/sys/conf/   (props changed)
> 
> Modified: head/sys/conf/files
> ==============================================================================
> --- head/sys/conf/files       Thu Dec  5 21:58:02 2013        (r259015)
> +++ head/sys/conf/files       Thu Dec  5 22:38:53 2013        (r259016)
> @@ -82,7 +82,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                              \
> @@ -1396,6 +1396,8 @@ 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/fbd.c                 optional fbd | vt
> +dev/fb/fb_if.m                       optional fbd | vt
>  dev/fb/splash.c                      optional splash
>  dev/fdt/fdt_common.c         optional fdt
>  dev/fdt/fdt_ic_if.m          optional fdt
> @@ -2461,6 +2463,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
> +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
> @@ -2897,6 +2910,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
> @@ -3796,7 +3810,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: head/sys/conf/files.amd64
> ==============================================================================
> --- head/sys/conf/files.amd64 Thu Dec  5 21:58:02 2013        (r259015)
> +++ head/sys/conf/files.amd64 Thu Dec  5 22:38:53 2013        (r259016)
> @@ -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: head/sys/conf/files.arm
> ==============================================================================
> --- head/sys/conf/files.arm   Thu Dec  5 21:58:02 2013        (r259015)
> +++ head/sys/conf/files.arm   Thu Dec  5 22:38:53 2013        (r259016)
> @@ -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: head/sys/conf/files.i386
> ==============================================================================
> --- head/sys/conf/files.i386  Thu Dec  5 21:58:02 2013        (r259015)
> +++ head/sys/conf/files.i386  Thu Dec  5 22:38:53 2013        (r259016)
> @@ -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: head/sys/conf/files.powerpc
> ==============================================================================
> --- head/sys/conf/files.powerpc       Thu Dec  5 21:58:02 2013        
> (r259015)
> +++ head/sys/conf/files.powerpc       Thu Dec  5 22:38:53 2013        
> (r259016)
> @@ -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.c          optional        tsec
>  dev/tsec/if_tsec_fdt.c               optional        tsec fdt
>  dev/uart/uart_cpu_powerpc.c  optional        uart
>  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: head/sys/conf/files.sparc64
> ==============================================================================
> --- head/sys/conf/files.sparc64       Thu Dec  5 21:58:02 2013        
> (r259015)
> +++ head/sys/conf/files.sparc64       Thu Dec  5 22:38:53 2013        
> (r259016)
> @@ -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: head/sys/conf/kmod.mk
> ==============================================================================
> --- head/sys/conf/kmod.mk     Thu Dec  5 21:58:02 2013        (r259015)
> +++ head/sys/conf/kmod.mk     Thu Dec  5 22:38:53 2013        (r259016)
> @@ -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: head/sys/conf/options
> ==============================================================================
> --- head/sys/conf/options     Thu Dec  5 21:58:02 2013        (r259015)
> +++ head/sys/conf/options     Thu Dec  5 22:38:53 2013        (r259016)
> @@ -731,8 +731,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
> 
> Modified: head/sys/dev/drm2/drm_fb_helper.c
> ==============================================================================
> --- head/sys/dev/drm2/drm_fb_helper.c Thu Dec  5 21:58:02 2013        
> (r259015)
> +++ head/sys/dev/drm2/drm_fb_helper.c Thu Dec  5 22:38:53 2013        
> (r259016)
> @@ -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,18 @@ 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));
> +             ret = device_probe_and_attach(fbd);
> +             if (ret != 0)
> +                     DRM_ERROR("Failed to attach fbd device: %d\n", ret);
> +     }
> +#else
>       if (new_fb) {
>               info->var.pixclock = 0;
>               if (register_framebuffer(info) < 0) {
> @@ -1006,7 +1071,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: head/sys/dev/drm2/drm_os_freebsd.h
> ==============================================================================
> --- head/sys/dev/drm2/drm_os_freebsd.h        Thu Dec  5 21:58:02 2013        
> (r259015)
> +++ head/sys/dev/drm2/drm_os_freebsd.h        Thu Dec  5 22:38:53 2013        
> (r259016)
> @@ -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: head/sys/dev/drm2/i915/i915_drv.c
> ==============================================================================
> --- head/sys/dev/drm2/i915/i915_drv.c Thu Dec  5 21:58:02 2013        
> (r259015)
> +++ head/sys/dev/drm2/i915/i915_drv.c Thu Dec  5 22:38:53 2013        
> (r259016)
> @@ -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: head/sys/dev/drm2/i915/intel_fb.c
> ==============================================================================
> --- head/sys/dev/drm2/i915/intel_fb.c Thu Dec  5 21:58:02 2013        
> (r259015)
> +++ head/sys/dev/drm2/i915/intel_fb.c Thu Dec  5 22:38:53 2013        
> (r259016)
> @@ -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: head/sys/dev/drm2/radeon/radeon.h
> ==============================================================================
> --- head/sys/dev/drm2/radeon/radeon.h Thu Dec  5 21:58:02 2013        
> (r259015)
> +++ head/sys/dev/drm2/radeon/radeon.h Thu Dec  5 22:38:53 2013        
> (r259016)
> @@ -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: head/sys/dev/drm2/radeon/radeon_drv.c
> ==============================================================================
> --- head/sys/dev/drm2/radeon/radeon_drv.c     Thu Dec  5 21:58:02 2013        
> (r259015)
> +++ head/sys/dev/drm2/radeon/radeon_drv.c     Thu Dec  5 22:38:53 2013        
> (r259016)
> @@ -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: head/sys/dev/drm2/radeon/radeon_fb.c
> ==============================================================================
> --- head/sys/dev/drm2/radeon/radeon_fb.c      Thu Dec  5 21:58:02 2013        
> (r259015)
> +++ head/sys/dev/drm2/radeon/radeon_fb.c      Thu Dec  5 22:38:53 2013        
> (r259016)
> @@ -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: head/sys/dev/drm2/radeon/radeon_pm.c
> ==============================================================================
> --- head/sys/dev/drm2/radeon/radeon_pm.c      Thu Dec  5 21:58:02 2013        
> (r259015)
> +++ head/sys/dev/drm2/radeon/radeon_pm.c      Thu Dec  5 22:38:53 2013        
> (r259016)
> @@ -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: head/sys/dev/fb/fb_if.m (from r259015, 
> user/ed/newcons/sys/dev/fb/fb_if.m)
> ==============================================================================
> --- /dev/null 00:00:00 1970   (empty, because file is newly added)
> +++ head/sys/dev/fb/fb_if.m   Thu Dec  5 22:38:53 2013        (r259016, copy 
> of r259015, user/ed/newcons/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: head/sys/dev/fb/fbd.c (from r259015, user/ed/newcons/sys/dev/fb/fbd.c)
> ==============================================================================
> --- /dev/null 00:00:00 1970   (empty, because file is newly added)
> +++ head/sys/dev/fb/fbd.c     Thu Dec  5 22:38:53 2013        (r259016, copy 
> of r259015, user/ed/newcons/sys/dev/fb/fbd.c)
> @@ -0,0 +1,467 @@
> +/*-
> + * Copyright (c) 2013 The FreeBSD Foundation
> + * All rights reserved.
> + *
> + * This software was developed by Aleksandr Rybalko under sponsorship from 
> the
> + * FreeBSD Foundation.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + *    notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + *    notice, this list of conditions and the following disclaimer in the
> + *    documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + *
> + * $FreeBSD$
> + */
> +
> +/* Generic framebuffer */
> +/* TODO unlink from VT(9) */
> +/* TODO done normal /dev/fb methods */
> +
> +#include <sys/cdefs.h>
> +__FBSDID("$FreeBSD$");
> +
> +#include <sys/param.h>
> +#include <sys/systm.h>
> +#include <sys/bus.h>
> +#include <sys/conf.h>
> +#include <sys/kernel.h>
> +#include <sys/malloc.h>
> +#include <sys/module.h>
> +#include <sys/queue.h>
> +#include <sys/fbio.h>
> +
> +#include <machine/bus.h>
> +
> +#include <dev/vt/vt.h>
> +#include <dev/vt/hw/fb/vt_fb.h>
> +
> +#include "fb_if.h"
> +
> +LIST_HEAD(fb_list_head_t, fb_list_entry) fb_list_head =
> +    LIST_HEAD_INITIALIZER(fb_list_head);
> +struct fb_list_entry {
> +     struct fb_info  *fb_info;
> +     struct cdev     *fb_si;
> +     LIST_ENTRY(fb_list_entry) fb_list;
> +};
> +
> +struct fbd_softc {
> +     device_t        sc_dev;
> +     struct fb_info  *sc_info;
> +};
> +
> +static void fbd_evh_init(void *);
> +/* SI_ORDER_SECOND, just after EVENTHANDLERs initialized. */
> +SYSINIT(fbd_evh_init, SI_SUB_CONFIGURE, SI_ORDER_SECOND, fbd_evh_init, NULL);
> +
> +static d_open_t              fb_open;
> +static d_close_t     fb_close;
> +static d_read_t              fb_read;
> +static d_write_t     fb_write;
> +static d_ioctl_t     fb_ioctl;
> +static d_mmap_t              fb_mmap;
> +
> +static struct cdevsw fb_cdevsw = {
> +     .d_version =    D_VERSION,
> +     .d_flags =      D_NEEDGIANT,
> +     .d_open =       fb_open,
> +     .d_close =      fb_close,
> +     .d_read =       fb_read,
> +     .d_write =      fb_write,
> +     .d_ioctl =      fb_ioctl,
> +     .d_mmap =       fb_mmap,
> +     .d_name =       "fb",
> +};
> +
> +static int framebuffer_dev_unit = 0;
> +
> +static int
> +fb_open(struct cdev *dev, int oflags, int devtype, struct thread *td)
> +{
> +
> +     return (0);
> +}
> +
> +static int
> +fb_close(struct cdev *dev, int fflag, int devtype, struct thread *td)
> +{
> +
> +     return (0);
> +}
> +
> +static int
> +fb_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag,
> +    struct thread *td)
> +{
> +     struct fb_info *info;
> +     int error;
> +
> +     error = 0;
> +     info = dev->si_drv1;
> +
> +     switch (cmd) {
> +     case FBIOGTYPE:
> +             bcopy(info, (struct fbtype *)data, sizeof(struct fbtype));
> +             break;
> +
> +     case FBIO_GETWINORG:    /* get frame buffer window origin */
> +             *(u_int *)data = 0;
> +             break;
> +
> +     case FBIO_GETDISPSTART: /* get display start address */
> +             ((video_display_start_t *)data)->x = 0;
> +             ((video_display_start_t *)data)->y = 0;
> +             break;
> +
> +     case FBIO_GETLINEWIDTH: /* get scan line width in bytes */
> +             *(u_int *)data = info->fb_stride;
> +             break;
> +
> +     case FBIO_BLANK:        /* blank display */
> +             error = 0;      /* TODO */
> +             break;
> +
> +     default:
> +             error = ENOIOCTL;
> +             break;
> +     }
> +     return (error);
> +}
> +
> +static int
> +fb_read(struct cdev *dev, struct uio *uio, int ioflag)
> +{
> +
> +     return (0); /* XXX nothing to read, yet */
> +}
> +
> +static int
> +fb_write(struct cdev *dev, struct uio *uio, int ioflag)
> +{
> +
> +     return (0); /* XXX nothing written */
> +}
> +
> +static int
> +fb_mmap(struct cdev *dev, vm_ooffset_t offset, vm_paddr_t *paddr, int nprot,
> +    vm_memattr_t *memattr)
> +{
> +     struct fb_info *info;
> +
> +     info = dev->si_drv1;
> +     if (offset < info->fb_size) {
> +             *paddr = info->fb_pbase + offset;
> +             return (0);
> +     }
> +     return (EINVAL);
> +}
> +
> +
> +static void
> +vt_fb_mem_wr1(struct fb_info *sc, uint32_t o, uint8_t v)
> +{
> +
> +     KASSERT((o < sc->fb_size), ("Offset %#08x out of fb size", o));
> +     *(uint8_t *)(sc->fb_vbase + o) = v;
> +}
> +
> +static void
> +vt_fb_mem_wr2(struct fb_info *sc, uint32_t o, uint16_t v)
> +{
> +
> +     KASSERT((o < sc->fb_size), ("Offset %#08x out of fb size", o));
> +     *(uint16_t *)(sc->fb_vbase + o) = v;
> +}
> +
> +static void
> +vt_fb_mem_wr4(struct fb_info *sc, uint32_t o, uint32_t v)
> +{
> +
> +     KASSERT((o < sc->fb_size), ("Offset %#08x out of fb size", o));
> +     *(uint32_t *)(sc->fb_vbase + o) = v;
> +}
> +
> +static void
> +vt_fb_mem_copy(struct fb_info *sc, uint32_t offset_to, uint32_t offset_from,
> +    uint32_t size)
> +{
> +
> +     memmove((void *)(sc->fb_vbase + offset_to), (void *)(sc->fb_vbase +
> +         offset_from), size);
> +}
> +
> +static void
> +vt_fb_indir_wr1(struct fb_info *sc, uint32_t o, uint8_t v)
> +{
> +
> +     KASSERT((o < sc->fb_size), ("Offset %#08x out of fb size", o));
> +     sc->fb_write(sc->fb_priv, o, &v, 1);
> +}
> +
> +static void
> +vt_fb_indir_wr2(struct fb_info *sc, uint32_t o, uint16_t v)
> +{
> +
> +     KASSERT((o < sc->fb_size), ("Offset %#08x out of fb size", o));
> +     sc->fb_write(sc->fb_priv, o, &v, 2);
> +}
> +
> +static void
> +vt_fb_indir_wr4(struct fb_info *sc, uint32_t o, uint32_t v)
> +{
> +
> +     KASSERT((o < sc->fb_size), ("Offset %#08x out of fb size", o));
> +     sc->fb_write(sc->fb_priv, o, &v, 4);
> +}
> +
> +static void
> +vt_fb_indir_copy(struct fb_info *sc, uint32_t offset_to, uint32_t 
> offset_from,
> +    uint32_t size)
> +{
> +
> +     sc->copy(sc->fb_priv, offset_to, offset_from, size);
> +}
> +
> +int
> +fb_probe(struct fb_info *info)
> +{
> +
> +     if (info->fb_size == 0)
> +             return (ENXIO);
> +
> +     if (info->fb_write != NULL) {
> +             if (info->fb_write == NULL) {
> +                     return (EINVAL);
> +             }
> +             info->fb_flags |= FB_FLAG_NOMMAP;
> +             info->wr1 = &vt_fb_indir_wr1;
> +             info->wr2 = &vt_fb_indir_wr2;
> +             info->wr4 = &vt_fb_indir_wr4;
> +             info->copy = &vt_fb_indir_copy;
> +     } else if (info->fb_vbase != 0) {
> +             if (info->fb_pbase == 0)
> +                     info->fb_flags |= FB_FLAG_NOMMAP;
> +             info->wr1 = &vt_fb_mem_wr1;
> +             info->wr2 = &vt_fb_mem_wr2;
> +             info->wr4 = &vt_fb_mem_wr4;
> +             info->copy = &vt_fb_mem_copy;
> +     } else
> +             return (ENXIO);
> +
> +     return (0);
> +}
> +
> +
> +static int
> +fb_init(struct fb_list_entry *entry, int unit)
> +{
> +     struct fb_info *info;
> +
> +     info = entry->fb_info;
> +     entry->fb_si = make_dev(&fb_cdevsw, unit, UID_ROOT, GID_WHEEL,
> +         0600, "fb%d", unit);
> +     entry->fb_si->si_drv1 = info;
> +
> +     return (0);
> +}
> +
> +int
> +fbd_list()
> +{
> +     struct fb_list_entry *entry;
> +
> +     if (LIST_EMPTY(&fb_list_head))
> +             return (ENOENT);
> +
> +     LIST_FOREACH(entry, &fb_list_head, fb_list) {
> +             printf("FB %s @%p\n", entry->fb_info->fb_name,
> +                 (void *)entry->fb_info->fb_pbase);
> +     }
> +
> +     return (0);
> +}
> +
> +static struct fb_list_entry *
> +fbd_find(struct fb_info* info)
> +{
> +     struct fb_list_entry *entry, *tmp;
> +
> +     LIST_FOREACH_SAFE(entry, &fb_list_head, fb_list, tmp) {
> +             if (entry->fb_info == info) {
> +                     return (entry);
> +             }
> +     }
> +
> +     return (NULL);
> +}
> +
> +int
> +fbd_register(struct fb_info* info)
> +{
> +     struct fb_list_entry *entry;
> +     int err, first;
> +
> +     first = 0;
> +     if (LIST_EMPTY(&fb_list_head))
> +             first++;
> +
> +     entry = fbd_find(info);
> +     if (entry != NULL) {
> +             /* XXX Update framebuffer params */
> +             return (0);
> +     }
> +
> +     err = fb_probe(info);
> +     if (err)
> +             return (err);
> 
> *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
> _______________________________________________
> svn-src-...@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"
> 


-- 
Marc "UBM" Bocklet <eternal....@gmail.com>
_______________________________________________
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "freebsd-current-unsubscr...@freebsd.org"

Reply via email to