@@ -343,6 +343,7 @@ void vc4_free_object(struct drm_gem_object *gem_bo)
343343 bo -> validated_shader = NULL ;
344344 }
345345
346+ bo -> t_format = false;
346347 bo -> free_time = jiffies ;
347348 list_add (& bo -> size_head , cache_list );
348349 list_add (& bo -> unref_head , & vc4 -> bo_cache .time_list );
@@ -568,6 +569,88 @@ vc4_create_shader_bo_ioctl(struct drm_device *dev, void *data,
568569 return ret ;
569570}
570571
572+ /**
573+ * vc4_set_tiling_ioctl() - Sets the tiling modifier for a BO.
574+ * @dev: DRM device
575+ * @data: ioctl argument
576+ * @file_priv: DRM file for this fd
577+ *
578+ * The tiling state of the BO decides the default modifier of an fb if
579+ * no specific modifier was set by userspace, and the return value of
580+ * vc4_get_tiling_ioctl() (so that userspace can treat a BO it
581+ * received from dmabuf as the same tiling format as the producer
582+ * used).
583+ */
584+ int vc4_set_tiling_ioctl (struct drm_device * dev , void * data ,
585+ struct drm_file * file_priv )
586+ {
587+ struct drm_vc4_set_tiling * args = data ;
588+ struct drm_gem_object * gem_obj ;
589+ struct vc4_bo * bo ;
590+ bool t_format ;
591+
592+ if (args -> flags != 0 )
593+ return - EINVAL ;
594+
595+ switch (args -> modifier ) {
596+ case DRM_FORMAT_MOD_NONE :
597+ t_format = false;
598+ break ;
599+ case DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED :
600+ t_format = true;
601+ break ;
602+ default :
603+ return - EINVAL ;
604+ }
605+
606+ gem_obj = drm_gem_object_lookup (file_priv , args -> handle );
607+ if (!gem_obj ) {
608+ DRM_ERROR ("Failed to look up GEM BO %d\n" , args -> handle );
609+ return - ENOENT ;
610+ }
611+ bo = to_vc4_bo (gem_obj );
612+ bo -> t_format = t_format ;
613+
614+ drm_gem_object_unreference_unlocked (gem_obj );
615+
616+ return 0 ;
617+ }
618+
619+ /**
620+ * vc4_get_tiling_ioctl() - Gets the tiling modifier for a BO.
621+ * @dev: DRM device
622+ * @data: ioctl argument
623+ * @file_priv: DRM file for this fd
624+ *
625+ * Returns the tiling modifier for a BO as set by vc4_set_tiling_ioctl().
626+ */
627+ int vc4_get_tiling_ioctl (struct drm_device * dev , void * data ,
628+ struct drm_file * file_priv )
629+ {
630+ struct drm_vc4_get_tiling * args = data ;
631+ struct drm_gem_object * gem_obj ;
632+ struct vc4_bo * bo ;
633+
634+ if (args -> flags != 0 || args -> modifier != 0 )
635+ return - EINVAL ;
636+
637+ gem_obj = drm_gem_object_lookup (file_priv , args -> handle );
638+ if (!gem_obj ) {
639+ DRM_ERROR ("Failed to look up GEM BO %d\n" , args -> handle );
640+ return - ENOENT ;
641+ }
642+ bo = to_vc4_bo (gem_obj );
643+
644+ if (bo -> t_format )
645+ args -> modifier = DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED ;
646+ else
647+ args -> modifier = DRM_FORMAT_MOD_NONE ;
648+
649+ drm_gem_object_unreference_unlocked (gem_obj );
650+
651+ return 0 ;
652+ }
653+
571654void vc4_bo_cache_init (struct drm_device * dev )
572655{
573656 struct vc4_dev * vc4 = to_vc4_dev (dev );
0 commit comments