mirror of
https://gitlab.freedesktop.org/mesa/drm.git
synced 2026-05-08 09:18:04 +02:00
Merge trunk into branch.
This commit is contained in:
parent
13e8184e64
commit
0033505c6d
17 changed files with 465 additions and 419 deletions
446
libdrm/xf86drm.c
446
libdrm/xf86drm.c
|
|
@ -11,11 +11,11 @@
|
|||
* 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
|
||||
|
|
@ -23,12 +23,12 @@
|
|||
* 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>
|
||||
* Kevin E. Martin <martin@valinux.com>
|
||||
*
|
||||
* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drm.c,v 1.17 2000/09/24 13:51:32 alanh Exp $
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef XFree86Server
|
||||
|
|
@ -81,7 +81,18 @@ extern unsigned long _bus_base(void);
|
|||
#include "xf86drm.h"
|
||||
#include "drm.h"
|
||||
|
||||
#define DRM_FIXED_DEVICE_MAJOR 145
|
||||
#ifndef DRM_MAJOR
|
||||
#define DRM_MAJOR 226 /* Linux */
|
||||
#endif
|
||||
|
||||
#ifndef __linux__
|
||||
#undef DRM_MAJOR
|
||||
#define DRM_MAJOR 145 /* Should set in drm.h for *BSD */
|
||||
#endif
|
||||
|
||||
#ifndef DRM_MAX_MINOR
|
||||
#define DRM_MAX_MINOR 16
|
||||
#endif
|
||||
|
||||
#ifdef __linux__
|
||||
#include <sys/sysmacros.h> /* for makedev() */
|
||||
|
|
@ -119,7 +130,7 @@ void drmFree(void *pt)
|
|||
static char *drmStrdup(const char *s)
|
||||
{
|
||||
char *retval = NULL;
|
||||
|
||||
|
||||
if (s) {
|
||||
retval = _DRM_MALLOC(strlen(s)+1);
|
||||
strcpy(retval, s);
|
||||
|
|
@ -161,93 +172,108 @@ static drmHashEntry *drmGetEntry(int fd)
|
|||
return entry;
|
||||
}
|
||||
|
||||
/* drm_open is used to open the /dev/dri device */
|
||||
|
||||
static int drm_open(const char *file)
|
||||
{
|
||||
int fd = open(file, O_RDWR, 0);
|
||||
|
||||
if (fd >= 0) return fd;
|
||||
return -errno;
|
||||
}
|
||||
|
||||
static int drmOpenDevice(const char *path, long dev,
|
||||
mode_t mode, uid_t user, gid_t group)
|
||||
static int drmOpenDevice(long dev, int minor)
|
||||
{
|
||||
#ifdef XFree86LOADER
|
||||
struct xf86stat st;
|
||||
#else
|
||||
struct stat st;
|
||||
#endif
|
||||
char buf[64];
|
||||
int fd;
|
||||
mode_t dirmode = DRM_DEV_DIRMODE;
|
||||
mode_t devmode = DRM_DEV_MODE;
|
||||
int isroot = !geteuid();
|
||||
#if defined(XFree86Server)
|
||||
uid_t user = DRM_DEV_UID;
|
||||
gid_t group = DRM_DEV_GID;
|
||||
#endif
|
||||
|
||||
/* Fiddle mode to remove execute bits */
|
||||
mode &= ~(S_IXUSR|S_IXGRP|S_IXOTH);
|
||||
#if defined(XFree86Server)
|
||||
devmode = xf86ConfigDRI.mode ? xf86ConfigDRI.mode : DRM_DEV_MODE;
|
||||
dirmode = (devmode & S_IRUSR) ? S_IXUSR : 0;
|
||||
dirmode |= (devmode & S_IRGRP) ? S_IXGRP : 0;
|
||||
dirmode |= (devmode & S_IROTH) ? S_IXOTH : 0;
|
||||
dirmode |= devmode;
|
||||
devmode &= ~(S_IXUSR|S_IXGRP|S_IXOTH);
|
||||
group = (xf86ConfigDRI.group >= 0) ? xf86ConfigDRI.group : DRM_DEV_GID;
|
||||
#endif
|
||||
|
||||
if (!stat(path, &st) && st.st_rdev == dev) {
|
||||
if (!geteuid()) {
|
||||
chown(path, user, group);
|
||||
chmod(path, mode);
|
||||
}
|
||||
return drm_open(path);
|
||||
if (stat(DRM_DIR_NAME, &st)) {
|
||||
if (!isroot) return DRM_ERR_NOT_ROOT;
|
||||
remove(DRM_DIR_NAME);
|
||||
mkdir(DRM_DIR_NAME, dirmode);
|
||||
}
|
||||
#if defined(XFree86Server)
|
||||
chown(DRM_DIR_NAME, user, group);
|
||||
chmod(DRM_DIR_NAME, dirmode);
|
||||
#endif
|
||||
|
||||
if (geteuid()) return DRM_ERR_NOT_ROOT;
|
||||
remove(path);
|
||||
if (mknod(path, S_IFCHR, dev)) {
|
||||
remove(path);
|
||||
return DRM_ERR_NOT_ROOT;
|
||||
sprintf(buf, DRM_DEV_NAME, DRM_DIR_NAME, minor);
|
||||
if (stat(buf, &st) || st.st_rdev != dev) {
|
||||
if (!isroot) return DRM_ERR_NOT_ROOT;
|
||||
remove(buf);
|
||||
mknod(buf, S_IFCHR | devmode, dev);
|
||||
}
|
||||
chown(path, user, group);
|
||||
chmod(path, mode);
|
||||
return drm_open(path);
|
||||
#if defined(XFree86Server)
|
||||
chown(buf, user, group);
|
||||
chmod(buf, devmode);
|
||||
#endif
|
||||
|
||||
if ((fd = open(buf, O_RDWR, 0)) >= 0) return fd;
|
||||
remove(buf);
|
||||
return -errno;
|
||||
}
|
||||
|
||||
/* drmAvailable looks for /proc/dri, and returns 1 if it is present. On
|
||||
OSs that do not have a Linux-like /proc, this information will not be
|
||||
available, and we'll have to create a device and check if the driver is
|
||||
loaded that way. */
|
||||
int drmOpenMinor(int minor, int create)
|
||||
{
|
||||
int fd;
|
||||
char buf[64];
|
||||
|
||||
if (create) return drmOpenDevice(makedev(DRM_MAJOR, minor), minor);
|
||||
|
||||
sprintf(buf, DRM_DEV_NAME, DRM_DIR_NAME, minor);
|
||||
if ((fd = open(buf, O_RDWR, 0)) >= 0) return fd;
|
||||
return -errno;
|
||||
}
|
||||
|
||||
/* drmAvailable looks for (DRM_MAJOR, 0) and returns 1 if it returns
|
||||
information for DRM_IOCTL_VERSION. For backward compatibility with
|
||||
older Linux implementations, /proc/dri is also checked. */
|
||||
|
||||
int drmAvailable(void)
|
||||
{
|
||||
char dev_name[64];
|
||||
drmVersionPtr version;
|
||||
int retval = 0;
|
||||
int fd;
|
||||
|
||||
if (!access("/proc/dri/0", R_OK)) return 1;
|
||||
|
||||
sprintf(dev_name, "/dev/dri-temp-%d", getpid());
|
||||
|
||||
remove(dev_name);
|
||||
if ((fd = drmOpenDevice(dev_name, makedev(DRM_FIXED_DEVICE_MAJOR, 0),
|
||||
S_IRUSR, geteuid(), getegid())) >= 0) {
|
||||
/* Read version to make sure this is
|
||||
actually a DRI device. */
|
||||
if ((version = drmGetVersion(fd))) {
|
||||
retval = 1;
|
||||
drmFreeVersion(version);
|
||||
}
|
||||
close(fd);
|
||||
if ((fd = drmOpenMinor(0, 1)) < 0) {
|
||||
/* Try proc for backward Linux compatibility */
|
||||
if (!access("/proc/dri/0", R_OK)) return 1;
|
||||
return 0;
|
||||
}
|
||||
remove(dev_name);
|
||||
|
||||
if ((version = drmGetVersion(fd))) {
|
||||
retval = 1;
|
||||
drmFreeVersion(version);
|
||||
}
|
||||
close(fd);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int drmOpenByBusid(const char *busid)
|
||||
{
|
||||
int i;
|
||||
char dev_name[64];
|
||||
char *buf;
|
||||
int fd;
|
||||
|
||||
for (i = 0; i < 8; i++) {
|
||||
sprintf(dev_name, "/dev/dri/card%d", i);
|
||||
if ((fd = drm_open(dev_name)) >= 0) {
|
||||
int i;
|
||||
int fd;
|
||||
const char *buf;
|
||||
|
||||
for (i = 0; i < DRM_MAX_MINOR; i++) {
|
||||
if ((fd = drmOpenMinor(i, 0)) >= 0) {
|
||||
buf = drmGetBusid(fd);
|
||||
if (buf && !strcmp(buf, busid)) {
|
||||
drmFreeBusid(buf);
|
||||
return fd;
|
||||
drmFreeBusid(buf);
|
||||
return fd;
|
||||
}
|
||||
if (buf) drmFreeBusid(buf);
|
||||
close(fd);
|
||||
|
|
@ -258,54 +284,43 @@ static int drmOpenByBusid(const char *busid)
|
|||
|
||||
static int drmOpenByName(const char *name)
|
||||
{
|
||||
int i;
|
||||
char proc_name[64];
|
||||
char dev_name[64];
|
||||
char buf[512];
|
||||
mode_t mode = DRM_DEV_MODE;
|
||||
mode_t dirmode;
|
||||
gid_t group = DRM_DEV_GID;
|
||||
uid_t user = DRM_DEV_UID;
|
||||
int fd;
|
||||
char *pt;
|
||||
char *driver = NULL;
|
||||
char *devstring;
|
||||
long dev = 0;
|
||||
int retcode;
|
||||
|
||||
#if defined(XFree86Server)
|
||||
mode = xf86ConfigDRI.mode ? xf86ConfigDRI.mode : DRM_DEV_MODE;
|
||||
group = (xf86ConfigDRI.group >= 0) ? xf86ConfigDRI.group : DRM_DEV_GID;
|
||||
#endif
|
||||
|
||||
#if defined(XFree86Server)
|
||||
int i;
|
||||
int fd;
|
||||
drmVersionPtr version;
|
||||
|
||||
if (!drmAvailable()) {
|
||||
#if !defined(XFree86Server)
|
||||
return -1;
|
||||
#else
|
||||
/* try to load the kernel module now */
|
||||
if (!xf86LoadKernelModule(name)) {
|
||||
ErrorF("[drm] failed to load kernel module \"%s\"\n",
|
||||
name);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
#else
|
||||
if (!drmAvailable())
|
||||
return -1;
|
||||
#endif
|
||||
|
||||
if (!geteuid()) {
|
||||
dirmode = mode;
|
||||
if (dirmode & S_IRUSR) dirmode |= S_IXUSR;
|
||||
if (dirmode & S_IRGRP) dirmode |= S_IXGRP;
|
||||
if (dirmode & S_IROTH) dirmode |= S_IXOTH;
|
||||
dirmode &= ~(S_IWGRP | S_IWOTH);
|
||||
mkdir("/dev/dri", 0);
|
||||
chown("/dev/dri", user, group);
|
||||
chmod("/dev/dri", dirmode);
|
||||
}
|
||||
|
||||
for (i = 0; i < DRM_MAX_MINOR; i++) {
|
||||
if ((fd = drmOpenMinor(i, 1)) >= 0) {
|
||||
if ((version = drmGetVersion(fd))) {
|
||||
if (!strcmp(version->name, name)) {
|
||||
drmFreeVersion(version);
|
||||
return fd;
|
||||
}
|
||||
drmFreeVersion(version);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef __linux__
|
||||
/* Backward-compatibility /proc support */
|
||||
for (i = 0; i < 8; i++) {
|
||||
char proc_name[64], buf[512];
|
||||
char *driver, *pt, *devstring;
|
||||
int retcode;
|
||||
|
||||
sprintf(proc_name, "/proc/dri/%d/name", i);
|
||||
sprintf(dev_name, "/dev/dri/card%d", i);
|
||||
if ((fd = open(proc_name, 0, 0)) >= 0) {
|
||||
retcode = read(fd, buf, sizeof(buf)-1);
|
||||
close(fd);
|
||||
|
|
@ -319,34 +334,17 @@ static int drmOpenByName(const char *name)
|
|||
for (devstring = ++pt; *pt && *pt != ' '; ++pt)
|
||||
;
|
||||
if (*pt) { /* Found busid */
|
||||
return drmOpenByBusid(++pt);
|
||||
return drmOpenByBusid(++pt);
|
||||
} else { /* No busid */
|
||||
dev = strtol(devstring, NULL, 0);
|
||||
return drmOpenDevice(dev_name, dev,
|
||||
mode, user, group);
|
||||
return drmOpenDevice(strtol(devstring, NULL, 0),i);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
drmVersionPtr version;
|
||||
/* /proc/dri not available, possibly
|
||||
because we aren't on a Linux system.
|
||||
So, try to create the next device and
|
||||
see if it's active. */
|
||||
dev = makedev(DRM_FIXED_DEVICE_MAJOR, i);
|
||||
if ((fd = drmOpenDevice(dev_name, dev, mode, user, group))) {
|
||||
if ((version = drmGetVersion(fd))) {
|
||||
if (!strcmp(version->name, name)) {
|
||||
drmFreeVersion(version);
|
||||
return fd;
|
||||
}
|
||||
drmFreeVersion(version);
|
||||
}
|
||||
}
|
||||
remove(dev_name);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
|
@ -408,7 +406,7 @@ drmVersionPtr drmGetVersion(int fd)
|
|||
version->date = NULL;
|
||||
version->desc_len = 0;
|
||||
version->desc = NULL;
|
||||
|
||||
|
||||
if (ioctl(fd, DRM_IOCTL_VERSION, version)) {
|
||||
drmFreeKernelVersion(version);
|
||||
return NULL;
|
||||
|
|
@ -421,7 +419,7 @@ drmVersionPtr drmGetVersion(int fd)
|
|||
version->date = drmMalloc(version->date_len + 1);
|
||||
if (version->desc_len)
|
||||
version->desc = drmMalloc(version->desc_len + 1);
|
||||
|
||||
|
||||
if (ioctl(fd, DRM_IOCTL_VERSION, version)) {
|
||||
drmFreeKernelVersion(version);
|
||||
return NULL;
|
||||
|
|
@ -503,7 +501,7 @@ int drmAddMap(int fd,
|
|||
map.offset = offset;
|
||||
#ifdef __alpha__
|
||||
/* Make sure we add the bus_base to all but shm */
|
||||
if (type != DRM_SHM)
|
||||
if (type != DRM_SHM)
|
||||
map.offset += BUS_BASE;
|
||||
#endif
|
||||
map.size = size;
|
||||
|
|
@ -519,14 +517,14 @@ int drmAddBufs(int fd, int count, int size, drmBufDescFlags flags,
|
|||
int agp_offset)
|
||||
{
|
||||
drm_buf_desc_t request;
|
||||
|
||||
|
||||
request.count = count;
|
||||
request.size = size;
|
||||
request.low_mark = 0;
|
||||
request.high_mark = 0;
|
||||
request.flags = flags;
|
||||
request.agp_start = agp_offset;
|
||||
|
||||
|
||||
if (ioctl(fd, DRM_IOCTL_ADD_BUFS, &request)) return -errno;
|
||||
return request.count;
|
||||
}
|
||||
|
|
@ -542,16 +540,16 @@ int drmMarkBufs(int fd, double low, double high)
|
|||
if (ioctl(fd, DRM_IOCTL_INFO_BUFS, &info)) return -EINVAL;
|
||||
|
||||
if (!info.count) return -EINVAL;
|
||||
|
||||
|
||||
if (!(info.list = drmMalloc(info.count * sizeof(*info.list))))
|
||||
return -ENOMEM;
|
||||
|
||||
|
||||
if (ioctl(fd, DRM_IOCTL_INFO_BUFS, &info)) {
|
||||
int retval = -errno;
|
||||
drmFree(info.list);
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
||||
for (i = 0; i < info.count; i++) {
|
||||
info.list[i].low_mark = low * info.list[i].count;
|
||||
info.list[i].high_mark = high * info.list[i].count;
|
||||
|
|
@ -562,7 +560,7 @@ int drmMarkBufs(int fd, double low, double high)
|
|||
}
|
||||
}
|
||||
drmFree(info.list);
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -630,7 +628,7 @@ drmBufInfoPtr drmGetBufInfo(int fd)
|
|||
if (info.count) {
|
||||
if (!(info.list = drmMalloc(info.count * sizeof(*info.list))))
|
||||
return NULL;
|
||||
|
||||
|
||||
if (ioctl(fd, DRM_IOCTL_INFO_BUFS, &info)) {
|
||||
drmFree(info.list);
|
||||
return NULL;
|
||||
|
|
@ -657,7 +655,7 @@ drmBufMapPtr drmMapBufs(int fd)
|
|||
drm_buf_map_t bufs;
|
||||
drmBufMapPtr retval;
|
||||
int i;
|
||||
|
||||
|
||||
bufs.count = 0;
|
||||
bufs.list = NULL;
|
||||
if (ioctl(fd, DRM_IOCTL_MAP_BUFS, &bufs)) return NULL;
|
||||
|
|
@ -689,16 +687,19 @@ drmBufMapPtr drmMapBufs(int fd)
|
|||
int drmUnmapBufs(drmBufMapPtr bufs)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
||||
for (i = 0; i < bufs->count; i++) {
|
||||
munmap(bufs->list[i].address, bufs->list[i].total);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define DRM_DMA_RETRY 16
|
||||
|
||||
int drmDMA(int fd, drmDMAReqPtr request)
|
||||
{
|
||||
drm_dma_t dma;
|
||||
int ret, i = 0;
|
||||
|
||||
/* Copy to hidden structure */
|
||||
dma.context = request->context;
|
||||
|
|
@ -710,10 +711,17 @@ int drmDMA(int fd, drmDMAReqPtr request)
|
|||
dma.request_size = request->request_size;
|
||||
dma.request_indices = request->request_list;
|
||||
dma.request_sizes = request->request_sizes;
|
||||
if (ioctl(fd, DRM_IOCTL_DMA, &dma)) return -errno;
|
||||
request->granted_count = dma.granted_count;
|
||||
|
||||
return 0;
|
||||
|
||||
do {
|
||||
ret = ioctl( fd, DRM_IOCTL_DMA, &dma );
|
||||
} while ( ret && errno == EAGAIN && i++ < DRM_DMA_RETRY );
|
||||
|
||||
if ( ret == 0 ) {
|
||||
request->granted_count = dma.granted_count;
|
||||
return 0;
|
||||
} else {
|
||||
return -errno;
|
||||
}
|
||||
}
|
||||
|
||||
int drmGetLock(int fd, drmContext context, drmLockFlags flags)
|
||||
|
|
@ -728,7 +736,7 @@ int drmGetLock(int fd, drmContext context, drmLockFlags flags)
|
|||
if (flags & DRM_LOCK_FLUSH_ALL) lock.flags |= _DRM_LOCK_FLUSH_ALL;
|
||||
if (flags & DRM_HALT_ALL_QUEUES) lock.flags |= _DRM_HALT_ALL_QUEUES;
|
||||
if (flags & DRM_HALT_CUR_QUEUES) lock.flags |= _DRM_HALT_CUR_QUEUES;
|
||||
|
||||
|
||||
while (ioctl(fd, DRM_IOCTL_LOCK, &lock))
|
||||
;
|
||||
return 0;
|
||||
|
|
@ -827,7 +835,7 @@ int drmGetContextFlags(int fd, drmContext context, drmContextFlagsPtr flags)
|
|||
if (ctx.flags & _DRM_CONTEXT_2DONLY) *flags |= DRM_CONTEXT_2DONLY;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int drmDestroyContext(int fd, drmContext handle)
|
||||
{
|
||||
drm_ctx_t ctx;
|
||||
|
|
@ -1074,12 +1082,166 @@ void *drmGetContextTag(int fd, drmContext context)
|
|||
{
|
||||
drmHashEntry *entry = drmGetEntry(fd);
|
||||
void *value;
|
||||
|
||||
|
||||
if (drmHashLookup(entry->tagTable, context, &value)) return NULL;
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
int drmGetMap(int fd, int idx, drmHandle *offset, drmSize *size,
|
||||
drmMapType *type, drmMapFlags *flags, drmHandle *handle,
|
||||
int *mtrr)
|
||||
{
|
||||
drm_map_t map;
|
||||
|
||||
map.offset = idx;
|
||||
if (ioctl(fd, DRM_IOCTL_GET_MAP, &map)) return -errno;
|
||||
*offset = map.offset;
|
||||
*size = map.size;
|
||||
*type = map.type;
|
||||
*flags = map.flags;
|
||||
*handle = (unsigned long)map.handle;
|
||||
*mtrr = map.mtrr;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int drmGetClient(int fd, int idx, int *auth, int *pid, int *uid,
|
||||
unsigned long *magic, unsigned long *iocs)
|
||||
{
|
||||
drm_client_t client;
|
||||
|
||||
client.idx = idx;
|
||||
if (ioctl(fd, DRM_IOCTL_GET_CLIENT, &client)) return -errno;
|
||||
*auth = client.auth;
|
||||
*pid = client.pid;
|
||||
*uid = client.uid;
|
||||
*magic = client.magic;
|
||||
*iocs = client.iocs;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int drmGetStats(int fd, drmStatsT *stats)
|
||||
{
|
||||
drm_stats_t s;
|
||||
int i;
|
||||
|
||||
if (ioctl(fd, DRM_IOCTL_GET_STATS, &s)) return -errno;
|
||||
|
||||
stats->count = 0;
|
||||
memset(stats, 0, sizeof(*stats));
|
||||
if (s.count > sizeof(stats->data)/sizeof(stats->data[0]))
|
||||
return -1;
|
||||
|
||||
#define SET_VALUE \
|
||||
stats->data[i].long_format = "%-20.20s"; \
|
||||
stats->data[i].rate_format = "%8.8s"; \
|
||||
stats->data[i].isvalue = 1; \
|
||||
stats->data[i].verbose = 0
|
||||
|
||||
#define SET_COUNT \
|
||||
stats->data[i].long_format = "%-20.20s"; \
|
||||
stats->data[i].rate_format = "%5.5s"; \
|
||||
stats->data[i].isvalue = 0; \
|
||||
stats->data[i].mult_names = "kgm"; \
|
||||
stats->data[i].mult = 1000; \
|
||||
stats->data[i].verbose = 0
|
||||
|
||||
#define SET_BYTE \
|
||||
stats->data[i].long_format = "%-20.20s"; \
|
||||
stats->data[i].rate_format = "%5.5s"; \
|
||||
stats->data[i].isvalue = 0; \
|
||||
stats->data[i].mult_names = "KGM"; \
|
||||
stats->data[i].mult = 1024; \
|
||||
stats->data[i].verbose = 0
|
||||
|
||||
|
||||
stats->count = s.count;
|
||||
for (i = 0; i < s.count; i++) {
|
||||
stats->data[i].value = s.data[i].value;
|
||||
switch (s.data[i].type) {
|
||||
case _DRM_STAT_LOCK:
|
||||
stats->data[i].long_name = "Lock";
|
||||
stats->data[i].rate_name = "Lock";
|
||||
SET_VALUE;
|
||||
break;
|
||||
case _DRM_STAT_OPENS:
|
||||
stats->data[i].long_name = "Opens";
|
||||
stats->data[i].rate_name = "O";
|
||||
SET_COUNT;
|
||||
stats->data[i].verbose = 1;
|
||||
break;
|
||||
case _DRM_STAT_CLOSES:
|
||||
stats->data[i].long_name = "Closes";
|
||||
stats->data[i].rate_name = "Lock";
|
||||
SET_COUNT;
|
||||
stats->data[i].verbose = 1;
|
||||
break;
|
||||
case _DRM_STAT_IOCTLS:
|
||||
stats->data[i].long_name = "Ioctls";
|
||||
stats->data[i].rate_name = "Ioc/s";
|
||||
SET_COUNT;
|
||||
break;
|
||||
case _DRM_STAT_LOCKS:
|
||||
stats->data[i].long_name = "Locks";
|
||||
stats->data[i].rate_name = "Lck/s";
|
||||
SET_COUNT;
|
||||
break;
|
||||
case _DRM_STAT_UNLOCKS:
|
||||
stats->data[i].long_name = "Unlocks";
|
||||
stats->data[i].rate_name = "Unl/s";
|
||||
SET_COUNT;
|
||||
break;
|
||||
case _DRM_STAT_IRQ:
|
||||
stats->data[i].long_name = "IRQs";
|
||||
stats->data[i].rate_name = "IRQ/s";
|
||||
SET_COUNT;
|
||||
break;
|
||||
case _DRM_STAT_PRIMARY:
|
||||
stats->data[i].long_name = "Primary Bytes";
|
||||
stats->data[i].rate_name = "PB/s";
|
||||
SET_BYTE;
|
||||
break;
|
||||
case _DRM_STAT_SECONDARY:
|
||||
stats->data[i].long_name = "Secondary Bytes";
|
||||
stats->data[i].rate_name = "SB/s";
|
||||
SET_BYTE;
|
||||
break;
|
||||
case _DRM_STAT_DMA:
|
||||
stats->data[i].long_name = "DMA";
|
||||
stats->data[i].rate_name = "DMA/s";
|
||||
SET_COUNT;
|
||||
break;
|
||||
case _DRM_STAT_SPECIAL:
|
||||
stats->data[i].long_name = "Special DMA";
|
||||
stats->data[i].rate_name = "dma/s";
|
||||
SET_COUNT;
|
||||
break;
|
||||
case _DRM_STAT_MISSED:
|
||||
stats->data[i].long_name = "Miss";
|
||||
stats->data[i].rate_name = "Ms/s";
|
||||
SET_COUNT;
|
||||
break;
|
||||
case _DRM_STAT_VALUE:
|
||||
stats->data[i].long_name = "Value";
|
||||
stats->data[i].rate_name = "Value";
|
||||
SET_VALUE;
|
||||
break;
|
||||
case _DRM_STAT_BYTE:
|
||||
stats->data[i].long_name = "Bytes";
|
||||
stats->data[i].rate_name = "B/s";
|
||||
SET_BYTE;
|
||||
break;
|
||||
case _DRM_STAT_COUNT:
|
||||
default:
|
||||
stats->data[i].long_name = "Count";
|
||||
stats->data[i].rate_name = "Cnt/s";
|
||||
SET_COUNT;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if defined(XFree86Server) || defined(DRM_USE_MALLOC)
|
||||
static void drmSIGIOHandler(int interrupt, void *closure)
|
||||
{
|
||||
|
|
@ -1108,7 +1270,7 @@ static void drmSIGIOHandler(int interrupt, void *closure)
|
|||
#if 0
|
||||
fprintf(stderr, "Got %s\n", buf);
|
||||
#endif
|
||||
|
||||
|
||||
for (pt = buf; *pt != ' '; ++pt); /* Find first space */
|
||||
++pt;
|
||||
old = strtol(pt, &pt, 0);
|
||||
|
|
@ -1141,7 +1303,7 @@ int drmRemoveSIGIOHandler(int fd)
|
|||
drmHashEntry *entry = drmGetEntry(fd);
|
||||
|
||||
entry->f = NULL;
|
||||
|
||||
|
||||
return xf86RemoveSIGIOHandler(fd);
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -31,6 +31,10 @@
|
|||
#define __NO_VERSION__
|
||||
#include "drmP.h"
|
||||
|
||||
#if LINUX_VERSION_CODE < 0x020400
|
||||
#include "stubsupport-pre24.h"
|
||||
#endif
|
||||
|
||||
#define DRM_STUB_MAXCARDS 16 /* Enough for one machine */
|
||||
|
||||
static struct drm_stub_list {
|
||||
|
|
@ -120,10 +124,13 @@ static int DRM(stub_putminor)(int minor)
|
|||
int DRM(stub_register)(const char *name, struct file_operations *fops,
|
||||
drm_device_t *dev)
|
||||
{
|
||||
if (register_chrdev(DRM_MAJOR, "drm", &DRM(stub_fops))) {
|
||||
/* Already registered */
|
||||
struct drm_stub_info *i;
|
||||
struct drm_stub_info *i = NULL;
|
||||
|
||||
if (register_chrdev(DRM_MAJOR, "drm", &DRM(stub_fops)))
|
||||
i = (struct drm_stub_info *)inter_module_get("drm");
|
||||
|
||||
if (i) {
|
||||
/* Already registered */
|
||||
DRM(stub_info).info_register = i->info_register;
|
||||
DRM(stub_info).info_unregister = i->info_unregister;
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@
|
|||
|
||||
#define DRIVER_NAME "radeon"
|
||||
#define DRIVER_DESC "ATI Radeon"
|
||||
#define DRIVER_DATE "20010216"
|
||||
#define DRIVER_DATE "20010301"
|
||||
|
||||
#define DRIVER_MAJOR 1
|
||||
#define DRIVER_MINOR 0
|
||||
|
|
|
|||
|
|
@ -174,7 +174,7 @@ all::;@echo === SMP=${SMP} MODULES=${MODULES} MODVERSIONS=${MODVERSIONS} AGP=${A
|
|||
all::;@echo === kill_fasync has $(PARAMS) parameters
|
||||
all::;@echo === Compiling for machine $(MACHINE)
|
||||
all::;@echo === WARNING
|
||||
all::;@echo === WARNING 2.4.0 kernels before test11 DONT WORK
|
||||
all::;@echo === WARNING 2.4.0 kernels before 2.4.0-test11 DO NOT WORK
|
||||
all::;@echo === WARNING
|
||||
|
||||
ifeq ($(MODULES),0)
|
||||
|
|
|
|||
|
|
@ -45,6 +45,7 @@
|
|||
/* This is a hack that only works for
|
||||
this code base -- because we always
|
||||
call this with dev->tq.* */
|
||||
#undef INIT_LIST_HEAD
|
||||
#define INIT_LIST_HEAD(pointer) dev->tq.next = NULL
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -44,11 +44,8 @@
|
|||
#define DRM_IOCTL_NR(n) ((n) & 0xff)
|
||||
#endif
|
||||
|
||||
#define DRM_DEV_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP)
|
||||
#define DRM_DEV_UID 0
|
||||
#define DRM_DEV_GID 0
|
||||
|
||||
#define DRM_MAJOR 226
|
||||
#define DRM_MAX_MINOR 15
|
||||
#define DRM_NAME "drm" /* Name in kernel, /dev, and /proc */
|
||||
#define DRM_MIN_ORDER 5 /* At least 2^5 bytes = 32 bytes */
|
||||
#define DRM_MAX_ORDER 22 /* Up to 2^22 bytes = 4MB */
|
||||
|
|
|
|||
|
|
@ -31,6 +31,10 @@
|
|||
#define __NO_VERSION__
|
||||
#include "drmP.h"
|
||||
|
||||
#if LINUX_VERSION_CODE < 0x020400
|
||||
#include "stubsupport-pre24.h"
|
||||
#endif
|
||||
|
||||
#define DRM_STUB_MAXCARDS 16 /* Enough for one machine */
|
||||
|
||||
static struct drm_stub_list {
|
||||
|
|
@ -120,10 +124,13 @@ static int DRM(stub_putminor)(int minor)
|
|||
int DRM(stub_register)(const char *name, struct file_operations *fops,
|
||||
drm_device_t *dev)
|
||||
{
|
||||
if (register_chrdev(DRM_MAJOR, "drm", &DRM(stub_fops))) {
|
||||
/* Already registered */
|
||||
struct drm_stub_info *i;
|
||||
struct drm_stub_info *i = NULL;
|
||||
|
||||
if (register_chrdev(DRM_MAJOR, "drm", &DRM(stub_fops)))
|
||||
i = (struct drm_stub_info *)inter_module_get("drm");
|
||||
|
||||
if (i) {
|
||||
/* Already registered */
|
||||
DRM(stub_info).info_register = i->info_register;
|
||||
DRM(stub_info).info_unregister = i->info_unregister;
|
||||
} else {
|
||||
|
|
|
|||
113
linux/mga_dma.c
113
linux/mga_dma.c
|
|
@ -56,7 +56,10 @@ int mga_do_wait_for_idle( drm_mga_private_t *dev_priv )
|
|||
|
||||
for ( i = 0 ; i < dev_priv->usec_timeout ; i++ ) {
|
||||
status = MGA_READ( MGA_STATUS ) & MGA_ENGINE_IDLE_MASK;
|
||||
if ( status == MGA_ENDPRDMASTS ) return 0;
|
||||
if ( status == MGA_ENDPRDMASTS ) {
|
||||
MGA_WRITE8( MGA_CRTC_INDEX, 0 );
|
||||
return 0;
|
||||
}
|
||||
udelay( 1 );
|
||||
}
|
||||
|
||||
|
|
@ -80,33 +83,37 @@ int mga_do_dma_idle( drm_mga_private_t *dev_priv )
|
|||
return -EBUSY;
|
||||
}
|
||||
|
||||
int mga_do_dma_reset( drm_mga_private_t *dev_priv )
|
||||
int mga_do_dma_reset( drm_device_t *dev )
|
||||
{
|
||||
drm_mga_private_t *dev_priv = dev->dev_private;
|
||||
drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
|
||||
drm_mga_primary_buffer_t *primary = &dev_priv->prim;
|
||||
|
||||
DRM_DEBUG( "%s\n", __FUNCTION__ );
|
||||
DRM_INFO( "%s\n", __FUNCTION__ );
|
||||
|
||||
/* The primary DMA stream should look like new right about now.
|
||||
*/
|
||||
primary->tail = 0;
|
||||
primary->space = primary->size;
|
||||
primary->last_flush = 0;
|
||||
primary->last_wrap = 0;
|
||||
|
||||
primary->status[0] = dev_priv->primary->offset;
|
||||
primary->status[1] = 0;
|
||||
|
||||
sarea_priv->last_wrap = 0;
|
||||
sarea_priv->last_frame.head = 0;
|
||||
sarea_priv->last_frame.wrap = 0;
|
||||
|
||||
/* FIXME: Reset counters, buffer ages etc...
|
||||
*/
|
||||
|
||||
/* FIXME: What else do we need to reinitialize? WARP stuff?
|
||||
*/
|
||||
mga_freelist_reset( dev );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int mga_do_engine_reset( drm_mga_private_t *dev_priv )
|
||||
int mga_do_engine_reset( drm_device_t *dev )
|
||||
{
|
||||
DRM_DEBUG( "%s\n", __FUNCTION__ );
|
||||
drm_mga_private_t *dev_priv = dev->dev_private;
|
||||
DRM_INFO( "%s\n", __FUNCTION__ );
|
||||
|
||||
/* Okay, so we've completely screwed up and locked the engine.
|
||||
* How about we clean up after ourselves?
|
||||
|
|
@ -122,19 +129,21 @@ int mga_do_engine_reset( drm_mga_private_t *dev_priv )
|
|||
* 3D clients should probably die after calling this. The X
|
||||
* server should reset the engine state to known values.
|
||||
*/
|
||||
#if 0
|
||||
MGA_WRITE( MGA_PRIMPTR,
|
||||
virt_to_bus((void *)dev_priv->prim.status_page) |
|
||||
MGA_PRIMPTREN0 |
|
||||
MGA_PRIMPTREN1 );
|
||||
#endif
|
||||
|
||||
MGA_WRITE( MGA_ICLEAR, MGA_SOFTRAPICLR );
|
||||
MGA_WRITE( MGA_IEN, MGA_SOFTRAPIEN );
|
||||
virt_to_bus((void *)dev_priv->prim.status) |
|
||||
MGA_PRIMPTREN0 | /* Soft trap, SECEND, SETUPEND */
|
||||
MGA_PRIMPTREN1 ); /* DWGSYNC */
|
||||
|
||||
/* The primary DMA stream should look like new right about now.
|
||||
*/
|
||||
mga_do_dma_reset( dev_priv );
|
||||
mga_do_dma_reset( dev );
|
||||
|
||||
/* Initialize the WARP engine again.
|
||||
*/
|
||||
if ( mga_warp_init( dev_priv ) < 0 ) {
|
||||
/* Can we do anything else? */
|
||||
DRM_ERROR( "failed to reinit WARP engine!\n" );
|
||||
}
|
||||
|
||||
/* This bad boy will never fail.
|
||||
*/
|
||||
|
|
@ -269,7 +278,8 @@ static void mga_freelist_print( drm_device_t *dev )
|
|||
DRM_INFO( "\n" );
|
||||
DRM_INFO( "current dispatch: last=0x%x done=0x%x\n",
|
||||
dev_priv->sarea_priv->last_dispatch,
|
||||
*dev_priv->prim.head - dev_priv->primary->offset );
|
||||
(unsigned int)(*dev_priv->prim.head -
|
||||
dev_priv->primary->offset) );
|
||||
DRM_INFO( "current freelist:\n" );
|
||||
|
||||
for ( entry = dev_priv->head->next ; entry ; entry = entry->next ) {
|
||||
|
|
@ -350,7 +360,6 @@ static void mga_freelist_cleanup( drm_device_t *dev )
|
|||
static void mga_freelist_reset( drm_device_t *dev )
|
||||
{
|
||||
drm_device_dma_t *dma = dev->dma;
|
||||
drm_mga_private_t *dev_priv = dev->dev_private;
|
||||
drm_buf_t *buf;
|
||||
drm_mga_buf_priv_t *buf_priv;
|
||||
int i;
|
||||
|
|
@ -408,15 +417,17 @@ int mga_freelist_put( drm_device_t *dev, drm_buf_t *buf )
|
|||
dev_priv->primary->offset,
|
||||
buf_priv->list_entry->age.wrap );
|
||||
|
||||
/* Put buffer on the head + 1, as the head is a sentinal.
|
||||
*/
|
||||
|
||||
next = buf_priv->list_entry;
|
||||
head = dev_priv->head;
|
||||
prev = head->next;
|
||||
|
||||
if ( buf_priv->list_entry->age.head == MGA_BUFFER_USED ) {
|
||||
SET_AGE( &next->age, MGA_BUFFER_FREE, 0 );
|
||||
}
|
||||
|
||||
/* Put buffer on the head + 1, as the head is a sentinal.
|
||||
*/
|
||||
next = buf_priv->list_entry;
|
||||
head = dev_priv->head;
|
||||
prev = head->next;
|
||||
head->next = next;
|
||||
prev->prev = next;
|
||||
next->prev = head;
|
||||
|
|
@ -482,14 +493,14 @@ static int mga_do_init_dma( drm_device_t *dev, drm_mga_init_t *init )
|
|||
DRM_IOREMAP( dev_priv->primary );
|
||||
DRM_IOREMAP( dev_priv->buffers );
|
||||
|
||||
ret = mga_warp_install_microcode( dev );
|
||||
ret = mga_warp_install_microcode( dev_priv );
|
||||
if ( ret < 0 ) {
|
||||
DRM_ERROR( "failed to install WARP ucode!\n" );
|
||||
mga_do_cleanup_dma( dev );
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = mga_warp_init( dev );
|
||||
ret = mga_warp_init( dev_priv );
|
||||
if ( ret < 0 ) {
|
||||
DRM_ERROR( "failed to init WARP engine!\n" );
|
||||
mga_do_cleanup_dma( dev );
|
||||
|
|
@ -539,6 +550,49 @@ static int mga_do_init_dma( drm_device_t *dev, drm_mga_init_t *init )
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
|
||||
if ( 0 ) {
|
||||
drm_mga_primary_buffer_t *primary = &dev_priv->prim;
|
||||
u32 tail;
|
||||
DMA_LOCALS;
|
||||
|
||||
BEGIN_DMA( 4 );
|
||||
|
||||
DMA_BLOCK( MGA_DMAPAD, 0x00000000,
|
||||
MGA_DMAPAD, 0x00000000,
|
||||
MGA_DMAPAD, 0x00000000,
|
||||
MGA_DMAPAD, 0x00000000 );
|
||||
|
||||
DMA_BLOCK( MGA_DMAPAD, 0x00000000,
|
||||
MGA_DMAPAD, 0x00000000,
|
||||
MGA_DMAPAD, 0x00000000,
|
||||
MGA_DMAPAD, 0x00000000 );
|
||||
|
||||
DMA_BLOCK( MGA_DMAPAD, 0x00000000,
|
||||
MGA_DMAPAD, 0x00000000,
|
||||
MGA_DMAPAD, 0x00000000,
|
||||
MGA_DMAPAD, 0x00000000 );
|
||||
|
||||
DMA_BLOCK( MGA_DMAPAD, 0x00000000,
|
||||
MGA_DMAPAD, 0x00000000,
|
||||
MGA_DMAPAD, 0x00000000,
|
||||
MGA_DMAPAD, 0x00000000 );
|
||||
|
||||
ADVANCE_DMA();
|
||||
|
||||
tail = primary->tail + dev_priv->primary->offset - 4096;
|
||||
|
||||
mga_flush_write_combine();
|
||||
MGA_WRITE( MGA_PRIMEND, tail | MGA_PAGPXFER );
|
||||
|
||||
|
||||
if ( mga_do_wait_for_idle( dev_priv ) < 0 ) {
|
||||
DRM_INFO( "cool, we're fucked!\n" );
|
||||
mga_do_engine_reset( dev );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -627,11 +681,10 @@ int mga_dma_reset( struct inode *inode, struct file *filp,
|
|||
{
|
||||
drm_file_t *priv = filp->private_data;
|
||||
drm_device_t *dev = priv->dev;
|
||||
drm_mga_private_t *dev_priv = (drm_mga_private_t *)dev->dev_private;
|
||||
|
||||
LOCK_TEST_WITH_RETURN( dev );
|
||||
|
||||
return mga_do_dma_reset( dev_priv );
|
||||
return mga_do_dma_reset( dev );
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -114,8 +114,9 @@ extern int mga_dma_buffers( struct inode *inode, struct file *filp,
|
|||
|
||||
extern int mga_do_wait_for_idle( drm_mga_private_t *dev_priv );
|
||||
extern int mga_do_dma_idle( drm_mga_private_t *dev_priv );
|
||||
extern int mga_do_dma_reset( drm_mga_private_t *dev_priv );
|
||||
extern int mga_do_engine_reset( drm_mga_private_t *dev_priv );
|
||||
|
||||
extern int mga_do_dma_reset( drm_device_t *dev );
|
||||
extern int mga_do_engine_reset( drm_device_t *dev );
|
||||
extern int mga_do_cleanup_dma( drm_device_t *dev );
|
||||
|
||||
extern void mga_do_dma_flush( drm_mga_private_t *dev_priv );
|
||||
|
|
@ -140,8 +141,8 @@ extern int mga_dma_blit( struct inode *inode, struct file *filp,
|
|||
unsigned int cmd, unsigned long arg );
|
||||
|
||||
/* mga_warp.c */
|
||||
extern int mga_warp_install_microcode( drm_device_t *dev );
|
||||
extern int mga_warp_init( drm_device_t *dev );
|
||||
extern int mga_warp_install_microcode( drm_mga_private_t *dev_priv );
|
||||
extern int mga_warp_init( drm_mga_private_t *dev_priv );
|
||||
|
||||
#define mga_flush_write_combine() mb()
|
||||
|
||||
|
|
@ -152,7 +153,8 @@ extern int mga_warp_init( drm_device_t *dev );
|
|||
#define MGA_DEREF( reg ) *(volatile u32 *)MGA_ADDR( reg )
|
||||
#define MGA_READ( reg ) MGA_DEREF( reg )
|
||||
#define MGA_WRITE( reg, val ) do { MGA_DEREF( reg ) = val; } while (0)
|
||||
|
||||
#define MGA_DEREF8( reg ) *(volatile u8 *)MGA_ADDR( reg )
|
||||
#define MGA_WRITE8( reg, val ) do { MGA_DEREF8( reg ) = val; } while (0)
|
||||
|
||||
#define DWGREG0 0x1c00
|
||||
#define DWGREG0_END 0x1dff
|
||||
|
|
@ -316,6 +318,7 @@ do { \
|
|||
|
||||
/* A reduced set of the mga registers.
|
||||
*/
|
||||
#define MGA_CRTC_INDEX 0x1fd4
|
||||
|
||||
#define MGA_ALPHACTRL 0x2c7c
|
||||
#define MGA_AR0 0x1c60
|
||||
|
|
|
|||
|
|
@ -160,9 +160,8 @@ static int mga_warp_install_g200_microcode( drm_mga_private_t *dev_priv )
|
|||
return 0;
|
||||
}
|
||||
|
||||
int mga_warp_install_microcode( drm_device_t *dev )
|
||||
int mga_warp_install_microcode( drm_mga_private_t *dev_priv )
|
||||
{
|
||||
drm_mga_private_t *dev_priv = dev->dev_private;
|
||||
DRM_DEBUG( "%s\n", __FUNCTION__ );
|
||||
|
||||
switch ( dev_priv->chipset ) {
|
||||
|
|
@ -177,9 +176,8 @@ int mga_warp_install_microcode( drm_device_t *dev )
|
|||
|
||||
#define WMISC_EXPECTED (MGA_WUCODECACHE_ENABLE | MGA_WMASTER_ENABLE)
|
||||
|
||||
int mga_warp_init( drm_device_t *dev )
|
||||
int mga_warp_init( drm_mga_private_t *dev_priv )
|
||||
{
|
||||
drm_mga_private_t *dev_priv = dev->dev_private;
|
||||
u32 wmisc;
|
||||
DRM_DEBUG( "%s\n", __FUNCTION__ );
|
||||
|
||||
|
|
|
|||
|
|
@ -60,11 +60,14 @@
|
|||
*/
|
||||
#define __HAVE_DMA 1
|
||||
|
||||
#if 0
|
||||
/* GH: Remove this for now... */
|
||||
#define __HAVE_DMA_QUIESCENT 1
|
||||
#define DRIVER_DMA_QUIESCENT() do { \
|
||||
drm_r128_private_t *dev_priv = dev->dev_private; \
|
||||
return r128_do_cce_idle( dev_priv ); \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
/* Buffer customization:
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -454,7 +454,8 @@ do { \
|
|||
|
||||
#define R128_VERBOSE 0
|
||||
|
||||
#define RING_LOCALS int write; unsigned int tail_mask; volatile u32 *ring;
|
||||
#define RING_LOCALS \
|
||||
int write; unsigned int tail_mask; volatile u32 *ring;
|
||||
|
||||
#define BEGIN_RING( n ) do { \
|
||||
if ( R128_VERBOSE ) { \
|
||||
|
|
@ -470,11 +471,23 @@ do { \
|
|||
tail_mask = dev_priv->ring.tail_mask; \
|
||||
} while (0)
|
||||
|
||||
/* You can set this to zero if you want. If the card locks up, you'll
|
||||
* need to keep this set. It works around a bug in early revs of the
|
||||
* Rage 128 chipset, where the CCE would read 32 dwords past the end of
|
||||
* the ring buffer before wrapping around.
|
||||
*/
|
||||
#define R128_BROKEN_CCE 1
|
||||
|
||||
#define ADVANCE_RING() do { \
|
||||
if ( R128_VERBOSE ) { \
|
||||
DRM_INFO( "ADVANCE_RING() tail=0x%06x wr=0x%06x\n", \
|
||||
write, dev_priv->ring.tail ); \
|
||||
} \
|
||||
if ( R128_BROKEN_CCE && write < 32 ) { \
|
||||
memcpy( dev_priv->ring.end, \
|
||||
dev_priv->ring.start, \
|
||||
write * sizeof(u32) ); \
|
||||
} \
|
||||
r128_flush_write_combine(); \
|
||||
dev_priv->ring.tail = write; \
|
||||
R128_WRITE( R128_PM4_BUFFER_DL_WPTR, write ); \
|
||||
|
|
|
|||
|
|
@ -61,6 +61,7 @@
|
|||
#define __HAVE_DMA 1
|
||||
|
||||
#if 0
|
||||
/* GH: Remove this for now... */
|
||||
#define __HAVE_DMA_QUIESCENT 1
|
||||
#define DRIVER_DMA_QUIESCENT() do { \
|
||||
drm_radeon_private_t *dev_priv = dev->dev_private; \
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@
|
|||
|
||||
#define DRIVER_NAME "radeon"
|
||||
#define DRIVER_DESC "ATI Radeon"
|
||||
#define DRIVER_DATE "20010216"
|
||||
#define DRIVER_DATE "20010301"
|
||||
|
||||
#define DRIVER_MAJOR 1
|
||||
#define DRIVER_MINOR 0
|
||||
|
|
|
|||
|
|
@ -44,11 +44,8 @@
|
|||
#define DRM_IOCTL_NR(n) ((n) & 0xff)
|
||||
#endif
|
||||
|
||||
#define DRM_DEV_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP)
|
||||
#define DRM_DEV_UID 0
|
||||
#define DRM_DEV_GID 0
|
||||
|
||||
#define DRM_MAJOR 226
|
||||
#define DRM_MAX_MINOR 15
|
||||
#define DRM_NAME "drm" /* Name in kernel, /dev, and /proc */
|
||||
#define DRM_MIN_ORDER 5 /* At least 2^5 bytes = 32 bytes */
|
||||
#define DRM_MAX_ORDER 22 /* Up to 2^22 bytes = 4MB */
|
||||
|
|
|
|||
|
|
@ -44,11 +44,8 @@
|
|||
#define DRM_IOCTL_NR(n) ((n) & 0xff)
|
||||
#endif
|
||||
|
||||
#define DRM_DEV_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP)
|
||||
#define DRM_DEV_UID 0
|
||||
#define DRM_DEV_GID 0
|
||||
|
||||
#define DRM_MAJOR 226
|
||||
#define DRM_MAX_MINOR 15
|
||||
#define DRM_NAME "drm" /* Name in kernel, /dev, and /proc */
|
||||
#define DRM_MIN_ORDER 5 /* At least 2^5 bytes = 32 bytes */
|
||||
#define DRM_MAX_ORDER 22 /* Up to 2^22 bytes = 4MB */
|
||||
|
|
|
|||
239
tests/dristat.c
239
tests/dristat.c
|
|
@ -35,28 +35,11 @@
|
|||
#include "../xf86drmHash.c"
|
||||
#include "../xf86drm.c"
|
||||
|
||||
#define DRM_DIR_NAME "/dev/dri"
|
||||
#define DRM_DEV_NAME "%s/card%d"
|
||||
|
||||
#define DRM_VERSION 0x00000001
|
||||
#define DRM_MEMORY 0x00000002
|
||||
#define DRM_CLIENTS 0x00000004
|
||||
#define DRM_STATS 0x00000008
|
||||
|
||||
typedef struct drmStatsS {
|
||||
unsigned long count;
|
||||
struct {
|
||||
unsigned long value;
|
||||
const char *long_format;
|
||||
const char *long_name;
|
||||
const char *rate_format;
|
||||
const char *rate_name;
|
||||
int isvalue;
|
||||
const char *mult_names;
|
||||
int mult;
|
||||
int verbose;
|
||||
} data[15];
|
||||
} drmStatsT;
|
||||
#define DRM_BUSID 0x00000010
|
||||
|
||||
static void getversion(int fd)
|
||||
{
|
||||
|
|
@ -78,6 +61,15 @@ static void getversion(int fd)
|
|||
}
|
||||
}
|
||||
|
||||
static void getbusid(int fd)
|
||||
{
|
||||
const char *busid = drmGetBusid(fd);
|
||||
|
||||
printf(" Busid: %s\n", *busid ? busid : "(not set)");
|
||||
drmFreeBusid(busid);
|
||||
}
|
||||
|
||||
#if 0
|
||||
typedef struct {
|
||||
unsigned long offset; /* Requested physical address (0 for SAREA)*/
|
||||
unsigned long size; /* Requested physical size (bytes) */
|
||||
|
|
@ -88,160 +80,7 @@ typedef struct {
|
|||
int mtrr; /* MTRR slot used */
|
||||
/* Private data */
|
||||
} drmVmRec, *drmVmPtr;
|
||||
|
||||
int drmGetMap(int fd, int idx, drmHandle *offset, drmSize *size,
|
||||
drmMapType *type, drmMapFlags *flags, drmHandle *handle,
|
||||
int *mtrr)
|
||||
{
|
||||
drm_map_t map;
|
||||
|
||||
map.offset = idx;
|
||||
if (ioctl(fd, DRM_IOCTL_GET_MAP, &map)) return -errno;
|
||||
*offset = map.offset;
|
||||
*size = map.size;
|
||||
*type = map.type;
|
||||
*flags = map.flags;
|
||||
*handle = (unsigned long)map.handle;
|
||||
*mtrr = map.mtrr;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int drmGetClient(int fd, int idx, int *auth, int *pid, int *uid,
|
||||
unsigned long *magic, unsigned long *iocs)
|
||||
{
|
||||
drm_client_t client;
|
||||
|
||||
client.idx = idx;
|
||||
if (ioctl(fd, DRM_IOCTL_GET_CLIENT, &client)) return -errno;
|
||||
*auth = client.auth;
|
||||
*pid = client.pid;
|
||||
*uid = client.uid;
|
||||
*magic = client.magic;
|
||||
*iocs = client.iocs;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int drmGetStats(int fd, drmStatsT *stats)
|
||||
{
|
||||
drm_stats_t s;
|
||||
int i;
|
||||
|
||||
if (ioctl(fd, DRM_IOCTL_GET_STATS, &s)) return -errno;
|
||||
|
||||
stats->count = 0;
|
||||
memset(stats, 0, sizeof(*stats));
|
||||
if (s.count > sizeof(stats->data)/sizeof(stats->data[0]))
|
||||
return -1;
|
||||
|
||||
#define SET_VALUE \
|
||||
stats->data[i].long_format = "%-20.20s"; \
|
||||
stats->data[i].rate_format = "%8.8s"; \
|
||||
stats->data[i].isvalue = 1; \
|
||||
stats->data[i].verbose = 0
|
||||
|
||||
#define SET_COUNT \
|
||||
stats->data[i].long_format = "%-20.20s"; \
|
||||
stats->data[i].rate_format = "%5.5s"; \
|
||||
stats->data[i].isvalue = 0; \
|
||||
stats->data[i].mult_names = "kgm"; \
|
||||
stats->data[i].mult = 1000; \
|
||||
stats->data[i].verbose = 0
|
||||
|
||||
#define SET_BYTE \
|
||||
stats->data[i].long_format = "%-9.9s"; \
|
||||
stats->data[i].rate_format = "%5.5s"; \
|
||||
stats->data[i].isvalue = 0; \
|
||||
stats->data[i].mult_names = "KGM"; \
|
||||
stats->data[i].mult = 1024; \
|
||||
stats->data[i].verbose = 0
|
||||
|
||||
|
||||
stats->count = s.count;
|
||||
for (i = 0; i < s.count; i++) {
|
||||
stats->data[i].value = s.data[i].value;
|
||||
switch (s.data[i].type) {
|
||||
case _DRM_STAT_LOCK:
|
||||
stats->data[i].long_name = "Lock";
|
||||
stats->data[i].rate_name = "Lock";
|
||||
SET_VALUE;
|
||||
break;
|
||||
case _DRM_STAT_OPENS:
|
||||
stats->data[i].long_name = "Opens";
|
||||
stats->data[i].rate_name = "O";
|
||||
SET_COUNT;
|
||||
stats->data[i].verbose = 1;
|
||||
break;
|
||||
case _DRM_STAT_CLOSES:
|
||||
stats->data[i].long_name = "Closes";
|
||||
stats->data[i].rate_name = "Lock";
|
||||
SET_COUNT;
|
||||
stats->data[i].verbose = 1;
|
||||
break;
|
||||
case _DRM_STAT_IOCTLS:
|
||||
stats->data[i].long_name = "Ioctls";
|
||||
stats->data[i].rate_name = "Ioc/s";
|
||||
SET_COUNT;
|
||||
break;
|
||||
case _DRM_STAT_LOCKS:
|
||||
stats->data[i].long_name = "Locks";
|
||||
stats->data[i].rate_name = "Lck/s";
|
||||
SET_COUNT;
|
||||
break;
|
||||
case _DRM_STAT_UNLOCKS:
|
||||
stats->data[i].long_name = "Unlocks";
|
||||
stats->data[i].rate_name = "Unl/s";
|
||||
SET_COUNT;
|
||||
break;
|
||||
case _DRM_STAT_IRQ:
|
||||
stats->data[i].long_name = "IRQs";
|
||||
stats->data[i].rate_name = "IRQ/s";
|
||||
SET_COUNT;
|
||||
break;
|
||||
case _DRM_STAT_PRIMARY:
|
||||
stats->data[i].long_name = "Primary Bytes";
|
||||
stats->data[i].rate_name = "PB/s";
|
||||
SET_BYTE;
|
||||
break;
|
||||
case _DRM_STAT_SECONDARY:
|
||||
stats->data[i].long_name = "Secondary Bytes";
|
||||
stats->data[i].rate_name = "SB/s";
|
||||
SET_BYTE;
|
||||
break;
|
||||
case _DRM_STAT_DMA:
|
||||
stats->data[i].long_name = "DMA";
|
||||
stats->data[i].rate_name = "DMA/s";
|
||||
SET_COUNT;
|
||||
break;
|
||||
case _DRM_STAT_SPECIAL:
|
||||
stats->data[i].long_name = "Special DMA";
|
||||
stats->data[i].rate_name = "dma/s";
|
||||
SET_COUNT;
|
||||
break;
|
||||
case _DRM_STAT_MISSED:
|
||||
stats->data[i].long_name = "Miss";
|
||||
stats->data[i].rate_name = "Ms/s";
|
||||
SET_COUNT;
|
||||
break;
|
||||
case _DRM_STAT_VALUE:
|
||||
stats->data[i].long_name = "Value";
|
||||
stats->data[i].rate_name = "Value";
|
||||
SET_VALUE;
|
||||
break;
|
||||
case _DRM_STAT_BYTE:
|
||||
stats->data[i].long_name = "Bytes";
|
||||
stats->data[i].rate_name = "B/s";
|
||||
SET_BYTE;
|
||||
break;
|
||||
case _DRM_STAT_COUNT:
|
||||
default:
|
||||
stats->data[i].long_name = "Count";
|
||||
stats->data[i].rate_name = "Cnt/s";
|
||||
SET_COUNT;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static void getvm(int fd)
|
||||
{
|
||||
|
|
@ -255,7 +94,7 @@ static void getvm(int fd)
|
|||
drmHandle handle;
|
||||
int mtrr;
|
||||
|
||||
printf(" VM map information:\n");
|
||||
printf(" VM map information (Restricted locked kernel WC Lock):\n");
|
||||
printf(" slot offset size type flags address mtrr\n");
|
||||
|
||||
for (i = 0;
|
||||
|
|
@ -298,7 +137,7 @@ static void getclients(int fd)
|
|||
int procfd;
|
||||
|
||||
printf(" DRI client information:\n");
|
||||
printf(" a pid uid magic ioctls prog\n");
|
||||
printf(" a pid uid magic ioctls prog\n");
|
||||
|
||||
for (i = 0; !drmGetClient(fd, i, &auth, &pid, &uid, &magic, &iocs); i++) {
|
||||
sprintf(buf, "/proc/%d/cmdline", pid);
|
||||
|
|
@ -307,12 +146,16 @@ static void getclients(int fd)
|
|||
read(procfd, cmd, sizeof(cmd)-1);
|
||||
close(procfd);
|
||||
}
|
||||
if (*cmd)
|
||||
if (*cmd) {
|
||||
char *pt;
|
||||
|
||||
for (pt = cmd; *pt; pt++) if (!isprint(*pt)) *pt = ' ';
|
||||
printf(" %c %5d %5d %10lu %10lu %s\n",
|
||||
auth ? 'y' : 'n', pid, uid, magic, iocs, cmd);
|
||||
else
|
||||
} else {
|
||||
printf(" %c %5d %5d %10lu %10lu\n",
|
||||
auth ? 'y' : 'n', pid, uid, magic, iocs);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -394,44 +237,6 @@ static void getstats(int fd, int i)
|
|||
|
||||
}
|
||||
|
||||
static int drmOpenMinor(int minor, uid_t user, gid_t group,
|
||||
mode_t dirmode, mode_t devmode, int force)
|
||||
{
|
||||
struct stat st;
|
||||
char buf[64];
|
||||
long dev = makedev(DRM_MAJOR, minor);
|
||||
int setdir = 0;
|
||||
int setdev = 0;
|
||||
int fd;
|
||||
|
||||
if (stat(DRM_DIR_NAME, &st) || !S_ISDIR(st.st_mode)) {
|
||||
remove(DRM_DIR_NAME);
|
||||
mkdir(DRM_DIR_NAME, dirmode);
|
||||
++setdir;
|
||||
}
|
||||
|
||||
if (force || setdir) {
|
||||
chown(DRM_DIR_NAME, user, group);
|
||||
chmod(DRM_DIR_NAME, dirmode);
|
||||
}
|
||||
|
||||
sprintf(buf, DRM_DEV_NAME, DRM_DIR_NAME, minor);
|
||||
if (stat(buf, &st) || st.st_rdev != dev) {
|
||||
remove(buf);
|
||||
mknod(buf, S_IFCHR, dev);
|
||||
++setdev;
|
||||
}
|
||||
|
||||
if (force || setdev) {
|
||||
chown(buf, user, group);
|
||||
chmod(buf, devmode);
|
||||
}
|
||||
|
||||
if ((fd = open(buf, O_RDWR, 0)) >= 0) return fd;
|
||||
if (setdev) remove(buf);
|
||||
return -errno;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int c;
|
||||
|
|
@ -442,13 +247,14 @@ int main(int argc, char **argv)
|
|||
char buf[64];
|
||||
int i;
|
||||
|
||||
while ((c = getopt(argc, argv, "avmcsM:i:")) != EOF)
|
||||
while ((c = getopt(argc, argv, "avmcsbM:i:")) != EOF)
|
||||
switch (c) {
|
||||
case 'a': mask = ~0; break;
|
||||
case 'v': mask |= DRM_VERSION; break;
|
||||
case 'm': mask |= DRM_MEMORY; break;
|
||||
case 'c': mask |= DRM_CLIENTS; break;
|
||||
case 's': mask |= DRM_STATS; break;
|
||||
case 'b': mask |= DRM_BUSID; break;
|
||||
case 'i': interval = strtol(optarg, NULL, 0); break;
|
||||
case 'M': minor = strtol(optarg, NULL, 0); break;
|
||||
default:
|
||||
|
|
@ -458,9 +264,10 @@ int main(int argc, char **argv)
|
|||
|
||||
for (i = 0; i < 16; i++) if (!minor || i == minor) {
|
||||
sprintf(buf, DRM_DEV_NAME, DRM_DIR_NAME, i);
|
||||
fd = drmOpenMinor(i, 0, 0, 0700, 0600, 0);
|
||||
fd = drmOpenMinor(i, 1);
|
||||
if (fd >= 0) {
|
||||
printf("%s\n", buf);
|
||||
if (mask & DRM_BUSID) getbusid(fd);
|
||||
if (mask & DRM_VERSION) getversion(fd);
|
||||
if (mask & DRM_MEMORY) getvm(fd);
|
||||
if (mask & DRM_CLIENTS) getclients(fd);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue