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);
51 seq_printf(m
, "gpu fifo state:\n");
52 seq_printf(m
, " get: 0x%08x\n",
53 nvchan_rd32(chan
, chan
->user_get
));
54 seq_printf(m
, " put: 0x%08x\n",
55 nvchan_rd32(chan
, chan
->user_put
));
57 seq_printf(m
, "last fence : %d\n", chan
->fence
.sequence
);
58 seq_printf(m
, "last signalled: %d\n", chan
->fence
.sequence_ack
);
63 nouveau_debugfs_channel_init(struct nouveau_channel
*chan
)
65 struct drm_nouveau_private
*dev_priv
= chan
->dev
->dev_private
;
66 struct drm_minor
*minor
= chan
->dev
->primary
;
69 if (!dev_priv
->debugfs
.channel_root
) {
70 dev_priv
->debugfs
.channel_root
=
71 debugfs_create_dir("channel", minor
->debugfs_root
);
72 if (!dev_priv
->debugfs
.channel_root
)
76 snprintf(chan
->debugfs
.name
, 32, "%d", chan
->id
);
77 chan
->debugfs
.info
.name
= chan
->debugfs
.name
;
78 chan
->debugfs
.info
.show
= nouveau_debugfs_channel_info
;
79 chan
->debugfs
.info
.driver_features
= 0;
80 chan
->debugfs
.info
.data
= chan
;
82 ret
= drm_debugfs_create_files(&chan
->debugfs
.info
, 1,
83 dev_priv
->debugfs
.channel_root
,
86 chan
->debugfs
.active
= true;
91 nouveau_debugfs_channel_fini(struct nouveau_channel
*chan
)
93 struct drm_nouveau_private
*dev_priv
= chan
->dev
->dev_private
;
95 if (!chan
->debugfs
.active
)
98 drm_debugfs_remove_files(&chan
->debugfs
.info
, 1, chan
->dev
->primary
);
99 chan
->debugfs
.active
= false;
101 if (chan
== dev_priv
->channel
) {
102 debugfs_remove(dev_priv
->debugfs
.channel_root
);
103 dev_priv
->debugfs
.channel_root
= NULL
;
108 nouveau_debugfs_chipset_info(struct seq_file
*m
, void *data
)
110 struct drm_info_node
*node
= (struct drm_info_node
*) m
->private;
111 struct drm_minor
*minor
= node
->minor
;
112 struct drm_device
*dev
= minor
->dev
;
113 struct drm_nouveau_private
*dev_priv
= dev
->dev_private
;
116 ppci_0
= nv_rd32(dev
, dev_priv
->chipset
>= 0x40 ? 0x88000 : 0x1800);
118 seq_printf(m
, "PMC_BOOT_0: 0x%08x\n", nv_rd32(dev
, NV03_PMC_BOOT_0
));
119 seq_printf(m
, "PCI ID : 0x%04x:0x%04x\n",
120 ppci_0
& 0xffff, ppci_0
>> 16);
125 nouveau_debugfs_memory_info(struct seq_file
*m
, void *data
)
127 struct drm_info_node
*node
= (struct drm_info_node
*) m
->private;
128 struct drm_minor
*minor
= node
->minor
;
129 struct drm_device
*dev
= minor
->dev
;
131 seq_printf(m
, "VRAM total: %dKiB\n",
132 (int)(nouveau_mem_fb_amount(dev
) >> 10));
136 static struct drm_info_list nouveau_debugfs_list
[] = {
137 { "chipset", nouveau_debugfs_chipset_info
, 0, NULL
},
138 { "memory", nouveau_debugfs_memory_info
, 0, NULL
},
140 #define NOUVEAU_DEBUGFS_ENTRIES ARRAY_SIZE(nouveau_debugfs_list)
143 nouveau_debugfs_init(struct drm_minor
*minor
)
145 drm_debugfs_create_files(nouveau_debugfs_list
, NOUVEAU_DEBUGFS_ENTRIES
,
146 minor
->debugfs_root
, minor
);
151 nouveau_debugfs_takedown(struct drm_minor
*minor
)
153 drm_debugfs_remove_files(nouveau_debugfs_list
, NOUVEAU_DEBUGFS_ENTRIES
,