[PATCH 2/3] drm/radeon/kms: fix scanout of 2D tiled buffers on EG/CM

2011-11-28 Thread alexdeuc...@gmail.com
From: Alex Deucher 

Fixes:
https://bugs.freedesktop.org/show_bug.cgi?id=43191

Signed-off-by: Alex Deucher 
---
 drivers/gpu/drm/radeon/atombios_crtc.c |   35 ++-
 drivers/gpu/drm/radeon/evergreen_reg.h |   29 ++
 2 files changed, 62 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c 
b/drivers/gpu/drm/radeon/atombios_crtc.c
index 87631fe..2b97262 100644
--- a/drivers/gpu/drm/radeon/atombios_crtc.c
+++ b/drivers/gpu/drm/radeon/atombios_crtc.c
@@ -1107,9 +1107,40 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc,
return -EINVAL;
}

-   if (tiling_flags & RADEON_TILING_MACRO)
+   if (tiling_flags & RADEON_TILING_MACRO) {
+   if (rdev->family >= CHIP_CAYMAN)
+   tmp = rdev->config.cayman.tile_config;
+   else
+   tmp = rdev->config.evergreen.tile_config;
+
+   switch ((tmp & 0xf0) >> 4) {
+   case 0: /* 4 banks */
+   fb_format |= 
EVERGREEN_GRPH_NUM_BANKS(EVERGREEN_ADDR_SURF_4_BANK);
+   break;
+   case 1: /* 8 banks */
+   default:
+   fb_format |= 
EVERGREEN_GRPH_NUM_BANKS(EVERGREEN_ADDR_SURF_8_BANK);
+   break;
+   case 2: /* 16 banks */
+   fb_format |= 
EVERGREEN_GRPH_NUM_BANKS(EVERGREEN_ADDR_SURF_16_BANK);
+   break;
+   }
+
+   switch ((tmp & 0xf000) >> 12) {
+   case 0: /* 1KB rows */
+   default:
+   fb_format |= 
EVERGREEN_GRPH_TILE_SPLIT(EVERGREEN_ADDR_SURF_TILE_SPLIT_1KB);
+   break;
+   case 1: /* 2KB rows */
+   fb_format |= 
EVERGREEN_GRPH_TILE_SPLIT(EVERGREEN_ADDR_SURF_TILE_SPLIT_2KB);
+   break;
+   case 2: /* 4KB rows */
+   fb_format |= 
EVERGREEN_GRPH_TILE_SPLIT(EVERGREEN_ADDR_SURF_TILE_SPLIT_4KB);
+   break;
+   }
+
fb_format |= 
EVERGREEN_GRPH_ARRAY_MODE(EVERGREEN_GRPH_ARRAY_2D_TILED_THIN1);
-   else if (tiling_flags & RADEON_TILING_MICRO)
+   } else if (tiling_flags & RADEON_TILING_MICRO)
fb_format |= 
EVERGREEN_GRPH_ARRAY_MODE(EVERGREEN_GRPH_ARRAY_1D_TILED_THIN1);

switch (radeon_crtc->crtc_id) {
diff --git a/drivers/gpu/drm/radeon/evergreen_reg.h 
b/drivers/gpu/drm/radeon/evergreen_reg.h
index c781c92..7d7f215 100644
--- a/drivers/gpu/drm/radeon/evergreen_reg.h
+++ b/drivers/gpu/drm/radeon/evergreen_reg.h
@@ -42,6 +42,17 @@
 #   define EVERGREEN_GRPH_DEPTH_8BPP0
 #   define EVERGREEN_GRPH_DEPTH_16BPP   1
 #   define EVERGREEN_GRPH_DEPTH_32BPP   2
+#   define EVERGREEN_GRPH_NUM_BANKS(x)  (((x) & 0x3) << 2)
+#   define EVERGREEN_ADDR_SURF_2_BANK   0
+#   define EVERGREEN_ADDR_SURF_4_BANK   1
+#   define EVERGREEN_ADDR_SURF_8_BANK   2
+#   define EVERGREEN_ADDR_SURF_16_BANK  3
+#   define EVERGREEN_GRPH_Z(x)  (((x) & 0x3) << 4)
+#   define EVERGREEN_GRPH_BANK_WIDTH(x) (((x) & 0x3) << 6)
+#   define EVERGREEN_ADDR_SURF_BANK_WIDTH_1 0
+#   define EVERGREEN_ADDR_SURF_BANK_WIDTH_2 1
+#   define EVERGREEN_ADDR_SURF_BANK_WIDTH_4 2
+#   define EVERGREEN_ADDR_SURF_BANK_WIDTH_8 3
 #   define EVERGREEN_GRPH_FORMAT(x) (((x) & 0x7) << 8)
 /* 8 BPP */
 #   define EVERGREEN_GRPH_FORMAT_INDEXED0
@@ -61,6 +72,24 @@
 #   define EVERGREEN_GRPH_FORMAT_8B_BGRA1010102 5
 #   define EVERGREEN_GRPH_FORMAT_RGB10  6
 #   define EVERGREEN_GRPH_FORMAT_BGR10  7
+#   define EVERGREEN_GRPH_BANK_HEIGHT(x)(((x) & 0x3) << 11)
+#   define EVERGREEN_ADDR_SURF_BANK_HEIGHT_10
+#   define EVERGREEN_ADDR_SURF_BANK_HEIGHT_21
+#   define EVERGREEN_ADDR_SURF_BANK_HEIGHT_42
+#   define EVERGREEN_ADDR_SURF_BANK_HEIGHT_83
+#   define EVERGREEN_GRPH_TILE_SPLIT(x) (((x) & 0x7) << 13)
+#   define EVERGREEN_ADDR_SURF_TILE_SPLIT_64B   0
+#   define EVERGREEN_ADDR_SURF_TILE_SPLIT_128B  1
+#   define EVERGREEN_ADDR_SURF_TILE_SPLIT_256B  2
+#   define EVERGREEN_ADDR_SURF_TILE_SPLIT_512B  3
+#   define EVERGREEN_ADDR_SURF_TILE_SPLIT_1KB   4
+#   define EVERGREEN_ADDR_SURF_TILE_SPLIT_2KB   5
+#   define EVERGREEN_ADDR_SURF_TILE_SPLIT_4KB   6
+#   define EVERGREEN_GRPH_MACRO_TILE_ASPECT(x)  (((x) & 0x3) << 18)
+#   define EVERGREEN_ADDR_SURF_MACRO_TILE_ASPECT_1  0
+#   define EVERGREEN_ADDR_SURF_MACRO_TILE_ASPECT_2  1
+#   define 

[PATCH 2/3] drm/radeon/kms: fix scanout of 2D tiled buffers on EG/CM

2011-11-28 Thread alexdeucher
From: Alex Deucher alexander.deuc...@amd.com

Fixes:
https://bugs.freedesktop.org/show_bug.cgi?id=43191

Signed-off-by: Alex Deucher alexander.deuc...@amd.com
---
 drivers/gpu/drm/radeon/atombios_crtc.c |   35 ++-
 drivers/gpu/drm/radeon/evergreen_reg.h |   29 ++
 2 files changed, 62 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c 
b/drivers/gpu/drm/radeon/atombios_crtc.c
index 87631fe..2b97262 100644
--- a/drivers/gpu/drm/radeon/atombios_crtc.c
+++ b/drivers/gpu/drm/radeon/atombios_crtc.c
@@ -1107,9 +1107,40 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc,
return -EINVAL;
}
 
-   if (tiling_flags  RADEON_TILING_MACRO)
+   if (tiling_flags  RADEON_TILING_MACRO) {
+   if (rdev-family = CHIP_CAYMAN)
+   tmp = rdev-config.cayman.tile_config;
+   else
+   tmp = rdev-config.evergreen.tile_config;
+
+   switch ((tmp  0xf0)  4) {
+   case 0: /* 4 banks */
+   fb_format |= 
EVERGREEN_GRPH_NUM_BANKS(EVERGREEN_ADDR_SURF_4_BANK);
+   break;
+   case 1: /* 8 banks */
+   default:
+   fb_format |= 
EVERGREEN_GRPH_NUM_BANKS(EVERGREEN_ADDR_SURF_8_BANK);
+   break;
+   case 2: /* 16 banks */
+   fb_format |= 
EVERGREEN_GRPH_NUM_BANKS(EVERGREEN_ADDR_SURF_16_BANK);
+   break;
+   }
+
+   switch ((tmp  0xf000)  12) {
+   case 0: /* 1KB rows */
+   default:
+   fb_format |= 
EVERGREEN_GRPH_TILE_SPLIT(EVERGREEN_ADDR_SURF_TILE_SPLIT_1KB);
+   break;
+   case 1: /* 2KB rows */
+   fb_format |= 
EVERGREEN_GRPH_TILE_SPLIT(EVERGREEN_ADDR_SURF_TILE_SPLIT_2KB);
+   break;
+   case 2: /* 4KB rows */
+   fb_format |= 
EVERGREEN_GRPH_TILE_SPLIT(EVERGREEN_ADDR_SURF_TILE_SPLIT_4KB);
+   break;
+   }
+
fb_format |= 
EVERGREEN_GRPH_ARRAY_MODE(EVERGREEN_GRPH_ARRAY_2D_TILED_THIN1);
-   else if (tiling_flags  RADEON_TILING_MICRO)
+   } else if (tiling_flags  RADEON_TILING_MICRO)
fb_format |= 
EVERGREEN_GRPH_ARRAY_MODE(EVERGREEN_GRPH_ARRAY_1D_TILED_THIN1);
 
switch (radeon_crtc-crtc_id) {
diff --git a/drivers/gpu/drm/radeon/evergreen_reg.h 
b/drivers/gpu/drm/radeon/evergreen_reg.h
index c781c92..7d7f215 100644
--- a/drivers/gpu/drm/radeon/evergreen_reg.h
+++ b/drivers/gpu/drm/radeon/evergreen_reg.h
@@ -42,6 +42,17 @@
 #   define EVERGREEN_GRPH_DEPTH_8BPP0
 #   define EVERGREEN_GRPH_DEPTH_16BPP   1
 #   define EVERGREEN_GRPH_DEPTH_32BPP   2
+#   define EVERGREEN_GRPH_NUM_BANKS(x)  (((x)  0x3)  2)
+#   define EVERGREEN_ADDR_SURF_2_BANK   0
+#   define EVERGREEN_ADDR_SURF_4_BANK   1
+#   define EVERGREEN_ADDR_SURF_8_BANK   2
+#   define EVERGREEN_ADDR_SURF_16_BANK  3
+#   define EVERGREEN_GRPH_Z(x)  (((x)  0x3)  4)
+#   define EVERGREEN_GRPH_BANK_WIDTH(x) (((x)  0x3)  6)
+#   define EVERGREEN_ADDR_SURF_BANK_WIDTH_1 0
+#   define EVERGREEN_ADDR_SURF_BANK_WIDTH_2 1
+#   define EVERGREEN_ADDR_SURF_BANK_WIDTH_4 2
+#   define EVERGREEN_ADDR_SURF_BANK_WIDTH_8 3
 #   define EVERGREEN_GRPH_FORMAT(x) (((x)  0x7)  8)
 /* 8 BPP */
 #   define EVERGREEN_GRPH_FORMAT_INDEXED0
@@ -61,6 +72,24 @@
 #   define EVERGREEN_GRPH_FORMAT_8B_BGRA1010102 5
 #   define EVERGREEN_GRPH_FORMAT_RGB10  6
 #   define EVERGREEN_GRPH_FORMAT_BGR10  7
+#   define EVERGREEN_GRPH_BANK_HEIGHT(x)(((x)  0x3)  11)
+#   define EVERGREEN_ADDR_SURF_BANK_HEIGHT_10
+#   define EVERGREEN_ADDR_SURF_BANK_HEIGHT_21
+#   define EVERGREEN_ADDR_SURF_BANK_HEIGHT_42
+#   define EVERGREEN_ADDR_SURF_BANK_HEIGHT_83
+#   define EVERGREEN_GRPH_TILE_SPLIT(x) (((x)  0x7)  13)
+#   define EVERGREEN_ADDR_SURF_TILE_SPLIT_64B   0
+#   define EVERGREEN_ADDR_SURF_TILE_SPLIT_128B  1
+#   define EVERGREEN_ADDR_SURF_TILE_SPLIT_256B  2
+#   define EVERGREEN_ADDR_SURF_TILE_SPLIT_512B  3
+#   define EVERGREEN_ADDR_SURF_TILE_SPLIT_1KB   4
+#   define EVERGREEN_ADDR_SURF_TILE_SPLIT_2KB   5
+#   define EVERGREEN_ADDR_SURF_TILE_SPLIT_4KB   6
+#   define EVERGREEN_GRPH_MACRO_TILE_ASPECT(x)  (((x)  0x3)  18)
+#   define EVERGREEN_ADDR_SURF_MACRO_TILE_ASPECT_1  0
+#   define EVERGREEN_ADDR_SURF_MACRO_TILE_ASPECT_2  1
+#   define EVERGREEN_ADDR_SURF_MACRO_TILE_ASPECT_4  2