diff --git a/sys/conf/files b/sys/conf/files index 31dafa5e0b47..b882e9a6dc00 100644 --- a/sys/conf/files +++ b/sys/conf/files @@ -1,4 +1,4 @@ -# $NetBSD: files,v 1.1001 2011/02/19 20:19:54 matt Exp $ +# $NetBSD: files,v 1.1002 2011/02/20 15:40:21 jmcneill Exp $ # @(#)files.newconf 7.5 (Berkeley) 5/10/93 version 20100430 @@ -1069,6 +1069,7 @@ file dev/ic/lan9118.c smsh # DRM - Direct Rendering Infrastructure: dev/drm define drm {} include "external/bsd/drm/conf/files.drm" +include "dev/drm/files.drm" # Definitions for wscons # device attributes: display, display with emulator, keyboard, and mouse diff --git a/sys/dev/drm/files.drm b/sys/dev/drm/files.drm new file mode 100644 index 000000000000..e117ef9eeb18 --- /dev/null +++ b/sys/dev/drm/files.drm @@ -0,0 +1,5 @@ +# $NetBSD: files.drm,v 1.9 2011/02/20 15:40:21 jmcneill Exp $ + +device vboxdrm: drmbase, drmpci +attach vboxdrm at drm +file dev/drm/vbox_drv.c vboxdrm diff --git a/sys/dev/drm/vbox_drv.c b/sys/dev/drm/vbox_drv.c new file mode 100644 index 000000000000..06e682adc174 --- /dev/null +++ b/sys/dev/drm/vbox_drv.c @@ -0,0 +1,132 @@ +/* $NetBSD: vbox_drv.c,v 1.1 2011/02/20 15:40:21 jmcneill Exp $ */ + +/* + * Copyright (c) 2011 Jared D. McNeill + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + */ + +#include +__KERNEL_RCSID(0, "$NetBSD: vbox_drv.c,v 1.1 2011/02/20 15:40:21 jmcneill Exp $"); + +#include "drmP.h" +#include "drm.h" + +static drm_pci_id_list_t vboxdrm_pciidlist[] = { + { 0x80ee, 0xbeef, 0, "VirtualBox Video" }, + { 0, 0, 0, NULL }, +}; + +static int +vboxdrm_driver_load(struct drm_device *dev, unsigned long flags) +{ + return drm_vblank_init(dev, 1); +} + +static void +vboxdrm_configure(struct drm_device *dev) +{ + dev->driver->buf_priv_size = 1; + dev->driver->load = vboxdrm_driver_load; + dev->driver->name = "vbox"; + dev->driver->desc = "VirtualBox Video"; + dev->driver->date = "20110130"; + dev->driver->major = 1; + dev->driver->minor = 0; + dev->driver->patchlevel = 0; +} + +static int +vboxdrm_match(device_t parent, cfdata_t match, void *opaque) +{ + struct pci_attach_args *pa = opaque; + + return drm_probe(pa, vboxdrm_pciidlist); +} + +static void +vboxdrm_attach(device_t parent, device_t self, void *opaque) +{ + struct pci_attach_args *pa = opaque; + struct drm_device *dev = device_private(self); + + pmf_device_register(self, NULL, NULL); + + dev->driver = kmem_zalloc(sizeof(struct drm_driver_info), KM_SLEEP); + if (dev->driver == NULL) { + aprint_error_dev(self, "couldn't allocate memory\n"); + return; + } + + vboxdrm_configure(dev); + drm_attach(self, pa, vboxdrm_pciidlist); +} + +static int +vboxdrm_detach(device_t self, int flags) +{ + struct drm_device *dev = device_private(self); + int error; + + pmf_device_deregister(self); + + error = drm_detach(self, flags); + kmem_free(dev->driver, sizeof(struct drm_driver_info)); + + return error; +} + +CFATTACH_DECL_NEW( + vboxdrm, + sizeof(struct drm_device), + vboxdrm_match, + vboxdrm_attach, + vboxdrm_detach, + NULL +); + +MODULE(MODULE_CLASS_DRIVER, vboxdrm, NULL); + +#ifdef _MODULE +#include "ioconf.c" +#endif + +static int +vboxdrm_modcmd(modcmd_t cmd, void *opaque) +{ + switch (cmd) { +#ifdef _MODULE + case MODULE_CMD_INIT: + return config_init_component(cfdriver_ioconf_vboxdrm, + cfattach_ioconf_vboxdrm, cfdata_ioconf_vboxdrm); + case MODULE_CMD_FINI: + return config_fini_component(cfdriver_ioconf_vboxdrm, + cfattach_ioconf_vboxdrm, cfdata_ioconf_vboxdrm); +#else + case MODULE_CMD_INIT: + case MODULE_CMD_FINI: + return 0; +#endif + default: + return ENOTTY; + } +} diff --git a/sys/modules/vboxdrm/Makefile b/sys/modules/vboxdrm/Makefile new file mode 100644 index 000000000000..ac1913fbf09f --- /dev/null +++ b/sys/modules/vboxdrm/Makefile @@ -0,0 +1,16 @@ +# $NetBSD: Makefile,v 1.1 2011/02/20 15:40:21 jmcneill Exp $ + +.include "../Makefile.inc" + +.PATH: ${S}/dev/drm + +KMOD= vboxdrm +IOCONF= vboxdrm.ioconf +SRCS= vbox_drv.c + +CPPFLAGS+= -I${S}/external/bsd/drm/dist/bsd-core +CPPFLAGS+= -I${S}/external/bsd/drm/dist/shared-core + +WARNS= 4 + +.include diff --git a/sys/modules/vboxdrm/vboxdrm.ioconf b/sys/modules/vboxdrm/vboxdrm.ioconf new file mode 100644 index 000000000000..7aef34343841 --- /dev/null +++ b/sys/modules/vboxdrm/vboxdrm.ioconf @@ -0,0 +1,9 @@ +# $NetBSD: vboxdrm.ioconf,v 1.1 2011/02/20 15:40:21 jmcneill Exp $ + +ioconf vboxdrm + +include "conf/files" + +pseudo-root drm* + +vboxdrm* at drm?