drm/tegra: Add SET/GET_FLAGS IOCTLs
authorThierry Reding <treding@nvidia.com>
Tue, 10 Jun 2014 10:04:03 +0000 (12:04 +0200)
committerThierry Reding <treding@nvidia.com>
Mon, 4 Aug 2014 08:07:35 +0000 (10:07 +0200)
The DRM_TEGRA_GEM_SET_FLAGS IOCTL can be used to set the flags of a
buffer object after it has been allocated or imported. Flags associated
with a buffer object can be queried using the DRM_TEGRA_GEM_GET_FLAGS
IOCTL.

Reviewed-by: Stéphane Marchesin <marcheu@chromium.org>
Tested-by: Alexandre Courbot <acourbot@nvidia.com>
Signed-off-by: Thierry Reding <treding@nvidia.com>
drivers/gpu/drm/tegra/drm.c
include/uapi/drm/tegra_drm.h

index a029525b598f2a5e8c09155985ec12d93c7f70a5..6e2e714a06491b31f0c612fbfd5a6d9abe08ab20 100644 (file)
@@ -548,6 +548,53 @@ static int tegra_gem_get_tiling(struct drm_device *drm, void *data,
 
        return err;
 }
+
+static int tegra_gem_set_flags(struct drm_device *drm, void *data,
+                              struct drm_file *file)
+{
+       struct drm_tegra_gem_set_flags *args = data;
+       struct drm_gem_object *gem;
+       struct tegra_bo *bo;
+
+       if (args->flags & ~DRM_TEGRA_GEM_FLAGS)
+               return -EINVAL;
+
+       gem = drm_gem_object_lookup(drm, file, args->handle);
+       if (!gem)
+               return -ENOENT;
+
+       bo = to_tegra_bo(gem);
+       bo->flags = 0;
+
+       if (args->flags & DRM_TEGRA_GEM_BOTTOM_UP)
+               bo->flags |= TEGRA_BO_BOTTOM_UP;
+
+       drm_gem_object_unreference(gem);
+
+       return 0;
+}
+
+static int tegra_gem_get_flags(struct drm_device *drm, void *data,
+                              struct drm_file *file)
+{
+       struct drm_tegra_gem_get_flags *args = data;
+       struct drm_gem_object *gem;
+       struct tegra_bo *bo;
+
+       gem = drm_gem_object_lookup(drm, file, args->handle);
+       if (!gem)
+               return -ENOENT;
+
+       bo = to_tegra_bo(gem);
+       args->flags = 0;
+
+       if (bo->flags & TEGRA_BO_BOTTOM_UP)
+               args->flags |= DRM_TEGRA_GEM_BOTTOM_UP;
+
+       drm_gem_object_unreference(gem);
+
+       return 0;
+}
 #endif
 
 static const struct drm_ioctl_desc tegra_drm_ioctls[] = {
@@ -564,6 +611,8 @@ static const struct drm_ioctl_desc tegra_drm_ioctls[] = {
        DRM_IOCTL_DEF_DRV(TEGRA_GET_SYNCPT_BASE, tegra_get_syncpt_base, DRM_UNLOCKED),
        DRM_IOCTL_DEF_DRV(TEGRA_GEM_SET_TILING, tegra_gem_set_tiling, DRM_UNLOCKED),
        DRM_IOCTL_DEF_DRV(TEGRA_GEM_GET_TILING, tegra_gem_get_tiling, DRM_UNLOCKED),
+       DRM_IOCTL_DEF_DRV(TEGRA_GEM_SET_FLAGS, tegra_gem_set_flags, DRM_UNLOCKED),
+       DRM_IOCTL_DEF_DRV(TEGRA_GEM_GET_FLAGS, tegra_gem_get_flags, DRM_UNLOCKED),
 #endif
 };
 
index 0829f75eb9869f28bd23832c2bf1f8c03782e150..c15d781ecc0f306ce5fd575192f547b8e756273f 100644 (file)
@@ -150,6 +150,23 @@ struct drm_tegra_gem_get_tiling {
        __u32 pad;
 };
 
+#define DRM_TEGRA_GEM_BOTTOM_UP                (1 << 0)
+#define DRM_TEGRA_GEM_FLAGS            (DRM_TEGRA_GEM_BOTTOM_UP)
+
+struct drm_tegra_gem_set_flags {
+       /* input */
+       __u32 handle;
+       /* output */
+       __u32 flags;
+};
+
+struct drm_tegra_gem_get_flags {
+       /* input */
+       __u32 handle;
+       /* output */
+       __u32 flags;
+};
+
 #define DRM_TEGRA_GEM_CREATE           0x00
 #define DRM_TEGRA_GEM_MMAP             0x01
 #define DRM_TEGRA_SYNCPT_READ          0x02
@@ -162,6 +179,8 @@ struct drm_tegra_gem_get_tiling {
 #define DRM_TEGRA_GET_SYNCPT_BASE      0x09
 #define DRM_TEGRA_GEM_SET_TILING       0x0a
 #define DRM_TEGRA_GEM_GET_TILING       0x0b
+#define DRM_TEGRA_GEM_SET_FLAGS                0x0c
+#define DRM_TEGRA_GEM_GET_FLAGS                0x0d
 
 #define DRM_IOCTL_TEGRA_GEM_CREATE DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_CREATE, struct drm_tegra_gem_create)
 #define DRM_IOCTL_TEGRA_GEM_MMAP DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_MMAP, struct drm_tegra_gem_mmap)
@@ -175,5 +194,7 @@ struct drm_tegra_gem_get_tiling {
 #define DRM_IOCTL_TEGRA_GET_SYNCPT_BASE DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GET_SYNCPT_BASE, struct drm_tegra_get_syncpt_base)
 #define DRM_IOCTL_TEGRA_GEM_SET_TILING DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_SET_TILING, struct drm_tegra_gem_set_tiling)
 #define DRM_IOCTL_TEGRA_GEM_GET_TILING DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_GET_TILING, struct drm_tegra_gem_get_tiling)
+#define DRM_IOCTL_TEGRA_GEM_SET_FLAGS DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_SET_FLAGS, struct drm_tegra_gem_set_flags)
+#define DRM_IOCTL_TEGRA_GEM_GET_FLAGS DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_GET_FLAGS, struct drm_tegra_gem_get_flags)
 
 #endif