From 725cd0b771768a03c838d7972a2e2357091f1574 Mon Sep 17 00:00:00 2001 From: Russell King Date: Tue, 21 May 2013 12:09:33 +0100 Subject: Rename dove -> armada As this is not specific to Armada 510 (Dove) devices, but also appears on other Marvell Armada devices, use "armada" as the name rather than "dove". Signed-off-by: Russell King --- .gitignore | 7 +- Makefile.am | 18 +- armada_bufmgr.c | 554 +++++++++++++++++++++++++++++++++++++++ armada_bufmgr.h | 46 ++++ armada_ioctl.h | 138 ++++++++++ configure.ac | 4 +- debian/changelog | 7 + debian/control | 16 +- debian/libdrm-armada-dev.install | 5 + debian/libdrm-armada2.install | 1 + debian/libdrm-dove-dev.install | 5 - debian/libdrm-dove2.install | 1 - debian/rules | 4 +- dove_bufmgr.c | 554 --------------------------------------- dove_bufmgr.h | 46 ---- dove_ioctl.h | 138 ---------- libdrm_armada.pc.in | 11 + libdrm_dove.pc.in | 11 - 18 files changed, 787 insertions(+), 779 deletions(-) create mode 100644 armada_bufmgr.c create mode 100644 armada_bufmgr.h create mode 100644 armada_ioctl.h create mode 100644 debian/libdrm-armada-dev.install create mode 100644 debian/libdrm-armada2.install delete mode 100644 debian/libdrm-dove-dev.install delete mode 100644 debian/libdrm-dove2.install delete mode 100644 dove_bufmgr.c delete mode 100644 dove_bufmgr.h delete mode 100644 dove_ioctl.h create mode 100644 libdrm_armada.pc.in delete mode 100644 libdrm_dove.pc.in diff --git a/.gitignore b/.gitignore index 0dbcc56..174234d 100644 --- a/.gitignore +++ b/.gitignore @@ -4,11 +4,12 @@ autom4te.cache/ build-aux/ build/ configure +debian/autoreconf.after +debian/autoreconf.before debian/files +debian/*.debhelper debian/*.log debian/*.substvars debian/tmp/ -debian/libdrm-dove-dev/ -debian/libdrm-dove1-dbg/ -debian/libdrm-dove1/ +debian/libdrm-armada*/ m4/ diff --git a/Makefile.am b/Makefile.am index 3f0c0e4..bce944b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -2,17 +2,17 @@ ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS} AM_CFLAGS = $(WARN_CFLAGS) @LIBDRM_CFLAGS@ -libdrm_dove_la_LTLIBRARIES = libdrm_dove.la -libdrm_dove_ladir = $(libdir) -libdrm_dove_la_LDFLAGS = -version-info 2:0:0 -no-undefined -libdrm_dove_la_LIBADD = @LIBDRM_LIBS@ @CLOCK_LIB@ +libdrm_armada_la_LTLIBRARIES = libdrm_armada.la +libdrm_armada_ladir = $(libdir) +libdrm_armada_la_LDFLAGS = -version-info 0:0:0 -no-undefined +libdrm_armada_la_LIBADD = @LIBDRM_LIBS@ @CLOCK_LIB@ -libdrm_dove_la_SOURCES = \ - dove_bufmgr.c \ +libdrm_armada_la_SOURCES = \ + armada_bufmgr.c \ libdrm_lists.h -libdrm_doveincludedir = ${includedir}/libdrm -libdrm_doveinclude_HEADERS = dove_bufmgr.h +libdrm_armadaincludedir = ${includedir}/libdrm +libdrm_armadainclude_HEADERS = armada_bufmgr.h pkgconfigdir = @pkgconfigdir@ -pkgconfig_DATA = libdrm_dove.pc +pkgconfig_DATA = libdrm_armada.pc diff --git a/armada_bufmgr.c b/armada_bufmgr.c new file mode 100644 index 0000000..01d9955 --- /dev/null +++ b/armada_bufmgr.c @@ -0,0 +1,554 @@ +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "libdrm_lists.h" +#include "armada_bufmgr.h" +#include "armada_ioctl.h" + +#ifndef container_of +#define container_of(ptr, type, member) ({ \ + const typeof( ((type *)0)->member ) *__mptr = (ptr); \ + (type *)( (char *)__mptr - offsetof(type,member) );}) +#endif + +/* The interval in seconds between cache cleans */ +#define BO_CACHE_CLEAN_INTERVAL 1 +/* The maximum age in seconds of a BO in the cache */ +#define BO_CACHE_MAX_AGE 2 +/* Number of buckets in the BO cache */ +#define NUM_BUCKETS (3*9) + +/* + * These sizes come from the i915 DRM backend - which uses roughly + * for n = 2.. + * (4096 << n) + (4096 << n) * 1 / 4 + * (4096 << n) + (4096 << n) * 2 / 4 + * (4096 << n) + (4096 << n) * 3 / 4 + * The reasoning being that powers of two are too wasteful in X. + */ +static size_t bucket_size[NUM_BUCKETS] = { + 4096, 8192, 12288, + 20480, 24576, 28672, + 40960, 49152, 57344, + 81920, 98304, 114688, + 163840, 196608, 229376, + 327680, 393216, 458752, + 655360, 786432, 917504, + 1310720, 1572864, 1835008, + 2621440, 3145728, 3670016, +}; + +struct armada_bucket { + drmMMListHead head; /* LRU list of bos in this size */ + size_t size; +}; + +struct armada_bo_cache { + struct armada_bucket buckets[NUM_BUCKETS]; + drmMMListHead head; /* LRU list of all freed bos */ + time_t last_cleaned; +}; + +struct drm_armada_bufmgr { + struct armada_bo_cache cache; + int fd; +}; + +struct armada_bo { + struct drm_armada_bo bo; + struct drm_armada_bufmgr *mgr; /* manager associated with this bo */ + drmMMListHead bucket; /* Cache bucket list */ + drmMMListHead free; /* Free list */ + time_t free_time; /* Time this bo was freed */ + size_t alloc_size; /* Allocated size */ + uint32_t ref; /* Reference count */ + uint32_t name; /* Global name */ +}; + +#define to_armada_bo(_bo) container_of(_bo, struct armada_bo, bo) + +#ifndef DRM_IOCTL_MODE_CREATE_DUMB +/* create a dumb scanout buffer */ +struct drm_mode_create_dumb { + uint32_t height; + uint32_t width; + uint32_t bpp; + uint32_t flags; + /* handle, pitch, size will be returned */ + uint32_t handle; + uint32_t pitch; + uint64_t size; +}; +#define DRM_IOCTL_MODE_CREATE_DUMB DRM_IOWR(0xB2, struct drm_mode_create_dumb) +#endif + +#ifndef DRM_IOCTL_MODE_DESTROY_DUMB +struct drm_mode_destroy_dumb { + uint32_t handle; +}; +#define DRM_IOCTL_MODE_DESTROY_DUMB DRM_IOWR(0xB4, struct drm_mode_destroy_dumb) +#endif + +#ifndef DRM_IOCTL_MODE_MAP_DUMB +struct drm_mode_map_dumb { + uint32_t handle; + uint32_t pad; + uint64_t offset; +}; +#define DRM_IOCTL_MODE_MAP_DUMB DRM_IOWR(0xB3, struct drm_mode_map_dumb) +#endif + +/* Given a width and bpp, return the pitch of a bo */ +static unsigned armada_bo_pitch(unsigned width, unsigned bpp) +{ + unsigned pitch = bpp != 4 ? width * ((bpp + 7) / 8) : width / 2; + + /* 88AP510 spec recommends pitch be a multiple of 128 */ + return (pitch + 127) & ~127; +} + +/* Given the pitch and height, return the allocated size in bytes of a bo */ +static size_t armada_bo_size(unsigned pitch, unsigned height) +{ + return pitch * height; +} + +static size_t armada_bo_round_size(size_t size) +{ + if (size > 1048576) + size = (size + 1048575) & ~1048575; + else if (size > 65536) + size = (size + 65535) & ~65535; + else + size = (size + 4095) & ~4095; + return size; +} + +static void armada_bo_free(struct armada_bo *bo) +{ + int ret, fd = bo->mgr->fd; + + if (bo->bo.ptr) { + munmap(bo->bo.ptr, bo->alloc_size); + bo->bo.ptr = NULL; + } + + if (bo->bo.type == DRM_ARMADA_BO_DUMB) { + struct drm_mode_destroy_dumb arg; + + memset(&arg, 0, sizeof(arg)); + arg.handle = bo->bo.handle; + ret = drmIoctl(fd, DRM_IOCTL_MODE_DESTROY_DUMB, &arg); + } else { + struct drm_gem_close close; + + memset(&close, 0, sizeof(close)); + close.handle = bo->bo.handle; + ret = ioctl(fd, DRM_IOCTL_GEM_CLOSE, &close); + } + + if (ret == 0) + free(bo); +} + +static void armada_bo_cache_init(struct armada_bo_cache *cache) +{ + struct timespec time; + unsigned i; + + clock_gettime(CLOCK_MONOTONIC, &time); + + cache->last_cleaned = time.tv_sec; + DRMINITLISTHEAD(&cache->head); + + for (i = 0; i < NUM_BUCKETS; i++) { + DRMINITLISTHEAD(&cache->buckets[i].head); + cache->buckets[i].size = bucket_size[i]; + } +} + +static void armada_bo_cache_fini(struct armada_bo_cache *cache) +{ + while (!DRMLISTEMPTY(&cache->head)) { + struct armada_bo *bo; + + bo = DRMLISTENTRY(struct armada_bo, cache->head.next, free); + + DRMLISTDEL(&bo->bucket); + DRMLISTDEL(&bo->free); + + armada_bo_free(bo); + } +} + +static struct armada_bucket *armada_find_bucket(struct armada_bo_cache *cache, size_t size) +{ + unsigned i; + + for (i = 0; i < NUM_BUCKETS; i++) { + struct armada_bucket *bucket = &cache->buckets[i]; + + if (bucket->size >= size) + return bucket; + } + + return NULL; +} + +static void armada_bo_cache_clean(struct armada_bo_cache *cache, time_t time) +{ + if (time - cache->last_cleaned < BO_CACHE_CLEAN_INTERVAL) + return; + + cache->last_cleaned = time; + + while (!DRMLISTEMPTY(&cache->head)) { + struct armada_bo *bo; + + bo = DRMLISTENTRY(struct armada_bo, cache->head.next, free); + if (time - bo->free_time < BO_CACHE_MAX_AGE) + break; + + DRMLISTDEL(&bo->bucket); + DRMLISTDEL(&bo->free); + + armada_bo_free(bo); + } +} + +static struct armada_bo *armada_bo_bucket_get(struct armada_bucket *bucket, size_t size) +{ + struct armada_bo *bo = NULL; + + if (!DRMLISTEMPTY(&bucket->head)) { + drmMMListHead *entry = bucket->head.next; + + bo = DRMLISTENTRY(struct armada_bo, entry, bucket); + DRMLISTDEL(&bo->bucket); + DRMLISTDEL(&bo->free); + } + return bo; +} + +static void armada_bo_cache_put(struct armada_bo *bo) +{ + struct armada_bo_cache *cache = &bo->mgr->cache; + struct armada_bucket *bucket = armada_find_bucket(cache, bo->alloc_size); + + if (bucket) { + struct timespec time; + + clock_gettime(CLOCK_MONOTONIC, &time); + + bo->free_time = time.tv_sec; + DRMLISTADDTAIL(&bo->bucket, &bucket->head); + DRMLISTADDTAIL(&bo->free, &cache->head); + + armada_bo_cache_clean(cache, time.tv_sec); + + return; + } + armada_bo_free(bo); +} + +struct drm_armada_bo *drm_armada_bo_create_phys(struct drm_armada_bufmgr *mgr, + uint32_t phys, size_t size) +{ + struct armada_bo *bo; + int fd = mgr->fd; + + bo = calloc(1, sizeof *bo); + if (bo) { + struct drm_armada_gem_create_phys arg; + int ret; + + memset(&arg, 0, sizeof(arg)); + arg.phys = phys; + arg.size = size; + + ret = drmIoctl(fd, DRM_IOCTL_ARMADA_GEM_CREATE_PHYS, &arg); + if (ret) { + free(bo); + return NULL; + } + bo->bo.ref = 1; + bo->bo.handle = arg.handle; + bo->bo.size = size; + bo->bo.phys = phys; + bo->bo.type = DRM_ARMADA_BO_LINEAR; + bo->alloc_size = size; + bo->ref = 1; + bo->mgr = mgr; + } + return &bo->bo; +} + +struct drm_armada_bo *drm_armada_bo_create(struct drm_armada_bufmgr *mgr, + unsigned w, unsigned h, unsigned bpp) +{ + struct drm_armada_gem_create arg; + struct armada_bucket *bucket; + struct armada_bo *bo; + unsigned pitch; + size_t alloc_size; + int fd = mgr->fd; + int ret; + + pitch = armada_bo_pitch(w, bpp); + alloc_size = armada_bo_size(pitch, h); + + /* Try to find a bucket for this allocation */ + bucket = armada_find_bucket(&mgr->cache, alloc_size); + if (bucket) { + /* Can we allocate from our cache? */ + bo = armada_bo_bucket_get(bucket, alloc_size); + if (bo) { + bo->bo.size = pitch * h; + bo->bo.pitch = pitch; + bo->ref = 1; + return &bo->bo; + } + + /* Otherwise, allocate a bo of the bucket size */ + alloc_size = bucket->size; + } else { + /* No bucket, so round the size up according to our old rules */ + alloc_size = armada_bo_round_size(alloc_size); + } + + /* No, create a new bo */ + bo = calloc(1, sizeof *bo); + if (!bo) + return NULL; + + memset(&arg, 0, sizeof(arg)); + arg.width = w; + arg.height = h; + arg.bpp = bpp; + arg.size = alloc_size; + + ret = drmIoctl(fd, DRM_IOCTL_ARMADA_GEM_CREATE, &arg); + if (ret) { + free(bo); + return NULL; + } + + bo->bo.ref = 1; + bo->bo.handle = arg.handle; + bo->bo.size = pitch * h; + bo->bo.pitch = pitch; + bo->bo.type = DRM_ARMADA_BO_SHMEM; + bo->alloc_size = alloc_size; + bo->ref = 1; + bo->mgr = mgr; + + return &bo->bo; +} + +struct drm_armada_bo *drm_armada_bo_create_from_name(struct drm_armada_bufmgr *mgr, + uint32_t name) +{ + struct armada_bo *bo; + int fd = mgr->fd; + + bo = calloc(1, sizeof *bo); + if (bo) { + struct drm_gem_open arg; + int ret; + + memset(&arg, 0, sizeof(arg)); + arg.name = name; + ret = drmIoctl(fd, DRM_IOCTL_GEM_OPEN, &arg); + if (ret == -1) { + free(bo); + return NULL; + } + bo->bo.ref = 1; + bo->bo.handle = arg.handle; + bo->bo.size = arg.size; + bo->bo.type = DRM_ARMADA_BO_LINEAR; /* assumed */ + bo->alloc_size = arg.size; + bo->ref = 1; + bo->name = name; + bo->mgr = mgr; + } + return &bo->bo; +} + +struct drm_armada_bo *drm_armada_bo_dumb_create(struct drm_armada_bufmgr *mgr, + unsigned w, unsigned h, unsigned bpp) +{ + struct armada_bo *bo; + int fd = mgr->fd; + + bo = calloc(1, sizeof *bo); + if (bo) { + struct drm_mode_create_dumb arg; + int ret; + + memset(&arg, 0, sizeof(arg)); + arg.width = w; + arg.height = h; + arg.bpp = bpp; + + ret = drmIoctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &arg); + if (ret) { + free(bo); + return NULL; + } + bo->bo.ref = 1; + bo->bo.handle = arg.handle; + bo->bo.size = arg.size; + bo->bo.pitch = arg.pitch; + bo->bo.type = DRM_ARMADA_BO_DUMB; + bo->alloc_size = arg.size; + bo->ref = 1; + bo->mgr = mgr; + } + return &bo->bo; +} + +void drm_armada_bo_get(struct drm_armada_bo *dbo) +{ + struct armada_bo *bo = to_armada_bo(dbo); + bo->ref++; +} + +void drm_armada_bo_put(struct drm_armada_bo *dbo) +{ + struct armada_bo *bo = to_armada_bo(dbo); + + if (bo->ref-- == 1) { + int ret; + + if (bo->bo.type == DRM_ARMADA_BO_SHMEM) + armada_bo_cache_put(bo); + else + armada_bo_free(bo); + } +} + +int drm_armada_bo_flink(struct drm_armada_bo *dbo, uint32_t *name) +{ + struct armada_bo *bo = to_armada_bo(dbo); + int fd = bo->mgr->fd; + + if (!bo->name) { + struct drm_gem_flink flink; + int ret; + + memset(&flink, 0, sizeof(flink)); + flink.handle = bo->bo.handle; + ret = ioctl(fd, DRM_IOCTL_GEM_FLINK, &flink); + if (ret) + return ret; + bo->name = flink.name; + } + *name = bo->name; + return 0; +} + +int drm_armada_bo_map(struct drm_armada_bo *dbo) +{ + struct armada_bo *bo = to_armada_bo(dbo); + void *map; + int ret, fd = bo->mgr->fd; + + if (bo->bo.ptr) + return 0; + + if (bo->bo.type == DRM_ARMADA_BO_DUMB) { + struct drm_mode_map_dumb arg; + + memset(&arg, 0, sizeof(arg)); + arg.handle = bo->bo.handle; + + ret = drmIoctl(fd, DRM_IOCTL_MODE_MAP_DUMB, &arg); + if (ret) + return ret; + + map = mmap(0, bo->alloc_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, + arg.offset); + + if (map == MAP_FAILED) + return -1; + } else if (bo->bo.type == DRM_ARMADA_BO_SHMEM) { + struct drm_armada_gem_mmap arg; + + memset(&arg, 0, sizeof(arg)); + arg.handle = bo->bo.handle; + arg.offset = 0; + arg.size = bo->alloc_size; + + ret = drmIoctl(fd, DRM_IOCTL_ARMADA_GEM_MMAP, &arg); + if (ret) + return -1; + + map = (void *)(uintptr_t)arg.addr; + } else { + errno = EINVAL; + return -1; + } + + bo->bo.ptr = map; + + return 0; +} + +uint32_t drm_armada_bo_phys(struct drm_armada_bo *dbo) +{ + struct armada_bo *bo = to_armada_bo(dbo); + struct drm_armada_gem_prop arg; + int ret, fd = bo->mgr->fd; + + memset(&arg, 0, sizeof(arg)); + arg.handle = bo->bo.handle; + + ret = drmIoctl(fd, DRM_IOCTL_ARMADA_GEM_PROP, &arg); + + return ret ? -1 : (uint32_t)arg.phys; +} + +int drm_armada_bo_subdata(struct drm_armada_bo *dbo, unsigned long offset, + unsigned long size, const void *data) +{ + struct armada_bo *bo = to_armada_bo(dbo); + struct drm_armada_gem_pwrite arg; + int fd = bo->mgr->fd; + + memset(&arg, 0, sizeof(arg)); + arg.handle = bo->bo.handle; + arg.offset = offset; + arg.size = size; + arg.ptr = (uint64_t)(uintptr_t)data; + + return drmIoctl(fd, DRM_IOCTL_ARMADA_GEM_PWRITE, &arg); +} + +int drm_armada_init(int fd, struct drm_armada_bufmgr **mgrp) +{ + struct drm_armada_bufmgr *mgr; + + mgr = calloc(1, sizeof(*mgr)); + if (!mgr) + return -1; + + armada_bo_cache_init(&mgr->cache); + mgr->fd = fd; + *mgrp = mgr; + + return 0; +} + +void drm_armada_fini(struct drm_armada_bufmgr *mgr) +{ + armada_bo_cache_fini(&mgr->cache); + free(mgr); +} diff --git a/armada_bufmgr.h b/armada_bufmgr.h new file mode 100644 index 0000000..9e6188f --- /dev/null +++ b/armada_bufmgr.h @@ -0,0 +1,46 @@ +#ifndef DRM_ARMADA_GEM_H +#define DRM_ARMADA_GEM_H + +enum drm_armada_bo_type { + DRM_ARMADA_BO_DUMB, + DRM_ARMADA_BO_LINEAR, + DRM_ARMADA_BO_SHMEM +}; + +struct drm_armada_bufmgr; + +struct drm_armada_bo { + uint32_t ref; + uint32_t handle; + uint32_t size; + uint32_t pitch; + uint32_t phys; + void *ptr; + enum drm_armada_bo_type type; +}; + +int drm_armada_init(int fd, struct drm_armada_bufmgr **mgr); +void drm_armada_fini(struct drm_armada_bufmgr *); + +struct drm_armada_bo *drm_armada_bo_create(struct drm_armada_bufmgr *, + unsigned w, unsigned h, unsigned bpp); +struct drm_armada_bo *drm_armada_bo_create_phys(struct drm_armada_bufmgr *, + uint32_t phys, size_t size); +struct drm_armada_bo *drm_armada_bo_dumb_create(struct drm_armada_bufmgr *, + unsigned w, unsigned h, unsigned bpp); + +/* Create a BO from a global name */ +struct drm_armada_bo *drm_armada_bo_create_from_name(struct drm_armada_bufmgr *, + uint32_t name); + +/* Create a global name from a BO */ +int drm_armada_bo_flink(struct drm_armada_bo *bo, uint32_t *name); + +int drm_armada_bo_map(struct drm_armada_bo *bo); +uint32_t drm_armada_bo_phys(struct drm_armada_bo *bo); +void drm_armada_bo_get(struct drm_armada_bo *bo); +void drm_armada_bo_put(struct drm_armada_bo *bo); +int drm_armada_bo_subdata(struct drm_armada_bo *bo, unsigned long offset, + unsigned long size, const void *data); + +#endif diff --git a/armada_ioctl.h b/armada_ioctl.h new file mode 100644 index 0000000..780312c --- /dev/null +++ b/armada_ioctl.h @@ -0,0 +1,138 @@ +/* + * Copyright (C) 2012 Russell King + * With inspiration from the i915 driver + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#ifndef DRM_ARMADA_IOCTL_H +#define DRM_ARMADA_IOCTL_H + +#define DRM_ARMADA_GEM_CREATE 0x00 +#define DRM_ARMADA_GEM_CREATE_PHYS 0x01 +#define DRM_ARMADA_GEM_MMAP 0x02 +#define DRM_ARMADA_GEM_PWRITE 0x03 +#define DRM_ARMADA_GEM_PROP 0x04 +#define DRM_ARMADA_GEM_CACHE 0x05 +#define DRM_ARMADA_OVERLAY_PUT_IMAGE 0x06 +#define DRM_ARMADA_OVERLAY_ATTRS 0x07 + +#define ARMADA_IOCTL(dir,name,str) \ + DRM_##dir(DRM_COMMAND_BASE + DRM_ARMADA_##name, struct drm_armada_##str) + +struct drm_armada_gem_create { + uint32_t height; + uint32_t width; + uint32_t bpp; + uint32_t handle; + uint32_t pitch; + uint32_t size; +}; +#define DRM_IOCTL_ARMADA_GEM_CREATE \ + ARMADA_IOCTL(IOWR, GEM_CREATE, gem_create) + +struct drm_armada_gem_create_phys { + uint32_t size; + uint32_t handle; + uint64_t phys; +}; +#define DRM_IOCTL_ARMADA_GEM_CREATE_PHYS \ + ARMADA_IOCTL(IOWR, GEM_CREATE_PHYS, gem_create_phys) + +struct drm_armada_gem_mmap { + uint32_t handle; + uint32_t pad; + uint64_t offset; + uint64_t size; + uint64_t addr; +}; +#define DRM_IOCTL_ARMADA_GEM_MMAP \ + ARMADA_IOCTL(IOWR, GEM_MMAP, gem_mmap) + +struct drm_armada_gem_pwrite { + uint32_t handle; + uint32_t offset; + uint32_t size; + uint64_t ptr; +}; +#define DRM_IOCTL_ARMADA_GEM_PWRITE \ + ARMADA_IOCTL(IOW, GEM_PWRITE, gem_pwrite) + +struct drm_armada_gem_prop { + uint64_t phys; + uint32_t handle; +}; +#define DRM_IOCTL_ARMADA_GEM_PROP \ + ARMADA_IOCTL(IOWR, GEM_PROP, gem_prop) + +struct drm_armada_gem_cache { + uint64_t ptr; + uint32_t handle; + uint32_t size; + uint32_t op; +}; +#define DRM_IOCTL_ARMADA_GEM_CACHE \ + ARMADA_IOCTL(IOW, GEM_CACHE, gem_cache) + +/* Same as Intel I915 */ +struct drm_armada_overlay_put_image { + uint32_t flags; +#define ARMADA_OVERLAY_TYPE_MASK 0x000000ff +#define ARMADA_OVERLAY_YUV_PLANAR 0x00000001 +#define ARMADA_OVERLAY_YUV_PACKED 0x00000002 +#define ARMADA_OVERLAY_RGB 0x00000003 +#define ARMADA_OVERLAY_DEPTH_MASK 0x0000ff00 +#define ARMADA_OVERLAY_RGB24 0x00001000 +#define ARMADA_OVERLAY_RGB16 0x00002000 +#define ARMADA_OVERLAY_RGB15 0x00003000 +#define ARMADA_OVERLAY_YUV422 0x00000100 +#define ARMADA_OVERLAY_YUV411 0x00000200 +#define ARMADA_OVERLAY_YUV420 0x00000300 +#define ARMADA_OVERLAY_YUV410 0x00000400 +#define ARMADA_OVERLAY_SWAP_MASK 0x00ff0000 +#define ARMADA_OVERLAY_NO_SWAP 0x00000000 +#define ARMADA_OVERLAY_UV_SWAP 0x00010000 +#define ARMADA_OVERLAY_Y_SWAP 0x00020000 +#define ARMADA_OVERLAY_Y_AND_UV_SWAP 0x00030000 +#define ARMADA_OVERLAY_FLAGS_MASK 0xff000000 +#define ARMADA_OVERLAY_ENABLE 0x01000000 + uint32_t bo_handle; + uint16_t stride_Y; + uint16_t stride_UV; + uint32_t offset_Y; + uint32_t offset_U; + uint32_t offset_V; + uint16_t src_width; + uint16_t src_height; + uint16_t src_scan_width; + uint16_t src_scan_height; + uint32_t crtc_id; + uint16_t dst_x; + uint16_t dst_y; + uint16_t dst_width; + uint16_t dst_height; +}; +#define DRM_IOCTL_ARMADA_OVERLAY_PUT_IMAGE \ + ARMADA_IOCTL(IOW, OVERLAY_PUT_IMAGE, overlay_put_image) + +/* Same as Intel I915 */ +struct drm_armada_overlay_attrs { + uint32_t flags; +#define ARMADA_OVERLAY_UPDATE_ATTRS (1<<0) +#define ARMADA_OVERLAY_UPDATE_GAMMA (1<<1) + uint32_t color_key; + int32_t brightness; + uint32_t contrast; + uint32_t saturation; + uint32_t gamma0; + uint32_t gamma1; + uint32_t gamma2; + uint32_t gamma3; + uint32_t gamma4; + uint32_t gamma5; +}; +#define DRM_IOCTL_ARMADA_OVERLAY_ATTRS \ + ARMADA_IOCTL(IOWR, OVERLAY_ATTRS, overlay_attrs) + +#endif diff --git a/configure.ac b/configure.ac index 0d5e518..0e1ab67 100644 --- a/configure.ac +++ b/configure.ac @@ -1,5 +1,5 @@ AC_PREREQ([2.63]) -AC_INIT([libdrm_dove], [2.0.0], [], [libdrm_dove]) +AC_INIT([libdrm_armada], [2.0.0], [], [libdrm_armada]) AC_CONFIG_SRCDIR([Makefile.am]) AC_CONFIG_MACRO_DIR([m4]) @@ -34,6 +34,6 @@ AC_SUBST(pkgconfigdir) AC_CONFIG_FILES([ Makefile - libdrm_dove.pc + libdrm_armada.pc ]) AC_OUTPUT diff --git a/debian/changelog b/debian/changelog index 95e7cd7..dc126c7 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +libdrm-armada (2.0.1-1) unstable; urgency=low + + * Rename to Armada as this covers more devices than just the Armada 510 + Dove. + + -- Russell King Tue, 21 May 2013 10:54:58 +0100 + libdrm-dove (2.0.0-1) unstable; urgency=low * Re-vamp API to allow a buffer manager object, stop passing fd into diff --git a/debian/control b/debian/control index efbf3d0..909d780 100644 --- a/debian/control +++ b/debian/control @@ -1,4 +1,4 @@ -Source: libdrm-dove +Source: libdrm-armada Priority: optional Maintainer: Russell King Build-Depends: @@ -9,11 +9,11 @@ Build-Depends: Standards-Version: 3.9.2 Section: libs -Package: libdrm-dove-dev +Package: libdrm-armada-dev Section: libdevel Architecture: any Depends: - libdrm-dove2 (= ${binary:Version}), + libdrm-armada2 (= ${binary:Version}), ${misc:Depends}, Description: Userspace interface to kernel DRM services -- development files This library implements the userspace interface to the kernel DRM @@ -22,9 +22,9 @@ Description: Userspace interface to kernel DRM services -- development files The DRI is currently used on Linux to provide hardware-accelerated OpenGL drivers. . - This package provides the development environment for libdrm-dove2. + This package provides the development environment for libdrm-armada2. -Package: libdrm-dove2 +Package: libdrm-armada2 Section: libs Priority: extra Architecture: linux-any @@ -40,9 +40,9 @@ Description: Userspace interface to kernel DRM services -- runtime The DRI is currently used on Linux to provide hardware-accelerated OpenGL drivers. . - This package provides the runtime environment for libdrm-dove2. + This package provides the runtime environment for libdrm-armada2. -Package: libdrm-dove2-dbg +Package: libdrm-armada2-dbg Section: debug Priority: extra Architecture: linux-any @@ -56,4 +56,4 @@ Description: Userspace interface to kernel DRM services -- debugging symbols The DRI is currently used on Linux to provide hardware-accelerated OpenGL drivers. . - This package provides debugging symbols for the libdrm-dove2 package. + This package provides debugging symbols for the libdrm-armada2 package. diff --git a/debian/libdrm-armada-dev.install b/debian/libdrm-armada-dev.install new file mode 100644 index 0000000..757f698 --- /dev/null +++ b/debian/libdrm-armada-dev.install @@ -0,0 +1,5 @@ +usr/include/* +usr/lib/*/lib*.a +usr/lib/*/lib*.so +usr/lib/*/pkgconfig/* + diff --git a/debian/libdrm-armada2.install b/debian/libdrm-armada2.install new file mode 100644 index 0000000..3ddde58 --- /dev/null +++ b/debian/libdrm-armada2.install @@ -0,0 +1 @@ +usr/lib/*/lib*.so.* diff --git a/debian/libdrm-dove-dev.install b/debian/libdrm-dove-dev.install deleted file mode 100644 index 757f698..0000000 --- a/debian/libdrm-dove-dev.install +++ /dev/null @@ -1,5 +0,0 @@ -usr/include/* -usr/lib/*/lib*.a -usr/lib/*/lib*.so -usr/lib/*/pkgconfig/* - diff --git a/debian/libdrm-dove2.install b/debian/libdrm-dove2.install deleted file mode 100644 index c131245..0000000 --- a/debian/libdrm-dove2.install +++ /dev/null @@ -1 +0,0 @@ -usr/lib/*/libdrm_dove.so.2* diff --git a/debian/rules b/debian/rules index cc315f2..2d9cfa4 100755 --- a/debian/rules +++ b/debian/rules @@ -15,9 +15,9 @@ override_dh_install: dh_install --fail-missing override_dh_strip: - dh_strip -plibdrm-dove2 --dbg-package=libdrm-dove2-dbg + dh_strip -plibdrm-armada2 --dbg-package=libdrm-armada2-dbg dh_strip -s --remaining-packages %: - dh $@ --with quilt,autoreconf --builddirectory=build/ + dh $@ --with autoreconf --builddirectory=build/ diff --git a/dove_bufmgr.c b/dove_bufmgr.c deleted file mode 100644 index eb2596b..0000000 --- a/dove_bufmgr.c +++ /dev/null @@ -1,554 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "libdrm_lists.h" -#include "dove_bufmgr.h" -#include "dove_ioctl.h" - -#ifndef container_of -#define container_of(ptr, type, member) ({ \ - const typeof( ((type *)0)->member ) *__mptr = (ptr); \ - (type *)( (char *)__mptr - offsetof(type,member) );}) -#endif - -/* The interval in seconds between cache cleans */ -#define BO_CACHE_CLEAN_INTERVAL 1 -/* The maximum age in seconds of a BO in the cache */ -#define BO_CACHE_MAX_AGE 2 -/* Number of buckets in the BO cache */ -#define NUM_BUCKETS (3*9) - -/* - * These sizes come from the i915 DRM backend - which uses roughly - * for n = 2.. - * (4096 << n) + (4096 << n) * 1 / 4 - * (4096 << n) + (4096 << n) * 2 / 4 - * (4096 << n) + (4096 << n) * 3 / 4 - * The reasoning being that powers of two are too wasteful in X. - */ -static size_t bucket_size[NUM_BUCKETS] = { - 4096, 8192, 12288, - 20480, 24576, 28672, - 40960, 49152, 57344, - 81920, 98304, 114688, - 163840, 196608, 229376, - 327680, 393216, 458752, - 655360, 786432, 917504, - 1310720, 1572864, 1835008, - 2621440, 3145728, 3670016, -}; - -struct dove_bucket { - drmMMListHead head; /* LRU list of bos in this size */ - size_t size; -}; - -struct dove_bo_cache { - struct dove_bucket buckets[NUM_BUCKETS]; - drmMMListHead head; /* LRU list of all freed bos */ - time_t last_cleaned; -}; - -struct drm_dove_bufmgr { - struct dove_bo_cache cache; - int fd; -}; - -struct dove_bo { - struct drm_dove_bo bo; - struct drm_dove_bufmgr *mgr; /* manager associated with this bo */ - drmMMListHead bucket; /* Cache bucket list */ - drmMMListHead free; /* Free list */ - time_t free_time; /* Time this bo was freed */ - size_t alloc_size; /* Allocated size */ - uint32_t ref; /* Reference count */ - uint32_t name; /* Global name */ -}; - -#define to_dove_bo(_bo) container_of(_bo, struct dove_bo, bo) - -#ifndef DRM_IOCTL_MODE_CREATE_DUMB -/* create a dumb scanout buffer */ -struct drm_mode_create_dumb { - uint32_t height; - uint32_t width; - uint32_t bpp; - uint32_t flags; - /* handle, pitch, size will be returned */ - uint32_t handle; - uint32_t pitch; - uint64_t size; -}; -#define DRM_IOCTL_MODE_CREATE_DUMB DRM_IOWR(0xB2, struct drm_mode_create_dumb) -#endif - -#ifndef DRM_IOCTL_MODE_DESTROY_DUMB -struct drm_mode_destroy_dumb { - uint32_t handle; -}; -#define DRM_IOCTL_MODE_DESTROY_DUMB DRM_IOWR(0xB4, struct drm_mode_destroy_dumb) -#endif - -#ifndef DRM_IOCTL_MODE_MAP_DUMB -struct drm_mode_map_dumb { - uint32_t handle; - uint32_t pad; - uint64_t offset; -}; -#define DRM_IOCTL_MODE_MAP_DUMB DRM_IOWR(0xB3, struct drm_mode_map_dumb) -#endif - -/* Given a width and bpp, return the pitch of a bo */ -static unsigned dove_bo_pitch(unsigned width, unsigned bpp) -{ - unsigned pitch = bpp != 4 ? width * ((bpp + 7) / 8) : width / 2; - - /* 88AP510 spec recommends pitch be a multiple of 128 */ - return (pitch + 127) & ~127; -} - -/* Given the pitch and height, return the allocated size in bytes of a bo */ -static size_t dove_bo_size(unsigned pitch, unsigned height) -{ - return pitch * height; -} - -static size_t dove_bo_round_size(size_t size) -{ - if (size > 1048576) - size = (size + 1048575) & ~1048575; - else if (size > 65536) - size = (size + 65535) & ~65535; - else - size = (size + 4095) & ~4095; - return size; -} - -static void dove_bo_free(struct dove_bo *bo) -{ - int ret, fd = bo->mgr->fd; - - if (bo->bo.ptr) { - munmap(bo->bo.ptr, bo->alloc_size); - bo->bo.ptr = NULL; - } - - if (bo->bo.type == DRM_DOVE_BO_DUMB) { - struct drm_mode_destroy_dumb arg; - - memset(&arg, 0, sizeof(arg)); - arg.handle = bo->bo.handle; - ret = drmIoctl(fd, DRM_IOCTL_MODE_DESTROY_DUMB, &arg); - } else { - struct drm_gem_close close; - - memset(&close, 0, sizeof(close)); - close.handle = bo->bo.handle; - ret = ioctl(fd, DRM_IOCTL_GEM_CLOSE, &close); - } - - if (ret == 0) - free(bo); -} - -static void dove_bo_cache_init(struct dove_bo_cache *cache) -{ - struct timespec time; - unsigned i; - - clock_gettime(CLOCK_MONOTONIC, &time); - - cache->last_cleaned = time.tv_sec; - DRMINITLISTHEAD(&cache->head); - - for (i = 0; i < NUM_BUCKETS; i++) { - DRMINITLISTHEAD(&cache->buckets[i].head); - cache->buckets[i].size = bucket_size[i]; - } -} - -static void dove_bo_cache_fini(struct dove_bo_cache *cache) -{ - while (!DRMLISTEMPTY(&cache->head)) { - struct dove_bo *bo; - - bo = DRMLISTENTRY(struct dove_bo, cache->head.next, free); - - DRMLISTDEL(&bo->bucket); - DRMLISTDEL(&bo->free); - - dove_bo_free(bo); - } -} - -static struct dove_bucket *dove_find_bucket(struct dove_bo_cache *cache, size_t size) -{ - unsigned i; - - for (i = 0; i < NUM_BUCKETS; i++) { - struct dove_bucket *bucket = &cache->buckets[i]; - - if (bucket->size >= size) - return bucket; - } - - return NULL; -} - -static void dove_bo_cache_clean(struct dove_bo_cache *cache, time_t time) -{ - if (time - cache->last_cleaned < BO_CACHE_CLEAN_INTERVAL) - return; - - cache->last_cleaned = time; - - while (!DRMLISTEMPTY(&cache->head)) { - struct dove_bo *bo; - - bo = DRMLISTENTRY(struct dove_bo, cache->head.next, free); - if (time - bo->free_time < BO_CACHE_MAX_AGE) - break; - - DRMLISTDEL(&bo->bucket); - DRMLISTDEL(&bo->free); - - dove_bo_free(bo); - } -} - -static struct dove_bo *dove_bo_bucket_get(struct dove_bucket *bucket, size_t size) -{ - struct dove_bo *bo = NULL; - - if (!DRMLISTEMPTY(&bucket->head)) { - drmMMListHead *entry = bucket->head.next; - - bo = DRMLISTENTRY(struct dove_bo, entry, bucket); - DRMLISTDEL(&bo->bucket); - DRMLISTDEL(&bo->free); - } - return bo; -} - -static void dove_bo_cache_put(struct dove_bo *bo) -{ - struct dove_bo_cache *cache = &bo->mgr->cache; - struct dove_bucket *bucket = dove_find_bucket(cache, bo->alloc_size); - - if (bucket) { - struct timespec time; - - clock_gettime(CLOCK_MONOTONIC, &time); - - bo->free_time = time.tv_sec; - DRMLISTADDTAIL(&bo->bucket, &bucket->head); - DRMLISTADDTAIL(&bo->free, &cache->head); - - dove_bo_cache_clean(cache, time.tv_sec); - - return; - } - dove_bo_free(bo); -} - -struct drm_dove_bo *drm_dove_bo_create_phys(struct drm_dove_bufmgr *mgr, - uint32_t phys, size_t size) -{ - struct dove_bo *bo; - int fd = mgr->fd; - - bo = calloc(1, sizeof *bo); - if (bo) { - struct drm_dove_gem_create_phys arg; - int ret; - - memset(&arg, 0, sizeof(arg)); - arg.phys = phys; - arg.size = size; - - ret = drmIoctl(fd, DRM_IOCTL_DOVE_GEM_CREATE_PHYS, &arg); - if (ret) { - free(bo); - return NULL; - } - bo->bo.ref = 1; - bo->bo.handle = arg.handle; - bo->bo.size = size; - bo->bo.phys = phys; - bo->bo.type = DRM_DOVE_BO_LINEAR; - bo->alloc_size = size; - bo->ref = 1; - bo->mgr = mgr; - } - return &bo->bo; -} - -struct drm_dove_bo *drm_dove_bo_create(struct drm_dove_bufmgr *mgr, - unsigned w, unsigned h, unsigned bpp) -{ - struct drm_dove_gem_create arg; - struct dove_bucket *bucket; - struct dove_bo *bo; - unsigned pitch; - size_t alloc_size; - int fd = mgr->fd; - int ret; - - pitch = dove_bo_pitch(w, bpp); - alloc_size = dove_bo_size(pitch, h); - - /* Try to find a bucket for this allocation */ - bucket = dove_find_bucket(&mgr->cache, alloc_size); - if (bucket) { - /* Can we allocate from our cache? */ - bo = dove_bo_bucket_get(bucket, alloc_size); - if (bo) { - bo->bo.size = pitch * h; - bo->bo.pitch = pitch; - bo->ref = 1; - return &bo->bo; - } - - /* Otherwise, allocate a bo of the bucket size */ - alloc_size = bucket->size; - } else { - /* No bucket, so round the size up according to our old rules */ - alloc_size = dove_bo_round_size(alloc_size); - } - - /* No, create a new bo */ - bo = calloc(1, sizeof *bo); - if (!bo) - return NULL; - - memset(&arg, 0, sizeof(arg)); - arg.width = w; - arg.height = h; - arg.bpp = bpp; - arg.size = alloc_size; - - ret = drmIoctl(fd, DRM_IOCTL_DOVE_GEM_CREATE, &arg); - if (ret) { - free(bo); - return NULL; - } - - bo->bo.ref = 1; - bo->bo.handle = arg.handle; - bo->bo.size = pitch * h; - bo->bo.pitch = pitch; - bo->bo.type = DRM_DOVE_BO_SHMEM; - bo->alloc_size = alloc_size; - bo->ref = 1; - bo->mgr = mgr; - - return &bo->bo; -} - -struct drm_dove_bo *drm_dove_bo_create_from_name(struct drm_dove_bufmgr *mgr, - uint32_t name) -{ - struct dove_bo *bo; - int fd = mgr->fd; - - bo = calloc(1, sizeof *bo); - if (bo) { - struct drm_gem_open arg; - int ret; - - memset(&arg, 0, sizeof(arg)); - arg.name = name; - ret = drmIoctl(fd, DRM_IOCTL_GEM_OPEN, &arg); - if (ret == -1) { - free(bo); - return NULL; - } - bo->bo.ref = 1; - bo->bo.handle = arg.handle; - bo->bo.size = arg.size; - bo->bo.type = DRM_DOVE_BO_LINEAR; /* assumed */ - bo->alloc_size = arg.size; - bo->ref = 1; - bo->name = name; - bo->mgr = mgr; - } - return &bo->bo; -} - -struct drm_dove_bo *drm_dove_bo_dumb_create(struct drm_dove_bufmgr *mgr, - unsigned w, unsigned h, unsigned bpp) -{ - struct dove_bo *bo; - int fd = mgr->fd; - - bo = calloc(1, sizeof *bo); - if (bo) { - struct drm_mode_create_dumb arg; - int ret; - - memset(&arg, 0, sizeof(arg)); - arg.width = w; - arg.height = h; - arg.bpp = bpp; - - ret = drmIoctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &arg); - if (ret) { - free(bo); - return NULL; - } - bo->bo.ref = 1; - bo->bo.handle = arg.handle; - bo->bo.size = arg.size; - bo->bo.pitch = arg.pitch; - bo->bo.type = DRM_DOVE_BO_DUMB; - bo->alloc_size = arg.size; - bo->ref = 1; - bo->mgr = mgr; - } - return &bo->bo; -} - -void drm_dove_bo_get(struct drm_dove_bo *dbo) -{ - struct dove_bo *bo = to_dove_bo(dbo); - bo->ref++; -} - -void drm_dove_bo_put(struct drm_dove_bo *dbo) -{ - struct dove_bo *bo = to_dove_bo(dbo); - - if (bo->ref-- == 1) { - int ret; - - if (bo->bo.type == DRM_DOVE_BO_SHMEM) - dove_bo_cache_put(bo); - else - dove_bo_free(bo); - } -} - -int drm_dove_bo_flink(struct drm_dove_bo *dbo, uint32_t *name) -{ - struct dove_bo *bo = to_dove_bo(dbo); - int fd = bo->mgr->fd; - - if (!bo->name) { - struct drm_gem_flink flink; - int ret; - - memset(&flink, 0, sizeof(flink)); - flink.handle = bo->bo.handle; - ret = ioctl(fd, DRM_IOCTL_GEM_FLINK, &flink); - if (ret) - return ret; - bo->name = flink.name; - } - *name = bo->name; - return 0; -} - -int drm_dove_bo_map(struct drm_dove_bo *dbo) -{ - struct dove_bo *bo = to_dove_bo(dbo); - void *map; - int ret, fd = bo->mgr->fd; - - if (bo->bo.ptr) - return 0; - - if (bo->bo.type == DRM_DOVE_BO_DUMB) { - struct drm_mode_map_dumb arg; - - memset(&arg, 0, sizeof(arg)); - arg.handle = bo->bo.handle; - - ret = drmIoctl(fd, DRM_IOCTL_MODE_MAP_DUMB, &arg); - if (ret) - return ret; - - map = mmap(0, bo->alloc_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, - arg.offset); - - if (map == MAP_FAILED) - return -1; - } else if (bo->bo.type == DRM_DOVE_BO_SHMEM) { - struct drm_dove_gem_mmap arg; - - memset(&arg, 0, sizeof(arg)); - arg.handle = bo->bo.handle; - arg.offset = 0; - arg.size = bo->alloc_size; - - ret = drmIoctl(fd, DRM_IOCTL_DOVE_GEM_MMAP, &arg); - if (ret) - return -1; - - map = (void *)(uintptr_t)arg.addr; - } else { - errno = EINVAL; - return -1; - } - - bo->bo.ptr = map; - - return 0; -} - -uint32_t drm_dove_bo_phys(struct drm_dove_bo *dbo) -{ - struct dove_bo *bo = to_dove_bo(dbo); - struct drm_dove_gem_prop arg; - int ret, fd = bo->mgr->fd; - - memset(&arg, 0, sizeof(arg)); - arg.handle = bo->bo.handle; - - ret = drmIoctl(fd, DRM_IOCTL_DOVE_GEM_PROP, &arg); - - return ret ? -1 : (uint32_t)arg.phys; -} - -int drm_dove_bo_subdata(struct drm_dove_bo *dbo, unsigned long offset, - unsigned long size, const void *data) -{ - struct dove_bo *bo = to_dove_bo(dbo); - struct drm_dove_gem_pwrite arg; - int fd = bo->mgr->fd; - - memset(&arg, 0, sizeof(arg)); - arg.handle = bo->bo.handle; - arg.offset = offset; - arg.size = size; - arg.ptr = (uint64_t)(uintptr_t)data; - - return drmIoctl(fd, DRM_IOCTL_DOVE_GEM_PWRITE, &arg); -} - -int drm_dove_init(int fd, struct drm_dove_bufmgr **mgrp) -{ - struct drm_dove_bufmgr *mgr; - - mgr = calloc(1, sizeof(*mgr)); - if (!mgr) - return -1; - - dove_bo_cache_init(&mgr->cache); - mgr->fd = fd; - *mgrp = mgr; - - return 0; -} - -void drm_dove_fini(struct drm_dove_bufmgr *mgr) -{ - dove_bo_cache_fini(&mgr->cache); - free(mgr); -} diff --git a/dove_bufmgr.h b/dove_bufmgr.h deleted file mode 100644 index 18fae64..0000000 --- a/dove_bufmgr.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef DRM_DOVE_GEM_H -#define DRM_DOVE_GEM_H - -enum drm_dove_bo_type { - DRM_DOVE_BO_DUMB, - DRM_DOVE_BO_LINEAR, - DRM_DOVE_BO_SHMEM -}; - -struct drm_dove_bufmgr; - -struct drm_dove_bo { - uint32_t ref; - uint32_t handle; - uint32_t size; - uint32_t pitch; - uint32_t phys; - void *ptr; - enum drm_dove_bo_type type; -}; - -int drm_dove_init(int fd, struct drm_dove_bufmgr **mgr); -void drm_dove_fini(struct drm_dove_bufmgr *); - -struct drm_dove_bo *drm_dove_bo_create(struct drm_dove_bufmgr *, - unsigned w, unsigned h, unsigned bpp); -struct drm_dove_bo *drm_dove_bo_create_phys(struct drm_dove_bufmgr *, - uint32_t phys, size_t size); -struct drm_dove_bo *drm_dove_bo_dumb_create(struct drm_dove_bufmgr *, - unsigned w, unsigned h, unsigned bpp); - -/* Create a BO from a global name */ -struct drm_dove_bo *drm_dove_bo_create_from_name(struct drm_dove_bufmgr *, - uint32_t name); - -/* Create a global name from a BO */ -int drm_dove_bo_flink(struct drm_dove_bo *bo, uint32_t *name); - -int drm_dove_bo_map(struct drm_dove_bo *bo); -uint32_t drm_dove_bo_phys(struct drm_dove_bo *bo); -void drm_dove_bo_get(struct drm_dove_bo *bo); -void drm_dove_bo_put(struct drm_dove_bo *bo); -int drm_dove_bo_subdata(struct drm_dove_bo *bo, unsigned long offset, - unsigned long size, const void *data); - -#endif diff --git a/dove_ioctl.h b/dove_ioctl.h deleted file mode 100644 index 51997c2..0000000 --- a/dove_ioctl.h +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright (C) 2012 Russell King - * With inspiration from the i915 driver - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ -#ifndef DRM_DOVE_IOCTL_H -#define DRM_DOVE_IOCTL_H - -#define DRM_DOVE_GEM_CREATE 0x00 -#define DRM_DOVE_GEM_CREATE_PHYS 0x01 -#define DRM_DOVE_GEM_MMAP 0x02 -#define DRM_DOVE_GEM_PWRITE 0x03 -#define DRM_DOVE_GEM_PROP 0x04 -#define DRM_DOVE_GEM_CACHE 0x05 -#define DRM_DOVE_OVERLAY_PUT_IMAGE 0x06 -#define DRM_DOVE_OVERLAY_ATTRS 0x07 - -#define DOVE_IOCTL(dir,name,str) \ - DRM_##dir(DRM_COMMAND_BASE + DRM_DOVE_##name, struct drm_dove_##str) - -struct drm_dove_gem_create { - uint32_t height; - uint32_t width; - uint32_t bpp; - uint32_t handle; - uint32_t pitch; - uint32_t size; -}; -#define DRM_IOCTL_DOVE_GEM_CREATE \ - DOVE_IOCTL(IOWR, GEM_CREATE, gem_create) - -struct drm_dove_gem_create_phys { - uint32_t size; - uint32_t handle; - uint64_t phys; -}; -#define DRM_IOCTL_DOVE_GEM_CREATE_PHYS \ - DOVE_IOCTL(IOWR, GEM_CREATE_PHYS, gem_create_phys) - -struct drm_dove_gem_mmap { - uint32_t handle; - uint32_t pad; - uint64_t offset; - uint64_t size; - uint64_t addr; -}; -#define DRM_IOCTL_DOVE_GEM_MMAP \ - DOVE_IOCTL(IOWR, GEM_MMAP, gem_mmap) - -struct drm_dove_gem_pwrite { - uint32_t handle; - uint32_t offset; - uint32_t size; - uint64_t ptr; -}; -#define DRM_IOCTL_DOVE_GEM_PWRITE \ - DOVE_IOCTL(IOW, GEM_PWRITE, gem_pwrite) - -struct drm_dove_gem_prop { - uint64_t phys; - uint32_t handle; -}; -#define DRM_IOCTL_DOVE_GEM_PROP \ - DOVE_IOCTL(IOWR, GEM_PROP, gem_prop) - -struct drm_dove_gem_cache { - uint64_t ptr; - uint32_t handle; - uint32_t size; - uint32_t op; -}; -#define DRM_IOCTL_DOVE_GEM_CACHE \ - DOVE_IOCTL(IOW, GEM_CACHE, gem_cache) - -/* Same as Intel I915 */ -struct drm_dove_overlay_put_image { - uint32_t flags; -#define DOVE_OVERLAY_TYPE_MASK 0x000000ff -#define DOVE_OVERLAY_YUV_PLANAR 0x00000001 -#define DOVE_OVERLAY_YUV_PACKED 0x00000002 -#define DOVE_OVERLAY_RGB 0x00000003 -#define DOVE_OVERLAY_DEPTH_MASK 0x0000ff00 -#define DOVE_OVERLAY_RGB24 0x00001000 -#define DOVE_OVERLAY_RGB16 0x00002000 -#define DOVE_OVERLAY_RGB15 0x00003000 -#define DOVE_OVERLAY_YUV422 0x00000100 -#define DOVE_OVERLAY_YUV411 0x00000200 -#define DOVE_OVERLAY_YUV420 0x00000300 -#define DOVE_OVERLAY_YUV410 0x00000400 -#define DOVE_OVERLAY_SWAP_MASK 0x00ff0000 -#define DOVE_OVERLAY_NO_SWAP 0x00000000 -#define DOVE_OVERLAY_UV_SWAP 0x00010000 -#define DOVE_OVERLAY_Y_SWAP 0x00020000 -#define DOVE_OVERLAY_Y_AND_UV_SWAP 0x00030000 -#define DOVE_OVERLAY_FLAGS_MASK 0xff000000 -#define DOVE_OVERLAY_ENABLE 0x01000000 - uint32_t bo_handle; - uint16_t stride_Y; - uint16_t stride_UV; - uint32_t offset_Y; - uint32_t offset_U; - uint32_t offset_V; - uint16_t src_width; - uint16_t src_height; - uint16_t src_scan_width; - uint16_t src_scan_height; - uint32_t crtc_id; - uint16_t dst_x; - uint16_t dst_y; - uint16_t dst_width; - uint16_t dst_height; -}; -#define DRM_IOCTL_DOVE_OVERLAY_PUT_IMAGE \ - DOVE_IOCTL(IOW, OVERLAY_PUT_IMAGE, overlay_put_image) - -/* Same as Intel I915 */ -struct drm_dove_overlay_attrs { - uint32_t flags; -#define DOVE_OVERLAY_UPDATE_ATTRS (1<<0) -#define DOVE_OVERLAY_UPDATE_GAMMA (1<<1) - uint32_t color_key; - int32_t brightness; - uint32_t contrast; - uint32_t saturation; - uint32_t gamma0; - uint32_t gamma1; - uint32_t gamma2; - uint32_t gamma3; - uint32_t gamma4; - uint32_t gamma5; -}; -#define DRM_IOCTL_DOVE_OVERLAY_ATTRS \ - DOVE_IOCTL(IOWR, OVERLAY_ATTRS, overlay_attrs) - -#endif diff --git a/libdrm_armada.pc.in b/libdrm_armada.pc.in new file mode 100644 index 0000000..8a3af77 --- /dev/null +++ b/libdrm_armada.pc.in @@ -0,0 +1,11 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: libdrm_armada +Description: Userspace interface to kernel DRM services +Version: @PACKAGE_VERSION@ +Requires: libdrm +Libs: -L${libdir} -ldrm_armada +Cflags: -I${includedir}/libdrm diff --git a/libdrm_dove.pc.in b/libdrm_dove.pc.in deleted file mode 100644 index 80ad07a..0000000 --- a/libdrm_dove.pc.in +++ /dev/null @@ -1,11 +0,0 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ - -Name: libdrm_dove -Description: Userspace interface to kerenl DRM services -Version: @PACKAGE_VERSION@ -Requires: libdrm -Libs: -L${libdir} -ldrm_dove -Cflags: -I${includedir}/libdrm -- cgit