[prev in list] [next in list] [prev in thread] [next in thread] 

List:       dri-devel
Subject:    Re: [PATCH] drm/radeon: fixes for r6xx/r7xx gfx init
From:       Alex Deucher <alexdeucher () gmail ! com>
Date:       2010-02-19 21:27:37
Message-ID: a728f9f91002191327r1da7c925t69e01b0704f0f91a () mail ! gmail ! com
[Download RAW message or body]

Updated patches attached.  I split out the RV740 so we can hopefully
get that into 2.6.33.  The other one can soak in radeon-drm-testing to
make sure there are no regressions.

Alex

On Fri, Feb 19, 2010 at 1:54 AM, Alex Deucher <alexdeucher@gmail.com> wrote:
> From e69022ade813cb26d64719d7a402459ddfc401b3 Mon Sep 17 00:00:00 2001
> From: Alex Deucher <alexdeucher@gmail.com>
> Date: Fri, 19 Feb 2010 01:51:55 -0500
> Subject: [PATCH] drm/radeon: fixes for r6xx/r7xx gfx init
> 
> - RV740 requires a special backend map
> - updated swizzle modes for backend map setup
> - fix programming of a few gfx regs
> - properly handle pipe/backend setup on LE cards
> 
> Among other thing this fixes occlusion queries and
> rendering errors on RV740.
> 
> Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
> ---
> drivers/gpu/drm/radeon/r600.c    |   41 ++++---
> drivers/gpu/drm/radeon/r600_cp.c |  227 ++++++++++++++++++++++++++------------
> drivers/gpu/drm/radeon/rv770.c   |  215 +++++++++++++++++++++++++-----------
> 3 files changed, 331 insertions(+), 152 deletions(-)
> 
> diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
> index a865946..514cf98 100644
> --- a/drivers/gpu/drm/radeon/r600.c
> +++ b/drivers/gpu/drm/radeon/r600.c
> @@ -973,6 +973,9 @@ void r600_gpu_init(struct radeon_device *rdev)
> {
> u32 tiling_config;
> u32 ramcfg;
> +       u32 backend_map;
> +       u32 cc_rb_backend_disable;
> +       u32 cc_gc_shader_pipe_config;
> u32 tmp;
> int i, j;
> u32 sq_config;
> @@ -1069,23 +1072,20 @@ void r600_gpu_init(struct radeon_device *rdev)
> switch (rdev->config.r600.max_tile_pipes) {
> case 1:
> tiling_config |= PIPE_TILING(0);
> -               rdev->config.r600.tiling_npipes = 1;
> break;
> case 2:
> tiling_config |= PIPE_TILING(1);
> -               rdev->config.r600.tiling_npipes = 2;
> break;
> case 4:
> tiling_config |= PIPE_TILING(2);
> -               rdev->config.r600.tiling_npipes = 4;
> break;
> case 8:
> tiling_config |= PIPE_TILING(3);
> -               rdev->config.r600.tiling_npipes = 8;
> break;
> default:
> break;
> }
> +       rdev->config.r600.tiling_npipes = rdev->config.r600.max_tile_pipes;
> rdev->config.r600.tiling_nbanks = 4 << ((ramcfg & NOOFBANK_MASK) >>
> NOOFBANK_SHIFT);
> tiling_config |= BANK_TILING((ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT);
> tiling_config |= GROUP_SIZE(0);
> @@ -1099,24 +1099,33 @@ void r600_gpu_init(struct radeon_device *rdev)
> tiling_config |= SAMPLE_SPLIT(tmp);
> }
> tiling_config |= BANK_SWAPS(1);
> -       tmp = r600_get_tile_pipe_to_backend_map(rdev->config.r600.max_tile_pipes,
> -                                               rdev->config.r600.max_backends,
> -                                               (0xff << \
>                 rdev->config.r600.max_backends) & 0xff);
> -       tiling_config |= BACKEND_MAP(tmp);
> +
> +       cc_rb_backend_disable = RREG32(CC_RB_BACKEND_DISABLE) & 0x00ff0000;
> +       cc_rb_backend_disable |=
> +               BACKEND_DISABLE((R6XX_MAX_BACKENDS_MASK <<
> rdev->config.r600.max_backends) & R6XX_MAX_BACKENDS_MASK);
> +
> +       cc_gc_shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffffff00;
> +       cc_gc_shader_pipe_config |=
> +               INACTIVE_QD_PIPES((R6XX_MAX_PIPES_MASK <<
> rdev->config.r600.max_pipes) & R6XX_MAX_PIPES_MASK);
> +       cc_gc_shader_pipe_config |=
> +               INACTIVE_SIMDS((R6XX_MAX_SIMDS_MASK << rdev->config.r600.max_simds)
> & R6XX_MAX_SIMDS_MASK);
> +
> +       backend_map =
> r600_get_tile_pipe_to_backend_map(rdev->config.r600.max_tile_pipes,
> +                                                       (R6XX_MAX_BACKENDS -
> +                                                        \
> r600_count_pipe_bits((cc_rb_backend_disable & +                                     \
> R6XX_MAX_BACKENDS_MASK) >> 16)), +                                                  \
> (cc_rb_backend_disable >> 16)); +
> +       tiling_config |= BACKEND_MAP(backend_map);
> WREG32(GB_TILING_CONFIG, tiling_config);
> WREG32(DCP_TILING_CONFIG, tiling_config & 0xffff);
> WREG32(HDP_TILING_CONFIG, tiling_config & 0xffff);
> 
> -       tmp = BACKEND_DISABLE((R6XX_MAX_BACKENDS_MASK <<
> rdev->config.r600.max_backends) & R6XX_MAX_BACKENDS_MASK);
> -       WREG32(CC_RB_BACKEND_DISABLE, tmp);
> -
> /* Setup pipes */
> -       tmp = INACTIVE_QD_PIPES((R6XX_MAX_PIPES_MASK <<
> rdev->config.r600.max_pipes) & R6XX_MAX_PIPES_MASK);
> -       tmp |= INACTIVE_SIMDS((R6XX_MAX_SIMDS_MASK <<
> rdev->config.r600.max_simds) & R6XX_MAX_SIMDS_MASK);
> -       WREG32(CC_GC_SHADER_PIPE_CONFIG, tmp);
> -       WREG32(GC_USER_SHADER_PIPE_CONFIG, tmp);
> +       WREG32(CC_RB_BACKEND_DISABLE, cc_rb_backend_disable);
> +       WREG32(CC_GC_SHADER_PIPE_CONFIG, cc_gc_shader_pipe_config);
> 
> -       tmp = R6XX_MAX_BACKENDS - r600_count_pipe_bits(tmp & \
> INACTIVE_QD_PIPES_MASK); +       tmp = R6XX_MAX_PIPES -
> r600_count_pipe_bits((cc_gc_shader_pipe_config &
> INACTIVE_QD_PIPES_MASK) >> 8);
> WREG32(VGT_OUT_DEALLOC_CNTL, (tmp * 4) & DEALLOC_DIST_MASK);
> WREG32(VGT_VERTEX_REUSE_BLOCK_CNTL, ((tmp * 4) - 2) & VTX_REUSE_DEPTH_MASK);
> 
> diff --git a/drivers/gpu/drm/radeon/r600_cp.c b/drivers/gpu/drm/radeon/r600_cp.c
> index d9712a1..5eca98f 100644
> --- a/drivers/gpu/drm/radeon/r600_cp.c
> +++ b/drivers/gpu/drm/radeon/r600_cp.c
> @@ -734,8 +734,8 @@ static void r600_gfx_init(struct drm_device *dev,
> u32 hdp_host_path_cntl;
> u32 backend_map;
> u32 gb_tiling_config = 0;
> -       u32 cc_rb_backend_disable = 0;
> -       u32 cc_gc_shader_pipe_config = 0;
> +       u32 cc_rb_backend_disable;
> +       u32 cc_gc_shader_pipe_config;
> u32 ramcfg;
> 
> /* setup chip specs */
> @@ -857,18 +857,22 @@ static void r600_gfx_init(struct drm_device *dev,
> 
> gb_tiling_config |= R600_BANK_SWAPS(1);
> 
> -       backend_map = \
>                 r600_get_tile_pipe_to_backend_map(dev_priv->r600_max_tile_pipes,
> -                                                       \
>                 dev_priv->r600_max_backends,
> -                                                       (0xff << \
>                 dev_priv->r600_max_backends) & 0xff);
> -       gb_tiling_config |= R600_BACKEND_MAP(backend_map);
> +       cc_rb_backend_disable = RADEON_READ(R600_CC_RB_BACKEND_DISABLE) & \
> 0x00ff0000; +       cc_rb_backend_disable |=
> +               R600_BACKEND_DISABLE((R6XX_MAX_BACKENDS_MASK <<
> dev_priv->r600_max_backends) & R6XX_MAX_BACKENDS_MASK);
> 
> -       cc_gc_shader_pipe_config =
> +       cc_gc_shader_pipe_config =
> RADEON_READ(R600_CC_GC_SHADER_PIPE_CONFIG) & 0xffffff00;
> +       cc_gc_shader_pipe_config |=
> R600_INACTIVE_QD_PIPES((R6XX_MAX_PIPES_MASK <<
> dev_priv->r600_max_pipes) & R6XX_MAX_PIPES_MASK);
> cc_gc_shader_pipe_config |=
> R600_INACTIVE_SIMDS((R6XX_MAX_SIMDS_MASK <<
> dev_priv->r600_max_simds) & R6XX_MAX_SIMDS_MASK);
> 
> -       cc_rb_backend_disable =
> -               R600_BACKEND_DISABLE((R6XX_MAX_BACKENDS_MASK <<
> dev_priv->r600_max_backends) & R6XX_MAX_BACKENDS_MASK);
> +       backend_map = \
> r600_get_tile_pipe_to_backend_map(dev_priv->r600_max_tile_pipes, +                  \
> (R6XX_MAX_BACKENDS - +                                                        \
> r600_count_pipe_bits((cc_rb_backend_disable & +                                     \
> R6XX_MAX_BACKENDS_MASK) >> 16)), +                                                  \
> (cc_rb_backend_disable >> 16)); +       gb_tiling_config |= \
> R600_BACKEND_MAP(backend_map); 
> RADEON_WRITE(R600_GB_TILING_CONFIG,      gb_tiling_config);
> RADEON_WRITE(R600_DCP_TILING_CONFIG,    (gb_tiling_config & 0xffff));
> @@ -890,7 +894,7 @@ static void r600_gfx_init(struct drm_device *dev,
> RADEON_WRITE(R600_GC_USER_SHADER_PIPE_CONFIG, cc_gc_shader_pipe_config);
> 
> num_qd_pipes =
> -               R6XX_MAX_BACKENDS - r600_count_pipe_bits(cc_gc_shader_pipe_config &
> R600_INACTIVE_QD_PIPES_MASK);
> +               R6XX_MAX_PIPES - r600_count_pipe_bits((cc_gc_shader_pipe_config &
> R600_INACTIVE_QD_PIPES_MASK) >> 8);
> RADEON_WRITE(R600_VGT_OUT_DEALLOC_CNTL, (num_qd_pipes * 4) &
> R600_DEALLOC_DIST_MASK);
> RADEON_WRITE(R600_VGT_VERTEX_REUSE_BLOCK_CNTL, ((num_qd_pipes * 4) -
> 2) & R600_VTX_REUSE_DEPTH_MASK);
> 
> @@ -1162,7 +1166,8 @@ static void r600_gfx_init(struct drm_device *dev,
> 
> }
> 
> -static u32 r700_get_tile_pipe_to_backend_map(u32 num_tile_pipes,
> +static u32 r700_get_tile_pipe_to_backend_map(drm_radeon_private_t *dev_priv,
> +                                            u32 num_tile_pipes,
> u32 num_backends,
> u32 backend_disable_mask)
> {
> @@ -1173,6 +1178,7 @@ static u32 r700_get_tile_pipe_to_backend_map(u32
> num_tile_pipes,
> u32 swizzle_pipe[R7XX_MAX_PIPES];
> u32 cur_backend;
> u32 i;
> +       bool force_no_swizzle;
> 
> if (num_tile_pipes > R7XX_MAX_PIPES)
> num_tile_pipes = R7XX_MAX_PIPES;
> @@ -1202,6 +1208,18 @@ static u32
> r700_get_tile_pipe_to_backend_map(u32 num_tile_pipes,
> if (enabled_backends_count != num_backends)
> num_backends = enabled_backends_count;
> 
> +       switch (dev_priv->flags & RADEON_FAMILY_MASK) {
> +       case CHIP_RV770:
> +       case CHIP_RV730:
> +               force_no_swizzle = false;
> +               break;
> +       case CHIP_RV710:
> +       case CHIP_RV740:
> +       default:
> +               force_no_swizzle = true;
> +               break;
> +       }
> +
> memset((uint8_t *)&swizzle_pipe[0], 0, sizeof(u32) * R7XX_MAX_PIPES);
> switch (num_tile_pipes) {
> case 1:
> @@ -1212,49 +1230,100 @@ static u32
> r700_get_tile_pipe_to_backend_map(u32 num_tile_pipes,
> swizzle_pipe[1] = 1;
> break;
> case 3:
> -               swizzle_pipe[0] = 0;
> -               swizzle_pipe[1] = 2;
> -               swizzle_pipe[2] = 1;
> +               if (force_no_swizzle) {
> +                       swizzle_pipe[0] = 0;
> +                       swizzle_pipe[1] = 1;
> +                       swizzle_pipe[2] = 2;
> +               } else {
> +                       swizzle_pipe[0] = 0;
> +                       swizzle_pipe[1] = 2;
> +                       swizzle_pipe[2] = 1;
> +               }
> break;
> case 4:
> -               swizzle_pipe[0] = 0;
> -               swizzle_pipe[1] = 2;
> -               swizzle_pipe[2] = 3;
> -               swizzle_pipe[3] = 1;
> +               if (force_no_swizzle) {
> +                       swizzle_pipe[0] = 0;
> +                       swizzle_pipe[1] = 1;
> +                       swizzle_pipe[2] = 2;
> +                       swizzle_pipe[3] = 3;
> +               } else {
> +                       swizzle_pipe[0] = 0;
> +                       swizzle_pipe[1] = 2;
> +                       swizzle_pipe[2] = 3;
> +                       swizzle_pipe[3] = 1;
> +               }
> break;
> case 5:
> -               swizzle_pipe[0] = 0;
> -               swizzle_pipe[1] = 2;
> -               swizzle_pipe[2] = 4;
> -               swizzle_pipe[3] = 1;
> -               swizzle_pipe[4] = 3;
> +               if (force_no_swizzle) {
> +                       swizzle_pipe[0] = 0;
> +                       swizzle_pipe[1] = 1;
> +                       swizzle_pipe[2] = 2;
> +                       swizzle_pipe[3] = 3;
> +                       swizzle_pipe[4] = 4;
> +               } else {
> +                       swizzle_pipe[0] = 0;
> +                       swizzle_pipe[1] = 2;
> +                       swizzle_pipe[2] = 4;
> +                       swizzle_pipe[3] = 1;
> +                       swizzle_pipe[4] = 3;
> +               }
> break;
> case 6:
> -               swizzle_pipe[0] = 0;
> -               swizzle_pipe[1] = 2;
> -               swizzle_pipe[2] = 4;
> -               swizzle_pipe[3] = 5;
> -               swizzle_pipe[4] = 3;
> -               swizzle_pipe[5] = 1;
> +               if (force_no_swizzle) {
> +                       swizzle_pipe[0] = 0;
> +                       swizzle_pipe[1] = 1;
> +                       swizzle_pipe[2] = 2;
> +                       swizzle_pipe[3] = 3;
> +                       swizzle_pipe[4] = 4;
> +                       swizzle_pipe[5] = 5;
> +               } else {
> +                       swizzle_pipe[0] = 0;
> +                       swizzle_pipe[1] = 2;
> +                       swizzle_pipe[2] = 4;
> +                       swizzle_pipe[3] = 5;
> +                       swizzle_pipe[4] = 3;
> +                       swizzle_pipe[5] = 1;
> +               }
> break;
> case 7:
> -               swizzle_pipe[0] = 0;
> -               swizzle_pipe[1] = 2;
> -               swizzle_pipe[2] = 4;
> -               swizzle_pipe[3] = 6;
> -               swizzle_pipe[4] = 3;
> -               swizzle_pipe[5] = 1;
> -               swizzle_pipe[6] = 5;
> +               if (force_no_swizzle) {
> +                       swizzle_pipe[0] = 0;
> +                       swizzle_pipe[1] = 1;
> +                       swizzle_pipe[2] = 2;
> +                       swizzle_pipe[3] = 3;
> +                       swizzle_pipe[4] = 4;
> +                       swizzle_pipe[5] = 5;
> +                       swizzle_pipe[6] = 6;
> +               } else {
> +                       swizzle_pipe[0] = 0;
> +                       swizzle_pipe[1] = 2;
> +                       swizzle_pipe[2] = 4;
> +                       swizzle_pipe[3] = 6;
> +                       swizzle_pipe[4] = 3;
> +                       swizzle_pipe[5] = 1;
> +                       swizzle_pipe[6] = 5;
> +               }
> break;
> case 8:
> -               swizzle_pipe[0] = 0;
> -               swizzle_pipe[1] = 2;
> -               swizzle_pipe[2] = 4;
> -               swizzle_pipe[3] = 6;
> -               swizzle_pipe[4] = 3;
> -               swizzle_pipe[5] = 1;
> -               swizzle_pipe[6] = 7;
> -               swizzle_pipe[7] = 5;
> +               if (force_no_swizzle) {
> +                       swizzle_pipe[0] = 0;
> +                       swizzle_pipe[1] = 1;
> +                       swizzle_pipe[2] = 2;
> +                       swizzle_pipe[3] = 3;
> +                       swizzle_pipe[4] = 4;
> +                       swizzle_pipe[5] = 5;
> +                       swizzle_pipe[6] = 6;
> +                       swizzle_pipe[7] = 7;
> +               } else {
> +                       swizzle_pipe[0] = 0;
> +                       swizzle_pipe[1] = 2;
> +                       swizzle_pipe[2] = 4;
> +                       swizzle_pipe[3] = 6;
> +                       swizzle_pipe[4] = 3;
> +                       swizzle_pipe[5] = 1;
> +                       swizzle_pipe[6] = 7;
> +                       swizzle_pipe[7] = 5;
> +               }
> break;
> }
> 
> @@ -1275,8 +1344,10 @@ static void r700_gfx_init(struct drm_device *dev,
> drm_radeon_private_t *dev_priv)
> {
> int i, j, num_qd_pipes;
> +       u32 ta_aux_cntl;
> u32 sx_debug_1;
> u32 smx_dc_ctl0;
> +       u32 db_debug3;
> u32 num_gs_verts_per_thread;
> u32 vgt_gs_per_es;
> u32 gs_prim_buffer_depth = 0;
> @@ -1287,8 +1358,8 @@ static void r700_gfx_init(struct drm_device *dev,
> u32 sq_dyn_gpr_size_simd_ab_0;
> u32 backend_map;
> u32 gb_tiling_config = 0;
> -       u32 cc_rb_backend_disable = 0;
> -       u32 cc_gc_shader_pipe_config = 0;
> +       u32 cc_rb_backend_disable;
> +       u32 cc_gc_shader_pipe_config;
> u32 mc_arb_ramcfg;
> u32 db_debug4;
> 
> @@ -1439,18 +1510,26 @@ static void r700_gfx_init(struct drm_device *dev,
> 
> gb_tiling_config |= R600_BANK_SWAPS(1);
> 
> -       backend_map = \
>                 r700_get_tile_pipe_to_backend_map(dev_priv->r600_max_tile_pipes,
> -                                                       \
>                 dev_priv->r600_max_backends,
> -                                                       (0xff << \
>                 dev_priv->r600_max_backends) & 0xff);
> -       gb_tiling_config |= R600_BACKEND_MAP(backend_map);
> +       cc_rb_backend_disable = RADEON_READ(R600_CC_RB_BACKEND_DISABLE) & \
> 0x00ff0000; +       cc_rb_backend_disable |=
> +               R600_BACKEND_DISABLE((R7XX_MAX_BACKENDS_MASK <<
> dev_priv->r600_max_backends) & R7XX_MAX_BACKENDS_MASK);
> 
> -       cc_gc_shader_pipe_config =
> +       cc_gc_shader_pipe_config =
> RADEON_READ(R600_CC_GC_SHADER_PIPE_CONFIG) & 0xffffff00;
> +       cc_gc_shader_pipe_config |=
> R600_INACTIVE_QD_PIPES((R7XX_MAX_PIPES_MASK <<
> dev_priv->r600_max_pipes) & R7XX_MAX_PIPES_MASK);
> cc_gc_shader_pipe_config |=
> R600_INACTIVE_SIMDS((R7XX_MAX_SIMDS_MASK <<
> dev_priv->r600_max_simds) & R7XX_MAX_SIMDS_MASK);
> 
> -       cc_rb_backend_disable =
> -               R600_BACKEND_DISABLE((R7XX_MAX_BACKENDS_MASK <<
> dev_priv->r600_max_backends) & R7XX_MAX_BACKENDS_MASK);
> +       /* RV740 has a special backend map */
> +       if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV740)
> +               backend_map = 0x28;
> +       else
> +               backend_map = r700_get_tile_pipe_to_backend_map(dev_priv,
> +                                                               \
> dev_priv->r600_max_tile_pipes, +                                                    \
> dev_priv->r600_max_backends, +                                                      \
> ((R7XX_MAX_BACKENDS_MASK << dev_priv->r600_max_backends) +                          \
> & R7XX_MAX_BACKENDS_MASK)); +       gb_tiling_config |= \
> R600_BACKEND_MAP(backend_map); 
> RADEON_WRITE(R600_GB_TILING_CONFIG,      gb_tiling_config);
> RADEON_WRITE(R600_DCP_TILING_CONFIG,    (gb_tiling_config & 0xffff));
> @@ -1474,11 +1553,9 @@ static void r700_gfx_init(struct drm_device *dev,
> RADEON_WRITE(R700_CC_SYS_RB_BACKEND_DISABLE, cc_rb_backend_disable);
> RADEON_WRITE(R700_CGTS_SYS_TCC_DISABLE, 0);
> RADEON_WRITE(R700_CGTS_TCC_DISABLE, 0);
> -       RADEON_WRITE(R700_CGTS_USER_SYS_TCC_DISABLE, 0);
> -       RADEON_WRITE(R700_CGTS_USER_TCC_DISABLE, 0);
> 
> num_qd_pipes =
> -               R7XX_MAX_BACKENDS - r600_count_pipe_bits(cc_gc_shader_pipe_config &
> R600_INACTIVE_QD_PIPES_MASK);
> +               R7XX_MAX_PIPES - r600_count_pipe_bits((cc_gc_shader_pipe_config &
> R600_INACTIVE_QD_PIPES_MASK) >> 8);
> RADEON_WRITE(R600_VGT_OUT_DEALLOC_CNTL, (num_qd_pipes * 4) &
> R600_DEALLOC_DIST_MASK);
> RADEON_WRITE(R600_VGT_VERTEX_REUSE_BLOCK_CNTL, ((num_qd_pipes * 4) -
> 2) & R600_VTX_REUSE_DEPTH_MASK);
> 
> @@ -1488,10 +1565,8 @@ static void r700_gfx_init(struct drm_device *dev,
> 
> RADEON_WRITE(R600_CP_MEQ_THRESHOLDS, R700_STQ_SPLIT(0x30));
> 
> -       RADEON_WRITE(R600_TA_CNTL_AUX, (R600_DISABLE_CUBE_ANISO |
> -                                       R600_SYNC_GRADIENT |
> -                                       R600_SYNC_WALKER |
> -                                       R600_SYNC_ALIGNER));
> +       ta_aux_cntl = RADEON_READ(R600_TA_CNTL_AUX);
> +       RADEON_WRITE(R600_TA_CNTL_AUX, ta_aux_cntl | R600_DISABLE_CUBE_ANISO);
> 
> sx_debug_1 = RADEON_READ(R700_SX_DEBUG_1);
> sx_debug_1 |= R700_ENABLE_NEW_SMX_ADDRESS;
> @@ -1502,14 +1577,28 @@ static void r700_gfx_init(struct drm_device *dev,
> smx_dc_ctl0 |= R700_CACHE_DEPTH((dev_priv->r700_sx_num_of_sets * 64) - 1);
> RADEON_WRITE(R600_SMX_DC_CTL0, smx_dc_ctl0);
> 
> -       RADEON_WRITE(R700_SMX_EVENT_CTL, (R700_ES_FLUSH_CTL(4) |
> -                                         R700_GS_FLUSH_CTL(4) |
> -                                         R700_ACK_FLUSH_CTL(3) |
> -                                         R700_SYNC_FLUSH_CTL));
> +       if ((dev_priv->flags & RADEON_FAMILY_MASK) != CHIP_RV740)
> +               RADEON_WRITE(R700_SMX_EVENT_CTL, (R700_ES_FLUSH_CTL(4) |
> +                                                 R700_GS_FLUSH_CTL(4) |
> +                                                 R700_ACK_FLUSH_CTL(3) |
> +                                                 R700_SYNC_FLUSH_CTL));
> 
> -       if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV770)
> -               RADEON_WRITE(R700_DB_DEBUG3, R700_DB_CLK_OFF_DELAY(0x1f));
> -       else {
> +       db_debug3 = RADEON_READ(R700_DB_DEBUG3);
> +       db_debug3 &= ~R700_DB_CLK_OFF_DELAY(0x1f);
> +       switch (dev_priv->flags & RADEON_FAMILY_MASK) {
> +       case CHIP_RV770:
> +       case CHIP_RV740:
> +               db_debug3 |= R700_DB_CLK_OFF_DELAY(0x1f);
> +               break;
> +       case CHIP_RV710:
> +       case CHIP_RV730:
> +       default:
> +               db_debug3 |= R700_DB_CLK_OFF_DELAY(2);
> +               break;
> +       }
> +       RADEON_WRITE(R700_DB_DEBUG3, db_debug3);
> +
> +       if ((dev_priv->flags & RADEON_FAMILY_MASK) != CHIP_RV770) {
> db_debug4 = RADEON_READ(RV700_DB_DEBUG4);
> db_debug4 |= RV700_DISABLE_TILE_COVERED_FOR_PS_ITER;
> RADEON_WRITE(RV700_DB_DEBUG4, db_debug4);
> @@ -1538,10 +1627,10 @@ static void r700_gfx_init(struct drm_device *dev,
> R600_ALU_UPDATE_FIFO_HIWATER(0x8));
> switch (dev_priv->flags & RADEON_FAMILY_MASK) {
> case CHIP_RV770:
> -               sq_ms_fifo_sizes |= R600_FETCH_FIFO_HIWATER(0x1);
> -               break;
> case CHIP_RV730:
> case CHIP_RV710:
> +               sq_ms_fifo_sizes |= R600_FETCH_FIFO_HIWATER(0x1);
> +               break;
> case CHIP_RV740:
> default:
> sq_ms_fifo_sizes |= R600_FETCH_FIFO_HIWATER(0x4);
> diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c
> index fbec052..cffc4fa 100644
> --- a/drivers/gpu/drm/radeon/rv770.c
> +++ b/drivers/gpu/drm/radeon/rv770.c
> @@ -274,9 +274,10 @@ static int rv770_cp_load_microcode(struct
> radeon_device *rdev)
> /*
> * Core functions
> */
> -static u32 r700_get_tile_pipe_to_backend_map(u32 num_tile_pipes,
> -                                               u32 num_backends,
> -                                               u32 backend_disable_mask)
> +static u32 r700_get_tile_pipe_to_backend_map(struct radeon_device *rdev,
> +                                            u32 num_tile_pipes,
> +                                            u32 num_backends,
> +                                            u32 backend_disable_mask)
> {
> u32 backend_map = 0;
> u32 enabled_backends_mask;
> @@ -285,6 +286,7 @@ static u32 r700_get_tile_pipe_to_backend_map(u32
> num_tile_pipes,
> u32 swizzle_pipe[R7XX_MAX_PIPES];
> u32 cur_backend;
> u32 i;
> +       bool force_no_swizzle;
> 
> if (num_tile_pipes > R7XX_MAX_PIPES)
> num_tile_pipes = R7XX_MAX_PIPES;
> @@ -314,6 +316,18 @@ static u32 r700_get_tile_pipe_to_backend_map(u32
> num_tile_pipes,
> if (enabled_backends_count != num_backends)
> num_backends = enabled_backends_count;
> 
> +       switch (rdev->family) {
> +       case CHIP_RV770:
> +       case CHIP_RV730:
> +               force_no_swizzle = false;
> +               break;
> +       case CHIP_RV710:
> +       case CHIP_RV740:
> +       default:
> +               force_no_swizzle = true;
> +               break;
> +       }
> +
> memset((uint8_t *)&swizzle_pipe[0], 0, sizeof(u32) * R7XX_MAX_PIPES);
> switch (num_tile_pipes) {
> case 1:
> @@ -324,49 +338,100 @@ static u32
> r700_get_tile_pipe_to_backend_map(u32 num_tile_pipes,
> swizzle_pipe[1] = 1;
> break;
> case 3:
> -               swizzle_pipe[0] = 0;
> -               swizzle_pipe[1] = 2;
> -               swizzle_pipe[2] = 1;
> +               if (force_no_swizzle) {
> +                       swizzle_pipe[0] = 0;
> +                       swizzle_pipe[1] = 1;
> +                       swizzle_pipe[2] = 2;
> +               } else {
> +                       swizzle_pipe[0] = 0;
> +                       swizzle_pipe[1] = 2;
> +                       swizzle_pipe[2] = 1;
> +               }
> break;
> case 4:
> -               swizzle_pipe[0] = 0;
> -               swizzle_pipe[1] = 2;
> -               swizzle_pipe[2] = 3;
> -               swizzle_pipe[3] = 1;
> +               if (force_no_swizzle) {
> +                       swizzle_pipe[0] = 0;
> +                       swizzle_pipe[1] = 1;
> +                       swizzle_pipe[2] = 2;
> +                       swizzle_pipe[3] = 3;
> +               } else {
> +                       swizzle_pipe[0] = 0;
> +                       swizzle_pipe[1] = 2;
> +                       swizzle_pipe[2] = 3;
> +                       swizzle_pipe[3] = 1;
> +               }
> break;
> case 5:
> -               swizzle_pipe[0] = 0;
> -               swizzle_pipe[1] = 2;
> -               swizzle_pipe[2] = 4;
> -               swizzle_pipe[3] = 1;
> -               swizzle_pipe[4] = 3;
> +               if (force_no_swizzle) {
> +                       swizzle_pipe[0] = 0;
> +                       swizzle_pipe[1] = 1;
> +                       swizzle_pipe[2] = 2;
> +                       swizzle_pipe[3] = 3;
> +                       swizzle_pipe[4] = 4;
> +               } else {
> +                       swizzle_pipe[0] = 0;
> +                       swizzle_pipe[1] = 2;
> +                       swizzle_pipe[2] = 4;
> +                       swizzle_pipe[3] = 1;
> +                       swizzle_pipe[4] = 3;
> +               }
> break;
> case 6:
> -               swizzle_pipe[0] = 0;
> -               swizzle_pipe[1] = 2;
> -               swizzle_pipe[2] = 4;
> -               swizzle_pipe[3] = 5;
> -               swizzle_pipe[4] = 3;
> -               swizzle_pipe[5] = 1;
> +               if (force_no_swizzle) {
> +                       swizzle_pipe[0] = 0;
> +                       swizzle_pipe[1] = 1;
> +                       swizzle_pipe[2] = 2;
> +                       swizzle_pipe[3] = 3;
> +                       swizzle_pipe[4] = 4;
> +                       swizzle_pipe[5] = 5;
> +               } else {
> +                       swizzle_pipe[0] = 0;
> +                       swizzle_pipe[1] = 2;
> +                       swizzle_pipe[2] = 4;
> +                       swizzle_pipe[3] = 5;
> +                       swizzle_pipe[4] = 3;
> +                       swizzle_pipe[5] = 1;
> +               }
> break;
> case 7:
> -               swizzle_pipe[0] = 0;
> -               swizzle_pipe[1] = 2;
> -               swizzle_pipe[2] = 4;
> -               swizzle_pipe[3] = 6;
> -               swizzle_pipe[4] = 3;
> -               swizzle_pipe[5] = 1;
> -               swizzle_pipe[6] = 5;
> +               if (force_no_swizzle) {
> +                       swizzle_pipe[0] = 0;
> +                       swizzle_pipe[1] = 1;
> +                       swizzle_pipe[2] = 2;
> +                       swizzle_pipe[3] = 3;
> +                       swizzle_pipe[4] = 4;
> +                       swizzle_pipe[5] = 5;
> +                       swizzle_pipe[6] = 6;
> +               } else {
> +                       swizzle_pipe[0] = 0;
> +                       swizzle_pipe[1] = 2;
> +                       swizzle_pipe[2] = 4;
> +                       swizzle_pipe[3] = 6;
> +                       swizzle_pipe[4] = 3;
> +                       swizzle_pipe[5] = 1;
> +                       swizzle_pipe[6] = 5;
> +               }
> break;
> case 8:
> -               swizzle_pipe[0] = 0;
> -               swizzle_pipe[1] = 2;
> -               swizzle_pipe[2] = 4;
> -               swizzle_pipe[3] = 6;
> -               swizzle_pipe[4] = 3;
> -               swizzle_pipe[5] = 1;
> -               swizzle_pipe[6] = 7;
> -               swizzle_pipe[7] = 5;
> +               if (force_no_swizzle) {
> +                       swizzle_pipe[0] = 0;
> +                       swizzle_pipe[1] = 1;
> +                       swizzle_pipe[2] = 2;
> +                       swizzle_pipe[3] = 3;
> +                       swizzle_pipe[4] = 4;
> +                       swizzle_pipe[5] = 5;
> +                       swizzle_pipe[6] = 6;
> +                       swizzle_pipe[7] = 7;
> +               } else {
> +                       swizzle_pipe[0] = 0;
> +                       swizzle_pipe[1] = 2;
> +                       swizzle_pipe[2] = 4;
> +                       swizzle_pipe[3] = 6;
> +                       swizzle_pipe[4] = 3;
> +                       swizzle_pipe[5] = 1;
> +                       swizzle_pipe[6] = 7;
> +                       swizzle_pipe[7] = 5;
> +               }
> break;
> }
> 
> @@ -386,8 +451,10 @@ static u32 r700_get_tile_pipe_to_backend_map(u32
> num_tile_pipes,
> static void rv770_gpu_init(struct radeon_device *rdev)
> {
> int i, j, num_qd_pipes;
> +       u32 ta_aux_cntl;
> u32 sx_debug_1;
> u32 smx_dc_ctl0;
> +       u32 db_debug3;
> u32 num_gs_verts_per_thread;
> u32 vgt_gs_per_es;
> u32 gs_prim_buffer_depth = 0;
> @@ -516,24 +583,20 @@ static void rv770_gpu_init(struct radeon_device *rdev)
> 
> switch (rdev->config.rv770.max_tile_pipes) {
> case 1:
> +       default:
> gb_tiling_config |= PIPE_TILING(0);
> -               rdev->config.rv770.tiling_npipes = 1;
> break;
> case 2:
> gb_tiling_config |= PIPE_TILING(1);
> -               rdev->config.rv770.tiling_npipes = 2;
> break;
> case 4:
> gb_tiling_config |= PIPE_TILING(2);
> -               rdev->config.rv770.tiling_npipes = 4;
> break;
> case 8:
> gb_tiling_config |= PIPE_TILING(3);
> -               rdev->config.rv770.tiling_npipes = 8;
> -               break;
> -       default:
> break;
> }
> +       rdev->config.rv770.tiling_npipes = rdev->config.rv770.max_tile_pipes;
> 
> if (rdev->family == CHIP_RV770)
> gb_tiling_config |= BANK_TILING(1);
> @@ -556,18 +619,27 @@ static void rv770_gpu_init(struct radeon_device *rdev)
> 
> gb_tiling_config |= BANK_SWAPS(1);
> 
> -       backend_map =
> r700_get_tile_pipe_to_backend_map(rdev->config.rv770.max_tile_pipes,
> -                                                       \
>                 rdev->config.rv770.max_backends,
> -                                                       (0xff << \
>                 rdev->config.rv770.max_backends) & 0xff);
> -       gb_tiling_config |= BACKEND_MAP(backend_map);
> +       cc_rb_backend_disable = RREG32(CC_RB_BACKEND_DISABLE) & 0x00ff0000;
> +       cc_rb_backend_disable |=
> +               BACKEND_DISABLE((R7XX_MAX_BACKENDS_MASK <<
> rdev->config.rv770.max_backends) & R7XX_MAX_BACKENDS_MASK);
> 
> -       cc_gc_shader_pipe_config =
> +       cc_gc_shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffffff00;
> +       cc_gc_shader_pipe_config |=
> INACTIVE_QD_PIPES((R7XX_MAX_PIPES_MASK <<
> rdev->config.rv770.max_pipes) & R7XX_MAX_PIPES_MASK);
> cc_gc_shader_pipe_config |=
> INACTIVE_SIMDS((R7XX_MAX_SIMDS_MASK <<
> rdev->config.rv770.max_simds) & R7XX_MAX_SIMDS_MASK);
> 
> -       cc_rb_backend_disable =
> -               BACKEND_DISABLE((R7XX_MAX_BACKENDS_MASK <<
> rdev->config.rv770.max_backends) & R7XX_MAX_BACKENDS_MASK);
> +       /* RV740 has a special backend map */
> +       if (rdev->family == CHIP_RV740)
> +               backend_map = 0x28;
> +       else
> +               backend_map = r700_get_tile_pipe_to_backend_map(rdev,
> +                                                               \
> rdev->config.rv770.max_tile_pipes, +                                                \
> (R7XX_MAX_BACKENDS - +                                                              \
> r600_count_pipe_bits((cc_rb_backend_disable & +                                     \
> R7XX_MAX_BACKENDS_MASK) >> 16)), +                                                  \
> (cc_rb_backend_disable >> 16)); +       gb_tiling_config |= \
> BACKEND_MAP(backend_map); 
> WREG32(GB_TILING_CONFIG, gb_tiling_config);
> WREG32(DCP_TILING_CONFIG, (gb_tiling_config & 0xffff));
> @@ -575,16 +647,13 @@ static void rv770_gpu_init(struct radeon_device *rdev)
> 
> WREG32(CC_RB_BACKEND_DISABLE,      cc_rb_backend_disable);
> WREG32(CC_GC_SHADER_PIPE_CONFIG,   cc_gc_shader_pipe_config);
> -       WREG32(GC_USER_SHADER_PIPE_CONFIG, cc_gc_shader_pipe_config);
> +       WREG32(CC_SYS_RB_BACKEND_DISABLE,  cc_rb_backend_disable);
> 
> -       WREG32(CC_SYS_RB_BACKEND_DISABLE, cc_rb_backend_disable);
> WREG32(CGTS_SYS_TCC_DISABLE, 0);
> WREG32(CGTS_TCC_DISABLE, 0);
> -       WREG32(CGTS_USER_SYS_TCC_DISABLE, 0);
> -       WREG32(CGTS_USER_TCC_DISABLE, 0);
> 
> num_qd_pipes =
> -               R7XX_MAX_BACKENDS - r600_count_pipe_bits(cc_gc_shader_pipe_config &
> INACTIVE_QD_PIPES_MASK);
> +               R7XX_MAX_PIPES - r600_count_pipe_bits((cc_gc_shader_pipe_config &
> INACTIVE_QD_PIPES_MASK) >> 8);
> WREG32(VGT_OUT_DEALLOC_CNTL, (num_qd_pipes * 4) & DEALLOC_DIST_MASK);
> WREG32(VGT_VERTEX_REUSE_BLOCK_CNTL, ((num_qd_pipes * 4) - 2) &
> VTX_REUSE_DEPTH_MASK);
> 
> @@ -594,10 +663,8 @@ static void rv770_gpu_init(struct radeon_device *rdev)
> 
> WREG32(CP_MEQ_THRESHOLDS, STQ_SPLIT(0x30));
> 
> -       WREG32(TA_CNTL_AUX, (DISABLE_CUBE_ANISO |
> -                            SYNC_GRADIENT |
> -                            SYNC_WALKER |
> -                            SYNC_ALIGNER));
> +       ta_aux_cntl = RREG32(TA_CNTL_AUX);
> +       WREG32(TA_CNTL_AUX, ta_aux_cntl | DISABLE_CUBE_ANISO);
> 
> sx_debug_1 = RREG32(SX_DEBUG_1);
> sx_debug_1 |= ENABLE_NEW_SMX_ADDRESS;
> @@ -608,14 +675,28 @@ static void rv770_gpu_init(struct radeon_device *rdev)
> smx_dc_ctl0 |= CACHE_DEPTH((rdev->config.rv770.sx_num_of_sets * 64) - 1);
> WREG32(SMX_DC_CTL0, smx_dc_ctl0);
> 
> -       WREG32(SMX_EVENT_CTL, (ES_FLUSH_CTL(4) |
> -                              GS_FLUSH_CTL(4) |
> -                              ACK_FLUSH_CTL(3) |
> -                              SYNC_FLUSH_CTL));
> +       if (rdev->family != CHIP_RV740)
> +               WREG32(SMX_EVENT_CTL, (ES_FLUSH_CTL(4) |
> +                                      GS_FLUSH_CTL(4) |
> +                                      ACK_FLUSH_CTL(3) |
> +                                      SYNC_FLUSH_CTL));
> 
> -       if (rdev->family == CHIP_RV770)
> -               WREG32(DB_DEBUG3, DB_CLK_OFF_DELAY(0x1f));
> -       else {
> +       db_debug3 = RREG32(DB_DEBUG3);
> +       db_debug3 &= ~DB_CLK_OFF_DELAY(0x1f);
> +       switch (rdev->family) {
> +       case CHIP_RV770:
> +       case CHIP_RV740:
> +               db_debug3 |= DB_CLK_OFF_DELAY(0x1f);
> +               break;
> +       case CHIP_RV710:
> +       case CHIP_RV730:
> +       default:
> +               db_debug3 |= DB_CLK_OFF_DELAY(2);
> +               break;
> +       }
> +       WREG32(DB_DEBUG3, db_debug3);
> +
> +       if (rdev->family != CHIP_RV770) {
> db_debug4 = RREG32(DB_DEBUG4);
> db_debug4 |= DISABLE_TILE_COVERED_FOR_PS_ITER;
> WREG32(DB_DEBUG4, db_debug4);
> @@ -644,10 +725,10 @@ static void rv770_gpu_init(struct radeon_device *rdev)
> ALU_UPDATE_FIFO_HIWATER(0x8));
> switch (rdev->family) {
> case CHIP_RV770:
> -               sq_ms_fifo_sizes |= FETCH_FIFO_HIWATER(0x1);
> -               break;
> case CHIP_RV730:
> case CHIP_RV710:
> +               sq_ms_fifo_sizes |= FETCH_FIFO_HIWATER(0x1);
> +               break;
> case CHIP_RV740:
> default:
> sq_ms_fifo_sizes |= FETCH_FIFO_HIWATER(0x4);
> --
> 1.5.6.3
> 


["0001-drm-radeon-rv740-fix-backend-setup.patch" (application/mbox)]

From b06f272a2a053f9f6f1d04157a20691dd0a3ea8a Mon Sep 17 00:00:00 2001
From: Alex Deucher <alexdeucher@gmail.com>
Date: Fri, 19 Feb 2010 16:07:02 -0500
Subject: [PATCH] drm/radeon/rv740: fix backend setup

This patch fixes occlusion queries and rendering errors
on rv740 boards. Hardcoding the backend map is not an optimal
solution, but a better fix is being worked on.

Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
---
 drivers/gpu/drm/radeon/r600_cp.c |    9 ++++++---
 drivers/gpu/drm/radeon/rv770.c   |    9 ++++++---
 2 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/radeon/r600_cp.c b/drivers/gpu/drm/radeon/r600_cp.c
index d9712a1..fca96aa 100644
--- a/drivers/gpu/drm/radeon/r600_cp.c
+++ b/drivers/gpu/drm/radeon/r600_cp.c
@@ -1439,9 +1439,12 @@ static void r700_gfx_init(struct drm_device *dev,
 
 	gb_tiling_config |= R600_BANK_SWAPS(1);
 
-	backend_map = r700_get_tile_pipe_to_backend_map(dev_priv->r600_max_tile_pipes,
-							dev_priv->r600_max_backends,
-							(0xff << dev_priv->r600_max_backends) & 0xff);
+	if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV740)
+		backend_map = 0x28;
+	else
+		backend_map = r700_get_tile_pipe_to_backend_map(dev_priv->r600_max_tile_pipes,
+								dev_priv->r600_max_backends,
+								(0xff << dev_priv->r600_max_backends) & 0xff);
 	gb_tiling_config |= R600_BACKEND_MAP(backend_map);
 
 	cc_gc_shader_pipe_config =
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c
index fbec052..26cbf6c 100644
--- a/drivers/gpu/drm/radeon/rv770.c
+++ b/drivers/gpu/drm/radeon/rv770.c
@@ -556,9 +556,12 @@ static void rv770_gpu_init(struct radeon_device *rdev)
 
 	gb_tiling_config |= BANK_SWAPS(1);
 
-	backend_map = r700_get_tile_pipe_to_backend_map(rdev->config.rv770.max_tile_pipes,
-							rdev->config.rv770.max_backends,
-							(0xff << rdev->config.rv770.max_backends) & 0xff);
+	if (rdev->family == CHIP_RV740)
+		backend_map = 0x28;
+	else
+		backend_map = r700_get_tile_pipe_to_backend_map(rdev->config.rv770.max_tile_pipes,
+								rdev->config.rv770.max_backends,
+								(0xff << rdev->config.rv770.max_backends) & 0xff);
 	gb_tiling_config |= BACKEND_MAP(backend_map);
 
 	cc_gc_shader_pipe_config =
-- 
1.5.6.3


["0002-drm-radeon-fixes-for-r6xx-r7xx-gfx-init.patch" (application/mbox)]

From e2e99c330ffe01c45e43ac95e80fee431b925a55 Mon Sep 17 00:00:00 2001
From: Alex Deucher <alexdeucher@gmail.com>
Date: Fri, 19 Feb 2010 16:22:31 -0500
Subject: [PATCH] drm/radeon: fixes for r6xx/r7xx gfx init

- updated swizzle modes for backend map setup
- fix programming of a few gfx regs
- properly handle pipe/backend setup on LE cards

Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
---
 drivers/gpu/drm/radeon/r600.c    |   41 ++++---
 drivers/gpu/drm/radeon/r600_cp.c |  231 ++++++++++++++++++++++++++------------
 drivers/gpu/drm/radeon/rv770.c   |  218 ++++++++++++++++++++++++------------
 3 files changed, 331 insertions(+), 159 deletions(-)

diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
index a865946..514cf98 100644
--- a/drivers/gpu/drm/radeon/r600.c
+++ b/drivers/gpu/drm/radeon/r600.c
@@ -973,6 +973,9 @@ void r600_gpu_init(struct radeon_device *rdev)
 {
 	u32 tiling_config;
 	u32 ramcfg;
+	u32 backend_map;
+	u32 cc_rb_backend_disable;
+	u32 cc_gc_shader_pipe_config;
 	u32 tmp;
 	int i, j;
 	u32 sq_config;
@@ -1069,23 +1072,20 @@ void r600_gpu_init(struct radeon_device *rdev)
 	switch (rdev->config.r600.max_tile_pipes) {
 	case 1:
 		tiling_config |= PIPE_TILING(0);
-		rdev->config.r600.tiling_npipes = 1;
 		break;
 	case 2:
 		tiling_config |= PIPE_TILING(1);
-		rdev->config.r600.tiling_npipes = 2;
 		break;
 	case 4:
 		tiling_config |= PIPE_TILING(2);
-		rdev->config.r600.tiling_npipes = 4;
 		break;
 	case 8:
 		tiling_config |= PIPE_TILING(3);
-		rdev->config.r600.tiling_npipes = 8;
 		break;
 	default:
 		break;
 	}
+	rdev->config.r600.tiling_npipes = rdev->config.r600.max_tile_pipes;
 	rdev->config.r600.tiling_nbanks = 4 << ((ramcfg & NOOFBANK_MASK) >> \
NOOFBANK_SHIFT);  tiling_config |= BANK_TILING((ramcfg & NOOFBANK_MASK) >> \
NOOFBANK_SHIFT);  tiling_config |= GROUP_SIZE(0);
@@ -1099,24 +1099,33 @@ void r600_gpu_init(struct radeon_device *rdev)
 		tiling_config |= SAMPLE_SPLIT(tmp);
 	}
 	tiling_config |= BANK_SWAPS(1);
-	tmp = r600_get_tile_pipe_to_backend_map(rdev->config.r600.max_tile_pipes,
-						rdev->config.r600.max_backends,
-						(0xff << rdev->config.r600.max_backends) & 0xff);
-	tiling_config |= BACKEND_MAP(tmp);
+
+	cc_rb_backend_disable = RREG32(CC_RB_BACKEND_DISABLE) & 0x00ff0000;
+	cc_rb_backend_disable |=
+		BACKEND_DISABLE((R6XX_MAX_BACKENDS_MASK << rdev->config.r600.max_backends) & \
R6XX_MAX_BACKENDS_MASK); +
+	cc_gc_shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffffff00;
+	cc_gc_shader_pipe_config |=
+		INACTIVE_QD_PIPES((R6XX_MAX_PIPES_MASK << rdev->config.r600.max_pipes) & \
R6XX_MAX_PIPES_MASK); +	cc_gc_shader_pipe_config |=
+		INACTIVE_SIMDS((R6XX_MAX_SIMDS_MASK << rdev->config.r600.max_simds) & \
R6XX_MAX_SIMDS_MASK); +
+	backend_map = r600_get_tile_pipe_to_backend_map(rdev->config.r600.max_tile_pipes,
+							(R6XX_MAX_BACKENDS -
+							 r600_count_pipe_bits((cc_rb_backend_disable &
+									       R6XX_MAX_BACKENDS_MASK) >> 16)),
+							(cc_rb_backend_disable >> 16));
+
+	tiling_config |= BACKEND_MAP(backend_map);
 	WREG32(GB_TILING_CONFIG, tiling_config);
 	WREG32(DCP_TILING_CONFIG, tiling_config & 0xffff);
 	WREG32(HDP_TILING_CONFIG, tiling_config & 0xffff);
 
-	tmp = BACKEND_DISABLE((R6XX_MAX_BACKENDS_MASK << rdev->config.r600.max_backends) & \
                R6XX_MAX_BACKENDS_MASK);
-	WREG32(CC_RB_BACKEND_DISABLE, tmp);
-
 	/* Setup pipes */
-	tmp = INACTIVE_QD_PIPES((R6XX_MAX_PIPES_MASK << rdev->config.r600.max_pipes) & \
                R6XX_MAX_PIPES_MASK);
-	tmp |= INACTIVE_SIMDS((R6XX_MAX_SIMDS_MASK << rdev->config.r600.max_simds) & \
                R6XX_MAX_SIMDS_MASK);
-	WREG32(CC_GC_SHADER_PIPE_CONFIG, tmp);
-	WREG32(GC_USER_SHADER_PIPE_CONFIG, tmp);
+	WREG32(CC_RB_BACKEND_DISABLE, cc_rb_backend_disable);
+	WREG32(CC_GC_SHADER_PIPE_CONFIG, cc_gc_shader_pipe_config);
 
-	tmp = R6XX_MAX_BACKENDS - r600_count_pipe_bits(tmp & INACTIVE_QD_PIPES_MASK);
+	tmp = R6XX_MAX_PIPES - r600_count_pipe_bits((cc_gc_shader_pipe_config & \
INACTIVE_QD_PIPES_MASK) >> 8);  WREG32(VGT_OUT_DEALLOC_CNTL, (tmp * 4) & \
DEALLOC_DIST_MASK);  WREG32(VGT_VERTEX_REUSE_BLOCK_CNTL, ((tmp * 4) - 2) & \
VTX_REUSE_DEPTH_MASK);  
diff --git a/drivers/gpu/drm/radeon/r600_cp.c b/drivers/gpu/drm/radeon/r600_cp.c
index fca96aa..dcb9f0c 100644
--- a/drivers/gpu/drm/radeon/r600_cp.c
+++ b/drivers/gpu/drm/radeon/r600_cp.c
@@ -734,8 +734,8 @@ static void r600_gfx_init(struct drm_device *dev,
 	u32 hdp_host_path_cntl;
 	u32 backend_map;
 	u32 gb_tiling_config = 0;
-	u32 cc_rb_backend_disable = 0;
-	u32 cc_gc_shader_pipe_config = 0;
+	u32 cc_rb_backend_disable;
+	u32 cc_gc_shader_pipe_config;
 	u32 ramcfg;
 
 	/* setup chip specs */
@@ -857,18 +857,22 @@ static void r600_gfx_init(struct drm_device *dev,
 
 	gb_tiling_config |= R600_BANK_SWAPS(1);
 
-	backend_map = r600_get_tile_pipe_to_backend_map(dev_priv->r600_max_tile_pipes,
-							dev_priv->r600_max_backends,
-							(0xff << dev_priv->r600_max_backends) & 0xff);
-	gb_tiling_config |= R600_BACKEND_MAP(backend_map);
+	cc_rb_backend_disable = RADEON_READ(R600_CC_RB_BACKEND_DISABLE) & 0x00ff0000;
+	cc_rb_backend_disable |=
+		R600_BACKEND_DISABLE((R6XX_MAX_BACKENDS_MASK << dev_priv->r600_max_backends) & \
R6XX_MAX_BACKENDS_MASK);  
-	cc_gc_shader_pipe_config =
+	cc_gc_shader_pipe_config = RADEON_READ(R600_CC_GC_SHADER_PIPE_CONFIG) & 0xffffff00;
+	cc_gc_shader_pipe_config |=
 		R600_INACTIVE_QD_PIPES((R6XX_MAX_PIPES_MASK << dev_priv->r600_max_pipes) & \
R6XX_MAX_PIPES_MASK);  cc_gc_shader_pipe_config |=
 		R600_INACTIVE_SIMDS((R6XX_MAX_SIMDS_MASK << dev_priv->r600_max_simds) & \
R6XX_MAX_SIMDS_MASK);  
-	cc_rb_backend_disable =
-		R600_BACKEND_DISABLE((R6XX_MAX_BACKENDS_MASK << dev_priv->r600_max_backends) & \
R6XX_MAX_BACKENDS_MASK); +	backend_map = \
r600_get_tile_pipe_to_backend_map(dev_priv->r600_max_tile_pipes, \
+							(R6XX_MAX_BACKENDS - +							 r600_count_pipe_bits((cc_rb_backend_disable &
+									       R6XX_MAX_BACKENDS_MASK) >> 16)),
+							(cc_rb_backend_disable >> 16));
+	gb_tiling_config |= R600_BACKEND_MAP(backend_map);
 
 	RADEON_WRITE(R600_GB_TILING_CONFIG,      gb_tiling_config);
 	RADEON_WRITE(R600_DCP_TILING_CONFIG,    (gb_tiling_config & 0xffff));
@@ -890,7 +894,7 @@ static void r600_gfx_init(struct drm_device *dev,
 	RADEON_WRITE(R600_GC_USER_SHADER_PIPE_CONFIG, cc_gc_shader_pipe_config);
 
 	num_qd_pipes =
-		R6XX_MAX_BACKENDS - r600_count_pipe_bits(cc_gc_shader_pipe_config & \
R600_INACTIVE_QD_PIPES_MASK); +		R6XX_MAX_PIPES - \
r600_count_pipe_bits((cc_gc_shader_pipe_config & R600_INACTIVE_QD_PIPES_MASK) >> 8);  \
RADEON_WRITE(R600_VGT_OUT_DEALLOC_CNTL, (num_qd_pipes * 4) & R600_DEALLOC_DIST_MASK); \
RADEON_WRITE(R600_VGT_VERTEX_REUSE_BLOCK_CNTL, ((num_qd_pipes * 4) - 2) & \
R600_VTX_REUSE_DEPTH_MASK);  
@@ -1162,7 +1166,8 @@ static void r600_gfx_init(struct drm_device *dev,
 
 }
 
-static u32 r700_get_tile_pipe_to_backend_map(u32 num_tile_pipes,
+static u32 r700_get_tile_pipe_to_backend_map(drm_radeon_private_t *dev_priv,
+					     u32 num_tile_pipes,
 					     u32 num_backends,
 					     u32 backend_disable_mask)
 {
@@ -1173,6 +1178,7 @@ static u32 r700_get_tile_pipe_to_backend_map(u32 \
num_tile_pipes,  u32 swizzle_pipe[R7XX_MAX_PIPES];
 	u32 cur_backend;
 	u32 i;
+	bool force_no_swizzle;
 
 	if (num_tile_pipes > R7XX_MAX_PIPES)
 		num_tile_pipes = R7XX_MAX_PIPES;
@@ -1202,6 +1208,18 @@ static u32 r700_get_tile_pipe_to_backend_map(u32 \
num_tile_pipes,  if (enabled_backends_count != num_backends)
 		num_backends = enabled_backends_count;
 
+	switch (dev_priv->flags & RADEON_FAMILY_MASK) {
+	case CHIP_RV770:
+	case CHIP_RV730:
+		force_no_swizzle = false;
+		break;
+	case CHIP_RV710:
+	case CHIP_RV740:
+	default:
+		force_no_swizzle = true;
+		break;
+	}
+
 	memset((uint8_t *)&swizzle_pipe[0], 0, sizeof(u32) * R7XX_MAX_PIPES);
 	switch (num_tile_pipes) {
 	case 1:
@@ -1212,49 +1230,100 @@ static u32 r700_get_tile_pipe_to_backend_map(u32 \
num_tile_pipes,  swizzle_pipe[1] = 1;
 		break;
 	case 3:
-		swizzle_pipe[0] = 0;
-		swizzle_pipe[1] = 2;
-		swizzle_pipe[2] = 1;
+		if (force_no_swizzle) {
+			swizzle_pipe[0] = 0;
+			swizzle_pipe[1] = 1;
+			swizzle_pipe[2] = 2;
+		} else {
+			swizzle_pipe[0] = 0;
+			swizzle_pipe[1] = 2;
+			swizzle_pipe[2] = 1;
+		}
 		break;
 	case 4:
-		swizzle_pipe[0] = 0;
-		swizzle_pipe[1] = 2;
-		swizzle_pipe[2] = 3;
-		swizzle_pipe[3] = 1;
+		if (force_no_swizzle) {
+			swizzle_pipe[0] = 0;
+			swizzle_pipe[1] = 1;
+			swizzle_pipe[2] = 2;
+			swizzle_pipe[3] = 3;
+		} else {
+			swizzle_pipe[0] = 0;
+			swizzle_pipe[1] = 2;
+			swizzle_pipe[2] = 3;
+			swizzle_pipe[3] = 1;
+		}
 		break;
 	case 5:
-		swizzle_pipe[0] = 0;
-		swizzle_pipe[1] = 2;
-		swizzle_pipe[2] = 4;
-		swizzle_pipe[3] = 1;
-		swizzle_pipe[4] = 3;
+		if (force_no_swizzle) {
+			swizzle_pipe[0] = 0;
+			swizzle_pipe[1] = 1;
+			swizzle_pipe[2] = 2;
+			swizzle_pipe[3] = 3;
+			swizzle_pipe[4] = 4;
+		} else {
+			swizzle_pipe[0] = 0;
+			swizzle_pipe[1] = 2;
+			swizzle_pipe[2] = 4;
+			swizzle_pipe[3] = 1;
+			swizzle_pipe[4] = 3;
+		}
 		break;
 	case 6:
-		swizzle_pipe[0] = 0;
-		swizzle_pipe[1] = 2;
-		swizzle_pipe[2] = 4;
-		swizzle_pipe[3] = 5;
-		swizzle_pipe[4] = 3;
-		swizzle_pipe[5] = 1;
+		if (force_no_swizzle) {
+			swizzle_pipe[0] = 0;
+			swizzle_pipe[1] = 1;
+			swizzle_pipe[2] = 2;
+			swizzle_pipe[3] = 3;
+			swizzle_pipe[4] = 4;
+			swizzle_pipe[5] = 5;
+		} else {
+			swizzle_pipe[0] = 0;
+			swizzle_pipe[1] = 2;
+			swizzle_pipe[2] = 4;
+			swizzle_pipe[3] = 5;
+			swizzle_pipe[4] = 3;
+			swizzle_pipe[5] = 1;
+		}
 		break;
 	case 7:
-		swizzle_pipe[0] = 0;
-		swizzle_pipe[1] = 2;
-		swizzle_pipe[2] = 4;
-		swizzle_pipe[3] = 6;
-		swizzle_pipe[4] = 3;
-		swizzle_pipe[5] = 1;
-		swizzle_pipe[6] = 5;
+		if (force_no_swizzle) {
+			swizzle_pipe[0] = 0;
+			swizzle_pipe[1] = 1;
+			swizzle_pipe[2] = 2;
+			swizzle_pipe[3] = 3;
+			swizzle_pipe[4] = 4;
+			swizzle_pipe[5] = 5;
+			swizzle_pipe[6] = 6;
+		} else {
+			swizzle_pipe[0] = 0;
+			swizzle_pipe[1] = 2;
+			swizzle_pipe[2] = 4;
+			swizzle_pipe[3] = 6;
+			swizzle_pipe[4] = 3;
+			swizzle_pipe[5] = 1;
+			swizzle_pipe[6] = 5;
+		}
 		break;
 	case 8:
-		swizzle_pipe[0] = 0;
-		swizzle_pipe[1] = 2;
-		swizzle_pipe[2] = 4;
-		swizzle_pipe[3] = 6;
-		swizzle_pipe[4] = 3;
-		swizzle_pipe[5] = 1;
-		swizzle_pipe[6] = 7;
-		swizzle_pipe[7] = 5;
+		if (force_no_swizzle) {
+			swizzle_pipe[0] = 0;
+			swizzle_pipe[1] = 1;
+			swizzle_pipe[2] = 2;
+			swizzle_pipe[3] = 3;
+			swizzle_pipe[4] = 4;
+			swizzle_pipe[5] = 5;
+			swizzle_pipe[6] = 6;
+			swizzle_pipe[7] = 7;
+		} else {
+			swizzle_pipe[0] = 0;
+			swizzle_pipe[1] = 2;
+			swizzle_pipe[2] = 4;
+			swizzle_pipe[3] = 6;
+			swizzle_pipe[4] = 3;
+			swizzle_pipe[5] = 1;
+			swizzle_pipe[6] = 7;
+			swizzle_pipe[7] = 5;
+		}
 		break;
 	}
 
@@ -1275,8 +1344,10 @@ static void r700_gfx_init(struct drm_device *dev,
 			  drm_radeon_private_t *dev_priv)
 {
 	int i, j, num_qd_pipes;
+	u32 ta_aux_cntl;
 	u32 sx_debug_1;
 	u32 smx_dc_ctl0;
+	u32 db_debug3;
 	u32 num_gs_verts_per_thread;
 	u32 vgt_gs_per_es;
 	u32 gs_prim_buffer_depth = 0;
@@ -1287,8 +1358,8 @@ static void r700_gfx_init(struct drm_device *dev,
 	u32 sq_dyn_gpr_size_simd_ab_0;
 	u32 backend_map;
 	u32 gb_tiling_config = 0;
-	u32 cc_rb_backend_disable = 0;
-	u32 cc_gc_shader_pipe_config = 0;
+	u32 cc_rb_backend_disable;
+	u32 cc_gc_shader_pipe_config;
 	u32 mc_arb_ramcfg;
 	u32 db_debug4;
 
@@ -1439,21 +1510,26 @@ static void r700_gfx_init(struct drm_device *dev,
 
 	gb_tiling_config |= R600_BANK_SWAPS(1);
 
-	if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV740)
-		backend_map = 0x28;
-	else
-		backend_map = r700_get_tile_pipe_to_backend_map(dev_priv->r600_max_tile_pipes,
-								dev_priv->r600_max_backends,
-								(0xff << dev_priv->r600_max_backends) & 0xff);
-	gb_tiling_config |= R600_BACKEND_MAP(backend_map);
+ 	cc_rb_backend_disable = RADEON_READ(R600_CC_RB_BACKEND_DISABLE) & 0x00ff0000;
+ 	cc_rb_backend_disable |=
+ 		R600_BACKEND_DISABLE((R7XX_MAX_BACKENDS_MASK << dev_priv->r600_max_backends) & \
R7XX_MAX_BACKENDS_MASK);  
-	cc_gc_shader_pipe_config =
+ 	cc_gc_shader_pipe_config = RADEON_READ(R600_CC_GC_SHADER_PIPE_CONFIG) & \
0xffffff00; + 	cc_gc_shader_pipe_config |=
 		R600_INACTIVE_QD_PIPES((R7XX_MAX_PIPES_MASK << dev_priv->r600_max_pipes) & \
R7XX_MAX_PIPES_MASK);  cc_gc_shader_pipe_config |=
 		R600_INACTIVE_SIMDS((R7XX_MAX_SIMDS_MASK << dev_priv->r600_max_simds) & \
R7XX_MAX_SIMDS_MASK);  
-	cc_rb_backend_disable =
-		R600_BACKEND_DISABLE((R7XX_MAX_BACKENDS_MASK << dev_priv->r600_max_backends) & \
R7XX_MAX_BACKENDS_MASK); +	if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV740)
+		backend_map = 0x28;
+	else
+ 		backend_map = r700_get_tile_pipe_to_backend_map(dev_priv,
+ 								dev_priv->r600_max_tile_pipes,
+ 								(R7XX_MAX_BACKENDS -
+ 								 r600_count_pipe_bits((cc_rb_backend_disable &
+ 										       R7XX_MAX_BACKENDS_MASK) >> 16)),
+ 								(cc_rb_backend_disable >> 16));
+	gb_tiling_config |= R600_BACKEND_MAP(backend_map);
 
 	RADEON_WRITE(R600_GB_TILING_CONFIG,      gb_tiling_config);
 	RADEON_WRITE(R600_DCP_TILING_CONFIG,    (gb_tiling_config & 0xffff));
@@ -1472,16 +1548,13 @@ static void r700_gfx_init(struct drm_device *dev,
 
 	RADEON_WRITE(R600_CC_RB_BACKEND_DISABLE,      cc_rb_backend_disable);
 	RADEON_WRITE(R600_CC_GC_SHADER_PIPE_CONFIG,   cc_gc_shader_pipe_config);
-	RADEON_WRITE(R600_GC_USER_SHADER_PIPE_CONFIG, cc_gc_shader_pipe_config);
 
 	RADEON_WRITE(R700_CC_SYS_RB_BACKEND_DISABLE, cc_rb_backend_disable);
 	RADEON_WRITE(R700_CGTS_SYS_TCC_DISABLE, 0);
 	RADEON_WRITE(R700_CGTS_TCC_DISABLE, 0);
-	RADEON_WRITE(R700_CGTS_USER_SYS_TCC_DISABLE, 0);
-	RADEON_WRITE(R700_CGTS_USER_TCC_DISABLE, 0);
 
 	num_qd_pipes =
-		R7XX_MAX_BACKENDS - r600_count_pipe_bits(cc_gc_shader_pipe_config & \
R600_INACTIVE_QD_PIPES_MASK); +		R7XX_MAX_PIPES - \
r600_count_pipe_bits((cc_gc_shader_pipe_config & R600_INACTIVE_QD_PIPES_MASK) >> 8);  \
RADEON_WRITE(R600_VGT_OUT_DEALLOC_CNTL, (num_qd_pipes * 4) & R600_DEALLOC_DIST_MASK); \
RADEON_WRITE(R600_VGT_VERTEX_REUSE_BLOCK_CNTL, ((num_qd_pipes * 4) - 2) & \
R600_VTX_REUSE_DEPTH_MASK);  
@@ -1491,10 +1564,8 @@ static void r700_gfx_init(struct drm_device *dev,
 
 	RADEON_WRITE(R600_CP_MEQ_THRESHOLDS, R700_STQ_SPLIT(0x30));
 
-	RADEON_WRITE(R600_TA_CNTL_AUX, (R600_DISABLE_CUBE_ANISO |
-					R600_SYNC_GRADIENT |
-					R600_SYNC_WALKER |
-					R600_SYNC_ALIGNER));
+	ta_aux_cntl = RADEON_READ(R600_TA_CNTL_AUX);
+	RADEON_WRITE(R600_TA_CNTL_AUX, ta_aux_cntl | R600_DISABLE_CUBE_ANISO);
 
 	sx_debug_1 = RADEON_READ(R700_SX_DEBUG_1);
 	sx_debug_1 |= R700_ENABLE_NEW_SMX_ADDRESS;
@@ -1505,14 +1576,28 @@ static void r700_gfx_init(struct drm_device *dev,
 	smx_dc_ctl0 |= R700_CACHE_DEPTH((dev_priv->r700_sx_num_of_sets * 64) - 1);
 	RADEON_WRITE(R600_SMX_DC_CTL0, smx_dc_ctl0);
 
-	RADEON_WRITE(R700_SMX_EVENT_CTL, (R700_ES_FLUSH_CTL(4) |
-					  R700_GS_FLUSH_CTL(4) |
-					  R700_ACK_FLUSH_CTL(3) |
-					  R700_SYNC_FLUSH_CTL));
+	if ((dev_priv->flags & RADEON_FAMILY_MASK) != CHIP_RV740)
+		RADEON_WRITE(R700_SMX_EVENT_CTL, (R700_ES_FLUSH_CTL(4) |
+						  R700_GS_FLUSH_CTL(4) |
+						  R700_ACK_FLUSH_CTL(3) |
+						  R700_SYNC_FLUSH_CTL));
 
-	if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV770)
-		RADEON_WRITE(R700_DB_DEBUG3, R700_DB_CLK_OFF_DELAY(0x1f));
-	else {
+	db_debug3 = RADEON_READ(R700_DB_DEBUG3);
+	db_debug3 &= ~R700_DB_CLK_OFF_DELAY(0x1f);
+	switch (dev_priv->flags & RADEON_FAMILY_MASK) {
+	case CHIP_RV770:
+	case CHIP_RV740:
+		db_debug3 |= R700_DB_CLK_OFF_DELAY(0x1f);
+		break;
+	case CHIP_RV710:
+	case CHIP_RV730:
+	default:
+		db_debug3 |= R700_DB_CLK_OFF_DELAY(2);
+		break;
+	}
+	RADEON_WRITE(R700_DB_DEBUG3, db_debug3);
+
+	if ((dev_priv->flags & RADEON_FAMILY_MASK) != CHIP_RV770) {
 		db_debug4 = RADEON_READ(RV700_DB_DEBUG4);
 		db_debug4 |= RV700_DISABLE_TILE_COVERED_FOR_PS_ITER;
 		RADEON_WRITE(RV700_DB_DEBUG4, db_debug4);
@@ -1541,10 +1626,10 @@ static void r700_gfx_init(struct drm_device *dev,
 			    R600_ALU_UPDATE_FIFO_HIWATER(0x8));
 	switch (dev_priv->flags & RADEON_FAMILY_MASK) {
 	case CHIP_RV770:
-		sq_ms_fifo_sizes |= R600_FETCH_FIFO_HIWATER(0x1);
-		break;
 	case CHIP_RV730:
 	case CHIP_RV710:
+		sq_ms_fifo_sizes |= R600_FETCH_FIFO_HIWATER(0x1);
+		break;
 	case CHIP_RV740:
 	default:
 		sq_ms_fifo_sizes |= R600_FETCH_FIFO_HIWATER(0x4);
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c
index 26cbf6c..3c31dec 100644
--- a/drivers/gpu/drm/radeon/rv770.c
+++ b/drivers/gpu/drm/radeon/rv770.c
@@ -274,9 +274,10 @@ static int rv770_cp_load_microcode(struct radeon_device *rdev)
 /*
  * Core functions
  */
-static u32 r700_get_tile_pipe_to_backend_map(u32 num_tile_pipes,
-						u32 num_backends,
-						u32 backend_disable_mask)
+static u32 r700_get_tile_pipe_to_backend_map(struct radeon_device *rdev,
+					     u32 num_tile_pipes,
+					     u32 num_backends,
+					     u32 backend_disable_mask)
 {
 	u32 backend_map = 0;
 	u32 enabled_backends_mask;
@@ -285,6 +286,7 @@ static u32 r700_get_tile_pipe_to_backend_map(u32 num_tile_pipes,
 	u32 swizzle_pipe[R7XX_MAX_PIPES];
 	u32 cur_backend;
 	u32 i;
+	bool force_no_swizzle;
 
 	if (num_tile_pipes > R7XX_MAX_PIPES)
 		num_tile_pipes = R7XX_MAX_PIPES;
@@ -314,6 +316,18 @@ static u32 r700_get_tile_pipe_to_backend_map(u32 num_tile_pipes,
 	if (enabled_backends_count != num_backends)
 		num_backends = enabled_backends_count;
 
+	switch (rdev->family) {
+	case CHIP_RV770:
+	case CHIP_RV730:
+		force_no_swizzle = false;
+		break;
+	case CHIP_RV710:
+	case CHIP_RV740:
+	default:
+		force_no_swizzle = true;
+		break;
+	}
+
 	memset((uint8_t *)&swizzle_pipe[0], 0, sizeof(u32) * R7XX_MAX_PIPES);
 	switch (num_tile_pipes) {
 	case 1:
@@ -324,49 +338,100 @@ static u32 r700_get_tile_pipe_to_backend_map(u32 \
num_tile_pipes,  swizzle_pipe[1] = 1;
 		break;
 	case 3:
-		swizzle_pipe[0] = 0;
-		swizzle_pipe[1] = 2;
-		swizzle_pipe[2] = 1;
+		if (force_no_swizzle) {
+			swizzle_pipe[0] = 0;
+			swizzle_pipe[1] = 1;
+			swizzle_pipe[2] = 2;
+		} else {
+			swizzle_pipe[0] = 0;
+			swizzle_pipe[1] = 2;
+			swizzle_pipe[2] = 1;
+		}
 		break;
 	case 4:
-		swizzle_pipe[0] = 0;
-		swizzle_pipe[1] = 2;
-		swizzle_pipe[2] = 3;
-		swizzle_pipe[3] = 1;
+		if (force_no_swizzle) {
+			swizzle_pipe[0] = 0;
+			swizzle_pipe[1] = 1;
+			swizzle_pipe[2] = 2;
+			swizzle_pipe[3] = 3;
+		} else {
+			swizzle_pipe[0] = 0;
+			swizzle_pipe[1] = 2;
+			swizzle_pipe[2] = 3;
+			swizzle_pipe[3] = 1;
+		}
 		break;
 	case 5:
-		swizzle_pipe[0] = 0;
-		swizzle_pipe[1] = 2;
-		swizzle_pipe[2] = 4;
-		swizzle_pipe[3] = 1;
-		swizzle_pipe[4] = 3;
+		if (force_no_swizzle) {
+			swizzle_pipe[0] = 0;
+			swizzle_pipe[1] = 1;
+			swizzle_pipe[2] = 2;
+			swizzle_pipe[3] = 3;
+			swizzle_pipe[4] = 4;
+		} else {
+			swizzle_pipe[0] = 0;
+			swizzle_pipe[1] = 2;
+			swizzle_pipe[2] = 4;
+			swizzle_pipe[3] = 1;
+			swizzle_pipe[4] = 3;
+		}
 		break;
 	case 6:
-		swizzle_pipe[0] = 0;
-		swizzle_pipe[1] = 2;
-		swizzle_pipe[2] = 4;
-		swizzle_pipe[3] = 5;
-		swizzle_pipe[4] = 3;
-		swizzle_pipe[5] = 1;
+		if (force_no_swizzle) {
+			swizzle_pipe[0] = 0;
+			swizzle_pipe[1] = 1;
+			swizzle_pipe[2] = 2;
+			swizzle_pipe[3] = 3;
+			swizzle_pipe[4] = 4;
+			swizzle_pipe[5] = 5;
+		} else {
+			swizzle_pipe[0] = 0;
+			swizzle_pipe[1] = 2;
+			swizzle_pipe[2] = 4;
+			swizzle_pipe[3] = 5;
+			swizzle_pipe[4] = 3;
+			swizzle_pipe[5] = 1;
+		}
 		break;
 	case 7:
-		swizzle_pipe[0] = 0;
-		swizzle_pipe[1] = 2;
-		swizzle_pipe[2] = 4;
-		swizzle_pipe[3] = 6;
-		swizzle_pipe[4] = 3;
-		swizzle_pipe[5] = 1;
-		swizzle_pipe[6] = 5;
+		if (force_no_swizzle) {
+			swizzle_pipe[0] = 0;
+			swizzle_pipe[1] = 1;
+			swizzle_pipe[2] = 2;
+			swizzle_pipe[3] = 3;
+			swizzle_pipe[4] = 4;
+			swizzle_pipe[5] = 5;
+			swizzle_pipe[6] = 6;
+		} else {
+			swizzle_pipe[0] = 0;
+			swizzle_pipe[1] = 2;
+			swizzle_pipe[2] = 4;
+			swizzle_pipe[3] = 6;
+			swizzle_pipe[4] = 3;
+			swizzle_pipe[5] = 1;
+			swizzle_pipe[6] = 5;
+		}
 		break;
 	case 8:
-		swizzle_pipe[0] = 0;
-		swizzle_pipe[1] = 2;
-		swizzle_pipe[2] = 4;
-		swizzle_pipe[3] = 6;
-		swizzle_pipe[4] = 3;
-		swizzle_pipe[5] = 1;
-		swizzle_pipe[6] = 7;
-		swizzle_pipe[7] = 5;
+		if (force_no_swizzle) {
+			swizzle_pipe[0] = 0;
+			swizzle_pipe[1] = 1;
+			swizzle_pipe[2] = 2;
+			swizzle_pipe[3] = 3;
+			swizzle_pipe[4] = 4;
+			swizzle_pipe[5] = 5;
+			swizzle_pipe[6] = 6;
+			swizzle_pipe[7] = 7;
+		} else {
+			swizzle_pipe[0] = 0;
+			swizzle_pipe[1] = 2;
+			swizzle_pipe[2] = 4;
+			swizzle_pipe[3] = 6;
+			swizzle_pipe[4] = 3;
+			swizzle_pipe[5] = 1;
+			swizzle_pipe[6] = 7;
+			swizzle_pipe[7] = 5;
+		}
 		break;
 	}
 
@@ -386,8 +451,10 @@ static u32 r700_get_tile_pipe_to_backend_map(u32 num_tile_pipes,
 static void rv770_gpu_init(struct radeon_device *rdev)
 {
 	int i, j, num_qd_pipes;
+	u32 ta_aux_cntl;
 	u32 sx_debug_1;
 	u32 smx_dc_ctl0;
+	u32 db_debug3;
 	u32 num_gs_verts_per_thread;
 	u32 vgt_gs_per_es;
 	u32 gs_prim_buffer_depth = 0;
@@ -516,24 +583,20 @@ static void rv770_gpu_init(struct radeon_device *rdev)
 
 	switch (rdev->config.rv770.max_tile_pipes) {
 	case 1:
+	default:
 		gb_tiling_config |= PIPE_TILING(0);
-		rdev->config.rv770.tiling_npipes = 1;
 		break;
 	case 2:
 		gb_tiling_config |= PIPE_TILING(1);
-		rdev->config.rv770.tiling_npipes = 2;
 		break;
 	case 4:
 		gb_tiling_config |= PIPE_TILING(2);
-		rdev->config.rv770.tiling_npipes = 4;
 		break;
 	case 8:
 		gb_tiling_config |= PIPE_TILING(3);
-		rdev->config.rv770.tiling_npipes = 8;
-		break;
-	default:
 		break;
 	}
+	rdev->config.rv770.tiling_npipes = rdev->config.rv770.max_tile_pipes;
 
 	if (rdev->family == CHIP_RV770)
 		gb_tiling_config |= BANK_TILING(1);
@@ -556,21 +619,27 @@ static void rv770_gpu_init(struct radeon_device *rdev)
 
 	gb_tiling_config |= BANK_SWAPS(1);
 
-	if (rdev->family == CHIP_RV740)
-		backend_map = 0x28;
-	else
-		backend_map = r700_get_tile_pipe_to_backend_map(rdev->config.rv770.max_tile_pipes,
-								rdev->config.rv770.max_backends,
-								(0xff << rdev->config.rv770.max_backends) & 0xff);
-	gb_tiling_config |= BACKEND_MAP(backend_map);
+ 	cc_rb_backend_disable = RREG32(CC_RB_BACKEND_DISABLE) & 0x00ff0000;
+ 	cc_rb_backend_disable |=
+ 		BACKEND_DISABLE((R7XX_MAX_BACKENDS_MASK << rdev->config.rv770.max_backends) & \
R7XX_MAX_BACKENDS_MASK);  
-	cc_gc_shader_pipe_config =
+ 	cc_gc_shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffffff00;
+ 	cc_gc_shader_pipe_config |=
 		INACTIVE_QD_PIPES((R7XX_MAX_PIPES_MASK << rdev->config.rv770.max_pipes) & \
R7XX_MAX_PIPES_MASK);  cc_gc_shader_pipe_config |=
 		INACTIVE_SIMDS((R7XX_MAX_SIMDS_MASK << rdev->config.rv770.max_simds) & \
R7XX_MAX_SIMDS_MASK);  
-	cc_rb_backend_disable =
-		BACKEND_DISABLE((R7XX_MAX_BACKENDS_MASK << rdev->config.rv770.max_backends) & \
R7XX_MAX_BACKENDS_MASK); +	if (rdev->family == CHIP_RV740)
+		backend_map = 0x28;
+	else
+ 		backend_map = r700_get_tile_pipe_to_backend_map(rdev,
+ 								rdev->config.rv770.max_tile_pipes,
+ 								(R7XX_MAX_BACKENDS -
+ 								 r600_count_pipe_bits((cc_rb_backend_disable &
+ 										       R7XX_MAX_BACKENDS_MASK) >> 16)),
+ 								(cc_rb_backend_disable >> 16));
+	gb_tiling_config |= BACKEND_MAP(backend_map);
+
 
 	WREG32(GB_TILING_CONFIG, gb_tiling_config);
 	WREG32(DCP_TILING_CONFIG, (gb_tiling_config & 0xffff));
@@ -578,16 +647,13 @@ static void rv770_gpu_init(struct radeon_device *rdev)
 
 	WREG32(CC_RB_BACKEND_DISABLE,      cc_rb_backend_disable);
 	WREG32(CC_GC_SHADER_PIPE_CONFIG,   cc_gc_shader_pipe_config);
-	WREG32(GC_USER_SHADER_PIPE_CONFIG, cc_gc_shader_pipe_config);
+	WREG32(CC_SYS_RB_BACKEND_DISABLE,  cc_rb_backend_disable);
 
-	WREG32(CC_SYS_RB_BACKEND_DISABLE, cc_rb_backend_disable);
 	WREG32(CGTS_SYS_TCC_DISABLE, 0);
 	WREG32(CGTS_TCC_DISABLE, 0);
-	WREG32(CGTS_USER_SYS_TCC_DISABLE, 0);
-	WREG32(CGTS_USER_TCC_DISABLE, 0);
 
 	num_qd_pipes =
-		R7XX_MAX_BACKENDS - r600_count_pipe_bits(cc_gc_shader_pipe_config & \
INACTIVE_QD_PIPES_MASK); +		R7XX_MAX_PIPES - \
r600_count_pipe_bits((cc_gc_shader_pipe_config & INACTIVE_QD_PIPES_MASK) >> 8);  \
WREG32(VGT_OUT_DEALLOC_CNTL, (num_qd_pipes * 4) & DEALLOC_DIST_MASK);  \
WREG32(VGT_VERTEX_REUSE_BLOCK_CNTL, ((num_qd_pipes * 4) - 2) & VTX_REUSE_DEPTH_MASK); \
 @@ -597,10 +663,8 @@ static void rv770_gpu_init(struct radeon_device *rdev)
 
 	WREG32(CP_MEQ_THRESHOLDS, STQ_SPLIT(0x30));
 
-	WREG32(TA_CNTL_AUX, (DISABLE_CUBE_ANISO |
-			     SYNC_GRADIENT |
-			     SYNC_WALKER |
-			     SYNC_ALIGNER));
+	ta_aux_cntl = RREG32(TA_CNTL_AUX);
+	WREG32(TA_CNTL_AUX, ta_aux_cntl | DISABLE_CUBE_ANISO);
 
 	sx_debug_1 = RREG32(SX_DEBUG_1);
 	sx_debug_1 |= ENABLE_NEW_SMX_ADDRESS;
@@ -611,14 +675,28 @@ static void rv770_gpu_init(struct radeon_device *rdev)
 	smx_dc_ctl0 |= CACHE_DEPTH((rdev->config.rv770.sx_num_of_sets * 64) - 1);
 	WREG32(SMX_DC_CTL0, smx_dc_ctl0);
 
-	WREG32(SMX_EVENT_CTL, (ES_FLUSH_CTL(4) |
-			       GS_FLUSH_CTL(4) |
-			       ACK_FLUSH_CTL(3) |
-			       SYNC_FLUSH_CTL));
+	if (rdev->family != CHIP_RV740)
+		WREG32(SMX_EVENT_CTL, (ES_FLUSH_CTL(4) |
+				       GS_FLUSH_CTL(4) |
+				       ACK_FLUSH_CTL(3) |
+				       SYNC_FLUSH_CTL));
 
-	if (rdev->family == CHIP_RV770)
-		WREG32(DB_DEBUG3, DB_CLK_OFF_DELAY(0x1f));
-	else {
+	db_debug3 = RREG32(DB_DEBUG3);
+	db_debug3 &= ~DB_CLK_OFF_DELAY(0x1f);
+	switch (rdev->family) {
+	case CHIP_RV770:
+	case CHIP_RV740:
+		db_debug3 |= DB_CLK_OFF_DELAY(0x1f);
+		break;
+	case CHIP_RV710:
+	case CHIP_RV730:
+	default:
+		db_debug3 |= DB_CLK_OFF_DELAY(2);
+		break;
+	}
+	WREG32(DB_DEBUG3, db_debug3);
+
+	if (rdev->family != CHIP_RV770) {
 		db_debug4 = RREG32(DB_DEBUG4);
 		db_debug4 |= DISABLE_TILE_COVERED_FOR_PS_ITER;
 		WREG32(DB_DEBUG4, db_debug4);
@@ -647,10 +725,10 @@ static void rv770_gpu_init(struct radeon_device *rdev)
 			    ALU_UPDATE_FIFO_HIWATER(0x8));
 	switch (rdev->family) {
 	case CHIP_RV770:
-		sq_ms_fifo_sizes |= FETCH_FIFO_HIWATER(0x1);
-		break;
 	case CHIP_RV730:
 	case CHIP_RV710:
+		sq_ms_fifo_sizes |= FETCH_FIFO_HIWATER(0x1);
+		break;
 	case CHIP_RV740:
 	default:
 		sq_ms_fifo_sizes |= FETCH_FIFO_HIWATER(0x4);
-- 
1.5.6.3



------------------------------------------------------------------------------
Download Intel&#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev

--
_______________________________________________
Dri-devel mailing list
Dri-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dri-devel


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic