96d07b623c1e6d9c97cb54f50494331e19d766advboxsync/* $Id$ */
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync/** @file
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync * VirtualBox Guest Additions - vboxvideo DRM module.
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync * FreeBSD kernel OpenGL module.
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync */
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync/*
c58f1213e628a545081c70e26c6b67a841cff880vboxsync * Copyright (C) 2006-2010 Oracle Corporation
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync *
82bcaaf8077ba892f39afb721dca149353c63d2cvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
82bcaaf8077ba892f39afb721dca149353c63d2cvboxsync * available from http://www.virtualbox.org. This file is free software;
82bcaaf8077ba892f39afb721dca149353c63d2cvboxsync * you can redistribute it and/or modify it under the terms of the GNU
82bcaaf8077ba892f39afb721dca149353c63d2cvboxsync * General Public License (GPL) as published by the Free Software
82bcaaf8077ba892f39afb721dca149353c63d2cvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
82bcaaf8077ba892f39afb721dca149353c63d2cvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
82bcaaf8077ba892f39afb721dca149353c63d2cvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync * --------------------------------------------------------------------
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync *
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync * This code is based on:
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync *
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync * tdfx_drv.c -- tdfx driver -*- linux-c -*-
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync * Created: Thu Oct 7 10:38:32 1999 by faith@precisioninsight.com
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync *
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync * All Rights Reserved.
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync *
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync * Permission is hereby granted, free of charge, to any person obtaining a
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync * copy of this software and associated documentation files (the "Software"),
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync * to deal in the Software without restriction, including without limitation
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync * the rights to use, copy, modify, merge, publish, distribute, sublicense,
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync * and/or sell copies of the Software, and to permit persons to whom the
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync * Software is furnished to do so, subject to the following conditions:
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync *
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync * The above copyright notice and this permission notice (including the next
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync * paragraph) shall be included in all copies or substantial portions of the
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync * Software.
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync *
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync * DEALINGS IN THE SOFTWARE.
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync *
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync * Authors:
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync * Rickard E. (Rik) Faith <faith@valinux.com>
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync * Daryll Strauss <daryll@valinux.com>
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync * Gareth Hughes <gareth@valinux.com>
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync *
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync */
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync#include <sys/cdefs.h>
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync__FBSDID("$FreeBSD$");
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync#include "dev/drm/drmP.h"
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync#include "dev/drm/drm_pciids.h"
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync
f313ed48a0cc2d9d12580dc9412291ae15773f02vboxsync#define DRIVER_AUTHOR "Oracle Corporation"
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync#define DRIVER_NAME "vboxvideo"
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync#define DRIVER_DESC "VirtualBox DRM"
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync#define DRIVER_DATE "20090317"
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync#define DRIVER_MAJOR 1
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync#define DRIVER_MINOR 0
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync#define DRIVER_PATCHLEVEL 0
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync/** @todo Take PCI IDs from VBox/param.h; VBOX_VESA_VENDORID,
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync * VBOX_VESA_DEVICEID. */
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync#define vboxvideo_PCI_IDS { 0x80ee, 0xbeef, 0, "VirtualBox Video" }, \
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync { 0, 0, 0, NULL }
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync
96d07b623c1e6d9c97cb54f50494331e19d766advboxsyncstatic drm_pci_id_list_t vboxvideo_pciidlist[] = {
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync vboxvideo_PCI_IDS
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync};
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync
96d07b623c1e6d9c97cb54f50494331e19d766advboxsyncstatic void vboxvideo_configure(struct drm_device *dev)
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync{
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync#if __FreeBSD_version >= 702000
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync dev->driver->buf_priv_size = 1; /* No dev_priv */
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync dev->driver->max_ioctl = 0;
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync dev->driver->name = DRIVER_NAME;
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync dev->driver->desc = DRIVER_DESC;
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync dev->driver->date = DRIVER_DATE;
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync dev->driver->major = DRIVER_MAJOR;
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync dev->driver->minor = DRIVER_MINOR;
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync dev->driver->patchlevel = DRIVER_PATCHLEVEL;
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync#else
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync dev->driver.buf_priv_size = 1; /* No dev_priv */
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync dev->driver.max_ioctl = 0;
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync dev->driver.name = DRIVER_NAME;
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync dev->driver.desc = DRIVER_DESC;
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync dev->driver.date = DRIVER_DATE;
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync dev->driver.major = DRIVER_MAJOR;
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync dev->driver.minor = DRIVER_MINOR;
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync dev->driver.patchlevel = DRIVER_PATCHLEVEL;
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync#endif
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync}
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync
96d07b623c1e6d9c97cb54f50494331e19d766advboxsyncstatic int
96d07b623c1e6d9c97cb54f50494331e19d766advboxsyncvboxvideo_probe(device_t kdev)
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync{
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync return drm_probe(kdev, vboxvideo_pciidlist);
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync}
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync
96d07b623c1e6d9c97cb54f50494331e19d766advboxsyncstatic int
96d07b623c1e6d9c97cb54f50494331e19d766advboxsyncvboxvideo_attach(device_t kdev)
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync{
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync struct drm_device *dev = device_get_softc(kdev);
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync#if __FreeBSD_version >= 702000
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync dev->driver = malloc(sizeof(struct drm_driver_info), DRM_MEM_DRIVER,
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync M_WAITOK | M_ZERO);
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync#else
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync bzero(&dev->driver, sizeof(struct drm_driver_info));
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync#endif
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync vboxvideo_configure(dev);
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync return drm_attach(kdev, vboxvideo_pciidlist);
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync}
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync
96d07b623c1e6d9c97cb54f50494331e19d766advboxsyncstatic int
96d07b623c1e6d9c97cb54f50494331e19d766advboxsyncvboxvideo_detach(device_t kdev)
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync{
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync struct drm_device *dev = device_get_softc(kdev);
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync int ret;
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync ret = drm_detach(kdev);
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync#if __FreeBSD_version >= 702000
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync free(dev->driver, DRM_MEM_DRIVER);
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync#endif
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync return ret;
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync}
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync
96d07b623c1e6d9c97cb54f50494331e19d766advboxsyncstatic device_method_t vboxvideo_methods[] = {
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync /* Device interface */
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync DEVMETHOD(device_probe, vboxvideo_probe),
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync DEVMETHOD(device_attach, vboxvideo_attach),
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync DEVMETHOD(device_detach, vboxvideo_detach),
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync { 0, 0 }
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync};
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync
96d07b623c1e6d9c97cb54f50494331e19d766advboxsyncstatic driver_t vboxvideo_driver = {
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync "drm",
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync vboxvideo_methods,
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync sizeof(struct drm_device)
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync};
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync
96d07b623c1e6d9c97cb54f50494331e19d766advboxsyncextern devclass_t drm_devclass;
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync#if __FreeBSD_version >= 700010
96d07b623c1e6d9c97cb54f50494331e19d766advboxsyncDRIVER_MODULE(vboxvideo, vgapci, vboxvideo_driver, drm_devclass, 0, 0);
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync#else
96d07b623c1e6d9c97cb54f50494331e19d766advboxsyncDRIVER_MODULE(vboxvideo, pci, vboxvideo_driver, drm_devclass, 0, 0);
96d07b623c1e6d9c97cb54f50494331e19d766advboxsync#endif
96d07b623c1e6d9c97cb54f50494331e19d766advboxsyncMODULE_DEPEND(vboxvideo, drm, 1, 1, 1);