On Fri, Jan 10, 2014 at 2:44 AM, Hyungwon Hwang <human.hwang@xxxxxxxxxxx> 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@xxxxxxxxxxx> > --- > 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@xxxxxxxxxxx> > + * Sangjin LEE <lsj119@xxxxxxxxxxx> > + * > + * 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@xxxxxxxxxxx _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel