Merge branch 'master' into modesetting-gem
Conflicts: libdrm/Makefile.am libdrm/xf86drm.h shared-core/i915_dma.c shared-core/i915_irq.cmain
commit
2f03ba4aad
|
@ -26,10 +26,10 @@ libdrm_la_LDFLAGS = -version-number 2:3:0 -no-undefined
|
|||
|
||||
AM_CFLAGS = -I$(top_srcdir)/shared-core
|
||||
libdrm_la_SOURCES = xf86drm.c xf86drmHash.c xf86drmRandom.c xf86drmSL.c \
|
||||
xf86drmMode.c dri_bufmgr.c
|
||||
xf86drmMode.c dri_bufmgr.c libdrm_lists.h
|
||||
libdrm_la_LIBADD = intel/libdrm_intel.la
|
||||
|
||||
libdrmincludedir = ${includedir}
|
||||
libdrminclude_HEADERS = xf86drm.h xf86mm.h xf86drmMode.h dri_bufmgr.h
|
||||
libdrminclude_HEADERS = xf86drm.h xf86drmMode.h dri_bufmgr.h
|
||||
|
||||
EXTRA_DIST = ChangeLog TODO
|
||||
|
|
|
@ -135,7 +135,7 @@ dri_bufmgr_set_debug(dri_bufmgr *bufmgr, int enable_debug)
|
|||
}
|
||||
|
||||
int
|
||||
dri_bufmgr_check_aperture_space(dri_bo *bo)
|
||||
dri_bufmgr_check_aperture_space(dri_bo **bo_array, int count)
|
||||
{
|
||||
return bo->bufmgr->check_aperture_space(bo);
|
||||
return bo_array[0]->bufmgr->check_aperture_space(bo_array, count);
|
||||
}
|
||||
|
|
|
@ -150,7 +150,7 @@ struct _dri_bufmgr {
|
|||
|
||||
void (*post_submit)(dri_bo *batch_buf);
|
||||
|
||||
int (*check_aperture_space)(dri_bo *bo);
|
||||
int (*check_aperture_space)(dri_bo **bo_array, int count);
|
||||
int debug; /**< Enables verbose debugging printouts */
|
||||
};
|
||||
|
||||
|
@ -173,6 +173,6 @@ void dri_bufmgr_destroy(dri_bufmgr *bufmgr);
|
|||
void *dri_process_relocs(dri_bo *batch_buf);
|
||||
void dri_post_process_relocs(dri_bo *batch_buf);
|
||||
void dri_post_submit(dri_bo *batch_buf);
|
||||
int dri_bufmgr_check_aperture_space(dri_bo *bo);
|
||||
int dri_bufmgr_check_aperture_space(dri_bo **bo_array, int count);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
|
||||
AM_CFLAGS = \
|
||||
$(WARN_CFLAGS) \
|
||||
-I$(top_srcdir)/libdrm \
|
||||
-I$(top_srcdir)/shared-core
|
||||
|
||||
noinst_LTLIBRARIES = libdrm_intel.la
|
||||
|
|
|
@ -42,6 +42,9 @@
|
|||
#include "drm.h"
|
||||
#include "i915_drm.h"
|
||||
#include "mm.h"
|
||||
#include "libdrm_lists.h"
|
||||
|
||||
#define ALIGN(value, alignment) ((value + alignment - 1) & ~(alignment - 1))
|
||||
|
||||
#define DBG(...) do { \
|
||||
if (bufmgr_fake->bufmgr.debug) \
|
||||
|
@ -147,9 +150,6 @@ typedef struct _bufmgr_fake {
|
|||
int debug;
|
||||
|
||||
int performed_rendering;
|
||||
|
||||
/* keep track of the current total size of objects we have relocs for */
|
||||
unsigned long current_total_size;
|
||||
} dri_bufmgr_fake;
|
||||
|
||||
typedef struct _dri_bo_fake {
|
||||
|
@ -159,8 +159,8 @@ typedef struct _dri_bo_fake {
|
|||
const char *name;
|
||||
|
||||
unsigned dirty:1;
|
||||
unsigned size_accounted:1; /*this buffers size has been accounted against the aperture */
|
||||
unsigned card_dirty:1; /* has the card written to this buffer - we make need to copy it back */
|
||||
/** has the card written to this buffer - we make need to copy it back */
|
||||
unsigned card_dirty:1;
|
||||
unsigned int refcount;
|
||||
/* Flags may consist of any of the DRM_BO flags, plus
|
||||
* DRM_BO_NO_BACKING_STORE and BM_NO_FENCE_SUBDATA, which are the first two
|
||||
|
@ -179,6 +179,12 @@ typedef struct _dri_bo_fake {
|
|||
/** relocation list */
|
||||
struct fake_buffer_reloc *relocs;
|
||||
int nr_relocs;
|
||||
/**
|
||||
* Total size of the target_bos of this buffer.
|
||||
*
|
||||
* Used for estimation in check_aperture.
|
||||
*/
|
||||
unsigned int child_size;
|
||||
|
||||
struct block *block;
|
||||
void *backing_store;
|
||||
|
@ -189,8 +195,6 @@ typedef struct _dri_bo_fake {
|
|||
static int clear_fenced(dri_bufmgr_fake *bufmgr_fake,
|
||||
unsigned int fence_cookie);
|
||||
|
||||
static int dri_fake_check_aperture_space(dri_bo *bo);
|
||||
|
||||
#define MAXFENCE 0x7fffffff
|
||||
|
||||
static int FENCE_LTE( unsigned a, unsigned b )
|
||||
|
@ -855,9 +859,6 @@ dri_fake_bo_validate(dri_bo *bo)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* reset size accounted */
|
||||
bo_fake->size_accounted = 0;
|
||||
|
||||
/* Allocate the card memory */
|
||||
if (!bo_fake->block && !evict_and_alloc_block(bo)) {
|
||||
bufmgr_fake->fail = 1;
|
||||
|
@ -941,8 +942,6 @@ dri_fake_emit_reloc(dri_bo *reloc_buf,
|
|||
assert(reloc_buf);
|
||||
assert(target_buf);
|
||||
|
||||
assert(target_fake->is_static || target_fake->size_accounted);
|
||||
|
||||
if (reloc_fake->relocs == NULL) {
|
||||
reloc_fake->relocs = malloc(sizeof(struct fake_buffer_reloc) *
|
||||
MAX_RELOCS);
|
||||
|
@ -954,6 +953,9 @@ dri_fake_emit_reloc(dri_bo *reloc_buf,
|
|||
|
||||
dri_bo_reference(target_buf);
|
||||
|
||||
if (!target_fake->is_static)
|
||||
reloc_fake->child_size += ALIGN(target_buf->size, target_fake->alignment);
|
||||
|
||||
r->target_buf = target_buf;
|
||||
r->offset = offset;
|
||||
r->last_target_offset = target_buf->offset;
|
||||
|
@ -1079,7 +1081,6 @@ dri_fake_process_relocs(dri_bo *batch_buf)
|
|||
|
||||
assert(ret == 0);
|
||||
|
||||
bufmgr_fake->current_total_size = 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -1117,26 +1118,39 @@ dri_fake_post_submit(dri_bo *batch_buf)
|
|||
dri_bo_fake_post_submit(batch_buf);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return an error if the list of BOs will exceed the aperture size.
|
||||
*
|
||||
* This is a rough guess and likely to fail, as during the validate sequence we
|
||||
* may place a buffer in an inopportune spot early on and then fail to fit
|
||||
* a set smaller than the aperture.
|
||||
*/
|
||||
static int
|
||||
dri_fake_check_aperture_space(dri_bo *bo)
|
||||
dri_fake_check_aperture_space(dri_bo **bo_array, int count)
|
||||
{
|
||||
dri_bufmgr_fake *bufmgr_fake = (dri_bufmgr_fake *)bo->bufmgr;
|
||||
dri_bo_fake *bo_fake = (dri_bo_fake *)bo;
|
||||
unsigned int sz;
|
||||
dri_bufmgr_fake *bufmgr_fake = (dri_bufmgr_fake *)bo_array[0]->bufmgr;
|
||||
unsigned int sz = 0;
|
||||
int i;
|
||||
|
||||
sz = (bo->size + bo_fake->alignment - 1) & ~(bo_fake->alignment - 1);
|
||||
for (i = 0; i < count; i++) {
|
||||
dri_bo_fake *bo_fake = (dri_bo_fake *)bo_array[i];
|
||||
|
||||
if (bo_fake->size_accounted || bo_fake->is_static)
|
||||
return 0;
|
||||
if (bo_fake == NULL)
|
||||
continue;
|
||||
|
||||
if (bufmgr_fake->current_total_size + sz > bufmgr_fake->size) {
|
||||
DBG("check_space: %s bo %d %d overflowed bufmgr size %d\n", bo_fake->name, bo_fake->id, sz, bufmgr_fake->size);
|
||||
if (!bo_fake->is_static)
|
||||
sz += ALIGN(bo_array[i]->size, bo_fake->alignment);
|
||||
sz += bo_fake->child_size;
|
||||
}
|
||||
|
||||
if (sz > bufmgr_fake->size) {
|
||||
DBG("check_space: overflowed bufmgr size, %dkb vs %dkb\n",
|
||||
sz / 1024, bufmgr_fake->size / 1024);
|
||||
return -1;
|
||||
}
|
||||
|
||||
bufmgr_fake->current_total_size += sz;
|
||||
bo_fake->size_accounted = 1;
|
||||
DBG("drm_check_space: buf %d, %s %d %d\n", bo_fake->id, bo_fake->name, bo->size, bufmgr_fake->current_total_size);
|
||||
DBG("drm_check_space: sz %dkb vs bufgr %dkb\n", sz / 1024 ,
|
||||
bufmgr_fake->size / 1024);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -102,6 +102,11 @@ struct _dri_bo_gem {
|
|||
uint32_t gem_handle;
|
||||
const char *name;
|
||||
|
||||
/**
|
||||
* Kenel-assigned global name for this object
|
||||
*/
|
||||
unsigned int global_name;
|
||||
|
||||
/**
|
||||
* Index of the buffer within the validation list while preparing a
|
||||
* batchbuffer execution.
|
||||
|
@ -834,13 +839,16 @@ dri_gem_flink(dri_bo *bo, uint32_t *name)
|
|||
struct drm_gem_flink flink;
|
||||
int ret;
|
||||
|
||||
flink.handle = bo_gem->gem_handle;
|
||||
|
||||
ret = ioctl(bufmgr_gem->fd, DRM_IOCTL_GEM_FLINK, &flink);
|
||||
if (ret != 0)
|
||||
return -errno;
|
||||
|
||||
*name = flink.name;
|
||||
if (!bo_gem->global_name) {
|
||||
flink.handle = bo_gem->gem_handle;
|
||||
|
||||
ret = ioctl(bufmgr_gem->fd, DRM_IOCTL_GEM_FLINK, &flink);
|
||||
if (ret != 0)
|
||||
return -errno;
|
||||
bo_gem->global_name = flink.name;
|
||||
}
|
||||
|
||||
*name = bo_gem->global_name;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -866,7 +874,7 @@ intel_bufmgr_gem_enable_reuse(dri_bufmgr *bufmgr)
|
|||
*
|
||||
*/
|
||||
static int
|
||||
dri_gem_check_aperture_space(dri_bo *bo)
|
||||
dri_gem_check_aperture_space(dri_bo **bo_array, int count)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,87 @@
|
|||
/**************************************************************************
|
||||
*
|
||||
* Copyright 2006 Tungsten Graphics, Inc., Bismarck, ND. USA.
|
||||
* 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, sub license, 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 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 NON-INFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDERS, AUTHORS 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.
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the
|
||||
* next paragraph) shall be included in all copies or substantial portions
|
||||
* of the Software.
|
||||
*/
|
||||
|
||||
/*
|
||||
* List macros heavily inspired by the Linux kernel
|
||||
* list handling. No list looping yet.
|
||||
*/
|
||||
|
||||
typedef struct _drmMMListHead
|
||||
{
|
||||
struct _drmMMListHead *prev;
|
||||
struct _drmMMListHead *next;
|
||||
} drmMMListHead;
|
||||
|
||||
#define DRMINITLISTHEAD(__item) \
|
||||
do{ \
|
||||
(__item)->prev = (__item); \
|
||||
(__item)->next = (__item); \
|
||||
} while (0)
|
||||
|
||||
#define DRMLISTADD(__item, __list) \
|
||||
do { \
|
||||
(__item)->prev = (__list); \
|
||||
(__item)->next = (__list)->next; \
|
||||
(__list)->next->prev = (__item); \
|
||||
(__list)->next = (__item); \
|
||||
} while (0)
|
||||
|
||||
#define DRMLISTADDTAIL(__item, __list) \
|
||||
do { \
|
||||
(__item)->next = (__list); \
|
||||
(__item)->prev = (__list)->prev; \
|
||||
(__list)->prev->next = (__item); \
|
||||
(__list)->prev = (__item); \
|
||||
} while(0)
|
||||
|
||||
#define DRMLISTDEL(__item) \
|
||||
do { \
|
||||
(__item)->prev->next = (__item)->next; \
|
||||
(__item)->next->prev = (__item)->prev; \
|
||||
} while(0)
|
||||
|
||||
#define DRMLISTDELINIT(__item) \
|
||||
do { \
|
||||
(__item)->prev->next = (__item)->next; \
|
||||
(__item)->next->prev = (__item)->prev; \
|
||||
(__item)->next = (__item); \
|
||||
(__item)->prev = (__item); \
|
||||
} while(0)
|
||||
|
||||
#define DRMLISTENTRY(__type, __item, __field) \
|
||||
((__type *)(((char *) (__item)) - offsetof(__type, __field)))
|
||||
|
||||
#define DRMLISTEMPTY(__item) ((__item)->next == (__item))
|
||||
|
||||
#define DRMLISTFOREACHSAFE(__item, __temp, __list) \
|
||||
for ((__item) = (__list)->next, (__temp) = (__item)->next; \
|
||||
(__item) != (__list); \
|
||||
(__item) = (__temp), (__temp) = (__item)->next)
|
||||
|
||||
#define DRMLISTFOREACHSAFEREVERSE(__item, __temp, __list) \
|
||||
for ((__item) = (__list)->prev, (__temp) = (__item)->prev; \
|
||||
(__item) != (__list); \
|
||||
(__item) = (__temp), (__temp) = (__item)->prev)
|
573
libdrm/xf86drm.c
573
libdrm/xf86drm.c
|
@ -2356,579 +2356,6 @@ int drmCommandWriteRead(int fd, unsigned long drmCommandIndex, void *data,
|
|||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Valid flags are
|
||||
* DRM_FENCE_FLAG_EMIT
|
||||
* DRM_FENCE_FLAG_SHAREABLE
|
||||
* DRM_FENCE_MASK_DRIVER
|
||||
*/
|
||||
|
||||
int drmFenceCreate(int fd, unsigned flags, int fence_class, unsigned type,
|
||||
drmFence *fence)
|
||||
{
|
||||
drm_fence_arg_t arg;
|
||||
|
||||
memset(&arg, 0, sizeof(arg));
|
||||
arg.flags = flags;
|
||||
arg.type = type;
|
||||
arg.fence_class = fence_class;
|
||||
|
||||
if (drmIoctl(fd, DRM_IOCTL_FENCE_CREATE, &arg))
|
||||
return -errno;
|
||||
fence->handle = arg.handle;
|
||||
fence->fence_class = arg.fence_class;
|
||||
fence->type = arg.type;
|
||||
fence->flags = arg.flags;
|
||||
fence->signaled = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Valid flags are
|
||||
* DRM_FENCE_FLAG_SHAREABLE
|
||||
* DRM_FENCE_MASK_DRIVER
|
||||
*/
|
||||
|
||||
int drmFenceBuffers(int fd, unsigned flags, uint32_t fence_class, drmFence *fence)
|
||||
{
|
||||
drm_fence_arg_t arg;
|
||||
|
||||
memset(&arg, 0, sizeof(arg));
|
||||
arg.flags = flags;
|
||||
arg.fence_class = fence_class;
|
||||
|
||||
if (drmIoctl(fd, DRM_IOCTL_FENCE_BUFFERS, &arg))
|
||||
return -errno;
|
||||
fence->handle = arg.handle;
|
||||
fence->fence_class = arg.fence_class;
|
||||
fence->type = arg.type;
|
||||
fence->flags = arg.flags;
|
||||
fence->sequence = arg.sequence;
|
||||
fence->signaled = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int drmFenceReference(int fd, unsigned handle, drmFence *fence)
|
||||
{
|
||||
drm_fence_arg_t arg;
|
||||
|
||||
memset(&arg, 0, sizeof(arg));
|
||||
arg.handle = handle;
|
||||
|
||||
if (drmIoctl(fd, DRM_IOCTL_FENCE_REFERENCE, &arg))
|
||||
return -errno;
|
||||
fence->handle = arg.handle;
|
||||
fence->fence_class = arg.fence_class;
|
||||
fence->type = arg.type;
|
||||
fence->flags = arg.flags;
|
||||
fence->signaled = arg.signaled;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int drmFenceUnreference(int fd, const drmFence *fence)
|
||||
{
|
||||
drm_fence_arg_t arg;
|
||||
|
||||
memset(&arg, 0, sizeof(arg));
|
||||
arg.handle = fence->handle;
|
||||
|
||||
if (drmIoctl(fd, DRM_IOCTL_FENCE_UNREFERENCE, &arg))
|
||||
return -errno;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int drmFenceFlush(int fd, drmFence *fence, unsigned flush_type)
|
||||
{
|
||||
drm_fence_arg_t arg;
|
||||
|
||||
memset(&arg, 0, sizeof(arg));
|
||||
arg.handle = fence->handle;
|
||||
arg.type = flush_type;
|
||||
|
||||
if (drmIoctl(fd, DRM_IOCTL_FENCE_FLUSH, &arg))
|
||||
return -errno;
|
||||
fence->fence_class = arg.fence_class;
|
||||
fence->type = arg.type;
|
||||
fence->signaled = arg.signaled;
|
||||
return arg.error;
|
||||
}
|
||||
|
||||
int drmFenceUpdate(int fd, drmFence *fence)
|
||||
{
|
||||
drm_fence_arg_t arg;
|
||||
|
||||
memset(&arg, 0, sizeof(arg));
|
||||
arg.handle = fence->handle;
|
||||
|
||||
if (drmIoctl(fd, DRM_IOCTL_FENCE_SIGNALED, &arg))
|
||||
return -errno;
|
||||
fence->fence_class = arg.fence_class;
|
||||
fence->type = arg.type;
|
||||
fence->signaled = arg.signaled;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int drmFenceSignaled(int fd, drmFence *fence, unsigned fenceType,
|
||||
int *signaled)
|
||||
{
|
||||
if ((fence->flags & DRM_FENCE_FLAG_SHAREABLE) ||
|
||||
((fenceType & fence->signaled) != fenceType)) {
|
||||
int ret = drmFenceFlush(fd, fence, fenceType);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
*signaled = ((fenceType & fence->signaled) == fenceType);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Valid flags are
|
||||
* DRM_FENCE_FLAG_SHAREABLE
|
||||
* DRM_FENCE_MASK_DRIVER
|
||||
*/
|
||||
|
||||
|
||||
int drmFenceEmit(int fd, unsigned flags, drmFence *fence, unsigned emit_type)
|
||||
{
|
||||
drm_fence_arg_t arg;
|
||||
|
||||
memset(&arg, 0, sizeof(arg));
|
||||
arg.fence_class = fence->fence_class;
|
||||
arg.flags = flags;
|
||||
arg.handle = fence->handle;
|
||||
arg.type = emit_type;
|
||||
|
||||
if (drmIoctl(fd, DRM_IOCTL_FENCE_EMIT, &arg))
|
||||
return -errno;
|
||||
fence->fence_class = arg.fence_class;
|
||||
fence->type = arg.type;
|
||||
fence->signaled = arg.signaled;
|
||||
fence->sequence = arg.sequence;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Valid flags are
|
||||
* DRM_FENCE_FLAG_WAIT_LAZY
|
||||
* DRM_FENCE_FLAG_WAIT_IGNORE_SIGNALS
|
||||
*/
|
||||
|
||||
#define DRM_IOCTL_TIMEOUT_USEC 3000000UL
|
||||
|
||||
static unsigned long
|
||||
drmTimeDiff(struct timeval *now, struct timeval *then)
|
||||
{
|
||||
uint64_t val;
|
||||
|
||||
val = now->tv_sec - then->tv_sec;
|
||||
val *= 1000000LL;
|
||||
val += now->tv_usec;
|
||||
val -= then->tv_usec;
|
||||
|
||||
return (unsigned long) val;
|
||||
}
|
||||
|
||||
static int
|
||||
drmIoctlTimeout(int fd, unsigned long request, void *argp)
|
||||
{
|
||||
int haveThen = 0;
|
||||
struct timeval then, now;
|
||||
int ret;
|
||||
|
||||
do {
|
||||
ret = drmIoctl(fd, request, argp);
|
||||
if (ret != 0 && errno == EAGAIN) {
|
||||
if (!haveThen) {
|
||||
gettimeofday(&then, NULL);
|
||||
haveThen = 1;
|
||||
}
|
||||
gettimeofday(&now, NULL);
|
||||
}
|
||||
} while (ret != 0 && errno == EAGAIN &&
|
||||
drmTimeDiff(&now, &then) < DRM_IOCTL_TIMEOUT_USEC);
|
||||
|
||||
if (ret != 0)
|
||||
return ((errno == EAGAIN) ? -EBUSY : -errno);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
int drmFenceWait(int fd, unsigned flags, drmFence *fence, unsigned flush_type)
|
||||
{
|
||||
drm_fence_arg_t arg;
|
||||
int ret;
|
||||
|
||||
if (flush_type == 0) {
|
||||
flush_type = fence->type;
|
||||
}
|
||||
|
||||
if (!(fence->flags & DRM_FENCE_FLAG_SHAREABLE)) {
|
||||
if ((flush_type & fence->signaled) == flush_type) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
memset(&arg, 0, sizeof(arg));
|
||||
arg.handle = fence->handle;
|
||||
arg.type = flush_type;
|
||||
arg.flags = flags;
|
||||
|
||||
|
||||
ret = drmIoctlTimeout(fd, DRM_IOCTL_FENCE_WAIT, &arg);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
fence->fence_class = arg.fence_class;
|
||||
fence->type = arg.type;
|
||||
fence->signaled = arg.signaled;
|
||||
return arg.error;
|
||||
}
|
||||
|
||||
static void drmBOCopyReply(const struct drm_bo_info_rep *rep, drmBO *buf)
|
||||
{
|
||||
buf->handle = rep->handle;
|
||||
buf->flags = rep->flags;
|
||||
buf->size = rep->size;
|
||||
buf->offset = rep->offset;
|
||||
buf->mapHandle = rep->arg_handle;
|
||||
buf->proposedFlags = rep->proposed_flags;
|
||||
buf->start = rep->buffer_start;
|
||||
buf->fenceFlags = rep->fence_flags;
|
||||
buf->replyFlags = rep->rep_flags;
|
||||
buf->pageAlignment = rep->page_alignment;
|
||||
buf->tileInfo = rep->tile_info;
|
||||
buf->hwTileStride = rep->hw_tile_stride;
|
||||
buf->desiredTileStride = rep->desired_tile_stride;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int drmBOCreate(int fd, unsigned long size,
|
||||
unsigned pageAlignment, void *user_buffer,
|
||||
uint64_t flags,
|
||||
unsigned hint, drmBO *buf)
|
||||
{
|
||||
struct drm_bo_create_arg arg;
|
||||
struct drm_bo_create_req *req = &arg.d.req;
|
||||
struct drm_bo_info_rep *rep = &arg.d.rep;
|
||||
int ret;
|
||||
|
||||
memset(buf, 0, sizeof(*buf));
|
||||
memset(&arg, 0, sizeof(arg));
|
||||
req->flags = flags;
|
||||
req->hint = hint;
|
||||
req->size = size;
|
||||
req->page_alignment = pageAlignment;
|
||||
req->buffer_start = (unsigned long) user_buffer;
|
||||
|
||||
buf->virtual = NULL;
|
||||
|
||||
ret = drmIoctlTimeout(fd, DRM_IOCTL_BO_CREATE, &arg);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
drmBOCopyReply(rep, buf);
|
||||
buf->virtual = user_buffer;
|
||||
buf->mapCount = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int drmBOReference(int fd, unsigned handle, drmBO *buf)
|
||||
{
|
||||
struct drm_bo_reference_info_arg arg;
|
||||
struct drm_bo_handle_arg *req = &arg.d.req;
|
||||
struct drm_bo_info_rep *rep = &arg.d.rep;
|
||||
|
||||
memset(&arg, 0, sizeof(arg));
|
||||
req->handle = handle;
|
||||
|
||||
if (drmIoctl(fd, DRM_IOCTL_BO_REFERENCE, &arg))
|
||||
return -errno;
|
||||
|
||||
drmBOCopyReply(rep, buf);
|
||||
buf->mapVirtual = NULL;
|
||||
buf->mapCount = 0;
|
||||
buf->virtual = NULL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int drmBOUnreference(int fd, drmBO *buf)
|
||||
{
|
||||
struct drm_bo_handle_arg arg;
|
||||
|
||||
if (buf->mapVirtual && buf->mapHandle) {
|
||||
(void) munmap(buf->mapVirtual, buf->start + buf->size);
|
||||
buf->mapVirtual = NULL;
|
||||
buf->virtual = NULL;
|
||||
}
|
||||
|
||||
memset(&arg, 0, sizeof(arg));
|
||||
arg.handle = buf->handle;
|
||||
|
||||
if (drmIoctl(fd, DRM_IOCTL_BO_UNREFERENCE, &arg))
|
||||
return -errno;
|
||||
|
||||
buf->handle = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Flags can be DRM_BO_FLAG_READ, DRM_BO_FLAG_WRITE or'ed together
|
||||
* Hint currently be DRM_BO_HINT_DONT_BLOCK, which makes the
|
||||
* call return an -EBUSY if it can' immediately honor the mapping request.
|
||||
*/
|
||||
|
||||
int drmBOMap(int fd, drmBO *buf, unsigned mapFlags, unsigned mapHint,
|
||||
void **address)
|
||||
{
|
||||
struct drm_bo_map_wait_idle_arg arg;
|
||||
struct drm_bo_info_req *req = &arg.d.req;
|
||||
struct drm_bo_info_rep *rep = &arg.d.rep;
|
||||
int ret = 0;
|
||||
|
||||
/*
|
||||
* Make sure we have a virtual address of the buffer.
|
||||
*/
|
||||
|
||||
if (!buf->virtual) {
|
||||
drmAddress virtual;
|
||||
virtual = mmap(0, buf->size + buf->start,
|
||||
PROT_READ | PROT_WRITE, MAP_SHARED,
|
||||
fd, buf->mapHandle);
|
||||
if (virtual == MAP_FAILED) {
|
||||
ret = -errno;
|
||||
}
|
||||
if (ret)
|
||||
return ret;
|
||||
buf->mapVirtual = virtual;
|
||||
buf->virtual = ((char *) virtual) + buf->start;
|
||||
}
|
||||
|
||||
memset(&arg, 0, sizeof(arg));
|
||||
req->handle = buf->handle;
|
||||
req->mask = mapFlags;
|
||||
req->hint = mapHint;
|
||||
|
||||
/*
|
||||
* May hang if the buffer object is busy.
|
||||
* This IOCTL synchronizes the buffer.
|
||||
*/
|
||||
|
||||
ret = drmIoctlTimeout(fd, DRM_IOCTL_BO_MAP, &arg);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
drmBOCopyReply(rep, buf);
|
||||
buf->mapFlags = mapFlags;
|
||||
++buf->mapCount;
|
||||
*address = buf->virtual;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int drmBOUnmap(int fd, drmBO *buf)
|
||||
{
|
||||
struct drm_bo_handle_arg arg;
|
||||
|
||||
memset(&arg, 0, sizeof(arg));
|
||||
arg.handle = buf->handle;
|
||||
|
||||
if (drmIoctl(fd, DRM_IOCTL_BO_UNMAP, &arg)) {
|
||||
return -errno;
|
||||
}
|
||||
buf->mapCount--;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int drmBOSetStatus(int fd, drmBO *buf,
|
||||
uint64_t flags, uint64_t mask,
|
||||
unsigned int hint,
|
||||
unsigned int desired_tile_stride,
|
||||
unsigned int tile_info)
|
||||
{
|
||||
|
||||
struct drm_bo_map_wait_idle_arg arg;
|
||||
struct drm_bo_info_req *req = &arg.d.req;
|
||||
struct drm_bo_info_rep *rep = &arg.d.rep;
|
||||
int ret = 0;
|
||||
|
||||
memset(&arg, 0, sizeof(arg));
|
||||
req->mask = mask;
|
||||
req->flags = flags;
|
||||
req->handle = buf->handle;
|
||||
req->hint = hint;
|
||||
req->desired_tile_stride = desired_tile_stride;
|
||||
req->tile_info = tile_info;
|
||||
|
||||
ret = drmIoctlTimeout(fd, DRM_IOCTL_BO_SETSTATUS, &arg);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
drmBOCopyReply(rep, buf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int drmBOInfo(int fd, drmBO *buf)
|
||||
{
|
||||
struct drm_bo_reference_info_arg arg;
|
||||
struct drm_bo_handle_arg *req = &arg.d.req;
|
||||
struct drm_bo_info_rep *rep = &arg.d.rep;
|
||||
int ret = 0;
|
||||
|
||||
memset(&arg, 0, sizeof(arg));
|
||||
req->handle = buf->handle;
|
||||
|
||||
ret = drmIoctl(fd, DRM_IOCTL_BO_INFO, &arg);
|
||||
if (ret)
|
||||
return -errno;
|
||||
|
||||
drmBOCopyReply(rep, buf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int drmBOWaitIdle(int fd, drmBO *buf, unsigned hint)
|
||||
{
|
||||
struct drm_bo_map_wait_idle_arg arg;
|
||||
struct drm_bo_info_req *req = &arg.d.req;
|
||||
struct drm_bo_info_rep *rep = &arg.d.rep;
|
||||
int ret = 0;
|
||||
|
||||
if ((buf->flags & DRM_BO_FLAG_SHAREABLE) ||
|
||||
(buf->replyFlags & DRM_BO_REP_BUSY)) {
|
||||
memset(&arg, 0, sizeof(arg));
|
||||
req->handle = buf->handle;
|
||||
req->hint = hint;
|
||||
|
||||
ret = drmIoctlTimeout(fd, DRM_IOCTL_BO_WAIT_IDLE, &arg);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
drmBOCopyReply(rep, buf);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int drmBOBusy(int fd, drmBO *buf, int *busy)
|
||||
{
|
||||
int ret = drmBOInfo(fd, buf);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
*busy = (buf->replyFlags & DRM_BO_REP_BUSY);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int drmMMInit(int fd, unsigned long pOffset, unsigned long pSize,
|
||||
unsigned memType)
|
||||
{
|
||||
struct drm_mm_init_arg arg;
|
||||
|
||||
memset(&arg, 0, sizeof(arg));
|
||||
|
||||
arg.magic = DRM_BO_INIT_MAGIC;
|
||||
arg.major = DRM_BO_INIT_MAJOR;
|
||||
arg.minor = DRM_BO_INIT_MINOR;
|
||||
arg.p_offset = pOffset;
|
||||
arg.p_size = pSize;
|
||||
arg.mem_type = memType;
|
||||
|
||||
if (drmIoctl(fd, DRM_IOCTL_MM_INIT, &arg))
|
||||
return -errno;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int drmMMTakedown(int fd, unsigned memType)
|
||||
{
|
||||
struct drm_mm_type_arg arg;
|
||||
|
||||
memset(&arg, 0, sizeof(arg));
|
||||
arg.mem_type = memType;
|
||||
|
||||
if (drmIoctl(fd, DRM_IOCTL_MM_TAKEDOWN, &arg))
|
||||
return -errno;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* If this function returns an error, and lockBM was set to 1,
|
||||
* the buffer manager is NOT locked.
|
||||
*/
|
||||
|
||||
int drmMMLock(int fd, unsigned memType, int lockBM, int ignoreNoEvict)
|
||||
{
|
||||
struct drm_mm_type_arg arg;
|
||||
|
||||
memset(&arg, 0, sizeof(arg));
|
||||
arg.mem_type = memType;
|
||||
arg.lock_flags |= (lockBM) ? DRM_BO_LOCK_UNLOCK_BM : 0;
|
||||
arg.lock_flags |= (ignoreNoEvict) ? DRM_BO_LOCK_IGNORE_NO_EVICT : 0;
|
||||
|
||||
return drmIoctlTimeout(fd, DRM_IOCTL_MM_LOCK, &arg);
|
||||
}
|
||||
|
||||
int drmMMUnlock(int fd, unsigned memType, int unlockBM)
|
||||
{
|
||||
struct drm_mm_type_arg arg;
|
||||
|
||||
memset(&arg, 0, sizeof(arg));
|
||||
|
||||
arg.mem_type = memType;
|
||||
arg.lock_flags |= (unlockBM) ? DRM_BO_LOCK_UNLOCK_BM : 0;
|
||||
|
||||
return drmIoctlTimeout(fd, DRM_IOCTL_MM_UNLOCK, &arg);
|
||||
}
|
||||
|
||||
int drmMMInfo(int fd, unsigned memType, uint64_t *size)
|
||||
{
|
||||
struct drm_mm_info_arg arg;
|
||||
|
||||
memset(&arg, 0, sizeof(arg));
|
||||
|
||||
arg.mem_type = memType;
|
||||
|
||||
if (drmIoctl(fd, DRM_IOCTL_MM_INFO, &arg))
|
||||
return -errno;
|
||||
|
||||
*size = arg.p_size;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int drmBOVersion(int fd, unsigned int *major,
|
||||
unsigned int *minor,
|
||||
unsigned int *patchlevel)
|
||||
{
|
||||
struct drm_bo_version_arg arg;
|
||||
int ret;
|
||||
|
||||
memset(&arg, 0, sizeof(arg));
|
||||
ret = drmIoctl(fd, DRM_IOCTL_BO_VERSION, &arg);
|
||||
if (ret)
|
||||
return -errno;
|
||||
|
||||
if (major)
|
||||
*major = arg.major;
|
||||
if (minor)
|
||||
*minor = arg.minor;
|
||||
if (patchlevel)
|
||||
*patchlevel = arg.patchlevel;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#define DRM_MAX_FDS 16
|
||||
static struct {
|
||||
char *BusID;
|
||||
|
|
|
@ -664,6 +664,4 @@ extern void drmMsg(const char *format, ...);
|
|||
extern int drmSetMaster(int fd);
|
||||
extern int drmDropMaster(int fd);
|
||||
|
||||
#include "xf86mm.h"
|
||||
|
||||
#endif
|
||||
|
|
|
@ -271,6 +271,10 @@ ifneq ($(PAGE_AGP),0)
|
|||
EXTRA_CFLAGS += -DHAVE_PAGE_AGP
|
||||
endif
|
||||
|
||||
ifeq ($(OS_HAS_GEM), 1)
|
||||
EXTRA_CFLAGS += -DOS_HAS_GEM=1
|
||||
endif
|
||||
|
||||
# Start with all modules turned off.
|
||||
CONFIG_DRM_GAMMA := n
|
||||
CONFIG_DRM_TDFX := n
|
||||
|
@ -337,8 +341,10 @@ ifneq (,$(findstring i810,$(DRM_MODULES)))
|
|||
CONFIG_DRM_I810 := m
|
||||
endif
|
||||
ifneq (,$(findstring i915,$(DRM_MODULES)))
|
||||
ifeq ($(OS_HAS_GEM), 1)
|
||||
CONFIG_DRM_I915 := m
|
||||
endif
|
||||
endif
|
||||
|
||||
GIT_REVISION := $(shell cd "$(DRMSRCDIR)" && git-describe --abbrev=17)
|
||||
ifneq ($(GIT_REVISION),)
|
||||
|
|
|
@ -401,4 +401,12 @@ extern struct page *drm_vm_sg_nopage(struct vm_area_struct *vma,
|
|||
#define drm_core_ioremap_wc drm_core_ioremap
|
||||
#endif
|
||||
|
||||
#ifndef OS_HAS_GEM
|
||||
#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,27))
|
||||
#define OS_HAS_GEM 1
|
||||
#else
|
||||
#define OS_HAS_GEM 0
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
|
@ -176,9 +176,11 @@ static struct drm_ioctl_desc drm_ioctls[] = {
|
|||
|
||||
DRM_IOCTL_DEF(DRM_IOCTL_MM_INFO, drm_mm_info_ioctl, 0),
|
||||
|
||||
#if OS_HAS_GEM
|
||||
DRM_IOCTL_DEF(DRM_IOCTL_GEM_CLOSE, drm_gem_close_ioctl, 0),
|
||||
DRM_IOCTL_DEF(DRM_IOCTL_GEM_FLINK, drm_gem_flink_ioctl, DRM_AUTH),
|
||||
DRM_IOCTL_DEF(DRM_IOCTL_GEM_OPEN, drm_gem_open_ioctl, DRM_AUTH),
|
||||
#endif
|
||||
};
|
||||
|
||||
#define DRM_CORE_IOCTL_COUNT ARRAY_SIZE( drm_ioctls )
|
||||
|
|
|
@ -25,6 +25,12 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#include <linux/version.h>
|
||||
|
||||
#include "drmP.h"
|
||||
|
||||
#if OS_HAS_GEM
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/mm.h>
|
||||
|
@ -34,7 +40,6 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/mman.h>
|
||||
#include <linux/pagemap.h>
|
||||
#include "drmP.h"
|
||||
|
||||
/** @file drm_gem.c
|
||||
*
|
||||
|
@ -417,3 +422,22 @@ drm_gem_object_handle_free(struct kref *kref)
|
|||
}
|
||||
EXPORT_SYMBOL(drm_gem_object_handle_free);
|
||||
|
||||
#else
|
||||
|
||||
int drm_gem_init(struct drm_device *dev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void drm_gem_open(struct drm_device *dev, struct drm_file *file_private)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
drm_gem_release(struct drm_device *dev, struct drm_file *file_private)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -698,7 +698,7 @@ EXPORT_SYMBOL(drm_mmap);
|
|||
* protected by the bo->mutex lock.
|
||||
*/
|
||||
|
||||
#ifdef DRM_FULL_MM_COMPAT
|
||||
#if defined(DRM_FULL_MM_COMPAT) && !defined(DRM_NO_FAULT)
|
||||
static int drm_bo_vm_fault(struct vm_area_struct *vma,
|
||||
struct vm_fault *vmf)
|
||||
{
|
||||
|
|
|
@ -1119,6 +1119,7 @@ int i915_driver_irq_postinstall(struct drm_device * dev)
|
|||
|
||||
DRM_SPININIT(&dev_priv->user_irq_lock, "userirq");
|
||||
dev_priv->user_irq_refcount = 0;
|
||||
dev_priv->irq_mask_reg = ~0;
|
||||
|
||||
ret = drm_vblank_init(dev, num_pipes);
|
||||
if (ret)
|
||||
|
|
|
@ -1544,6 +1544,8 @@ nv40_graph_transfer_context(struct drm_device *dev, uint32_t inst, int save)
|
|||
tmp |= NV40_PGRAPH_CTXCTL_0304_XFER_CTX;
|
||||
NV_WRITE(NV40_PGRAPH_CTXCTL_0304, tmp);
|
||||
|
||||
nouveau_wait_for_idle(dev);
|
||||
|
||||
for (i = 0; i < tv; i++) {
|
||||
if (NV_READ(NV40_PGRAPH_CTXCTL_030C) == 0)
|
||||
break;
|
||||
|
@ -1565,9 +1567,7 @@ nv40_graph_transfer_context(struct drm_device *dev, uint32_t inst, int save)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* Save current context (from PGRAPH) into the channel's context
|
||||
*XXX: fails sometimes, not sure why..
|
||||
*/
|
||||
/* Save current context (from PGRAPH) into the channel's context */
|
||||
int
|
||||
nv40_graph_save_context(struct nouveau_channel *chan)
|
||||
{
|
||||
|
@ -1581,9 +1581,7 @@ nv40_graph_save_context(struct nouveau_channel *chan)
|
|||
return nv40_graph_transfer_context(dev, inst, 1);
|
||||
}
|
||||
|
||||
/* Restore the context for a specific channel into PGRAPH
|
||||
* XXX: fails sometimes.. not sure why
|
||||
*/
|
||||
/* Restore the context for a specific channel into PGRAPH */
|
||||
int
|
||||
nv40_graph_load_context(struct nouveau_channel *chan)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue