diff options
author | Thierry Reding <treding@nvidia.com> | 2014-06-10 06:04:03 -0400 |
---|---|---|
committer | Thierry Reding <treding@nvidia.com> | 2014-08-04 04:07:35 -0400 |
commit | 7b129087874b925901def7ae507f7d9fac406211 (patch) | |
tree | 1740140bbf2220e31a32379da8e50e51b530fb3c | |
parent | 7678d71fb4bd6abe6ccb46afe7d90b3ed01ee936 (diff) |
drm/tegra: Add SET/GET_FLAGS IOCTLs
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>
-rw-r--r-- | drivers/gpu/drm/tegra/drm.c | 49 | ||||
-rw-r--r-- | include/uapi/drm/tegra_drm.h | 21 |
2 files changed, 70 insertions, 0 deletions
diff --git a/drivers/gpu/drm/tegra/drm.c b/drivers/gpu/drm/tegra/drm.c index a029525b598f..6e2e714a0649 100644 --- a/drivers/gpu/drm/tegra/drm.c +++ b/drivers/gpu/drm/tegra/drm.c | |||
@@ -548,6 +548,53 @@ static int tegra_gem_get_tiling(struct drm_device *drm, void *data, | |||
548 | 548 | ||
549 | return err; | 549 | return err; |
550 | } | 550 | } |
551 | |||
552 | static int tegra_gem_set_flags(struct drm_device *drm, void *data, | ||
553 | struct drm_file *file) | ||
554 | { | ||
555 | struct drm_tegra_gem_set_flags *args = data; | ||
556 | struct drm_gem_object *gem; | ||
557 | struct tegra_bo *bo; | ||
558 | |||
559 | if (args->flags & ~DRM_TEGRA_GEM_FLAGS) | ||
560 | return -EINVAL; | ||
561 | |||
562 | gem = drm_gem_object_lookup(drm, file, args->handle); | ||
563 | if (!gem) | ||
564 | return -ENOENT; | ||
565 | |||
566 | bo = to_tegra_bo(gem); | ||
567 | bo->flags = 0; | ||
568 | |||
569 | if (args->flags & DRM_TEGRA_GEM_BOTTOM_UP) | ||
570 | bo->flags |= TEGRA_BO_BOTTOM_UP; | ||
571 | |||
572 | drm_gem_object_unreference(gem); | ||
573 | |||
574 | return 0; | ||
575 | } | ||
576 | |||
577 | static int tegra_gem_get_flags(struct drm_device *drm, void *data, | ||
578 | struct drm_file *file) | ||
579 | { | ||
580 | struct drm_tegra_gem_get_flags *args = data; | ||
581 | struct drm_gem_object *gem; | ||
582 | struct tegra_bo *bo; | ||
583 | |||
584 | gem = drm_gem_object_lookup(drm, file, args->handle); | ||
585 | if (!gem) | ||
586 | return -ENOENT; | ||
587 | |||
588 | bo = to_tegra_bo(gem); | ||
589 | args->flags = 0; | ||
590 | |||
591 | if (bo->flags & TEGRA_BO_BOTTOM_UP) | ||
592 | args->flags |= DRM_TEGRA_GEM_BOTTOM_UP; | ||
593 | |||
594 | drm_gem_object_unreference(gem); | ||
595 | |||
596 | return 0; | ||
597 | } | ||
551 | #endif | 598 | #endif |
552 | 599 | ||
553 | static const struct drm_ioctl_desc tegra_drm_ioctls[] = { | 600 | static const struct drm_ioctl_desc tegra_drm_ioctls[] = { |
@@ -564,6 +611,8 @@ static const struct drm_ioctl_desc tegra_drm_ioctls[] = { | |||
564 | DRM_IOCTL_DEF_DRV(TEGRA_GET_SYNCPT_BASE, tegra_get_syncpt_base, DRM_UNLOCKED), | 611 | DRM_IOCTL_DEF_DRV(TEGRA_GET_SYNCPT_BASE, tegra_get_syncpt_base, DRM_UNLOCKED), |
565 | DRM_IOCTL_DEF_DRV(TEGRA_GEM_SET_TILING, tegra_gem_set_tiling, DRM_UNLOCKED), | 612 | DRM_IOCTL_DEF_DRV(TEGRA_GEM_SET_TILING, tegra_gem_set_tiling, DRM_UNLOCKED), |
566 | DRM_IOCTL_DEF_DRV(TEGRA_GEM_GET_TILING, tegra_gem_get_tiling, DRM_UNLOCKED), | 613 | DRM_IOCTL_DEF_DRV(TEGRA_GEM_GET_TILING, tegra_gem_get_tiling, DRM_UNLOCKED), |
614 | DRM_IOCTL_DEF_DRV(TEGRA_GEM_SET_FLAGS, tegra_gem_set_flags, DRM_UNLOCKED), | ||
615 | DRM_IOCTL_DEF_DRV(TEGRA_GEM_GET_FLAGS, tegra_gem_get_flags, DRM_UNLOCKED), | ||
567 | #endif | 616 | #endif |
568 | }; | 617 | }; |
569 | 618 | ||
diff --git a/include/uapi/drm/tegra_drm.h b/include/uapi/drm/tegra_drm.h index 0829f75eb986..c15d781ecc0f 100644 --- a/include/uapi/drm/tegra_drm.h +++ b/include/uapi/drm/tegra_drm.h | |||
@@ -150,6 +150,23 @@ struct drm_tegra_gem_get_tiling { | |||
150 | __u32 pad; | 150 | __u32 pad; |
151 | }; | 151 | }; |
152 | 152 | ||
153 | #define DRM_TEGRA_GEM_BOTTOM_UP (1 << 0) | ||
154 | #define DRM_TEGRA_GEM_FLAGS (DRM_TEGRA_GEM_BOTTOM_UP) | ||
155 | |||
156 | struct drm_tegra_gem_set_flags { | ||
157 | /* input */ | ||
158 | __u32 handle; | ||
159 | /* output */ | ||
160 | __u32 flags; | ||
161 | }; | ||
162 | |||
163 | struct drm_tegra_gem_get_flags { | ||
164 | /* input */ | ||
165 | __u32 handle; | ||
166 | /* output */ | ||
167 | __u32 flags; | ||
168 | }; | ||
169 | |||
153 | #define DRM_TEGRA_GEM_CREATE 0x00 | 170 | #define DRM_TEGRA_GEM_CREATE 0x00 |
154 | #define DRM_TEGRA_GEM_MMAP 0x01 | 171 | #define DRM_TEGRA_GEM_MMAP 0x01 |
155 | #define DRM_TEGRA_SYNCPT_READ 0x02 | 172 | #define DRM_TEGRA_SYNCPT_READ 0x02 |
@@ -162,6 +179,8 @@ struct drm_tegra_gem_get_tiling { | |||
162 | #define DRM_TEGRA_GET_SYNCPT_BASE 0x09 | 179 | #define DRM_TEGRA_GET_SYNCPT_BASE 0x09 |
163 | #define DRM_TEGRA_GEM_SET_TILING 0x0a | 180 | #define DRM_TEGRA_GEM_SET_TILING 0x0a |
164 | #define DRM_TEGRA_GEM_GET_TILING 0x0b | 181 | #define DRM_TEGRA_GEM_GET_TILING 0x0b |
182 | #define DRM_TEGRA_GEM_SET_FLAGS 0x0c | ||
183 | #define DRM_TEGRA_GEM_GET_FLAGS 0x0d | ||
165 | 184 | ||
166 | #define DRM_IOCTL_TEGRA_GEM_CREATE DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_CREATE, struct drm_tegra_gem_create) | 185 | #define DRM_IOCTL_TEGRA_GEM_CREATE DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_CREATE, struct drm_tegra_gem_create) |
167 | #define DRM_IOCTL_TEGRA_GEM_MMAP DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_MMAP, struct drm_tegra_gem_mmap) | 186 | #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 { | |||
175 | #define DRM_IOCTL_TEGRA_GET_SYNCPT_BASE DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GET_SYNCPT_BASE, struct drm_tegra_get_syncpt_base) | 194 | #define DRM_IOCTL_TEGRA_GET_SYNCPT_BASE DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GET_SYNCPT_BASE, struct drm_tegra_get_syncpt_base) |
176 | #define DRM_IOCTL_TEGRA_GEM_SET_TILING DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_SET_TILING, struct drm_tegra_gem_set_tiling) | 195 | #define DRM_IOCTL_TEGRA_GEM_SET_TILING DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_SET_TILING, struct drm_tegra_gem_set_tiling) |
177 | #define DRM_IOCTL_TEGRA_GEM_GET_TILING DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_GET_TILING, struct drm_tegra_gem_get_tiling) | 196 | #define DRM_IOCTL_TEGRA_GEM_GET_TILING DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_GET_TILING, struct drm_tegra_gem_get_tiling) |
197 | #define DRM_IOCTL_TEGRA_GEM_SET_FLAGS DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_SET_FLAGS, struct drm_tegra_gem_set_flags) | ||
198 | #define DRM_IOCTL_TEGRA_GEM_GET_FLAGS DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_GET_FLAGS, struct drm_tegra_gem_get_flags) | ||
178 | 199 | ||
179 | #endif | 200 | #endif |