[PATCH RESEND] tests/kmstest: support exynos
Rob Clark
robdclark at gmail.com
Sun Jan 12 05:25:01 PST 2014
On Fri, Jan 10, 2014 at 2:44 AM, Hyungwon Hwang <human.hwang at samsung.com> wrote:
>
> In this patch, to support exynos for KMS, Exynos KMS driver is newly added.
> Also, Exynos is added to the list of kmstest supported modules.
ok, I've applied this after some minor surgery on the patch which
seems to have somehow gotten line-wrapped after the patch was created?
I dunno, but somehow seems to be on your end, I was using 'pwclient
git-am' to apply the patch directly from patchwork.
I also had to add this hunk to get it to build:
----------
diff --git a/libkms/Makefile.am b/libkms/Makefile.am
index 215450a..449a73b 100644
--- a/libkms/Makefile.am
+++ b/libkms/Makefile.am
@@ -31,6 +31,11 @@ if HAVE_RADEON
libkms_la_SOURCES += radeon.c
endif
+if HAVE_EXYNOS
+libkms_la_SOURCES += exynos.c
+AM_CFLAGS += -I$(top_srcdir)/exynos
+endif
+
libkmsincludedir = ${includedir}/libkms
libkmsinclude_HEADERS = libkms.h
----------
BR,
-R
> Signed-off-by: Hyungwon Hwang <human.hwang at samsung.com>
> ---
> libkms/exynos.c | 207 ++++++++++++++++++++++++++++++++++++++++++++++++++
> libkms/internal.h | 2 +
> libkms/linux.c | 4 +
> tests/kmstest/main.c | 1 +
> 4 files changed, 214 insertions(+)
> create mode 100644 libkms/exynos.c
>
> diff --git a/libkms/exynos.c b/libkms/exynos.c
> new file mode 100644
> index 0000000..93e36a1
> --- /dev/null
> +++ b/libkms/exynos.c
> @@ -0,0 +1,207 @@
> +/* exynos.c
> + *
> + * Copyright 2009 Samsung Electronics Co., Ltd.
> + * Authors:
> + * SooChan Lim <sc1.lim at samsung.com>
> + * Sangjin LEE <lsj119 at samsung.com>
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License as published by the
> + * Free Software Foundation; either version 2 of the License, or (at your
> + * option) any later version.
> + */
> +
> +#define HAVE_STDINT_H
> +#define _FILE_OFFSET_BITS 64
> +
> +#include <errno.h>
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include "internal.h"
> +
> +#include <sys/mman.h>
> +#include <sys/ioctl.h>
> +#include "xf86drm.h"
> +
> +#include "exynos_drm.h"
> +
> +struct exynos_bo
> +{
> + struct kms_bo base;
> + unsigned map_count;
> +};
> +
> +static int
> +exynos_get_prop(struct kms_driver *kms, unsigned key, unsigned *out)
> +{
> + switch (key) {
> + case KMS_BO_TYPE:
> + *out = KMS_BO_TYPE_SCANOUT_X8R8G8B8 |
> KMS_BO_TYPE_CURSOR_64X64_A8R8G8B8;
> + break;
> + default:
> + return -EINVAL;
> + }
> + return 0;
> +}
> +
> +static int
> +exynos_destroy(struct kms_driver *kms)
> +{
> + free(kms);
> + return 0;
> +}
> +
> +static int
> +exynos_bo_create(struct kms_driver *kms,
> + const unsigned width, const unsigned height,
> + const enum kms_bo_type type, const unsigned *attr,
> + struct kms_bo **out)
> +{
> + struct drm_exynos_gem_create arg;
> + unsigned size, pitch;
> + struct exynos_bo *bo;
> + int i, ret;
> +
> + for (i = 0; attr[i]; i += 2) {
> + switch (attr[i]) {
> + case KMS_WIDTH:
> + case KMS_HEIGHT:
> + case KMS_BO_TYPE:
> + break;
> + default:
> + return -EINVAL;
> + }
> + }
> +
> + bo = calloc(1, sizeof(*bo));
> + if (!bo)
> + return -ENOMEM;
> +
> + if (type == KMS_BO_TYPE_CURSOR_64X64_A8R8G8B8) {
> + pitch = 64 * 4;
> + size = 64 * 64 * 4;
> + } else if (type == KMS_BO_TYPE_SCANOUT_X8R8G8B8) {
> + pitch = width * 4;
> + pitch = (pitch + 512 - 1) & ~(512 - 1);
> + size = pitch * ((height + 4 - 1) & ~(4 - 1));
> + } else {
> + return -EINVAL;
> + }
> +
> + memset(&arg, 0, sizeof(arg));
> + arg.size = size;
> +
> + ret = drmCommandWriteRead(kms->fd, DRM_EXYNOS_GEM_CREATE, &arg,
> sizeof(arg));
> + if (ret)
> + goto err_free;
> +
> + bo->base.kms = kms;
> + bo->base.handle = arg.handle;
> + bo->base.size = size;
> + bo->base.pitch = pitch;
> +
> + *out = &bo->base;
> +
> + return 0;
> +
> +err_free:
> + free(bo);
> + return ret;
> +}
> +
> +static int
> +exynos_bo_get_prop(struct kms_bo *bo, unsigned key, unsigned *out)
> +{
> + switch (key) {
> + default:
> + return -EINVAL;
> + }
> +}
> +
> +static int
> +exynos_bo_map(struct kms_bo *_bo, void **out)
> +{
> + struct exynos_bo *bo = (struct exynos_bo *)_bo;
> + struct drm_exynos_gem_map_off arg;
> + void *map = NULL;
> + int ret;
> +
> + if (bo->base.ptr) {
> + bo->map_count++;
> + *out = bo->base.ptr;
> + return 0;
> + }
> +
> + memset(&arg, 0, sizeof(arg));
> + arg.handle = bo->base.handle;
> +
> + ret = drmCommandWriteRead(bo->base.kms->fd, DRM_EXYNOS_GEM_MAP_OFFSET,
> &arg, sizeof(arg));
> + if (ret)
> + return ret;
> +
> + map = mmap(0, bo->base.size, PROT_READ | PROT_WRITE, MAP_SHARED,
> bo->base.kms->fd, arg.offset);
> + if (map == MAP_FAILED)
> + return -errno;
> +
> + bo->base.ptr = map;
> + bo->map_count++;
> + *out = bo->base.ptr;
> +
> + return 0;
> +}
> +
> +static int
> +exynos_bo_unmap(struct kms_bo *_bo)
> +{
> + struct exynos_bo *bo = (struct exynos_bo *)_bo;
> + bo->map_count--;
> + return 0;
> +}
> +
> +static int
> +exynos_bo_destroy(struct kms_bo *_bo)
> +{
> + struct exynos_bo *bo = (struct exynos_bo *)_bo;
> + struct drm_gem_close arg;
> + int ret;
> +
> + if (bo->base.ptr) {
> + /* XXX Sanity check map_count */
> + munmap(bo->base.ptr, bo->base.size);
> + bo->base.ptr = NULL;
> + }
> +
> + memset(&arg, 0, sizeof(arg));
> + arg.handle = bo->base.handle;
> +
> + ret = drmIoctl(bo->base.kms->fd, DRM_IOCTL_GEM_CLOSE, &arg);
> + if (ret)
> + return -errno;
> +
> + free(bo);
> + return 0;
> +}
> +
> +int
> +exynos_create(int fd, struct kms_driver **out)
> +{
> + struct kms_driver *kms;
> +
> + kms = calloc(1, sizeof(*kms));
> + if (!kms)
> + return -ENOMEM;
> +
> + kms->fd = fd;
> +
> + kms->bo_create = exynos_bo_create;
> + kms->bo_map = exynos_bo_map;
> + kms->bo_unmap = exynos_bo_unmap;
> + kms->bo_get_prop = exynos_bo_get_prop;
> + kms->bo_destroy = exynos_bo_destroy;
> + kms->get_prop = exynos_get_prop;
> + kms->destroy = exynos_destroy;
> + *out = kms;
> +
> + return 0;
> +}
> diff --git a/libkms/internal.h b/libkms/internal.h
> index 5e2501e..f831b57 100644
> --- a/libkms/internal.h
> +++ b/libkms/internal.h
> @@ -74,4 +74,6 @@ int nouveau_create(int fd, struct kms_driver **out);
>
> int radeon_create(int fd, struct kms_driver **out);
>
> +int exynos_create(int fd, struct kms_driver **out);
> +
> #endif
> diff --git a/libkms/linux.c b/libkms/linux.c
> index eec0162..9b4f29e 100644
> --- a/libkms/linux.c
> +++ b/libkms/linux.c
> @@ -115,6 +115,10 @@ linux_from_sysfs(int fd, struct kms_driver **out)
> else if (!strcmp(name, "radeon"))
> ret = radeon_create(fd, out);
> #endif
> +#ifdef HAVE_EXYNOS
> + else if (!strcmp(name, "exynos"))
> + ret = exynos_create(fd, out);
> +#endif
> else
> ret = -ENOSYS;
>
> diff --git a/tests/kmstest/main.c b/tests/kmstest/main.c
> index 5df0a38..449d75f 100644
> --- a/tests/kmstest/main.c
> +++ b/tests/kmstest/main.c
> @@ -61,6 +61,7 @@ char *drivers[] = {
> "radeon",
> "nouveau",
> "vmwgfx",
> + "exynos",
> NULL
> };
>
> --
> 1.7.10.4
>
>
> Best regards,
> Hyungwon Hwang
>
> --
> Hyungwon Hwang
> S/W Platform Team, Software Center
> Samsung Electronics.
> human.hwang at samsung.com
More information about the dri-devel
mailing list