diff mbox

[RESEND] tests/kmstest: support exynos

Message ID CAF6AEGu9tnJtmaY5S=yrG0i6908TDa4j83ZudAEJhmCPq_msNA@mail.gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Rob Clark Jan. 12, 2014, 1:25 p.m. UTC
On Fri, Jan 10, 2014 at 2:44 AM, Hyungwon Hwang <human.hwang@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:

----------

BR,
-R


> Signed-off-by: Hyungwon Hwang <human.hwang@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@samsung.com>
> + *      Sangjin LEE <lsj119@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@samsung.com
diff mbox

Patch

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
 ----------