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....@tecnico.ulisboa.pt>
---
 drivers/gpu/drm/tegra/drm.c  | 29 +++++++++++++++++++++++++++++
 include/uapi/drm/tegra_drm.h | 16 ++++++++++------
 2 files changed, 39 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/tegra/drm.c b/drivers/gpu/drm/tegra/drm.c
index 6748ec1e0005..27afb7fa6259 100644
--- a/drivers/gpu/drm/tegra/drm.c
+++ b/drivers/gpu/drm/tegra/drm.c
@@ -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;
diff --git a/include/uapi/drm/tegra_drm.h b/include/uapi/drm/tegra_drm.h
index 94cfc306d50a..811e21b1a60e 100644
--- a/include/uapi/drm/tegra_drm.h
+++ b/include/uapi/drm/tegra_drm.h
@@ -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)
-- 
2.39.1

Reply via email to