2 * Copyright (C) 2009 Red Hat <bskeggs@redhat.com>
4 * Permission is hereby granted, free of charge, to any person obtaining
5 * a copy of this software and associated documentation files (the
6 * "Software"), to deal in the Software without restriction, including
7 * without limitation the rights to use, copy, modify, merge, publish,
8 * distribute, sublicense, and/or sell copies of the Software, and to
9 * permit persons to whom the Software is furnished to do so, subject to
10 * the following conditions:
12 * The above copyright notice and this permission notice (including the
13 * next paragraph) shall be included in all copies or substantial
14 * portions of the Software.
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19 * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
20 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 * Ben Skeggs <bskeggs@redhat.com>
31 #include <linux/debugfs.h>
34 #include "nouveau_drv.h"
37 nouveau_debugfs_channel_info(struct seq_file
*m
, void *data
)
39 struct drm_info_node
*node
= (struct drm_info_node
*) m
->private;
40 struct nouveau_channel
*chan
= node
->info_ent
->data
;
42 seq_printf(m
, "channel id : %d\n", chan
->id
);
44 seq_printf(m
, "cpu fifo state:\n");
45 seq_printf(m
, " base: 0x%08x\n", chan
->pushbuf_base
);
46 seq_printf(m
, " max: 0x%08x\n", chan
->dma
.max
<< 2);
47 seq_printf(m
, " cur: 0x%08x\n", chan
->dma
.cur
<< 2);
48 seq_printf(m
, " put: 0x%08x\n", chan
->dma
.put
<< 2);
49 seq_printf(m
, " free: 0x%08x\n", chan
->dma
.free
<< 2);
50 if (chan
->dma
.ib_max
) {
51 seq_printf(m
, " ib max: 0x%08x\n", chan
->dma
.ib_max
);
52 seq_printf(m
, " ib put: 0x%08x\n", chan
->dma
.ib_put
);
53 seq_printf(m
, " ib free: 0x%08x\n", chan
->dma
.ib_free
);
56 seq_printf(m
, "gpu fifo state:\n");
57 seq_printf(m
, " get: 0x%08x\n",
58 nvchan_rd32(chan
, chan
->user_get
));
59 seq_printf(m
, " put: 0x%08x\n",
60 nvchan_rd32(chan
, chan
->user_put
));
61 if (chan
->dma
.ib_max
) {
62 seq_printf(m
, " ib get: 0x%08x\n",
63 nvchan_rd32(chan
, 0x88));
64 seq_printf(m
, " ib put: 0x%08x\n",
65 nvchan_rd32(chan
, 0x8c));
68 seq_printf(m
, "last fence : %d\n", chan
->fence
.sequence
);
69 seq_printf(m
, "last signalled: %d\n", chan
->fence
.sequence_ack
);
74 nouveau_debugfs_channel_init(struct nouveau_channel
*chan
)
76 struct drm_nouveau_private
*dev_priv
= chan
->dev
->dev_private
;
77 struct drm_minor
*minor
= chan
->dev
->primary
;
80 if (!dev_priv
->debugfs
.channel_root
) {
81 dev_priv
->debugfs
.channel_root
=
82 debugfs_create_dir("channel", minor
->debugfs_root
);
83 if (!dev_priv
->debugfs
.channel_root
)
87 snprintf(chan
->debugfs
.name
, 32, "%d", chan
->id
);
88 chan
->debugfs
.info
.name
= chan
->debugfs
.name
;
89 chan
->debugfs
.info
.show
= nouveau_debugfs_channel_info
;
90 chan
->debugfs
.info
.driver_features
= 0;
91 chan
->debugfs
.info
.data
= chan
;
93 ret
= drm_debugfs_create_files(&chan
->debugfs
.info
, 1,
94 dev_priv
->debugfs
.channel_root
,
97 chan
->debugfs
.active
= true;
102 nouveau_debugfs_channel_fini(struct nouveau_channel
*chan
)
104 struct drm_nouveau_private
*dev_priv
= chan
->dev
->dev_private
;
106 if (!chan
->debugfs
.active
)
109 drm_debugfs_remove_files(&chan
->debugfs
.info
, 1, chan
->dev
->primary
);
110 chan
->debugfs
.active
= false;
112 if (chan
== dev_priv
->channel
) {
113 debugfs_remove(dev_priv
->debugfs
.channel_root
);
114 dev_priv
->debugfs
.channel_root
= NULL
;
119 nouveau_debugfs_chipset_info(struct seq_file
*m
, void *data
)
121 struct drm_info_node
*node
= (struct drm_info_node
*) m
->private;
122 struct drm_minor
*minor
= node
->minor
;
123 struct drm_device
*dev
= minor
->dev
;
124 struct drm_nouveau_private
*dev_priv
= dev
->dev_private
;
127 ppci_0
= nv_rd32(dev
, dev_priv
->chipset
>= 0x40 ? 0x88000 : 0x1800);
129 seq_printf(m
, "PMC_BOOT_0: 0x%08x\n", nv_rd32(dev
, NV03_PMC_BOOT_0
));
130 seq_printf(m
, "PCI ID : 0x%04x:0x%04x\n",
131 ppci_0
& 0xffff, ppci_0
>> 16);
136 nouveau_debugfs_memory_info(struct seq_file
*m
, void *data
)
138 struct drm_info_node
*node
= (struct drm_info_node
*) m
->private;
139 struct drm_minor
*minor
= node
->minor
;
140 struct drm_nouveau_private
*dev_priv
= minor
->dev
->dev_private
;
142 seq_printf(m
, "VRAM total: %dKiB\n", (int)(dev_priv
->vram_size
>> 10));
147 nouveau_debugfs_vbios_image(struct seq_file
*m
, void *data
)
149 struct drm_info_node
*node
= (struct drm_info_node
*) m
->private;
150 struct drm_nouveau_private
*dev_priv
= node
->minor
->dev
->dev_private
;
153 for (i
= 0; i
< dev_priv
->vbios
.length
; i
++)
154 seq_printf(m
, "%c", dev_priv
->vbios
.data
[i
]);
158 static struct drm_info_list nouveau_debugfs_list
[] = {
159 { "chipset", nouveau_debugfs_chipset_info
, 0, NULL
},
160 { "memory", nouveau_debugfs_memory_info
, 0, NULL
},
161 { "vbios.rom", nouveau_debugfs_vbios_image
, 0, NULL
},
163 #define NOUVEAU_DEBUGFS_ENTRIES ARRAY_SIZE(nouveau_debugfs_list)
166 nouveau_debugfs_init(struct drm_minor
*minor
)
168 drm_debugfs_create_files(nouveau_debugfs_list
, NOUVEAU_DEBUGFS_ENTRIES
,
169 minor
->debugfs_root
, minor
);
174 nouveau_debugfs_takedown(struct drm_minor
*minor
)
176 drm_debugfs_remove_files(nouveau_debugfs_list
, NOUVEAU_DEBUGFS_ENTRIES
,