Home | History | Annotate | Line # | Download | only in drm
vbox_drv.c revision 1.2
      1 /* $NetBSD: vbox_drv.c,v 1.2 2011/08/28 17:18:31 jmcneill Exp $ */
      2 
      3 /*
      4  * Copyright (c) 2011 Jared D. McNeill <jmcneill (at) invisible.ca>
      5  * All rights reserved.
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  * 1. Redistributions of source code must retain the above copyright
     11  *    notice, this list of conditions and the following disclaimer.
     12  * 2. The name of the author may not be used to endorse or promote products
     13  *    derived from this software without specific prior written permission.
     14  *
     15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     16  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     17  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     18  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     19  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
     20  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     21  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
     22  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
     23  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     24  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     25  * SUCH DAMAGE.
     26  */
     27 
     28 #include <sys/cdefs.h>
     29 __KERNEL_RCSID(0, "$NetBSD: vbox_drv.c,v 1.2 2011/08/28 17:18:31 jmcneill Exp $");
     30 
     31 #include "drmP.h"
     32 #include "drm.h"
     33 
     34 static drm_pci_id_list_t vboxdrm_pciidlist[] = {
     35 	{ 0x80ee, 0xbeef, 0, "VirtualBox Video" },
     36 	{ 0, 0, 0, NULL },
     37 };
     38 
     39 static int
     40 vboxdrm_driver_load(struct drm_device *dev, unsigned long flags)
     41 {
     42 	return drm_vblank_init(dev, 1);
     43 }
     44 
     45 static void
     46 vboxdrm_configure(struct drm_device *dev)
     47 {
     48 	dev->driver->buf_priv_size = 1;
     49 	dev->driver->load = vboxdrm_driver_load;
     50 	dev->driver->name = "vbox";
     51 	dev->driver->desc = "VirtualBox Video";
     52 	dev->driver->date = "20110130";
     53 	dev->driver->major = 1;
     54 	dev->driver->minor = 0;
     55 	dev->driver->patchlevel = 0;
     56 }
     57 
     58 static int
     59 vboxdrm_match(device_t parent, cfdata_t match, void *opaque)
     60 {
     61 	struct pci_attach_args *pa = opaque;
     62 
     63 	return drm_probe(pa, vboxdrm_pciidlist);
     64 }
     65 
     66 static void
     67 vboxdrm_attach(device_t parent, device_t self, void *opaque)
     68 {
     69 	struct pci_attach_args *pa = opaque;
     70 	struct drm_device *dev = device_private(self);
     71 
     72 	pmf_device_register(self, NULL, NULL);
     73 
     74 	dev->driver = kmem_zalloc(sizeof(struct drm_driver_info), KM_SLEEP);
     75 	if (dev->driver == NULL) {
     76 		aprint_error_dev(self, "couldn't allocate memory\n");
     77 		return;
     78 	}
     79 
     80 	vboxdrm_configure(dev);
     81 	drm_attach(self, pa, vboxdrm_pciidlist);
     82 }
     83 
     84 static int
     85 vboxdrm_detach(device_t self, int flags)
     86 {
     87 	struct drm_device *dev = device_private(self);
     88 	int error;
     89 
     90 	pmf_device_deregister(self);
     91 
     92 	error = drm_detach(self, flags);
     93 	kmem_free(dev->driver, sizeof(struct drm_driver_info));
     94 
     95 	return error;
     96 }
     97 
     98 CFATTACH_DECL_NEW(
     99     vboxdrm,
    100     sizeof(struct drm_device),
    101     vboxdrm_match,
    102     vboxdrm_attach,
    103     vboxdrm_detach,
    104     NULL
    105 );
    106 
    107 MODULE(MODULE_CLASS_DRIVER, vboxdrm, "drm");
    108 
    109 #ifdef _MODULE
    110 #include "ioconf.c"
    111 #endif
    112 
    113 static int
    114 vboxdrm_modcmd(modcmd_t cmd, void *opaque)
    115 {
    116 	switch (cmd) {
    117 #ifdef _MODULE
    118 	case MODULE_CMD_INIT:
    119 		return config_init_component(cfdriver_ioconf_vboxdrm,
    120 		    cfattach_ioconf_vboxdrm, cfdata_ioconf_vboxdrm);
    121 	case MODULE_CMD_FINI:
    122 		return config_fini_component(cfdriver_ioconf_vboxdrm,
    123 		    cfattach_ioconf_vboxdrm, cfdata_ioconf_vboxdrm);
    124 #else
    125 	case MODULE_CMD_INIT:
    126 	case MODULE_CMD_FINI:
    127 		return 0;
    128 #endif
    129 	default:
    130 		return ENOTTY;
    131 	}
    132 }
    133