aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amdfalconx86/recipes-kernel/linux/linux-yocto/0218-drm-amdgpu-rework-tiling-flags.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amdfalconx86/recipes-kernel/linux/linux-yocto/0218-drm-amdgpu-rework-tiling-flags.patch')
-rw-r--r--meta-amdfalconx86/recipes-kernel/linux/linux-yocto/0218-drm-amdgpu-rework-tiling-flags.patch511
1 files changed, 511 insertions, 0 deletions
diff --git a/meta-amdfalconx86/recipes-kernel/linux/linux-yocto/0218-drm-amdgpu-rework-tiling-flags.patch b/meta-amdfalconx86/recipes-kernel/linux/linux-yocto/0218-drm-amdgpu-rework-tiling-flags.patch
new file mode 100644
index 00000000..6ac69647
--- /dev/null
+++ b/meta-amdfalconx86/recipes-kernel/linux/linux-yocto/0218-drm-amdgpu-rework-tiling-flags.patch
@@ -0,0 +1,511 @@
+From fbd76d59efe061c89d4ba14eef3a2cac1e3056c2 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= <marek.olsak@amd.com>
+Date: Thu, 14 May 2015 23:48:26 +0200
+Subject: [PATCH 0218/1050] drm/amdgpu: rework tiling flags
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Marek Olšák <marek.olsak@amd.com>
+Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
+Acked-by: Christian König <christian.koenig@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c | 3 +-
+ drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 43 +-------------
+ drivers/gpu/drm/amd/amdgpu/dce_v10_0.c | 92 ++++-------------------------
+ drivers/gpu/drm/amd/amdgpu/dce_v11_0.c | 93 ++++--------------------------
+ drivers/gpu/drm/amd/amdgpu/dce_v8_0.c | 91 ++++-------------------------
+ 5 files changed, 36 insertions(+), 286 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
+index ef61198..73b7aad 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
+@@ -32,6 +32,7 @@
+ #include <drm/drm_crtc_helper.h>
+ #include <drm/amdgpu_drm.h>
+ #include "amdgpu.h"
++#include "cikd.h"
+
+ #include <drm/drm_fb_helper.h>
+
+@@ -135,7 +136,7 @@ static int amdgpufb_create_pinned_object(struct amdgpu_fbdev *rfbdev,
+ rbo = gem_to_amdgpu_bo(gobj);
+
+ if (fb_tiled)
+- tiling_flags = AMDGPU_TILING_MACRO;
++ tiling_flags = AMDGPU_TILING_SET(ARRAY_MODE, GRPH_ARRAY_2D_TILED_THIN1);
+
+ ret = amdgpu_bo_reserve(rbo, false);
+ if (unlikely(ret != 0))
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
+index a721f50..b545f61 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
+@@ -459,49 +459,8 @@ int amdgpu_bo_fbdev_mmap(struct amdgpu_bo *bo,
+
+ int amdgpu_bo_set_tiling_flags(struct amdgpu_bo *bo, u64 tiling_flags)
+ {
+- unsigned bankw, bankh, mtaspect, tilesplit, stilesplit;
+-
+- bankw = (tiling_flags >> AMDGPU_TILING_EG_BANKW_SHIFT) & AMDGPU_TILING_EG_BANKW_MASK;
+- bankh = (tiling_flags >> AMDGPU_TILING_EG_BANKH_SHIFT) & AMDGPU_TILING_EG_BANKH_MASK;
+- mtaspect = (tiling_flags >> AMDGPU_TILING_EG_MACRO_TILE_ASPECT_SHIFT) & AMDGPU_TILING_EG_MACRO_TILE_ASPECT_MASK;
+- tilesplit = (tiling_flags >> AMDGPU_TILING_EG_TILE_SPLIT_SHIFT) & AMDGPU_TILING_EG_TILE_SPLIT_MASK;
+- stilesplit = (tiling_flags >> AMDGPU_TILING_EG_STENCIL_TILE_SPLIT_SHIFT) & AMDGPU_TILING_EG_STENCIL_TILE_SPLIT_MASK;
+- switch (bankw) {
+- case 0:
+- case 1:
+- case 2:
+- case 4:
+- case 8:
+- break;
+- default:
++ if (AMDGPU_TILING_GET(tiling_flags, TILE_SPLIT) > 6)
+ return -EINVAL;
+- }
+- switch (bankh) {
+- case 0:
+- case 1:
+- case 2:
+- case 4:
+- case 8:
+- break;
+- default:
+- return -EINVAL;
+- }
+- switch (mtaspect) {
+- case 0:
+- case 1:
+- case 2:
+- case 4:
+- case 8:
+- break;
+- default:
+- return -EINVAL;
+- }
+- if (tilesplit > 6) {
+- return -EINVAL;
+- }
+- if (stilesplit > 6) {
+- return -EINVAL;
+- }
+
+ bo->tiling_flags = tiling_flags;
+ return 0;
+diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
+index d412291..37b9623 100644
+--- a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
+@@ -2008,61 +2008,6 @@ static void dce_v10_0_grph_enable(struct drm_crtc *crtc, bool enable)
+ WREG32(mmGRPH_ENABLE + amdgpu_crtc->crtc_offset, 0);
+ }
+
+-static void dce_v10_0_tiling_fields(uint64_t tiling_flags, unsigned *bankw,
+- unsigned *bankh, unsigned *mtaspect,
+- unsigned *tile_split)
+-{
+- *bankw = (tiling_flags >> AMDGPU_TILING_EG_BANKW_SHIFT) & AMDGPU_TILING_EG_BANKW_MASK;
+- *bankh = (tiling_flags >> AMDGPU_TILING_EG_BANKH_SHIFT) & AMDGPU_TILING_EG_BANKH_MASK;
+- *mtaspect = (tiling_flags >> AMDGPU_TILING_EG_MACRO_TILE_ASPECT_SHIFT) & AMDGPU_TILING_EG_MACRO_TILE_ASPECT_MASK;
+- *tile_split = (tiling_flags >> AMDGPU_TILING_EG_TILE_SPLIT_SHIFT) & AMDGPU_TILING_EG_TILE_SPLIT_MASK;
+- switch (*bankw) {
+- default:
+- case 1:
+- *bankw = ADDR_SURF_BANK_WIDTH_1;
+- break;
+- case 2:
+- *bankw = ADDR_SURF_BANK_WIDTH_2;
+- break;
+- case 4:
+- *bankw = ADDR_SURF_BANK_WIDTH_4;
+- break;
+- case 8:
+- *bankw = ADDR_SURF_BANK_WIDTH_8;
+- break;
+- }
+- switch (*bankh) {
+- default:
+- case 1:
+- *bankh = ADDR_SURF_BANK_HEIGHT_1;
+- break;
+- case 2:
+- *bankh = ADDR_SURF_BANK_HEIGHT_2;
+- break;
+- case 4:
+- *bankh = ADDR_SURF_BANK_HEIGHT_4;
+- break;
+- case 8:
+- *bankh = ADDR_SURF_BANK_HEIGHT_8;
+- break;
+- }
+- switch (*mtaspect) {
+- default:
+- case 1:
+- *mtaspect = ADDR_SURF_MACRO_ASPECT_1;
+- break;
+- case 2:
+- *mtaspect = ADDR_SURF_MACRO_ASPECT_2;
+- break;
+- case 4:
+- *mtaspect = ADDR_SURF_MACRO_ASPECT_4;
+- break;
+- case 8:
+- *mtaspect = ADDR_SURF_MACRO_ASPECT_8;
+- break;
+- }
+-}
+-
+ static int dce_v10_0_crtc_do_set_base(struct drm_crtc *crtc,
+ struct drm_framebuffer *fb,
+ int x, int y, int atomic)
+@@ -2076,10 +2021,8 @@ static int dce_v10_0_crtc_do_set_base(struct drm_crtc *crtc,
+ struct amdgpu_bo *rbo;
+ uint64_t fb_location, tiling_flags;
+ uint32_t fb_format, fb_pitch_pixels;
+- unsigned bankw, bankh, mtaspect, tile_split;
+ u32 fb_swap = REG_SET_FIELD(0, GRPH_SWAP_CNTL, GRPH_ENDIAN_SWAP, ENDIAN_NONE);
+- /* XXX change to VI */
+- u32 pipe_config = (adev->gfx.config.tile_mode_array[10] >> 6) & 0x1f;
++ u32 pipe_config;
+ u32 tmp, viewport_w, viewport_h;
+ int r;
+ bool bypass_lut = false;
+@@ -2121,6 +2064,8 @@ static int dce_v10_0_crtc_do_set_base(struct drm_crtc *crtc,
+ amdgpu_bo_get_tiling_flags(rbo, &tiling_flags);
+ amdgpu_bo_unreserve(rbo);
+
++ pipe_config = AMDGPU_TILING_GET(tiling_flags, PIPE_CONFIG);
++
+ switch (target_fb->pixel_format) {
+ case DRM_FORMAT_C8:
+ fb_format = REG_SET_FIELD(0, GRPH_CONTROL, GRPH_DEPTH, 0);
+@@ -2198,27 +2143,15 @@ static int dce_v10_0_crtc_do_set_base(struct drm_crtc *crtc,
+ return -EINVAL;
+ }
+
+- if (tiling_flags & AMDGPU_TILING_MACRO) {
+- unsigned tileb, index, num_banks, tile_split_bytes;
+-
+- dce_v10_0_tiling_fields(tiling_flags, &bankw, &bankh, &mtaspect, &tile_split);
+- /* Set NUM_BANKS. */
+- /* Calculate the macrotile mode index. */
+- tile_split_bytes = 64 << tile_split;
+- tileb = 8 * 8 * target_fb->bits_per_pixel / 8;
+- tileb = min(tile_split_bytes, tileb);
++ if (AMDGPU_TILING_GET(tiling_flags, ARRAY_MODE) == ARRAY_2D_TILED_THIN1) {
++ unsigned bankw, bankh, mtaspect, tile_split, num_banks;
+
+- for (index = 0; tileb > 64; index++) {
+- tileb >>= 1;
+- }
+-
+- if (index >= 16) {
+- DRM_ERROR("Wrong screen bpp (%u) or tile split (%u)\n",
+- target_fb->bits_per_pixel, tile_split);
+- return -EINVAL;
+- }
++ bankw = AMDGPU_TILING_GET(tiling_flags, BANK_WIDTH);
++ bankh = AMDGPU_TILING_GET(tiling_flags, BANK_HEIGHT);
++ mtaspect = AMDGPU_TILING_GET(tiling_flags, MACRO_TILE_ASPECT);
++ tile_split = AMDGPU_TILING_GET(tiling_flags, TILE_SPLIT);
++ num_banks = AMDGPU_TILING_GET(tiling_flags, NUM_BANKS);
+
+- num_banks = (adev->gfx.config.macrotile_mode_array[index] >> 6) & 0x3;
+ fb_format = REG_SET_FIELD(fb_format, GRPH_CONTROL, GRPH_NUM_BANKS, num_banks);
+ fb_format = REG_SET_FIELD(fb_format, GRPH_CONTROL, GRPH_ARRAY_MODE,
+ ARRAY_2D_TILED_THIN1);
+@@ -2230,14 +2163,11 @@ static int dce_v10_0_crtc_do_set_base(struct drm_crtc *crtc,
+ mtaspect);
+ fb_format = REG_SET_FIELD(fb_format, GRPH_CONTROL, GRPH_MICRO_TILE_MODE,
+ ADDR_SURF_MICRO_TILING_DISPLAY);
+- } else if (tiling_flags & AMDGPU_TILING_MICRO) {
++ } else if (AMDGPU_TILING_GET(tiling_flags, ARRAY_MODE) == ARRAY_1D_TILED_THIN1) {
+ fb_format = REG_SET_FIELD(fb_format, GRPH_CONTROL, GRPH_ARRAY_MODE,
+ ARRAY_1D_TILED_THIN1);
+ }
+
+- /* Read the pipe config from the 2D TILED SCANOUT mode.
+- * It should be the same for the other modes too, but not all
+- * modes set the pipe config field. */
+ fb_format = REG_SET_FIELD(fb_format, GRPH_CONTROL, GRPH_PIPE_CONFIG,
+ pipe_config);
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
+index 55fef15..04a5d4c 100644
+--- a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
+@@ -2006,61 +2006,6 @@ static void dce_v11_0_grph_enable(struct drm_crtc *crtc, bool enable)
+ WREG32(mmGRPH_ENABLE + amdgpu_crtc->crtc_offset, 0);
+ }
+
+-static void dce_v11_0_tiling_fields(uint64_t tiling_flags, unsigned *bankw,
+- unsigned *bankh, unsigned *mtaspect,
+- unsigned *tile_split)
+-{
+- *bankw = (tiling_flags >> AMDGPU_TILING_EG_BANKW_SHIFT) & AMDGPU_TILING_EG_BANKW_MASK;
+- *bankh = (tiling_flags >> AMDGPU_TILING_EG_BANKH_SHIFT) & AMDGPU_TILING_EG_BANKH_MASK;
+- *mtaspect = (tiling_flags >> AMDGPU_TILING_EG_MACRO_TILE_ASPECT_SHIFT) & AMDGPU_TILING_EG_MACRO_TILE_ASPECT_MASK;
+- *tile_split = (tiling_flags >> AMDGPU_TILING_EG_TILE_SPLIT_SHIFT) & AMDGPU_TILING_EG_TILE_SPLIT_MASK;
+- switch (*bankw) {
+- default:
+- case 1:
+- *bankw = ADDR_SURF_BANK_WIDTH_1;
+- break;
+- case 2:
+- *bankw = ADDR_SURF_BANK_WIDTH_2;
+- break;
+- case 4:
+- *bankw = ADDR_SURF_BANK_WIDTH_4;
+- break;
+- case 8:
+- *bankw = ADDR_SURF_BANK_WIDTH_8;
+- break;
+- }
+- switch (*bankh) {
+- default:
+- case 1:
+- *bankh = ADDR_SURF_BANK_HEIGHT_1;
+- break;
+- case 2:
+- *bankh = ADDR_SURF_BANK_HEIGHT_2;
+- break;
+- case 4:
+- *bankh = ADDR_SURF_BANK_HEIGHT_4;
+- break;
+- case 8:
+- *bankh = ADDR_SURF_BANK_HEIGHT_8;
+- break;
+- }
+- switch (*mtaspect) {
+- default:
+- case 1:
+- *mtaspect = ADDR_SURF_MACRO_ASPECT_1;
+- break;
+- case 2:
+- *mtaspect = ADDR_SURF_MACRO_ASPECT_2;
+- break;
+- case 4:
+- *mtaspect = ADDR_SURF_MACRO_ASPECT_4;
+- break;
+- case 8:
+- *mtaspect = ADDR_SURF_MACRO_ASPECT_8;
+- break;
+- }
+-}
+-
+ static int dce_v11_0_crtc_do_set_base(struct drm_crtc *crtc,
+ struct drm_framebuffer *fb,
+ int x, int y, int atomic)
+@@ -2074,10 +2019,8 @@ static int dce_v11_0_crtc_do_set_base(struct drm_crtc *crtc,
+ struct amdgpu_bo *rbo;
+ uint64_t fb_location, tiling_flags;
+ uint32_t fb_format, fb_pitch_pixels;
+- unsigned bankw, bankh, mtaspect, tile_split;
+ u32 fb_swap = REG_SET_FIELD(0, GRPH_SWAP_CNTL, GRPH_ENDIAN_SWAP, ENDIAN_NONE);
+- /* XXX change to VI */
+- u32 pipe_config = (adev->gfx.config.tile_mode_array[10] >> 6) & 0x1f;
++ u32 pipe_config;
+ u32 tmp, viewport_w, viewport_h;
+ int r;
+ bool bypass_lut = false;
+@@ -2119,6 +2062,8 @@ static int dce_v11_0_crtc_do_set_base(struct drm_crtc *crtc,
+ amdgpu_bo_get_tiling_flags(rbo, &tiling_flags);
+ amdgpu_bo_unreserve(rbo);
+
++ pipe_config = AMDGPU_TILING_GET(tiling_flags, PIPE_CONFIG);
++
+ switch (target_fb->pixel_format) {
+ case DRM_FORMAT_C8:
+ fb_format = REG_SET_FIELD(0, GRPH_CONTROL, GRPH_DEPTH, 0);
+@@ -2196,28 +2141,15 @@ static int dce_v11_0_crtc_do_set_base(struct drm_crtc *crtc,
+ return -EINVAL;
+ }
+
+- if (tiling_flags & AMDGPU_TILING_MACRO) {
+- unsigned tileb, index, num_banks, tile_split_bytes;
+-
+- dce_v11_0_tiling_fields(tiling_flags, &bankw, &bankh, &mtaspect, &tile_split);
+- /* Set NUM_BANKS. */
+- /* Calculate the macrotile mode index. */
+- tile_split_bytes = 64 << tile_split;
+- tileb = 8 * 8 * target_fb->bits_per_pixel / 8;
+- tileb = min(tile_split_bytes, tileb);
++ if (AMDGPU_TILING_GET(tiling_flags, ARRAY_MODE) == ARRAY_2D_TILED_THIN1) {
++ unsigned bankw, bankh, mtaspect, tile_split, num_banks;
+
+- for (index = 0; tileb > 64; index++) {
+- tileb >>= 1;
+- }
+-
+- if (index >= 16) {
+- DRM_ERROR("Wrong screen bpp (%u) or tile split (%u)\n",
+- target_fb->bits_per_pixel, tile_split);
+- return -EINVAL;
+- }
++ bankw = AMDGPU_TILING_GET(tiling_flags, BANK_WIDTH);
++ bankh = AMDGPU_TILING_GET(tiling_flags, BANK_HEIGHT);
++ mtaspect = AMDGPU_TILING_GET(tiling_flags, MACRO_TILE_ASPECT);
++ tile_split = AMDGPU_TILING_GET(tiling_flags, TILE_SPLIT);
++ num_banks = AMDGPU_TILING_GET(tiling_flags, NUM_BANKS);
+
+- /* XXX fix me for VI */
+- num_banks = (adev->gfx.config.macrotile_mode_array[index] >> 6) & 0x3;
+ fb_format = REG_SET_FIELD(fb_format, GRPH_CONTROL, GRPH_NUM_BANKS, num_banks);
+ fb_format = REG_SET_FIELD(fb_format, GRPH_CONTROL, GRPH_ARRAY_MODE,
+ ARRAY_2D_TILED_THIN1);
+@@ -2229,14 +2161,11 @@ static int dce_v11_0_crtc_do_set_base(struct drm_crtc *crtc,
+ mtaspect);
+ fb_format = REG_SET_FIELD(fb_format, GRPH_CONTROL, GRPH_MICRO_TILE_MODE,
+ ADDR_SURF_MICRO_TILING_DISPLAY);
+- } else if (tiling_flags & AMDGPU_TILING_MICRO) {
++ } else if (AMDGPU_TILING_GET(tiling_flags, ARRAY_MODE) == ARRAY_1D_TILED_THIN1) {
+ fb_format = REG_SET_FIELD(fb_format, GRPH_CONTROL, GRPH_ARRAY_MODE,
+ ARRAY_1D_TILED_THIN1);
+ }
+
+- /* Read the pipe config from the 2D TILED SCANOUT mode.
+- * It should be the same for the other modes too, but not all
+- * modes set the pipe config field. */
+ fb_format = REG_SET_FIELD(fb_format, GRPH_CONTROL, GRPH_PIPE_CONFIG,
+ pipe_config);
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
+index c1bc693..9f2ff8d 100644
+--- a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
+@@ -1976,61 +1976,6 @@ static void dce_v8_0_grph_enable(struct drm_crtc *crtc, bool enable)
+ WREG32(mmGRPH_ENABLE + amdgpu_crtc->crtc_offset, 0);
+ }
+
+-static void dce_v8_0_tiling_fields(uint64_t tiling_flags, unsigned *bankw,
+- unsigned *bankh, unsigned *mtaspect,
+- unsigned *tile_split)
+-{
+- *bankw = (tiling_flags >> AMDGPU_TILING_EG_BANKW_SHIFT) & AMDGPU_TILING_EG_BANKW_MASK;
+- *bankh = (tiling_flags >> AMDGPU_TILING_EG_BANKH_SHIFT) & AMDGPU_TILING_EG_BANKH_MASK;
+- *mtaspect = (tiling_flags >> AMDGPU_TILING_EG_MACRO_TILE_ASPECT_SHIFT) & AMDGPU_TILING_EG_MACRO_TILE_ASPECT_MASK;
+- *tile_split = (tiling_flags >> AMDGPU_TILING_EG_TILE_SPLIT_SHIFT) & AMDGPU_TILING_EG_TILE_SPLIT_MASK;
+- switch (*bankw) {
+- default:
+- case 1:
+- *bankw = ADDR_SURF_BANK_WIDTH_1;
+- break;
+- case 2:
+- *bankw = ADDR_SURF_BANK_WIDTH_2;
+- break;
+- case 4:
+- *bankw = ADDR_SURF_BANK_WIDTH_4;
+- break;
+- case 8:
+- *bankw = ADDR_SURF_BANK_WIDTH_8;
+- break;
+- }
+- switch (*bankh) {
+- default:
+- case 1:
+- *bankh = ADDR_SURF_BANK_HEIGHT_1;
+- break;
+- case 2:
+- *bankh = ADDR_SURF_BANK_HEIGHT_2;
+- break;
+- case 4:
+- *bankh = ADDR_SURF_BANK_HEIGHT_4;
+- break;
+- case 8:
+- *bankh = ADDR_SURF_BANK_HEIGHT_8;
+- break;
+- }
+- switch (*mtaspect) {
+- default:
+- case 1:
+- *mtaspect = ADDR_SURF_MACRO_TILE_ASPECT_1;
+- break;
+- case 2:
+- *mtaspect = ADDR_SURF_MACRO_TILE_ASPECT_2;
+- break;
+- case 4:
+- *mtaspect = ADDR_SURF_MACRO_TILE_ASPECT_4;
+- break;
+- case 8:
+- *mtaspect = ADDR_SURF_MACRO_TILE_ASPECT_8;
+- break;
+- }
+-}
+-
+ static int dce_v8_0_crtc_do_set_base(struct drm_crtc *crtc,
+ struct drm_framebuffer *fb,
+ int x, int y, int atomic)
+@@ -2044,9 +1989,8 @@ static int dce_v8_0_crtc_do_set_base(struct drm_crtc *crtc,
+ struct amdgpu_bo *rbo;
+ uint64_t fb_location, tiling_flags;
+ uint32_t fb_format, fb_pitch_pixels;
+- unsigned bankw, bankh, mtaspect, tile_split;
+ u32 fb_swap = (GRPH_ENDIAN_NONE << GRPH_SWAP_CNTL__GRPH_ENDIAN_SWAP__SHIFT);
+- u32 pipe_config = (adev->gfx.config.tile_mode_array[10] >> 6) & 0x1f;
++ u32 pipe_config;
+ u32 tmp, viewport_w, viewport_h;
+ int r;
+ bool bypass_lut = false;
+@@ -2088,6 +2032,8 @@ static int dce_v8_0_crtc_do_set_base(struct drm_crtc *crtc,
+ amdgpu_bo_get_tiling_flags(rbo, &tiling_flags);
+ amdgpu_bo_unreserve(rbo);
+
++ pipe_config = AMDGPU_TILING_GET(tiling_flags, PIPE_CONFIG);
++
+ switch (target_fb->pixel_format) {
+ case DRM_FORMAT_C8:
+ fb_format = ((GRPH_DEPTH_8BPP << GRPH_CONTROL__GRPH_DEPTH__SHIFT) |
+@@ -2158,27 +2104,15 @@ static int dce_v8_0_crtc_do_set_base(struct drm_crtc *crtc,
+ return -EINVAL;
+ }
+
+- if (tiling_flags & AMDGPU_TILING_MACRO) {
+- unsigned tileb, index, num_banks, tile_split_bytes;
+-
+- dce_v8_0_tiling_fields(tiling_flags, &bankw, &bankh, &mtaspect, &tile_split);
+- /* Set NUM_BANKS. */
+- /* Calculate the macrotile mode index. */
+- tile_split_bytes = 64 << tile_split;
+- tileb = 8 * 8 * target_fb->bits_per_pixel / 8;
+- tileb = min(tile_split_bytes, tileb);
++ if (AMDGPU_TILING_GET(tiling_flags, ARRAY_MODE) == ARRAY_2D_TILED_THIN1) {
++ unsigned bankw, bankh, mtaspect, tile_split, num_banks;
+
+- for (index = 0; tileb > 64; index++) {
+- tileb >>= 1;
+- }
+-
+- if (index >= 16) {
+- DRM_ERROR("Wrong screen bpp (%u) or tile split (%u)\n",
+- target_fb->bits_per_pixel, tile_split);
+- return -EINVAL;
+- }
++ bankw = AMDGPU_TILING_GET(tiling_flags, BANK_WIDTH);
++ bankh = AMDGPU_TILING_GET(tiling_flags, BANK_HEIGHT);
++ mtaspect = AMDGPU_TILING_GET(tiling_flags, MACRO_TILE_ASPECT);
++ tile_split = AMDGPU_TILING_GET(tiling_flags, TILE_SPLIT);
++ num_banks = AMDGPU_TILING_GET(tiling_flags, NUM_BANKS);
+
+- num_banks = (adev->gfx.config.macrotile_mode_array[index] >> 6) & 0x3;
+ fb_format |= (num_banks << GRPH_CONTROL__GRPH_NUM_BANKS__SHIFT);
+ fb_format |= (GRPH_ARRAY_2D_TILED_THIN1 << GRPH_CONTROL__GRPH_ARRAY_MODE__SHIFT);
+ fb_format |= (tile_split << GRPH_CONTROL__GRPH_TILE_SPLIT__SHIFT);
+@@ -2186,13 +2120,10 @@ static int dce_v8_0_crtc_do_set_base(struct drm_crtc *crtc,
+ fb_format |= (bankh << GRPH_CONTROL__GRPH_BANK_HEIGHT__SHIFT);
+ fb_format |= (mtaspect << GRPH_CONTROL__GRPH_MACRO_TILE_ASPECT__SHIFT);
+ fb_format |= (DISPLAY_MICRO_TILING << GRPH_CONTROL__GRPH_MICRO_TILE_MODE__SHIFT);
+- } else if (tiling_flags & AMDGPU_TILING_MICRO) {
++ } else if (AMDGPU_TILING_GET(tiling_flags, ARRAY_MODE) == ARRAY_1D_TILED_THIN1) {
+ fb_format |= (GRPH_ARRAY_1D_TILED_THIN1 << GRPH_CONTROL__GRPH_ARRAY_MODE__SHIFT);
+ }
+
+- /* Read the pipe config from the 2D TILED SCANOUT mode.
+- * It should be the same for the other modes too, but not all
+- * modes set the pipe config field. */
+ fb_format |= (pipe_config << GRPH_CONTROL__GRPH_PIPE_CONFIG__SHIFT);
+
+ dce_v8_0_vga_enable(crtc, false);
+--
+1.9.1
+