diff options
Diffstat (limited to 'drivers/char/drm/drm_stub.c')
-rw-r--r-- | drivers/char/drm/drm_stub.c | 331 |
1 files changed, 0 insertions, 331 deletions
diff --git a/drivers/char/drm/drm_stub.c b/drivers/char/drm/drm_stub.c deleted file mode 100644 index c2f584f3b46c..000000000000 --- a/drivers/char/drm/drm_stub.c +++ /dev/null | |||
@@ -1,331 +0,0 @@ | |||
1 | /** | ||
2 | * \file drm_stub.h | ||
3 | * Stub support | ||
4 | * | ||
5 | * \author Rickard E. (Rik) Faith <faith@valinux.com> | ||
6 | */ | ||
7 | |||
8 | /* | ||
9 | * Created: Fri Jan 19 10:48:35 2001 by faith@acm.org | ||
10 | * | ||
11 | * Copyright 2001 VA Linux Systems, Inc., Sunnyvale, California. | ||
12 | * All Rights Reserved. | ||
13 | * | ||
14 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
15 | * copy of this software and associated documentation files (the "Software"), | ||
16 | * to deal in the Software without restriction, including without limitation | ||
17 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
18 | * and/or sell copies of the Software, and to permit persons to whom the | ||
19 | * Software is furnished to do so, subject to the following conditions: | ||
20 | * | ||
21 | * The above copyright notice and this permission notice (including the next | ||
22 | * paragraph) shall be included in all copies or substantial portions of the | ||
23 | * Software. | ||
24 | * | ||
25 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
26 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
27 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
28 | * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
29 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
30 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | ||
31 | * DEALINGS IN THE SOFTWARE. | ||
32 | */ | ||
33 | |||
34 | #include <linux/module.h> | ||
35 | #include <linux/moduleparam.h> | ||
36 | #include "drmP.h" | ||
37 | #include "drm_core.h" | ||
38 | |||
39 | unsigned int drm_debug = 0; /* 1 to enable debug output */ | ||
40 | EXPORT_SYMBOL(drm_debug); | ||
41 | |||
42 | MODULE_AUTHOR(CORE_AUTHOR); | ||
43 | MODULE_DESCRIPTION(CORE_DESC); | ||
44 | MODULE_LICENSE("GPL and additional rights"); | ||
45 | MODULE_PARM_DESC(debug, "Enable debug output"); | ||
46 | |||
47 | module_param_named(debug, drm_debug, int, 0600); | ||
48 | |||
49 | struct idr drm_minors_idr; | ||
50 | |||
51 | struct class *drm_class; | ||
52 | struct proc_dir_entry *drm_proc_root; | ||
53 | |||
54 | static int drm_minor_get_id(struct drm_device *dev, int type) | ||
55 | { | ||
56 | int new_id; | ||
57 | int ret; | ||
58 | int base = 0, limit = 63; | ||
59 | |||
60 | again: | ||
61 | if (idr_pre_get(&drm_minors_idr, GFP_KERNEL) == 0) { | ||
62 | DRM_ERROR("Out of memory expanding drawable idr\n"); | ||
63 | return -ENOMEM; | ||
64 | } | ||
65 | mutex_lock(&dev->struct_mutex); | ||
66 | ret = idr_get_new_above(&drm_minors_idr, NULL, | ||
67 | base, &new_id); | ||
68 | mutex_unlock(&dev->struct_mutex); | ||
69 | if (ret == -EAGAIN) { | ||
70 | goto again; | ||
71 | } else if (ret) { | ||
72 | return ret; | ||
73 | } | ||
74 | |||
75 | if (new_id >= limit) { | ||
76 | idr_remove(&drm_minors_idr, new_id); | ||
77 | return -EINVAL; | ||
78 | } | ||
79 | return new_id; | ||
80 | } | ||
81 | |||
82 | static int drm_fill_in_dev(struct drm_device * dev, struct pci_dev *pdev, | ||
83 | const struct pci_device_id *ent, | ||
84 | struct drm_driver *driver) | ||
85 | { | ||
86 | int retcode; | ||
87 | |||
88 | INIT_LIST_HEAD(&dev->filelist); | ||
89 | INIT_LIST_HEAD(&dev->ctxlist); | ||
90 | INIT_LIST_HEAD(&dev->vmalist); | ||
91 | INIT_LIST_HEAD(&dev->maplist); | ||
92 | |||
93 | spin_lock_init(&dev->count_lock); | ||
94 | spin_lock_init(&dev->drw_lock); | ||
95 | spin_lock_init(&dev->tasklet_lock); | ||
96 | spin_lock_init(&dev->lock.spinlock); | ||
97 | init_timer(&dev->timer); | ||
98 | mutex_init(&dev->struct_mutex); | ||
99 | mutex_init(&dev->ctxlist_mutex); | ||
100 | |||
101 | idr_init(&dev->drw_idr); | ||
102 | |||
103 | dev->pdev = pdev; | ||
104 | dev->pci_device = pdev->device; | ||
105 | dev->pci_vendor = pdev->vendor; | ||
106 | |||
107 | #ifdef __alpha__ | ||
108 | dev->hose = pdev->sysdata; | ||
109 | #endif | ||
110 | dev->irq = pdev->irq; | ||
111 | |||
112 | if (drm_ht_create(&dev->map_hash, 12)) { | ||
113 | return -ENOMEM; | ||
114 | } | ||
115 | |||
116 | /* the DRM has 6 basic counters */ | ||
117 | dev->counters = 6; | ||
118 | dev->types[0] = _DRM_STAT_LOCK; | ||
119 | dev->types[1] = _DRM_STAT_OPENS; | ||
120 | dev->types[2] = _DRM_STAT_CLOSES; | ||
121 | dev->types[3] = _DRM_STAT_IOCTLS; | ||
122 | dev->types[4] = _DRM_STAT_LOCKS; | ||
123 | dev->types[5] = _DRM_STAT_UNLOCKS; | ||
124 | |||
125 | dev->driver = driver; | ||
126 | |||
127 | if (drm_core_has_AGP(dev)) { | ||
128 | if (drm_device_is_agp(dev)) | ||
129 | dev->agp = drm_agp_init(dev); | ||
130 | if (drm_core_check_feature(dev, DRIVER_REQUIRE_AGP) | ||
131 | && (dev->agp == NULL)) { | ||
132 | DRM_ERROR("Cannot initialize the agpgart module.\n"); | ||
133 | retcode = -EINVAL; | ||
134 | goto error_out_unreg; | ||
135 | } | ||
136 | if (drm_core_has_MTRR(dev)) { | ||
137 | if (dev->agp) | ||
138 | dev->agp->agp_mtrr = | ||
139 | mtrr_add(dev->agp->agp_info.aper_base, | ||
140 | dev->agp->agp_info.aper_size * | ||
141 | 1024 * 1024, MTRR_TYPE_WRCOMB, 1); | ||
142 | } | ||
143 | } | ||
144 | |||
145 | if (dev->driver->load) | ||
146 | if ((retcode = dev->driver->load(dev, ent->driver_data))) | ||
147 | goto error_out_unreg; | ||
148 | |||
149 | retcode = drm_ctxbitmap_init(dev); | ||
150 | if (retcode) { | ||
151 | DRM_ERROR("Cannot allocate memory for context bitmap.\n"); | ||
152 | goto error_out_unreg; | ||
153 | } | ||
154 | |||
155 | return 0; | ||
156 | |||
157 | error_out_unreg: | ||
158 | drm_lastclose(dev); | ||
159 | return retcode; | ||
160 | } | ||
161 | |||
162 | |||
163 | /** | ||
164 | * Get a secondary minor number. | ||
165 | * | ||
166 | * \param dev device data structure | ||
167 | * \param sec-minor structure to hold the assigned minor | ||
168 | * \return negative number on failure. | ||
169 | * | ||
170 | * Search an empty entry and initialize it to the given parameters, and | ||
171 | * create the proc init entry via proc_init(). This routines assigns | ||
172 | * minor numbers to secondary heads of multi-headed cards | ||
173 | */ | ||
174 | static int drm_get_minor(struct drm_device *dev, struct drm_minor **minor, int type) | ||
175 | { | ||
176 | struct drm_minor *new_minor; | ||
177 | int ret; | ||
178 | int minor_id; | ||
179 | |||
180 | DRM_DEBUG("\n"); | ||
181 | |||
182 | minor_id = drm_minor_get_id(dev, type); | ||
183 | if (minor_id < 0) | ||
184 | return minor_id; | ||
185 | |||
186 | new_minor = kzalloc(sizeof(struct drm_minor), GFP_KERNEL); | ||
187 | if (!new_minor) { | ||
188 | ret = -ENOMEM; | ||
189 | goto err_idr; | ||
190 | } | ||
191 | |||
192 | new_minor->type = type; | ||
193 | new_minor->device = MKDEV(DRM_MAJOR, minor_id); | ||
194 | new_minor->dev = dev; | ||
195 | new_minor->index = minor_id; | ||
196 | |||
197 | idr_replace(&drm_minors_idr, new_minor, minor_id); | ||
198 | |||
199 | if (type == DRM_MINOR_LEGACY) { | ||
200 | ret = drm_proc_init(new_minor, minor_id, drm_proc_root); | ||
201 | if (ret) { | ||
202 | DRM_ERROR("DRM: Failed to initialize /proc/dri.\n"); | ||
203 | goto err_mem; | ||
204 | } | ||
205 | } else | ||
206 | new_minor->dev_root = NULL; | ||
207 | |||
208 | ret = drm_sysfs_device_add(new_minor); | ||
209 | if (ret) { | ||
210 | printk(KERN_ERR | ||
211 | "DRM: Error sysfs_device_add.\n"); | ||
212 | goto err_g2; | ||
213 | } | ||
214 | *minor = new_minor; | ||
215 | |||
216 | DRM_DEBUG("new minor assigned %d\n", minor_id); | ||
217 | return 0; | ||
218 | |||
219 | |||
220 | err_g2: | ||
221 | if (new_minor->type == DRM_MINOR_LEGACY) | ||
222 | drm_proc_cleanup(new_minor, drm_proc_root); | ||
223 | err_mem: | ||
224 | kfree(new_minor); | ||
225 | err_idr: | ||
226 | idr_remove(&drm_minors_idr, minor_id); | ||
227 | *minor = NULL; | ||
228 | return ret; | ||
229 | } | ||
230 | |||
231 | /** | ||
232 | * Register. | ||
233 | * | ||
234 | * \param pdev - PCI device structure | ||
235 | * \param ent entry from the PCI ID table with device type flags | ||
236 | * \return zero on success or a negative number on failure. | ||
237 | * | ||
238 | * Attempt to gets inter module "drm" information. If we are first | ||
239 | * then register the character device and inter module information. | ||
240 | * Try and register, if we fail to register, backout previous work. | ||
241 | */ | ||
242 | int drm_get_dev(struct pci_dev *pdev, const struct pci_device_id *ent, | ||
243 | struct drm_driver *driver) | ||
244 | { | ||
245 | struct drm_device *dev; | ||
246 | int ret; | ||
247 | |||
248 | DRM_DEBUG("\n"); | ||
249 | |||
250 | dev = drm_calloc(1, sizeof(*dev), DRM_MEM_STUB); | ||
251 | if (!dev) | ||
252 | return -ENOMEM; | ||
253 | |||
254 | ret = pci_enable_device(pdev); | ||
255 | if (ret) | ||
256 | goto err_g1; | ||
257 | |||
258 | pci_set_master(pdev); | ||
259 | if ((ret = drm_fill_in_dev(dev, pdev, ent, driver))) { | ||
260 | printk(KERN_ERR "DRM: Fill_in_dev failed.\n"); | ||
261 | goto err_g2; | ||
262 | } | ||
263 | if ((ret = drm_get_minor(dev, &dev->primary, DRM_MINOR_LEGACY))) | ||
264 | goto err_g2; | ||
265 | |||
266 | DRM_INFO("Initialized %s %d.%d.%d %s on minor %d\n", | ||
267 | driver->name, driver->major, driver->minor, driver->patchlevel, | ||
268 | driver->date, dev->primary->index); | ||
269 | |||
270 | return 0; | ||
271 | |||
272 | err_g2: | ||
273 | pci_disable_device(pdev); | ||
274 | err_g1: | ||
275 | drm_free(dev, sizeof(*dev), DRM_MEM_STUB); | ||
276 | return ret; | ||
277 | } | ||
278 | |||
279 | /** | ||
280 | * Put a device minor number. | ||
281 | * | ||
282 | * \param dev device data structure | ||
283 | * \return always zero | ||
284 | * | ||
285 | * Cleans up the proc resources. If it is the last minor then release the foreign | ||
286 | * "drm" data, otherwise unregisters the "drm" data, frees the dev list and | ||
287 | * unregisters the character device. | ||
288 | */ | ||
289 | int drm_put_dev(struct drm_device * dev) | ||
290 | { | ||
291 | DRM_DEBUG("release primary %s\n", dev->driver->pci_driver.name); | ||
292 | |||
293 | if (dev->unique) { | ||
294 | drm_free(dev->unique, strlen(dev->unique) + 1, DRM_MEM_DRIVER); | ||
295 | dev->unique = NULL; | ||
296 | dev->unique_len = 0; | ||
297 | } | ||
298 | if (dev->devname) { | ||
299 | drm_free(dev->devname, strlen(dev->devname) + 1, | ||
300 | DRM_MEM_DRIVER); | ||
301 | dev->devname = NULL; | ||
302 | } | ||
303 | drm_free(dev, sizeof(*dev), DRM_MEM_STUB); | ||
304 | return 0; | ||
305 | } | ||
306 | |||
307 | /** | ||
308 | * Put a secondary minor number. | ||
309 | * | ||
310 | * \param sec_minor - structure to be released | ||
311 | * \return always zero | ||
312 | * | ||
313 | * Cleans up the proc resources. Not legal for this to be the | ||
314 | * last minor released. | ||
315 | * | ||
316 | */ | ||
317 | int drm_put_minor(struct drm_minor **minor_p) | ||
318 | { | ||
319 | struct drm_minor *minor = *minor_p; | ||
320 | DRM_DEBUG("release secondary minor %d\n", minor->index); | ||
321 | |||
322 | if (minor->type == DRM_MINOR_LEGACY) | ||
323 | drm_proc_cleanup(minor, drm_proc_root); | ||
324 | drm_sysfs_device_remove(minor); | ||
325 | |||
326 | idr_remove(&drm_minors_idr, minor->index); | ||
327 | |||
328 | kfree(minor); | ||
329 | *minor_p = NULL; | ||
330 | return 0; | ||
331 | } | ||