summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorJonathan Gray <jsg@cvs.openbsd.org>2015-12-27 08:58:22 +0000
committerJonathan Gray <jsg@cvs.openbsd.org>2015-12-27 08:58:22 +0000
commit5db7cad38be896315e2b897f68d1751d340a2483 (patch)
treecaab7de8344c4ce0d7d769184a89ea35d80dce1c /lib
parent5550a33ac941747a471b1029b7f6ae4a7569c8c3 (diff)
Import libdrm 2.4.65
Diffstat (limited to 'lib')
-rw-r--r--lib/libdrm/amdgpu/Makefile.am20
-rw-r--r--lib/libdrm/amdgpu/Makefile.sources14
-rw-r--r--lib/libdrm/amdgpu/amdgpu_cs.c13
-rw-r--r--lib/libdrm/amdgpu/amdgpu_device.c2
-rw-r--r--lib/libdrm/amdgpu/amdgpu_internal.h3
-rwxr-xr-xlib/libdrm/freedreno/freedreno-symbol-check1
-rw-r--r--lib/libdrm/freedreno/freedreno_bo.c38
-rw-r--r--lib/libdrm/freedreno/freedreno_device.c5
-rw-r--r--lib/libdrm/freedreno/freedreno_drmif.h1
-rw-r--r--lib/libdrm/freedreno/freedreno_priv.h6
-rw-r--r--lib/libdrm/freedreno/freedreno_ringbuffer.h2
-rw-r--r--lib/libdrm/freedreno/kgsl/kgsl_bo.c2
-rw-r--r--lib/libdrm/freedreno/kgsl/kgsl_device.c2
-rw-r--r--lib/libdrm/freedreno/kgsl/kgsl_pipe.c2
-rw-r--r--lib/libdrm/freedreno/kgsl/kgsl_ringbuffer.c2
-rw-r--r--lib/libdrm/freedreno/msm/msm_bo.c2
-rw-r--r--lib/libdrm/freedreno/msm/msm_device.c2
-rw-r--r--lib/libdrm/freedreno/msm/msm_pipe.c2
-rw-r--r--lib/libdrm/freedreno/msm/msm_ringbuffer.c2
-rw-r--r--lib/libdrm/include/drm/drm_fourcc.h93
-rw-r--r--lib/libdrm/include/drm/drm_mode.h11
-rw-r--r--lib/libdrm/nouveau/abi16.c13
-rw-r--r--lib/libdrm/nouveau/nouveau.c6
-rw-r--r--lib/libdrm/omap/omap_drm.c1
-rw-r--r--lib/libdrm/tests/Makefile.am2
-rw-r--r--lib/libdrm/tests/amdgpu/amdgpu_test.c32
-rw-r--r--lib/libdrm/tests/amdgpu/basic_tests.c3
-rw-r--r--lib/libdrm/tests/amdgpu/cs_tests.c4
-rw-r--r--lib/libdrm/tests/amdgpu/uvd_messages.h10
-rw-r--r--lib/libdrm/tests/amdgpu/vce_ib.h24
-rw-r--r--lib/libdrm/tests/modetest/cursor.c10
-rw-r--r--lib/libdrm/tests/modetest/modetest.c7
-rw-r--r--lib/libdrm/tests/vbltest/vbltest.c1
33 files changed, 239 insertions, 99 deletions
diff --git a/lib/libdrm/amdgpu/Makefile.am b/lib/libdrm/amdgpu/Makefile.am
index ed97803f0..cf7bc1ba8 100644
--- a/lib/libdrm/amdgpu/Makefile.am
+++ b/lib/libdrm/amdgpu/Makefile.am
@@ -22,8 +22,10 @@
# Authors:
# Jérôme Glisse <glisse@freedesktop.org>
+include Makefile.sources
+
AM_CFLAGS = \
- $(WARN_CFLAGS) -Wno-switch-enum \
+ $(WARN_CFLAGS) \
-I$(top_srcdir) \
$(PTHREADSTUBS_CFLAGS) \
-I$(top_srcdir)/include/drm
@@ -33,22 +35,10 @@ libdrm_amdgpu_ladir = $(libdir)
libdrm_amdgpu_la_LDFLAGS = -version-number 1:0:0 -no-undefined
libdrm_amdgpu_la_LIBADD = ../libdrm.la @PTHREADSTUBS_LIBS@
-libdrm_amdgpu_la_SOURCES = \
- amdgpu.h \
- amdgpu_bo.c \
- amdgpu_cs.c \
- amdgpu_device.c \
- amdgpu_gpu_info.c \
- amdgpu_internal.h \
- amdgpu_vamgr.c \
- util_hash.c \
- util_hash.h \
- util_hash_table.c \
- util_hash_table.h
+libdrm_amdgpu_la_SOURCES = $(LIBDRM_AMDGPU_FILES)
libdrm_amdgpuincludedir = ${includedir}/libdrm
-libdrm_amdgpuinclude_HEADERS = \
- amdgpu.h
+libdrm_amdgpuinclude_HEADERS = $(LIBDRM_AMDGPU_H_FILES)
pkgconfigdir = @pkgconfigdir@
pkgconfig_DATA = libdrm_amdgpu.pc
diff --git a/lib/libdrm/amdgpu/Makefile.sources b/lib/libdrm/amdgpu/Makefile.sources
new file mode 100644
index 000000000..0c0b9a93a
--- /dev/null
+++ b/lib/libdrm/amdgpu/Makefile.sources
@@ -0,0 +1,14 @@
+LIBDRM_AMDGPU_FILES := \
+ amdgpu_bo.c \
+ amdgpu_cs.c \
+ amdgpu_device.c \
+ amdgpu_gpu_info.c \
+ amdgpu_internal.h \
+ amdgpu_vamgr.c \
+ util_hash.c \
+ util_hash.h \
+ util_hash_table.c \
+ util_hash_table.h
+
+LIBDRM_AMDGPU_H_FILES := \
+ amdgpu.h
diff --git a/lib/libdrm/amdgpu/amdgpu_cs.c b/lib/libdrm/amdgpu/amdgpu_cs.c
index ea3532640..4da982144 100644
--- a/lib/libdrm/amdgpu/amdgpu_cs.c
+++ b/lib/libdrm/amdgpu/amdgpu_cs.c
@@ -32,6 +32,9 @@
#include <pthread.h>
#include <sched.h>
#include <sys/ioctl.h>
+#ifdef HAVE_ALLOCA_H
+# include <alloca.h>
+#endif
#include "xf86drm.h"
#include "amdgpu_drm.h"
@@ -63,10 +66,6 @@ int amdgpu_cs_ctx_create(amdgpu_device_handle dev,
gpu_context->dev = dev;
- r = pthread_mutex_init(&gpu_context->sequence_mutex, NULL);
- if (r)
- goto error;
-
/* Create the context */
memset(&args, 0, sizeof(args));
args.in.op = AMDGPU_CTX_OP_ALLOC_CTX;
@@ -80,7 +79,6 @@ int amdgpu_cs_ctx_create(amdgpu_device_handle dev,
return 0;
error:
- pthread_mutex_destroy(&gpu_context->sequence_mutex);
free(gpu_context);
return r;
}
@@ -101,8 +99,6 @@ int amdgpu_cs_ctx_free(amdgpu_context_handle context)
if (NULL == context)
return -EINVAL;
- pthread_mutex_destroy(&context->sequence_mutex);
-
/* now deal with kernel side */
memset(&args, 0, sizeof(args));
args.in.op = AMDGPU_CTX_OP_FREE_CTX;
@@ -200,8 +196,6 @@ static int amdgpu_cs_submit_one(amdgpu_context_handle context,
chunk_data[i].ib_data.flags = ib->flags;
}
- pthread_mutex_lock(&context->sequence_mutex);
-
if (user_fence) {
i = cs.in.num_chunks++;
@@ -254,7 +248,6 @@ static int amdgpu_cs_submit_one(amdgpu_context_handle context,
ibs_request->seq_no = cs.out.handle;
error_unlock:
- pthread_mutex_unlock(&context->sequence_mutex);
free(dependencies);
return r;
}
diff --git a/lib/libdrm/amdgpu/amdgpu_device.c b/lib/libdrm/amdgpu/amdgpu_device.c
index 75b12e259..e5a923e67 100644
--- a/lib/libdrm/amdgpu/amdgpu_device.c
+++ b/lib/libdrm/amdgpu/amdgpu_device.c
@@ -132,6 +132,8 @@ static void amdgpu_device_free_internal(amdgpu_device_handle dev)
{
amdgpu_vamgr_deinit(dev->vamgr);
free(dev->vamgr);
+ amdgpu_vamgr_deinit(dev->vamgr_32);
+ free(dev->vamgr_32);
util_hash_table_destroy(dev->bo_flink_names);
util_hash_table_destroy(dev->bo_handles);
pthread_mutex_destroy(&dev->bo_table_mutex);
diff --git a/lib/libdrm/amdgpu/amdgpu_internal.h b/lib/libdrm/amdgpu/amdgpu_internal.h
index 5d866030e..7dd5c1c72 100644
--- a/lib/libdrm/amdgpu/amdgpu_internal.h
+++ b/lib/libdrm/amdgpu/amdgpu_internal.h
@@ -111,9 +111,6 @@ struct amdgpu_bo_list {
struct amdgpu_context {
struct amdgpu_device *dev;
- /** Mutex for accessing fences and to maintain command submissions
- in good sequence. */
- pthread_mutex_t sequence_mutex;
/* context id*/
uint32_t id;
};
diff --git a/lib/libdrm/freedreno/freedreno-symbol-check b/lib/libdrm/freedreno/freedreno-symbol-check
index e593df4d7..f517b6e71 100755
--- a/lib/libdrm/freedreno/freedreno-symbol-check
+++ b/lib/libdrm/freedreno/freedreno-symbol-check
@@ -25,6 +25,7 @@ fd_bo_new
fd_bo_ref
fd_bo_size
fd_device_del
+fd_device_fd
fd_device_new
fd_device_new_dup
fd_device_ref
diff --git a/lib/libdrm/freedreno/freedreno_bo.c b/lib/libdrm/freedreno/freedreno_bo.c
index eec218c6b..1cb67595b 100644
--- a/lib/libdrm/freedreno/freedreno_bo.c
+++ b/lib/libdrm/freedreno/freedreno_bo.c
@@ -52,6 +52,9 @@ static struct fd_bo * lookup_bo(void *tbl, uint32_t key)
if (!drmHashLookup(tbl, key, (void **)&bo)) {
/* found, incr refcnt and return: */
bo = fd_bo_ref(bo);
+
+ /* don't break the bucket if this bo was found in one */
+ list_delinit(&bo->list);
}
return bo;
}
@@ -223,20 +226,30 @@ out_unlock:
struct fd_bo *
fd_bo_from_dmabuf(struct fd_device *dev, int fd)
{
- struct drm_prime_handle req = {
- .fd = fd,
- };
int ret, size;
+ uint32_t handle;
+ struct fd_bo *bo;
- ret = drmIoctl(dev->fd, DRM_IOCTL_PRIME_FD_TO_HANDLE, &req);
+ pthread_mutex_lock(&table_lock);
+ ret = drmPrimeFDToHandle(dev->fd, fd, &handle);
if (ret) {
return NULL;
}
- /* hmm, would be nice if we had a way to figure out the size.. */
- size = 0;
+ bo = lookup_bo(dev->handle_table, handle);
+ if (bo)
+ goto out_unlock;
+
+ /* lseek() to get bo size */
+ size = lseek(fd, 0, SEEK_END);
+ lseek(fd, 0, SEEK_CUR);
- return fd_bo_from_handle(dev, req.handle, size);
+ bo = bo_from_handle(dev, size, handle);
+
+out_unlock:
+ pthread_mutex_unlock(&table_lock);
+
+ return bo;
}
struct fd_bo * fd_bo_from_name(struct fd_device *dev, uint32_t name)
@@ -373,18 +386,15 @@ uint32_t fd_bo_handle(struct fd_bo *bo)
int fd_bo_dmabuf(struct fd_bo *bo)
{
if (bo->fd < 0) {
- struct drm_prime_handle req = {
- .handle = bo->handle,
- .flags = DRM_CLOEXEC,
- };
- int ret;
+ int ret, prime_fd;
- ret = drmIoctl(bo->dev->fd, DRM_IOCTL_PRIME_HANDLE_TO_FD, &req);
+ ret = drmPrimeHandleToFD(bo->dev->fd, bo->handle, DRM_CLOEXEC,
+ &prime_fd);
if (ret) {
return ret;
}
- bo->fd = req.fd;
+ bo->fd = prime_fd;
}
return dup(bo->fd);
}
diff --git a/lib/libdrm/freedreno/freedreno_device.c b/lib/libdrm/freedreno/freedreno_device.c
index 3bc4cb21a..ddb954551 100644
--- a/lib/libdrm/freedreno/freedreno_device.c
+++ b/lib/libdrm/freedreno/freedreno_device.c
@@ -160,3 +160,8 @@ void fd_device_del(struct fd_device *dev)
fd_device_del_impl(dev);
pthread_mutex_unlock(&table_lock);
}
+
+int fd_device_fd(struct fd_device *dev)
+{
+ return dev->fd;
+}
diff --git a/lib/libdrm/freedreno/freedreno_drmif.h b/lib/libdrm/freedreno/freedreno_drmif.h
index 81a14b433..5547e9439 100644
--- a/lib/libdrm/freedreno/freedreno_drmif.h
+++ b/lib/libdrm/freedreno/freedreno_drmif.h
@@ -76,6 +76,7 @@ struct fd_device * fd_device_new(int fd);
struct fd_device * fd_device_new_dup(int fd);
struct fd_device * fd_device_ref(struct fd_device *dev);
void fd_device_del(struct fd_device *dev);
+int fd_device_fd(struct fd_device *dev);
/* pipe functions:
diff --git a/lib/libdrm/freedreno/freedreno_priv.h b/lib/libdrm/freedreno/freedreno_priv.h
index 1dddcc39e..4e442e420 100644
--- a/lib/libdrm/freedreno/freedreno_priv.h
+++ b/lib/libdrm/freedreno/freedreno_priv.h
@@ -83,7 +83,7 @@ struct fd_device {
*/
void *handle_table, *name_table;
- struct fd_device_funcs *funcs;
+ const struct fd_device_funcs *funcs;
struct fd_bo_bucket cache_bucket[14 * 4];
int num_buckets;
@@ -107,7 +107,7 @@ struct fd_pipe_funcs {
struct fd_pipe {
struct fd_device *dev;
enum fd_pipe_id id;
- struct fd_pipe_funcs *funcs;
+ const struct fd_pipe_funcs *funcs;
};
struct fd_ringmarker {
@@ -141,7 +141,7 @@ struct fd_bo {
int fd; /* dmabuf handle */
void *map;
atomic_t refcnt;
- struct fd_bo_funcs *funcs;
+ const struct fd_bo_funcs *funcs;
int bo_reuse;
struct list_head list; /* bucket-list entry */
diff --git a/lib/libdrm/freedreno/freedreno_ringbuffer.h b/lib/libdrm/freedreno/freedreno_ringbuffer.h
index a5e1d032e..578cdb243 100644
--- a/lib/libdrm/freedreno/freedreno_ringbuffer.h
+++ b/lib/libdrm/freedreno/freedreno_ringbuffer.h
@@ -44,7 +44,7 @@ struct fd_ringbuffer {
int size;
uint32_t *cur, *end, *start, *last_start;
struct fd_pipe *pipe;
- struct fd_ringbuffer_funcs *funcs;
+ const struct fd_ringbuffer_funcs *funcs;
uint32_t last_timestamp;
struct fd_ringbuffer *parent;
};
diff --git a/lib/libdrm/freedreno/kgsl/kgsl_bo.c b/lib/libdrm/freedreno/kgsl/kgsl_bo.c
index 3407c769c..b8ac10261 100644
--- a/lib/libdrm/freedreno/kgsl/kgsl_bo.c
+++ b/lib/libdrm/freedreno/kgsl/kgsl_bo.c
@@ -123,7 +123,7 @@ static void kgsl_bo_destroy(struct fd_bo *bo)
}
-static struct fd_bo_funcs funcs = {
+static const struct fd_bo_funcs funcs = {
.offset = kgsl_bo_offset,
.cpu_prep = kgsl_bo_cpu_prep,
.cpu_fini = kgsl_bo_cpu_fini,
diff --git a/lib/libdrm/freedreno/kgsl/kgsl_device.c b/lib/libdrm/freedreno/kgsl/kgsl_device.c
index 8352d605f..175e83781 100644
--- a/lib/libdrm/freedreno/kgsl/kgsl_device.c
+++ b/lib/libdrm/freedreno/kgsl/kgsl_device.c
@@ -42,7 +42,7 @@ static void kgsl_device_destroy(struct fd_device *dev)
free(kgsl_dev);
}
-static struct fd_device_funcs funcs = {
+static const struct fd_device_funcs funcs = {
.bo_new_handle = kgsl_bo_new_handle,
.bo_from_handle = kgsl_bo_from_handle,
.pipe_new = kgsl_pipe_new,
diff --git a/lib/libdrm/freedreno/kgsl/kgsl_pipe.c b/lib/libdrm/freedreno/kgsl/kgsl_pipe.c
index e2fd65c01..58b3b4d50 100644
--- a/lib/libdrm/freedreno/kgsl/kgsl_pipe.c
+++ b/lib/libdrm/freedreno/kgsl/kgsl_pipe.c
@@ -108,7 +108,7 @@ static void kgsl_pipe_destroy(struct fd_pipe *pipe)
free(kgsl_pipe);
}
-static struct fd_pipe_funcs funcs = {
+static const struct fd_pipe_funcs funcs = {
.ringbuffer_new = kgsl_ringbuffer_new,
.get_param = kgsl_pipe_get_param,
.wait = kgsl_pipe_wait,
diff --git a/lib/libdrm/freedreno/kgsl/kgsl_ringbuffer.c b/lib/libdrm/freedreno/kgsl/kgsl_ringbuffer.c
index f0133078c..6f68f2f30 100644
--- a/lib/libdrm/freedreno/kgsl/kgsl_ringbuffer.c
+++ b/lib/libdrm/freedreno/kgsl/kgsl_ringbuffer.c
@@ -191,7 +191,7 @@ static void kgsl_ringbuffer_destroy(struct fd_ringbuffer *ring)
free(kgsl_ring);
}
-static struct fd_ringbuffer_funcs funcs = {
+static const struct fd_ringbuffer_funcs funcs = {
.hostptr = kgsl_ringbuffer_hostptr,
.flush = kgsl_ringbuffer_flush,
.emit_reloc = kgsl_ringbuffer_emit_reloc,
diff --git a/lib/libdrm/freedreno/msm/msm_bo.c b/lib/libdrm/freedreno/msm/msm_bo.c
index fd944131e..ee668aba9 100644
--- a/lib/libdrm/freedreno/msm/msm_bo.c
+++ b/lib/libdrm/freedreno/msm/msm_bo.c
@@ -96,7 +96,7 @@ static void msm_bo_destroy(struct fd_bo *bo)
}
-static struct fd_bo_funcs funcs = {
+static const struct fd_bo_funcs funcs = {
.offset = msm_bo_offset,
.cpu_prep = msm_bo_cpu_prep,
.cpu_fini = msm_bo_cpu_fini,
diff --git a/lib/libdrm/freedreno/msm/msm_device.c b/lib/libdrm/freedreno/msm/msm_device.c
index 81077e1a5..25c097c25 100644
--- a/lib/libdrm/freedreno/msm/msm_device.c
+++ b/lib/libdrm/freedreno/msm/msm_device.c
@@ -42,7 +42,7 @@ static void msm_device_destroy(struct fd_device *dev)
free(msm_dev);
}
-static struct fd_device_funcs funcs = {
+static const struct fd_device_funcs funcs = {
.bo_new_handle = msm_bo_new_handle,
.bo_from_handle = msm_bo_from_handle,
.pipe_new = msm_pipe_new,
diff --git a/lib/libdrm/freedreno/msm/msm_pipe.c b/lib/libdrm/freedreno/msm/msm_pipe.c
index e1edffea6..aa0866b4a 100644
--- a/lib/libdrm/freedreno/msm/msm_pipe.c
+++ b/lib/libdrm/freedreno/msm/msm_pipe.c
@@ -80,7 +80,7 @@ static void msm_pipe_destroy(struct fd_pipe *pipe)
free(msm_pipe);
}
-static struct fd_pipe_funcs funcs = {
+static const struct fd_pipe_funcs funcs = {
.ringbuffer_new = msm_ringbuffer_new,
.get_param = msm_pipe_get_param,
.wait = msm_pipe_wait,
diff --git a/lib/libdrm/freedreno/msm/msm_ringbuffer.c b/lib/libdrm/freedreno/msm/msm_ringbuffer.c
index 5ddea5740..ee6af0ba0 100644
--- a/lib/libdrm/freedreno/msm/msm_ringbuffer.c
+++ b/lib/libdrm/freedreno/msm/msm_ringbuffer.c
@@ -356,7 +356,7 @@ static void msm_ringbuffer_destroy(struct fd_ringbuffer *ring)
free(msm_ring);
}
-static struct fd_ringbuffer_funcs funcs = {
+static const struct fd_ringbuffer_funcs funcs = {
.hostptr = msm_ringbuffer_hostptr,
.flush = msm_ringbuffer_flush,
.reset = msm_ringbuffer_reset,
diff --git a/lib/libdrm/include/drm/drm_fourcc.h b/lib/libdrm/include/drm/drm_fourcc.h
index 85facb0a1..63a80ca5b 100644
--- a/lib/libdrm/include/drm/drm_fourcc.h
+++ b/lib/libdrm/include/drm/drm_fourcc.h
@@ -127,4 +127,97 @@
#define DRM_FORMAT_YUV444 fourcc_code('Y', 'U', '2', '4') /* non-subsampled Cb (1) and Cr (2) planes */
#define DRM_FORMAT_YVU444 fourcc_code('Y', 'V', '2', '4') /* non-subsampled Cr (1) and Cb (2) planes */
+
+/*
+ * Format Modifiers:
+ *
+ * Format modifiers describe, typically, a re-ordering or modification
+ * of the data in a plane of an FB. This can be used to express tiled/
+ * swizzled formats, or compression, or a combination of the two.
+ *
+ * The upper 8 bits of the format modifier are a vendor-id as assigned
+ * below. The lower 56 bits are assigned as vendor sees fit.
+ */
+
+/* Vendor Ids: */
+#define DRM_FORMAT_MOD_NONE 0
+#define DRM_FORMAT_MOD_VENDOR_INTEL 0x01
+#define DRM_FORMAT_MOD_VENDOR_AMD 0x02
+#define DRM_FORMAT_MOD_VENDOR_NV 0x03
+#define DRM_FORMAT_MOD_VENDOR_SAMSUNG 0x04
+#define DRM_FORMAT_MOD_VENDOR_QCOM 0x05
+/* add more to the end as needed */
+
+#define fourcc_mod_code(vendor, val) \
+ ((((u64)DRM_FORMAT_MOD_VENDOR_## vendor) << 56) | (val & 0x00ffffffffffffffULL))
+
+/*
+ * Format Modifier tokens:
+ *
+ * When adding a new token please document the layout with a code comment,
+ * similar to the fourcc codes above. drm_fourcc.h is considered the
+ * authoritative source for all of these.
+ */
+
+/* Intel framebuffer modifiers */
+
+/*
+ * Intel X-tiling layout
+ *
+ * This is a tiled layout using 4Kb tiles (except on gen2 where the tiles 2Kb)
+ * in row-major layout. Within the tile bytes are laid out row-major, with
+ * a platform-dependent stride. On top of that the memory can apply
+ * platform-depending swizzling of some higher address bits into bit6.
+ *
+ * This format is highly platforms specific and not useful for cross-driver
+ * sharing. It exists since on a given platform it does uniquely identify the
+ * layout in a simple way for i915-specific userspace.
+ */
+#define I915_FORMAT_MOD_X_TILED fourcc_mod_code(INTEL, 1)
+
+/*
+ * Intel Y-tiling layout
+ *
+ * This is a tiled layout using 4Kb tiles (except on gen2 where the tiles 2Kb)
+ * in row-major layout. Within the tile bytes are laid out in OWORD (16 bytes)
+ * chunks column-major, with a platform-dependent height. On top of that the
+ * memory can apply platform-depending swizzling of some higher address bits
+ * into bit6.
+ *
+ * This format is highly platforms specific and not useful for cross-driver
+ * sharing. It exists since on a given platform it does uniquely identify the
+ * layout in a simple way for i915-specific userspace.
+ */
+#define I915_FORMAT_MOD_Y_TILED fourcc_mod_code(INTEL, 2)
+
+/*
+ * Intel Yf-tiling layout
+ *
+ * This is a tiled layout using 4Kb tiles in row-major layout.
+ * Within the tile pixels are laid out in 16 256 byte units / sub-tiles which
+ * are arranged in four groups (two wide, two high) with column-major layout.
+ * Each group therefore consits out of four 256 byte units, which are also laid
+ * out as 2x2 column-major.
+ * 256 byte units are made out of four 64 byte blocks of pixels, producing
+ * either a square block or a 2:1 unit.
+ * 64 byte blocks of pixels contain four pixel rows of 16 bytes, where the width
+ * in pixel depends on the pixel depth.
+ */
+#define I915_FORMAT_MOD_Yf_TILED fourcc_mod_code(INTEL, 3)
+
+/*
+ * Tiled, NV12MT, grouped in 64 (pixels) x 32 (lines) -sized macroblocks
+ *
+ * Macroblocks are laid in a Z-shape, and each pixel data is following the
+ * standard NV12 style.
+ * As for NV12, an image is the result of two frame buffers: one for Y,
+ * one for the interleaved Cb/Cr components (1/2 the height of the Y buffer).
+ * Alignment requirements are (for each buffer):
+ * - multiple of 128 pixels for the width
+ * - multiple of 32 pixels for the height
+ *
+ * For more information: see http://linuxtv.org/downloads/v4l-dvb-apis/re32.html
+ */
+#define DRM_FORMAT_MOD_SAMSUNG_64_32_TILE fourcc_mod_code(SAMSUNG, 1)
+
#endif /* DRM_FOURCC_H */
diff --git a/lib/libdrm/include/drm/drm_mode.h b/lib/libdrm/include/drm/drm_mode.h
index 69c1ac3cf..115f36e45 100644
--- a/lib/libdrm/include/drm/drm_mode.h
+++ b/lib/libdrm/include/drm/drm_mode.h
@@ -322,7 +322,8 @@ struct drm_mode_fb_cmd {
__u32 handle;
};
-#define DRM_MODE_FB_INTERLACED (1<<0) /* for interlaced framebuffers */
+#define DRM_MODE_FB_INTERLACED (1<<0) /* for interlaced framebuffers */
+#define DRM_MODE_FB_MODIFIERS (1<<1) /* enables ->modifer[] */
struct drm_mode_fb_cmd2 {
__u32 fb_id;
@@ -343,10 +344,18 @@ struct drm_mode_fb_cmd2 {
* So it would consist of Y as offset[0] and UV as
* offset[1]. Note that offset[0] will generally
* be 0.
+ *
+ * To accommodate tiled, compressed, etc formats, a per-plane
+ * modifier can be specified. The default value of zero
+ * indicates "native" format as specified by the fourcc.
+ * Vendor specific modifier token. This allows, for example,
+ * different tiling/swizzling pattern on different planes.
+ * See discussion above of DRM_FORMAT_MOD_xxx.
*/
__u32 handles[4];
__u32 pitches[4]; /* pitch for each plane */
__u32 offsets[4]; /* offset of each plane */
+ __u64 modifier[4]; /* ie, tiling, compressed (per plane) */
};
#define DRM_MODE_FB_DIRTY_ANNOTATE_COPY 0x01
diff --git a/lib/libdrm/nouveau/abi16.c b/lib/libdrm/nouveau/abi16.c
index 4ca0bfbaf..59bc43605 100644
--- a/lib/libdrm/nouveau/abi16.c
+++ b/lib/libdrm/nouveau/abi16.c
@@ -38,7 +38,10 @@ abi16_chan_nv04(struct nouveau_object *obj)
{
struct nouveau_device *dev = (struct nouveau_device *)obj->parent;
struct nv04_fifo *nv04 = obj->data;
- struct drm_nouveau_channel_alloc req = {nv04->vram, nv04->gart};
+ struct drm_nouveau_channel_alloc req = {
+ .fb_ctxdma_handle = nv04->vram,
+ .tt_ctxdma_handle = nv04->gart
+ };
int ret;
ret = drmCommandWriteRead(dev->fd, DRM_NOUVEAU_CHANNEL_ALLOC,
@@ -105,7 +108,9 @@ drm_private int
abi16_engobj(struct nouveau_object *obj)
{
struct drm_nouveau_grobj_alloc req = {
- obj->parent->handle, obj->handle, obj->oclass
+ .channel = obj->parent->handle,
+ .handle = obj->handle,
+ .class = obj->oclass,
};
struct nouveau_device *dev;
int ret;
@@ -125,7 +130,9 @@ abi16_ntfy(struct nouveau_object *obj)
{
struct nv04_notify *ntfy = obj->data;
struct drm_nouveau_notifierobj_alloc req = {
- obj->parent->handle, ntfy->object->handle, ntfy->length
+ .channel = obj->parent->handle,
+ .handle = ntfy->object->handle,
+ .size = ntfy->length,
};
struct nouveau_device *dev;
int ret;
diff --git a/lib/libdrm/nouveau/nouveau.c b/lib/libdrm/nouveau/nouveau.c
index 7393474da..97fd77b93 100644
--- a/lib/libdrm/nouveau/nouveau.c
+++ b/lib/libdrm/nouveau/nouveau.c
@@ -177,7 +177,7 @@ nouveau_device_del(struct nouveau_device **pdev)
int
nouveau_getparam(struct nouveau_device *dev, uint64_t param, uint64_t *value)
{
- struct drm_nouveau_getparam r = { param, 0 };
+ struct drm_nouveau_getparam r = { .param = param };
int fd = dev->fd, ret =
drmCommandWriteRead(fd, DRM_NOUVEAU_GETPARAM, &r, sizeof(r));
*value = r.value;
@@ -187,7 +187,7 @@ nouveau_getparam(struct nouveau_device *dev, uint64_t param, uint64_t *value)
int
nouveau_setparam(struct nouveau_device *dev, uint64_t param, uint64_t value)
{
- struct drm_nouveau_setparam r = { param, value };
+ struct drm_nouveau_setparam r = { .param = param, .value = value };
return drmCommandWrite(dev->fd, DRM_NOUVEAU_SETPARAM, &r, sizeof(r));
}
@@ -348,7 +348,7 @@ nouveau_bo_del(struct nouveau_bo *bo)
{
struct nouveau_device_priv *nvdev = nouveau_device(bo->device);
struct nouveau_bo_priv *nvbo = nouveau_bo(bo);
- struct drm_gem_close req = { bo->handle };
+ struct drm_gem_close req = { .handle = bo->handle };
if (nvbo->head.next) {
pthread_mutex_lock(&nvdev->lock);
diff --git a/lib/libdrm/omap/omap_drm.c b/lib/libdrm/omap/omap_drm.c
index 4a0248d5e..08ba64eb6 100644
--- a/lib/libdrm/omap/omap_drm.c
+++ b/lib/libdrm/omap/omap_drm.c
@@ -186,6 +186,7 @@ static struct omap_bo * bo_from_handle(struct omap_device *dev,
}
bo->dev = omap_device_ref(dev);
bo->handle = handle;
+ bo->fd = -1;
atomic_set(&bo->refcnt, 1);
/* add ourselves to the handle table: */
drmHashInsert(dev->handle_table, handle, bo);
diff --git a/lib/libdrm/tests/Makefile.am b/lib/libdrm/tests/Makefile.am
index 9a2d9328a..a511d28ac 100644
--- a/lib/libdrm/tests/Makefile.am
+++ b/lib/libdrm/tests/Makefile.am
@@ -33,6 +33,8 @@ check_PROGRAMS = \
dristat \
drmstat
+dristat_LDADD = -lm
+
if HAVE_NOUVEAU
SUBDIRS += nouveau
endif
diff --git a/lib/libdrm/tests/amdgpu/amdgpu_test.c b/lib/libdrm/tests/amdgpu/amdgpu_test.c
index 656899051..71f357c66 100644
--- a/lib/libdrm/tests/amdgpu/amdgpu_test.c
+++ b/lib/libdrm/tests/amdgpu/amdgpu_test.c
@@ -58,14 +58,30 @@ int drm_amdgpu[MAX_CARDS_SUPPORTED];
/** The table of all known test suites to run */
static CU_SuiteInfo suites[] = {
- { "Basic Tests", suite_basic_tests_init,
- suite_basic_tests_clean, basic_tests },
- { "BO Tests", suite_bo_tests_init,
- suite_bo_tests_clean, bo_tests },
- { "CS Tests", suite_cs_tests_init,
- suite_cs_tests_clean, cs_tests },
- { "VCE Tests", suite_vce_tests_init,
- suite_vce_tests_clean, vce_tests },
+ {
+ .pName = "Basic Tests",
+ .pInitFunc = suite_basic_tests_init,
+ .pCleanupFunc = suite_basic_tests_clean,
+ .pTests = basic_tests,
+ },
+ {
+ .pName = "BO Tests",
+ .pInitFunc = suite_bo_tests_init,
+ .pCleanupFunc = suite_bo_tests_clean,
+ .pTests = bo_tests,
+ },
+ {
+ .pName = "CS Tests",
+ .pInitFunc = suite_cs_tests_init,
+ .pCleanupFunc = suite_cs_tests_clean,
+ .pTests = cs_tests,
+ },
+ {
+ .pName = "VCE Tests",
+ .pInitFunc = suite_vce_tests_init,
+ .pCleanupFunc = suite_vce_tests_clean,
+ .pTests = vce_tests,
+ },
CU_SUITE_INFO_NULL,
};
diff --git a/lib/libdrm/tests/amdgpu/basic_tests.c b/lib/libdrm/tests/amdgpu/basic_tests.c
index 787403938..e489e6e83 100644
--- a/lib/libdrm/tests/amdgpu/basic_tests.c
+++ b/lib/libdrm/tests/amdgpu/basic_tests.c
@@ -28,6 +28,9 @@
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
+#ifdef HAVE_ALLOCA_H
+# include <alloca.h>
+#endif
#include "CUnit/Basic.h"
diff --git a/lib/libdrm/tests/amdgpu/cs_tests.c b/lib/libdrm/tests/amdgpu/cs_tests.c
index 416f36b95..dfbf5af9c 100644
--- a/lib/libdrm/tests/amdgpu/cs_tests.c
+++ b/lib/libdrm/tests/amdgpu/cs_tests.c
@@ -266,7 +266,7 @@ static void amdgpu_cs_uvd_decode(void)
r = amdgpu_bo_cpu_map(buf_handle, (void **)&ptr);
CU_ASSERT_EQUAL(r, 0);
- memcpy(ptr, uvd_decode_msg, sizeof(uvd_create_msg));
+ memcpy(ptr, uvd_decode_msg, sizeof(uvd_decode_msg));
if (family_id >= AMDGPU_FAMILY_VI)
ptr[0x10] = 7;
@@ -362,7 +362,7 @@ static void amdgpu_cs_uvd_destroy(void)
r = amdgpu_bo_cpu_map(buf_handle, &msg);
CU_ASSERT_EQUAL(r, 0);
- memcpy(msg, uvd_destroy_msg, sizeof(uvd_create_msg));
+ memcpy(msg, uvd_destroy_msg, sizeof(uvd_destroy_msg));
if (family_id >= AMDGPU_FAMILY_VI)
((uint8_t*)msg)[0x10] = 7;
diff --git a/lib/libdrm/tests/amdgpu/uvd_messages.h b/lib/libdrm/tests/amdgpu/uvd_messages.h
index 44bcacc5b..00235cbb9 100644
--- a/lib/libdrm/tests/amdgpu/uvd_messages.h
+++ b/lib/libdrm/tests/amdgpu/uvd_messages.h
@@ -24,7 +24,7 @@
#ifndef _UVD_MESSAGES_H_
#define _UVD_MESSAGES_H_
-static uint8_t uvd_create_msg[] = {
+static const uint8_t uvd_create_msg[] = {
0xe4,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x44,0x40,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x03,0x00,0x00,
0xe0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xf9,0xf2,0x00,0x00,0x00,0x00,0x00,
@@ -250,7 +250,7 @@ static uint8_t uvd_create_msg[] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
-static uint8_t uvd_bitstream[] ={
+static const uint8_t uvd_bitstream[] ={
0x00,0x00,0x01,0x25,0xb8,0x20,0x20,0x21,0x44,0xc5,0x00,0x01,0x57,0x9b,0xef,0xbe,
0xfb,0xef,0xbe,0xfb,0xef,0xbe,0xfb,0xef,0xbe,0xfb,0xef,0xbe,0xfb,0xef,0xbe,0xfb,
0xef,0xbe,0xfb,0xef,0xbe,0xfb,0xef,0xbe,0xfb,0xef,0xbe,0xfb,0xef,0xbe,0xfb,0xef,
@@ -341,7 +341,7 @@ static uint8_t uvd_bitstream[] ={
0xeb,0xae,0xba,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
-static uint8_t uvd_decode_msg[] = {
+static const uint8_t uvd_decode_msg[] = {
0xe4,0x0d,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x44,0x40,0x01,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x60,0x03,0x00,0x00,0xe0,0x01,0x00,0x00,
0x00,0x00,0x00,0x00,0x80,0xf9,0xf2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
@@ -567,7 +567,7 @@ static uint8_t uvd_decode_msg[] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
-static uint8_t uvd_destroy_msg[] = {
+static const uint8_t uvd_destroy_msg[] = {
0xe4,0x0d,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x44,0x40,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
@@ -793,7 +793,7 @@ static uint8_t uvd_destroy_msg[] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
-static uint8_t uvd_it_scaling_table[] = {
+static const uint8_t uvd_it_scaling_table[] = {
0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
diff --git a/lib/libdrm/tests/amdgpu/vce_ib.h b/lib/libdrm/tests/amdgpu/vce_ib.h
index c5afed0cb..bd0bf9435 100644
--- a/lib/libdrm/tests/amdgpu/vce_ib.h
+++ b/lib/libdrm/tests/amdgpu/vce_ib.h
@@ -24,7 +24,7 @@
#ifndef _vce_ib_h_
#define _vce_ib_h_
-static uint32_t vce_session[3] = {
+static const uint32_t vce_session[] = {
0x0000000c,
0x00000001,
0x400c0001,
@@ -41,7 +41,7 @@ static uint32_t vce_taskinfo[8] = {
0x00000000,
};
-static uint32_t vce_create[12] = {
+static const uint32_t vce_create[] = {
0x00000030,
0x01000001,
0x00000000,
@@ -56,7 +56,7 @@ static uint32_t vce_create[12] = {
0x00000000,
};
-static uint32_t vce_rate_ctrl[28] = {
+static const uint32_t vce_rate_ctrl[] = {
0x00000070,
0x04000005,
0x00000000,
@@ -87,13 +87,13 @@ static uint32_t vce_rate_ctrl[28] = {
0x00000000,
};
-static uint32_t vce_config_ext[3] = {
+static const uint32_t vce_config_ext[] = {
0x0000000c,
0x04000001,
0x00000003,
};
-static uint32_t vce_motion_est[26] = {
+static const uint32_t vce_motion_est[] = {
0x00000068,
0x04000007,
0x00000001,
@@ -122,7 +122,7 @@ static uint32_t vce_motion_est[26] = {
0x00000000,
};
-static uint32_t vce_rdo[19] = {
+static const uint32_t vce_rdo[] = {
0x0000004c,
0x04000008,
0x00000000,
@@ -144,7 +144,7 @@ static uint32_t vce_rdo[19] = {
0x00000000,
};
-static uint32_t vce_pic_ctrl[29] = {
+static const uint32_t vce_pic_ctrl[] = {
0x00000074,
0x04000002,
0x00000000,
@@ -176,7 +176,7 @@ static uint32_t vce_pic_ctrl[29] = {
0x00000000,
};
-static uint32_t vce_feedback[5] = {
+static const uint32_t vce_feedback[] = {
0x00000014,
0x05000005,
0x00000000,
@@ -184,14 +184,14 @@ static uint32_t vce_feedback[5] = {
0x00000001,
};
-static uint32_t vce_context_buffer[4] = {
+static const uint32_t vce_context_buffer[] = {
0x00000010,
0x05000001,
0x00000000,
0xffffffff,
};
-static uint32_t vce_bs_buffer[5] = {
+static const uint32_t vce_bs_buffer[] = {
0x00000014,
0x05000004,
0x00000000,
@@ -199,7 +199,7 @@ static uint32_t vce_bs_buffer[5] = {
0x00154000,
};
-static uint32_t vce_aux_buffer[18] = {
+static const uint32_t vce_aux_buffer[] = {
0x00000048,
0x05000002,
0x0000f000,
@@ -311,7 +311,7 @@ static uint32_t vce_encode[88] = {
0x00000000,
};
-static uint32_t vce_destroy[2] = {
+static const uint32_t vce_destroy[] = {
0x00000008,
0x02000001,
};
diff --git a/lib/libdrm/tests/modetest/cursor.c b/lib/libdrm/tests/modetest/cursor.c
index 62a50efb3..d8a19bd22 100644
--- a/lib/libdrm/tests/modetest/cursor.c
+++ b/lib/libdrm/tests/modetest/cursor.c
@@ -70,7 +70,7 @@ static int cursor_running;
*/
struct cursor_step {
- void (*run)(struct cursor *cursor, struct cursor_step *step);
+ void (*run)(struct cursor *cursor, const struct cursor_step *step);
uint32_t msec;
uint32_t repeat;
int arg;
@@ -78,7 +78,7 @@ struct cursor_step {
static uint32_t indx, count;
-static void set_cursor(struct cursor *cursor, struct cursor_step *step)
+static void set_cursor(struct cursor *cursor, const struct cursor_step *step)
{
int enabled = (step->arg ^ count) & 0x1;
uint32_t handle = 0;
@@ -91,7 +91,7 @@ static void set_cursor(struct cursor *cursor, struct cursor_step *step)
drmModeSetCursor(cursor->fd, cursor->crtc_id, handle, cursor->w, cursor->h);
}
-static void move_cursor(struct cursor *cursor, struct cursor_step *step)
+static void move_cursor(struct cursor *cursor, const struct cursor_step *step)
{
int x = cursor->x;
int y = cursor->y;
@@ -126,7 +126,7 @@ static void move_cursor(struct cursor *cursor, struct cursor_step *step)
drmModeMoveCursor(cursor->fd, cursor->crtc_id, x, y);
}
-static struct cursor_step steps[] = {
+static const struct cursor_step steps[] = {
{ set_cursor, 10, 0, 1 }, /* enable */
{ move_cursor, 1, 100, 1 },
{ move_cursor, 1, 10, 10 },
@@ -145,7 +145,7 @@ static struct cursor_step steps[] = {
static void *cursor_thread_func(void *data)
{
while (cursor_running) {
- struct cursor_step *step = &steps[indx % ARRAY_SIZE(steps)];
+ const struct cursor_step *step = &steps[indx % ARRAY_SIZE(steps)];
int i;
for (i = 0; i < ncursors; i++) {
diff --git a/lib/libdrm/tests/modetest/modetest.c b/lib/libdrm/tests/modetest/modetest.c
index 64bee1d69..3b01918d1 100644
--- a/lib/libdrm/tests/modetest/modetest.c
+++ b/lib/libdrm/tests/modetest/modetest.c
@@ -589,7 +589,6 @@ static struct resources *get_resources(struct device *dev)
#define get_resource(_res, __res, type, Type) \
do { \
- int i; \
for (i = 0; i < (int)(_res)->__res->count_##type##s; ++i) { \
(_res)->type##s[i].type = \
drmModeGet##Type(dev->fd, (_res)->__res->type##s[i]); \
@@ -616,7 +615,6 @@ static struct resources *get_resources(struct device *dev)
#define get_properties(_res, __res, type, Type) \
do { \
- int i; \
for (i = 0; i < (int)(_res)->__res->count_##type##s; ++i) { \
struct type *obj = &res->type##s[i]; \
unsigned int j; \
@@ -1281,7 +1279,7 @@ static void test_page_flip(struct device *dev, struct pipe_arg *pipes, unsigned
evctx.version = DRM_EVENT_CONTEXT_VERSION;
evctx.vblank_handler = NULL;
evctx.page_flip_handler = page_flip_handler;
-
+
while (1) {
#if 0
struct pollfd pfd[2];
@@ -1301,7 +1299,6 @@ static void test_page_flip(struct device *dev, struct pipe_arg *pipes, unsigned
#else
struct timeval timeout = { .tv_sec = 3, .tv_usec = 0 };
fd_set fds;
- int ret;
FD_ZERO(&fds);
FD_SET(0, &fds);
@@ -1627,7 +1624,7 @@ int main(int argc, char **argv)
if (parse_connector(&pipe_args[count], optarg) < 0)
usage(argv[0]);
- count++;
+ count++;
break;
case 'C':
test_cursor = 1;
diff --git a/lib/libdrm/tests/vbltest/vbltest.c b/lib/libdrm/tests/vbltest/vbltest.c
index 4200adbe6..e27f45c1b 100644
--- a/lib/libdrm/tests/vbltest/vbltest.c
+++ b/lib/libdrm/tests/vbltest/vbltest.c
@@ -177,7 +177,6 @@ int main(int argc, char **argv)
while (1) {
struct timeval timeout = { .tv_sec = 3, .tv_usec = 0 };
fd_set fds;
- int ret;
FD_ZERO(&fds);
FD_SET(0, &fds);