|
@@ -343,6 +343,7 @@ void vc4_free_object(struct drm_gem_object *gem_bo)
|
|
bo->validated_shader = NULL;
|
|
bo->validated_shader = NULL;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ bo->t_format = false;
|
|
bo->free_time = jiffies;
|
|
bo->free_time = jiffies;
|
|
list_add(&bo->size_head, cache_list);
|
|
list_add(&bo->size_head, cache_list);
|
|
list_add(&bo->unref_head, &vc4->bo_cache.time_list);
|
|
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,
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * vc4_set_tiling_ioctl() - Sets the tiling modifier for a BO.
|
|
|
|
+ * @dev: DRM device
|
|
|
|
+ * @data: ioctl argument
|
|
|
|
+ * @file_priv: DRM file for this fd
|
|
|
|
+ *
|
|
|
|
+ * The tiling state of the BO decides the default modifier of an fb if
|
|
|
|
+ * no specific modifier was set by userspace, and the return value of
|
|
|
|
+ * vc4_get_tiling_ioctl() (so that userspace can treat a BO it
|
|
|
|
+ * received from dmabuf as the same tiling format as the producer
|
|
|
|
+ * used).
|
|
|
|
+ */
|
|
|
|
+int vc4_set_tiling_ioctl(struct drm_device *dev, void *data,
|
|
|
|
+ struct drm_file *file_priv)
|
|
|
|
+{
|
|
|
|
+ struct drm_vc4_set_tiling *args = data;
|
|
|
|
+ struct drm_gem_object *gem_obj;
|
|
|
|
+ struct vc4_bo *bo;
|
|
|
|
+ bool t_format;
|
|
|
|
+
|
|
|
|
+ if (args->flags != 0)
|
|
|
|
+ return -EINVAL;
|
|
|
|
+
|
|
|
|
+ switch (args->modifier) {
|
|
|
|
+ case DRM_FORMAT_MOD_NONE:
|
|
|
|
+ t_format = false;
|
|
|
|
+ break;
|
|
|
|
+ case DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED:
|
|
|
|
+ t_format = true;
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ return -EINVAL;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ gem_obj = drm_gem_object_lookup(file_priv, args->handle);
|
|
|
|
+ if (!gem_obj) {
|
|
|
|
+ DRM_ERROR("Failed to look up GEM BO %d\n", args->handle);
|
|
|
|
+ return -ENOENT;
|
|
|
|
+ }
|
|
|
|
+ bo = to_vc4_bo(gem_obj);
|
|
|
|
+ bo->t_format = t_format;
|
|
|
|
+
|
|
|
|
+ drm_gem_object_unreference_unlocked(gem_obj);
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * vc4_get_tiling_ioctl() - Gets the tiling modifier for a BO.
|
|
|
|
+ * @dev: DRM device
|
|
|
|
+ * @data: ioctl argument
|
|
|
|
+ * @file_priv: DRM file for this fd
|
|
|
|
+ *
|
|
|
|
+ * Returns the tiling modifier for a BO as set by vc4_set_tiling_ioctl().
|
|
|
|
+ */
|
|
|
|
+int vc4_get_tiling_ioctl(struct drm_device *dev, void *data,
|
|
|
|
+ struct drm_file *file_priv)
|
|
|
|
+{
|
|
|
|
+ struct drm_vc4_get_tiling *args = data;
|
|
|
|
+ struct drm_gem_object *gem_obj;
|
|
|
|
+ struct vc4_bo *bo;
|
|
|
|
+
|
|
|
|
+ if (args->flags != 0 || args->modifier != 0)
|
|
|
|
+ return -EINVAL;
|
|
|
|
+
|
|
|
|
+ gem_obj = drm_gem_object_lookup(file_priv, args->handle);
|
|
|
|
+ if (!gem_obj) {
|
|
|
|
+ DRM_ERROR("Failed to look up GEM BO %d\n", args->handle);
|
|
|
|
+ return -ENOENT;
|
|
|
|
+ }
|
|
|
|
+ bo = to_vc4_bo(gem_obj);
|
|
|
|
+
|
|
|
|
+ if (bo->t_format)
|
|
|
|
+ args->modifier = DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED;
|
|
|
|
+ else
|
|
|
|
+ args->modifier = DRM_FORMAT_MOD_NONE;
|
|
|
|
+
|
|
|
|
+ drm_gem_object_unreference_unlocked(gem_obj);
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
void vc4_bo_cache_init(struct drm_device *dev)
|
|
void vc4_bo_cache_init(struct drm_device *dev)
|
|
{
|
|
{
|
|
struct vc4_dev *vc4 = to_vc4_dev(dev);
|
|
struct vc4_dev *vc4 = to_vc4_dev(dev);
|