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"
This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:40:45 UTC