From owner-freebsd-current@FreeBSD.ORG Sun Dec 8 15:36:16 2013 Return-Path: Delivered-To: current@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 2ADA9EA5 for ; Sun, 8 Dec 2013 15:36:16 +0000 (UTC) Received: from mail-bk0-x235.google.com (mail-bk0-x235.google.com [IPv6:2a00:1450:4008:c01::235]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 7E5AD1AC7 for ; Sun, 8 Dec 2013 15:36:15 +0000 (UTC) Received: by mail-bk0-f53.google.com with SMTP id na10so999425bkb.12 for ; Sun, 08 Dec 2013 07:36:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20120113; h=date:from:to:subject:message-id:in-reply-to:references:mime-version :content-type:content-transfer-encoding; bh=Wd7DxHy6+yeuwtXuuOa30lNDDN4mYj5C+j24Gve893s=; b=YhNWi0PbBc9pa3Codx3WFFlZgAouhykAs6Xty1FvhDDCWHwHaOV3+hUNK7NVR/Wv29 eRh/boFBB2VNEBesamOe75Rvrkf39IUB9NvJ/+DXmwUTESoAIgHkuXhn6SEdC4lvb1L9 fwVXFdhjxp1vAy8yvyPvG0YDDKdy1z9b+gcKBZ9tT3FuTLXZ1HRpg0QUL89rX5xGX/vN OpSY+hXykRAlM0GlqcJeAICH2zqr1h6Iw2qBOvG0G1wEj1fSRkwWI+86Wexo8fduzW/Y 8Oqio/P2oNqFrWN1dwdK8AcFEUVrKONlYvLpRu0wX/olwXyL4B4myfqX0ayC1zTW5zZ/ V0Tg== X-Received: by 10.204.164.145 with SMTP id e17mr220952bky.136.1386516973304; Sun, 08 Dec 2013 07:36:13 -0800 (PST) Received: from ubm.strangled.net (g231039136.adsl.alicedsl.de. [92.231.39.136]) by mx.google.com with ESMTPSA id q5sm393195bkr.5.2013.12.08.07.36.11 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sun, 08 Dec 2013 07:36:12 -0800 (PST) Date: Sun, 8 Dec 2013 16:36:10 +0100 From: Marc UBM To: current@freebsd.org Subject: 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 Message-Id: <20131208163610.86e9e1ccc892aaf255d4cfb2@gmail.com> In-Reply-To: <201312052238.rB5McsVN020719@svn.freebsd.org> References: <201312052238.rB5McsVN020719@svn.freebsd.org> X-Mailer: Sylpheed 3.3.0 (GTK+ 2.24.19; amd64-portbld-freebsd10.0) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.17 Precedence: list List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 08 Dec 2013 15:36:16 -0000 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 > #include > > +#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 > __FBSDID("$FreeBSD$"); > > +#include > + > #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 > #include > > +#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 > > +#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 > __FBSDID("$FreeBSD$"); > > +#include > + > #include > #include > #include > @@ -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 > +#include > + > +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 > +__FBSDID("$FreeBSD$"); > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include > + > +#include > +#include > + > +#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-all@freebsd.org mailing list > http://lists.freebsd.org/mailman/listinfo/svn-src-all > To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org" > -- Marc "UBM" Bocklet