aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/tegra/drm.c95
-rw-r--r--include/uapi/drm/tegra_drm.h25
2 files changed, 120 insertions, 0 deletions
diff --git a/drivers/gpu/drm/tegra/drm.c b/drivers/gpu/drm/tegra/drm.c
index fd736efd14bd..a029525b598f 100644
--- a/drivers/gpu/drm/tegra/drm.c
+++ b/drivers/gpu/drm/tegra/drm.c
@@ -455,6 +455,99 @@ static int tegra_get_syncpt_base(struct drm_device *drm, void *data,
455 455
456 return 0; 456 return 0;
457} 457}
458
459static int tegra_gem_set_tiling(struct drm_device *drm, void *data,
460 struct drm_file *file)
461{
462 struct drm_tegra_gem_set_tiling *args = data;
463 enum tegra_bo_tiling_mode mode;
464 struct drm_gem_object *gem;
465 unsigned long value = 0;
466 struct tegra_bo *bo;
467
468 switch (args->mode) {
469 case DRM_TEGRA_GEM_TILING_MODE_PITCH:
470 mode = TEGRA_BO_TILING_MODE_PITCH;
471
472 if (args->value != 0)
473 return -EINVAL;
474
475 break;
476
477 case DRM_TEGRA_GEM_TILING_MODE_TILED:
478 mode = TEGRA_BO_TILING_MODE_TILED;
479
480 if (args->value != 0)
481 return -EINVAL;
482
483 break;
484
485 case DRM_TEGRA_GEM_TILING_MODE_BLOCK:
486 mode = TEGRA_BO_TILING_MODE_BLOCK;
487
488 if (args->value > 5)
489 return -EINVAL;
490
491 value = args->value;
492 break;
493
494 default:
495 return -EINVAL;
496 }
497
498 gem = drm_gem_object_lookup(drm, file, args->handle);
499 if (!gem)
500 return -ENOENT;
501
502 bo = to_tegra_bo(gem);
503
504 bo->tiling.mode = mode;
505 bo->tiling.value = value;
506
507 drm_gem_object_unreference(gem);
508
509 return 0;
510}
511
512static int tegra_gem_get_tiling(struct drm_device *drm, void *data,
513 struct drm_file *file)
514{
515 struct drm_tegra_gem_get_tiling *args = data;
516 struct drm_gem_object *gem;
517 struct tegra_bo *bo;
518 int err = 0;
519
520 gem = drm_gem_object_lookup(drm, file, args->handle);
521 if (!gem)
522 return -ENOENT;
523
524 bo = to_tegra_bo(gem);
525
526 switch (bo->tiling.mode) {
527 case TEGRA_BO_TILING_MODE_PITCH:
528 args->mode = DRM_TEGRA_GEM_TILING_MODE_PITCH;
529 args->value = 0;
530 break;
531
532 case TEGRA_BO_TILING_MODE_TILED:
533 args->mode = DRM_TEGRA_GEM_TILING_MODE_TILED;
534 args->value = 0;
535 break;
536
537 case TEGRA_BO_TILING_MODE_BLOCK:
538 args->mode = DRM_TEGRA_GEM_TILING_MODE_BLOCK;
539 args->value = bo->tiling.value;
540 break;
541
542 default:
543 err = -EINVAL;
544 break;
545 }
546
547 drm_gem_object_unreference(gem);
548
549 return err;
550}
458#endif 551#endif
459 552
460static const struct drm_ioctl_desc tegra_drm_ioctls[] = { 553static const struct drm_ioctl_desc tegra_drm_ioctls[] = {
@@ -469,6 +562,8 @@ static const struct drm_ioctl_desc tegra_drm_ioctls[] = {
469 DRM_IOCTL_DEF_DRV(TEGRA_GET_SYNCPT, tegra_get_syncpt, DRM_UNLOCKED), 562 DRM_IOCTL_DEF_DRV(TEGRA_GET_SYNCPT, tegra_get_syncpt, DRM_UNLOCKED),
470 DRM_IOCTL_DEF_DRV(TEGRA_SUBMIT, tegra_submit, DRM_UNLOCKED), 563 DRM_IOCTL_DEF_DRV(TEGRA_SUBMIT, tegra_submit, DRM_UNLOCKED),
471 DRM_IOCTL_DEF_DRV(TEGRA_GET_SYNCPT_BASE, tegra_get_syncpt_base, DRM_UNLOCKED), 564 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),
566 DRM_IOCTL_DEF_DRV(TEGRA_GEM_GET_TILING, tegra_gem_get_tiling, DRM_UNLOCKED),
472#endif 567#endif
473}; 568};
474 569
diff --git a/include/uapi/drm/tegra_drm.h b/include/uapi/drm/tegra_drm.h
index b75482112428..0829f75eb986 100644
--- a/include/uapi/drm/tegra_drm.h
+++ b/include/uapi/drm/tegra_drm.h
@@ -129,6 +129,27 @@ struct drm_tegra_submit {
129 __u32 reserved[5]; /* future expansion */ 129 __u32 reserved[5]; /* future expansion */
130}; 130};
131 131
132#define DRM_TEGRA_GEM_TILING_MODE_PITCH 0
133#define DRM_TEGRA_GEM_TILING_MODE_TILED 1
134#define DRM_TEGRA_GEM_TILING_MODE_BLOCK 2
135
136struct drm_tegra_gem_set_tiling {
137 /* input */
138 __u32 handle;
139 __u32 mode;
140 __u32 value;
141 __u32 pad;
142};
143
144struct drm_tegra_gem_get_tiling {
145 /* input */
146 __u32 handle;
147 /* output */
148 __u32 mode;
149 __u32 value;
150 __u32 pad;
151};
152
132#define DRM_TEGRA_GEM_CREATE 0x00 153#define DRM_TEGRA_GEM_CREATE 0x00
133#define DRM_TEGRA_GEM_MMAP 0x01 154#define DRM_TEGRA_GEM_MMAP 0x01
134#define DRM_TEGRA_SYNCPT_READ 0x02 155#define DRM_TEGRA_SYNCPT_READ 0x02
@@ -139,6 +160,8 @@ struct drm_tegra_submit {
139#define DRM_TEGRA_GET_SYNCPT 0x07 160#define DRM_TEGRA_GET_SYNCPT 0x07
140#define DRM_TEGRA_SUBMIT 0x08 161#define DRM_TEGRA_SUBMIT 0x08
141#define DRM_TEGRA_GET_SYNCPT_BASE 0x09 162#define DRM_TEGRA_GET_SYNCPT_BASE 0x09
163#define DRM_TEGRA_GEM_SET_TILING 0x0a
164#define DRM_TEGRA_GEM_GET_TILING 0x0b
142 165
143#define DRM_IOCTL_TEGRA_GEM_CREATE DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_CREATE, struct drm_tegra_gem_create) 166#define DRM_IOCTL_TEGRA_GEM_CREATE DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_CREATE, struct drm_tegra_gem_create)
144#define DRM_IOCTL_TEGRA_GEM_MMAP DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_MMAP, struct drm_tegra_gem_mmap) 167#define DRM_IOCTL_TEGRA_GEM_MMAP DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_MMAP, struct drm_tegra_gem_mmap)
@@ -150,5 +173,7 @@ struct drm_tegra_submit {
150#define DRM_IOCTL_TEGRA_GET_SYNCPT DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GET_SYNCPT, struct drm_tegra_get_syncpt) 173#define DRM_IOCTL_TEGRA_GET_SYNCPT DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GET_SYNCPT, struct drm_tegra_get_syncpt)
151#define DRM_IOCTL_TEGRA_SUBMIT DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_SUBMIT, struct drm_tegra_submit) 174#define DRM_IOCTL_TEGRA_SUBMIT DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_SUBMIT, struct drm_tegra_submit)
152#define DRM_IOCTL_TEGRA_GET_SYNCPT_BASE DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GET_SYNCPT_BASE, struct drm_tegra_get_syncpt_base) 175#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)
177#define DRM_IOCTL_TEGRA_GEM_GET_TILING DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_GET_TILING, struct drm_tegra_gem_get_tiling)
153 178
154#endif 179#endif