2 * $FreeBSD: src/sys/dev/drm/drm_sysctl.h,v 1.3.2.1 2003/04/26 07:05:29 anholt Exp $
7 #include <sys/sysctl.h>
9 static int DRM(name_info)DRM_SYSCTL_HANDLER_ARGS;
10 static int DRM(vm_info)DRM_SYSCTL_HANDLER_ARGS;
11 static int DRM(clients_info)DRM_SYSCTL_HANDLER_ARGS;
12 static int DRM(bufs_info)DRM_SYSCTL_HANDLER_ARGS;
14 struct DRM(sysctl_list) {
16 int (*f) DRM_SYSCTL_HANDLER_ARGS;
17 } DRM(sysctl_list)[] = {
18 { "name", DRM(name_info) },
19 { "mem", DRM(mem_info) },
20 { "vm", DRM(vm_info) },
21 { "clients", DRM(clients_info) },
22 { "bufs", DRM(bufs_info) },
24 #define DRM_SYSCTL_ENTRIES (sizeof(DRM(sysctl_list))/sizeof(DRM(sysctl_list)[0]))
26 struct drm_sysctl_info {
27 struct sysctl_ctx_list ctx;
31 int DRM(sysctl_init)(drm_device_t *dev)
33 struct drm_sysctl_info *info;
34 struct sysctl_oid *oid;
35 struct sysctl_oid *top, *drioid;
38 info = DRM(alloc)(sizeof *info, DRM_MEM_DRIVER);
41 bzero(info, sizeof *info);
44 /* Add the sysctl node for DRI if it doesn't already exist */
45 drioid = SYSCTL_ADD_NODE( &info->ctx, &sysctl__hw_children, OID_AUTO, "dri", CTLFLAG_RW, NULL, "DRI Graphics");
49 /* Find the next free slot under hw.dri */
51 SLIST_FOREACH(oid, SYSCTL_CHILDREN(drioid), oid_link) {
52 if (i <= oid->oid_arg2)
53 i = oid->oid_arg2 + 1;
58 /* Add the hw.dri.x for our device */
59 info->name[0] = '0' + i;
61 top = SYSCTL_ADD_NODE( &info->ctx, SYSCTL_CHILDREN(drioid), OID_AUTO, info->name, CTLFLAG_RW, NULL, NULL);
65 for (i = 0; i < DRM_SYSCTL_ENTRIES; i++) {
66 oid = sysctl_add_oid( &info->ctx,
69 DRM(sysctl_list)[i].name,
70 CTLTYPE_INT | CTLFLAG_RD,
73 DRM(sysctl_list)[i].f,
82 int DRM(sysctl_cleanup)(drm_device_t *dev)
85 error = sysctl_ctx_free( &dev->sysctl->ctx );
87 DRM(free)(dev->sysctl, sizeof *dev->sysctl, DRM_MEM_DRIVER);
93 static int DRM(name_info)DRM_SYSCTL_HANDLER_ARGS
95 drm_device_t *dev = arg1;
100 DRM_SYSCTL_PRINT("%s 0x%x %s\n",
101 dev->name, dev2udev(dev->devnode), dev->unique);
103 DRM_SYSCTL_PRINT("%s 0x%x\n", dev->name, dev2udev(dev->devnode));
106 SYSCTL_OUT(req, "", 1);
111 static int DRM(_vm_info)DRM_SYSCTL_HANDLER_ARGS
113 drm_device_t *dev = arg1;
114 drm_local_map_t *map;
115 drm_map_list_entry_t *listentry;
116 const char *types[] = { "FB", "REG", "SHM" };
122 DRM_SYSCTL_PRINT("slot offset size type flags "
124 error = SYSCTL_OUT(req, buf, strlen(buf));
125 if (error) return error;
127 if (dev->maplist != NULL) {
128 TAILQ_FOREACH(listentry, dev->maplist, link) {
129 map = listentry->map;
130 if (map->type < 0 || map->type > 2) type = "??";
131 else type = types[map->type];
132 DRM_SYSCTL_PRINT("%4d 0x%08lx 0x%08lx %4.4s 0x%02x 0x%08lx ",
138 (unsigned long)map->handle);
140 DRM_SYSCTL_PRINT("none\n");
142 DRM_SYSCTL_PRINT("%4d\n", map->mtrr);
147 SYSCTL_OUT(req, "", 1);
152 static int DRM(vm_info)DRM_SYSCTL_HANDLER_ARGS
154 drm_device_t *dev = arg1;
158 ret = DRM(_vm_info)(oidp, arg1, arg2, req);
165 /* drm_bufs_info is called whenever a process reads
168 static int DRM(_bufs_info) DRM_SYSCTL_HANDLER_ARGS
170 drm_device_t *dev = arg1;
171 drm_device_dma_t *dma = dev->dma;
177 DRM_SYSCTL_PRINT(" o size count free segs pages kB\n\n");
178 for (i = 0; i <= DRM_MAX_ORDER; i++) {
179 if (dma->bufs[i].buf_count)
180 DRM_SYSCTL_PRINT("%2d %8d %5d %5d %5d %5d %5d\n",
182 dma->bufs[i].buf_size,
183 dma->bufs[i].buf_count,
184 atomic_read(&dma->bufs[i]
186 dma->bufs[i].seg_count,
187 dma->bufs[i].seg_count
188 *(1 << dma->bufs[i].page_order),
189 (dma->bufs[i].seg_count
190 * (1 << dma->bufs[i].page_order))
193 DRM_SYSCTL_PRINT("\n");
194 for (i = 0; i < dma->buf_count; i++) {
195 if (i && !(i%32)) DRM_SYSCTL_PRINT("\n");
196 DRM_SYSCTL_PRINT(" %d", dma->buflist[i]->list);
198 DRM_SYSCTL_PRINT("\n");
200 SYSCTL_OUT(req, "", 1);
204 static int DRM(bufs_info) DRM_SYSCTL_HANDLER_ARGS
206 drm_device_t *dev = arg1;
210 ret = DRM(_bufs_info)(oidp, arg1, arg2, req);
216 static int DRM(_clients_info) DRM_SYSCTL_HANDLER_ARGS
218 drm_device_t *dev = arg1;
223 DRM_SYSCTL_PRINT("a dev pid uid magic ioctls\n\n");
224 TAILQ_FOREACH(priv, &dev->files, link) {
225 DRM_SYSCTL_PRINT("%c %3d %5d %5d %10u %10lu\n",
226 priv->authenticated ? 'y' : 'n',
234 SYSCTL_OUT(req, "", 1);
238 static int DRM(clients_info)DRM_SYSCTL_HANDLER_ARGS
240 drm_device_t *dev = arg1;
244 ret = DRM(_clients_info)(oidp, arg1, arg2, req);
250 #elif defined(__NetBSD__)
251 /* stub it out for now, sysctl is only for debugging */
252 int DRM(sysctl_init)(drm_device_t *dev)
257 int DRM(sysctl_cleanup)(drm_device_t *dev)