e57b9183811d515e3bbcd1a104516f0102fde114cg/*
e57b9183811d515e3bbcd1a104516f0102fde114cg * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
e57b9183811d515e3bbcd1a104516f0102fde114cg * Use is subject to license terms.
e57b9183811d515e3bbcd1a104516f0102fde114cg */
e57b9183811d515e3bbcd1a104516f0102fde114cg/*
e57b9183811d515e3bbcd1a104516f0102fde114cg * radeon_drv.c -- ATI Radeon driver -*- linux-c -*-
e57b9183811d515e3bbcd1a104516f0102fde114cg * Created: Wed Feb 14 17:10:04 2001 by gareth@valinux.com
e57b9183811d515e3bbcd1a104516f0102fde114cg */
e57b9183811d515e3bbcd1a104516f0102fde114cg/*
e57b9183811d515e3bbcd1a104516f0102fde114cg * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
e57b9183811d515e3bbcd1a104516f0102fde114cg * All Rights Reserved.
e57b9183811d515e3bbcd1a104516f0102fde114cg *
e57b9183811d515e3bbcd1a104516f0102fde114cg * Permission is hereby granted, free of charge, to any person obtaining a
e57b9183811d515e3bbcd1a104516f0102fde114cg * copy of this software and associated documentation files (the "Software"),
e57b9183811d515e3bbcd1a104516f0102fde114cg * to deal in the Software without restriction, including without limitation
e57b9183811d515e3bbcd1a104516f0102fde114cg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
e57b9183811d515e3bbcd1a104516f0102fde114cg * and/or sell copies of the Software, and to permit persons to whom the
e57b9183811d515e3bbcd1a104516f0102fde114cg * Software is furnished to do so, subject to the following conditions:
e57b9183811d515e3bbcd1a104516f0102fde114cg *
e57b9183811d515e3bbcd1a104516f0102fde114cg * The above copyright notice and this permission notice (including the next
e57b9183811d515e3bbcd1a104516f0102fde114cg * paragraph) shall be included in all copies or substantial portions of the
e57b9183811d515e3bbcd1a104516f0102fde114cg * Software.
e57b9183811d515e3bbcd1a104516f0102fde114cg *
e57b9183811d515e3bbcd1a104516f0102fde114cg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
e57b9183811d515e3bbcd1a104516f0102fde114cg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
e57b9183811d515e3bbcd1a104516f0102fde114cg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
e57b9183811d515e3bbcd1a104516f0102fde114cg * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
e57b9183811d515e3bbcd1a104516f0102fde114cg * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
e57b9183811d515e3bbcd1a104516f0102fde114cg * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
e57b9183811d515e3bbcd1a104516f0102fde114cg * OTHER DEALINGS IN THE SOFTWARE.
e57b9183811d515e3bbcd1a104516f0102fde114cg *
e57b9183811d515e3bbcd1a104516f0102fde114cg * Authors:
e57b9183811d515e3bbcd1a104516f0102fde114cg * Gareth Hughes <gareth@valinux.com>
e57b9183811d515e3bbcd1a104516f0102fde114cg *
e57b9183811d515e3bbcd1a104516f0102fde114cg */
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cg#include "drmP.h"
e57b9183811d515e3bbcd1a104516f0102fde114cg#include "drm.h"
e57b9183811d515e3bbcd1a104516f0102fde114cg#include "radeon_drm.h"
e57b9183811d515e3bbcd1a104516f0102fde114cg#include "radeon_drv.h"
e57b9183811d515e3bbcd1a104516f0102fde114cg#include "drm_pciids.h"
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cgint radeon_no_wb = 1;
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cg/*
e57b9183811d515e3bbcd1a104516f0102fde114cg * cb_ops entrypoint
e57b9183811d515e3bbcd1a104516f0102fde114cg */
e57b9183811d515e3bbcd1a104516f0102fde114cgextern struct cb_ops drm_cb_ops;
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cg/* drv_PCI_IDs comes from drm_pciids.h */
e57b9183811d515e3bbcd1a104516f0102fde114cgstatic drm_pci_id_list_t radeon_pciidlist[] = {
e57b9183811d515e3bbcd1a104516f0102fde114cg radeon_PCI_IDS
e57b9183811d515e3bbcd1a104516f0102fde114cg};
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cg/*
e57b9183811d515e3bbcd1a104516f0102fde114cg * module entrypoint
e57b9183811d515e3bbcd1a104516f0102fde114cg */
e57b9183811d515e3bbcd1a104516f0102fde114cgstatic int radeon_info(dev_info_t *, ddi_info_cmd_t, void *, void **);
e57b9183811d515e3bbcd1a104516f0102fde114cgstatic int radeon_attach(dev_info_t *, ddi_attach_cmd_t);
e57b9183811d515e3bbcd1a104516f0102fde114cgstatic int radeon_detach(dev_info_t *, ddi_detach_cmd_t);
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cgextern void radeon_init_ioctl_arrays(void);
e57b9183811d515e3bbcd1a104516f0102fde114cgextern uint_t radeon_driver_irq_handler(caddr_t);
e57b9183811d515e3bbcd1a104516f0102fde114cgextern int drm_get_pci_index_reg(dev_info_t *, uint_t, uint_t, off_t *);
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cg/*
e57b9183811d515e3bbcd1a104516f0102fde114cg * Local routines
e57b9183811d515e3bbcd1a104516f0102fde114cg */
e57b9183811d515e3bbcd1a104516f0102fde114cgstatic void radeon_configure(drm_driver_t *);
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cg/*
e57b9183811d515e3bbcd1a104516f0102fde114cg * DRM driver
e57b9183811d515e3bbcd1a104516f0102fde114cg */
e57b9183811d515e3bbcd1a104516f0102fde114cgstatic drm_driver_t radeon_driver = {0};
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cgstatic struct dev_ops radeon_dev_ops = {
e57b9183811d515e3bbcd1a104516f0102fde114cg DEVO_REV, /* devo_rev */
e57b9183811d515e3bbcd1a104516f0102fde114cg 0, /* devo_refcnt */
e57b9183811d515e3bbcd1a104516f0102fde114cg radeon_info, /* devo_getinfo */
e57b9183811d515e3bbcd1a104516f0102fde114cg nulldev, /* devo_identify */
e57b9183811d515e3bbcd1a104516f0102fde114cg nulldev, /* devo_probe */
e57b9183811d515e3bbcd1a104516f0102fde114cg radeon_attach, /* devo_attach */
e57b9183811d515e3bbcd1a104516f0102fde114cg radeon_detach, /* devo_detach */
e57b9183811d515e3bbcd1a104516f0102fde114cg nodev, /* devo_reset */
193974072f41a843678abf5f61979c748687e66bSherry Moore &drm_cb_ops, /* devo_cb_ops */
e57b9183811d515e3bbcd1a104516f0102fde114cg NULL, /* devo_bus_ops */
193974072f41a843678abf5f61979c748687e66bSherry Moore NULL, /* power */
193974072f41a843678abf5f61979c748687e66bSherry Moore ddi_quiesce_not_supported, /* devo_quiesce */
e57b9183811d515e3bbcd1a104516f0102fde114cg};
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cgstatic struct modldrv modldrv = {
e57b9183811d515e3bbcd1a104516f0102fde114cg &mod_driverops, /* drv_modops */
613b28719c10e84c1202c1045df44d77767de21dRichard Bean "radeon DRM driver", /* drv_linkinfo */
e57b9183811d515e3bbcd1a104516f0102fde114cg &radeon_dev_ops, /* drv_dev_ops */
e57b9183811d515e3bbcd1a104516f0102fde114cg};
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cgstatic struct modlinkage modlinkage = {
e57b9183811d515e3bbcd1a104516f0102fde114cg MODREV_1, (void *) &modldrv, NULL
e57b9183811d515e3bbcd1a104516f0102fde114cg};
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cg/*
e57b9183811d515e3bbcd1a104516f0102fde114cg * softstate head
e57b9183811d515e3bbcd1a104516f0102fde114cg */
e57b9183811d515e3bbcd1a104516f0102fde114cgstatic void *radeon_statep;
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cgint
e57b9183811d515e3bbcd1a104516f0102fde114cg_init(void)
e57b9183811d515e3bbcd1a104516f0102fde114cg{
e57b9183811d515e3bbcd1a104516f0102fde114cg int error;
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cg radeon_configure(&radeon_driver);
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cg if ((error = ddi_soft_state_init(&radeon_statep,
e57b9183811d515e3bbcd1a104516f0102fde114cg sizeof (drm_device_t), DRM_MAX_INSTANCES)) != 0)
e57b9183811d515e3bbcd1a104516f0102fde114cg return (error);
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cg if ((error = mod_install(&modlinkage)) != 0) {
e57b9183811d515e3bbcd1a104516f0102fde114cg ddi_soft_state_fini(&radeon_statep);
e57b9183811d515e3bbcd1a104516f0102fde114cg return (error);
e57b9183811d515e3bbcd1a104516f0102fde114cg }
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cg return (error);
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cg} /* _init() */
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cgint
e57b9183811d515e3bbcd1a104516f0102fde114cg_fini(void)
e57b9183811d515e3bbcd1a104516f0102fde114cg{
e57b9183811d515e3bbcd1a104516f0102fde114cg int error;
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cg if ((error = mod_remove(&modlinkage)) != 0)
e57b9183811d515e3bbcd1a104516f0102fde114cg return (error);
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cg (void) ddi_soft_state_fini(&radeon_statep);
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cg return (0);
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cg} /* _fini() */
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cgint
e57b9183811d515e3bbcd1a104516f0102fde114cg_info(struct modinfo *modinfop)
e57b9183811d515e3bbcd1a104516f0102fde114cg{
e57b9183811d515e3bbcd1a104516f0102fde114cg return (mod_info(&modlinkage, modinfop));
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cg} /* _info() */
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cgstatic int
e57b9183811d515e3bbcd1a104516f0102fde114cgradeon_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
e57b9183811d515e3bbcd1a104516f0102fde114cg{
e57b9183811d515e3bbcd1a104516f0102fde114cg drm_device_t *statep;
e57b9183811d515e3bbcd1a104516f0102fde114cg void *handle;
e57b9183811d515e3bbcd1a104516f0102fde114cg int unit;
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cg if (cmd != DDI_ATTACH) {
e57b9183811d515e3bbcd1a104516f0102fde114cg DRM_ERROR("radeon_attach: only attach op supported");
e57b9183811d515e3bbcd1a104516f0102fde114cg return (DDI_FAILURE);
e57b9183811d515e3bbcd1a104516f0102fde114cg }
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cg unit = ddi_get_instance(dip);
e57b9183811d515e3bbcd1a104516f0102fde114cg if (ddi_soft_state_zalloc(radeon_statep, unit) != DDI_SUCCESS) {
e57b9183811d515e3bbcd1a104516f0102fde114cg cmn_err(CE_WARN,
e57b9183811d515e3bbcd1a104516f0102fde114cg "radeon_attach: alloc softstate failed unit=%d", unit);
e57b9183811d515e3bbcd1a104516f0102fde114cg return (DDI_FAILURE);
e57b9183811d515e3bbcd1a104516f0102fde114cg }
e57b9183811d515e3bbcd1a104516f0102fde114cg statep = ddi_get_soft_state(radeon_statep, unit);
e57b9183811d515e3bbcd1a104516f0102fde114cg statep->dip = dip;
e57b9183811d515e3bbcd1a104516f0102fde114cg statep->driver = &radeon_driver;
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cg /*
e57b9183811d515e3bbcd1a104516f0102fde114cg * Call drm_supp_register to create minor nodes for us
e57b9183811d515e3bbcd1a104516f0102fde114cg */
e57b9183811d515e3bbcd1a104516f0102fde114cg handle = drm_supp_register(dip, statep);
e57b9183811d515e3bbcd1a104516f0102fde114cg if (handle == NULL) {
e57b9183811d515e3bbcd1a104516f0102fde114cg DRM_ERROR("radeon_attach: drm_supp_register failed");
e57b9183811d515e3bbcd1a104516f0102fde114cg goto err_exit1;
e57b9183811d515e3bbcd1a104516f0102fde114cg }
e57b9183811d515e3bbcd1a104516f0102fde114cg statep->drm_handle = handle;
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cg /*
e57b9183811d515e3bbcd1a104516f0102fde114cg * After drm_supp_register, we can call drm_xxx routine
e57b9183811d515e3bbcd1a104516f0102fde114cg */
e57b9183811d515e3bbcd1a104516f0102fde114cg statep->drm_supported = DRM_UNSUPPORT;
e57b9183811d515e3bbcd1a104516f0102fde114cg if (drm_probe(statep, radeon_pciidlist) != DDI_SUCCESS) {
e57b9183811d515e3bbcd1a104516f0102fde114cg DRM_ERROR("radeon_open: "
e57b9183811d515e3bbcd1a104516f0102fde114cg "DRM current don't support this graphics card");
e57b9183811d515e3bbcd1a104516f0102fde114cg goto err_exit2;
e57b9183811d515e3bbcd1a104516f0102fde114cg }
e57b9183811d515e3bbcd1a104516f0102fde114cg statep->drm_supported = DRM_SUPPORT;
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cg /* call common attach code */
e57b9183811d515e3bbcd1a104516f0102fde114cg if (drm_attach(statep) != DDI_SUCCESS) {
e57b9183811d515e3bbcd1a104516f0102fde114cg DRM_ERROR("radeon_attach: drm_attach failed");
e57b9183811d515e3bbcd1a104516f0102fde114cg goto err_exit2;
e57b9183811d515e3bbcd1a104516f0102fde114cg }
e57b9183811d515e3bbcd1a104516f0102fde114cg return (DDI_SUCCESS);
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cgerr_exit2:
e57b9183811d515e3bbcd1a104516f0102fde114cg (void) drm_supp_unregister(handle);
e57b9183811d515e3bbcd1a104516f0102fde114cgerr_exit1:
e57b9183811d515e3bbcd1a104516f0102fde114cg (void) ddi_soft_state_free(radeon_statep, unit);
e57b9183811d515e3bbcd1a104516f0102fde114cg return (DDI_FAILURE);
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cg} /* radeon_attach() */
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cgstatic int
e57b9183811d515e3bbcd1a104516f0102fde114cgradeon_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
e57b9183811d515e3bbcd1a104516f0102fde114cg{
e57b9183811d515e3bbcd1a104516f0102fde114cg drm_device_t *statep;
e57b9183811d515e3bbcd1a104516f0102fde114cg int unit;
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cg if (cmd != DDI_DETACH)
e57b9183811d515e3bbcd1a104516f0102fde114cg return (DDI_FAILURE);
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cg unit = ddi_get_instance(dip);
e57b9183811d515e3bbcd1a104516f0102fde114cg statep = ddi_get_soft_state(radeon_statep, unit);
e57b9183811d515e3bbcd1a104516f0102fde114cg if (statep == NULL)
e57b9183811d515e3bbcd1a104516f0102fde114cg return (DDI_FAILURE);
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cg (void) drm_detach(statep);
e57b9183811d515e3bbcd1a104516f0102fde114cg (void) drm_supp_unregister(statep->drm_handle);
e57b9183811d515e3bbcd1a104516f0102fde114cg (void) ddi_soft_state_free(radeon_statep, unit);
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cg return (DDI_SUCCESS);
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cg} /* radeon_detach() */
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cg/*ARGSUSED*/
e57b9183811d515e3bbcd1a104516f0102fde114cgstatic int
e57b9183811d515e3bbcd1a104516f0102fde114cgradeon_info(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg, void **result)
e57b9183811d515e3bbcd1a104516f0102fde114cg{
e57b9183811d515e3bbcd1a104516f0102fde114cg drm_device_t *statep;
e57b9183811d515e3bbcd1a104516f0102fde114cg int error = DDI_SUCCESS;
e57b9183811d515e3bbcd1a104516f0102fde114cg int unit;
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cg unit = drm_dev_to_instance((dev_t)arg);
e57b9183811d515e3bbcd1a104516f0102fde114cg switch (infocmd) {
e57b9183811d515e3bbcd1a104516f0102fde114cg case DDI_INFO_DEVT2DEVINFO:
e57b9183811d515e3bbcd1a104516f0102fde114cg statep = ddi_get_soft_state(radeon_statep, unit);
e57b9183811d515e3bbcd1a104516f0102fde114cg if (statep == NULL || statep->dip == NULL) {
e57b9183811d515e3bbcd1a104516f0102fde114cg error = DDI_FAILURE;
e57b9183811d515e3bbcd1a104516f0102fde114cg } else {
e57b9183811d515e3bbcd1a104516f0102fde114cg *result = (void *) statep->dip;
e57b9183811d515e3bbcd1a104516f0102fde114cg error = DDI_SUCCESS;
e57b9183811d515e3bbcd1a104516f0102fde114cg }
e57b9183811d515e3bbcd1a104516f0102fde114cg break;
e57b9183811d515e3bbcd1a104516f0102fde114cg case DDI_INFO_DEVT2INSTANCE:
e57b9183811d515e3bbcd1a104516f0102fde114cg *result = (void *)(uintptr_t)unit;
e57b9183811d515e3bbcd1a104516f0102fde114cg error = DDI_SUCCESS;
e57b9183811d515e3bbcd1a104516f0102fde114cg break;
e57b9183811d515e3bbcd1a104516f0102fde114cg default:
e57b9183811d515e3bbcd1a104516f0102fde114cg error = DDI_FAILURE;
e57b9183811d515e3bbcd1a104516f0102fde114cg break;
e57b9183811d515e3bbcd1a104516f0102fde114cg }
e57b9183811d515e3bbcd1a104516f0102fde114cg return (error);
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cg} /* radeon_info() */
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cgstatic void
e57b9183811d515e3bbcd1a104516f0102fde114cgradeon_configure(drm_driver_t *driver)
e57b9183811d515e3bbcd1a104516f0102fde114cg{
e57b9183811d515e3bbcd1a104516f0102fde114cg driver->buf_priv_size = sizeof (drm_radeon_buf_priv_t);
e57b9183811d515e3bbcd1a104516f0102fde114cg driver->load = radeon_driver_load;
e57b9183811d515e3bbcd1a104516f0102fde114cg driver->unload = radeon_driver_unload;
e57b9183811d515e3bbcd1a104516f0102fde114cg driver->firstopen = radeon_driver_firstopen;
e57b9183811d515e3bbcd1a104516f0102fde114cg driver->open = radeon_driver_open;
e57b9183811d515e3bbcd1a104516f0102fde114cg driver->preclose = radeon_driver_preclose;
e57b9183811d515e3bbcd1a104516f0102fde114cg driver->postclose = radeon_driver_postclose;
e57b9183811d515e3bbcd1a104516f0102fde114cg driver->lastclose = radeon_driver_lastclose;
e57b9183811d515e3bbcd1a104516f0102fde114cg driver->vblank_wait = radeon_driver_vblank_wait;
e57b9183811d515e3bbcd1a104516f0102fde114cg driver->vblank_wait2 = radeon_driver_vblank_wait2;
e57b9183811d515e3bbcd1a104516f0102fde114cg driver->irq_preinstall = radeon_driver_irq_preinstall;
e57b9183811d515e3bbcd1a104516f0102fde114cg driver->irq_postinstall = radeon_driver_irq_postinstall;
e57b9183811d515e3bbcd1a104516f0102fde114cg driver->irq_uninstall = radeon_driver_irq_uninstall;
e57b9183811d515e3bbcd1a104516f0102fde114cg driver->irq_handler = radeon_driver_irq_handler;
e57b9183811d515e3bbcd1a104516f0102fde114cg driver->dma_ioctl = radeon_cp_buffers;
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cg driver->driver_ioctls = radeon_ioctls;
e57b9183811d515e3bbcd1a104516f0102fde114cg driver->max_driver_ioctl = radeon_max_ioctl;
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cg driver->driver_name = DRIVER_NAME;
e57b9183811d515e3bbcd1a104516f0102fde114cg driver->driver_desc = DRIVER_DESC;
e57b9183811d515e3bbcd1a104516f0102fde114cg driver->driver_date = DRIVER_DATE;
e57b9183811d515e3bbcd1a104516f0102fde114cg driver->driver_major = DRIVER_MAJOR;
e57b9183811d515e3bbcd1a104516f0102fde114cg driver->driver_minor = DRIVER_MINOR;
e57b9183811d515e3bbcd1a104516f0102fde114cg driver->driver_patchlevel = DRIVER_PATCHLEVEL;
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cg driver->use_agp = 1;
e57b9183811d515e3bbcd1a104516f0102fde114cg driver->use_mtrr = 1;
e57b9183811d515e3bbcd1a104516f0102fde114cg driver->use_pci_dma = 1;
e57b9183811d515e3bbcd1a104516f0102fde114cg driver->use_sg = 1;
e57b9183811d515e3bbcd1a104516f0102fde114cg driver->use_dma = 1;
e57b9183811d515e3bbcd1a104516f0102fde114cg driver->use_irq = 1;
e57b9183811d515e3bbcd1a104516f0102fde114cg driver->use_vbl_irq = 1;
e57b9183811d515e3bbcd1a104516f0102fde114cg driver->use_vbl_irq2 = 1;
e57b9183811d515e3bbcd1a104516f0102fde114cg
e57b9183811d515e3bbcd1a104516f0102fde114cg} /* radeon_configure() */