Home | History | Annotate | Line # | Download | only in drm
      1 /* $NetBSD: vbox_drv.c,v 1.4 2017/06/01 02:45:09 chs 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.4 2017/06/01 02:45:09 chs 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 	if (!pmf_device_register(self, NULL, NULL))
     73 		aprint_error_dev(self, "couldn't establish power handler\n");
     74 
     75 	dev->driver = kmem_zalloc(sizeof(struct drm_driver_info), KM_SLEEP);
     76 	vboxdrm_configure(dev);
     77 	drm_attach(self, pa, vboxdrm_pciidlist);
     78 }
     79 
     80 static int
     81 vboxdrm_detach(device_t self, int flags)
     82 {
     83 	struct drm_device *dev = device_private(self);
     84 	int error;
     85 
     86 	pmf_device_deregister(self);
     87 
     88 	error = drm_detach(self, flags);
     89 	kmem_free(dev->driver, sizeof(struct drm_driver_info));
     90 
     91 	return error;
     92 }
     93 
     94 CFATTACH_DECL_NEW(
     95     vboxdrm,
     96     sizeof(struct drm_device),
     97     vboxdrm_match,
     98     vboxdrm_attach,
     99     vboxdrm_detach,
    100     NULL
    101 );
    102 
    103 MODULE(MODULE_CLASS_DRIVER, vboxdrm, "drm");
    104 
    105 #ifdef _MODULE
    106 #include "ioconf.c"
    107 #endif
    108 
    109 static int
    110 vboxdrm_modcmd(modcmd_t cmd, void *opaque)
    111 {
    112 	switch (cmd) {
    113 #ifdef _MODULE
    114 	case MODULE_CMD_INIT:
    115 		return config_init_component(cfdriver_ioconf_vboxdrm,
    116 		    cfattach_ioconf_vboxdrm, cfdata_ioconf_vboxdrm);
    117 	case MODULE_CMD_FINI:
    118 		return config_fini_component(cfdriver_ioconf_vboxdrm,
    119 		    cfattach_ioconf_vboxdrm, cfdata_ioconf_vboxdrm);
    120 #else
    121 	case MODULE_CMD_INIT:
    122 	case MODULE_CMD_FINI:
    123 		return 0;
    124 #endif
    125 	default:
    126 		return ENOTTY;
    127 	}
    128 }
    129