~ubuntu-branches/ubuntu/natty/linux-backports-modules-2.6.32/natty

« back to all changes in this revision

Viewing changes to updates/nouveau/drm_debugfs.c

  • Committer: Bazaar Package Importer
  • Author(s): Andy Whitcroft, Andy Whitcroft, Tim Gardner
  • Date: 2010-03-08 08:59:41 UTC
  • Revision ID: james.westby@ubuntu.com-20100308085941-rrlpd5wtuh7m2an9
Tags: 2.6.32-16.6
[ Andy Whitcroft ]

* Lucid ABI 16
* nouveau -- make the nouveau package an optional build
* nouveau -- disable generation of nouveau
* nouveau -- drop the redundant nouveau source

[ Tim Gardner ]

* Added iwlwifi 6000 series firmware
* udev expects firmware in /lib/firmware/updates/`uname -r`

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/**
2
 
 * \file drm_debugfs.c
3
 
 * debugfs support for DRM
4
 
 *
5
 
 * \author Ben Gamari <bgamari@gmail.com>
6
 
 */
7
 
 
8
 
/*
9
 
 * Created: Sun Dec 21 13:08:50 2008 by bgamari@gmail.com
10
 
 *
11
 
 * Copyright 2008 Ben Gamari <bgamari@gmail.com>
12
 
 *
13
 
 * Permission is hereby granted, free of charge, to any person obtaining a
14
 
 * copy of this software and associated documentation files (the "Software"),
15
 
 * to deal in the Software without restriction, including without limitation
16
 
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
17
 
 * and/or sell copies of the Software, and to permit persons to whom the
18
 
 * Software is furnished to do so, subject to the following conditions:
19
 
 *
20
 
 * The above copyright notice and this permission notice (including the next
21
 
 * paragraph) shall be included in all copies or substantial portions of the
22
 
 * Software.
23
 
 *
24
 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
25
 
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
26
 
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
27
 
 * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
28
 
 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
29
 
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
30
 
 * OTHER DEALINGS IN THE SOFTWARE.
31
 
 */
32
 
 
33
 
#include <linux/debugfs.h>
34
 
#include <linux/seq_file.h>
35
 
#include "drmP.h"
36
 
 
37
 
#if defined(CONFIG_DEBUG_FS)
38
 
 
39
 
/***************************************************
40
 
 * Initialization, etc.
41
 
 **************************************************/
42
 
 
43
 
static struct drm_info_list drm_debugfs_list[] = {
44
 
        {"name", drm_name_info, 0},
45
 
        {"vm", drm_vm_info, 0},
46
 
        {"clients", drm_clients_info, 0},
47
 
        {"queues", drm_queues_info, 0},
48
 
        {"bufs", drm_bufs_info, 0},
49
 
        {"gem_names", drm_gem_name_info, DRIVER_GEM},
50
 
        {"gem_objects", drm_gem_object_info, DRIVER_GEM},
51
 
#if DRM_DEBUG_CODE
52
 
        {"vma", drm_vma_info, 0},
53
 
#endif
54
 
};
55
 
#define DRM_DEBUGFS_ENTRIES ARRAY_SIZE(drm_debugfs_list)
56
 
 
57
 
 
58
 
static int drm_debugfs_open(struct inode *inode, struct file *file)
59
 
{
60
 
        struct drm_info_node *node = inode->i_private;
61
 
 
62
 
        return single_open(file, node->info_ent->show, node);
63
 
}
64
 
 
65
 
 
66
 
static const struct file_operations drm_debugfs_fops = {
67
 
        .owner = THIS_MODULE,
68
 
        .open = drm_debugfs_open,
69
 
        .read = seq_read,
70
 
        .llseek = seq_lseek,
71
 
        .release = single_release,
72
 
};
73
 
 
74
 
 
75
 
/**
76
 
 * Initialize a given set of debugfs files for a device
77
 
 *
78
 
 * \param files The array of files to create
79
 
 * \param count The number of files given
80
 
 * \param root DRI debugfs dir entry.
81
 
 * \param minor device minor number
82
 
 * \return Zero on success, non-zero on failure
83
 
 *
84
 
 * Create a given set of debugfs files represented by an array of
85
 
 * gdm_debugfs_lists in the given root directory.
86
 
 */
87
 
int drm_debugfs_create_files(struct drm_info_list *files, int count,
88
 
                             struct dentry *root, struct drm_minor *minor)
89
 
{
90
 
        struct drm_device *dev = minor->dev;
91
 
        struct dentry *ent;
92
 
        struct drm_info_node *tmp;
93
 
        char name[64];
94
 
        int i, ret;
95
 
 
96
 
        for (i = 0; i < count; i++) {
97
 
                u32 features = files[i].driver_features;
98
 
 
99
 
                if (features != 0 &&
100
 
                    (dev->driver->driver_features & features) != features)
101
 
                        continue;
102
 
 
103
 
                tmp = kmalloc(sizeof(struct drm_info_node), GFP_KERNEL);
104
 
                if (tmp == NULL) {
105
 
                        ret = -1;
106
 
                        goto fail;
107
 
                }
108
 
                ent = debugfs_create_file(files[i].name, S_IFREG | S_IRUGO,
109
 
                                          root, tmp, &drm_debugfs_fops);
110
 
                if (!ent) {
111
 
                        DRM_ERROR("Cannot create /sys/kernel/debug/dri/%s/%s\n",
112
 
                                  name, files[i].name);
113
 
                        kfree(tmp);
114
 
                        ret = -1;
115
 
                        goto fail;
116
 
                }
117
 
 
118
 
                tmp->minor = minor;
119
 
                tmp->dent = ent;
120
 
                tmp->info_ent = &files[i];
121
 
                list_add(&(tmp->list), &(minor->debugfs_nodes.list));
122
 
        }
123
 
        return 0;
124
 
 
125
 
fail:
126
 
        drm_debugfs_remove_files(files, count, minor);
127
 
        return ret;
128
 
}
129
 
EXPORT_SYMBOL(drm_debugfs_create_files);
130
 
 
131
 
/**
132
 
 * Initialize the DRI debugfs filesystem for a device
133
 
 *
134
 
 * \param dev DRM device
135
 
 * \param minor device minor number
136
 
 * \param root DRI debugfs dir entry.
137
 
 *
138
 
 * Create the DRI debugfs root entry "/sys/kernel/debug/dri", the device debugfs root entry
139
 
 * "/sys/kernel/debug/dri/%minor%/", and each entry in debugfs_list as
140
 
 * "/sys/kernel/debug/dri/%minor%/%name%".
141
 
 */
142
 
int drm_debugfs_init(struct drm_minor *minor, int minor_id,
143
 
                     struct dentry *root)
144
 
{
145
 
        struct drm_device *dev = minor->dev;
146
 
        char name[64];
147
 
        int ret;
148
 
 
149
 
        INIT_LIST_HEAD(&minor->debugfs_nodes.list);
150
 
        sprintf(name, "%d", minor_id);
151
 
        minor->debugfs_root = debugfs_create_dir(name, root);
152
 
        if (!minor->debugfs_root) {
153
 
                DRM_ERROR("Cannot create /sys/kernel/debug/dri/%s\n", name);
154
 
                return -1;
155
 
        }
156
 
 
157
 
        ret = drm_debugfs_create_files(drm_debugfs_list, DRM_DEBUGFS_ENTRIES,
158
 
                                       minor->debugfs_root, minor);
159
 
        if (ret) {
160
 
                debugfs_remove(minor->debugfs_root);
161
 
                minor->debugfs_root = NULL;
162
 
                DRM_ERROR("Failed to create core drm debugfs files\n");
163
 
                return ret;
164
 
        }
165
 
 
166
 
        if (dev->driver->debugfs_init) {
167
 
                ret = dev->driver->debugfs_init(minor);
168
 
                if (ret) {
169
 
                        DRM_ERROR("DRM: Driver failed to initialize "
170
 
                                  "/sys/kernel/debug/dri.\n");
171
 
                        return ret;
172
 
                }
173
 
        }
174
 
        return 0;
175
 
}
176
 
 
177
 
 
178
 
/**
179
 
 * Remove a list of debugfs files
180
 
 *
181
 
 * \param files The list of files
182
 
 * \param count The number of files
183
 
 * \param minor The minor of which we should remove the files
184
 
 * \return always zero.
185
 
 *
186
 
 * Remove all debugfs entries created by debugfs_init().
187
 
 */
188
 
int drm_debugfs_remove_files(struct drm_info_list *files, int count,
189
 
                             struct drm_minor *minor)
190
 
{
191
 
        struct list_head *pos, *q;
192
 
        struct drm_info_node *tmp;
193
 
        int i;
194
 
 
195
 
        for (i = 0; i < count; i++) {
196
 
                list_for_each_safe(pos, q, &minor->debugfs_nodes.list) {
197
 
                        tmp = list_entry(pos, struct drm_info_node, list);
198
 
                        if (tmp->info_ent == &files[i]) {
199
 
                                debugfs_remove(tmp->dent);
200
 
                                list_del(pos);
201
 
                                kfree(tmp);
202
 
                        }
203
 
                }
204
 
        }
205
 
        return 0;
206
 
}
207
 
EXPORT_SYMBOL(drm_debugfs_remove_files);
208
 
 
209
 
/**
210
 
 * Cleanup the debugfs filesystem resources.
211
 
 *
212
 
 * \param minor device minor number.
213
 
 * \return always zero.
214
 
 *
215
 
 * Remove all debugfs entries created by debugfs_init().
216
 
 */
217
 
int drm_debugfs_cleanup(struct drm_minor *minor)
218
 
{
219
 
        struct drm_device *dev = minor->dev;
220
 
 
221
 
        if (!minor->debugfs_root)
222
 
                return 0;
223
 
 
224
 
        if (dev->driver->debugfs_cleanup)
225
 
                dev->driver->debugfs_cleanup(minor);
226
 
 
227
 
        drm_debugfs_remove_files(drm_debugfs_list, DRM_DEBUGFS_ENTRIES, minor);
228
 
 
229
 
        debugfs_remove(minor->debugfs_root);
230
 
        minor->debugfs_root = NULL;
231
 
 
232
 
        return 0;
233
 
}
234
 
 
235
 
#endif /* CONFIG_DEBUG_FS */
236