r128_drv.c revision b5e89ed53ed8d24f83ba1941c07382af00ed238e
1b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland/* r128_drv.c -- ATI Rage 128 driver -*- linux-c -*-
2b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland * Created: Mon Dec 13 09:47:27 1999 by faith@precisioninsight.com
3cf45b752c9f23939e40d823b0600bf876e97b0e0Bob Peterson *
4b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
5b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
6b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland * All Rights Reserved.
7e9fc2aa091ab8fa46e60d4c9d06a89305c441652Steven Whitehouse *
8b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland * Permission is hereby granted, free of charge, to any person obtaining a
9b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland * copy of this software and associated documentation files (the "Software"),
10b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland * to deal in the Software without restriction, including without limitation
11b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland * and/or sell copies of the Software, and to permit persons to whom the
13b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland * Software is furnished to do so, subject to the following conditions:
14b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland *
15b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland * The above copyright notice and this permission notice (including the next
16b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland * paragraph) shall be included in all copies or substantial portions of the
178638460540749ddb1beca9e9a68d655a6fe6df65Abhijith Das * Software.
188638460540749ddb1beca9e9a68d655a6fe6df65Abhijith Das *
195c676f6d359b0404d53f542f02e1359583cb2895Steven Whitehouse * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20fe64d517df0970a68417184a12fcd4ba0589cc28Steven Whitehouse * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21cc632e7f93465597896862cf9e50baefb1999215Steven Whitehouse * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
22b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
23b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
245c676f6d359b0404d53f542f02e1359583cb2895Steven Whitehouse * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
25da6dd40d59fa9617ed697b90114e197036901632Bob Peterson * OTHER DEALINGS IN THE SOFTWARE.
26b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland *
27b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland * Authors:
28b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland *    Rickard E. (Rik) Faith <faith@valinux.com>
29b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland *    Gareth Hughes <gareth@valinux.com>
30b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland */
31b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland
32b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland#include <linux/config.h>
335c676f6d359b0404d53f542f02e1359583cb2895Steven Whitehouse#include "drmP.h"
34bb3b0e3df5420fdf2c6bbb4417525c6d2ef55bbbSteven Whitehouse#include "drm.h"
359ac1b4d9b6f885ccd7d8f56bceb609003a920ff7Steven Whitehouse#include "r128_drm.h"
36b52896813c2f16bcc5c5b67bb3c3f75bc084439bSteven Whitehouse#include "r128_drv.h"
3763997775b795f97ef51f3e56bc3abc9edc04bbb0Steven Whitehouse
38b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland#include "drm_pciids.h"
39b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland
40b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teiglandstatic int postinit(struct drm_device *dev, unsigned long flags)
41b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland{
429b8df98fc8973ad1c5f0d7c4cf71c7fb84fe22c5Steven Whitehouse	DRM_INFO("Initialized %s %d.%d.%d %s on minor %d: %s\n",
439b8df98fc8973ad1c5f0d7c4cf71c7fb84fe22c5Steven Whitehouse		 DRIVER_NAME,
449b8df98fc8973ad1c5f0d7c4cf71c7fb84fe22c5Steven Whitehouse		 DRIVER_MAJOR,
459b8df98fc8973ad1c5f0d7c4cf71c7fb84fe22c5Steven Whitehouse		 DRIVER_MINOR,
469b8df98fc8973ad1c5f0d7c4cf71c7fb84fe22c5Steven Whitehouse		 DRIVER_PATCHLEVEL,
479b8df98fc8973ad1c5f0d7c4cf71c7fb84fe22c5Steven Whitehouse		 DRIVER_DATE, dev->primary.minor, pci_pretty_name(dev->pdev)
489b8df98fc8973ad1c5f0d7c4cf71c7fb84fe22c5Steven Whitehouse	    );
499b8df98fc8973ad1c5f0d7c4cf71c7fb84fe22c5Steven Whitehouse	return 0;
509b8df98fc8973ad1c5f0d7c4cf71c7fb84fe22c5Steven Whitehouse}
519b8df98fc8973ad1c5f0d7c4cf71c7fb84fe22c5Steven Whitehouse
529b8df98fc8973ad1c5f0d7c4cf71c7fb84fe22c5Steven Whitehousestatic int version(drm_version_t * version)
539b8df98fc8973ad1c5f0d7c4cf71c7fb84fe22c5Steven Whitehouse{
549b8df98fc8973ad1c5f0d7c4cf71c7fb84fe22c5Steven Whitehouse	int len;
559b8df98fc8973ad1c5f0d7c4cf71c7fb84fe22c5Steven Whitehouse
569b8df98fc8973ad1c5f0d7c4cf71c7fb84fe22c5Steven Whitehouse	version->version_major = DRIVER_MAJOR;
579b8df98fc8973ad1c5f0d7c4cf71c7fb84fe22c5Steven Whitehouse	version->version_minor = DRIVER_MINOR;
589b8df98fc8973ad1c5f0d7c4cf71c7fb84fe22c5Steven Whitehouse	version->version_patchlevel = DRIVER_PATCHLEVEL;
599b8df98fc8973ad1c5f0d7c4cf71c7fb84fe22c5Steven Whitehouse	DRM_COPY(version->name, DRIVER_NAME);
609b8df98fc8973ad1c5f0d7c4cf71c7fb84fe22c5Steven Whitehouse	DRM_COPY(version->date, DRIVER_DATE);
619b8df98fc8973ad1c5f0d7c4cf71c7fb84fe22c5Steven Whitehouse	DRM_COPY(version->desc, DRIVER_DESC);
629b8df98fc8973ad1c5f0d7c4cf71c7fb84fe22c5Steven Whitehouse	return 0;
639b8df98fc8973ad1c5f0d7c4cf71c7fb84fe22c5Steven Whitehouse}
649b8df98fc8973ad1c5f0d7c4cf71c7fb84fe22c5Steven Whitehouse
659b8df98fc8973ad1c5f0d7c4cf71c7fb84fe22c5Steven Whitehousestatic struct pci_device_id pciidlist[] = {
669b8df98fc8973ad1c5f0d7c4cf71c7fb84fe22c5Steven Whitehouse	r128_PCI_IDS
679b8df98fc8973ad1c5f0d7c4cf71c7fb84fe22c5Steven Whitehouse};
689b8df98fc8973ad1c5f0d7c4cf71c7fb84fe22c5Steven Whitehouse
699b8df98fc8973ad1c5f0d7c4cf71c7fb84fe22c5Steven Whitehouseextern drm_ioctl_desc_t r128_ioctls[];
709b8df98fc8973ad1c5f0d7c4cf71c7fb84fe22c5Steven Whitehouseextern int r128_max_ioctl;
719b8df98fc8973ad1c5f0d7c4cf71c7fb84fe22c5Steven Whitehouse
72b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teiglandstatic struct drm_driver driver = {
73b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland	.driver_features =
74b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland	    DRIVER_USE_AGP | DRIVER_USE_MTRR | DRIVER_PCI_DMA | DRIVER_SG |
75b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland	    DRIVER_HAVE_DMA | DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED |
7685d1da67f7e1239afa3494d05be87da6fc3ecadaSteven Whitehouse	    DRIVER_IRQ_VBL,
77b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland	.dev_priv_size = sizeof(drm_r128_buf_priv_t),
78b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland	.prerelease = r128_driver_prerelease,
79b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland	.pretakedown = r128_driver_pretakedown,
805c676f6d359b0404d53f542f02e1359583cb2895Steven Whitehouse	.vblank_wait = r128_driver_vblank_wait,
81b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland	.irq_preinstall = r128_driver_irq_preinstall,
82b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland	.irq_postinstall = r128_driver_irq_postinstall,
83b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland	.irq_uninstall = r128_driver_irq_uninstall,
84b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland	.irq_handler = r128_driver_irq_handler,
85e402746a945ceb9d0486a8e3d5917c9228fa4404Steven Whitehouse	.reclaim_buffers = drm_core_reclaim_buffers,
86e402746a945ceb9d0486a8e3d5917c9228fa4404Steven Whitehouse	.get_map_ofs = drm_core_get_map_ofs,
87b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland	.get_reg_ofs = drm_core_get_reg_ofs,
88b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland	.postinit = postinit,
89b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland	.version = version,
90f55ab26a8f92a23988c3e6da28dae4741933a4e2Steven Whitehouse	.ioctls = r128_ioctls,
91b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland	.dma_ioctl = r128_cce_buffers,
92b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland	.fops = {
93b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland		 .owner = THIS_MODULE,
94b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland		 .open = drm_open,
95b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland		 .release = drm_release,
96f55ab26a8f92a23988c3e6da28dae4741933a4e2Steven Whitehouse		 .ioctl = drm_ioctl,
97b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland		 .mmap = drm_mmap,
98b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland		 .poll = drm_poll,
99f55ab26a8f92a23988c3e6da28dae4741933a4e2Steven Whitehouse		 .fasync = drm_fasync,
10037b2c8377c98acb60cf4d0126e385ef2153bded9Steven Whitehouse#ifdef CONFIG_COMPAT
101813e0c46c9e2a0c6f0b6e774faac82afd7a2e812Steven Whitehouse		 .compat_ioctl = r128_compat_ioctl,
102813e0c46c9e2a0c6f0b6e774faac82afd7a2e812Steven Whitehouse#endif
103b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland		 }
104b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland	,
105b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland	.pci_driver = {
106b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland		       .name = DRIVER_NAME,
107b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland		       .id_table = pciidlist,
108b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland		       }
109b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland};
110d7b616e252b125f12b007c392f7644053bb6f140Steven Whitehouse
111b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teiglandstatic int __init r128_init(void)
11271b86f562b5eb6f94ea00bba060caa64d0137969Steven Whitehouse{
113b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland	driver.num_ioctls = r128_max_ioctl;
114b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland	return drm_init(&driver);
115b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland}
116484adff8a06cb5d952832f5487ae863f54c0fb69Steven Whitehouse
11716615be18cadf53ee6f8a4f0bdd647f0753421b1Steven Whitehousestatic void __exit r128_exit(void)
11816615be18cadf53ee6f8a4f0bdd647f0753421b1Steven Whitehouse{
119b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland	drm_exit(&driver);
120b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland}
121b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland
122f55ab26a8f92a23988c3e6da28dae4741933a4e2Steven Whitehousemodule_init(r128_init);
123b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teiglandmodule_exit(r128_exit);
124b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid Teigland
125b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid TeiglandMODULE_AUTHOR(DRIVER_AUTHOR);
126b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid TeiglandMODULE_DESCRIPTION(DRIVER_DESC);
127b3b94faa5fe5968827ba0640ee9fba4b3e7f736eDavid TeiglandMODULE_LICENSE("GPL and additional rights");
1289b8df98fc8973ad1c5f0d7c4cf71c7fb84fe22c5Steven Whitehouse