@@ -612,6 +612,7 @@ static int tegra_gem_set_tiling(struct drm_device *drm, void *data,
enum tegra_bo_tiling_mode mode;
struct drm_gem_object *gem;
unsigned long value = 0;
+ enum tegra_bo_sector_layout layout;
struct tegra_bo *bo;
switch (args->mode) {
@@ -644,6 +645,19 @@ static int tegra_gem_set_tiling(struct drm_device *drm, void *data,
return -EINVAL;
}
+ switch (args->sector_layout) {
+ case DRM_TEGRA_GEM_SECTOR_LAYOUT_TEGRA:
+ layout = TEGRA_BO_SECTOR_LAYOUT_TEGRA;
+ break;
+
+ case DRM_TEGRA_GEM_SECTOR_LAYOUT_GPU:
+ layout = TEGRA_BO_SECTOR_LAYOUT_GPU;
+ break;
+
+ default:
+ return -EINVAL;
+ }
+
gem = drm_gem_object_lookup(file, args->handle);
if (!gem)
return -ENOENT;
@@ -652,6 +666,7 @@ static int tegra_gem_set_tiling(struct drm_device *drm, void *data,
bo->tiling.mode = mode;
bo->tiling.value = value;
+ bo->tiling.sector_layout = layout;
drm_gem_object_put(gem);
@@ -693,6 +708,20 @@ static int tegra_gem_get_tiling(struct drm_device *drm, void *data,
break;
}
+ switch (bo->tiling.sector_layout) {
+ case TEGRA_BO_SECTOR_LAYOUT_TEGRA:
+ args->sector_layout = DRM_TEGRA_GEM_SECTOR_LAYOUT_TEGRA;
+ break;
+
+ case TEGRA_BO_SECTOR_LAYOUT_GPU:
+ args->sector_layout = DRM_TEGRA_GEM_SECTOR_LAYOUT_GPU;
+ break;
+
+ default:
+ err = -EINVAL;
+ break;
+ }
+
drm_gem_object_put(gem);
return err;
@@ -508,6 +508,9 @@ struct drm_tegra_submit {
#define DRM_TEGRA_GEM_TILING_MODE_TILED 1
#define DRM_TEGRA_GEM_TILING_MODE_BLOCK 2
+#define DRM_TEGRA_GEM_SECTOR_LAYOUT_TEGRA 0
+#define DRM_TEGRA_GEM_SECTOR_LAYOUT_GPU 1
+
/**
* struct drm_tegra_gem_set_tiling - parameters for the set tiling IOCTL
*/
@@ -543,11 +546,11 @@ struct drm_tegra_gem_set_tiling {
__u32 value;
/**
- * @pad:
+ * @sector_layout:
*
- * Structure padding that may be used in the future. Must be 0.
+ * Specify low-level sector layout.
*/
- __u32 pad;
+ __u32 sector_layout;
};
/**
@@ -578,11 +581,12 @@ struct drm_tegra_gem_get_tiling {
__u32 value;
/**
- * @pad:
+ * @sector_layout:
*
- * Structure padding that may be used in the future. Must be 0.
+ * The sector layout parameter currently associated with the GEM object.
+ * Set by the kernel upon successful completion of the IOCTL.
*/
- __u32 pad;
+ __u32 sector_layout;
};
#define DRM_TEGRA_GEM_BOTTOM_UP (1 << 0)
Commit 7b6f846785f4 ("drm/tegra: Support sector layout on Tegra194") updated struct tegra_bo_tiling with a new field conveying information about the sector layout of the buffer object. Update the SET/GET_TILING IOCTLs with this field so that userspace can set it appropriately. Signed-off-by: Diogo Ivo <diogo.ivo@tecnico.ulisboa.pt> --- drivers/gpu/drm/tegra/drm.c | 29 +++++++++++++++++++++++++++++ include/uapi/drm/tegra_drm.h | 16 ++++++++++------ 2 files changed, 39 insertions(+), 6 deletions(-)