diff options
-rw-r--r-- | drivers/gpu/drm/tegra/drm.c | 95 | ||||
-rw-r--r-- | include/uapi/drm/tegra_drm.h | 25 |
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 | |||
459 | static 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 | |||
512 | static 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 | ||
460 | static const struct drm_ioctl_desc tegra_drm_ioctls[] = { | 553 | static 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 | |||
136 | struct drm_tegra_gem_set_tiling { | ||
137 | /* input */ | ||
138 | __u32 handle; | ||
139 | __u32 mode; | ||
140 | __u32 value; | ||
141 | __u32 pad; | ||
142 | }; | ||
143 | |||
144 | struct 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 |