⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 proc.c

📁 内核linux2.4.20,可跟rtlinux3.2打补丁 组成实时linux系统,编译内核
💻 C
📖 第 1 页 / 共 2 页
字号:
/* proc.c -- /proc support for DRM -*- linux-c -*- * Created: Mon Jan 11 09:48:47 1999 by faith@precisioninsight.com * * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. * All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: *  * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. *  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. * * Authors: *    Rickard E. (Rik) Faith <faith@valinux.com> */#define __NO_VERSION__#include "drmP.h"static struct proc_dir_entry *drm_root	   = NULL;static struct proc_dir_entry *drm_dev_root = NULL;static char		     drm_slot_name[64];static int	   drm_name_info(char *buf, char **start, off_t offset,				 int len, int *eof, void *data);static int	   drm_vm_info(char *buf, char **start, off_t offset,			       int len, int *eof, void *data);static int	   drm_clients_info(char *buf, char **start, off_t offset,				    int len, int *eof, void *data);static int	   drm_queues_info(char *buf, char **start, off_t offset,				   int len, int *eof, void *data);static int	   drm_bufs_info(char *buf, char **start, off_t offset,				 int len, int *eof, void *data);#if DRM_DEBUG_CODEstatic int	   drm_vma_info(char *buf, char **start, off_t offset,				int len, int *eof, void *data);#endif#if DRM_DMA_HISTOGRAMstatic int	   drm_histo_info(char *buf, char **start, off_t offset,				  int len, int *eof, void *data);#endifstruct drm_proc_list {	const char *name;	int	   (*f)(char *, char **, off_t, int, int *, void *);} drm_proc_list[] = {	{ "name",    drm_name_info    },	{ "mem",     drm_mem_info     },	{ "vm",	     drm_vm_info      },	{ "clients", drm_clients_info },	{ "queues",  drm_queues_info  },	{ "bufs",    drm_bufs_info    },#if DRM_DEBUG_CODE	{ "vma",     drm_vma_info     },#endif#if DRM_DMA_HISTOGRAM	{ "histo",   drm_histo_info   },#endif};#define DRM_PROC_ENTRIES (sizeof(drm_proc_list)/sizeof(drm_proc_list[0]))int drm_proc_init(drm_device_t *dev){	struct proc_dir_entry *ent;	int		      i, j;	drm_root = create_proc_entry("dri", S_IFDIR, NULL);	if (!drm_root) {		DRM_ERROR("Cannot create /proc/dri\n");		return -1;	}				/* Instead of doing this search, we should				   add some global support for /proc/dri. */	for (i = 0; i < 8; i++) {		sprintf(drm_slot_name, "dri/%d", i);		drm_dev_root = create_proc_entry(drm_slot_name, S_IFDIR, NULL);		if (!drm_dev_root) {			DRM_ERROR("Cannot create /proc/%s\n", drm_slot_name);			remove_proc_entry("dri", NULL);			break;		}		if (drm_dev_root->nlink == 2) break;		drm_dev_root = NULL;	}	if (!drm_dev_root) {		DRM_ERROR("Cannot find slot in /proc/dri\n");		return -1;	}	for (i = 0; i < DRM_PROC_ENTRIES; i++) {		ent = create_proc_entry(drm_proc_list[i].name,					S_IFREG|S_IRUGO, drm_dev_root);		if (!ent) {			DRM_ERROR("Cannot create /proc/%s/%s\n",				  drm_slot_name, drm_proc_list[i].name);			for (j = 0; j < i; j++)				remove_proc_entry(drm_proc_list[i].name,						  drm_dev_root);			remove_proc_entry(drm_slot_name, NULL);			remove_proc_entry("dri", NULL);			return -1;		}		ent->read_proc = drm_proc_list[i].f;		ent->data      = dev;	}	return 0;}int drm_proc_cleanup(void){	int i;		if (drm_root) {		if (drm_dev_root) {			for (i = 0; i < DRM_PROC_ENTRIES; i++) {				remove_proc_entry(drm_proc_list[i].name,						  drm_dev_root);			}			remove_proc_entry(drm_slot_name, NULL);		}		remove_proc_entry("dri", NULL);		remove_proc_entry(DRM_NAME, NULL);	}	drm_root = drm_dev_root = NULL;	return 0;}static int drm_name_info(char *buf, char **start, off_t offset, int len,			 int *eof, void *data){	drm_device_t *dev = (drm_device_t *)data;	if (offset > 0) return 0; /* no partial requests */	len  = 0;	*eof = 1;	if (dev->unique) {		DRM_PROC_PRINT("%s 0x%x %s\n",			       dev->name, dev->device, dev->unique);	} else {		DRM_PROC_PRINT("%s 0x%x\n", dev->name, dev->device);	}	return len;}static int _drm_vm_info(char *buf, char **start, off_t offset, int len,			int *eof, void *data){	drm_device_t *dev = (drm_device_t *)data;	drm_map_t    *map;				/* Hardcoded from _DRM_FRAME_BUFFER,                                   _DRM_REGISTERS, _DRM_SHM, and                                   _DRM_AGP. */	const char   *types[] = { "FB", "REG", "SHM", "AGP" };	const char   *type;	int	     i;	if (offset > 0) return 0; /* no partial requests */	len  = 0;	*eof = 1;	DRM_PROC_PRINT("slot	 offset	      size type flags	 "		       "address mtrr\n\n");	for (i = 0; i < dev->map_count; i++) {		map = dev->maplist[i];		if (map->type < 0 || map->type > 3) type = "??";		else				    type = types[map->type];		DRM_PROC_PRINT("%4d 0x%08lx 0x%08lx %4.4s  0x%02x 0x%08lx ",			       i,			       map->offset,			       map->size,			       type,			       map->flags,			       (unsigned long)map->handle);		if (map->mtrr < 0) {			DRM_PROC_PRINT("none\n");		} else {			DRM_PROC_PRINT("%4d\n", map->mtrr);		}	}	return len;}static int drm_vm_info(char *buf, char **start, off_t offset, int len,		       int *eof, void *data){	drm_device_t *dev = (drm_device_t *)data;	int	     ret;	down(&dev->struct_sem);	ret = _drm_vm_info(buf, start, offset, len, eof, data);	up(&dev->struct_sem);	return ret;}static int _drm_queues_info(char *buf, char **start, off_t offset, int len,			    int *eof, void *data){	drm_device_t *dev = (drm_device_t *)data;	int	     i;	drm_queue_t  *q;	if (offset > 0) return 0; /* no partial requests */	len  = 0;	*eof = 1;	DRM_PROC_PRINT("  ctx/flags   use   fin"		       "   blk/rw/rwf  wait    flushed	   queued"		       "      locks\n\n");	for (i = 0; i < dev->queue_count; i++) {		q = dev->queuelist[i];		atomic_inc(&q->use_count);		DRM_PROC_PRINT_RET(atomic_dec(&q->use_count),				   "%5d/0x%03x %5d %5d"				   " %5d/%c%c/%c%c%c %5Zd %10d %10d %10d\n",				   i,				   q->flags,				   atomic_read(&q->use_count),				   atomic_read(&q->finalization),				   atomic_read(&q->block_count),				   atomic_read(&q->block_read) ? 'r' : '-',				   atomic_read(&q->block_write) ? 'w' : '-',				   waitqueue_active(&q->read_queue) ? 'r':'-',				   waitqueue_active(&q->write_queue) ? 'w':'-',				   waitqueue_active(&q->flush_queue) ? 'f':'-',				   DRM_BUFCOUNT(&q->waitlist),				   atomic_read(&q->total_flushed),				   atomic_read(&q->total_queued),				   atomic_read(&q->total_locks));		atomic_dec(&q->use_count);	}		return len;}static int drm_queues_info(char *buf, char **start, off_t offset, int len,			   int *eof, void *data){	drm_device_t *dev = (drm_device_t *)data;	int	     ret;	down(&dev->struct_sem);	ret = _drm_queues_info(buf, start, offset, len, eof, data);	up(&dev->struct_sem);	return ret;}/* drm_bufs_info is called whenever a process reads   /dev/drm/<dev>/bufs. */static int _drm_bufs_info(char *buf, char **start, off_t offset, int len,			  int *eof, void *data){	drm_device_t	 *dev = (drm_device_t *)data;	drm_device_dma_t *dma = dev->dma;	int		 i;	if (!dma)	return 0;	if (offset > 0) return 0; /* no partial requests */	len  = 0;	*eof = 1;	DRM_PROC_PRINT(" o     size count  free	 segs pages    kB\n\n");	for (i = 0; i <= DRM_MAX_ORDER; i++) {		if (dma->bufs[i].buf_count)			DRM_PROC_PRINT("%2d %8d %5d %5d %5d %5d %5ld\n",				       i,				       dma->bufs[i].buf_size,				       dma->bufs[i].buf_count,				       atomic_read(&dma->bufs[i]						   .freelist.count),				       dma->bufs[i].seg_count,				       dma->bufs[i].seg_count				       *(1 << dma->bufs[i].page_order),

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -