aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/drm_auth.c
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2008-05-28 20:09:59 -0400
committerDave Airlie <airlied@redhat.com>2008-07-13 20:45:01 -0400
commitc0e09200dc0813972442e550a5905a132768e56c (patch)
treed38e635a30ff8b0a2b98b9d7f97cab1501f8209e /drivers/gpu/drm/drm_auth.c
parentbce7f793daec3e65ec5c5705d2457b81fe7b5725 (diff)
drm: reorganise drm tree to be more future proof.
With the coming of kernel based modesetting and the memory manager stuff, the everything in one directory approach was getting very ugly and starting to be unmanageable. This restructures the drm along the lines of other kernel components. It creates a drivers/gpu/drm directory and moves the hw drivers into subdirectores. It moves the includes into an include/drm, and sets up the unifdef for the userspace headers we should be exporting. Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/drm_auth.c')
-rw-r--r--drivers/gpu/drm/drm_auth.c190
1 files changed, 190 insertions, 0 deletions
diff --git a/drivers/gpu/drm/drm_auth.c b/drivers/gpu/drm/drm_auth.c
new file mode 100644
index 000000000000..a73462723d2d
--- /dev/null
+++ b/drivers/gpu/drm/drm_auth.c
@@ -0,0 +1,190 @@
1/**
2 * \file drm_auth.c
3 * IOCTLs for authentication
4 *
5 * \author Rickard E. (Rik) Faith <faith@valinux.com>
6 * \author Gareth Hughes <gareth@valinux.com>
7 */
8
9/*
10 * Created: Tue Feb 2 08:37:54 1999 by faith@valinux.com
11 *
12 * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
13 * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
14 * All Rights Reserved.
15 *
16 * Permission is hereby granted, free of charge, to any person obtaining a
17 * copy of this software and associated documentation files (the "Software"),
18 * to deal in the Software without restriction, including without limitation
19 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
20 * and/or sell copies of the Software, and to permit persons to whom the
21 * Software is furnished to do so, subject to the following conditions:
22 *
23 * The above copyright notice and this permission notice (including the next
24 * paragraph) shall be included in all copies or substantial portions of the
25 * Software.
26 *
27 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
28 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
29 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
30 * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
31 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
32 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
33 * OTHER DEALINGS IN THE SOFTWARE.
34 */
35
36#include "drmP.h"
37
38/**
39 * Find the file with the given magic number.
40 *
41 * \param dev DRM device.
42 * \param magic magic number.
43 *
44 * Searches in drm_device::magiclist within all files with the same hash key
45 * the one with matching magic number, while holding the drm_device::struct_mutex
46 * lock.
47 */
48static struct drm_file *drm_find_file(struct drm_device * dev, drm_magic_t magic)
49{
50 struct drm_file *retval = NULL;
51 struct drm_magic_entry *pt;
52 struct drm_hash_item *hash;
53
54 mutex_lock(&dev->struct_mutex);
55 if (!drm_ht_find_item(&dev->magiclist, (unsigned long)magic, &hash)) {
56 pt = drm_hash_entry(hash, struct drm_magic_entry, hash_item);
57 retval = pt->priv;
58 }
59 mutex_unlock(&dev->struct_mutex);
60 return retval;
61}
62
63/**
64 * Adds a magic number.
65 *
66 * \param dev DRM device.
67 * \param priv file private data.
68 * \param magic magic number.
69 *
70 * Creates a drm_magic_entry structure and appends to the linked list
71 * associated the magic number hash key in drm_device::magiclist, while holding
72 * the drm_device::struct_mutex lock.
73 */
74static int drm_add_magic(struct drm_device * dev, struct drm_file * priv,
75 drm_magic_t magic)
76{
77 struct drm_magic_entry *entry;
78
79 DRM_DEBUG("%d\n", magic);
80
81 entry = drm_alloc(sizeof(*entry), DRM_MEM_MAGIC);
82 if (!entry)
83 return -ENOMEM;
84 memset(entry, 0, sizeof(*entry));
85 entry->priv = priv;
86
87 entry->hash_item.key = (unsigned long)magic;
88 mutex_lock(&dev->struct_mutex);
89 drm_ht_insert_item(&dev->magiclist, &entry->hash_item);
90 list_add_tail(&entry->head, &dev->magicfree);
91 mutex_unlock(&dev->struct_mutex);
92
93 return 0;
94}
95
96/**
97 * Remove a magic number.
98 *
99 * \param dev DRM device.
100 * \param magic magic number.
101 *
102 * Searches and unlinks the entry in drm_device::magiclist with the magic
103 * number hash key, while holding the drm_device::struct_mutex lock.
104 */
105static int drm_remove_magic(struct drm_device * dev, drm_magic_t magic)
106{
107 struct drm_magic_entry *pt;
108 struct drm_hash_item *hash;
109
110 DRM_DEBUG("%d\n", magic);
111
112 mutex_lock(&dev->struct_mutex);
113 if (drm_ht_find_item(&dev->magiclist, (unsigned long)magic, &hash)) {
114 mutex_unlock(&dev->struct_mutex);
115 return -EINVAL;
116 }
117 pt = drm_hash_entry(hash, struct drm_magic_entry, hash_item);
118 drm_ht_remove_item(&dev->magiclist, hash);
119 list_del(&pt->head);
120 mutex_unlock(&dev->struct_mutex);
121
122 drm_free(pt, sizeof(*pt), DRM_MEM_MAGIC);
123
124 return 0;
125}
126
127/**
128 * Get a unique magic number (ioctl).
129 *
130 * \param inode device inode.
131 * \param file_priv DRM file private.
132 * \param cmd command.
133 * \param arg pointer to a resulting drm_auth structure.
134 * \return zero on success, or a negative number on failure.
135 *
136 * If there is a magic number in drm_file::magic then use it, otherwise
137 * searches an unique non-zero magic number and add it associating it with \p
138 * file_priv.
139 */
140int drm_getmagic(struct drm_device *dev, void *data, struct drm_file *file_priv)
141{
142 static drm_magic_t sequence = 0;
143 static DEFINE_SPINLOCK(lock);
144 struct drm_auth *auth = data;
145
146 /* Find unique magic */
147 if (file_priv->magic) {
148 auth->magic = file_priv->magic;
149 } else {
150 do {
151 spin_lock(&lock);
152 if (!sequence)
153 ++sequence; /* reserve 0 */
154 auth->magic = sequence++;
155 spin_unlock(&lock);
156 } while (drm_find_file(dev, auth->magic));
157 file_priv->magic = auth->magic;
158 drm_add_magic(dev, file_priv, auth->magic);
159 }
160
161 DRM_DEBUG("%u\n", auth->magic);
162
163 return 0;
164}
165
166/**
167 * Authenticate with a magic.
168 *
169 * \param inode device inode.
170 * \param file_priv DRM file private.
171 * \param cmd command.
172 * \param arg pointer to a drm_auth structure.
173 * \return zero if authentication successed, or a negative number otherwise.
174 *
175 * Checks if \p file_priv is associated with the magic number passed in \arg.
176 */
177int drm_authmagic(struct drm_device *dev, void *data,
178 struct drm_file *file_priv)
179{
180 struct drm_auth *auth = data;
181 struct drm_file *file;
182
183 DRM_DEBUG("%u\n", auth->magic);
184 if ((file = drm_find_file(dev, auth->magic))) {
185 file->authenticated = 1;
186 drm_remove_magic(dev, auth->magic);
187 return 0;
188 }
189 return -EINVAL;
190}