Re: svn commit: r259016 - in head/sys: conf dev/drm2 dev/drm2/i915 dev/drm2/radeon dev/fb dev/vt kern modules/drm2/i915kms modules/drm2/radeonkms sparc64/sparc64 sys teken

From: Markiyan Kushnir <markiyan.kushnir_at_gmail.com>
Date: Mon, 9 Dec 2013 10:59:14 +0200
Hello,

I'm on rev. 259102 and hitting drm not being able to attach to fbd
device at X startup (X freezing).

Attaching /var/log/messages, pciconf output and kern.conftxt. Please
let me know if there is something I'm missing here. Posting in this
thread since I thought it might be relevant to this commit?

Thanks,
Markiyan


2013/12/8 Marc UBM <ubm.freebsd_at_googlemail.com>:
> 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_at_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_at_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)
>> _at__at_ -82,7 +82,7 _at__at_ 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                              \
>> _at__at_ -1396,6 +1396,8 _at__at_ 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
>> _at__at_ -2461,6 +2463,17 _at__at_ 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
>> _at__at_ -2897,6 +2910,7 _at__at_ 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
>> _at__at_ -3796,7 +3810,7 _at__at_ 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)
>> _at__at_ -241,7 +241,7 _at__at_ 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)
>> _at__at_ -62,7 +62,7 _at__at_ 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)
>> _at__at_ -249,7 +249,7 _at__at_ 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
>> _at__at_ -293,6 +293,7 _at__at_ 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)
>> _at__at_ -35,7 +35,7 _at__at_ 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
>> _at__at_ -65,6 +65,7 _at__at_ 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)
>> _at__at_ -39,7 +39,7 _at__at_ 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
>> _at__at_ -59,7 +59,8 _at__at_ 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)
>> _at__at_ -340,7 +340,7 _at__at_ 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)
>> _at__at_ -731,8 +731,10 _at__at_ 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)
>> _at__at_ -36,6 +36,41 _at__at_ __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 */
>> _at__at_ -216,6 +251,10 _at__at_ 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);
>>  }
>>
>> _at__at_ -892,11 +931,13 _at__at_ 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;
>> _at__at_ -973,8 +1014,21 _at__at_ 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 */
>> _at__at_ -982,7 +1036,18 _at__at_ 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) {
>> _at__at_ -1006,7 +1071,6 _at__at_ 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)
>> _at__at_ -6,6 +6,8 _at__at_
>>  #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)
>> _at__at_ -40,6 +40,8 _at__at_ __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
>> _at__at_ -380,6 +382,25 _at__at_ 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)
>>  {
>> _at__at_ -400,6 +421,10 _at__at_ 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)
>> _at__at_ -41,8 +41,8 _at__at_ 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;
>> _at__at_ -86,6 +86,16 _at__at_ 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);
>> _at__at_ -95,8 +105,8 _at__at_ 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");
>>
>> _at__at_ -135,9 +145,8 _at__at_ 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)
>> _at__at_ -2041,6 +2041,9 _at__at_ 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)
>> _at__at_ -41,6 +41,7 _at__at_ __FBSDID("$FreeBSD$");
>>
>>  #include <dev/drm2/drm_pciids.h>
>>
>> +#include "fb_if.h"
>>
>>  /*
>>   * KMS wrapper.
>> _at__at_ -495,6 +496,8 _at__at_ 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),
>> _at__at_ -502,6 +505,10 _at__at_ 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)
>> _at__at_ -27,6 +27,8 _at__at_
>>  #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>
>> _at__at_ -46,7 +48,7 _at__at_ 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,
>> _at__at_ -60,7 +62,7 _at__at_ 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)
>> _at__at_ -191,20 +193,13 _at__at_ 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;
>> _at__at_ -224,16 +219,7 _at__at_ 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) {
>> _at__at_ -245,61 +231,29 _at__at_ 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_at_ */
>>       }
>>       if (fb && ret) {
>>               drm_gem_object_unreference(gobj);
>> _at__at_ -332,21 +286,13 _at__at_ 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_at_ */
>> _at__at_ -431,3 +377,22 _at__at_ 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)
>> _at__at_ -248,7 +248,7 _at__at_ 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_at_
>>       sx_xlock(&rdev->pm.mclk_lock);
>>       sx_xlock(&rdev->ring_lock);
>>
>> _at__at_ -263,7 +263,7 _at__at_ 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_at_
>>                       return;
>>               }
>>       }
>> _at__at_ -299,7 +299,7 _at__at_ 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_at_
>>  }
>>
>>  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)
>> _at__at_ -0,0 +1,13 _at__at_
>> +#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)
>> _at__at_ -0,0 +1,467 _at__at_
>> +/*-
>> + * 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 _at_%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-all_at_freebsd.org mailing list
>> http://lists.freebsd.org/mailman/listinfo/svn-src-all
>> To unsubscribe, send any mail to "svn-src-all-unsubscribe_at_freebsd.org"
>>
>
>
> --
> Marc "UBM" Bocklet <eternal.ubm_at_gmail.com>
> _______________________________________________
> freebsd-current_at_freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-current
> To unsubscribe, send any mail to "freebsd-current-unsubscribe_at_freebsd.org"

Received on Mon Dec 09 2013 - 07:59:17 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:40:45 UTC