vboxvideo_drm.c revision 4b9d6701570cb98fd36e209314239d104ec584d3
26456d1900aba0e903e6e1beec552396618322e2vboxsync/* $Id$ */
26456d1900aba0e903e6e1beec552396618322e2vboxsync/** @file
26456d1900aba0e903e6e1beec552396618322e2vboxsync * vboxvideo_drm - Direct Rendering Module, Solaris Specific Code.
26456d1900aba0e903e6e1beec552396618322e2vboxsync */
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync/*
e64031e20c39650a7bc902a3e1aba613b9415deevboxsync * Copyright (C) 2009 Oracle Corporation
26456d1900aba0e903e6e1beec552396618322e2vboxsync *
26456d1900aba0e903e6e1beec552396618322e2vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
26456d1900aba0e903e6e1beec552396618322e2vboxsync * available from http://www.virtualbox.org. This file is free software;
26456d1900aba0e903e6e1beec552396618322e2vboxsync * you can redistribute it and/or modify it under the terms of the GNU
26456d1900aba0e903e6e1beec552396618322e2vboxsync * General Public License (GPL) as published by the Free Software
26456d1900aba0e903e6e1beec552396618322e2vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
26456d1900aba0e903e6e1beec552396618322e2vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
26456d1900aba0e903e6e1beec552396618322e2vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
4b9d6701570cb98fd36e209314239d104ec584d3vboxsync *
4b9d6701570cb98fd36e209314239d104ec584d3vboxsync * The contents of this file may alternatively be used under the terms
4b9d6701570cb98fd36e209314239d104ec584d3vboxsync * of the Common Development and Distribution License Version 1.0
4b9d6701570cb98fd36e209314239d104ec584d3vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
4b9d6701570cb98fd36e209314239d104ec584d3vboxsync * VirtualBox OSE distribution, in which case the provisions of the
4b9d6701570cb98fd36e209314239d104ec584d3vboxsync * CDDL are applicable instead of those of the GPL.
4b9d6701570cb98fd36e209314239d104ec584d3vboxsync *
4b9d6701570cb98fd36e209314239d104ec584d3vboxsync * You may elect to license modified versions of this file under the
4b9d6701570cb98fd36e209314239d104ec584d3vboxsync * terms and conditions of either the GPL or the CDDL or both.
26456d1900aba0e903e6e1beec552396618322e2vboxsync */
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync/*******************************************************************************
26456d1900aba0e903e6e1beec552396618322e2vboxsync* Header Files *
26456d1900aba0e903e6e1beec552396618322e2vboxsync*******************************************************************************/
742ee7392dfc0ce0b48216189ce26534208b3f48vboxsync#undef offsetof /* This gets redefined in drmP.h */
26456d1900aba0e903e6e1beec552396618322e2vboxsync#include "include/drmP.h"
26456d1900aba0e903e6e1beec552396618322e2vboxsync#include "include/drm.h"
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync#undef u /* /usr/include/sys/user.h:249:1 is where this is defined to (curproc->p_user). very cool. */
26456d1900aba0e903e6e1beec552396618322e2vboxsync
742ee7392dfc0ce0b48216189ce26534208b3f48vboxsync#include <VBox/log.h>
742ee7392dfc0ce0b48216189ce26534208b3f48vboxsync#include <VBox/version.h>
742ee7392dfc0ce0b48216189ce26534208b3f48vboxsync
6a4c7474dbecb411cc7288459141b7cdd654ab3bvboxsync#ifdef DEBUG_ramshankar
6a4c7474dbecb411cc7288459141b7cdd654ab3bvboxsync# undef LogFlow
6a4c7474dbecb411cc7288459141b7cdd654ab3bvboxsync# undef Log
6a4c7474dbecb411cc7288459141b7cdd654ab3bvboxsync# define LogFlow LogRel
6a4c7474dbecb411cc7288459141b7cdd654ab3bvboxsync# define Log LogRel
6a4c7474dbecb411cc7288459141b7cdd654ab3bvboxsync#endif
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync/*******************************************************************************
26456d1900aba0e903e6e1beec552396618322e2vboxsync* Defined Constants And Macros *
26456d1900aba0e903e6e1beec552396618322e2vboxsync*******************************************************************************/
26456d1900aba0e903e6e1beec552396618322e2vboxsync#define VBOXSOLQUOTE2(x) #x
26456d1900aba0e903e6e1beec552396618322e2vboxsync#define VBOXSOLQUOTE(x) VBOXSOLQUOTE2(x)
26456d1900aba0e903e6e1beec552396618322e2vboxsync/** The module name. */
26456d1900aba0e903e6e1beec552396618322e2vboxsync#define DEVICE_NAME "vboxvideo"
26456d1900aba0e903e6e1beec552396618322e2vboxsync/** The module description as seen in 'modinfo'. */
26456d1900aba0e903e6e1beec552396618322e2vboxsync#define DEVICE_DESC_DRV "VirtualBox DRM"
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync/** DRM Specific defines */
f313ed48a0cc2d9d12580dc9412291ae15773f02vboxsync#define DRIVER_AUTHOR "Oracle Corporation"
26456d1900aba0e903e6e1beec552396618322e2vboxsync#define DRIVER_NAME DEVICE_NAME
26456d1900aba0e903e6e1beec552396618322e2vboxsync#define DRIVER_DESC DEVICE_DESC_DRV
26456d1900aba0e903e6e1beec552396618322e2vboxsync#define DRIVER_DATE "20090317"
26456d1900aba0e903e6e1beec552396618322e2vboxsync#define DRIVER_MAJOR 1
26456d1900aba0e903e6e1beec552396618322e2vboxsync#define DRIVER_MINOR 0
26456d1900aba0e903e6e1beec552396618322e2vboxsync#define DRIVER_PATCHLEVEL 0
26456d1900aba0e903e6e1beec552396618322e2vboxsync#define vboxvideo_PCI_IDS { 0x80ee, 0xbeef, 0, "VirtualBox Video" }, \
26456d1900aba0e903e6e1beec552396618322e2vboxsync { 0, 0, 0, NULL }
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync/*******************************************************************************
26456d1900aba0e903e6e1beec552396618322e2vboxsync* Internal Functions *
26456d1900aba0e903e6e1beec552396618322e2vboxsync*******************************************************************************/
26456d1900aba0e903e6e1beec552396618322e2vboxsyncstatic int VBoxVideoSolarisAttach(dev_info_t *pDip, ddi_attach_cmd_t enmCmd);
26456d1900aba0e903e6e1beec552396618322e2vboxsyncstatic int VBoxVideoSolarisDetach(dev_info_t *pDip, ddi_detach_cmd_t enmCmd);
26456d1900aba0e903e6e1beec552396618322e2vboxsyncstatic int VBoxVideoSolarisGetInfo(dev_info_t *pDip, ddi_info_cmd_t enmCmd, void *pvArg, void **ppvResult);
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsyncstatic void vboxVideoSolarisConfigure(drm_driver_t *pDriver);
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync/*******************************************************************************
26456d1900aba0e903e6e1beec552396618322e2vboxsync* Structures and Typedefs *
26456d1900aba0e903e6e1beec552396618322e2vboxsync*******************************************************************************/
6a4c7474dbecb411cc7288459141b7cdd654ab3bvboxsyncextern struct cb_ops drm_cb_ops;
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync/**
26456d1900aba0e903e6e1beec552396618322e2vboxsync * dev_ops: for driver device operations
26456d1900aba0e903e6e1beec552396618322e2vboxsync */
26456d1900aba0e903e6e1beec552396618322e2vboxsyncstatic struct dev_ops g_VBoxVideoSolarisDevOps =
26456d1900aba0e903e6e1beec552396618322e2vboxsync{
26456d1900aba0e903e6e1beec552396618322e2vboxsync DEVO_REV, /* driver build revision */
26456d1900aba0e903e6e1beec552396618322e2vboxsync 0, /* ref count */
26456d1900aba0e903e6e1beec552396618322e2vboxsync VBoxVideoSolarisGetInfo,
26456d1900aba0e903e6e1beec552396618322e2vboxsync nulldev, /* identify */
26456d1900aba0e903e6e1beec552396618322e2vboxsync nulldev, /* probe */
26456d1900aba0e903e6e1beec552396618322e2vboxsync VBoxVideoSolarisAttach,
26456d1900aba0e903e6e1beec552396618322e2vboxsync VBoxVideoSolarisDetach,
26456d1900aba0e903e6e1beec552396618322e2vboxsync nodev, /* reset */
6a4c7474dbecb411cc7288459141b7cdd654ab3bvboxsync &drm_cb_ops,
6a4c7474dbecb411cc7288459141b7cdd654ab3bvboxsync NULL, /* dev bus ops*/
6a4c7474dbecb411cc7288459141b7cdd654ab3bvboxsync NULL /* power */
26456d1900aba0e903e6e1beec552396618322e2vboxsync};
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync/**
26456d1900aba0e903e6e1beec552396618322e2vboxsync * modldrv: export driver specifics to the kernel
26456d1900aba0e903e6e1beec552396618322e2vboxsync */
26456d1900aba0e903e6e1beec552396618322e2vboxsyncstatic struct modldrv g_VBoxVideoSolarisModule =
26456d1900aba0e903e6e1beec552396618322e2vboxsync{
26456d1900aba0e903e6e1beec552396618322e2vboxsync &mod_driverops, /* extern from kernel */
26456d1900aba0e903e6e1beec552396618322e2vboxsync DEVICE_DESC_DRV " " VBOX_VERSION_STRING "r" VBOXSOLQUOTE(VBOX_SVN_REV),
26456d1900aba0e903e6e1beec552396618322e2vboxsync &g_VBoxVideoSolarisDevOps
26456d1900aba0e903e6e1beec552396618322e2vboxsync};
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync/**
26456d1900aba0e903e6e1beec552396618322e2vboxsync * modlinkage: export install/remove/info to the kernel
26456d1900aba0e903e6e1beec552396618322e2vboxsync */
26456d1900aba0e903e6e1beec552396618322e2vboxsyncstatic struct modlinkage g_VBoxVideoSolarisModLinkage =
26456d1900aba0e903e6e1beec552396618322e2vboxsync{
26456d1900aba0e903e6e1beec552396618322e2vboxsync MODREV_1, /* loadable module system revision */
26456d1900aba0e903e6e1beec552396618322e2vboxsync &g_VBoxVideoSolarisModule,
26456d1900aba0e903e6e1beec552396618322e2vboxsync NULL /* terminate array of linkage structures */
26456d1900aba0e903e6e1beec552396618322e2vboxsync};
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync/* VBoxVideo device PCI ID */
26456d1900aba0e903e6e1beec552396618322e2vboxsyncstatic drm_pci_id_list_t vboxvideo_pciidlist[] = {
26456d1900aba0e903e6e1beec552396618322e2vboxsync vboxvideo_PCI_IDS
26456d1900aba0e903e6e1beec552396618322e2vboxsync};
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync/** DRM Driver */
26456d1900aba0e903e6e1beec552396618322e2vboxsyncstatic drm_driver_t g_VBoxVideoSolarisDRMDriver = { 0 };
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync/*******************************************************************************
26456d1900aba0e903e6e1beec552396618322e2vboxsync* Global Variables *
26456d1900aba0e903e6e1beec552396618322e2vboxsync*******************************************************************************/
26456d1900aba0e903e6e1beec552396618322e2vboxsync/** Device handle (we support only one instance). */
26456d1900aba0e903e6e1beec552396618322e2vboxsyncstatic dev_info_t *g_pDip;
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync/** Soft state. */
26456d1900aba0e903e6e1beec552396618322e2vboxsyncstatic void *g_pVBoxVideoSolarisState;
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync/**
26456d1900aba0e903e6e1beec552396618322e2vboxsync * Kernel entry points
26456d1900aba0e903e6e1beec552396618322e2vboxsync */
26456d1900aba0e903e6e1beec552396618322e2vboxsyncint _init(void)
26456d1900aba0e903e6e1beec552396618322e2vboxsync{
6a4c7474dbecb411cc7288459141b7cdd654ab3bvboxsync LogFlow((DEVICE_NAME ":_init flow\n"));
6a4c7474dbecb411cc7288459141b7cdd654ab3bvboxsync cmn_err(CE_NOTE, DEVICE_NAME ":_init\n");
6a4c7474dbecb411cc7288459141b7cdd654ab3bvboxsync
6a4c7474dbecb411cc7288459141b7cdd654ab3bvboxsync vboxVideoSolarisConfigure(&g_VBoxVideoSolarisDRMDriver);
26456d1900aba0e903e6e1beec552396618322e2vboxsync int rc = ddi_soft_state_init(&g_pVBoxVideoSolarisState, sizeof(drm_device_t), DRM_MAX_INSTANCES);
26456d1900aba0e903e6e1beec552396618322e2vboxsync if (!rc)
26456d1900aba0e903e6e1beec552396618322e2vboxsync return mod_install(&g_VBoxVideoSolarisModLinkage);
26456d1900aba0e903e6e1beec552396618322e2vboxsync else
26456d1900aba0e903e6e1beec552396618322e2vboxsync LogRel((DEVICE_NAME ":_init: ddi_soft_state_init failed. rc=%d\n", rc));
26456d1900aba0e903e6e1beec552396618322e2vboxsync}
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsyncint _fini(void)
26456d1900aba0e903e6e1beec552396618322e2vboxsync{
6a4c7474dbecb411cc7288459141b7cdd654ab3bvboxsync LogFlow((DEVICE_NAME ":_fini flow\n"));
6a4c7474dbecb411cc7288459141b7cdd654ab3bvboxsync cmn_err(CE_NOTE, DEVICE_NAME ":_fini\n");
26456d1900aba0e903e6e1beec552396618322e2vboxsync int rc = mod_remove(&g_VBoxVideoSolarisModLinkage);
26456d1900aba0e903e6e1beec552396618322e2vboxsync ddi_soft_state_fini(&g_pVBoxVideoSolarisState);
26456d1900aba0e903e6e1beec552396618322e2vboxsync return rc;
26456d1900aba0e903e6e1beec552396618322e2vboxsync}
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsyncint _info(struct modinfo *pModInfo)
26456d1900aba0e903e6e1beec552396618322e2vboxsync{
6a4c7474dbecb411cc7288459141b7cdd654ab3bvboxsync LogFlow((DEVICE_NAME ":_info flow\n"));
6a4c7474dbecb411cc7288459141b7cdd654ab3bvboxsync cmn_err(CE_NOTE, DEVICE_NAME ":_info\n");
26456d1900aba0e903e6e1beec552396618322e2vboxsync return mod_info(&g_VBoxVideoSolarisModLinkage, pModInfo);
26456d1900aba0e903e6e1beec552396618322e2vboxsync}
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync/**
26456d1900aba0e903e6e1beec552396618322e2vboxsync * Attach entry point, to attach a device to the system or resume it.
26456d1900aba0e903e6e1beec552396618322e2vboxsync *
26456d1900aba0e903e6e1beec552396618322e2vboxsync * @param pDip The module structure instance.
26456d1900aba0e903e6e1beec552396618322e2vboxsync * @param enmCmd Operation type (attach/resume).
26456d1900aba0e903e6e1beec552396618322e2vboxsync *
26456d1900aba0e903e6e1beec552396618322e2vboxsync * @returns corresponding solaris error code.
26456d1900aba0e903e6e1beec552396618322e2vboxsync */
26456d1900aba0e903e6e1beec552396618322e2vboxsyncstatic int VBoxVideoSolarisAttach(dev_info_t *pDip, ddi_attach_cmd_t enmCmd)
26456d1900aba0e903e6e1beec552396618322e2vboxsync{
26456d1900aba0e903e6e1beec552396618322e2vboxsync LogFlow((DEVICE_NAME ":VBoxVideoSolarisAttach pDip=%p enmCmd=%d\n", pDip, enmCmd));
6a4c7474dbecb411cc7288459141b7cdd654ab3bvboxsync cmn_err(CE_NOTE, DEVICE_NAME ":attach\n");
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync int rc = -1;
26456d1900aba0e903e6e1beec552396618322e2vboxsync switch (enmCmd)
26456d1900aba0e903e6e1beec552396618322e2vboxsync {
26456d1900aba0e903e6e1beec552396618322e2vboxsync case DDI_ATTACH:
26456d1900aba0e903e6e1beec552396618322e2vboxsync {
26456d1900aba0e903e6e1beec552396618322e2vboxsync drm_device_t *pState;
26456d1900aba0e903e6e1beec552396618322e2vboxsync int Instance = ddi_get_instance(pDip);
26456d1900aba0e903e6e1beec552396618322e2vboxsync int rc = ddi_soft_state_zalloc(g_pVBoxVideoSolarisState, Instance);
26456d1900aba0e903e6e1beec552396618322e2vboxsync if (rc == DDI_SUCCESS)
26456d1900aba0e903e6e1beec552396618322e2vboxsync {
26456d1900aba0e903e6e1beec552396618322e2vboxsync pState = ddi_get_soft_state(g_pVBoxVideoSolarisState, Instance);
26456d1900aba0e903e6e1beec552396618322e2vboxsync pState->dip = pDip;
26456d1900aba0e903e6e1beec552396618322e2vboxsync pState->driver = &g_VBoxVideoSolarisDRMDriver;
6a4c7474dbecb411cc7288459141b7cdd654ab3bvboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync /*
26456d1900aba0e903e6e1beec552396618322e2vboxsync * Register using the DRM module which will create the minor nodes
26456d1900aba0e903e6e1beec552396618322e2vboxsync */
26456d1900aba0e903e6e1beec552396618322e2vboxsync void *pDRMHandle = drm_supp_register(pDip, pState);
26456d1900aba0e903e6e1beec552396618322e2vboxsync if (pDRMHandle)
26456d1900aba0e903e6e1beec552396618322e2vboxsync {
26456d1900aba0e903e6e1beec552396618322e2vboxsync pState->drm_handle = pDRMHandle;
6a4c7474dbecb411cc7288459141b7cdd654ab3bvboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync /*
26456d1900aba0e903e6e1beec552396618322e2vboxsync * Probe with our pci-id.
26456d1900aba0e903e6e1beec552396618322e2vboxsync * -XXX- is probing really required???
26456d1900aba0e903e6e1beec552396618322e2vboxsync */
26456d1900aba0e903e6e1beec552396618322e2vboxsync pState->drm_supported = DRM_UNSUPPORT;
26456d1900aba0e903e6e1beec552396618322e2vboxsync rc = drm_probe(pState, vboxvideo_pciidlist);
26456d1900aba0e903e6e1beec552396618322e2vboxsync if (rc == DDI_SUCCESS)
26456d1900aba0e903e6e1beec552396618322e2vboxsync {
26456d1900aba0e903e6e1beec552396618322e2vboxsync pState->drm_supported = DRM_SUPPORT;
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync /*
26456d1900aba0e903e6e1beec552396618322e2vboxsync * Call the common attach DRM routine.
26456d1900aba0e903e6e1beec552396618322e2vboxsync */
26456d1900aba0e903e6e1beec552396618322e2vboxsync rc = drm_attach(pState);
26456d1900aba0e903e6e1beec552396618322e2vboxsync if (rc == DDI_SUCCESS)
26456d1900aba0e903e6e1beec552396618322e2vboxsync {
26456d1900aba0e903e6e1beec552396618322e2vboxsync return DDI_SUCCESS;
26456d1900aba0e903e6e1beec552396618322e2vboxsync }
26456d1900aba0e903e6e1beec552396618322e2vboxsync else
26456d1900aba0e903e6e1beec552396618322e2vboxsync LogRel((DEVICE_NAME ":VBoxVideoSolarisAttach drm_attach failed.rc=%d\n", rc));
26456d1900aba0e903e6e1beec552396618322e2vboxsync }
26456d1900aba0e903e6e1beec552396618322e2vboxsync else
26456d1900aba0e903e6e1beec552396618322e2vboxsync LogRel((DEVICE_NAME ":VBoxVideoSolarisAttach drm_probe failed.rc=%d\n", rc));
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync drm_supp_unregister(pDRMHandle);
26456d1900aba0e903e6e1beec552396618322e2vboxsync }
26456d1900aba0e903e6e1beec552396618322e2vboxsync else
26456d1900aba0e903e6e1beec552396618322e2vboxsync LogRel((DEVICE_NAME ":VBoxVideoSolarisAttach drm_supp_register failed.\n"));
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync ddi_soft_state_free(g_pVBoxVideoSolarisState, Instance);
26456d1900aba0e903e6e1beec552396618322e2vboxsync }
26456d1900aba0e903e6e1beec552396618322e2vboxsync else
26456d1900aba0e903e6e1beec552396618322e2vboxsync LogRel((DEVICE_NAME ":VBoxVideoSolarisAttach failed to alloc memory for soft state.rc=%d\n", rc));
26456d1900aba0e903e6e1beec552396618322e2vboxsync return DDI_FAILURE;
26456d1900aba0e903e6e1beec552396618322e2vboxsync }
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync case DDI_RESUME:
26456d1900aba0e903e6e1beec552396618322e2vboxsync {
26456d1900aba0e903e6e1beec552396618322e2vboxsync /* Nothing to do here... */
26456d1900aba0e903e6e1beec552396618322e2vboxsync return DDI_SUCCESS;
26456d1900aba0e903e6e1beec552396618322e2vboxsync }
26456d1900aba0e903e6e1beec552396618322e2vboxsync }
26456d1900aba0e903e6e1beec552396618322e2vboxsync return DDI_FAILURE;
26456d1900aba0e903e6e1beec552396618322e2vboxsync}
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync/**
26456d1900aba0e903e6e1beec552396618322e2vboxsync * Detach entry point, to detach a device to the system or suspend it.
26456d1900aba0e903e6e1beec552396618322e2vboxsync *
26456d1900aba0e903e6e1beec552396618322e2vboxsync * @param pDip The module structure instance.
26456d1900aba0e903e6e1beec552396618322e2vboxsync * @param enmCmd Operation type (detach/suspend).
26456d1900aba0e903e6e1beec552396618322e2vboxsync *
26456d1900aba0e903e6e1beec552396618322e2vboxsync * @returns corresponding solaris error code.
26456d1900aba0e903e6e1beec552396618322e2vboxsync */
26456d1900aba0e903e6e1beec552396618322e2vboxsyncstatic int VBoxVideoSolarisDetach(dev_info_t *pDip, ddi_detach_cmd_t enmCmd)
26456d1900aba0e903e6e1beec552396618322e2vboxsync{
26456d1900aba0e903e6e1beec552396618322e2vboxsync LogFlow((DEVICE_NAME ":VBoxVideoSolarisDetach pDip=%p enmCmd=%d\n", pDip, enmCmd));
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync switch (enmCmd)
26456d1900aba0e903e6e1beec552396618322e2vboxsync {
26456d1900aba0e903e6e1beec552396618322e2vboxsync case DDI_DETACH:
26456d1900aba0e903e6e1beec552396618322e2vboxsync {
26456d1900aba0e903e6e1beec552396618322e2vboxsync int Instance = ddi_get_instance(pDip);
26456d1900aba0e903e6e1beec552396618322e2vboxsync drm_device_t *pState = ddi_get_soft_state(g_pVBoxVideoSolarisState, Instance);
26456d1900aba0e903e6e1beec552396618322e2vboxsync if (pState)
26456d1900aba0e903e6e1beec552396618322e2vboxsync {
26456d1900aba0e903e6e1beec552396618322e2vboxsync drm_detach(pState);
26456d1900aba0e903e6e1beec552396618322e2vboxsync drm_supp_unregister(pState->drm_handle);
26456d1900aba0e903e6e1beec552396618322e2vboxsync ddi_soft_state_free(g_pVBoxVideoSolarisState, Instance);
26456d1900aba0e903e6e1beec552396618322e2vboxsync return DDI_SUCCESS;
26456d1900aba0e903e6e1beec552396618322e2vboxsync }
26456d1900aba0e903e6e1beec552396618322e2vboxsync else
26456d1900aba0e903e6e1beec552396618322e2vboxsync LogRel((DEVICE_NAME ":VBoxVideoSolarisDetach failed to get soft state.\n"));
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync return DDI_FAILURE;
26456d1900aba0e903e6e1beec552396618322e2vboxsync }
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync case DDI_RESUME:
26456d1900aba0e903e6e1beec552396618322e2vboxsync {
26456d1900aba0e903e6e1beec552396618322e2vboxsync /* Nothing to do here... */
26456d1900aba0e903e6e1beec552396618322e2vboxsync return DDI_SUCCESS;
26456d1900aba0e903e6e1beec552396618322e2vboxsync }
26456d1900aba0e903e6e1beec552396618322e2vboxsync }
26456d1900aba0e903e6e1beec552396618322e2vboxsync return DDI_FAILURE;
26456d1900aba0e903e6e1beec552396618322e2vboxsync}
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync/*
26456d1900aba0e903e6e1beec552396618322e2vboxsync * Info entry point, called by solaris kernel for obtaining driver info.
26456d1900aba0e903e6e1beec552396618322e2vboxsync *
26456d1900aba0e903e6e1beec552396618322e2vboxsync * @param pDip The module structure instance (do not use).
26456d1900aba0e903e6e1beec552396618322e2vboxsync * @param enmCmd Information request type.
26456d1900aba0e903e6e1beec552396618322e2vboxsync * @param pvArg Type specific argument.
26456d1900aba0e903e6e1beec552396618322e2vboxsync * @param ppvResult Where to store the requested info.
26456d1900aba0e903e6e1beec552396618322e2vboxsync *
26456d1900aba0e903e6e1beec552396618322e2vboxsync * @return corresponding solaris error code.
26456d1900aba0e903e6e1beec552396618322e2vboxsync */
26456d1900aba0e903e6e1beec552396618322e2vboxsyncstatic int VBoxVideoSolarisGetInfo(dev_info_t *pDip, ddi_info_cmd_t enmCmd, void *pvArg, void **ppvResult)
26456d1900aba0e903e6e1beec552396618322e2vboxsync{
26456d1900aba0e903e6e1beec552396618322e2vboxsync LogFlow((DEVICE_NAME ":VBoxGuestSolarisGetInfo\n"));
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync int rc = DDI_FAILURE;
26456d1900aba0e903e6e1beec552396618322e2vboxsync int Instance = drm_dev_to_instance((dev_t)pvArg);
26456d1900aba0e903e6e1beec552396618322e2vboxsync drm_device_t *pState = NULL;
26456d1900aba0e903e6e1beec552396618322e2vboxsync switch (enmCmd)
26456d1900aba0e903e6e1beec552396618322e2vboxsync {
26456d1900aba0e903e6e1beec552396618322e2vboxsync case DDI_INFO_DEVT2DEVINFO:
26456d1900aba0e903e6e1beec552396618322e2vboxsync {
26456d1900aba0e903e6e1beec552396618322e2vboxsync pState = ddi_get_soft_state(g_pVBoxVideoSolarisState, Instance);
26456d1900aba0e903e6e1beec552396618322e2vboxsync if ( pState
26456d1900aba0e903e6e1beec552396618322e2vboxsync && pState->dip)
26456d1900aba0e903e6e1beec552396618322e2vboxsync {
26456d1900aba0e903e6e1beec552396618322e2vboxsync *ppvResult = (void *)pState->dip;
26456d1900aba0e903e6e1beec552396618322e2vboxsync rc = DDI_SUCCESS;
26456d1900aba0e903e6e1beec552396618322e2vboxsync }
26456d1900aba0e903e6e1beec552396618322e2vboxsync else
6a4c7474dbecb411cc7288459141b7cdd654ab3bvboxsync {
26456d1900aba0e903e6e1beec552396618322e2vboxsync LogRel((DEVICE_NAME ":VBoxGuestSolarisGetInfo state or state's devinfo invalid.\n"));
26456d1900aba0e903e6e1beec552396618322e2vboxsync rc = DDI_FAILURE;
26456d1900aba0e903e6e1beec552396618322e2vboxsync }
26456d1900aba0e903e6e1beec552396618322e2vboxsync break;
26456d1900aba0e903e6e1beec552396618322e2vboxsync }
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync case DDI_INFO_DEVT2INSTANCE:
26456d1900aba0e903e6e1beec552396618322e2vboxsync {
26456d1900aba0e903e6e1beec552396618322e2vboxsync *ppvResult = (void *)(uintptr_t)Instance;
26456d1900aba0e903e6e1beec552396618322e2vboxsync rc = DDI_SUCCESS;
26456d1900aba0e903e6e1beec552396618322e2vboxsync break;
26456d1900aba0e903e6e1beec552396618322e2vboxsync }
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync default:
26456d1900aba0e903e6e1beec552396618322e2vboxsync {
26456d1900aba0e903e6e1beec552396618322e2vboxsync rc = DDI_FAILURE;
26456d1900aba0e903e6e1beec552396618322e2vboxsync break;
26456d1900aba0e903e6e1beec552396618322e2vboxsync }
26456d1900aba0e903e6e1beec552396618322e2vboxsync }
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync return rc;
26456d1900aba0e903e6e1beec552396618322e2vboxsync}
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync
742ee7392dfc0ce0b48216189ce26534208b3f48vboxsyncstatic int vboxVideoSolarisLoad(drm_device_t *pDevice, unsigned long fFlag)
26456d1900aba0e903e6e1beec552396618322e2vboxsync{
26456d1900aba0e903e6e1beec552396618322e2vboxsync return 0;
26456d1900aba0e903e6e1beec552396618322e2vboxsync}
26456d1900aba0e903e6e1beec552396618322e2vboxsync
742ee7392dfc0ce0b48216189ce26534208b3f48vboxsyncstatic int vboxVideoSolarisUnload(drm_device_t *pDevice)
26456d1900aba0e903e6e1beec552396618322e2vboxsync{
26456d1900aba0e903e6e1beec552396618322e2vboxsync return 0;
26456d1900aba0e903e6e1beec552396618322e2vboxsync}
26456d1900aba0e903e6e1beec552396618322e2vboxsync
742ee7392dfc0ce0b48216189ce26534208b3f48vboxsyncstatic void vboxVideoSolarisLastClose(drm_device_t *pDevice)
742ee7392dfc0ce0b48216189ce26534208b3f48vboxsync{
742ee7392dfc0ce0b48216189ce26534208b3f48vboxsync}
742ee7392dfc0ce0b48216189ce26534208b3f48vboxsync
742ee7392dfc0ce0b48216189ce26534208b3f48vboxsyncstatic void vboxVideoSolarisPreClose(drm_device_t *pDevice, drm_file_t *pFile)
26456d1900aba0e903e6e1beec552396618322e2vboxsync{
26456d1900aba0e903e6e1beec552396618322e2vboxsync}
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsyncstatic void vboxVideoSolarisConfigure(drm_driver_t *pDriver)
26456d1900aba0e903e6e1beec552396618322e2vboxsync{
26456d1900aba0e903e6e1beec552396618322e2vboxsync /*
26456d1900aba0e903e6e1beec552396618322e2vboxsync * DRM entry points, use the common DRM extension wherever possible.
26456d1900aba0e903e6e1beec552396618322e2vboxsync */
26456d1900aba0e903e6e1beec552396618322e2vboxsync pDriver->buf_priv_size = 1;
26456d1900aba0e903e6e1beec552396618322e2vboxsync pDriver->load = vboxVideoSolarisLoad;
26456d1900aba0e903e6e1beec552396618322e2vboxsync pDriver->unload = vboxVideoSolarisUnload;
26456d1900aba0e903e6e1beec552396618322e2vboxsync pDriver->preclose = vboxVideoSolarisPreClose;
742ee7392dfc0ce0b48216189ce26534208b3f48vboxsync pDriver->lastclose = vboxVideoSolarisLastClose;
26456d1900aba0e903e6e1beec552396618322e2vboxsync pDriver->device_is_agp = drm_device_is_agp;
26456d1900aba0e903e6e1beec552396618322e2vboxsync#if 0
26456d1900aba0e903e6e1beec552396618322e2vboxsync pDriver->get_vblank_counter = drm_vblank_count;
26456d1900aba0e903e6e1beec552396618322e2vboxsync pDriver->enable_vblank = NULL;
26456d1900aba0e903e6e1beec552396618322e2vboxsync pDriver->disable_vblank = NULL;
26456d1900aba0e903e6e1beec552396618322e2vboxsync pDriver->irq_install = drm_driver_irq_install;
26456d1900aba0e903e6e1beec552396618322e2vboxsync pDriver->irq_preinstall = drm_driver_irq_preinstall;
26456d1900aba0e903e6e1beec552396618322e2vboxsync pDriver->irq_postinstall = drm_driver_irq_postinstall;
26456d1900aba0e903e6e1beec552396618322e2vboxsync pDirver->irq_uninstall = drm_driver_irq_uninstall;
26456d1900aba0e903e6e1beec552396618322e2vboxsync pDriver->irq_handler = drm_driver_irq_handler;
26456d1900aba0e903e6e1beec552396618322e2vboxsync
2084a447d1acb619df7c393fac41b79d517e4b3dvboxsync pDriver->driver_ioctls =
2084a447d1acb619df7c393fac41b79d517e4b3dvboxsync pDriver->max_driver_ioctls =
26456d1900aba0e903e6e1beec552396618322e2vboxsync#endif
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync pDriver->driver_name = DRIVER_NAME;
26456d1900aba0e903e6e1beec552396618322e2vboxsync pDriver->driver_desc = DRIVER_DESC;
26456d1900aba0e903e6e1beec552396618322e2vboxsync pDriver->driver_date = DRIVER_DATE;
26456d1900aba0e903e6e1beec552396618322e2vboxsync pDriver->driver_major = DRIVER_MAJOR;
26456d1900aba0e903e6e1beec552396618322e2vboxsync pDriver->driver_minor = DRIVER_MINOR;
26456d1900aba0e903e6e1beec552396618322e2vboxsync pDriver->driver_patchlevel = DRIVER_PATCHLEVEL;
26456d1900aba0e903e6e1beec552396618322e2vboxsync
26456d1900aba0e903e6e1beec552396618322e2vboxsync pDriver->use_agp = 1;
26456d1900aba0e903e6e1beec552396618322e2vboxsync pDriver->require_agp = 1;
26456d1900aba0e903e6e1beec552396618322e2vboxsync pDriver->use_irq = 1;
26456d1900aba0e903e6e1beec552396618322e2vboxsync}
26456d1900aba0e903e6e1beec552396618322e2vboxsync